@codemation/host 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +3 -3
  2. package/dist/{PrismaMigrationDeployer-B7cHGrXP.js → AppConfigFactory-DWIz2hy-.js} +104 -58
  3. package/dist/AppConfigFactory-DWIz2hy-.js.map +1 -0
  4. package/dist/{client-Yh7-CQud.d.ts → AppConfigFactory-DmHOpg8O.d.ts} +52 -31
  5. package/dist/{CodemationFrontendBootstrapRequest-CNEk-C4D.js → AppContainerFactory-B5eRpvAa.js} +3269 -3374
  6. package/dist/AppContainerFactory-B5eRpvAa.js.map +1 -0
  7. package/dist/{CodemationWhitelabelConfig-DgbjgtrR.d.ts → CodemationAuthConfig-Bh2cCNCI.d.ts} +32 -2
  8. package/dist/{CodemationConfig-XCkSV2dj.d.ts → CodemationConfig-D2ULNkec.d.ts} +53 -49
  9. package/dist/CodemationConfigNormalizer-CBLxXaRV.d.ts +9 -0
  10. package/dist/{CodemationConsumerConfigLoader-scS_RQMy.js → CodemationConsumerConfigLoader-BBzAr6L_.js} +128 -3
  11. package/dist/CodemationConsumerConfigLoader-BBzAr6L_.js.map +1 -0
  12. package/dist/{CodemationConsumerConfigLoader-Dmm2TzAA.d.ts → CodemationConsumerConfigLoader-BLvzcfb7.d.ts} +4 -4
  13. package/dist/CodemationPluginListMerger-B0-e4CJ6.d.ts +391 -0
  14. package/dist/{CodemationPluginListMerger-BNmaoXQL.js → CodemationPluginListMerger-DrVOw9KP.js} +18 -10
  15. package/dist/CodemationPluginListMerger-DrVOw9KP.js.map +1 -0
  16. package/dist/{CredentialServices-DpDpm8mL.d.ts → CredentialServices-BeuMtqYA.d.ts} +3 -3
  17. package/dist/{CredentialServices-BKBGe7l3.js → CredentialServices-DNb3CZwW.js} +3 -3
  18. package/dist/CredentialServices-DNb3CZwW.js.map +1 -0
  19. package/dist/FrontendAppConfig-D50wjj_n.d.ts +27 -0
  20. package/dist/{WorkflowViewContracts-DCLpTn25.d.ts → FrontendAppConfigFactory-Bj-DZNlt.d.ts} +29 -2
  21. package/dist/FrontendAppConfigJsonCodec-1_L7H_Qo.d.ts +20 -0
  22. package/dist/FrontendAppConfigJsonCodec-nOCQI0ag.js +84 -0
  23. package/dist/FrontendAppConfigJsonCodec-nOCQI0ag.js.map +1 -0
  24. package/dist/{LogLevelPolicy-4cq9z0TI.d.ts → LogLevelPolicy-BS_NlAOg.d.ts} +2 -2
  25. package/dist/{ServerLoggerFactory-BRHxIDS7.js → ServerLoggerFactory-BltIIDfQ.js} +4 -129
  26. package/dist/ServerLoggerFactory-BltIIDfQ.js.map +1 -0
  27. package/dist/client.d.ts +5 -3
  28. package/dist/client.js +2 -1
  29. package/dist/client.js.map +1 -1
  30. package/dist/consumer.d.ts +5 -4
  31. package/dist/consumer.js +4 -4
  32. package/dist/credentials.d.ts +4 -4
  33. package/dist/credentials.js +3 -3
  34. package/dist/devServerSidecar.d.ts +1 -1
  35. package/dist/{index-Bs4F1IsC.d.ts → index-CkiptHb-.d.ts} +19 -20
  36. package/dist/index.d.ts +14 -19
  37. package/dist/index.js +12 -11
  38. package/dist/nextServer.d.ts +244 -9
  39. package/dist/nextServer.js +8 -8
  40. package/dist/persistenceServer-CaehMh3M.d.ts +9 -0
  41. package/dist/{persistenceServer-8tcM2S48.js → persistenceServer-DVeWUbc3.js} +2 -2
  42. package/dist/{persistenceServer-8tcM2S48.js.map → persistenceServer-DVeWUbc3.js.map} +1 -1
  43. package/dist/persistenceServer.d.ts +7 -6
  44. package/dist/persistenceServer.js +4 -4
  45. package/dist/{server-Dd65rNm6.js → server-C65z_kqm.js} +47 -17
  46. package/dist/server-C65z_kqm.js.map +1 -0
  47. package/dist/{server-BBdsATju.d.ts → server-Dyo8qh4k.d.ts} +23 -4
  48. package/dist/server.d.ts +12 -9
  49. package/dist/server.js +11 -10
  50. package/package.json +6 -6
  51. package/src/application/commands/WorkflowCommandHandlers.ts +9 -0
  52. package/src/application/dev/BootRuntimeSnapshotHolder.ts +2 -2
  53. package/src/application/dev/BootRuntimeSummary.types.ts +2 -2
  54. package/src/application/queries/WorkflowQueryHandlers.ts +7 -0
  55. package/src/applicationTokens.ts +1 -1
  56. package/src/bootstrap/AppContainerFactory.ts +584 -0
  57. package/src/bootstrap/{PreparedCodemationRuntime.ts → AppContainerLifecycle.ts} +3 -8
  58. package/src/bootstrap/runtime/AppConfigFactory.ts +155 -30
  59. package/src/bootstrap/runtime/DatabaseMigrations.ts +18 -0
  60. package/src/bootstrap/runtime/FrontendRuntime.ts +44 -0
  61. package/src/bootstrap/runtime/WorkerRuntime.ts +55 -0
  62. package/src/client.ts +7 -0
  63. package/src/index.ts +15 -5
  64. package/src/infrastructure/persistence/PrismaMigrationDeployer.ts +2 -2
  65. package/src/infrastructure/persistence/SchedulerPersistenceCompatibilityValidator.ts +2 -2
  66. package/src/infrastructure/scheduler/WorkerRuntimeScheduler.ts +16 -0
  67. package/src/infrastructure/scheduler/bullmq/BullmqNodeExecutionScheduler.ts +47 -0
  68. package/src/infrastructure/scheduler/bullmq/BullmqScheduler.ts +33 -0
  69. package/src/infrastructure/scheduler/bullmq/BullmqWorker.ts +48 -0
  70. package/src/infrastructure/scheduler/bullmq/RedisConnectionOptionsFactory.ts +48 -0
  71. package/src/nextServer.ts +12 -3
  72. package/src/persistenceServer.ts +2 -2
  73. package/src/presentation/config/AppConfig.ts +25 -1
  74. package/src/presentation/frontend/CodemationFrontendAuthSnapshot.ts +14 -0
  75. package/src/presentation/frontend/CodemationFrontendAuthSnapshotFactory.ts +84 -0
  76. package/src/presentation/frontend/CodemationFrontendAuthSnapshotJsonCodec.ts +58 -0
  77. package/src/presentation/frontend/FrontendAppConfig.ts +10 -0
  78. package/src/presentation/frontend/FrontendAppConfigFactory.ts +26 -0
  79. package/src/presentation/frontend/FrontendAppConfigJsonCodec.ts +58 -0
  80. package/src/presentation/http/CodemationServerGatewayFactory.ts +22 -16
  81. package/src/presentation/server/AppConfigLoader.ts +39 -0
  82. package/src/presentation/server/CodemationConsumerAppResolver.ts +2 -2
  83. package/src/presentation/server/CodemationConsumerConfigLoader.ts +3 -2
  84. package/src/server.ts +7 -0
  85. package/vitest.shared.ts +0 -4
  86. package/dist/CodemationConsumerConfigLoader-scS_RQMy.js.map +0 -1
  87. package/dist/CodemationFrontendBootstrapRequest-CNEk-C4D.js.map +0 -1
  88. package/dist/CodemationPluginListMerger-BNmaoXQL.js.map +0 -1
  89. package/dist/CodemationPluginListMerger-BRYqEk0y.d.ts +0 -793
  90. package/dist/CredentialServices-BKBGe7l3.js.map +0 -1
  91. package/dist/PrismaMigrationDeployer-B7cHGrXP.js.map +0 -1
  92. package/dist/ServerLoggerFactory-BRHxIDS7.js.map +0 -1
  93. package/dist/persistenceServer-DPSj_-oU.d.ts +0 -37
  94. package/dist/server-Dd65rNm6.js.map +0 -1
  95. package/src/bootstrap/CodemationContainerFactory.ts +0 -310
  96. package/src/bootstrap/CodemationFrontendBootstrapRequest.ts +0 -16
  97. package/src/bootstrap/CodemationWorkerBootstrapRequest.ts +0 -19
  98. package/src/bootstrap/PreparedCodemationRuntimeFactory.ts +0 -308
  99. package/src/bootstrap/boot/CliRuntimeBootService.ts +0 -27
  100. package/src/bootstrap/boot/FrontendRuntimeBootService.ts +0 -86
  101. package/src/bootstrap/boot/WorkerRuntimeBootService.ts +0 -64
  102. package/src/bootstrap/runtime/ResolvedImplementationSelectionFactory.ts +0 -118
  103. package/src/codemationApplication.ts +0 -311
  104. package/src/infrastructure/credentials/FrameworkBuiltinCredentialTypesRegistrar.ts +0 -21
  105. package/src/infrastructure/persistence/DatabasePersistenceResolver.ts +0 -91
  106. package/src/infrastructure/runtime/WorkerRuntimeScheduler.ts +0 -35
  107. package/src/presentation/config/CodemationApplicationFacade.ts +0 -5
  108. /package/dist/{decorate-B-N_5S4p.js → decorate-B0PP651O.js} +0 -0
  109. /package/dist/{decorateParam-BTcc3KNk.js → decorateParam-DrsXNPuw.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodemationFrontendBootstrapRequest-CNEk-C4D.js","names":["email: string","password: string","filteredOutputsByNode: RunCurrentState[\"outputsByNode\"]","filteredSnapshotsByNodeId: RunCurrentState[\"nodeSnapshotsByNodeId\"]","workflowId: string","body: CopyRunToWorkflowDebuggerRequest","CopyRunToWorkflowDebuggerCommandHandler","workflowRunRepository: WorkflowRunRepository","workflowDefinitionRepository: WorkflowDefinitionRepository","workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository","body: CreateCredentialInstanceRequest","CreateCredentialInstanceCommandHandler","credentialInstanceService: CredentialInstanceService","instanceId: string","DeleteCredentialInstanceCommandHandler","credentialInstanceService: CredentialInstanceService","instanceId: string","TestCredentialInstanceCommandHandler","credentialTestService: CredentialTestService","instanceId: string","body: UpdateCredentialInstanceRequest","UpdateCredentialInstanceCommandHandler","credentialInstanceService: CredentialInstanceService","body: UpsertCredentialBindingRequest","UpsertCredentialBindingCommandHandler","credentialBindingService: CredentialBindingService","endpointPath: string","requestMethod: string","requestItem: Item","HandleWebhookInvocationCommandHandler","runIntentService: RunIntentService","runId: string","nodeId: string","body: RunNodeRequest","ReplayWorkflowNodeCommandHandler","engine: Engine","itemsInputNormalizer: ItemsInputNormalizer","runIntentService: RunIntentService","workflowRunRepository: WorkflowRunRepository","runId: string","body: UpdateRunWorkflowSnapshotRequest","ReplaceMutableRunWorkflowSnapshotCommandHandler","workflowRunRepository: WorkflowRunRepository","workflowId: string","body: UpdateWorkflowDebuggerOverlayRequest","ReplaceWorkflowDebuggerOverlayCommandHandler","workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository","runId: string","nodeId: string","body: UpdateRunNodePinRequest","SetPinnedNodeInputCommandHandler","workflowRunRepository: WorkflowRunRepository","itemsInputNormalizer: ItemsInputNormalizer","WorkflowActivationPreflightRules","lines: string[]","WorkflowActivationPreflight","workflowRepository: WorkflowRepository","credentialBindingService: CredentialBindingService","rules: WorkflowActivationPreflightRules","RuntimeWorkflowActivationPolicy","workflowId: string","active: boolean","SetWorkflowActivationCommandHandler","workflowActivationRepository: WorkflowActivationRepository","workflowActivationPolicy: RuntimeWorkflowActivationPolicy","engine: Engine","workflowActivationPreflight: WorkflowActivationPreflight","body: CreateRunRequest","StartWorkflowRunCommandHandler","engine: Engine","itemsInputNormalizer: ItemsInputNormalizer","runIntentService: RunIntentService","workflowDefinitionRepository: WorkflowDefinitionRepository","workflowRunRepository: WorkflowRunRepository","workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository","loggerFactory: LoggerFactory","OverlayPinnedBinaryUploadService","binaryStorage: BinaryStorage","workflowId: string","nodeId: string","itemIndex: number","attachmentName: string","mimeType: string","body: BinaryBody","filename?: string","UploadOverlayPinnedBinaryCommandHandler","overlayPinnedBinaryUpload: OverlayPinnedBinaryUploadService","token: string","password: string","KNOWN_PROVIDER_LABELS: Readonly<Record<string, string>>","authConfig: CodemationAuthConfig | undefined","prisma: PrismaClient | undefined","labels: string[]","AcceptUserInviteCommandHandler","userAccounts: UserAccountService","email: string","requestOrigin: string","InviteUserCommandHandler","userAccounts: UserAccountService","userId: string","requestOrigin: string","RegenerateUserInviteCommandHandler","userAccounts: UserAccountService","userId: string","status: UserAccountStatus","UpdateUserAccountStatusCommandHandler","userAccounts: UserAccountService","UpsertLocalBootstrapUserCommandHandler","userAccounts: UserAccountService","instanceId: string","GetCredentialInstanceQueryHandler","credentialInstanceService: CredentialInstanceService","instanceId: string","GetCredentialInstanceWithSecretsQueryHandler","credentialInstanceService: CredentialInstanceService","workflowId: string","GetWorkflowCredentialHealthQueryHandler","credentialBindingService: CredentialBindingService","ListCredentialInstancesQueryHandler","credentialInstanceService: CredentialInstanceService","ListCredentialTypesQueryHandler","credentialTypeRegistry: CredentialTypeRegistryImpl","GetCredentialFieldEnvStatusQueryHandler","credentialTypeRegistry: CredentialTypeRegistryImpl","appConfig: AppConfig","out: Record<string, boolean>","RunBinaryAttachmentLookupService","workflowRunRepository: WorkflowRunRepository","workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository","runId: string","binaryId: string","GetRunBinaryAttachmentQueryHandler","lookupService: RunBinaryAttachmentLookupService","runId: string","GetRunStateQueryHandler","workflowRunRepository: WorkflowRunRepository","workflowId: string","GetWorkflowDebuggerOverlayQueryHandler","workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository","workflowId: string","GetWorkflowDetailQueryHandler","workflowDefinitionRepository: WorkflowDefinitionRepository","workflowId: string","binaryId: string","GetWorkflowOverlayBinaryAttachmentQueryHandler","lookupService: RunBinaryAttachmentLookupService","GetWorkflowSummariesQueryHandler","workflowRepository: WorkflowRepository","workflowId: string","ListWorkflowRunsQueryHandler","workflowRunRepository: WorkflowRunRepository","ListUserAccountsQueryHandler","userAccounts: UserAccountService","token: string","VerifyUserInviteQueryHandler","userAccounts: UserAccountService","BinaryHttpRouteHandler","queryBus: QueryBus","commandBus: CommandBus","binaryStorage: BinaryStorage","BinaryHonoApiRouteRegistrar","handler: BinaryHttpRouteHandler","CredentialHttpRouteHandler","queryBus: QueryBus","commandBus: CommandBus","CredentialHonoApiRouteRegistrar","handler: CredentialHttpRouteHandler","BootRuntimeSnapshotHolder","DevBootstrapSummaryAssembler","bootRuntimeSnapshot: BootRuntimeSnapshotHolder","logLevelPolicyFactory: LogLevelPolicyFactory","workflowActivationPolicy: RuntimeWorkflowActivationPolicy","workflowRepository: WorkflowRepository","DevBootstrapSummaryHttpRouteHandler","assembler: DevBootstrapSummaryAssembler","DevHonoApiRouteRegistrar","handler: DevBootstrapSummaryHttpRouteHandler","OAuth2ProviderRegistry","OAuth2ConnectService","credentialStore: CredentialStore","credentialInstanceService: CredentialInstanceService","credentialTypeRegistry: CredentialTypeRegistryImpl","credentialRuntimeMaterialService: CredentialRuntimeMaterialService","credentialFieldEnvOverlayService: CredentialFieldEnvOverlayService","credentialMaterialResolver: CredentialMaterialResolver","credentialSecretCipher: CredentialSecretCipher","oauth2ProviderRegistry: OAuth2ProviderRegistry","appConfig: AppConfig","parsed: URL","OAuth2HttpRouteHandler","oauth2ConnectService: OAuth2ConnectService","credentialInstanceService: CredentialInstanceService","OAuth2HonoApiRouteRegistrar","handler: OAuth2HttpRouteHandler","RunHttpRouteHandler","queryBus: QueryBus","commandBus: CommandBus","RunHonoApiRouteRegistrar","handler: RunHttpRouteHandler","UserHttpRouteHandler","queryBus: QueryBus","commandBus: CommandBus","UserHonoApiRouteRegistrar","handler: UserHttpRouteHandler","RequestToWebhookItemMapper","binaryStorage: BinaryStorage","runIdFactory: RunIdFactory","activationIdFactory: ActivationIdFactory","formFields: Record<string, string>","binaryParts: Record<string, BinaryAttachment>","binary: ItemBinary | undefined","headers: Record<string, string>","query: Record<string, string>","WebhookHttpRouteHandler","commandBus: CommandBus","runIntentService: RunIntentService","requestToWebhookItemMapper: RequestToWebhookItemMapper","WebhookHonoApiRouteRegistrar","handler: WebhookHttpRouteHandler","path","WhitelabelLogoHttpRouteHandler","appConfig: AppConfig","whitelabel: CodemationWhitelabelConfig","consumerRootReal: string","fileReal: string","WhitelabelHonoApiRouteRegistrar","whitelabelLogoHttpRouteHandler: WhitelabelLogoHttpRouteHandler","WorkflowDefinitionMapper","policyUi: WorkflowPolicyUiPresentationFactory","workflowActivationPolicy: WorkflowActivationPolicy","nodes: WorkflowNodeDto[]","WorkflowHttpRouteHandler","queryBus: QueryBus","commandBus: CommandBus","workflowDefinitionMapper: WorkflowDefinitionMapper","WorkflowHonoApiRouteRegistrar","handler: WorkflowHttpRouteHandler","openAiApiKeyCredentialTypeFactory: OpenAiApiKeyCredentialTypeFactory","port: number","bindHost: string","logger: Logger","body: BinaryBody","baseDirectory: string","PrismaCredentialStore","prisma: PrismaClient","PrismaClient","InMemoryCredentialStore","InMemoryTriggerSetupStateRepository","InMemoryWorkflowActivationRepository","InMemoryWorkflowDebuggerOverlayRepository","InMemoryWorkflowRunRepository","out: RunPruneCandidate[]","PrismaClientFactory","PrismaClient","PrismaTriggerSetupStateRepository","prisma: PrismaClient","PrismaClient","PrismaWorkflowActivationRepository","prisma: PrismaClient","PrismaClient","PrismaWorkflowDebuggerOverlayRepository","prisma: PrismaClient","PrismaClient","PrismaWorkflowRunRepository","prisma: PrismaClient","state: PersistedRunState","blob: StateJsonBlob","PrismaClient","databasePersistenceResolver: DatabasePersistenceResolver","schedulerPersistenceCompatibilityValidator: SchedulerPersistenceCompatibilityValidator","implementationSelectionFactory: ResolvedImplementationSelectionFactory","WorkflowRunEventWebsocketRelay","workflowWebsocketPublisher: WorkflowWebsocketPublisher","runEventBus: RunEventBus","container: Container","runtimeSummary: BootRuntimeSummary","implementationSelection: ResolvedImplementationSelection","usesProvidedPrismaClientOverride: boolean","ownedPrismaClient: PrismaClient | null","ownedPglite: PGlite | null","implementationSelectionFactory: ResolvedImplementationSelectionFactory","appConfigFactory: AppConfigFactory","appConfig: AppConfig","PrismaClient","workflowRunRepository","container","prismaClient","CodemationHonoApiApp","sessionVerifier: SessionVerifier","registrars: ReadonlyArray<HonoApiRouteRegistrar>","binaryHttpRouteHandler: BinaryHttpRouteHandler","WebhookEndpointPathValidator","loggerFactory: LoggerFactory","path","CodemationIdFactory","InMemoryCommandBus","handlers: ReadonlyArray<CommandHandler<Command<unknown>, unknown>>","InMemoryDomainEventBus","handlers: ReadonlyArray<DomainEventHandler<DomainEvent>>","InMemoryQueryBus","handlers: ReadonlyArray<QueryHandler<Query<unknown>, unknown>>","authSecret: string","WorkflowDefinitionRepositoryAdapter","engine: Engine","workflowRepository: WorkflowRepository","WorkflowRunRepository","workflowExecutionRepository: WorkflowExecutionRepository","connectionExpander: AIAgentConnectionWorkflowExpander","container","containerRegistrationRegistrar: CodemationContainerRegistrationRegistrar","container","tsyringeContainer","registry","SqlWorkflowRunRepository","worker: WorkerRuntimeHandle","normalizedConfig: NormalizedCodemationConfig","container"],"sources":["../src/application/bus/Query.ts","../src/application/queries/ListUserAccountsQuery.ts","../src/application/bus/Command.ts","../src/application/commands/UpsertLocalBootstrapUserCommand.ts","../src/infrastructure/di/HandlesCommandRegistry.ts","../src/application/bus/CommandHandler.ts","../src/application/workflows/WorkflowDebuggerOverlayStateFactory.ts","../src/application/commands/CopyRunToWorkflowDebuggerCommand.ts","../src/application/commands/CopyRunToWorkflowDebuggerCommandHandler.ts","../src/application/commands/CreateCredentialInstanceCommand.ts","../src/application/commands/CreateCredentialInstanceCommandHandler.ts","../src/application/commands/DeleteCredentialInstanceCommand.ts","../src/application/commands/DeleteCredentialInstanceCommandHandler.ts","../src/application/commands/TestCredentialInstanceCommand.ts","../src/application/commands/TestCredentialInstanceCommandHandler.ts","../src/application/commands/UpdateCredentialInstanceCommand.ts","../src/application/commands/UpdateCredentialInstanceCommandHandler.ts","../src/application/commands/UpsertCredentialBindingCommand.ts","../src/application/commands/UpsertCredentialBindingCommandHandler.ts","../src/application/commands/HandleWebhookInvocationCommand.ts","../src/application/commands/HandleWebhookInvocationCommandHandler.ts","../src/application/commands/ReplayWorkflowNodeCommand.ts","../src/application/commands/ReplayWorkflowNodeCommandHandler.ts","../src/application/commands/ReplaceMutableRunWorkflowSnapshotCommand.ts","../src/application/commands/ReplaceMutableRunWorkflowSnapshotCommandHandler.ts","../src/application/commands/ReplaceWorkflowDebuggerOverlayCommand.ts","../src/application/commands/ReplaceWorkflowDebuggerOverlayCommandHandler.ts","../src/application/commands/SetPinnedNodeInputCommand.ts","../src/application/commands/SetPinnedNodeInputCommandHandler.ts","../src/domain/workflows/WorkflowActivationPreflightRules.ts","../src/domain/workflows/WorkflowActivationPreflight.ts","../src/infrastructure/persistence/RuntimeWorkflowActivationPolicy.ts","../src/application/commands/SetWorkflowActivationCommand.ts","../src/application/commands/SetWorkflowActivationCommandHandler.ts","../src/application/commands/StartWorkflowRunCommand.ts","../src/application/commands/StartWorkflowRunCommandHandler.ts","../src/application/binary/OverlayPinnedBinaryUploadService.ts","../src/application/commands/UploadOverlayPinnedBinaryCommand.ts","../src/application/commands/UploadOverlayPinnedBinaryCommandHandler.ts","../src/application/commands/AcceptUserInviteCommand.ts","../src/domain/users/userLoginMethodLabels.types.ts","../src/domain/users/UserAccountServiceRegistry.ts","../src/application/commands/AcceptUserInviteCommandHandler.ts","../src/application/commands/InviteUserCommand.ts","../src/application/commands/InviteUserCommandHandler.ts","../src/application/commands/RegenerateUserInviteCommand.ts","../src/application/commands/RegenerateUserInviteCommandHandler.ts","../src/application/commands/UpdateUserAccountStatusCommand.ts","../src/application/commands/UpdateUserAccountStatusCommandHandler.ts","../src/application/commands/UpsertLocalBootstrapUserCommandHandler.ts","../src/application/queries/GetCredentialInstanceQuery.ts","../src/application/bus/QueryHandler.ts","../src/infrastructure/di/HandlesQueryRegistry.ts","../src/application/queries/GetCredentialInstanceQueryHandler.ts","../src/application/queries/GetCredentialInstanceWithSecretsQuery.ts","../src/application/queries/GetCredentialInstanceWithSecretsQueryHandler.ts","../src/application/queries/GetWorkflowCredentialHealthQuery.ts","../src/application/queries/GetWorkflowCredentialHealthQueryHandler.ts","../src/application/queries/ListCredentialInstancesQuery.ts","../src/application/queries/ListCredentialInstancesQueryHandler.ts","../src/application/queries/ListCredentialTypesQuery.ts","../src/application/queries/ListCredentialTypesQueryHandler.ts","../src/application/queries/GetCredentialFieldEnvStatusQuery.ts","../src/application/queries/GetCredentialFieldEnvStatusQueryHandler.ts","../src/application/binary/RunBinaryAttachmentLookupService.ts","../src/application/queries/GetRunBinaryAttachmentQuery.ts","../src/application/queries/GetRunBinaryAttachmentQueryHandler.ts","../src/application/queries/GetRunStateQuery.ts","../src/application/queries/GetRunStateQueryHandler.ts","../src/application/queries/GetWorkflowDebuggerOverlayQuery.ts","../src/application/queries/GetWorkflowDebuggerOverlayQueryHandler.ts","../src/application/queries/GetWorkflowDetailQuery.ts","../src/application/queries/GetWorkflowDetailQueryHandler.ts","../src/application/queries/GetWorkflowOverlayBinaryAttachmentQuery.ts","../src/application/queries/GetWorkflowOverlayBinaryAttachmentQueryHandler.ts","../src/application/queries/GetWorkflowSummariesQuery.ts","../src/application/queries/GetWorkflowSummariesQueryHandler.ts","../src/application/queries/ListWorkflowRunsQuery.ts","../src/application/queries/ListWorkflowRunsQueryHandler.ts","../src/application/queries/ListUserAccountsQueryHandler.ts","../src/application/queries/VerifyUserInviteQuery.ts","../src/application/queries/VerifyUserInviteQueryHandler.ts","../src/presentation/http/ServerHttpErrorResponseFactory.ts","../src/presentation/http/routeHandlers/BinaryHttpRouteHandlerFactory.ts","../src/presentation/http/hono/registrars/BinaryHonoApiRouteRegistrar.ts","../src/presentation/http/HttpRequestJsonBodyReader.ts","../src/presentation/http/routeHandlers/CredentialHttpRouteHandler.ts","../src/presentation/http/hono/registrars/CredentialHonoApiRouteRegistrar.ts","../src/application/dev/BootRuntimeSnapshotHolder.ts","../src/application/dev/DevBootstrapSummaryAssembler.ts","../src/presentation/http/routeHandlers/DevBootstrapSummaryHttpRouteHandler.ts","../src/presentation/http/hono/registrars/DevHonoApiRouteRegistrar.ts","../src/domain/credentials/OAuth2ProviderRegistry.ts","../src/domain/credentials/OAuth2ConnectServiceFactory.ts","../src/presentation/http/routeHandlers/OAuth2HttpRouteHandlerFactory.ts","../src/presentation/http/hono/registrars/OAuth2HonoApiRouteRegistrar.ts","../src/presentation/http/routeHandlers/RunHttpRouteHandler.ts","../src/presentation/http/hono/registrars/RunHonoApiRouteRegistrar.ts","../src/presentation/http/routeHandlers/UserHttpRouteHandlerFactory.ts","../src/presentation/http/hono/registrars/UserHonoApiRouteRegistrar.ts","../src/infrastructure/webhooks/RequestToWebhookItemMapper.ts","../src/presentation/http/routeHandlers/WebhookHttpRouteHandler.ts","../src/presentation/http/hono/registrars/WebhookHonoApiRouteRegistrar.ts","../src/presentation/http/routeHandlers/WhitelabelLogoHttpRouteHandler.ts","../src/presentation/http/hono/registrars/WhitelabelHonoApiRouteRegistrar.ts","../src/application/mapping/WorkflowPolicyUiPresentationFactory.ts","../src/application/mapping/WorkflowDefinitionMapper.ts","../src/presentation/http/routeHandlers/WorkflowHttpRouteHandler.ts","../src/presentation/http/hono/registrars/WorkflowHonoApiRouteRegistrar.ts","../src/infrastructure/credentials/FrameworkBuiltinCredentialTypesRegistrar.ts","../src/infrastructure/config/CodemationPluginRegistrar.ts","../src/presentation/http/ApiPaths.ts","../src/presentation/websocket/WorkflowWebsocketServer.ts","../src/infrastructure/binary/BinaryBodyNodeReadableFactory.ts","../src/infrastructure/binary/CountingSha256Transform.ts","../src/infrastructure/binary/LocalFilesystemBinaryStorageRegistry.ts","../src/infrastructure/persistence/PrismaCredentialStore.ts","../src/infrastructure/persistence/CredentialPersistenceStore.ts","../src/infrastructure/persistence/InMemoryTriggerSetupStateRepository.ts","../src/infrastructure/persistence/InMemoryWorkflowActivationRepository.ts","../src/infrastructure/persistence/InMemoryWorkflowDebuggerOverlayRepository.ts","../src/infrastructure/persistence/InMemoryWorkflowRunRepository.ts","../src/infrastructure/persistence/PrismaClientFactory.ts","../src/infrastructure/persistence/PrismaTriggerSetupStateRepository.ts","../src/infrastructure/persistence/PrismaWorkflowActivationRepository.ts","../src/infrastructure/persistence/PrismaWorkflowDebuggerOverlayRepository.ts","../src/infrastructure/persistence/PrismaWorkflowRunRepository.ts","../src/infrastructure/persistence/SchedulerPersistenceCompatibilityValidator.ts","../src/bootstrap/runtime/ResolvedImplementationSelectionFactory.ts","../src/bootstrap/runtime/AppConfigFactory.ts","../src/application/websocket/WorkflowRunEventWebsocketRelay.ts","../src/bootstrap/PreparedCodemationRuntime.ts","../src/bootstrap/PreparedCodemationRuntimeFactory.ts","../src/presentation/http/hono/HonoHttpAnonymousRoutePolicyRegistry.ts","../src/presentation/http/hono/CodemationHonoApiAppFactory.ts","../src/application/workflows/WebhookEndpointPathValidator.ts","../src/infrastructure/ids/CodemationIdFactory.ts","../src/infrastructure/di/InMemoryCommandBus.ts","../src/infrastructure/di/HandlesDomainEventRegistry.ts","../src/infrastructure/di/InMemoryDomainEventBus.ts","../src/infrastructure/di/InMemoryQueryBus.ts","../src/infrastructure/auth/AuthJsSessionVerifier.ts","../src/infrastructure/auth/DevelopmentSessionBypassVerifier.ts","../src/infrastructure/persistence/WorkflowDefinitionRepositoryAdapter.ts","../src/infrastructure/persistence/WorkflowRunRepository.ts","../src/infrastructure/runtime/LiveWorkflowRepository.ts","../src/bootstrap/CodemationContainerRegistrationRegistrar.ts","../src/bootstrap/CodemationContainerFactory.ts","../src/bootstrap/boot/CliRuntimeBootService.ts","../src/bootstrap/boot/FrontendRuntimeBootService.ts","../src/bootstrap/boot/WorkerRuntimeBootService.ts","../src/codemationApplication.ts","../src/bootstrap/CodemationBootstrapRequest.ts","../src/bootstrap/CodemationFrontendBootstrapRequest.ts"],"sourcesContent":["export abstract class Query<TResult> {\n protected readonly __resultType?: TResult;\n}\n","import type { UserAccountDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { Query } from \"../bus/Query\";\n\nexport class ListUserAccountsQuery extends Query<ReadonlyArray<UserAccountDto>> {}\n","export abstract class Command<TResult> {\n protected readonly __resultType?: TResult;\n}\n","import type { UpsertLocalBootstrapUserResultDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class UpsertLocalBootstrapUserCommand extends Command<UpsertLocalBootstrapUserResultDto> {\n constructor(\n public readonly email: string,\n public readonly password: string,\n ) {\n super();\n }\n}\n","import { injectable, registry } from \"@codemation/core\";\nimport type { Command } from \"../../application/bus/Command\";\nimport type { CommandHandler } from \"../../application/bus/CommandHandler\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\n\ntype AbstractType<TInstance> = abstract new (...args: any[]) => TInstance;\ntype ConcreteType<TInstance> = new (...args: any[]) => TInstance;\n\nexport const commandHandlerMetadataKey = Symbol.for(\"codemation.infrastructure.di.CommandHandler\");\n\nexport class HandlesCommand {\n static forCommand<TCommand extends Command<TResult>, TResult>(commandType: AbstractType<TCommand>): ClassDecorator {\n return (target) => {\n Reflect.defineMetadata(commandHandlerMetadataKey, commandType, target);\n injectable()(target as never);\n registry([\n {\n token: ApplicationTokens.CommandHandler,\n useClass: target as unknown as ConcreteType<CommandHandler<Command<unknown>, unknown>>,\n },\n ])(target as never);\n };\n }\n}\n","import type { Command } from \"./Command\";\n\nexport abstract class CommandHandler<TCommand extends Command<TResult>, TResult> {\n abstract execute(command: TCommand): Promise<TResult>;\n}\n","import type { PersistedRunState, RunCurrentState } from \"@codemation/core\";\nimport type { WorkflowDebuggerOverlayState } from \"../../domain/workflows/WorkflowDebuggerOverlayState\";\n\nexport class WorkflowDebuggerOverlayStateFactory {\n static createEmpty(workflowId: string): WorkflowDebuggerOverlayState {\n return {\n workflowId,\n updatedAt: new Date().toISOString(),\n currentState: {\n outputsByNode: {},\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n mutableState: {\n nodesById: {},\n },\n },\n };\n }\n\n static replaceCurrentState(\n args: Readonly<{\n workflowId: string;\n currentState?: RunCurrentState;\n copiedFromRunId?: string;\n updatedAt?: string;\n }>,\n ): WorkflowDebuggerOverlayState {\n return {\n workflowId: args.workflowId,\n updatedAt: args.updatedAt ?? new Date().toISOString(),\n copiedFromRunId: args.copiedFromRunId,\n currentState: this.cloneCurrentState(args.currentState),\n };\n }\n\n static copyRunStateToOverlay(\n args: Readonly<{\n workflowId: string;\n sourceState: PersistedRunState;\n liveWorkflowNodeIds: ReadonlySet<string>;\n existingOverlay?: WorkflowDebuggerOverlayState;\n }>,\n ): WorkflowDebuggerOverlayState {\n const existingState = this.cloneCurrentState(args.existingOverlay?.currentState);\n const filteredOutputsByNode: RunCurrentState[\"outputsByNode\"] = { ...existingState.outputsByNode };\n const filteredSnapshotsByNodeId: RunCurrentState[\"nodeSnapshotsByNodeId\"] = {\n ...existingState.nodeSnapshotsByNodeId,\n };\n const filteredMutableNodesById = { ...(existingState.mutableState?.nodesById ?? {}) };\n const filteredConnectionInvocations = (args.sourceState.connectionInvocations ?? []).filter(\n (inv) =>\n args.liveWorkflowNodeIds.has(inv.connectionNodeId) || args.liveWorkflowNodeIds.has(inv.parentAgentNodeId),\n );\n\n for (const nodeId of args.liveWorkflowNodeIds) {\n const nodeOutputs = args.sourceState.outputsByNode[nodeId];\n const nodeSnapshot = args.sourceState.nodeSnapshotsByNodeId[nodeId];\n if (nodeOutputs) {\n filteredOutputsByNode[nodeId] = JSON.parse(\n JSON.stringify(nodeOutputs),\n ) as RunCurrentState[\"outputsByNode\"][string];\n } else {\n delete filteredOutputsByNode[nodeId];\n }\n if (nodeSnapshot) {\n filteredSnapshotsByNodeId[nodeId] = JSON.parse(\n JSON.stringify(nodeSnapshot),\n ) as RunCurrentState[\"nodeSnapshotsByNodeId\"][string];\n } else {\n delete filteredSnapshotsByNodeId[nodeId];\n }\n filteredMutableNodesById[nodeId] = {\n ...(filteredMutableNodesById[nodeId] ?? {}),\n pinnedOutputsByPort: undefined,\n };\n }\n return {\n workflowId: args.workflowId,\n updatedAt: new Date().toISOString(),\n copiedFromRunId: args.sourceState.runId,\n currentState: {\n outputsByNode: filteredOutputsByNode,\n nodeSnapshotsByNodeId: filteredSnapshotsByNodeId,\n connectionInvocations: filteredConnectionInvocations.map((inv) => JSON.parse(JSON.stringify(inv))),\n mutableState: {\n nodesById: filteredMutableNodesById,\n },\n },\n };\n }\n\n static cloneCurrentState(currentState: RunCurrentState | undefined): RunCurrentState {\n if (!currentState) {\n return {\n outputsByNode: {},\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n mutableState: {\n nodesById: {},\n },\n };\n }\n return {\n outputsByNode: JSON.parse(JSON.stringify(currentState.outputsByNode ?? {})) as RunCurrentState[\"outputsByNode\"],\n nodeSnapshotsByNodeId: JSON.parse(\n JSON.stringify(currentState.nodeSnapshotsByNodeId ?? {}),\n ) as RunCurrentState[\"nodeSnapshotsByNodeId\"],\n connectionInvocations: currentState.connectionInvocations\n ? (JSON.parse(JSON.stringify(currentState.connectionInvocations)) as NonNullable<\n RunCurrentState[\"connectionInvocations\"]\n >)\n : undefined,\n mutableState: JSON.parse(\n JSON.stringify(\n currentState.mutableState ?? {\n nodesById: {},\n },\n ),\n ) as NonNullable<RunCurrentState[\"mutableState\"]>,\n };\n }\n}\n","import { Command } from \"../bus/Command\";\nimport type {\n CopyRunToWorkflowDebuggerRequest,\n WorkflowDebuggerOverlayResponse,\n} from \"../contracts/WorkflowDebuggerContracts\";\n\nexport class CopyRunToWorkflowDebuggerCommand extends Command<WorkflowDebuggerOverlayResponse> {\n constructor(\n public readonly workflowId: string,\n public readonly body: CopyRunToWorkflowDebuggerRequest,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { WorkflowDebuggerOverlayState } from \"../../domain/workflows/WorkflowDebuggerOverlayState\";\nimport type { WorkflowDefinitionRepository } from \"../../domain/workflows/WorkflowDefinitionRepository\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { ApplicationRequestError } from \"../ApplicationRequestError\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport type { WorkflowDebuggerOverlayResponse } from \"../contracts/WorkflowDebuggerContracts\";\nimport { WorkflowDebuggerOverlayStateFactory } from \"../workflows/WorkflowDebuggerOverlayStateFactory\";\nimport { CopyRunToWorkflowDebuggerCommand } from \"./CopyRunToWorkflowDebuggerCommand\";\n\n@HandlesCommand.forCommand(CopyRunToWorkflowDebuggerCommand)\nexport class CopyRunToWorkflowDebuggerCommandHandler extends CommandHandler<\n CopyRunToWorkflowDebuggerCommand,\n WorkflowDebuggerOverlayResponse\n> {\n constructor(\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n @inject(ApplicationTokens.WorkflowDefinitionRepository)\n private readonly workflowDefinitionRepository: WorkflowDefinitionRepository,\n @inject(ApplicationTokens.WorkflowDebuggerOverlayRepository)\n private readonly workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository,\n ) {\n super();\n }\n\n async execute(command: CopyRunToWorkflowDebuggerCommand): Promise<WorkflowDebuggerOverlayState> {\n if (!command.body.sourceRunId) {\n throw new ApplicationRequestError(400, \"Missing sourceRunId\");\n }\n const workflowId = decodeURIComponent(command.workflowId);\n const sourceState = await this.workflowRunRepository.load(command.body.sourceRunId);\n if (!sourceState) {\n throw new ApplicationRequestError(404, \"Unknown runId\");\n }\n if (sourceState.workflowId !== workflowId) {\n throw new ApplicationRequestError(400, \"Run does not belong to the requested workflow\");\n }\n const workflow = await this.workflowDefinitionRepository.getDefinition(workflowId);\n if (!workflow) {\n throw new ApplicationRequestError(404, \"Unknown workflowId\");\n }\n const existingOverlay = await this.workflowDebuggerOverlayRepository.load(workflowId);\n const nextOverlay = WorkflowDebuggerOverlayStateFactory.copyRunStateToOverlay({\n workflowId,\n sourceState,\n liveWorkflowNodeIds: new Set(workflow.nodes.map((node) => node.id)),\n existingOverlay,\n });\n await this.workflowDebuggerOverlayRepository.save(nextOverlay);\n return nextOverlay;\n }\n}\n","import type { CreateCredentialInstanceRequest, CredentialInstanceDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class CreateCredentialInstanceCommand extends Command<CredentialInstanceDto> {\n constructor(public readonly body: CreateCredentialInstanceRequest) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { CredentialInstanceDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { CredentialInstanceService } from \"../../domain/credentials/CredentialServices\";\n\nimport { CreateCredentialInstanceCommand } from \"./CreateCredentialInstanceCommand\";\n\n@HandlesCommand.forCommand(CreateCredentialInstanceCommand)\nexport class CreateCredentialInstanceCommandHandler extends CommandHandler<\n CreateCredentialInstanceCommand,\n CredentialInstanceDto\n> {\n constructor(\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n ) {\n super();\n }\n\n async execute(command: CreateCredentialInstanceCommand): Promise<CredentialInstanceDto> {\n return await this.credentialInstanceService.create(command.body);\n }\n}\n","import { Command } from \"../bus/Command\";\n\nexport class DeleteCredentialInstanceCommand extends Command<Readonly<{ ok: true }>> {\n constructor(public readonly instanceId: string) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { DeleteCredentialInstanceCommand } from \"./DeleteCredentialInstanceCommand\";\n\nimport { CredentialInstanceService } from \"../../domain/credentials/CredentialServices\";\n\n@HandlesCommand.forCommand(DeleteCredentialInstanceCommand)\nexport class DeleteCredentialInstanceCommandHandler extends CommandHandler<\n DeleteCredentialInstanceCommand,\n Readonly<{ ok: true }>\n> {\n constructor(\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n ) {\n super();\n }\n\n async execute(command: DeleteCredentialInstanceCommand): Promise<Readonly<{ ok: true }>> {\n await this.credentialInstanceService.delete(command.instanceId);\n return { ok: true };\n }\n}\n","import type { CredentialHealth } from \"@codemation/core\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class TestCredentialInstanceCommand extends Command<CredentialHealth> {\n constructor(public readonly instanceId: string) {\n super();\n }\n}\n","import type { CredentialHealth } from \"@codemation/core\";\n\nimport { inject } from \"@codemation/core\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { TestCredentialInstanceCommand } from \"./TestCredentialInstanceCommand\";\n\nimport { CredentialTestService } from \"../../domain/credentials/CredentialServices\";\n\n@HandlesCommand.forCommand(TestCredentialInstanceCommand)\nexport class TestCredentialInstanceCommandHandler extends CommandHandler<\n TestCredentialInstanceCommand,\n CredentialHealth\n> {\n constructor(\n @inject(CredentialTestService)\n private readonly credentialTestService: CredentialTestService,\n ) {\n super();\n }\n\n async execute(command: TestCredentialInstanceCommand): Promise<CredentialHealth> {\n return await this.credentialTestService.test(command.instanceId);\n }\n}\n","import type { CredentialInstanceDto, UpdateCredentialInstanceRequest } from \"../contracts/CredentialContractsRegistry\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class UpdateCredentialInstanceCommand extends Command<CredentialInstanceDto> {\n constructor(\n public readonly instanceId: string,\n public readonly body: UpdateCredentialInstanceRequest,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { CredentialInstanceDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { UpdateCredentialInstanceCommand } from \"./UpdateCredentialInstanceCommand\";\n\nimport { CredentialInstanceService } from \"../../domain/credentials/CredentialServices\";\n\n@HandlesCommand.forCommand(UpdateCredentialInstanceCommand)\nexport class UpdateCredentialInstanceCommandHandler extends CommandHandler<\n UpdateCredentialInstanceCommand,\n CredentialInstanceDto\n> {\n constructor(\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n ) {\n super();\n }\n\n async execute(command: UpdateCredentialInstanceCommand): Promise<CredentialInstanceDto> {\n return await this.credentialInstanceService.update(command.instanceId, command.body);\n }\n}\n","import type { CredentialBinding } from \"@codemation/core\";\n\nimport type { UpsertCredentialBindingRequest } from \"../contracts/CredentialContractsRegistry\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class UpsertCredentialBindingCommand extends Command<CredentialBinding> {\n constructor(public readonly body: UpsertCredentialBindingRequest) {\n super();\n }\n}\n","import type { CredentialBinding } from \"@codemation/core\";\n\nimport { inject } from \"@codemation/core\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { UpsertCredentialBindingCommand } from \"./UpsertCredentialBindingCommand\";\n\nimport { CredentialBindingService } from \"../../domain/credentials/CredentialServices\";\n\n@HandlesCommand.forCommand(UpsertCredentialBindingCommand)\nexport class UpsertCredentialBindingCommandHandler extends CommandHandler<\n UpsertCredentialBindingCommand,\n CredentialBinding\n> {\n constructor(\n @inject(CredentialBindingService)\n private readonly credentialBindingService: CredentialBindingService,\n ) {\n super();\n }\n\n async execute(command: UpsertCredentialBindingCommand): Promise<CredentialBinding> {\n return await this.credentialBindingService.upsertBinding(command.body);\n }\n}\n","import type { Item } from \"@codemation/core\";\nimport { Command } from \"../bus/Command\";\n\nexport class HandleWebhookInvocationCommand extends Command<unknown> {\n constructor(\n public readonly endpointPath: string,\n public readonly requestMethod: string,\n public readonly requestItem: Item,\n ) {\n super();\n }\n}\n","import type { WebhookRunResult } from \"@codemation/core\";\nimport { inject } from \"@codemation/core\";\nimport { RunIntentService } from \"@codemation/core/bootstrap\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { ApplicationRequestError } from \"../ApplicationRequestError\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport { HandleWebhookInvocationCommand } from \"./HandleWebhookInvocationCommand\";\n\n@HandlesCommand.forCommand(HandleWebhookInvocationCommand)\nexport class HandleWebhookInvocationCommandHandler extends CommandHandler<HandleWebhookInvocationCommand, unknown> {\n constructor(\n @inject(RunIntentService)\n private readonly runIntentService: RunIntentService,\n ) {\n super();\n }\n\n async execute(command: HandleWebhookInvocationCommand): Promise<unknown> {\n try {\n const requestMethod = command.requestMethod.toUpperCase() as \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n const endpointPath = decodeURIComponent(command.endpointPath);\n const resolution = this.runIntentService.resolveWebhookTrigger({ endpointPath, method: requestMethod });\n if (resolution.status === \"notFound\") {\n throw new ApplicationRequestError(404, \"Unknown webhook endpoint\");\n }\n if (resolution.status === \"methodNotAllowed\") {\n throw new ApplicationRequestError(405, \"Method not allowed\");\n }\n const result = (await this.runIntentService.runWebhookMatch({\n match: resolution.match,\n requestItem: command.requestItem,\n })) satisfies WebhookRunResult;\n return result.response.at(-1)?.json ?? null;\n } catch (error) {\n if (error instanceof ApplicationRequestError) {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n throw new ApplicationRequestError(400, message);\n }\n }\n}\n","import { Command } from \"../bus/Command\";\nimport type { RunCommandResult, RunNodeRequest } from \"../contracts/RunContracts\";\n\nexport class ReplayWorkflowNodeCommand extends Command<RunCommandResult> {\n constructor(\n public readonly runId: string,\n public readonly nodeId: string,\n public readonly body: RunNodeRequest,\n ) {\n super();\n }\n}\n","import type {\n Items,\n PersistedMutableRunState,\n PersistedRunState,\n RunCurrentState,\n WorkflowDefinition,\n} from \"@codemation/core\";\nimport { ItemsInputNormalizer, inject } from \"@codemation/core\";\nimport { RunIntentService } from \"@codemation/core/bootstrap\";\nimport { Engine } from \"@codemation/core/bootstrap\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { ApplicationRequestError } from \"../ApplicationRequestError\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport type { RunCommandResult } from \"../contracts/RunContracts\";\nimport { ReplayWorkflowNodeCommand } from \"./ReplayWorkflowNodeCommand\";\n\n@HandlesCommand.forCommand(ReplayWorkflowNodeCommand)\nexport class ReplayWorkflowNodeCommandHandler extends CommandHandler<ReplayWorkflowNodeCommand, RunCommandResult> {\n constructor(\n @inject(Engine)\n private readonly engine: Engine,\n @inject(ItemsInputNormalizer)\n private readonly itemsInputNormalizer: ItemsInputNormalizer,\n @inject(RunIntentService)\n private readonly runIntentService: RunIntentService,\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n ) {\n super();\n }\n\n async execute(command: ReplayWorkflowNodeCommand): Promise<RunCommandResult> {\n const state = await this.workflowRunRepository.load(command.runId);\n if (!state) {\n throw new ApplicationRequestError(404, \"Unknown runId\");\n }\n this.ensureMutable(state);\n const workflow = this.resolveWorkflow(state);\n if (!workflow) {\n throw new ApplicationRequestError(404, \"Unknown workflow for run\");\n }\n const decodedNodeId = decodeURIComponent(command.nodeId);\n const mode = command.body.mode ?? state.executionOptions?.mode ?? \"manual\";\n const requestedItems = await this.resolveRequestedItems({\n workflow,\n nodeId: decodedNodeId,\n items: command.body.items,\n synthesizeTriggerItems: command.body.synthesizeTriggerItems,\n });\n const mutableStateBase = this.cloneMutableState(state.mutableState) ?? { nodesById: {} };\n const mutableState = requestedItems\n ? ({\n nodesById: {\n ...mutableStateBase.nodesById,\n [decodedNodeId]: {\n ...(mutableStateBase.nodesById[decodedNodeId] ?? {}),\n lastDebugInput: requestedItems,\n },\n },\n } satisfies PersistedMutableRunState)\n : mutableStateBase;\n const executionOptions = {\n mode,\n sourceWorkflowId: state.executionOptions?.sourceWorkflowId ?? state.workflowId,\n sourceRunId: state.executionOptions?.sourceRunId ?? state.runId,\n derivedFromRunId: state.runId,\n isMutable: true,\n } as const;\n const result = await this.runIntentService.rerunFromNode({\n workflow,\n nodeId: decodedNodeId,\n currentState: this.cloneRunCurrentState(state, mutableState),\n items: requestedItems,\n executionOptions,\n workflowSnapshot: this.cloneWorkflowSnapshot(state.workflowSnapshot),\n mutableState,\n });\n const nextState = await this.workflowRunRepository.load(result.runId);\n return {\n runId: result.runId,\n workflowId: result.workflowId,\n startedAt: result.startedAt,\n status: result.status,\n state: nextState ?? null,\n };\n }\n\n private ensureMutable(state: PersistedRunState): void {\n if (!state.executionOptions?.isMutable) {\n throw new ApplicationRequestError(403, `Run ${state.runId} is immutable`);\n }\n }\n\n private resolveWorkflow(state: PersistedRunState): WorkflowDefinition | undefined {\n return this.engine.resolveWorkflowSnapshot({\n workflowId: state.workflowId,\n workflowSnapshot: state.workflowSnapshot,\n });\n }\n\n private cloneMutableState(mutableState: PersistedRunState[\"mutableState\"]): PersistedMutableRunState | undefined {\n if (!mutableState) {\n return undefined;\n }\n return JSON.parse(JSON.stringify(mutableState)) as PersistedMutableRunState;\n }\n\n private cloneWorkflowSnapshot(\n workflowSnapshot: PersistedRunState[\"workflowSnapshot\"],\n ): PersistedRunState[\"workflowSnapshot\"] {\n if (!workflowSnapshot) {\n return undefined;\n }\n return JSON.parse(JSON.stringify(workflowSnapshot)) as NonNullable<PersistedRunState[\"workflowSnapshot\"]>;\n }\n\n private cloneRunCurrentState(\n state: PersistedRunState,\n mutableState: PersistedMutableRunState | undefined,\n ): RunCurrentState {\n return {\n outputsByNode: JSON.parse(JSON.stringify(state.outputsByNode)) as RunCurrentState[\"outputsByNode\"],\n nodeSnapshotsByNodeId: JSON.parse(\n JSON.stringify(state.nodeSnapshotsByNodeId),\n ) as RunCurrentState[\"nodeSnapshotsByNodeId\"],\n mutableState,\n };\n }\n\n private async resolveRequestedItems(\n args: Readonly<{\n workflow: WorkflowDefinition;\n nodeId: string;\n items: Items | undefined | null;\n synthesizeTriggerItems: boolean | undefined;\n }>,\n ): Promise<Items | undefined> {\n const normalizedItems = args.items == null ? undefined : this.itemsInputNormalizer.normalize(args.items);\n if (!this.shouldSynthesizeTriggerItems(args.workflow, args.nodeId, args.synthesizeTriggerItems, normalizedItems)) {\n return normalizedItems;\n }\n return await this.engine.createTriggerTestItems({\n workflow: args.workflow,\n nodeId: args.nodeId,\n });\n }\n\n private shouldSynthesizeTriggerItems(\n workflow: WorkflowDefinition,\n nodeId: string,\n synthesizeTriggerItems: boolean | undefined,\n normalizedItems: Items | undefined,\n ): boolean {\n if (synthesizeTriggerItems) {\n return true;\n }\n if (normalizedItems && normalizedItems.length > 0) {\n return false;\n }\n return workflow.nodes.find((node) => node.id === nodeId)?.kind === \"trigger\";\n }\n}\n","import type { PersistedRunState } from \"@codemation/core\";\nimport { Command } from \"../bus/Command\";\nimport type { UpdateRunWorkflowSnapshotRequest } from \"../contracts/RunContracts\";\n\nexport class ReplaceMutableRunWorkflowSnapshotCommand extends Command<PersistedRunState> {\n constructor(\n public readonly runId: string,\n public readonly body: UpdateRunWorkflowSnapshotRequest,\n ) {\n super();\n }\n}\n","import { inject, type PersistedRunState } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { ApplicationRequestError } from \"../ApplicationRequestError\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport { ReplaceMutableRunWorkflowSnapshotCommand } from \"./ReplaceMutableRunWorkflowSnapshotCommand\";\n\n@HandlesCommand.forCommand(ReplaceMutableRunWorkflowSnapshotCommand)\nexport class ReplaceMutableRunWorkflowSnapshotCommandHandler extends CommandHandler<\n ReplaceMutableRunWorkflowSnapshotCommand,\n PersistedRunState\n> {\n constructor(\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n ) {\n super();\n }\n\n async execute(command: ReplaceMutableRunWorkflowSnapshotCommand): Promise<PersistedRunState> {\n if (!command.body.workflowSnapshot) {\n throw new ApplicationRequestError(400, \"Missing workflowSnapshot\");\n }\n const state = await this.workflowRunRepository.load(command.runId);\n if (!state) {\n throw new ApplicationRequestError(404, \"Unknown runId\");\n }\n if (!state.executionOptions?.isMutable) {\n throw new ApplicationRequestError(403, `Run ${state.runId} is immutable`);\n }\n await this.workflowRunRepository.save({\n ...state,\n status: \"completed\",\n pending: undefined,\n queue: [],\n outputsByNode: {},\n nodeSnapshotsByNodeId: {},\n workflowSnapshot: command.body.workflowSnapshot,\n });\n const updated = await this.workflowRunRepository.load(state.runId);\n if (!updated) {\n throw new ApplicationRequestError(404, \"Unknown runId\");\n }\n return updated;\n }\n}\n","import { Command } from \"../bus/Command\";\nimport type {\n UpdateWorkflowDebuggerOverlayRequest,\n WorkflowDebuggerOverlayResponse,\n} from \"../contracts/WorkflowDebuggerContracts\";\n\nexport class ReplaceWorkflowDebuggerOverlayCommand extends Command<WorkflowDebuggerOverlayResponse> {\n constructor(\n public readonly workflowId: string,\n public readonly body: UpdateWorkflowDebuggerOverlayRequest,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { WorkflowDebuggerOverlayState } from \"../../domain/workflows/WorkflowDebuggerOverlayState\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { ApplicationRequestError } from \"../ApplicationRequestError\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport type { WorkflowDebuggerOverlayResponse } from \"../contracts/WorkflowDebuggerContracts\";\nimport { WorkflowDebuggerOverlayStateFactory } from \"../workflows/WorkflowDebuggerOverlayStateFactory\";\nimport { ReplaceWorkflowDebuggerOverlayCommand } from \"./ReplaceWorkflowDebuggerOverlayCommand\";\n\n@HandlesCommand.forCommand(ReplaceWorkflowDebuggerOverlayCommand)\nexport class ReplaceWorkflowDebuggerOverlayCommandHandler extends CommandHandler<\n ReplaceWorkflowDebuggerOverlayCommand,\n WorkflowDebuggerOverlayResponse\n> {\n constructor(\n @inject(ApplicationTokens.WorkflowDebuggerOverlayRepository)\n private readonly workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository,\n ) {\n super();\n }\n\n async execute(command: ReplaceWorkflowDebuggerOverlayCommand): Promise<WorkflowDebuggerOverlayState> {\n if (!command.body.currentState) {\n throw new ApplicationRequestError(400, \"Missing currentState\");\n }\n const nextState = WorkflowDebuggerOverlayStateFactory.replaceCurrentState({\n workflowId: decodeURIComponent(command.workflowId),\n currentState: command.body.currentState,\n });\n await this.workflowDebuggerOverlayRepository.save(nextState);\n return nextState;\n }\n}\n","import type { PersistedRunState } from \"@codemation/core\";\nimport { Command } from \"../bus/Command\";\nimport type { UpdateRunNodePinRequest } from \"../contracts/RunContracts\";\n\nexport class SetPinnedNodeInputCommand extends Command<PersistedRunState> {\n constructor(\n public readonly runId: string,\n public readonly nodeId: string,\n public readonly body: UpdateRunNodePinRequest,\n ) {\n super();\n }\n}\n","import { ItemsInputNormalizer, inject, type PersistedRunState } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { ApplicationRequestError } from \"../ApplicationRequestError\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport { SetPinnedNodeInputCommand } from \"./SetPinnedNodeInputCommand\";\n\n@HandlesCommand.forCommand(SetPinnedNodeInputCommand)\nexport class SetPinnedNodeInputCommandHandler extends CommandHandler<SetPinnedNodeInputCommand, PersistedRunState> {\n constructor(\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n @inject(ItemsInputNormalizer)\n private readonly itemsInputNormalizer: ItemsInputNormalizer,\n ) {\n super();\n }\n\n async execute(command: SetPinnedNodeInputCommand): Promise<PersistedRunState> {\n const state = await this.workflowRunRepository.load(command.runId);\n if (!state) {\n throw new ApplicationRequestError(404, \"Unknown runId\");\n }\n if (!state.executionOptions?.isMutable) {\n throw new ApplicationRequestError(403, `Run ${state.runId} is immutable`);\n }\n const decodedNodeId = decodeURIComponent(command.nodeId);\n const pinnedItems =\n command.body.items == null ? undefined : this.itemsInputNormalizer.normalize(command.body.items);\n const nextNodesById = {\n ...(state.mutableState?.nodesById ?? {}),\n [decodedNodeId]: {\n ...(state.mutableState?.nodesById?.[decodedNodeId] ?? {}),\n pinnedOutputsByPort: pinnedItems ? { main: pinnedItems } : undefined,\n },\n };\n await this.workflowRunRepository.save({\n ...state,\n mutableState: {\n nodesById: nextNodesById,\n },\n });\n const updated = await this.workflowRunRepository.load(state.runId);\n if (!updated) {\n throw new ApplicationRequestError(404, \"Unknown runId\");\n }\n return updated;\n }\n}\n","import type { WorkflowCredentialHealthDto } from \"../../application/contracts/CredentialContractsRegistry\";\nimport { getPersistedRuntimeTypeMetadata, injectable, type WorkflowDefinition } from \"@codemation/core\";\nimport { MissingRuntimeTriggerToken } from \"@codemation/core/bootstrap\";\nimport { ManualTriggerNode } from \"@codemation/core-nodes\";\n\n@injectable()\nexport class WorkflowActivationPreflightRules {\n private readonly manualTriggerTypeName: string;\n private readonly missingRuntimeTriggerTypeName: string;\n\n constructor() {\n this.manualTriggerTypeName = this.resolveRuntimeTypeTokenName(ManualTriggerNode);\n this.missingRuntimeTriggerTypeName = this.resolveRuntimeTypeTokenName(MissingRuntimeTriggerToken);\n }\n\n /**\n * Compare node runtime tokens by persisted decorator name (and constructor name fallback).\n * Reference equality breaks when the host and consumer workflow each load a separate copy of\n * `@codemation/core-nodes` (duplicate class identity for the same logical trigger type).\n */\n private resolveRuntimeTypeTokenName(token: unknown): string {\n const meta = getPersistedRuntimeTypeMetadata(token);\n if (meta) {\n return meta.persistedName;\n }\n if (typeof token === \"function\") {\n return (token as { name?: string }).name ?? \"\";\n }\n return \"\";\n }\n\n private isManualTriggerType(token: unknown): boolean {\n return this.resolveRuntimeTypeTokenName(token) === this.manualTriggerTypeName;\n }\n\n private isMissingRuntimeTriggerType(token: unknown): boolean {\n return this.resolveRuntimeTypeTokenName(token) === this.missingRuntimeTriggerTypeName;\n }\n\n collectNonManualTriggerErrors(workflow: WorkflowDefinition): ReadonlyArray<string> {\n const triggerNodes = workflow.nodes.filter((n) => n.kind === \"trigger\");\n const hasActivatable = triggerNodes.some(\n (n) => !this.isManualTriggerType(n.type) && !this.isMissingRuntimeTriggerType(n.type),\n );\n if (hasActivatable) {\n return [];\n }\n if (triggerNodes.length === 0) {\n return [\"This workflow has no trigger node. Add a non-manual trigger (for example a webhook) before activating.\"];\n }\n const onlyManual = triggerNodes.every((n) => this.isManualTriggerType(n.type));\n if (onlyManual) {\n return [\n \"This workflow only has a manual run trigger. Add a non-manual trigger (for example a webhook) before activating.\",\n ];\n }\n return [\n \"This workflow has no usable automatic trigger (the configured trigger may be missing or invalid). Fix the trigger before activating.\",\n ];\n }\n\n collectRequiredCredentialErrors(health: WorkflowCredentialHealthDto): ReadonlyArray<string> {\n const lines: string[] = [];\n for (const slot of health.slots) {\n if (slot.requirement.optional) {\n continue;\n }\n if (slot.health.status === \"unbound\") {\n const nodeLabel = slot.nodeName ?? slot.nodeId;\n lines.push(\n `Required credential \"${slot.requirement.label}\" (${slot.requirement.slotKey}) on \"${nodeLabel}\" is not bound.`,\n );\n }\n }\n return lines;\n }\n}\n","import { ApplicationRequestError } from \"../../application/ApplicationRequestError\";\nimport { CoreTokens, inject, injectable, type WorkflowRepository } from \"@codemation/core\";\nimport { CredentialBindingService } from \"../credentials/CredentialServices\";\nimport { WorkflowActivationPreflightRules } from \"./WorkflowActivationPreflightRules\";\n\n@injectable()\nexport class WorkflowActivationPreflight {\n constructor(\n @inject(CoreTokens.WorkflowRepository)\n private readonly workflowRepository: WorkflowRepository,\n @inject(CredentialBindingService)\n private readonly credentialBindingService: CredentialBindingService,\n @inject(WorkflowActivationPreflightRules)\n private readonly rules: WorkflowActivationPreflightRules,\n ) {}\n\n async assertCanActivate(workflowId: string): Promise<void> {\n const decodedId = decodeURIComponent(workflowId);\n const workflow = this.workflowRepository.get(decodedId);\n if (!workflow) {\n throw new ApplicationRequestError(404, `Unknown workflowId: ${decodedId}`);\n }\n const health = await this.credentialBindingService.listWorkflowHealth(decodedId);\n const errors = [\n ...this.rules.collectNonManualTriggerErrors(workflow),\n ...this.rules.collectRequiredCredentialErrors(health),\n ];\n if (errors.length > 0) {\n throw new ApplicationRequestError(400, \"Workflow cannot be activated.\", errors);\n }\n }\n}\n","import type { WorkflowActivationPolicy, WorkflowId } from \"@codemation/core\";\nimport { injectable } from \"@codemation/core\";\nimport type { WorkflowActivationRepository } from \"../../domain/workflows/WorkflowActivationRepository\";\n\n/**\n * In-memory activation map: missing workflow id ⇒ inactive. Hydrated from persistence at startup and updated on command.\n */\n@injectable()\nexport class RuntimeWorkflowActivationPolicy implements WorkflowActivationPolicy {\n private readonly activeByWorkflowId = new Map<string, boolean>();\n\n async hydrateFromRepository(repository: WorkflowActivationRepository): Promise<void> {\n const rows = await repository.loadAll();\n this.activeByWorkflowId.clear();\n for (const row of rows) {\n this.activeByWorkflowId.set(decodeURIComponent(row.workflowId), row.isActive);\n }\n }\n\n set(workflowId: string, active: boolean): void {\n this.activeByWorkflowId.set(decodeURIComponent(workflowId), active);\n }\n\n isActive(workflowId: WorkflowId): boolean {\n return this.activeByWorkflowId.get(workflowId) ?? false;\n }\n}\n","import { Command } from \"../bus/Command\";\n\nexport class SetWorkflowActivationCommand extends Command<Readonly<{ active: boolean }>> {\n constructor(\n public readonly workflowId: string,\n public readonly active: boolean,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\nimport { Engine } from \"@codemation/core/bootstrap\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { WorkflowActivationPreflight } from \"../../domain/workflows/WorkflowActivationPreflight\";\nimport type { WorkflowActivationRepository } from \"../../domain/workflows/WorkflowActivationRepository\";\nimport { RuntimeWorkflowActivationPolicy } from \"../../infrastructure/persistence/RuntimeWorkflowActivationPolicy\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport { SetWorkflowActivationCommand } from \"./SetWorkflowActivationCommand\";\n\n@HandlesCommand.forCommand(SetWorkflowActivationCommand)\nexport class SetWorkflowActivationCommandHandler extends CommandHandler<\n SetWorkflowActivationCommand,\n Readonly<{ active: boolean }>\n> {\n constructor(\n @inject(ApplicationTokens.WorkflowActivationRepository)\n private readonly workflowActivationRepository: WorkflowActivationRepository,\n @inject(RuntimeWorkflowActivationPolicy)\n private readonly workflowActivationPolicy: RuntimeWorkflowActivationPolicy,\n @inject(Engine)\n private readonly engine: Engine,\n @inject(WorkflowActivationPreflight)\n private readonly workflowActivationPreflight: WorkflowActivationPreflight,\n ) {\n super();\n }\n\n async execute(command: SetWorkflowActivationCommand): Promise<Readonly<{ active: boolean }>> {\n const workflowId = decodeURIComponent(command.workflowId);\n if (command.active) {\n await this.workflowActivationPreflight.assertCanActivate(command.workflowId);\n }\n await this.workflowActivationRepository.upsert(workflowId, command.active);\n this.workflowActivationPolicy.set(workflowId, command.active);\n await this.engine.syncWorkflowTriggersForActivation(workflowId);\n return { active: command.active };\n }\n}\n","import { Command } from \"../bus/Command\";\nimport type { CreateRunRequest, RunCommandResult } from \"../contracts/RunContracts\";\n\nexport class StartWorkflowRunCommand extends Command<RunCommandResult> {\n constructor(public readonly body: CreateRunRequest) {\n super();\n }\n}\n","import type {\n Items,\n NodeId,\n PersistedMutableRunState,\n PersistedRunState,\n RunCurrentState,\n RunStopCondition,\n WorkflowDefinition,\n} from \"@codemation/core\";\nimport { ItemsInputNormalizer, inject } from \"@codemation/core\";\nimport { RunIntentService } from \"@codemation/core/bootstrap\";\nimport { Engine } from \"@codemation/core/bootstrap\";\nimport type { Logger, LoggerFactory } from \"../logging/Logger\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { WorkflowDefinitionRepository } from \"../../domain/workflows/WorkflowDefinitionRepository\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { ApplicationRequestError } from \"../ApplicationRequestError\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport type { CreateRunRequest, RunCommandResult } from \"../contracts/RunContracts\";\nimport { WorkflowDebuggerOverlayStateFactory } from \"../workflows/WorkflowDebuggerOverlayStateFactory\";\nimport { StartWorkflowRunCommand } from \"./StartWorkflowRunCommand\";\n\n@HandlesCommand.forCommand(StartWorkflowRunCommand)\nexport class StartWorkflowRunCommandHandler extends CommandHandler<StartWorkflowRunCommand, RunCommandResult> {\n private readonly routesLog: Logger;\n\n constructor(\n @inject(Engine)\n private readonly engine: Engine,\n @inject(ItemsInputNormalizer)\n private readonly itemsInputNormalizer: ItemsInputNormalizer,\n @inject(RunIntentService)\n private readonly runIntentService: RunIntentService,\n @inject(ApplicationTokens.WorkflowDefinitionRepository)\n private readonly workflowDefinitionRepository: WorkflowDefinitionRepository,\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n @inject(ApplicationTokens.WorkflowDebuggerOverlayRepository)\n private readonly workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository,\n @inject(ApplicationTokens.LoggerFactory)\n loggerFactory: LoggerFactory,\n ) {\n super();\n this.routesLog = loggerFactory.create(\"codemation-routes.server\");\n }\n\n async execute(command: StartWorkflowRunCommand): Promise<RunCommandResult> {\n const body = command.body;\n if (!body.workflowId) {\n throw new ApplicationRequestError(400, \"Missing workflowId\");\n }\n const sourceState =\n body.sourceRunId && !body.currentState ? await this.workflowRunRepository.load(body.sourceRunId) : undefined;\n const debuggerOverlay = await this.workflowDebuggerOverlayRepository.load(body.workflowId);\n const workflow = await this.resolveWorkflow(body);\n if (!workflow) {\n throw new ApplicationRequestError(404, \"Unknown workflowId\");\n }\n const executionOptions = body.mode\n ? {\n mode: body.mode,\n sourceWorkflowId: body.workflowId,\n sourceRunId: body.sourceRunId ?? debuggerOverlay?.copiedFromRunId,\n derivedFromRunId: body.sourceRunId ?? debuggerOverlay?.copiedFromRunId,\n }\n : undefined;\n const legacyStartNodeId = body.startAt as NodeId | undefined;\n const clearFromNodeId = body.clearFromNodeId as NodeId | undefined;\n const requestedItems = await this.resolveRequestedItems({\n workflow,\n body,\n clearFromNodeId,\n });\n const items = this.resolveRunRequestItems(workflow, legacyStartNodeId, requestedItems);\n const currentState = this.createCurrentState({\n workflowId: body.workflowId,\n requestedCurrentState: body.currentState,\n sourceState,\n debuggerOverlay,\n });\n const result =\n legacyStartNodeId && this.hasReusableCurrentState(currentState) && !clearFromNodeId\n ? await this.runIntentService.rerunFromNode({\n workflow,\n nodeId: legacyStartNodeId,\n currentState,\n items: requestedItems,\n executionOptions,\n workflowSnapshot: sourceState?.workflowSnapshot,\n mutableState: this.cloneMutableState(currentState.mutableState),\n })\n : await this.runIntentService.startWorkflow({\n workflow,\n startAt: legacyStartNodeId && !body.sourceRunId && !body.stopAt ? legacyStartNodeId : undefined,\n items,\n executionOptions,\n workflowSnapshot: sourceState?.workflowSnapshot,\n mutableState: this.cloneMutableState(currentState.mutableState),\n currentState,\n reset: this.createResetRequest(clearFromNodeId),\n stopCondition:\n legacyStartNodeId && !body.sourceRunId && !body.currentState && !body.stopAt\n ? undefined\n : this.createStopCondition(body.stopAt),\n });\n const state = (await this.workflowRunRepository.load(result.runId)) ?? null;\n this.routesLog.info(\n `postRun workflow=${workflow.id} runId=${result.runId} status=${result.status} persistedStatus=${state?.status ?? \"missing\"}`,\n );\n return {\n runId: result.runId,\n workflowId: result.workflowId,\n startedAt: result.startedAt,\n status: result.status,\n state,\n };\n }\n\n private async resolveWorkflow(body: CreateRunRequest): Promise<WorkflowDefinition | undefined> {\n if (body.currentState) {\n if (!body.workflowId) {\n return undefined;\n }\n return await this.workflowDefinitionRepository.getDefinition(body.workflowId);\n }\n if (body.sourceRunId) {\n const sourceState = await this.workflowRunRepository.load(body.sourceRunId);\n if (!sourceState) {\n return undefined;\n }\n return this.engine.resolveWorkflowSnapshot({\n workflowId: sourceState.workflowId,\n workflowSnapshot: sourceState.workflowSnapshot,\n });\n }\n if (!body.workflowId) {\n return undefined;\n }\n return await this.workflowDefinitionRepository.getDefinition(body.workflowId);\n }\n\n private resolveRunRequestItems(workflow: WorkflowDefinition, startAt: string | undefined, items?: Items): Items {\n if (items !== undefined) {\n return items;\n }\n return this.isTriggerStart(workflow, startAt) ? [] : [{ json: {} }];\n }\n\n private async resolveRequestedItems(\n args: Readonly<{\n workflow: WorkflowDefinition;\n body: CreateRunRequest;\n clearFromNodeId: NodeId | undefined;\n }>,\n ): Promise<Items | undefined> {\n const triggerNodeId = this.resolveTriggerTestNodeId(args);\n const normalizedItems = args.body.items == null ? undefined : this.itemsInputNormalizer.normalize(args.body.items);\n if (!this.shouldSynthesizeTriggerItems(args.body, triggerNodeId, normalizedItems)) {\n return normalizedItems;\n }\n return await this.engine.createTriggerTestItems({\n workflow: args.workflow,\n nodeId: triggerNodeId!,\n });\n }\n\n private isTriggerStart(workflow: WorkflowDefinition, startAt: string | undefined): boolean {\n const resolvedStartAt =\n startAt ?? workflow.nodes.find((node) => node.kind === \"trigger\")?.id ?? workflow.nodes[0]?.id;\n const startNode = resolvedStartAt ? workflow.nodes.find((node) => node.id === resolvedStartAt) : undefined;\n return startNode?.kind === \"trigger\";\n }\n\n private resolveTriggerTestNodeId(\n args: Readonly<{\n workflow: WorkflowDefinition;\n body: CreateRunRequest;\n clearFromNodeId: NodeId | undefined;\n }>,\n ): NodeId | undefined {\n const stopAtNodeId = args.body.stopAt as NodeId | undefined;\n if (stopAtNodeId && this.isTriggerNode(args.workflow, stopAtNodeId)) {\n return stopAtNodeId;\n }\n if (!args.body.sourceRunId && !args.clearFromNodeId && !stopAtNodeId) {\n if (args.body.currentState && !args.body.synthesizeTriggerItems) {\n return undefined;\n }\n return args.workflow.nodes.find((node) => node.kind === \"trigger\")?.id;\n }\n return undefined;\n }\n\n private shouldSynthesizeTriggerItems(\n body: CreateRunRequest,\n triggerNodeId: NodeId | undefined,\n normalizedItems: Items | undefined,\n ): boolean {\n if (!triggerNodeId) {\n return false;\n }\n if (body.synthesizeTriggerItems) {\n return true;\n }\n if (normalizedItems && normalizedItems.length > 0) {\n return false;\n }\n return body.stopAt === triggerNodeId;\n }\n\n private isTriggerNode(workflow: WorkflowDefinition, nodeId: NodeId): boolean {\n return workflow.nodes.find((node) => node.id === nodeId)?.kind === \"trigger\";\n }\n\n private cloneMutableState(mutableState: PersistedRunState[\"mutableState\"]): PersistedMutableRunState | undefined {\n if (!mutableState) {\n return undefined;\n }\n return JSON.parse(JSON.stringify(mutableState)) as PersistedMutableRunState;\n }\n\n private cloneRunCurrentState(state: PersistedRunState | undefined): RunCurrentState {\n if (!state) {\n return WorkflowDebuggerOverlayStateFactory.cloneCurrentState(undefined);\n }\n return {\n outputsByNode: JSON.parse(JSON.stringify(state.outputsByNode)) as RunCurrentState[\"outputsByNode\"],\n nodeSnapshotsByNodeId: JSON.parse(\n JSON.stringify(state.nodeSnapshotsByNodeId),\n ) as RunCurrentState[\"nodeSnapshotsByNodeId\"],\n mutableState: this.cloneMutableState(state.mutableState),\n };\n }\n\n private createCurrentState(\n args: Readonly<{\n workflowId: string;\n requestedCurrentState: RunCurrentState | undefined;\n sourceState: PersistedRunState | undefined;\n debuggerOverlay: Awaited<ReturnType<WorkflowDebuggerOverlayRepository[\"load\"]>>;\n }>,\n ): RunCurrentState {\n if (args.requestedCurrentState) {\n return WorkflowDebuggerOverlayStateFactory.cloneCurrentState(args.requestedCurrentState);\n }\n const baseCurrentState = args.sourceState\n ? this.cloneRunCurrentState(args.sourceState)\n : WorkflowDebuggerOverlayStateFactory.cloneCurrentState(args.debuggerOverlay?.currentState);\n if (!args.sourceState || !args.debuggerOverlay || args.debuggerOverlay.workflowId !== args.workflowId) {\n return baseCurrentState;\n }\n return {\n ...baseCurrentState,\n mutableState: this.cloneMutableState(args.debuggerOverlay.currentState.mutableState),\n };\n }\n\n private createStopCondition(stopAtNodeId: string | undefined): RunStopCondition {\n if (!stopAtNodeId) {\n return { kind: \"workflowCompleted\" };\n }\n return {\n kind: \"nodeCompleted\",\n nodeId: stopAtNodeId as NodeId,\n };\n }\n\n private createResetRequest(clearFromNodeId: NodeId | undefined): Readonly<{ clearFromNodeId: NodeId }> | undefined {\n if (!clearFromNodeId) {\n return undefined;\n }\n return {\n clearFromNodeId,\n };\n }\n\n private hasReusableCurrentState(currentState: RunCurrentState): boolean {\n return (\n Object.keys(currentState.outputsByNode).length > 0 ||\n Object.keys(currentState.nodeSnapshotsByNodeId).length > 0 ||\n Object.keys(currentState.mutableState?.nodesById ?? {}).length > 0\n );\n }\n}\n","import type { BinaryAttachment, BinaryBody, BinaryPreviewKind, BinaryStorage } from \"@codemation/core\";\nimport { CoreTokens, inject, injectable } from \"@codemation/core\";\nimport sanitizeFilename from \"sanitize-filename\";\n\n/** Sentinel run id for debugger-overlay pinned-output uploads (not a real execution). */\nexport const OVERLAY_PIN_BINARY_RUN_ID = \"overlay-pin\";\n\n@injectable()\nexport class OverlayPinnedBinaryUploadService {\n constructor(@inject(CoreTokens.BinaryStorage) private readonly binaryStorage: BinaryStorage) {}\n\n async attach(\n args: Readonly<{\n workflowId: string;\n nodeId: string;\n itemIndex: number;\n name: string;\n body: BinaryBody;\n mimeType: string;\n filename?: string;\n previewKind?: BinaryAttachment[\"previewKind\"];\n }>,\n ): Promise<BinaryAttachment> {\n const attachmentId = this.createAttachmentId();\n const createdAt = new Date().toISOString();\n const activationId = this.overlayActivationId(args.itemIndex);\n const storageKey = this.createStorageKey({\n workflowId: args.workflowId,\n runId: OVERLAY_PIN_BINARY_RUN_ID,\n nodeId: args.nodeId,\n activationId,\n attachmentId,\n name: args.name,\n filename: args.filename,\n });\n const stored = await this.binaryStorage.write({\n storageKey,\n body: args.body,\n });\n return {\n id: attachmentId,\n storageKey: stored.storageKey,\n mimeType: args.mimeType,\n size: stored.size,\n storageDriver: this.binaryStorage.driverName,\n previewKind: args.previewKind ?? this.resolvePreviewKind(args.mimeType),\n createdAt,\n runId: OVERLAY_PIN_BINARY_RUN_ID,\n workflowId: args.workflowId,\n nodeId: args.nodeId,\n activationId,\n filename: args.filename,\n sha256: stored.sha256,\n };\n }\n\n private overlayActivationId(itemIndex: number): string {\n return `overlay-pin-i${itemIndex}`;\n }\n\n private createAttachmentId(): string {\n const cryptoObject = globalThis.crypto;\n if (cryptoObject && typeof cryptoObject.randomUUID === \"function\") {\n return cryptoObject.randomUUID();\n }\n return `bin-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n }\n\n private createStorageKey(\n args: Readonly<{\n workflowId: string;\n runId: string;\n nodeId: string;\n activationId: string;\n attachmentId: string;\n name: string;\n filename?: string;\n }>,\n ): string {\n const safeName = this.sanitizeSegment(args.name);\n const safeFilename = this.sanitizeFilenameForKey(args.filename);\n const filenameSuffix = safeFilename ? `-${safeFilename}` : \"\";\n return `${this.sanitizeSegment(args.workflowId)}/${this.sanitizeSegment(args.runId)}/${this.sanitizeSegment(args.nodeId)}/${this.sanitizeSegment(args.activationId)}/${args.attachmentId}-${safeName}${filenameSuffix}`;\n }\n\n private sanitizeSegment(value: string): string {\n const normalized = value.trim();\n if (!normalized) {\n return \"item\";\n }\n const safe = sanitizeFilename(normalized);\n return safe || \"item\";\n }\n\n private sanitizeFilenameForKey(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const basename = value.trim().split(\"/\").at(-1)?.split(\"\\\\\").at(-1) ?? value.trim();\n if (!basename) {\n return undefined;\n }\n const safe = sanitizeFilename(basename);\n return safe || undefined;\n }\n\n private resolvePreviewKind(mimeType: string): BinaryPreviewKind {\n if (mimeType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mimeType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (mimeType.startsWith(\"video/\")) {\n return \"video\";\n }\n return \"download\";\n }\n}\n","import type { BinaryAttachment, BinaryBody } from \"@codemation/core\";\nimport { Command } from \"../bus/Command\";\n\nexport class UploadOverlayPinnedBinaryCommand extends Command<BinaryAttachment> {\n constructor(\n public readonly workflowId: string,\n public readonly nodeId: string,\n public readonly itemIndex: number,\n public readonly attachmentName: string,\n public readonly mimeType: string,\n public readonly body: BinaryBody,\n public readonly filename?: string,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\nimport type { BinaryAttachment } from \"@codemation/core\";\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\nimport { OverlayPinnedBinaryUploadService } from \"../binary/OverlayPinnedBinaryUploadService\";\nimport { CommandHandler } from \"../bus/CommandHandler\";\nimport { UploadOverlayPinnedBinaryCommand } from \"./UploadOverlayPinnedBinaryCommand\";\n\n@HandlesCommand.forCommand(UploadOverlayPinnedBinaryCommand)\nexport class UploadOverlayPinnedBinaryCommandHandler extends CommandHandler<\n UploadOverlayPinnedBinaryCommand,\n BinaryAttachment\n> {\n constructor(\n @inject(OverlayPinnedBinaryUploadService)\n private readonly overlayPinnedBinaryUpload: OverlayPinnedBinaryUploadService,\n ) {\n super();\n }\n\n async execute(command: UploadOverlayPinnedBinaryCommand): Promise<BinaryAttachment> {\n return this.overlayPinnedBinaryUpload.attach({\n workflowId: command.workflowId,\n nodeId: command.nodeId,\n itemIndex: command.itemIndex,\n name: command.attachmentName,\n mimeType: command.mimeType,\n body: command.body,\n filename: command.filename,\n });\n }\n}\n","import { Command } from \"../bus/Command\";\n\nexport class AcceptUserInviteCommand extends Command<void> {\n constructor(\n public readonly token: string,\n public readonly password: string,\n ) {\n super();\n }\n}\n","/**\n * Human-readable labels for Auth.js Account.provider / type (users list, admin UI).\n */\nconst KNOWN_PROVIDER_LABELS: Readonly<Record<string, string>> = {\n google: \"Google\",\n github: \"GitHub\",\n \"microsoft-entra-id\": \"Microsoft Entra ID\",\n \"azure-ad\": \"Microsoft Entra ID\",\n email: \"Email link\",\n};\n\nfunction titleCaseProviderId(provider: string): string {\n return provider\n .split(/[-_.]+/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(\" \");\n}\n\nexport function labelForLinkedAuthAccount(provider: string, accountType: string): string {\n const known = KNOWN_PROVIDER_LABELS[provider];\n if (known) {\n return known;\n }\n if (accountType === \"oidc\") {\n return `SSO (${titleCaseProviderId(provider)})`;\n }\n return titleCaseProviderId(provider);\n}\n","import { hash } from \"bcryptjs\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ApplicationRequestError } from \"../../application/ApplicationRequestError\";\nimport type {\n InviteUserResponseDto,\n UpsertLocalBootstrapUserResultDto,\n UserAccountDto,\n UserAccountStatus,\n VerifyUserInviteResponseDto,\n} from \"../../application/contracts/userDirectoryContracts.types\";\nimport { PrismaClient } from \"../../infrastructure/persistence/generated/prisma-client/client.js\";\nimport type { CodemationAuthConfig } from \"../../presentation/config/CodemationAuthConfig\";\nimport { labelForLinkedAuthAccount } from \"./userLoginMethodLabels.types\";\n\nconst INVITE_TTL_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport class UserAccountService {\n constructor(\n private readonly authConfig: CodemationAuthConfig | undefined,\n private readonly prisma: PrismaClient | undefined,\n ) {}\n\n async listUsers(): Promise<ReadonlyArray<UserAccountDto>> {\n this.assertLocalAuth();\n const prisma = this.requirePrisma();\n const rows = await prisma.user.findMany({\n orderBy: { email: \"asc\" },\n include: {\n invites: {\n where: { revokedAt: null },\n orderBy: { createdAt: \"desc\" },\n },\n accounts: {\n select: { provider: true, type: true },\n },\n },\n });\n return rows.map((row) => this.toDto(row));\n }\n\n async inviteUser(email: string, requestOrigin: string): Promise<InviteUserResponseDto> {\n this.assertLocalAuth();\n const prisma = this.requirePrisma();\n const normalized = email.trim().toLowerCase();\n if (!normalized || !normalized.includes(\"@\")) {\n throw new ApplicationRequestError(400, \"Invalid email.\");\n }\n const existing = await prisma.user.findUnique({ where: { email: normalized } });\n if (existing?.accountStatus === \"active\") {\n throw new ApplicationRequestError(409, \"User is already active.\");\n }\n if (existing?.accountStatus === \"inactive\") {\n throw new ApplicationRequestError(409, \"User is inactive.\");\n }\n\n const rawToken = this.generateRawToken();\n const tokenHash = this.hashToken(rawToken);\n const expiresAt = new Date(Date.now() + INVITE_TTL_MS);\n const now = new Date();\n\n if (existing) {\n await prisma.$transaction(async (tx) => {\n await tx.userInvite.updateMany({\n where: { userId: existing.id, revokedAt: null },\n data: { revokedAt: now },\n });\n await tx.userInvite.create({\n data: { userId: existing.id, tokenHash, expiresAt, createdAt: now },\n });\n });\n const user = await this.getUserDto(existing.id);\n return { user, inviteUrl: this.buildInviteUrl(requestOrigin, rawToken) };\n }\n\n const created = await prisma.$transaction(async (tx) => {\n const u = await tx.user.create({\n data: {\n email: normalized,\n name: normalized.split(\"@\")[0] ?? normalized,\n accountStatus: \"invited\",\n },\n });\n await tx.userInvite.create({\n data: { userId: u.id, tokenHash, expiresAt, createdAt: now },\n });\n return u;\n });\n const user = await this.getUserDto(created.id);\n return { user, inviteUrl: this.buildInviteUrl(requestOrigin, rawToken) };\n }\n\n async regenerateInvite(userId: string, requestOrigin: string): Promise<InviteUserResponseDto> {\n this.assertLocalAuth();\n const prisma = this.requirePrisma();\n const row = await prisma.user.findUnique({ where: { id: userId } });\n if (!row) {\n throw new ApplicationRequestError(404, \"Unknown user.\");\n }\n if (row.accountStatus !== \"invited\") {\n throw new ApplicationRequestError(409, \"Can only regenerate invites for invited users.\");\n }\n\n const rawToken = this.generateRawToken();\n const tokenHash = this.hashToken(rawToken);\n const expiresAt = new Date(Date.now() + INVITE_TTL_MS);\n const now = new Date();\n\n await prisma.$transaction(async (tx) => {\n await tx.userInvite.updateMany({\n where: { userId, revokedAt: null },\n data: { revokedAt: now },\n });\n await tx.userInvite.create({\n data: { userId, tokenHash, expiresAt, createdAt: now },\n });\n });\n\n const user = await this.getUserDto(userId);\n return { user, inviteUrl: this.buildInviteUrl(requestOrigin, rawToken) };\n }\n\n async verifyInviteToken(rawToken: string): Promise<VerifyUserInviteResponseDto> {\n const prisma = this.requirePrisma();\n const trimmed = rawToken.trim();\n if (!trimmed) {\n return { valid: false };\n }\n const tokenHash = this.hashToken(trimmed);\n const invite = await prisma.userInvite.findFirst({\n where: { tokenHash, revokedAt: null },\n });\n if (!invite || invite.expiresAt <= new Date()) {\n return { valid: false };\n }\n const user = await prisma.user.findUnique({ where: { id: invite.userId } });\n if (!user?.email || user.accountStatus !== \"invited\") {\n return { valid: false };\n }\n return { valid: true, email: user.email };\n }\n\n async acceptInvite(rawToken: string, password: string): Promise<void> {\n const prisma = this.requirePrisma();\n const trimmed = rawToken.trim();\n if (!trimmed) {\n throw new ApplicationRequestError(400, \"Missing invite token.\");\n }\n if (password.length < 8) {\n throw new ApplicationRequestError(400, \"Password must be at least 8 characters.\");\n }\n const tokenHash = this.hashToken(trimmed);\n const invite = await prisma.userInvite.findFirst({\n where: { tokenHash, revokedAt: null },\n });\n if (!invite || invite.expiresAt <= new Date()) {\n throw new ApplicationRequestError(400, \"Invite is invalid or has expired.\");\n }\n const user = await prisma.user.findUnique({ where: { id: invite.userId } });\n if (!user || user.accountStatus !== \"invited\") {\n throw new ApplicationRequestError(400, \"Invite cannot be used for this account.\");\n }\n const passwordHash = await hash(password, 12);\n const now = new Date();\n await prisma.$transaction(async (tx) => {\n await tx.user.update({\n where: { id: user.id },\n data: { passwordHash, accountStatus: \"active\" },\n });\n await tx.userInvite.updateMany({\n where: { userId: user.id, revokedAt: null },\n data: { revokedAt: now },\n });\n });\n }\n\n async updateAccountStatus(userId: string, status: UserAccountStatus): Promise<UserAccountDto> {\n this.assertLocalAuth();\n const prisma = this.requirePrisma();\n if (status === \"invited\") {\n throw new ApplicationRequestError(400, \"Cannot set status to invited via this endpoint.\");\n }\n const row = await prisma.user.findUnique({ where: { id: userId } });\n if (!row) {\n throw new ApplicationRequestError(404, \"Unknown user.\");\n }\n await prisma.user.update({\n where: { id: userId },\n data: { accountStatus: status },\n });\n return await this.getUserDto(userId);\n }\n\n /**\n * Bootstrap path for `codemation user create`: create or update an active local user with a password hash.\n * Not used for invite-based onboarding (see {@link inviteUser} / {@link acceptInvite}).\n */\n async upsertBootstrapLocalUser(email: string, password: string): Promise<UpsertLocalBootstrapUserResultDto> {\n this.assertLocalAuth();\n const prisma = this.requirePrisma();\n const normalized = email.trim().toLowerCase();\n if (!normalized || !normalized.includes(\"@\")) {\n throw new ApplicationRequestError(400, \"Invalid email.\");\n }\n if (password.length < 8) {\n throw new ApplicationRequestError(400, \"Password must be at least 8 characters.\");\n }\n const passwordHash = await hash(password, 12);\n const existing = await prisma.user.findUnique({ where: { email: normalized } });\n if (existing) {\n await prisma.user.update({\n where: { email: normalized },\n data: { passwordHash, accountStatus: \"active\" },\n });\n return { outcome: \"updated\" };\n }\n await prisma.user.create({\n data: {\n email: normalized,\n passwordHash,\n name: normalized.split(\"@\")[0] ?? normalized,\n accountStatus: \"active\",\n },\n });\n return { outcome: \"created\" };\n }\n\n private buildInviteUrl(origin: string, rawToken: string): string {\n const base = origin.replace(/\\/$/, \"\");\n return `${base}/invite/${encodeURIComponent(rawToken)}`;\n }\n\n private hashToken(raw: string): string {\n return createHash(\"sha256\").update(raw, \"utf8\").digest(\"hex\");\n }\n\n private generateRawToken(): string {\n return randomBytes(32).toString(\"base64url\");\n }\n\n private assertLocalAuth(): void {\n if (this.authConfig?.kind !== \"local\") {\n throw new ApplicationRequestError(403, \"User management requires local authentication.\");\n }\n }\n\n private requirePrisma(): PrismaClient {\n if (!this.prisma) {\n throw new ApplicationRequestError(503, \"User management requires a database.\");\n }\n return this.prisma;\n }\n\n private async getUserDto(userId: string): Promise<UserAccountDto> {\n const prisma = this.requirePrisma();\n const row = await prisma.user.findUniqueOrThrow({\n where: { id: userId },\n include: {\n invites: {\n where: { revokedAt: null },\n orderBy: { createdAt: \"desc\" },\n take: 1,\n },\n accounts: {\n select: { provider: true, type: true },\n },\n },\n });\n return this.toDto(row);\n }\n\n private toDto(row: {\n id: string;\n email: string | null;\n accountStatus: string;\n passwordHash: string | null;\n accounts: ReadonlyArray<{ provider: string; type: string }>;\n invites: ReadonlyArray<{ expiresAt: Date }>;\n }): UserAccountDto {\n const now = new Date();\n const open = row.invites[0];\n const inviteExpiresAt = open && open.expiresAt > now ? open.expiresAt.toISOString() : null;\n return {\n id: row.id,\n email: row.email ?? \"\",\n status: row.accountStatus as UserAccountStatus,\n inviteExpiresAt,\n loginMethods: UserAccountService.buildLoginMethods(row),\n };\n }\n\n private static buildLoginMethods(row: {\n passwordHash: string | null;\n accounts: ReadonlyArray<{ provider: string; type: string }>;\n }): ReadonlyArray<string> {\n const labels: string[] = [];\n const seen = new Set<string>();\n if (row.passwordHash && row.passwordHash.length > 0) {\n labels.push(\"Password\");\n seen.add(\"Password\");\n }\n for (const account of row.accounts) {\n if (account.provider === \"credentials\") {\n continue;\n }\n const label = labelForLinkedAuthAccount(account.provider, account.type);\n if (!seen.has(label)) {\n seen.add(label);\n labels.push(label);\n }\n }\n const password = labels.filter((l) => l === \"Password\");\n const rest = labels.filter((l) => l !== \"Password\").sort((a, b) => a.localeCompare(b));\n return [...password, ...rest];\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { UserAccountService } from \"../../domain/users/UserAccountServiceRegistry\";\nimport { AcceptUserInviteCommand } from \"./AcceptUserInviteCommand\";\n\n@HandlesCommand.forCommand(AcceptUserInviteCommand)\nexport class AcceptUserInviteCommandHandler extends CommandHandler<AcceptUserInviteCommand, void> {\n constructor(@inject(UserAccountService) private readonly userAccounts: UserAccountService) {\n super();\n }\n\n async execute(command: AcceptUserInviteCommand): Promise<void> {\n await this.userAccounts.acceptInvite(command.token, command.password);\n }\n}\n","import type { InviteUserResponseDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class InviteUserCommand extends Command<InviteUserResponseDto> {\n constructor(\n public readonly email: string,\n public readonly requestOrigin: string,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { InviteUserResponseDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { UserAccountService } from \"../../domain/users/UserAccountServiceRegistry\";\n\nimport { InviteUserCommand } from \"./InviteUserCommand\";\n\n@HandlesCommand.forCommand(InviteUserCommand)\nexport class InviteUserCommandHandler extends CommandHandler<InviteUserCommand, InviteUserResponseDto> {\n constructor(@inject(UserAccountService) private readonly userAccounts: UserAccountService) {\n super();\n }\n\n async execute(command: InviteUserCommand): Promise<InviteUserResponseDto> {\n return await this.userAccounts.inviteUser(command.email, command.requestOrigin);\n }\n}\n","import type { InviteUserResponseDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class RegenerateUserInviteCommand extends Command<InviteUserResponseDto> {\n constructor(\n public readonly userId: string,\n public readonly requestOrigin: string,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { InviteUserResponseDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { UserAccountService } from \"../../domain/users/UserAccountServiceRegistry\";\nimport { RegenerateUserInviteCommand } from \"./RegenerateUserInviteCommand\";\n\n@HandlesCommand.forCommand(RegenerateUserInviteCommand)\nexport class RegenerateUserInviteCommandHandler extends CommandHandler<\n RegenerateUserInviteCommand,\n InviteUserResponseDto\n> {\n constructor(@inject(UserAccountService) private readonly userAccounts: UserAccountService) {\n super();\n }\n\n async execute(command: RegenerateUserInviteCommand): Promise<InviteUserResponseDto> {\n return await this.userAccounts.regenerateInvite(command.userId, command.requestOrigin);\n }\n}\n","import type { UserAccountDto, UserAccountStatus } from \"../contracts/userDirectoryContracts.types\";\n\nimport { Command } from \"../bus/Command\";\n\nexport class UpdateUserAccountStatusCommand extends Command<UserAccountDto> {\n constructor(\n public readonly userId: string,\n public readonly status: UserAccountStatus,\n ) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { UserAccountDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { UserAccountService } from \"../../domain/users/UserAccountServiceRegistry\";\nimport { UpdateUserAccountStatusCommand } from \"./UpdateUserAccountStatusCommand\";\n\n@HandlesCommand.forCommand(UpdateUserAccountStatusCommand)\nexport class UpdateUserAccountStatusCommandHandler extends CommandHandler<\n UpdateUserAccountStatusCommand,\n UserAccountDto\n> {\n constructor(@inject(UserAccountService) private readonly userAccounts: UserAccountService) {\n super();\n }\n\n async execute(command: UpdateUserAccountStatusCommand): Promise<UserAccountDto> {\n return await this.userAccounts.updateAccountStatus(command.userId, command.status);\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { UpsertLocalBootstrapUserResultDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { CommandHandler } from \"../bus/CommandHandler\";\n\nimport { HandlesCommand } from \"../../infrastructure/di/HandlesCommandRegistry\";\n\nimport { UserAccountService } from \"../../domain/users/UserAccountServiceRegistry\";\nimport { UpsertLocalBootstrapUserCommand } from \"./UpsertLocalBootstrapUserCommand\";\n\n@HandlesCommand.forCommand(UpsertLocalBootstrapUserCommand)\nexport class UpsertLocalBootstrapUserCommandHandler extends CommandHandler<\n UpsertLocalBootstrapUserCommand,\n UpsertLocalBootstrapUserResultDto\n> {\n constructor(@inject(UserAccountService) private readonly userAccounts: UserAccountService) {\n super();\n }\n\n async execute(command: UpsertLocalBootstrapUserCommand): Promise<UpsertLocalBootstrapUserResultDto> {\n return await this.userAccounts.upsertBootstrapLocalUser(command.email, command.password);\n }\n}\n","import type { CredentialInstanceDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { Query } from \"../bus/Query\";\n\nexport class GetCredentialInstanceQuery extends Query<CredentialInstanceDto | undefined> {\n constructor(public readonly instanceId: string) {\n super();\n }\n}\n","import type { Query } from \"./Query\";\n\nexport abstract class QueryHandler<TQuery extends Query<TResult>, TResult> {\n abstract execute(query: TQuery): Promise<TResult>;\n}\n","import { injectable, registry } from \"@codemation/core\";\nimport type { Query } from \"../../application/bus/Query\";\nimport type { QueryHandler } from \"../../application/bus/QueryHandler\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\n\ntype AbstractType<TInstance> = abstract new (...args: any[]) => TInstance;\ntype ConcreteType<TInstance> = new (...args: any[]) => TInstance;\n\nexport const queryHandlerMetadataKey = Symbol.for(\"codemation.infrastructure.di.QueryHandler\");\n\nexport class HandlesQuery {\n static for<TQuery extends Query<TResult>, TResult>(queryType: AbstractType<TQuery>): ClassDecorator {\n return (target) => {\n Reflect.defineMetadata(queryHandlerMetadataKey, queryType, target);\n injectable()(target as never);\n registry([\n {\n token: ApplicationTokens.QueryHandler,\n useClass: target as unknown as ConcreteType<QueryHandler<Query<unknown>, unknown>>,\n },\n ])(target as never);\n };\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { CredentialInstanceDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { QueryHandler } from \"../bus/QueryHandler\";\n\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\n\nimport { CredentialInstanceService } from \"../../domain/credentials/CredentialServices\";\nimport { GetCredentialInstanceQuery } from \"./GetCredentialInstanceQuery\";\n\n@HandlesQuery.for(GetCredentialInstanceQuery)\nexport class GetCredentialInstanceQueryHandler extends QueryHandler<\n GetCredentialInstanceQuery,\n CredentialInstanceDto | undefined\n> {\n constructor(\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n ) {\n super();\n }\n\n async execute(query: GetCredentialInstanceQuery): Promise<CredentialInstanceDto | undefined> {\n return await this.credentialInstanceService.getInstance(query.instanceId);\n }\n}\n","import type { CredentialInstanceWithSecretsDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { Query } from \"../bus/Query\";\n\nexport class GetCredentialInstanceWithSecretsQuery extends Query<CredentialInstanceWithSecretsDto | undefined> {\n constructor(public readonly instanceId: string) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { CredentialInstanceWithSecretsDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { QueryHandler } from \"../bus/QueryHandler\";\n\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\n\nimport { CredentialInstanceService } from \"../../domain/credentials/CredentialServices\";\nimport { GetCredentialInstanceWithSecretsQuery } from \"./GetCredentialInstanceWithSecretsQuery\";\n\n@HandlesQuery.for(GetCredentialInstanceWithSecretsQuery)\nexport class GetCredentialInstanceWithSecretsQueryHandler extends QueryHandler<\n GetCredentialInstanceWithSecretsQuery,\n CredentialInstanceWithSecretsDto | undefined\n> {\n constructor(\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n ) {\n super();\n }\n\n async execute(query: GetCredentialInstanceWithSecretsQuery): Promise<CredentialInstanceWithSecretsDto | undefined> {\n return await this.credentialInstanceService.getInstanceWithSecrets(query.instanceId);\n }\n}\n","import type { WorkflowCredentialHealthDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { Query } from \"../bus/Query\";\n\nexport class GetWorkflowCredentialHealthQuery extends Query<WorkflowCredentialHealthDto> {\n constructor(public readonly workflowId: string) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { WorkflowCredentialHealthDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { QueryHandler } from \"../bus/QueryHandler\";\n\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\n\nimport { CredentialBindingService } from \"../../domain/credentials/CredentialServices\";\nimport { GetWorkflowCredentialHealthQuery } from \"./GetWorkflowCredentialHealthQuery\";\n\n@HandlesQuery.for(GetWorkflowCredentialHealthQuery)\nexport class GetWorkflowCredentialHealthQueryHandler extends QueryHandler<\n GetWorkflowCredentialHealthQuery,\n WorkflowCredentialHealthDto\n> {\n constructor(\n @inject(CredentialBindingService)\n private readonly credentialBindingService: CredentialBindingService,\n ) {\n super();\n }\n\n async execute(query: GetWorkflowCredentialHealthQuery): Promise<WorkflowCredentialHealthDto> {\n return await this.credentialBindingService.listWorkflowHealth(query.workflowId);\n }\n}\n","import type { CredentialInstanceDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { Query } from \"../bus/Query\";\n\nexport class ListCredentialInstancesQuery extends Query<ReadonlyArray<CredentialInstanceDto>> {}\n","import { inject } from \"@codemation/core\";\n\nimport type { CredentialInstanceDto } from \"../contracts/CredentialContractsRegistry\";\n\nimport { QueryHandler } from \"../bus/QueryHandler\";\n\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\n\nimport { CredentialInstanceService } from \"../../domain/credentials/CredentialServices\";\nimport { ListCredentialInstancesQuery } from \"./ListCredentialInstancesQuery\";\n\n@HandlesQuery.for(ListCredentialInstancesQuery)\nexport class ListCredentialInstancesQueryHandler extends QueryHandler<\n ListCredentialInstancesQuery,\n ReadonlyArray<CredentialInstanceDto>\n> {\n constructor(\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n ) {\n super();\n }\n\n async execute(): Promise<ReadonlyArray<CredentialInstanceDto>> {\n return await this.credentialInstanceService.listInstances();\n }\n}\n","import type { CredentialTypeDefinition } from \"@codemation/core\";\n\nimport { Query } from \"../bus/Query\";\n\nexport class ListCredentialTypesQuery extends Query<ReadonlyArray<CredentialTypeDefinition>> {}\n","import type { CredentialTypeDefinition } from \"@codemation/core\";\n\nimport { inject } from \"@codemation/core\";\n\nimport { QueryHandler } from \"../bus/QueryHandler\";\n\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\n\nimport { CredentialTypeRegistryImpl } from \"../../domain/credentials/CredentialTypeRegistryImpl\";\n\nimport { ListCredentialTypesQuery } from \"./ListCredentialTypesQuery\";\n\n@HandlesQuery.for(ListCredentialTypesQuery)\nexport class ListCredentialTypesQueryHandler extends QueryHandler<\n ListCredentialTypesQuery,\n ReadonlyArray<CredentialTypeDefinition>\n> {\n constructor(\n @inject(CredentialTypeRegistryImpl)\n private readonly credentialTypeRegistry: CredentialTypeRegistryImpl,\n ) {\n super();\n }\n\n async execute(): Promise<ReadonlyArray<CredentialTypeDefinition>> {\n return this.credentialTypeRegistry.listTypes();\n }\n}\n","import { Query } from \"../bus/Query\";\n\nexport type CredentialFieldEnvStatusDto = Readonly<Record<string, boolean>>;\n\nexport class GetCredentialFieldEnvStatusQuery extends Query<CredentialFieldEnvStatusDto> {}\n","import type { CredentialFieldSchema } from \"@codemation/core\";\nimport { inject } from \"@codemation/core\";\n\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { AppConfig } from \"../../presentation/config/AppConfig\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { CredentialTypeRegistryImpl } from \"../../domain/credentials/CredentialServices\";\n\nimport { GetCredentialFieldEnvStatusQuery, type CredentialFieldEnvStatusDto } from \"./GetCredentialFieldEnvStatusQuery\";\n\n@HandlesQuery.for(GetCredentialFieldEnvStatusQuery)\nexport class GetCredentialFieldEnvStatusQueryHandler extends QueryHandler<\n GetCredentialFieldEnvStatusQuery,\n CredentialFieldEnvStatusDto\n> {\n constructor(\n @inject(CredentialTypeRegistryImpl)\n private readonly credentialTypeRegistry: CredentialTypeRegistryImpl,\n @inject(ApplicationTokens.AppConfig)\n private readonly appConfig: AppConfig,\n ) {\n super();\n }\n\n async execute(): Promise<CredentialFieldEnvStatusDto> {\n const names = new Set<string>();\n for (const type of this.credentialTypeRegistry.listTypes()) {\n for (const n of this.collectEnvVarNames(type.publicFields)) {\n names.add(n);\n }\n for (const n of this.collectEnvVarNames(type.secretFields)) {\n names.add(n);\n }\n }\n const out: Record<string, boolean> = {};\n for (const name of names) {\n const v = this.appConfig.env[name];\n out[name] = typeof v === \"string\" && v.length > 0;\n }\n return Object.freeze(out);\n }\n\n private collectEnvVarNames(fields: ReadonlyArray<CredentialFieldSchema> | undefined): ReadonlyArray<string> {\n if (!fields) {\n return [];\n }\n return fields\n .map((f) => f.envVarName)\n .filter((name): name is string => typeof name === \"string\" && name.trim().length > 0);\n }\n}\n","import type { BinaryAttachment, Items, PersistedRunState, RunCurrentState } from \"@codemation/core\";\nimport { inject, injectable } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../../domain/workflows/WorkflowDebuggerOverlayRepository\";\n\n@injectable()\nexport class RunBinaryAttachmentLookupService {\n constructor(\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n @inject(ApplicationTokens.WorkflowDebuggerOverlayRepository)\n private readonly workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository,\n ) {}\n\n async findForRun(runId: string, binaryId: string): Promise<BinaryAttachment | undefined> {\n const state = await this.workflowRunRepository.load(runId);\n if (!state) {\n return undefined;\n }\n return this.findInRunState(state, binaryId);\n }\n\n async findForWorkflowOverlay(workflowId: string, binaryId: string): Promise<BinaryAttachment | undefined> {\n const state = await this.workflowDebuggerOverlayRepository.load(workflowId);\n if (!state) {\n return undefined;\n }\n return this.findInCurrentState(state.currentState, binaryId);\n }\n\n private findInRunState(state: PersistedRunState, binaryId: string): BinaryAttachment | undefined {\n const inOutputs = this.findInOutputsByNode(state.outputsByNode, binaryId);\n if (inOutputs) {\n return inOutputs;\n }\n const inSnapshots = this.findInNodeSnapshots(state, binaryId);\n if (inSnapshots) {\n return inSnapshots;\n }\n return this.findInMutableState(state.mutableState, binaryId);\n }\n\n private findInCurrentState(state: RunCurrentState, binaryId: string): BinaryAttachment | undefined {\n const inOutputs = this.findInOutputsByNode(state.outputsByNode, binaryId);\n if (inOutputs) {\n return inOutputs;\n }\n const inSnapshots = this.findInCurrentStateSnapshots(state, binaryId);\n if (inSnapshots) {\n return inSnapshots;\n }\n return this.findInMutableState(state.mutableState, binaryId);\n }\n\n private findInOutputsByNode(\n outputsByNode: Readonly<Record<string, Readonly<Partial<Record<string, Items>>>>>,\n binaryId: string,\n ): BinaryAttachment | undefined {\n for (const outputs of Object.values(outputsByNode)) {\n for (const items of Object.values(outputs)) {\n const attachment = this.findInItems(items, binaryId);\n if (attachment) {\n return attachment;\n }\n }\n }\n return undefined;\n }\n\n private findInNodeSnapshots(state: PersistedRunState, binaryId: string): BinaryAttachment | undefined {\n for (const snapshot of Object.values(state.nodeSnapshotsByNodeId)) {\n const inInputs = this.findInPortItemMap(snapshot.inputsByPort, binaryId);\n if (inInputs) {\n return inInputs;\n }\n const inOutputs = this.findInPortItemMap(snapshot.outputs, binaryId);\n if (inOutputs) {\n return inOutputs;\n }\n }\n return undefined;\n }\n\n private findInCurrentStateSnapshots(state: RunCurrentState, binaryId: string): BinaryAttachment | undefined {\n for (const snapshot of Object.values(state.nodeSnapshotsByNodeId)) {\n const inInputs = this.findInPortItemMap(snapshot.inputsByPort, binaryId);\n if (inInputs) {\n return inInputs;\n }\n const inOutputs = this.findInPortItemMap(snapshot.outputs, binaryId);\n if (inOutputs) {\n return inOutputs;\n }\n }\n return undefined;\n }\n\n private findInMutableState(\n mutableState: PersistedRunState[\"mutableState\"] | RunCurrentState[\"mutableState\"] | undefined,\n binaryId: string,\n ): BinaryAttachment | undefined {\n for (const nodeState of Object.values(mutableState?.nodesById ?? {})) {\n const inPinned = this.findInPortItemMap(nodeState.pinnedOutputsByPort, binaryId);\n if (inPinned) {\n return inPinned;\n }\n const inDebugInput = this.findInItems(nodeState.lastDebugInput, binaryId);\n if (inDebugInput) {\n return inDebugInput;\n }\n }\n return undefined;\n }\n\n private findInPortItemMap(\n itemMap: Readonly<Partial<Record<string, Items>>> | undefined,\n binaryId: string,\n ): BinaryAttachment | undefined {\n for (const items of Object.values(itemMap ?? {})) {\n const attachment = this.findInItems(items, binaryId);\n if (attachment) {\n return attachment;\n }\n }\n return undefined;\n }\n\n private findInItems(items: Items | undefined, binaryId: string): BinaryAttachment | undefined {\n for (const item of items ?? []) {\n for (const attachment of Object.values(item.binary ?? {})) {\n if (attachment.id === binaryId) {\n return attachment;\n }\n }\n }\n return undefined;\n }\n}\n","import type { BinaryAttachment } from \"@codemation/core\";\nimport { Query } from \"../bus/Query\";\n\nexport class GetRunBinaryAttachmentQuery extends Query<BinaryAttachment | undefined> {\n constructor(\n public readonly runId: string,\n public readonly binaryId: string,\n ) {\n super();\n }\n}\n","import type { BinaryAttachment } from \"@codemation/core\";\nimport { inject } from \"@codemation/core\";\nimport { RunBinaryAttachmentLookupService } from \"../binary/RunBinaryAttachmentLookupService\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { GetRunBinaryAttachmentQuery } from \"./GetRunBinaryAttachmentQuery\";\n\n@HandlesQuery.for(GetRunBinaryAttachmentQuery)\nexport class GetRunBinaryAttachmentQueryHandler extends QueryHandler<\n GetRunBinaryAttachmentQuery,\n BinaryAttachment | undefined\n> {\n constructor(\n @inject(RunBinaryAttachmentLookupService)\n private readonly lookupService: RunBinaryAttachmentLookupService,\n ) {\n super();\n }\n\n async execute(query: GetRunBinaryAttachmentQuery): Promise<BinaryAttachment | undefined> {\n return this.lookupService.findForRun(query.runId, query.binaryId);\n }\n}\n","import type { PersistedRunState } from \"@codemation/core\";\nimport { Query } from \"../bus/Query\";\n\nexport class GetRunStateQuery extends Query<PersistedRunState | undefined> {\n constructor(public readonly runId: string) {\n super();\n }\n}\n","import type { PersistedRunState } from \"@codemation/core\";\nimport { inject } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { GetRunStateQuery } from \"./GetRunStateQuery\";\n\n@HandlesQuery.for(GetRunStateQuery)\nexport class GetRunStateQueryHandler extends QueryHandler<GetRunStateQuery, PersistedRunState | undefined> {\n constructor(\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n ) {\n super();\n }\n\n async execute(query: GetRunStateQuery): Promise<PersistedRunState | undefined> {\n return await this.workflowRunRepository.load(query.runId);\n }\n}\n","import type { WorkflowDebuggerOverlayState } from \"../../domain/workflows/WorkflowDebuggerOverlayState\";\nimport { Query } from \"../bus/Query\";\n\nexport class GetWorkflowDebuggerOverlayQuery extends Query<WorkflowDebuggerOverlayState> {\n constructor(public readonly workflowId: string) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { WorkflowDebuggerOverlayState } from \"../../domain/workflows/WorkflowDebuggerOverlayState\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { WorkflowDebuggerOverlayStateFactory } from \"../workflows/WorkflowDebuggerOverlayStateFactory\";\nimport { GetWorkflowDebuggerOverlayQuery } from \"./GetWorkflowDebuggerOverlayQuery\";\n\n@HandlesQuery.for(GetWorkflowDebuggerOverlayQuery)\nexport class GetWorkflowDebuggerOverlayQueryHandler extends QueryHandler<\n GetWorkflowDebuggerOverlayQuery,\n WorkflowDebuggerOverlayState\n> {\n constructor(\n @inject(ApplicationTokens.WorkflowDebuggerOverlayRepository)\n private readonly workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository,\n ) {\n super();\n }\n\n async execute(query: GetWorkflowDebuggerOverlayQuery): Promise<WorkflowDebuggerOverlayState> {\n return (\n (await this.workflowDebuggerOverlayRepository.load(query.workflowId)) ??\n WorkflowDebuggerOverlayStateFactory.createEmpty(query.workflowId)\n );\n }\n}\n","import type { WorkflowDefinition } from \"@codemation/core\";\nimport { Query } from \"../bus/Query\";\n\nexport class GetWorkflowDetailQuery extends Query<WorkflowDefinition | undefined> {\n constructor(public readonly workflowId: string) {\n super();\n }\n}\n","import type { WorkflowDefinition } from \"@codemation/core\";\nimport { inject } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowDefinitionRepository } from \"../../domain/workflows/WorkflowDefinitionRepository\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { GetWorkflowDetailQuery } from \"./GetWorkflowDetailQuery\";\n\n@HandlesQuery.for(GetWorkflowDetailQuery)\nexport class GetWorkflowDetailQueryHandler extends QueryHandler<\n GetWorkflowDetailQuery,\n WorkflowDefinition | undefined\n> {\n constructor(\n @inject(ApplicationTokens.WorkflowDefinitionRepository)\n private readonly workflowDefinitionRepository: WorkflowDefinitionRepository,\n ) {\n super();\n }\n\n async execute(query: GetWorkflowDetailQuery): Promise<WorkflowDefinition | undefined> {\n return await this.workflowDefinitionRepository.getDefinition(query.workflowId);\n }\n}\n","import type { BinaryAttachment } from \"@codemation/core\";\nimport { Query } from \"../bus/Query\";\n\nexport class GetWorkflowOverlayBinaryAttachmentQuery extends Query<BinaryAttachment | undefined> {\n constructor(\n public readonly workflowId: string,\n public readonly binaryId: string,\n ) {\n super();\n }\n}\n","import type { BinaryAttachment } from \"@codemation/core\";\nimport { inject } from \"@codemation/core\";\nimport { RunBinaryAttachmentLookupService } from \"../binary/RunBinaryAttachmentLookupService\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { GetWorkflowOverlayBinaryAttachmentQuery } from \"./GetWorkflowOverlayBinaryAttachmentQuery\";\n\n@HandlesQuery.for(GetWorkflowOverlayBinaryAttachmentQuery)\nexport class GetWorkflowOverlayBinaryAttachmentQueryHandler extends QueryHandler<\n GetWorkflowOverlayBinaryAttachmentQuery,\n BinaryAttachment | undefined\n> {\n constructor(\n @inject(RunBinaryAttachmentLookupService)\n private readonly lookupService: RunBinaryAttachmentLookupService,\n ) {\n super();\n }\n\n async execute(query: GetWorkflowOverlayBinaryAttachmentQuery): Promise<BinaryAttachment | undefined> {\n return this.lookupService.findForWorkflowOverlay(query.workflowId, query.binaryId);\n }\n}\n","import type { WorkflowDefinition } from \"@codemation/core\";\nimport { Query } from \"../bus/Query\";\n\nexport class GetWorkflowSummariesQuery extends Query<ReadonlyArray<WorkflowDefinition>> {}\n","import type { WorkflowDefinition, WorkflowRepository } from \"@codemation/core\";\nimport { CoreTokens, inject } from \"@codemation/core\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { GetWorkflowSummariesQuery } from \"./GetWorkflowSummariesQuery\";\n\n@HandlesQuery.for(GetWorkflowSummariesQuery)\nexport class GetWorkflowSummariesQueryHandler extends QueryHandler<\n GetWorkflowSummariesQuery,\n ReadonlyArray<WorkflowDefinition>\n> {\n constructor(\n @inject(CoreTokens.WorkflowRepository)\n private readonly workflowRepository: WorkflowRepository,\n ) {\n super();\n }\n\n async execute(query: GetWorkflowSummariesQuery): Promise<ReadonlyArray<WorkflowDefinition>> {\n void query;\n return [...this.workflowRepository.list()];\n }\n}\n","import type { RunSummary } from \"@codemation/core\";\nimport { Query } from \"../bus/Query\";\n\nexport class ListWorkflowRunsQuery extends Query<ReadonlyArray<RunSummary>> {\n constructor(public readonly workflowId: string) {\n super();\n }\n}\n","import type { RunSummary } from \"@codemation/core\";\nimport { inject } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\nimport { QueryHandler } from \"../bus/QueryHandler\";\nimport { ListWorkflowRunsQuery } from \"./ListWorkflowRunsQuery\";\n\n@HandlesQuery.for(ListWorkflowRunsQuery)\nexport class ListWorkflowRunsQueryHandler extends QueryHandler<ListWorkflowRunsQuery, ReadonlyArray<RunSummary>> {\n constructor(\n @inject(ApplicationTokens.WorkflowRunRepository)\n private readonly workflowRunRepository: WorkflowRunRepository,\n ) {\n super();\n }\n\n async execute(query: ListWorkflowRunsQuery): Promise<ReadonlyArray<RunSummary>> {\n return await this.workflowRunRepository.listRuns({ workflowId: query.workflowId, limit: 50 });\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { UserAccountDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { QueryHandler } from \"../bus/QueryHandler\";\n\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\n\nimport { UserAccountService } from \"../../domain/users/UserAccountServiceRegistry\";\n\nimport { ListUserAccountsQuery } from \"./ListUserAccountsQuery\";\n\n@HandlesQuery.for(ListUserAccountsQuery)\nexport class ListUserAccountsQueryHandler extends QueryHandler<ListUserAccountsQuery, ReadonlyArray<UserAccountDto>> {\n constructor(@inject(UserAccountService) private readonly userAccounts: UserAccountService) {\n super();\n }\n\n async execute(_query: ListUserAccountsQuery): Promise<ReadonlyArray<UserAccountDto>> {\n return await this.userAccounts.listUsers();\n }\n}\n","import type { VerifyUserInviteResponseDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { Query } from \"../bus/Query\";\n\nexport class VerifyUserInviteQuery extends Query<VerifyUserInviteResponseDto> {\n constructor(public readonly token: string) {\n super();\n }\n}\n","import { inject } from \"@codemation/core\";\n\nimport type { VerifyUserInviteResponseDto } from \"../contracts/userDirectoryContracts.types\";\n\nimport { QueryHandler } from \"../bus/QueryHandler\";\n\nimport { HandlesQuery } from \"../../infrastructure/di/HandlesQueryRegistry\";\n\nimport { UserAccountService } from \"../../domain/users/UserAccountServiceRegistry\";\nimport { VerifyUserInviteQuery } from \"./VerifyUserInviteQuery\";\n\n@HandlesQuery.for(VerifyUserInviteQuery)\nexport class VerifyUserInviteQueryHandler extends QueryHandler<VerifyUserInviteQuery, VerifyUserInviteResponseDto> {\n constructor(@inject(UserAccountService) private readonly userAccounts: UserAccountService) {\n super();\n }\n\n async execute(query: VerifyUserInviteQuery): Promise<VerifyUserInviteResponseDto> {\n return await this.userAccounts.verifyInviteToken(query.token);\n }\n}\n","import { ApplicationRequestError } from \"../../application/ApplicationRequestError\";\n\nexport class ServerHttpErrorResponseFactory {\n static fromUnknown(error: unknown): Response {\n if (error instanceof ApplicationRequestError) {\n return Response.json(error.payload, { status: error.status });\n }\n this.logUnexpectedError(error);\n const message = error instanceof Error ? error.message : String(error);\n return Response.json({ error: message }, { status: 500 });\n }\n\n private static logUnexpectedError(error: unknown): void {\n if (error instanceof Error) {\n const stack = error.stack ?? `${error.name}: ${error.message}`;\n const causeText = this.formatCause(error);\n console.error(`[codemation-http] unhandled route error\\n${stack}${causeText}`);\n return;\n }\n console.error(`[codemation-http] unhandled route error\\n${String(error)}`);\n }\n\n private static formatCause(error: Error): string {\n if (!(error instanceof Error) || !(\"cause\" in error) || !error.cause) {\n return \"\";\n }\n const cause = error.cause;\n if (cause instanceof Error) {\n return `\\nCaused by:\\n${cause.stack ?? `${cause.name}: ${cause.message}`}`;\n }\n return `\\nCaused by:\\n${String(cause)}`;\n }\n}\n","import type { BinaryAttachment, BinaryBody, BinaryStorage } from \"@codemation/core\";\nimport { CoreTokens, inject, injectable } from \"@codemation/core\";\nimport type { CommandBus } from \"../../../application/bus/CommandBus\";\nimport type { QueryBus } from \"../../../application/bus/QueryBus\";\nimport { UploadOverlayPinnedBinaryCommand } from \"../../../application/commands/UploadOverlayPinnedBinaryCommand\";\nimport { GetRunBinaryAttachmentQuery } from \"../../../application/queries/GetRunBinaryAttachmentQuery\";\nimport { GetWorkflowOverlayBinaryAttachmentQuery } from \"../../../application/queries/GetWorkflowOverlayBinaryAttachmentQuery\";\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\nimport type { ServerHttpRouteParams } from \"../ServerHttpRouteParams\";\n\n@injectable()\nexport class BinaryHttpRouteHandler {\n constructor(\n @inject(ApplicationTokens.QueryBus)\n private readonly queryBus: QueryBus,\n @inject(ApplicationTokens.CommandBus)\n private readonly commandBus: CommandBus,\n @inject(CoreTokens.BinaryStorage)\n private readonly binaryStorage: BinaryStorage,\n ) {}\n\n async getRunBinaryContent(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const attachment = await this.queryBus.execute(new GetRunBinaryAttachmentQuery(params.runId!, params.binaryId!));\n return await this.createBinaryResponse(attachment);\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getWorkflowOverlayBinaryContent(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const attachment = await this.queryBus.execute(\n new GetWorkflowOverlayBinaryAttachmentQuery(params.workflowId!, params.binaryId!),\n );\n return await this.createBinaryResponse(attachment);\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postWorkflowDebuggerOverlayBinaryUpload(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const workflowId = params.workflowId!;\n const form = await request.formData();\n const fileEntry = form.get(\"file\");\n const nodeId = String(form.get(\"nodeId\") ?? \"\").trim();\n const attachmentName = String(form.get(\"attachmentName\") ?? \"file\").trim() || \"file\";\n const itemIndexRaw = form.get(\"itemIndex\");\n const itemIndex = typeof itemIndexRaw === \"string\" ? Number.parseInt(itemIndexRaw, 10) : Number(itemIndexRaw);\n if (!nodeId) {\n return Response.json({ error: \"nodeId is required\" }, { status: 400 });\n }\n if (!Number.isFinite(itemIndex) || itemIndex < 0) {\n return Response.json({ error: \"itemIndex must be a non-negative integer\" }, { status: 400 });\n }\n if (!(fileEntry instanceof Blob) || fileEntry.size === 0) {\n return Response.json({ error: \"file is required\" }, { status: 400 });\n }\n const mimeType = fileEntry.type && fileEntry.type.trim() ? fileEntry.type : \"application/octet-stream\";\n const filename = fileEntry instanceof File ? fileEntry.name : undefined;\n /** `Blob#stream()` is a web `ReadableStream`; core `BinaryBody` uses the same stream type under Node’s typings. */\n const body = fileEntry.stream() as BinaryBody;\n const attachment = await this.commandBus.execute(\n new UploadOverlayPinnedBinaryCommand(workflowId, nodeId, itemIndex, attachmentName, mimeType, body, filename),\n );\n return Response.json({ attachment }, { status: 201 });\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n private async createBinaryResponse(attachment: BinaryAttachment | undefined): Promise<Response> {\n if (!attachment) {\n return Response.json({ error: \"Unknown binary attachment\" }, { status: 404 });\n }\n const stored = await this.binaryStorage.openReadStream(attachment.storageKey);\n if (!stored) {\n return Response.json({ error: \"Binary attachment content is unavailable\" }, { status: 404 });\n }\n const headers = new Headers();\n headers.set(\"content-type\", attachment.mimeType);\n headers.set(\"content-length\", String(stored.size ?? attachment.size));\n headers.set(\"content-disposition\", this.createContentDisposition(attachment));\n return new Response(stored.body as unknown as BodyInit, {\n status: 200,\n headers,\n });\n }\n\n private createContentDisposition(attachment: BinaryAttachment): string {\n const dispositionType = attachment.previewKind === \"download\" ? \"attachment\" : \"inline\";\n const filename = this.escapeFilename(attachment.filename ?? `${attachment.id}`);\n return `${dispositionType}; filename=\"${filename}\"`;\n }\n\n private escapeFilename(value: string): string {\n return value.replace(/\"/g, \"\");\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { BinaryHttpRouteHandler } from \"../../routeHandlers/BinaryHttpRouteHandlerFactory\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n/** Run-scoped binary content. Workflow overlay binary GET/POST are registered on {@link CodemationHonoApiApp} after route registrars. */\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: BinaryHonoApiRouteRegistrar }])\nexport class BinaryHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(@inject(BinaryHttpRouteHandler) private readonly handler: BinaryHttpRouteHandler) {}\n\n register(app: Hono): void {\n app.get(\"/runs/:runId/binary/:binaryId/content\", (c) =>\n this.handler.getRunBinaryContent(c.req.raw, {\n runId: c.req.param(\"runId\"),\n binaryId: c.req.param(\"binaryId\"),\n }),\n );\n }\n}\n","import { ApplicationRequestError } from \"../../application/ApplicationRequestError\";\n\nexport class HttpRequestJsonBodyReader {\n static async readJsonBody<TBody>(request: Request): Promise<TBody> {\n try {\n return (await request.json()) as TBody;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new ApplicationRequestError(400, `Invalid JSON body: ${message}`);\n }\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { HttpRequestJsonBodyReader } from \"../HttpRequestJsonBodyReader\";\nimport type { CommandBus } from \"../../../application/bus/CommandBus\";\nimport type { QueryBus } from \"../../../application/bus/QueryBus\";\nimport {\n CreateCredentialInstanceCommand,\n DeleteCredentialInstanceCommand,\n TestCredentialInstanceCommand,\n UpdateCredentialInstanceCommand,\n UpsertCredentialBindingCommand,\n} from \"../../../application/commands/CredentialCommandHandlers\";\nimport type {\n CreateCredentialInstanceRequest,\n UpdateCredentialInstanceRequest,\n UpsertCredentialBindingRequest,\n} from \"../../../application/contracts/CredentialContractsRegistry\";\nimport {\n GetCredentialFieldEnvStatusQuery,\n GetCredentialInstanceQuery,\n GetCredentialInstanceWithSecretsQuery,\n GetWorkflowCredentialHealthQuery,\n ListCredentialInstancesQuery,\n ListCredentialTypesQuery,\n} from \"../../../application/queries/CredentialQueryHandlers\";\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\nimport type { ServerHttpRouteParams } from \"../ServerHttpRouteParams\";\n\n@injectable()\nexport class CredentialHttpRouteHandler {\n constructor(\n @inject(ApplicationTokens.QueryBus)\n private readonly queryBus: QueryBus,\n @inject(ApplicationTokens.CommandBus)\n private readonly commandBus: CommandBus,\n ) {}\n\n async getCredentialTypes(): Promise<Response> {\n try {\n return Response.json(await this.queryBus.execute(new ListCredentialTypesQuery()));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getCredentialFieldEnvStatus(): Promise<Response> {\n try {\n return Response.json(await this.queryBus.execute(new GetCredentialFieldEnvStatusQuery()));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getCredentialInstances(): Promise<Response> {\n try {\n return Response.json(await this.queryBus.execute(new ListCredentialInstancesQuery()));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getCredentialInstance(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const withSecrets = new URL(request.url).searchParams.get(\"withSecrets\") === \"1\";\n const instance = withSecrets\n ? await this.queryBus.execute(new GetCredentialInstanceWithSecretsQuery(params.instanceId!))\n : await this.queryBus.execute(new GetCredentialInstanceQuery(params.instanceId!));\n if (!instance) {\n return Response.json({ error: \"Unknown credential instance\" }, { status: 404 });\n }\n return Response.json(instance);\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postCredentialInstance(request: Request): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<CreateCredentialInstanceRequest>(request);\n return Response.json(await this.commandBus.execute(new CreateCredentialInstanceCommand(body)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async putCredentialInstance(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<UpdateCredentialInstanceRequest>(request);\n return Response.json(\n await this.commandBus.execute(new UpdateCredentialInstanceCommand(params.instanceId!, body)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async deleteCredentialInstance(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n return Response.json(await this.commandBus.execute(new DeleteCredentialInstanceCommand(params.instanceId!)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async putCredentialBinding(request: Request): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<UpsertCredentialBindingRequest>(request);\n return Response.json(await this.commandBus.execute(new UpsertCredentialBindingCommand(body)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postCredentialInstanceTest(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n return Response.json(await this.commandBus.execute(new TestCredentialInstanceCommand(params.instanceId!)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getWorkflowCredentialHealth(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n return Response.json(await this.queryBus.execute(new GetWorkflowCredentialHealthQuery(params.workflowId!)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { CredentialHttpRouteHandler } from \"../../routeHandlers/CredentialHttpRouteHandler\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: CredentialHonoApiRouteRegistrar }])\nexport class CredentialHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(@inject(CredentialHttpRouteHandler) private readonly handler: CredentialHttpRouteHandler) {}\n\n register(app: Hono): void {\n app.get(\"/credentials/types\", (_c) => this.handler.getCredentialTypes());\n app.get(\"/credentials/env-status\", (_c) => this.handler.getCredentialFieldEnvStatus());\n app.get(\"/credentials/instances\", (_c) => this.handler.getCredentialInstances());\n app.get(\"/workflows/:workflowId/credential-health\", (c) =>\n this.handler.getWorkflowCredentialHealth(c.req.raw, { workflowId: c.req.param(\"workflowId\") }),\n );\n app.get(\"/credentials/instances/:instanceId\", (c) =>\n this.handler.getCredentialInstance(c.req.raw, { instanceId: c.req.param(\"instanceId\") }),\n );\n app.post(\"/credentials/instances\", (c) => this.handler.postCredentialInstance(c.req.raw));\n app.put(\"/credentials/instances/:instanceId\", (c) =>\n this.handler.putCredentialInstance(c.req.raw, { instanceId: c.req.param(\"instanceId\") }),\n );\n app.delete(\"/credentials/instances/:instanceId\", (c) =>\n this.handler.deleteCredentialInstance(c.req.raw, { instanceId: c.req.param(\"instanceId\") }),\n );\n app.put(\"/credential-bindings\", (c) => this.handler.putCredentialBinding(c.req.raw));\n app.post(\"/credentials/instances/:instanceId/test\", (c) =>\n this.handler.postCredentialInstanceTest(c.req.raw, { instanceId: c.req.param(\"instanceId\") }),\n );\n }\n}\n","import { injectable } from \"@codemation/core\";\nimport type { BootRuntimeSummary } from \"./BootRuntimeSummary.types\";\n\n/**\n * Holds the latest {@link BootRuntimeSummary} after {@link CodemationApplication} prepare wiring.\n * Avoids injecting {@link CodemationApplication} into dev diagnostics (circular ESM graph with assembler).\n */\n@injectable()\nexport class BootRuntimeSnapshotHolder {\n private snapshot: BootRuntimeSummary | null = null;\n\n set(snapshot: BootRuntimeSummary | null): void {\n this.snapshot = snapshot;\n }\n\n get(): BootRuntimeSummary | null {\n return this.snapshot;\n }\n}\n","import { CoreTokens, inject, injectable } from \"@codemation/core\";\nimport type { WorkflowRepository } from \"@codemation/core\";\nimport { BootRuntimeSnapshotHolder } from \"./BootRuntimeSnapshotHolder\";\nimport { LogLevelPolicyFactory } from \"../../infrastructure/logging/LogLevelPolicyFactory\";\nimport { RuntimeWorkflowActivationPolicy } from \"../../infrastructure/persistence/RuntimeWorkflowActivationPolicy\";\nimport type { BootRuntimeSummary } from \"./BootRuntimeSummary.types\";\nimport type { DevBootstrapSummaryJson } from \"./DevBootstrapSummaryJson.types\";\n\n@injectable()\nexport class DevBootstrapSummaryAssembler {\n constructor(\n @inject(BootRuntimeSnapshotHolder) private readonly bootRuntimeSnapshot: BootRuntimeSnapshotHolder,\n @inject(LogLevelPolicyFactory) private readonly logLevelPolicyFactory: LogLevelPolicyFactory,\n @inject(RuntimeWorkflowActivationPolicy) private readonly workflowActivationPolicy: RuntimeWorkflowActivationPolicy,\n @inject(CoreTokens.WorkflowRepository) private readonly workflowRepository: WorkflowRepository,\n ) {}\n\n assemble(): DevBootstrapSummaryJson | null {\n const summary = this.bootRuntimeSnapshot.get();\n if (!summary) {\n return null;\n }\n const envRaw = process.env.CODEMATION_LOG_LEVEL?.trim();\n const min = this.logLevelPolicyFactory.create().resolveMin();\n const logLevel = envRaw && envRaw.length > 0 ? `${min} (CODEMATION_LOG_LEVEL=${envRaw})` : `${min}`;\n const workflows = [...this.workflowRepository.list()].sort((a, b) => a.name.localeCompare(b.name));\n const active = workflows\n .filter((w) => this.workflowActivationPolicy.isActive(w.id))\n .map((w) => ({ id: w.id, name: w.name }));\n return {\n logLevel,\n codemationLogLevelEnv: envRaw && envRaw.length > 0 ? envRaw : undefined,\n databaseLabel: this.formatDatabase(summary),\n schedulerLabel: this.formatScheduler(summary),\n eventBusLabel: this.formatEventBus(summary),\n redisUrlRedacted: this.formatRedis(summary),\n activeWorkflows: active,\n };\n }\n\n private formatDatabase(summary: BootRuntimeSummary): string {\n const p = summary.databasePersistence;\n if (p.kind === \"none\") {\n return \"in-memory (no Prisma persistence)\";\n }\n if (p.kind === \"pglite\") {\n return `PGlite — ${p.dataDir}`;\n }\n return `PostgreSQL — ${this.redactUrlForDisplay(p.databaseUrl)}`;\n }\n\n private formatScheduler(summary: BootRuntimeSummary): string {\n if (summary.schedulerKind === \"local\") {\n return \"inline (this process)\";\n }\n return `BullMQ — queue prefix \"${summary.queuePrefix}\"`;\n }\n\n private formatEventBus(summary: BootRuntimeSummary): string {\n if (summary.eventBusKind === \"memory\") {\n return \"in-memory\";\n }\n return \"Redis\";\n }\n\n private formatRedis(summary: BootRuntimeSummary): string | undefined {\n if (!summary.redisUrl || summary.redisUrl.trim().length === 0) {\n return undefined;\n }\n return this.redactUrlForDisplay(summary.redisUrl);\n }\n\n private redactUrlForDisplay(raw: string): string {\n try {\n const parsed = new URL(raw);\n if (parsed.password) {\n parsed.password = \"***\";\n }\n return parsed.toString();\n } catch {\n return \"(unparseable URL)\";\n }\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { DevBootstrapSummaryAssembler } from \"../../../application/dev/DevBootstrapSummaryAssembler\";\n\n@injectable()\nexport class DevBootstrapSummaryHttpRouteHandler {\n constructor(@inject(DevBootstrapSummaryAssembler) private readonly assembler: DevBootstrapSummaryAssembler) {}\n\n getSummary(): Response {\n const payload = this.assembler.assemble();\n if (!payload) {\n return new Response(JSON.stringify({ error: \"Runtime summary not ready\" }), {\n status: 503,\n headers: { \"content-type\": \"application/json\" },\n });\n }\n return new Response(JSON.stringify(payload), {\n status: 200,\n headers: { \"content-type\": \"application/json\" },\n });\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { DevBootstrapSummaryHttpRouteHandler } from \"../../routeHandlers/DevBootstrapSummaryHttpRouteHandler\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: DevHonoApiRouteRegistrar }])\nexport class DevHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(\n @inject(DevBootstrapSummaryHttpRouteHandler) private readonly handler: DevBootstrapSummaryHttpRouteHandler,\n ) {}\n\n register(app: Hono): void {\n app.get(\"/dev/bootstrap-summary\", () => this.handler.getSummary());\n }\n}\n","import type { CredentialOAuth2AuthDefinition, CredentialTypeDefinition } from \"@codemation/core\";\nimport { injectable } from \"@codemation/core\";\n\ntype JsonRecord = Readonly<Record<string, unknown>>;\n\nexport type OAuth2ResolvedProvider = Readonly<{\n providerId: string;\n authorizeUrl: string;\n tokenUrl: string;\n userInfoUrl?: string;\n}>;\n\n@injectable()\nexport class OAuth2ProviderRegistry {\n private static readonly googleProvider = Object.freeze({\n providerId: \"google\",\n authorizeUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n tokenUrl: \"https://oauth2.googleapis.com/token\",\n userInfoUrl: \"https://openidconnect.googleapis.com/v1/userinfo\",\n } satisfies OAuth2ResolvedProvider);\n\n resolve(definition: CredentialTypeDefinition, publicConfig: JsonRecord): OAuth2ResolvedProvider {\n const auth = definition.auth;\n if (auth?.kind !== \"oauth2\") {\n throw new Error(`Credential type ${definition.typeId} does not use OAuth2.`);\n }\n if (\"providerId\" in auth) {\n return this.resolveBuiltInProvider(auth);\n }\n return this.resolvePublicConfigProvider(auth, publicConfig, definition.typeId);\n }\n\n resolveClientId(auth: CredentialOAuth2AuthDefinition, publicConfig: JsonRecord): string {\n const clientIdFieldKey = auth.clientIdFieldKey ?? \"clientId\";\n const clientId = String(publicConfig[clientIdFieldKey] ?? \"\");\n if (!clientId) {\n throw new Error(`OAuth2 client id is missing from public field \"${clientIdFieldKey}\".`);\n }\n return clientId;\n }\n\n resolveClientSecretFieldKey(auth: CredentialOAuth2AuthDefinition): string {\n return auth.clientSecretFieldKey ?? \"clientSecret\";\n }\n\n private resolveBuiltInProvider(\n auth: Extract<CredentialOAuth2AuthDefinition, { providerId: string }>,\n ): OAuth2ResolvedProvider {\n if (auth.providerId === \"google\") {\n return OAuth2ProviderRegistry.googleProvider;\n }\n throw new Error(`Unsupported OAuth2 provider id: ${auth.providerId}`);\n }\n\n private resolvePublicConfigProvider(\n auth: Extract<CredentialOAuth2AuthDefinition, { providerFromPublicConfig: object }>,\n publicConfig: JsonRecord,\n typeId: string,\n ): OAuth2ResolvedProvider {\n const authorizeUrl = String(publicConfig[auth.providerFromPublicConfig.authorizeUrlFieldKey] ?? \"\");\n const tokenUrl = String(publicConfig[auth.providerFromPublicConfig.tokenUrlFieldKey] ?? \"\");\n const userInfoUrl = auth.providerFromPublicConfig.userInfoUrlFieldKey\n ? String(publicConfig[auth.providerFromPublicConfig.userInfoUrlFieldKey] ?? \"\")\n : \"\";\n if (!authorizeUrl || !tokenUrl) {\n throw new Error(`OAuth2 provider URLs are incomplete for credential type ${typeId}.`);\n }\n return {\n providerId: \"custom\",\n authorizeUrl,\n tokenUrl,\n userInfoUrl: userInfoUrl || undefined,\n };\n }\n}\n","import type { CredentialOAuth2AuthDefinition } from \"@codemation/core\";\nimport { inject, injectable } from \"@codemation/core\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ApplicationRequestError } from \"../../application/ApplicationRequestError\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { AppConfig } from \"../../presentation/config/AppConfig\";\nimport type { CredentialStore } from \"./CredentialServices\";\nimport {\n CredentialFieldEnvOverlayService,\n CredentialInstanceService,\n CredentialMaterialResolver,\n CredentialRuntimeMaterialService,\n CredentialSecretCipher,\n CredentialTypeRegistryImpl,\n} from \"./CredentialServices\";\nimport { OAuth2ProviderRegistry } from \"./OAuth2ProviderRegistry\";\n\ntype JsonRecord = Readonly<Record<string, unknown>>;\n\nexport type OAuth2AuthRedirectResult = Readonly<{\n instanceId: string;\n redirectUri: string;\n redirectUrl: string;\n}>;\n\nexport type OAuth2CallbackResult = Readonly<{\n instanceId: string;\n connectedEmail?: string;\n}>;\n\n@injectable()\nexport class OAuth2ConnectService {\n private static readonly stateTtlMs = 10 * 60 * 1_000;\n\n constructor(\n @inject(ApplicationTokens.CredentialStore)\n private readonly credentialStore: CredentialStore,\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n @inject(CredentialTypeRegistryImpl)\n private readonly credentialTypeRegistry: CredentialTypeRegistryImpl,\n @inject(CredentialRuntimeMaterialService)\n private readonly credentialRuntimeMaterialService: CredentialRuntimeMaterialService,\n @inject(CredentialFieldEnvOverlayService)\n private readonly credentialFieldEnvOverlayService: CredentialFieldEnvOverlayService,\n @inject(CredentialMaterialResolver)\n private readonly credentialMaterialResolver: CredentialMaterialResolver,\n @inject(CredentialSecretCipher)\n private readonly credentialSecretCipher: CredentialSecretCipher,\n @inject(OAuth2ProviderRegistry)\n private readonly oauth2ProviderRegistry: OAuth2ProviderRegistry,\n @inject(ApplicationTokens.AppConfig)\n private readonly appConfig: AppConfig,\n ) {}\n\n async createAuthRedirect(instanceId: string, requestOrigin: string): Promise<OAuth2AuthRedirectResult> {\n const instance = await this.credentialInstanceService.requireInstance(instanceId);\n const credentialType = this.requireOAuth2Type(instance.typeId);\n const emptyMaterial = await this.credentialMaterialResolver.resolveMaterial(instance);\n const { resolvedPublicConfig } = this.credentialFieldEnvOverlayService.apply({\n definition: credentialType.definition,\n publicConfig: instance.publicConfig,\n material: emptyMaterial,\n });\n const provider = this.oauth2ProviderRegistry.resolve(credentialType.definition, resolvedPublicConfig);\n const redirectUri = this.getRedirectUri(requestOrigin);\n const state = this.createOpaqueValue();\n const codeVerifier = this.createOpaqueValue();\n const codeChallenge = this.createPkceCodeChallenge(codeVerifier);\n const createdAt = new Date();\n const expiresAt = new Date(createdAt.getTime() + OAuth2ConnectService.stateTtlMs);\n await this.credentialStore.createOAuth2State({\n state,\n instanceId,\n codeVerifier,\n providerId: provider.providerId,\n requestedScopes: credentialType.definition.auth!.scopes,\n createdAt: createdAt.toISOString(),\n expiresAt: expiresAt.toISOString(),\n });\n const authorizeUrl = new URL(provider.authorizeUrl);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\n \"client_id\",\n this.oauth2ProviderRegistry.resolveClientId(credentialType.definition.auth!, resolvedPublicConfig),\n );\n authorizeUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authorizeUrl.searchParams.set(\"scope\", credentialType.definition.auth!.scopes.join(\" \"));\n authorizeUrl.searchParams.set(\"state\", state);\n authorizeUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n if (provider.providerId === \"google\") {\n authorizeUrl.searchParams.set(\"access_type\", \"offline\");\n authorizeUrl.searchParams.set(\"prompt\", \"consent\");\n }\n return {\n instanceId,\n redirectUri,\n redirectUrl: authorizeUrl.toString(),\n };\n }\n\n async handleCallback(\n args: Readonly<{\n code?: string | null;\n state?: string | null;\n requestOrigin: string;\n }>,\n ): Promise<OAuth2CallbackResult> {\n const code = args.code?.trim();\n const state = args.state?.trim();\n if (!code || !state) {\n throw new ApplicationRequestError(400, \"OAuth2 callback requires both code and state.\");\n }\n const storedState = await this.credentialStore.consumeOAuth2State(state);\n if (!storedState) {\n throw new ApplicationRequestError(400, \"OAuth2 state is invalid or has already been used.\");\n }\n if (new Date(storedState.expiresAt).getTime() <= Date.now()) {\n throw new ApplicationRequestError(400, \"OAuth2 state has expired. Start the connection flow again.\");\n }\n const instance = await this.credentialInstanceService.requireInstance(storedState.instanceId);\n const credentialType = this.requireOAuth2Type(instance.typeId);\n const auth = credentialType.definition.auth!;\n const composedMaterial = await this.credentialRuntimeMaterialService.compose(instance);\n const { resolvedPublicConfig, resolvedMaterial } = this.credentialFieldEnvOverlayService.apply({\n definition: credentialType.definition,\n publicConfig: instance.publicConfig,\n material: composedMaterial,\n });\n const provider = this.oauth2ProviderRegistry.resolve(credentialType.definition, resolvedPublicConfig);\n const redirectUri = this.getRedirectUri(args.requestOrigin);\n const tokenResponse = await this.exchangeAuthorizationCode({\n auth,\n code,\n codeVerifier: storedState.codeVerifier,\n provider,\n publicConfig: resolvedPublicConfig,\n redirectUri,\n secretMaterial: resolvedMaterial,\n });\n const nowIso = new Date().toISOString();\n const existingMaterial = await this.credentialStore.getOAuth2Material(instance.instanceId);\n const mergedTokenMaterial = this.mergeTokenMaterial(\n existingMaterial ? this.credentialSecretCipher.decrypt(existingMaterial) : undefined,\n tokenResponse,\n nowIso,\n storedState.requestedScopes,\n );\n const encryptedMaterial = this.credentialSecretCipher.encrypt(mergedTokenMaterial);\n const connectedEmail = await this.resolveConnectedEmail(provider.userInfoUrl, tokenResponse.access_token);\n await this.credentialStore.saveOAuth2Material({\n instanceId: instance.instanceId,\n encryptedJson: encryptedMaterial.encryptedJson,\n encryptionKeyId: encryptedMaterial.encryptionKeyId,\n schemaVersion: encryptedMaterial.schemaVersion,\n metadata: {\n providerId: provider.providerId,\n connectedEmail,\n connectedAt: nowIso,\n scopes: this.resolveGrantedScopes(tokenResponse.scope, storedState.requestedScopes),\n updatedAt: nowIso,\n },\n });\n await this.credentialInstanceService.markOAuth2Connected(instance.instanceId, nowIso);\n return {\n instanceId: instance.instanceId,\n connectedEmail,\n };\n }\n\n getRedirectUri(requestOrigin: string): string {\n const rawBase = this.appConfig.env.CODEMATION_PUBLIC_BASE_URL?.trim() || requestOrigin.trim();\n if (!rawBase) {\n throw new Error(\"Unable to resolve the public base URL for OAuth2 redirect URI generation.\");\n }\n const baseUrl = this.ensureAbsoluteUrlForOAuth2Base(rawBase);\n try {\n return new URL(\"/api/oauth2/callback\", this.normalizeBaseUrl(baseUrl)).toString();\n } catch {\n throw new ApplicationRequestError(\n 500,\n `Invalid public base URL for OAuth2 redirect URI generation: \"${rawBase}\". Use a full URL (e.g. http://localhost:3000) for CODEMATION_PUBLIC_BASE_URL or ensure the request has a valid Host / forwarded headers.`,\n );\n }\n }\n\n /**\n * `new URL(path, base)` requires `base` to be an absolute URL with a scheme.\n * Misconfigured CODEMATION_PUBLIC_BASE_URL (e.g. `localhost:3000` without http://) or odd\n * forwarded headers otherwise throw TypeError: Invalid URL.\n *\n * Comma-separated values (proxy chains or copy-paste mistakes like `http,http`) use the\n * first segment only; obviously invalid hostnames are rejected.\n */\n private ensureAbsoluteUrlForOAuth2Base(raw: string): string {\n const segments = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n let candidate = segments[0] ?? raw.trim();\n if (!candidate) {\n throw new Error(\"Unable to resolve the public base URL for OAuth2 redirect URI generation.\");\n }\n if (!/^https?:\\/\\//i.test(candidate)) {\n candidate = `http://${candidate}`;\n }\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n throw new ApplicationRequestError(\n 500,\n `Invalid public base URL for OAuth2 redirect URI generation: \"${raw}\". Use a single full URL (e.g. http://localhost:3000) for CODEMATION_PUBLIC_BASE_URL.`,\n );\n }\n if (parsed.hostname === \"http\" || parsed.hostname === \"https\") {\n throw new ApplicationRequestError(\n 500,\n `Invalid OAuth2 public base URL (hostname \"${parsed.hostname}\"). Set CODEMATION_PUBLIC_BASE_URL to one full URL with a real host, e.g. http://localhost:3000 — not \"http,http\" or other typos.`,\n );\n }\n return candidate;\n }\n\n private requireOAuth2Type(typeId: string) {\n const credentialType = this.credentialTypeRegistry.getCredentialType(typeId);\n if (!credentialType) {\n throw new ApplicationRequestError(400, `Unknown credential type: ${typeId}`);\n }\n if (credentialType.definition.auth?.kind !== \"oauth2\") {\n throw new ApplicationRequestError(400, `Credential type ${typeId} is not configured for OAuth2.`);\n }\n return credentialType;\n }\n\n private async exchangeAuthorizationCode(\n args: Readonly<{\n auth: CredentialOAuth2AuthDefinition;\n code: string;\n codeVerifier?: string;\n provider: Readonly<{\n authorizeUrl: string;\n tokenUrl: string;\n userInfoUrl?: string;\n providerId: string;\n }>;\n publicConfig: JsonRecord;\n redirectUri: string;\n secretMaterial: JsonRecord;\n }>,\n ): Promise<Readonly<Record<string, unknown>>> {\n const requestBody = new URLSearchParams();\n requestBody.set(\"grant_type\", \"authorization_code\");\n requestBody.set(\"code\", args.code);\n requestBody.set(\"redirect_uri\", args.redirectUri);\n requestBody.set(\"client_id\", this.oauth2ProviderRegistry.resolveClientId(args.auth, args.publicConfig));\n const clientSecretFieldKey = this.oauth2ProviderRegistry.resolveClientSecretFieldKey(args.auth);\n const clientSecret = String(args.secretMaterial[clientSecretFieldKey] ?? \"\");\n if (!clientSecret) {\n throw new ApplicationRequestError(\n 400,\n `OAuth2 client secret is missing from secret field \"${clientSecretFieldKey}\".`,\n );\n }\n requestBody.set(\"client_secret\", clientSecret);\n if (args.codeVerifier) {\n requestBody.set(\"code_verifier\", args.codeVerifier);\n }\n const response = await fetch(args.provider.tokenUrl, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/x-www-form-urlencoded\",\n },\n body: requestBody.toString(),\n });\n const responseText = await response.text();\n const responseBody = this.parseJsonRecord(responseText);\n if (!response.ok) {\n throw new ApplicationRequestError(400, this.createTokenExchangeErrorMessage(responseBody, responseText));\n }\n return responseBody;\n }\n\n private mergeTokenMaterial(\n existingMaterial: JsonRecord | undefined,\n tokenResponse: Readonly<Record<string, unknown>>,\n nowIso: string,\n requestedScopes: ReadonlyArray<string>,\n ): JsonRecord {\n const accessToken = tokenResponse.access_token;\n if (typeof accessToken !== \"string\" || accessToken.length === 0) {\n throw new ApplicationRequestError(400, \"OAuth2 token exchange did not return an access_token.\");\n }\n const nextRefreshToken = tokenResponse.refresh_token ?? existingMaterial?.refresh_token;\n const nextScope = tokenResponse.scope ?? requestedScopes.join(\" \");\n const expiry = this.resolveExpiry(tokenResponse, nowIso);\n return Object.freeze({\n access_token: accessToken,\n refresh_token: nextRefreshToken,\n token_type: tokenResponse.token_type,\n scope: nextScope,\n expiry,\n });\n }\n\n private resolveExpiry(tokenResponse: Readonly<Record<string, unknown>>, nowIso: string): string | undefined {\n const expiresInSeconds = Number(tokenResponse.expires_in);\n if (Number.isFinite(expiresInSeconds) && expiresInSeconds > 0) {\n return new Date(new Date(nowIso).getTime() + expiresInSeconds * 1000).toISOString();\n }\n const explicitExpiry = tokenResponse.expiry;\n return typeof explicitExpiry === \"string\" && explicitExpiry.length > 0 ? explicitExpiry : undefined;\n }\n\n private resolveGrantedScopes(\n grantedScopeValue: unknown,\n requestedScopes: ReadonlyArray<string>,\n ): ReadonlyArray<string> {\n if (typeof grantedScopeValue !== \"string\" || grantedScopeValue.trim().length === 0) {\n return [...requestedScopes];\n }\n return grantedScopeValue\n .split(/\\s+/)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n }\n\n private async resolveConnectedEmail(\n userInfoUrl: string | undefined,\n accessToken: unknown,\n ): Promise<string | undefined> {\n if (!userInfoUrl || typeof accessToken !== \"string\" || accessToken.length === 0) {\n return undefined;\n }\n const response = await fetch(userInfoUrl, {\n headers: {\n authorization: `Bearer ${accessToken}`,\n },\n });\n if (!response.ok) {\n return undefined;\n }\n const responseBody = this.parseJsonRecord(await response.text());\n return this.findEmail(responseBody);\n }\n\n private findEmail(value: JsonRecord): string | undefined {\n const email = value.email;\n if (typeof email === \"string\" && email.length > 0) {\n return email;\n }\n const nestedUser = value.user;\n if (nestedUser && typeof nestedUser === \"object\" && \"email\" in nestedUser) {\n const nestedEmail = (nestedUser as Readonly<Record<string, unknown>>).email;\n return typeof nestedEmail === \"string\" && nestedEmail.length > 0 ? nestedEmail : undefined;\n }\n return undefined;\n }\n\n private parseJsonRecord(value: string): JsonRecord {\n if (!value) {\n return {};\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === \"object\" ? (parsed as JsonRecord) : {};\n } catch {\n return {};\n }\n }\n\n private createTokenExchangeErrorMessage(responseBody: JsonRecord, rawText: string): string {\n const description = responseBody.error_description;\n if (typeof description === \"string\" && description.length > 0) {\n return description;\n }\n const error = responseBody.error;\n if (typeof error === \"string\" && error.length > 0) {\n return error;\n }\n return rawText || \"OAuth2 token exchange failed.\";\n }\n\n private createOpaqueValue(): string {\n return randomBytes(32).toString(\"base64url\");\n }\n\n private createPkceCodeChallenge(codeVerifier: string): string {\n return createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n }\n\n private normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport serialize from \"serialize-javascript\";\nimport { CredentialInstanceService } from \"../../../domain/credentials/CredentialServices\";\nimport { OAuth2ConnectService } from \"../../../domain/credentials/OAuth2ConnectServiceFactory\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\n\n@injectable()\nexport class OAuth2HttpRouteHandler {\n constructor(\n @inject(OAuth2ConnectService)\n private readonly oauth2ConnectService: OAuth2ConnectService,\n @inject(CredentialInstanceService)\n private readonly credentialInstanceService: CredentialInstanceService,\n ) {}\n\n async getAuthRedirect(request: Request): Promise<Response> {\n try {\n const url = new URL(request.url);\n const instanceId = url.searchParams.get(\"instanceId\")?.trim();\n if (!instanceId) {\n return Response.json({ error: \"Missing instanceId query parameter.\" }, { status: 400 });\n }\n const redirect = await this.oauth2ConnectService.createAuthRedirect(\n instanceId,\n this.resolveRequestOrigin(request),\n );\n return Response.redirect(redirect.redirectUrl, 302);\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getCallback(request: Request): Promise<Response> {\n try {\n const url = new URL(request.url);\n const result = await this.oauth2ConnectService.handleCallback({\n code: url.searchParams.get(\"code\"),\n state: url.searchParams.get(\"state\"),\n requestOrigin: this.resolveRequestOrigin(request),\n });\n return new Response(this.createPopupHtml({ kind: \"oauth2.connected\", ...result }), {\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return new Response(this.createPopupHtml({ kind: \"oauth2.error\", message }), {\n status: 400,\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n },\n });\n }\n }\n\n async getRedirectUri(request: Request): Promise<Response> {\n try {\n return Response.json({\n redirectUri: this.oauth2ConnectService.getRedirectUri(this.resolveRequestOrigin(request)),\n });\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postDisconnect(request: Request): Promise<Response> {\n try {\n const url = new URL(request.url);\n const instanceId = url.searchParams.get(\"instanceId\")?.trim();\n if (!instanceId) {\n return Response.json({ error: \"Missing instanceId query parameter.\" }, { status: 400 });\n }\n return Response.json(await this.credentialInstanceService.disconnectOAuth2(instanceId));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n private resolveRequestOrigin(request: Request): string {\n const forwardedProto = OAuth2HttpRouteHandler.firstCommaSeparatedValue(request.headers.get(\"x-forwarded-proto\"));\n const forwardedHost = OAuth2HttpRouteHandler.firstCommaSeparatedValue(request.headers.get(\"x-forwarded-host\"));\n if (forwardedProto && forwardedHost) {\n return `${forwardedProto}://${forwardedHost}`;\n }\n const host = OAuth2HttpRouteHandler.firstCommaSeparatedValue(request.headers.get(\"host\"));\n if (host) {\n return `${new URL(request.url).protocol}//${host}`;\n }\n return new URL(request.url).origin;\n }\n\n /** Proxies may send comma-separated lists (chain); use the first host/proto only. */\n private static firstCommaSeparatedValue(value: string | null | undefined): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed.split(\",\")[0]?.trim();\n }\n\n /**\n * Serialize popup payload for an inline script using `serialize-javascript`\n * (Webpack / HTML plugin stack): escapes angle brackets, slashes, and Unicode line\n * terminators so string values cannot break out of the script block.\n */\n private createPopupHtml(message: Readonly<Record<string, unknown>>): string {\n const safeLiteral = serialize(message, { isJSON: true });\n return `<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <title>OAuth2 connection</title>\n </head>\n <body>\n <script>\n (function () {\n const message = ${safeLiteral};\n if (window.opener) {\n window.opener.postMessage(message, window.location.origin);\n }\n window.close();\n })();\n </script>\n <p>You can close this window.</p>\n </body>\n</html>`;\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { OAuth2HttpRouteHandler } from \"../../routeHandlers/OAuth2HttpRouteHandlerFactory\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: OAuth2HonoApiRouteRegistrar }])\nexport class OAuth2HonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(@inject(OAuth2HttpRouteHandler) private readonly handler: OAuth2HttpRouteHandler) {}\n\n register(app: Hono): void {\n app.get(\"/oauth2/auth\", (c) => this.handler.getAuthRedirect(c.req.raw));\n app.get(\"/oauth2/callback\", (c) => this.handler.getCallback(c.req.raw));\n app.get(\"/oauth2/redirect-uri\", (c) => this.handler.getRedirectUri(c.req.raw));\n app.post(\"/oauth2/disconnect\", (c) => this.handler.postDisconnect(c.req.raw));\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { HttpRequestJsonBodyReader } from \"../HttpRequestJsonBodyReader\";\nimport type { CommandBus } from \"../../../application/bus/CommandBus\";\nimport type { QueryBus } from \"../../../application/bus/QueryBus\";\nimport { ReplaceMutableRunWorkflowSnapshotCommand } from \"../../../application/commands/ReplaceMutableRunWorkflowSnapshotCommand\";\nimport { ReplayWorkflowNodeCommand } from \"../../../application/commands/ReplayWorkflowNodeCommand\";\nimport { SetPinnedNodeInputCommand } from \"../../../application/commands/SetPinnedNodeInputCommand\";\nimport { StartWorkflowRunCommand } from \"../../../application/commands/StartWorkflowRunCommand\";\nimport type {\n CreateRunRequest,\n RunNodeRequest,\n UpdateRunNodePinRequest,\n UpdateRunWorkflowSnapshotRequest,\n} from \"../../../application/contracts/RunContracts\";\nimport { GetRunStateQuery } from \"../../../application/queries/GetRunStateQuery\";\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\nimport type { ServerHttpRouteParams } from \"../ServerHttpRouteParams\";\n\n@injectable()\nexport class RunHttpRouteHandler {\n constructor(\n @inject(ApplicationTokens.QueryBus)\n private readonly queryBus: QueryBus,\n @inject(ApplicationTokens.CommandBus)\n private readonly commandBus: CommandBus,\n ) {}\n\n async getRun(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const state = await this.queryBus.execute(new GetRunStateQuery(params.runId!));\n if (!state) {\n return Response.json({ error: \"Unknown runId\" }, { status: 404 });\n }\n return Response.json(state);\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postRuns(request: Request, _: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<CreateRunRequest>(request);\n return Response.json(await this.commandBus.execute(new StartWorkflowRunCommand(body)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async patchRunWorkflowSnapshot(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<UpdateRunWorkflowSnapshotRequest>(request);\n return Response.json(\n await this.commandBus.execute(new ReplaceMutableRunWorkflowSnapshotCommand(params.runId!, body)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async patchRunNodePin(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<UpdateRunNodePinRequest>(request);\n return Response.json(\n await this.commandBus.execute(new SetPinnedNodeInputCommand(params.runId!, params.nodeId!, body)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postRunNode(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<RunNodeRequest>(request);\n return Response.json(\n await this.commandBus.execute(new ReplayWorkflowNodeCommand(params.runId!, params.nodeId!, body)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { RunHttpRouteHandler } from \"../../routeHandlers/RunHttpRouteHandler\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: RunHonoApiRouteRegistrar }])\nexport class RunHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(@inject(RunHttpRouteHandler) private readonly handler: RunHttpRouteHandler) {}\n\n register(app: Hono): void {\n app.get(\"/runs/:runId\", (c) => this.handler.getRun(c.req.raw, { runId: c.req.param(\"runId\") }));\n app.post(\"/runs\", (c) => this.handler.postRuns(c.req.raw, {}));\n app.patch(\"/runs/:runId/workflow-snapshot\", (c) =>\n this.handler.patchRunWorkflowSnapshot(c.req.raw, { runId: c.req.param(\"runId\") }),\n );\n app.patch(\"/runs/:runId/nodes/:nodeId/pin\", (c) =>\n this.handler.patchRunNodePin(c.req.raw, {\n runId: c.req.param(\"runId\"),\n nodeId: c.req.param(\"nodeId\"),\n }),\n );\n app.post(\"/runs/:runId/nodes/:nodeId/run\", (c) =>\n this.handler.postRunNode(c.req.raw, {\n runId: c.req.param(\"runId\"),\n nodeId: c.req.param(\"nodeId\"),\n }),\n );\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { ApplicationRequestError } from \"../../../application/ApplicationRequestError\";\nimport type { CommandBus } from \"../../../application/bus/CommandBus\";\nimport type { QueryBus } from \"../../../application/bus/QueryBus\";\nimport {\n AcceptUserInviteCommand,\n InviteUserCommand,\n RegenerateUserInviteCommand,\n UpdateUserAccountStatusCommand,\n} from \"../../../application/commands/UserAccountCommandHandlers\";\nimport type {\n AcceptUserInviteRequestDto,\n InviteUserRequestDto,\n UpdateUserAccountStatusRequestDto,\n} from \"../../../application/contracts/userDirectoryContracts.types\";\nimport { ListUserAccountsQuery, VerifyUserInviteQuery } from \"../../../application/queries/UserAccountQueryHandlers\";\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\nimport type { ServerHttpRouteParams } from \"../ServerHttpRouteParams\";\n\n@injectable()\nexport class UserHttpRouteHandler {\n constructor(\n @inject(ApplicationTokens.QueryBus)\n private readonly queryBus: QueryBus,\n @inject(ApplicationTokens.CommandBus)\n private readonly commandBus: CommandBus,\n ) {}\n\n async getUsers(): Promise<Response> {\n try {\n return Response.json(await this.queryBus.execute(new ListUserAccountsQuery()));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getInviteVerify(request: Request): Promise<Response> {\n try {\n const url = new URL(request.url);\n const token = url.searchParams.get(\"token\") ?? \"\";\n return Response.json(await this.queryBus.execute(new VerifyUserInviteQuery(token)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postInvite(request: Request): Promise<Response> {\n try {\n const body = await this.readJsonBody<InviteUserRequestDto>(request);\n const origin = this.resolveRequestOrigin(request);\n return Response.json(await this.commandBus.execute(new InviteUserCommand(body.email, origin)), { status: 201 });\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postRegenerateInvite(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const userId = params.userId!;\n const origin = this.resolveRequestOrigin(request);\n return Response.json(await this.commandBus.execute(new RegenerateUserInviteCommand(userId, origin)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postAcceptInvite(request: Request): Promise<Response> {\n try {\n const body = await this.readJsonBody<AcceptUserInviteRequestDto>(request);\n await this.commandBus.execute(new AcceptUserInviteCommand(body.token, body.password));\n return new Response(null, { status: 204 });\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async patchUserStatus(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await this.readJsonBody<UpdateUserAccountStatusRequestDto>(request);\n return Response.json(\n await this.commandBus.execute(new UpdateUserAccountStatusCommand(params.userId!, body.status)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n private resolveRequestOrigin(request: Request): string {\n const forwardedProto = request.headers.get(\"x-forwarded-proto\");\n const forwardedHost = request.headers.get(\"x-forwarded-host\");\n if (forwardedProto?.trim() && forwardedHost?.trim()) {\n const proto = forwardedProto.split(\",\")[0]!.trim();\n const host = forwardedHost.split(\",\")[0]!.trim();\n return `${proto}://${host}`;\n }\n const url = new URL(request.url);\n return `${url.protocol}//${url.host}`;\n }\n\n private async readJsonBody<TBody>(request: Request): Promise<TBody> {\n try {\n return (await request.json()) as TBody;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new ApplicationRequestError(400, `Invalid JSON body: ${message}`);\n }\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { UserHttpRouteHandler } from \"../../routeHandlers/UserHttpRouteHandlerFactory\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: UserHonoApiRouteRegistrar }])\nexport class UserHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(@inject(UserHttpRouteHandler) private readonly handler: UserHttpRouteHandler) {}\n\n register(app: Hono): void {\n app.get(\"/users/invites/verify\", (c) => this.handler.getInviteVerify(c.req.raw));\n app.post(\"/users/invites/accept\", (c) => this.handler.postAcceptInvite(c.req.raw));\n app.get(\"/users\", (_c) => this.handler.getUsers());\n app.post(\"/users/invites\", (c) => this.handler.postInvite(c.req.raw));\n app.post(\"/users/:userId/invites/regenerate\", (c) =>\n this.handler.postRegenerateInvite(c.req.raw, { userId: c.req.param(\"userId\") }),\n );\n app.patch(\"/users/:userId/status\", (c) =>\n this.handler.patchUserStatus(c.req.raw, { userId: c.req.param(\"userId\") }),\n );\n }\n}\n","import type {\n ActivationIdFactory,\n BinaryAttachment,\n BinaryBody,\n BinaryStorage,\n Item,\n ItemBinary,\n RunIdFactory,\n WebhookInvocationMatch,\n} from \"@codemation/core\";\nimport { CoreTokens, DefaultExecutionBinaryService, inject, injectable } from \"@codemation/core\";\n\n@injectable()\nexport class RequestToWebhookItemMapper {\n constructor(\n @inject(CoreTokens.BinaryStorage)\n private readonly binaryStorage: BinaryStorage,\n @inject(CoreTokens.RunIdFactory)\n private readonly runIdFactory: RunIdFactory,\n @inject(CoreTokens.ActivationIdFactory)\n private readonly activationIdFactory: ActivationIdFactory,\n ) {}\n\n async map(request: Request, match: WebhookInvocationMatch): Promise<Item> {\n const url = new URL(request.url);\n const contentType = request.headers.get(\"content-type\") ?? \"\";\n if (contentType.toLowerCase().includes(\"multipart/form-data\")) {\n return await this.mapMultipart(request, match, url);\n }\n const bodyText = await request.text();\n const parsedJsonBody = this.parseJsonBody(bodyText, request, match.parseJsonBody);\n const body = parsedJsonBody.didParse ? parsedJsonBody.raw : this.resolveBody(bodyText);\n const json = parsedJsonBody.didParse ? parsedJsonBody.value : undefined;\n\n return {\n json: {\n headers: this.toHeaders(request),\n ...(body === undefined ? {} : { body }),\n ...(json === undefined ? {} : { json }),\n method: request.method.toUpperCase(),\n url: request.url,\n query: this.toQuery(url),\n },\n };\n }\n\n private async mapMultipart(request: Request, match: WebhookInvocationMatch, url: URL): Promise<Item> {\n const formData = await request.formData();\n const ingressRunId = `webhook-ingress-${this.runIdFactory.makeRunId()}`;\n const ingressActivationId = `webhook-ingress-${this.activationIdFactory.makeActivationId()}`;\n const binaryService = new DefaultExecutionBinaryService(\n this.binaryStorage,\n match.workflowId,\n ingressRunId,\n () => new Date(),\n );\n const nodeBinary = binaryService.forNode({\n nodeId: match.nodeId,\n activationId: ingressActivationId,\n });\n const formFields: Record<string, string> = {};\n const binaryParts: Record<string, BinaryAttachment> = {};\n for (const [key, value] of formData as unknown as Iterable<[string, string | File]>) {\n if (value instanceof File) {\n const attachment = await nodeBinary.attach({\n name: key,\n body: value.stream() as BinaryBody,\n mimeType: value.type || \"application/octet-stream\",\n filename: value.name,\n });\n binaryParts[key] = attachment;\n } else {\n formFields[key] = value;\n }\n }\n const binary: ItemBinary | undefined = Object.keys(binaryParts).length > 0 ? binaryParts : undefined;\n return {\n json: {\n headers: this.toHeaders(request),\n method: request.method.toUpperCase(),\n url: request.url,\n query: this.toQuery(url),\n formFields,\n },\n binary,\n };\n }\n\n private parseJsonBody(\n bodyText: string,\n request: Request,\n parseJsonBody: ((body: unknown) => unknown) | undefined,\n ): Readonly<{ didParse: boolean; raw?: unknown; value?: unknown }> {\n if (!bodyText) return { didParse: false };\n if (!parseJsonBody && !this.isJsonRequest(request)) return { didParse: false };\n\n const raw = JSON.parse(bodyText) as unknown;\n return {\n didParse: true,\n raw,\n value: parseJsonBody ? parseJsonBody(raw) : raw,\n };\n }\n\n private isJsonRequest(request: Request): boolean {\n return request.headers.get(\"content-type\")?.toLowerCase().includes(\"application/json\") ?? false;\n }\n\n private resolveBody(bodyText: string): string | undefined {\n return bodyText ? bodyText : undefined;\n }\n\n private toHeaders(request: Request): Record<string, string> {\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n }\n\n private toQuery(url: URL): Record<string, string> {\n const query: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n return query;\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { RunIntentService } from \"@codemation/core/bootstrap\";\nimport type { CommandBus } from \"../../../application/bus/CommandBus\";\nimport { HandleWebhookInvocationCommand } from \"../../../application/commands/HandleWebhookInvocationCommand\";\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport { RequestToWebhookItemMapper } from \"../../../infrastructure/webhooks/RequestToWebhookItemMapper\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\nimport type { ServerHttpRouteParams } from \"../ServerHttpRouteParams\";\n\n@injectable()\nexport class WebhookHttpRouteHandler {\n constructor(\n @inject(ApplicationTokens.CommandBus)\n private readonly commandBus: CommandBus,\n @inject(RunIntentService)\n private readonly runIntentService: RunIntentService,\n @inject(RequestToWebhookItemMapper)\n private readonly requestToWebhookItemMapper: RequestToWebhookItemMapper,\n ) {}\n\n async postWebhook(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const endpointPath = decodeURIComponent(params.endpointPath ?? \"\");\n const method = request.method.toUpperCase() as \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n const resolution = this.runIntentService.resolveWebhookTrigger({ endpointPath, method });\n if (resolution.status === \"notFound\") {\n return Response.json({ error: \"Unknown webhook endpoint\" }, { status: 404 });\n }\n if (resolution.status === \"methodNotAllowed\") {\n return Response.json({ error: \"Method not allowed\" }, { status: 405 });\n }\n const requestItem = await this.requestToWebhookItemMapper.map(request, resolution.match);\n return Response.json(\n await this.commandBus.execute(\n new HandleWebhookInvocationCommand(endpointPath, request.method.toUpperCase(), requestItem),\n ),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport type { Context } from \"hono\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { WebhookHttpRouteHandler } from \"../../routeHandlers/WebhookHttpRouteHandler\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: WebhookHonoApiRouteRegistrar }])\nexport class WebhookHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(@inject(WebhookHttpRouteHandler) private readonly handler: WebhookHttpRouteHandler) {}\n\n register(app: Hono): void {\n const path = \"/webhooks/:endpointPath\";\n const handle = (c: Context) =>\n this.handler.postWebhook(c.req.raw, { endpointPath: c.req.param(\"endpointPath\") ?? \"\" });\n app.get(path, handle);\n app.post(path, handle);\n app.put(path, handle);\n app.patch(path, handle);\n app.delete(path, handle);\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { createReadStream, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\n\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport type { AppConfig } from \"../../config/AppConfig\";\nimport type { CodemationWhitelabelConfig } from \"../../config/CodemationWhitelabelConfig\";\n\n@injectable()\nexport class WhitelabelLogoHttpRouteHandler {\n constructor(\n @inject(ApplicationTokens.AppConfig)\n private readonly appConfig: AppConfig,\n @inject(ApplicationTokens.CodemationWhitelabelConfig)\n private readonly whitelabel: CodemationWhitelabelConfig,\n ) {}\n\n async getLogo(): Promise<Response> {\n const consumerRootRaw = this.appConfig.consumerRoot.trim();\n if (!consumerRootRaw || consumerRootRaw.length === 0) {\n return new Response(null, { status: 404 });\n }\n const logoPath = this.whitelabel.logoPath?.trim();\n if (!logoPath || logoPath.length === 0) {\n return new Response(null, { status: 404 });\n }\n const consumerRoot = path.resolve(consumerRootRaw);\n let consumerRootReal: string;\n try {\n consumerRootReal = await this.safeRealpath(consumerRoot);\n } catch {\n return new Response(null, { status: 404 });\n }\n const candidate = path.resolve(consumerRoot, logoPath);\n let fileReal: string;\n try {\n fileReal = await this.safeRealpath(candidate);\n } catch {\n return new Response(null, { status: 404 });\n }\n if (!this.isPathInsideDirectory(consumerRootReal, fileReal)) {\n return new Response(null, { status: 404 });\n }\n if (!existsSync(fileReal)) {\n return new Response(null, { status: 404 });\n }\n const contentType = this.resolveContentType(fileReal);\n const stream = createReadStream(fileReal);\n const webStream = Readable.toWeb(stream) as ReadableStream<Uint8Array>;\n return new Response(webStream, {\n status: 200,\n headers: {\n \"content-type\": contentType,\n \"cache-control\": \"public, max-age=3600\",\n },\n });\n }\n\n private async safeRealpath(p: string): Promise<string> {\n const { realpath } = await import(\"node:fs/promises\");\n return await realpath(p);\n }\n\n private isPathInsideDirectory(directoryReal: string, fileReal: string): boolean {\n const relative = path.relative(directoryReal, fileReal);\n if (relative.length === 0) {\n return false;\n }\n if (relative.startsWith(`..${path.sep}`) || relative === \"..\") {\n return false;\n }\n return !path.isAbsolute(relative);\n }\n\n private resolveContentType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case \".svg\":\n return \"image/svg+xml\";\n case \".png\":\n return \"image/png\";\n case \".jpg\":\n case \".jpeg\":\n return \"image/jpeg\";\n case \".webp\":\n return \"image/webp\";\n case \".gif\":\n return \"image/gif\";\n case \".ico\":\n return \"image/x-icon\";\n default:\n return \"application/octet-stream\";\n }\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { WhitelabelLogoHttpRouteHandler } from \"../../routeHandlers/WhitelabelLogoHttpRouteHandler\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: WhitelabelHonoApiRouteRegistrar }])\nexport class WhitelabelHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(\n @inject(WhitelabelLogoHttpRouteHandler)\n private readonly whitelabelLogoHttpRouteHandler: WhitelabelLogoHttpRouteHandler,\n ) {}\n\n register(app: Hono): void {\n app.get(\"/whitelabel/logo\", () => this.whitelabelLogoHttpRouteHandler.getLogo());\n }\n}\n","import type { NodeDefinition, RetryPolicySpec, WorkflowDefinition } from \"@codemation/core\";\n\n/** UI-facing policy labels derived from workflow/node definitions (live or hydrated snapshot). */\nexport class WorkflowPolicyUiPresentationFactory {\n workflowHasErrorHandler(workflow: WorkflowDefinition): boolean {\n return workflow.workflowErrorHandler !== undefined;\n }\n\n nodeRetrySummary(config: NodeDefinition[\"config\"]): string | undefined {\n const spec = config.retryPolicy as RetryPolicySpec | undefined;\n if (!spec) return undefined;\n if (spec.kind === \"none\") return \"Retry: off\";\n if (spec.kind === \"fixed\") return `Retry: ${spec.maxAttempts}x @ ${spec.delayMs}ms`;\n if (spec.kind === \"exponential\") {\n const jitter = spec.jitter ? \", jitter\" : \"\";\n return `Retry: exp ${spec.maxAttempts}x from ${spec.initialDelayMs}ms (x${spec.multiplier}${jitter})`;\n }\n return undefined;\n }\n\n nodeHasErrorHandler(config: NodeDefinition[\"config\"]): boolean {\n return config.nodeErrorHandler !== undefined;\n }\n\n snapshotNodeRetrySummary(config: unknown): string | undefined {\n const record = this.asRecord(config);\n const spec = record.retryPolicy as RetryPolicySpec | undefined;\n if (!spec || typeof spec !== \"object\") return undefined;\n return this.nodeRetrySummary({ retryPolicy: spec } as NodeDefinition[\"config\"]);\n }\n\n snapshotNodeHasErrorHandler(config: unknown): boolean {\n return this.asRecord(config).nodeErrorHandler !== undefined;\n }\n\n private asRecord(value: unknown): Readonly<Record<string, unknown>> {\n return value !== null && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n }\n}\n","import type {\n ChatModelConfig,\n NodeDefinition,\n ToolConfig,\n WorkflowActivationPolicy,\n WorkflowDefinition,\n} from \"@codemation/core\";\nimport { AgentConfigInspector, ConnectionNodeIdFactory, CoreTokens, inject, injectable } from \"@codemation/core\";\nimport type { WorkflowDto, WorkflowNodeDto, WorkflowSummary } from \"../contracts/WorkflowViewContracts\";\nimport type { DataMapper } from \"./DataMapper\";\nimport { WorkflowPolicyUiPresentationFactory } from \"./WorkflowPolicyUiPresentationFactory\";\n\n@injectable()\nexport class WorkflowDefinitionMapper implements DataMapper<WorkflowDefinition, WorkflowDto> {\n constructor(\n @inject(WorkflowPolicyUiPresentationFactory)\n private readonly policyUi: WorkflowPolicyUiPresentationFactory,\n @inject(CoreTokens.WorkflowActivationPolicy)\n private readonly workflowActivationPolicy: WorkflowActivationPolicy,\n ) {}\n\n async map(workflow: WorkflowDefinition): Promise<WorkflowDto> {\n return this.mapSync(workflow);\n }\n\n mapSync(workflow: WorkflowDefinition): WorkflowDto {\n return {\n id: workflow.id,\n name: workflow.name,\n active: this.workflowActivationPolicy.isActive(workflow.id),\n hasWorkflowErrorHandler: this.policyUi.workflowHasErrorHandler(workflow),\n nodes: this.toNodes(workflow),\n edges: this.toEdges(workflow),\n };\n }\n\n toSummary(workflow: WorkflowDefinition): WorkflowSummary {\n return {\n id: workflow.id,\n name: workflow.name,\n active: this.workflowActivationPolicy.isActive(workflow.id),\n discoveryPathSegments: workflow.discoveryPathSegments ?? [],\n };\n }\n\n private buildConnectionChildMeta(\n workflow: WorkflowDefinition,\n ): ReadonlyMap<string, Readonly<{ parentNodeId: string; connectionName: string }>> {\n const map = new Map<string, Readonly<{ parentNodeId: string; connectionName: string }>>();\n for (const c of workflow.connections ?? []) {\n for (const childId of c.childNodeIds) {\n map.set(childId, { parentNodeId: c.parentNodeId, connectionName: c.connectionName });\n }\n }\n return map;\n }\n\n private agentHasConnectionMetadata(workflow: WorkflowDefinition, agentNodeId: string): boolean {\n return (workflow.connections ?? []).some((c) => c.parentNodeId === agentNodeId);\n }\n\n private toNodes(workflow: WorkflowDefinition): ReadonlyArray<WorkflowNodeDto> {\n const connectionChildMeta = this.buildConnectionChildMeta(workflow);\n const nodes: WorkflowNodeDto[] = [];\n for (const node of workflow.nodes) {\n const conn = connectionChildMeta.get(node.id);\n if (conn) {\n const role = conn.connectionName === \"llm\" ? \"languageModel\" : \"tool\";\n nodes.push({\n id: node.id,\n kind: node.kind,\n name: node.name ?? node.config?.name,\n type: this.nodeTypeName(node),\n role,\n icon: node.config?.icon,\n retryPolicySummary: this.policyUi.nodeRetrySummary(node.config),\n hasNodeErrorHandler: this.policyUi.nodeHasErrorHandler(node.config),\n parentNodeId: conn.parentNodeId,\n });\n continue;\n }\n nodes.push({\n id: node.id,\n kind: node.kind,\n name: node.name ?? node.config?.name,\n type: this.nodeTypeName(node),\n role: AgentConfigInspector.isAgentNodeConfig(node.config) ? \"agent\" : \"workflowNode\",\n icon: node.config?.icon,\n retryPolicySummary: this.policyUi.nodeRetrySummary(node.config),\n hasNodeErrorHandler: this.policyUi.nodeHasErrorHandler(node.config),\n });\n if (AgentConfigInspector.isAgentNodeConfig(node.config) && !this.agentHasConnectionMetadata(workflow, node.id)) {\n nodes.push(this.createLanguageModelNode(node, node.config.chatModel));\n for (const toolConfig of node.config.tools ?? []) {\n nodes.push(this.createToolNode(node, toolConfig));\n }\n }\n }\n return nodes;\n }\n\n private toEdges(workflow: WorkflowDefinition): WorkflowDto[\"edges\"] {\n const edges = [...workflow.edges];\n for (const node of workflow.nodes) {\n if (!AgentConfigInspector.isAgentNodeConfig(node.config)) {\n continue;\n }\n if (this.agentHasConnectionMetadata(workflow, node.id)) {\n for (const c of workflow.connections ?? []) {\n if (c.parentNodeId !== node.id) {\n continue;\n }\n for (const childId of c.childNodeIds) {\n edges.push({\n from: { nodeId: node.id, output: \"main\" },\n to: { nodeId: childId, input: \"in\" },\n });\n }\n }\n continue;\n }\n edges.push({\n from: { nodeId: node.id, output: \"main\" },\n to: { nodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(node.id), input: \"in\" },\n });\n for (const toolConfig of node.config.tools ?? []) {\n edges.push({\n from: { nodeId: node.id, output: \"main\" },\n to: { nodeId: ConnectionNodeIdFactory.toolConnectionNodeId(node.id, toolConfig.name), input: \"in\" },\n });\n }\n }\n return edges;\n }\n\n private createLanguageModelNode(node: NodeDefinition, chatModel: ChatModelConfig): WorkflowNodeDto {\n return {\n id: ConnectionNodeIdFactory.languageModelConnectionNodeId(node.id),\n kind: \"node\",\n name: chatModel.presentation?.label ?? chatModel.name,\n type: chatModel.name,\n role: \"languageModel\",\n icon: chatModel.presentation?.icon,\n parentNodeId: node.id,\n };\n }\n\n private createToolNode(node: NodeDefinition, toolConfig: ToolConfig): WorkflowNodeDto {\n return {\n id: ConnectionNodeIdFactory.toolConnectionNodeId(node.id, toolConfig.name),\n kind: \"node\",\n name: toolConfig.presentation?.label ?? toolConfig.name,\n type: toolConfig.name,\n role: \"tool\",\n icon: toolConfig.presentation?.icon,\n parentNodeId: node.id,\n };\n }\n\n private nodeTypeName(node: NodeDefinition): string {\n const configToken = node.config?.type as Readonly<{ name?: unknown }> | undefined;\n if (typeof configToken?.name === \"string\" && configToken.name) {\n return configToken.name;\n }\n const nodeToken = node.type as Readonly<{ name?: unknown }> | undefined;\n if (typeof nodeToken?.name === \"string\" && nodeToken.name) {\n return nodeToken.name;\n }\n return \"Node\";\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { HttpRequestJsonBodyReader } from \"../HttpRequestJsonBodyReader\";\nimport type { CommandBus } from \"../../../application/bus/CommandBus\";\nimport type { QueryBus } from \"../../../application/bus/QueryBus\";\nimport { CopyRunToWorkflowDebuggerCommand } from \"../../../application/commands/CopyRunToWorkflowDebuggerCommand\";\nimport { ReplaceWorkflowDebuggerOverlayCommand } from \"../../../application/commands/ReplaceWorkflowDebuggerOverlayCommand\";\nimport { SetWorkflowActivationCommand } from \"../../../application/commands/SetWorkflowActivationCommand\";\nimport type {\n CopyRunToWorkflowDebuggerRequest,\n UpdateWorkflowDebuggerOverlayRequest,\n} from \"../../../application/contracts/WorkflowDebuggerContracts\";\nimport { WorkflowDefinitionMapper } from \"../../../application/mapping/WorkflowDefinitionMapper\";\nimport { GetWorkflowDebuggerOverlayQuery } from \"../../../application/queries/GetWorkflowDebuggerOverlayQuery\";\nimport { GetWorkflowDetailQuery } from \"../../../application/queries/GetWorkflowDetailQuery\";\nimport { GetWorkflowSummariesQuery } from \"../../../application/queries/GetWorkflowSummariesQuery\";\nimport { ListWorkflowRunsQuery } from \"../../../application/queries/ListWorkflowRunsQuery\";\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\nimport type { ServerHttpRouteParams } from \"../ServerHttpRouteParams\";\n\n@injectable()\nexport class WorkflowHttpRouteHandler {\n constructor(\n @inject(ApplicationTokens.QueryBus)\n private readonly queryBus: QueryBus,\n @inject(ApplicationTokens.CommandBus)\n private readonly commandBus: CommandBus,\n @inject(WorkflowDefinitionMapper)\n private readonly workflowDefinitionMapper: WorkflowDefinitionMapper,\n ) {}\n\n async getWorkflows(_: Request, __: ServerHttpRouteParams): Promise<Response> {\n try {\n const workflows = await this.queryBus.execute(new GetWorkflowSummariesQuery());\n return Response.json(workflows.map((workflow) => this.workflowDefinitionMapper.toSummary(workflow)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getWorkflow(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const workflow = await this.queryBus.execute(new GetWorkflowDetailQuery(params.workflowId!));\n if (!workflow) {\n return Response.json({ error: \"Unknown workflowId\" }, { status: 404 });\n }\n return Response.json(await this.workflowDefinitionMapper.map(workflow));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async patchWorkflowActivation(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<Readonly<{ active?: unknown }>>(request);\n if (typeof body.active !== \"boolean\") {\n return Response.json({ error: \"Request body must include boolean active\" }, { status: 400 });\n }\n return Response.json(\n await this.commandBus.execute(new SetWorkflowActivationCommand(params.workflowId!, body.active)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getWorkflowRuns(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n return Response.json(await this.queryBus.execute(new ListWorkflowRunsQuery(params.workflowId!)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async getWorkflowDebuggerOverlay(_: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n return Response.json(await this.queryBus.execute(new GetWorkflowDebuggerOverlayQuery(params.workflowId!)));\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async putWorkflowDebuggerOverlay(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<UpdateWorkflowDebuggerOverlayRequest>(request);\n return Response.json(\n await this.commandBus.execute(new ReplaceWorkflowDebuggerOverlayCommand(params.workflowId!, body)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n\n async postCopyWorkflowDebuggerOverlay(request: Request, params: ServerHttpRouteParams): Promise<Response> {\n try {\n const body = await HttpRequestJsonBodyReader.readJsonBody<CopyRunToWorkflowDebuggerRequest>(request);\n return Response.json(\n await this.commandBus.execute(new CopyRunToWorkflowDebuggerCommand(params.workflowId!, body)),\n );\n } catch (error) {\n return ServerHttpErrorResponseFactory.fromUnknown(error);\n }\n }\n}\n","import { inject, injectable, registry } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport { ApplicationTokens } from \"../../../../applicationTokens\";\nimport { WorkflowHttpRouteHandler } from \"../../routeHandlers/WorkflowHttpRouteHandler\";\nimport type { HonoApiRouteRegistrar } from \"../HonoApiRouteRegistrar\";\n\n@injectable()\n@registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: WorkflowHonoApiRouteRegistrar }])\nexport class WorkflowHonoApiRouteRegistrar implements HonoApiRouteRegistrar {\n constructor(@inject(WorkflowHttpRouteHandler) private readonly handler: WorkflowHttpRouteHandler) {}\n\n register(app: Hono): void {\n app.get(\"/workflows\", (c) => this.handler.getWorkflows(c.req.raw, {}));\n app.get(\"/workflows/:workflowId/runs\", (c) =>\n this.handler.getWorkflowRuns(c.req.raw, { workflowId: c.req.param(\"workflowId\") }),\n );\n app.get(\"/workflows/:workflowId/debugger-overlay\", (c) =>\n this.handler.getWorkflowDebuggerOverlay(c.req.raw, { workflowId: c.req.param(\"workflowId\") }),\n );\n app.put(\"/workflows/:workflowId/debugger-overlay\", (c) =>\n this.handler.putWorkflowDebuggerOverlay(c.req.raw, { workflowId: c.req.param(\"workflowId\") }),\n );\n app.post(\"/workflows/:workflowId/debugger-overlay/copy-run\", (c) =>\n this.handler.postCopyWorkflowDebuggerOverlay(c.req.raw, { workflowId: c.req.param(\"workflowId\") }),\n );\n app.get(\"/workflows/:workflowId\", (c) =>\n this.handler.getWorkflow(c.req.raw, { workflowId: c.req.param(\"workflowId\") }),\n );\n app.patch(\"/workflows/:workflowId/activation\", (c) =>\n this.handler.patchWorkflowActivation(c.req.raw, { workflowId: c.req.param(\"workflowId\") }),\n );\n }\n}\n","import type { CodemationApplication } from \"../../codemationApplication\";\nimport type { CodemationConfig } from \"../../presentation/config/CodemationConfig\";\n\nimport type { OpenAiApiKeyCredentialTypeFactory } from \"./OpenAiApiKeyCredentialTypeFactory\";\n\n/**\n * Registers framework-owned credential types that ship with the host (OpenAI-compatible API keys, etc.).\n */\nexport class FrameworkBuiltinCredentialTypesRegistrar {\n constructor(private readonly openAiApiKeyCredentialTypeFactory: OpenAiApiKeyCredentialTypeFactory) {}\n\n register(application: CodemationApplication, config?: CodemationConfig): void {\n const openAiCredentialType = this.openAiApiKeyCredentialTypeFactory.createCredentialType();\n const openAiProvidedInConsumerConfig =\n config?.credentialTypes?.some((entry) => entry.definition.typeId === openAiCredentialType.definition.typeId) ??\n false;\n if (!openAiProvidedInConsumerConfig) {\n application.registerCredentialType(openAiCredentialType);\n }\n }\n}\n","import type { Container } from \"@codemation/core\";\nimport type { LoggerFactory } from \"../../application/logging/Logger\";\nimport type { AppConfig } from \"../../presentation/config/AppConfig\";\nimport type { CodemationPlugin } from \"../../presentation/config/CodemationPlugin\";\nimport type { AnyCredentialType } from \"@codemation/core\";\n\nexport class CodemationPluginRegistrar {\n async apply(\n args: Readonly<{\n plugins: ReadonlyArray<CodemationPlugin>;\n container: Container;\n appConfig: AppConfig;\n registerCredentialType: (type: AnyCredentialType) => void;\n loggerFactory: LoggerFactory;\n }>,\n ): Promise<void> {\n for (const plugin of args.plugins) {\n await plugin.register({\n container: args.container,\n appConfig: args.appConfig,\n loggerFactory: args.loggerFactory,\n registerCredentialType: (type) => args.registerCredentialType(type),\n registerNode: (token, implementation) => {\n args.container.register(token, {\n useClass: (implementation ?? token) as never,\n });\n },\n registerValue: (token, value) => {\n args.container.registerInstance(token, value);\n },\n registerClass: (token, implementation) => {\n args.container.register(token, {\n useClass: implementation as never,\n });\n },\n registerFactory: (token, factory) => {\n args.container.register(token, {\n useFactory: (dependencyContainer) => factory(dependencyContainer),\n });\n },\n });\n }\n }\n}\n","export class ApiPaths {\n private static readonly apiBasePath = \"/api\";\n\n private static readonly workflowsBasePath = `${this.apiBasePath}/workflows`;\n\n private static readonly runsBasePath = `${this.apiBasePath}/runs`;\n\n private static readonly credentialsBasePath = `${this.apiBasePath}/credentials`;\n\n private static readonly oauth2BasePath = `${this.apiBasePath}/oauth2`;\n\n private static readonly webhooksBasePath = `${this.apiBasePath}/webhooks`;\n\n private static readonly usersBasePath = `${this.apiBasePath}/users`;\n\n private static readonly whitelabelBasePath = `${this.apiBasePath}/whitelabel`;\n\n static workflows(): string {\n return this.workflowsBasePath;\n }\n\n static workflow(workflowId: string): string {\n return `${this.workflowsBasePath}/${encodeURIComponent(workflowId)}`;\n }\n\n static workflowActivation(workflowId: string): string {\n return `${this.workflow(workflowId)}/activation`;\n }\n\n static workflowRuns(workflowId: string): string {\n return `${this.workflow(workflowId)}/runs`;\n }\n\n static workflowCredentialHealth(workflowId: string): string {\n return `${this.workflow(workflowId)}/credential-health`;\n }\n\n static workflowDebuggerOverlay(workflowId: string): string {\n return `${this.workflow(workflowId)}/debugger-overlay`;\n }\n\n static workflowDebuggerOverlayCopyRun(workflowId: string): string {\n return `${this.workflowDebuggerOverlay(workflowId)}/copy-run`;\n }\n\n static workflowDebuggerOverlayBinaryUpload(workflowId: string): string {\n return `${this.workflowDebuggerOverlay(workflowId)}/binary/upload`;\n }\n\n static workflowOverlayBinaryContent(workflowId: string, binaryId: string): string {\n return `${this.workflow(workflowId)}/debugger-overlay/binary/${encodeURIComponent(binaryId)}/content`;\n }\n\n static runs(): string {\n return this.runsBasePath;\n }\n\n static run(): string {\n return this.runs();\n }\n\n static credentialTypes(): string {\n return `${this.credentialsBasePath}/types`;\n }\n\n static credentialsEnvStatus(): string {\n return `${this.credentialsBasePath}/env-status`;\n }\n\n static credentialInstances(): string {\n return `${this.credentialsBasePath}/instances`;\n }\n\n static credentialInstance(instanceId: string, withSecrets?: boolean): string {\n const base = `${this.credentialInstances()}/${encodeURIComponent(instanceId)}`;\n return withSecrets ? `${base}?withSecrets=1` : base;\n }\n\n static credentialInstanceTest(instanceId: string): string {\n return `${this.credentialInstance(instanceId)}/test`;\n }\n\n static credentialBindings(): string {\n return `${this.apiBasePath}/credential-bindings`;\n }\n\n static oauth2Auth(instanceId: string): string {\n return `${this.oauth2BasePath}/auth?instanceId=${encodeURIComponent(instanceId)}`;\n }\n\n static oauth2RedirectUri(): string {\n return `${this.oauth2BasePath}/redirect-uri`;\n }\n\n static oauth2Disconnect(instanceId: string): string {\n return `${this.oauth2BasePath}/disconnect?instanceId=${encodeURIComponent(instanceId)}`;\n }\n\n static workflowWebsocket(): string {\n return `${this.workflowsBasePath}/ws`;\n }\n\n /** Dev gateway: stable browser WebSocket for build lifecycle (CLI → gateway → browser). */\n static devGatewaySocket(): string {\n return `${this.apiBasePath}/dev/socket`;\n }\n\n /** Dev gateway: HTTP notify endpoint used by the Codemation CLI during consumer rebuilds. */\n static devGatewayNotify(): string {\n return `${this.apiBasePath}/dev/notify`;\n }\n\n static webhooks(): string {\n return this.webhooksBasePath;\n }\n\n static users(): string {\n return this.usersBasePath;\n }\n\n static userInviteVerify(): string {\n return `${this.usersBasePath}/invites/verify`;\n }\n\n static userInviteAccept(): string {\n return `${this.usersBasePath}/invites/accept`;\n }\n\n static userInvites(): string {\n return `${this.usersBasePath}/invites`;\n }\n\n static userInviteRegenerate(userId: string): string {\n return `${this.usersBasePath}/${encodeURIComponent(userId)}/invites/regenerate`;\n }\n\n static userStatus(userId: string): string {\n return `${this.usersBasePath}/${encodeURIComponent(userId)}/status`;\n }\n\n static runState(runId: string): string {\n return `${this.runsBasePath}/${encodeURIComponent(runId)}`;\n }\n\n static runWorkflowSnapshot(runId: string): string {\n return `${this.runState(runId)}/workflow-snapshot`;\n }\n\n static runNodePin(runId: string, nodeId: string): string {\n return `${this.runState(runId)}/nodes/${encodeURIComponent(nodeId)}/pin`;\n }\n\n static runNode(runId: string, nodeId: string): string {\n return `${this.runState(runId)}/nodes/${encodeURIComponent(nodeId)}/run`;\n }\n\n static runBinaryContent(runId: string, binaryId: string): string {\n return `${this.runState(runId)}/binary/${encodeURIComponent(binaryId)}/content`;\n }\n\n /** Anonymous: consumer logo from `codemation.config.ts` whitelabel.logoPath. */\n static whitelabelLogo(): string {\n return `${this.whitelabelBasePath}/logo`;\n }\n}\n","import { WebSocket, WebSocketServer } from \"ws\";\nimport type { WorkflowWebsocketMessage } from \"../../application/contracts/WorkflowWebsocketMessage\";\nimport type { Logger } from \"../../application/logging/Logger\";\nimport type { WorkflowWebsocketPublisher } from \"../../application/websocket/WorkflowWebsocketPublisher\";\nimport { ApiPaths } from \"../http/ApiPaths\";\n\ntype WorkflowWebsocketClientMessage =\n | Readonly<{ kind: \"subscribe\"; roomId: string }>\n | Readonly<{ kind: \"unsubscribe\"; roomId: string }>;\n\ntype WorkflowWebsocketControlMessage =\n | Readonly<{ kind: \"ready\" }>\n | Readonly<{ kind: \"subscribed\"; roomId: string }>\n | Readonly<{ kind: \"unsubscribed\"; roomId: string }>\n | Readonly<{ kind: \"error\"; message: string }>;\n\ntype WorkflowWebsocketServerMessage = WorkflowWebsocketControlMessage | WorkflowWebsocketMessage;\n\nexport class WorkflowWebsocketServer implements WorkflowWebsocketPublisher {\n private websocketServer: WebSocketServer | null = null;\n private readonly sockets = new Set<WebSocket>();\n private readonly roomIdsBySocket = new Map<WebSocket, Set<string>>();\n private started = false;\n\n constructor(\n private readonly port: number,\n private readonly bindHost: string,\n private readonly logger: Logger,\n ) {}\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n const websocketServer = new WebSocketServer({\n host: this.bindHost,\n port: this.port,\n path: ApiPaths.workflowWebsocket(),\n });\n this.websocketServer = websocketServer;\n websocketServer.on(\"connection\", (socket) => {\n void this.connect(socket);\n });\n try {\n await this.awaitListening(websocketServer);\n } catch (error) {\n this.websocketServer = null;\n await this.closeAfterFailedStart(websocketServer);\n throw error;\n }\n this.logger.debug(`listening on ws://${this.bindHost}:${this.port}${ApiPaths.workflowWebsocket()}`);\n this.started = true;\n }\n\n async stop(): Promise<void> {\n if (!this.websocketServer) {\n return;\n }\n this.started = false;\n for (const socket of this.sockets) {\n socket.removeAllListeners();\n socket.terminate();\n }\n this.sockets.clear();\n this.roomIdsBySocket.clear();\n const websocketServer = this.websocketServer;\n this.websocketServer = null;\n await new Promise<void>((resolve, reject) => {\n websocketServer.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n async publishToRoom(roomId: string, message: WorkflowWebsocketMessage): Promise<void> {\n let deliveredSocketCount = 0;\n for (const [socket, roomIds] of this.roomIdsBySocket) {\n if (socket.readyState !== WebSocket.OPEN || !roomIds.has(roomId)) {\n continue;\n }\n socket.send(JSON.stringify(message satisfies WorkflowWebsocketServerMessage));\n deliveredSocketCount += 1;\n }\n if (message.kind === \"event\") {\n const event = message.event;\n const eventLabel =\n \"snapshot\" in event && event.snapshot\n ? `${event.kind}:${event.runId}:${event.snapshot.nodeId}:${event.snapshot.status}`\n : `${event.kind}:${event.runId}`;\n this.logger.debug(`published room=${roomId} sockets=${deliveredSocketCount} event=${eventLabel}`);\n return;\n }\n this.logger.debug(`published room=${roomId} sockets=${deliveredSocketCount} kind=${message.kind}`);\n }\n\n private async connect(socket: WebSocket): Promise<void> {\n this.sockets.add(socket);\n this.roomIdsBySocket.set(socket, new Set());\n this.logger.debug(`client connected activeSockets=${this.sockets.size}`);\n socket.send(JSON.stringify({ kind: \"ready\" } satisfies WorkflowWebsocketServerMessage));\n socket.on(\"message\", (rawData) => {\n void this.handleMessage(socket, rawData);\n });\n socket.on(\"close\", () => {\n this.sockets.delete(socket);\n this.roomIdsBySocket.delete(socket);\n this.logger.debug(`client disconnected activeSockets=${this.sockets.size}`);\n });\n socket.on(\"error\", () => {\n this.sockets.delete(socket);\n this.roomIdsBySocket.delete(socket);\n this.logger.warn(`client socket error activeSockets=${this.sockets.size}`);\n });\n }\n\n private async handleMessage(socket: WebSocket, rawData: unknown): Promise<void> {\n try {\n const message = this.parseClientMessage(rawData);\n if (message.kind === \"subscribe\") {\n this.roomIdsBySocket.get(socket)?.add(message.roomId);\n this.logger.debug(`subscribed room=${message.roomId}`);\n socket.send(\n JSON.stringify({ kind: \"subscribed\", roomId: message.roomId } satisfies WorkflowWebsocketServerMessage),\n );\n return;\n }\n this.roomIdsBySocket.get(socket)?.delete(message.roomId);\n this.logger.debug(`unsubscribed room=${message.roomId}`);\n socket.send(\n JSON.stringify({ kind: \"unsubscribed\", roomId: message.roomId } satisfies WorkflowWebsocketServerMessage),\n );\n } catch (error) {\n const exception = error instanceof Error ? error : new Error(String(error));\n this.logger.warn(`failed to handle client message: ${exception.message}`);\n socket.send(\n JSON.stringify({ kind: \"error\", message: exception.message } satisfies WorkflowWebsocketServerMessage),\n );\n }\n }\n\n private async awaitListening(websocketServer: WebSocketServer): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n websocketServer.once(\"listening\", () => resolve());\n websocketServer.once(\"error\", reject);\n });\n }\n\n private async closeAfterFailedStart(websocketServer: WebSocketServer): Promise<void> {\n await new Promise<void>((resolve) => {\n websocketServer.close(() => resolve());\n });\n }\n\n private parseClientMessage(rawData: unknown): WorkflowWebsocketClientMessage {\n const value = typeof rawData === \"string\" ? rawData : Buffer.isBuffer(rawData) ? rawData.toString(\"utf8\") : \"\";\n const message = JSON.parse(value) as Readonly<{ kind?: unknown; roomId?: unknown }>;\n if (message.kind === \"subscribe\" && typeof message.roomId === \"string\") {\n return { kind: \"subscribe\", roomId: message.roomId };\n }\n if (message.kind === \"unsubscribe\" && typeof message.roomId === \"string\") {\n return { kind: \"unsubscribe\", roomId: message.roomId };\n }\n throw new Error(\"Unsupported websocket client message.\");\n }\n}\n","import { Readable } from \"node:stream\";\n\nimport { ReadableStream } from \"node:stream/web\";\n\nimport type { BinaryBody } from \"@codemation/core\";\n\nexport class BinaryBodyNodeReadableFactory {\n constructor(private readonly body: BinaryBody) {}\n\n create(): Readable {\n if (this.body instanceof Uint8Array) {\n return Readable.from([this.body]);\n }\n if (this.body instanceof ArrayBuffer) {\n return Readable.from([new Uint8Array(this.body)]);\n }\n if (this.body instanceof ReadableStream) {\n return Readable.fromWeb(this.body);\n }\n return Readable.from(this.body);\n }\n}\n","import { createHash } from \"node:crypto\";\n\nimport { Transform } from \"node:stream\";\n\nexport class CountingSha256Transform extends Transform {\n private readonly hash = createHash(\"sha256\");\n private byteCount = 0;\n\n get size(): number {\n return this.byteCount;\n }\n\n get sha256(): string {\n return this.hash.digest(\"hex\");\n }\n\n override _transform(\n chunk: Buffer,\n _encoding: BufferEncoding,\n callback: (error?: Error | null, data?: Buffer) => void,\n ): void {\n this.byteCount += chunk.byteLength;\n this.hash.update(chunk);\n callback(null, chunk);\n }\n}\n","import { createReadStream, createWriteStream } from \"node:fs\";\n\nimport { mkdir, rm, stat } from \"node:fs/promises\";\n\nimport path from \"node:path\";\n\nimport { Readable } from \"node:stream\";\n\nimport { ReadableStream } from \"node:stream/web\";\n\nimport { pipeline } from \"node:stream/promises\";\n\nimport type {\n BinaryBody,\n BinaryStorage,\n BinaryStorageReadResult,\n BinaryStorageStatResult,\n BinaryStorageWriteResult,\n} from \"@codemation/core\";\n\nimport { BinaryBodyNodeReadableFactory } from \"./BinaryBodyNodeReadableFactory\";\nimport { CountingSha256Transform } from \"./CountingSha256Transform\";\n\nexport class LocalFilesystemBinaryStorage implements BinaryStorage {\n readonly driverName = \"filesystem\";\n\n constructor(private readonly baseDirectory: string) {}\n\n async write(args: { storageKey: string; body: BinaryBody }): Promise<BinaryStorageWriteResult> {\n const targetPath = this.resolveAbsolutePath(args.storageKey);\n await mkdir(path.dirname(targetPath), { recursive: true });\n const readable = new BinaryBodyNodeReadableFactory(args.body).create();\n const countingTransform = new CountingSha256Transform();\n const writable = createWriteStream(targetPath);\n await pipeline(readable, countingTransform, writable);\n return {\n storageKey: args.storageKey,\n size: countingTransform.size,\n sha256: countingTransform.sha256,\n };\n }\n\n async openReadStream(storageKey: string): Promise<BinaryStorageReadResult | undefined> {\n const targetPath = this.resolveAbsolutePath(storageKey);\n try {\n const fileStat = await stat(targetPath);\n return {\n body: Readable.toWeb(createReadStream(targetPath)) as ReadableStream<Uint8Array>,\n size: fileStat.size,\n };\n } catch {\n return undefined;\n }\n }\n\n async stat(storageKey: string): Promise<BinaryStorageStatResult> {\n const targetPath = this.resolveAbsolutePath(storageKey);\n try {\n const fileStat = await stat(targetPath);\n return {\n exists: true,\n size: fileStat.size,\n };\n } catch {\n return {\n exists: false,\n };\n }\n }\n\n async delete(storageKey: string): Promise<void> {\n await rm(this.resolveAbsolutePath(storageKey), { force: true });\n }\n\n private resolveAbsolutePath(storageKey: string): string {\n const absoluteBaseDirectory = path.resolve(this.baseDirectory);\n const targetPath = path.resolve(absoluteBaseDirectory, storageKey);\n if (!targetPath.startsWith(`${absoluteBaseDirectory}${path.sep}`) && targetPath !== absoluteBaseDirectory) {\n throw new Error(`Refused to access binary storage path outside base directory: ${storageKey}`);\n }\n return targetPath;\n }\n}\n\nexport { BinaryBodyNodeReadableFactory } from \"./BinaryBodyNodeReadableFactory\";\nexport { CountingSha256Transform } from \"./CountingSha256Transform\";\n","import { inject, injectable } from \"@codemation/core\";\n\nimport type {\n CredentialInstanceRecord,\n CredentialOAuth2MaterialMetadata,\n CredentialOAuth2MaterialRecord,\n CredentialOAuth2StateRecord,\n CredentialSecretMaterialRecord,\n CredentialStore,\n CredentialTestRecord,\n} from \"../../domain/credentials/CredentialServices\";\n\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\n@injectable()\nexport class PrismaCredentialStore implements CredentialStore {\n constructor(@inject(PrismaClient) private readonly prisma: PrismaClient) {}\n\n async listInstances(): Promise<ReadonlyArray<CredentialInstanceRecord>> {\n const rows = await this.prisma.credentialInstance.findMany({\n orderBy: { updatedAt: \"desc\" },\n });\n return rows.map((row) => this.toInstanceRecord(row));\n }\n\n async getInstance(instanceId: string): Promise<CredentialInstanceRecord | undefined> {\n const row = await this.prisma.credentialInstance.findUnique({\n where: { instanceId },\n });\n return row ? this.toInstanceRecord(row) : undefined;\n }\n\n async saveInstance(\n args: Readonly<{ instance: CredentialInstanceRecord; secretMaterial?: CredentialSecretMaterialRecord }>,\n ): Promise<void> {\n await this.prisma.$transaction(async (transaction) => {\n await transaction.credentialInstance.upsert({\n where: { instanceId: args.instance.instanceId },\n create: {\n instanceId: args.instance.instanceId,\n typeId: args.instance.typeId,\n displayName: args.instance.displayName,\n sourceKind: args.instance.sourceKind,\n publicConfigJson: JSON.stringify(args.instance.publicConfig),\n secretRefJson: JSON.stringify(args.instance.secretRef),\n tagsJson: JSON.stringify(args.instance.tags),\n setupStatus: args.instance.setupStatus,\n createdAt: args.instance.createdAt,\n updatedAt: args.instance.updatedAt,\n },\n update: {\n typeId: args.instance.typeId,\n displayName: args.instance.displayName,\n sourceKind: args.instance.sourceKind,\n publicConfigJson: JSON.stringify(args.instance.publicConfig),\n secretRefJson: JSON.stringify(args.instance.secretRef),\n tagsJson: JSON.stringify(args.instance.tags),\n setupStatus: args.instance.setupStatus,\n updatedAt: args.instance.updatedAt,\n },\n });\n if (args.secretMaterial) {\n await transaction.credentialSecretMaterial.upsert({\n where: { instanceId: args.secretMaterial.instanceId },\n create: {\n instanceId: args.secretMaterial.instanceId,\n encryptedJson: args.secretMaterial.encryptedJson,\n encryptionKeyId: args.secretMaterial.encryptionKeyId,\n schemaVersion: args.secretMaterial.schemaVersion,\n updatedAt: args.secretMaterial.updatedAt,\n },\n update: {\n encryptedJson: args.secretMaterial.encryptedJson,\n encryptionKeyId: args.secretMaterial.encryptionKeyId,\n schemaVersion: args.secretMaterial.schemaVersion,\n updatedAt: args.secretMaterial.updatedAt,\n },\n });\n }\n });\n }\n\n async deleteInstance(instanceId: string): Promise<void> {\n await this.prisma.$transaction(async (transaction) => {\n await transaction.credentialOAuth2State.deleteMany({ where: { instanceId } });\n await transaction.credentialOAuth2Material.deleteMany({ where: { instanceId } });\n await transaction.credentialTestResult.deleteMany({ where: { instanceId } });\n await transaction.credentialBinding.deleteMany({ where: { instanceId } });\n await transaction.credentialSecretMaterial.deleteMany({ where: { instanceId } });\n await transaction.credentialInstance.deleteMany({ where: { instanceId } });\n });\n }\n\n async getSecretMaterial(instanceId: string): Promise<CredentialSecretMaterialRecord | undefined> {\n const row = await this.prisma.credentialSecretMaterial.findUnique({\n where: { instanceId },\n });\n return row\n ? {\n instanceId: row.instanceId,\n encryptedJson: row.encryptedJson,\n encryptionKeyId: row.encryptionKeyId,\n schemaVersion: row.schemaVersion,\n updatedAt: row.updatedAt,\n }\n : undefined;\n }\n\n async createOAuth2State(record: CredentialOAuth2StateRecord): Promise<void> {\n await this.prisma.credentialOAuth2State.create({\n data: {\n state: record.state,\n instanceId: record.instanceId,\n codeVerifier: record.codeVerifier ?? null,\n providerId: record.providerId ?? null,\n requestedScopesJson: JSON.stringify(record.requestedScopes),\n createdAt: record.createdAt,\n expiresAt: record.expiresAt,\n },\n });\n }\n\n async consumeOAuth2State(state: string): Promise<CredentialOAuth2StateRecord | undefined> {\n return await this.prisma.$transaction(async (transaction) => {\n const row = await transaction.credentialOAuth2State.findUnique({\n where: { state },\n });\n if (!row) {\n return undefined;\n }\n await transaction.credentialOAuth2State.delete({\n where: { state },\n });\n return {\n state: row.state,\n instanceId: row.instanceId,\n codeVerifier: row.codeVerifier ?? undefined,\n providerId: row.providerId ?? undefined,\n requestedScopes: JSON.parse(row.requestedScopesJson) as ReadonlyArray<string>,\n createdAt: row.createdAt,\n expiresAt: row.expiresAt,\n };\n });\n }\n\n async getOAuth2Material(instanceId: string): Promise<CredentialOAuth2MaterialRecord | undefined> {\n const row = await this.prisma.credentialOAuth2Material.findUnique({\n where: { instanceId },\n });\n return row\n ? {\n instanceId: row.instanceId,\n encryptedJson: row.encryptedJson,\n encryptionKeyId: row.encryptionKeyId,\n schemaVersion: row.schemaVersion,\n providerId: row.providerId,\n connectedEmail: row.connectedEmail ?? undefined,\n connectedAt: row.connectedAt ?? undefined,\n scopes: JSON.parse(row.scopesJson) as ReadonlyArray<string>,\n updatedAt: row.updatedAt,\n }\n : undefined;\n }\n\n async saveOAuth2Material(\n args: Readonly<{\n instanceId: string;\n encryptedJson: string;\n encryptionKeyId: string;\n schemaVersion: number;\n metadata: CredentialOAuth2MaterialMetadata;\n }>,\n ): Promise<void> {\n await this.prisma.credentialOAuth2Material.upsert({\n where: { instanceId: args.instanceId },\n create: {\n instanceId: args.instanceId,\n encryptedJson: args.encryptedJson,\n encryptionKeyId: args.encryptionKeyId,\n schemaVersion: args.schemaVersion,\n providerId: args.metadata.providerId,\n connectedEmail: args.metadata.connectedEmail ?? null,\n connectedAt: args.metadata.connectedAt ?? null,\n scopesJson: JSON.stringify(args.metadata.scopes),\n updatedAt: args.metadata.updatedAt,\n },\n update: {\n encryptedJson: args.encryptedJson,\n encryptionKeyId: args.encryptionKeyId,\n schemaVersion: args.schemaVersion,\n providerId: args.metadata.providerId,\n connectedEmail: args.metadata.connectedEmail ?? null,\n connectedAt: args.metadata.connectedAt ?? null,\n scopesJson: JSON.stringify(args.metadata.scopes),\n updatedAt: args.metadata.updatedAt,\n },\n });\n }\n\n async deleteOAuth2Material(instanceId: string): Promise<void> {\n await this.prisma.credentialOAuth2Material.deleteMany({\n where: { instanceId },\n });\n }\n\n async upsertBinding(binding: import(\"@codemation/core\").CredentialBinding): Promise<void> {\n await this.prisma.credentialBinding.upsert({\n where: {\n workflowId_nodeId_slotKey: {\n workflowId: binding.key.workflowId,\n nodeId: binding.key.nodeId,\n slotKey: binding.key.slotKey,\n },\n },\n create: {\n workflowId: binding.key.workflowId,\n nodeId: binding.key.nodeId,\n slotKey: binding.key.slotKey,\n instanceId: binding.instanceId,\n updatedAt: binding.updatedAt,\n },\n update: {\n instanceId: binding.instanceId,\n updatedAt: binding.updatedAt,\n },\n });\n }\n\n async getBinding(\n key: import(\"@codemation/core\").CredentialBindingKey,\n ): Promise<import(\"@codemation/core\").CredentialBinding | undefined> {\n const row = await this.prisma.credentialBinding.findUnique({\n where: {\n workflowId_nodeId_slotKey: {\n workflowId: key.workflowId,\n nodeId: key.nodeId,\n slotKey: key.slotKey,\n },\n },\n });\n return row\n ? {\n key: {\n workflowId: row.workflowId,\n nodeId: row.nodeId,\n slotKey: row.slotKey,\n },\n instanceId: row.instanceId,\n updatedAt: row.updatedAt,\n }\n : undefined;\n }\n\n async listBindingsByWorkflowId(\n workflowId: string,\n ): Promise<ReadonlyArray<import(\"@codemation/core\").CredentialBinding>> {\n const rows = await this.prisma.credentialBinding.findMany({\n where: { workflowId },\n });\n return rows.map((row) => ({\n key: {\n workflowId: row.workflowId,\n nodeId: row.nodeId,\n slotKey: row.slotKey,\n },\n instanceId: row.instanceId,\n updatedAt: row.updatedAt,\n }));\n }\n\n async saveTestResult(record: CredentialTestRecord): Promise<void> {\n await this.prisma.credentialTestResult.create({\n data: {\n testId: record.testId,\n instanceId: record.instanceId,\n status: record.health.status,\n message: record.health.message ?? null,\n detailsJson: JSON.stringify(record.health.details ?? {}),\n testedAt: record.testedAt,\n expiresAt: record.expiresAt ?? null,\n },\n });\n }\n\n async getLatestTestResult(instanceId: string): Promise<CredentialTestRecord | undefined> {\n const row = await this.prisma.credentialTestResult.findFirst({\n where: { instanceId },\n orderBy: { testedAt: \"desc\" },\n });\n return row ? this.toTestRecord(row) : undefined;\n }\n\n async getLatestTestResults(instanceIds: ReadonlyArray<string>): Promise<ReadonlyMap<string, CredentialTestRecord>> {\n if (instanceIds.length === 0) {\n return new Map();\n }\n const rows = await this.prisma.credentialTestResult.findMany({\n where: {\n instanceId: {\n in: [...instanceIds],\n },\n },\n orderBy: [{ instanceId: \"asc\" }, { testedAt: \"desc\" }],\n });\n const latestByInstanceId = new Map<string, CredentialTestRecord>();\n for (const row of rows) {\n if (latestByInstanceId.has(row.instanceId)) {\n continue;\n }\n latestByInstanceId.set(row.instanceId, this.toTestRecord(row));\n }\n return latestByInstanceId;\n }\n\n private toInstanceRecord(\n row: Readonly<{\n instanceId: string;\n typeId: string;\n displayName: string;\n sourceKind: string;\n publicConfigJson: string;\n secretRefJson: string;\n tagsJson: string;\n setupStatus: string;\n createdAt: string;\n updatedAt: string;\n }>,\n ): CredentialInstanceRecord {\n return {\n instanceId: row.instanceId,\n typeId: row.typeId,\n displayName: row.displayName,\n sourceKind: row.sourceKind as CredentialInstanceRecord[\"sourceKind\"],\n publicConfig: JSON.parse(row.publicConfigJson) as CredentialInstanceRecord[\"publicConfig\"],\n secretRef: JSON.parse(row.secretRefJson) as CredentialInstanceRecord[\"secretRef\"],\n tags: JSON.parse(row.tagsJson) as CredentialInstanceRecord[\"tags\"],\n setupStatus: row.setupStatus as CredentialInstanceRecord[\"setupStatus\"],\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n\n private toTestRecord(\n row: Readonly<{\n testId: string;\n instanceId: string;\n status: string;\n message: string | null;\n detailsJson: string;\n testedAt: string;\n expiresAt: string | null;\n }>,\n ): CredentialTestRecord {\n return {\n testId: row.testId,\n instanceId: row.instanceId,\n health: {\n status: row.status as CredentialTestRecord[\"health\"][\"status\"],\n message: row.message ?? undefined,\n testedAt: row.testedAt,\n expiresAt: row.expiresAt ?? undefined,\n details: JSON.parse(row.detailsJson) as CredentialTestRecord[\"health\"][\"details\"],\n },\n testedAt: row.testedAt,\n expiresAt: row.expiresAt ?? undefined,\n };\n }\n}\n","import { injectable } from \"@codemation/core\";\n\nimport type {\n CredentialInstanceRecord,\n CredentialOAuth2MaterialMetadata,\n CredentialOAuth2MaterialRecord,\n CredentialOAuth2StateRecord,\n CredentialSecretMaterialRecord,\n CredentialStore,\n CredentialTestRecord,\n} from \"../../domain/credentials/CredentialServices\";\n\n@injectable()\nexport class InMemoryCredentialStore implements CredentialStore {\n private readonly instancesById = new Map<string, CredentialInstanceRecord>();\n private readonly secretsByInstanceId = new Map<string, CredentialSecretMaterialRecord>();\n private readonly oauth2MaterialsByInstanceId = new Map<string, CredentialOAuth2MaterialRecord>();\n private readonly oauth2StatesByState = new Map<string, CredentialOAuth2StateRecord>();\n private readonly bindingsByKey = new Map<string, import(\"@codemation/core\").CredentialBinding>();\n private readonly testRecordsByInstanceId = new Map<string, CredentialTestRecord>();\n\n async listInstances(): Promise<ReadonlyArray<CredentialInstanceRecord>> {\n return [...this.instancesById.values()].sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));\n }\n\n async getInstance(instanceId: string): Promise<CredentialInstanceRecord | undefined> {\n return this.instancesById.get(instanceId);\n }\n\n async saveInstance(\n args: Readonly<{ instance: CredentialInstanceRecord; secretMaterial?: CredentialSecretMaterialRecord }>,\n ): Promise<void> {\n this.instancesById.set(args.instance.instanceId, args.instance);\n if (args.secretMaterial) {\n this.secretsByInstanceId.set(args.instance.instanceId, args.secretMaterial);\n }\n }\n\n async deleteInstance(instanceId: string): Promise<void> {\n this.instancesById.delete(instanceId);\n this.secretsByInstanceId.delete(instanceId);\n this.oauth2MaterialsByInstanceId.delete(instanceId);\n this.testRecordsByInstanceId.delete(instanceId);\n for (const [state, record] of this.oauth2StatesByState.entries()) {\n if (record.instanceId === instanceId) {\n this.oauth2StatesByState.delete(state);\n }\n }\n for (const [key, binding] of this.bindingsByKey.entries()) {\n if (binding.instanceId === instanceId) {\n this.bindingsByKey.delete(key);\n }\n }\n }\n\n async getSecretMaterial(instanceId: string): Promise<CredentialSecretMaterialRecord | undefined> {\n return this.secretsByInstanceId.get(instanceId);\n }\n\n async createOAuth2State(record: CredentialOAuth2StateRecord): Promise<void> {\n this.oauth2StatesByState.set(record.state, record);\n }\n\n async consumeOAuth2State(state: string): Promise<CredentialOAuth2StateRecord | undefined> {\n const record = this.oauth2StatesByState.get(state);\n if (!record) {\n return undefined;\n }\n this.oauth2StatesByState.delete(state);\n return record;\n }\n\n async getOAuth2Material(instanceId: string): Promise<CredentialOAuth2MaterialRecord | undefined> {\n return this.oauth2MaterialsByInstanceId.get(instanceId);\n }\n\n async saveOAuth2Material(\n args: Readonly<{\n instanceId: string;\n encryptedJson: string;\n encryptionKeyId: string;\n schemaVersion: number;\n metadata: CredentialOAuth2MaterialMetadata;\n }>,\n ): Promise<void> {\n this.oauth2MaterialsByInstanceId.set(args.instanceId, {\n instanceId: args.instanceId,\n encryptedJson: args.encryptedJson,\n encryptionKeyId: args.encryptionKeyId,\n schemaVersion: args.schemaVersion,\n providerId: args.metadata.providerId,\n connectedEmail: args.metadata.connectedEmail,\n connectedAt: args.metadata.connectedAt,\n scopes: args.metadata.scopes,\n updatedAt: args.metadata.updatedAt,\n });\n }\n\n async deleteOAuth2Material(instanceId: string): Promise<void> {\n this.oauth2MaterialsByInstanceId.delete(instanceId);\n }\n\n async upsertBinding(binding: import(\"@codemation/core\").CredentialBinding): Promise<void> {\n this.bindingsByKey.set(this.toBindingKey(binding.key), binding);\n }\n\n async getBinding(\n key: import(\"@codemation/core\").CredentialBindingKey,\n ): Promise<import(\"@codemation/core\").CredentialBinding | undefined> {\n return this.bindingsByKey.get(this.toBindingKey(key));\n }\n\n async listBindingsByWorkflowId(\n workflowId: string,\n ): Promise<ReadonlyArray<import(\"@codemation/core\").CredentialBinding>> {\n return [...this.bindingsByKey.values()].filter((binding) => binding.key.workflowId === workflowId);\n }\n\n async saveTestResult(record: CredentialTestRecord): Promise<void> {\n this.testRecordsByInstanceId.set(record.instanceId, record);\n }\n\n async getLatestTestResult(instanceId: string): Promise<CredentialTestRecord | undefined> {\n return this.testRecordsByInstanceId.get(instanceId);\n }\n\n async getLatestTestResults(instanceIds: ReadonlyArray<string>): Promise<ReadonlyMap<string, CredentialTestRecord>> {\n const entries = instanceIds\n .map((instanceId) => [instanceId, this.testRecordsByInstanceId.get(instanceId)] as const)\n .filter((entry): entry is readonly [string, CredentialTestRecord] => entry[1] !== undefined);\n return new Map(entries);\n }\n\n private toBindingKey(key: import(\"@codemation/core\").CredentialBindingKey): string {\n return `${key.workflowId}:${key.nodeId}:${key.slotKey}`;\n }\n}\n\nexport { PrismaCredentialStore } from \"./PrismaCredentialStore\";\n","import type { PersistedTriggerSetupState, TriggerInstanceId, TriggerSetupStateRepository } from \"@codemation/core\";\nimport { injectable } from \"@codemation/core\";\n\n@injectable()\nexport class InMemoryTriggerSetupStateRepository implements TriggerSetupStateRepository {\n private readonly statesByKey = new Map<string, PersistedTriggerSetupState>();\n\n async load(trigger: TriggerInstanceId): Promise<PersistedTriggerSetupState | undefined> {\n return this.statesByKey.get(this.toKey(trigger));\n }\n\n async save(state: PersistedTriggerSetupState): Promise<void> {\n this.statesByKey.set(this.toKey(state.trigger), state);\n }\n\n async delete(trigger: TriggerInstanceId): Promise<void> {\n this.statesByKey.delete(this.toKey(trigger));\n }\n\n private toKey(trigger: TriggerInstanceId): string {\n return `${trigger.workflowId}:${trigger.nodeId}`;\n }\n}\n","import { injectable } from \"@codemation/core\";\nimport type {\n WorkflowActivationRepository,\n WorkflowActivationRow,\n} from \"../../domain/workflows/WorkflowActivationRepository\";\n\n@injectable()\nexport class InMemoryWorkflowActivationRepository implements WorkflowActivationRepository {\n private readonly rows = new Map<string, boolean>();\n\n async loadAll(): Promise<ReadonlyArray<WorkflowActivationRow>> {\n return [...this.rows.entries()].map(([workflowId, isActive]) => ({ workflowId, isActive }));\n }\n\n async upsert(workflowId: string, active: boolean): Promise<void> {\n this.rows.set(decodeURIComponent(workflowId), active);\n }\n}\n","import { injectable } from \"@codemation/core\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { WorkflowDebuggerOverlayState } from \"../../domain/workflows/WorkflowDebuggerOverlayState\";\n\n@injectable()\nexport class InMemoryWorkflowDebuggerOverlayRepository implements WorkflowDebuggerOverlayRepository {\n private readonly overlays = new Map<string, WorkflowDebuggerOverlayState>();\n\n async load(workflowId: string): Promise<WorkflowDebuggerOverlayState | undefined> {\n return this.overlays.get(decodeURIComponent(workflowId));\n }\n\n async save(state: WorkflowDebuggerOverlayState): Promise<void> {\n this.overlays.set(state.workflowId, state);\n }\n}\n","import {\n RunFinishedAtFactory,\n type NodeId,\n type NodeOutputs,\n type ParentExecutionRef,\n type PersistedRunState,\n type RunId,\n type RunPruneCandidate,\n type RunSummary,\n type WorkflowExecutionRepository,\n type WorkflowId,\n} from \"@codemation/core\";\nimport { injectable } from \"@codemation/core\";\nimport { RunSummaryMapper } from \"@codemation/core/bootstrap\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\n\n@injectable()\nexport class InMemoryWorkflowRunRepository implements WorkflowRunRepository, WorkflowExecutionRepository {\n private readonly runs = new Map<RunId, PersistedRunState>();\n\n async createRun(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: PersistedRunState[\"executionOptions\"];\n control?: PersistedRunState[\"control\"];\n workflowSnapshot?: PersistedRunState[\"workflowSnapshot\"];\n mutableState?: PersistedRunState[\"mutableState\"];\n policySnapshot?: PersistedRunState[\"policySnapshot\"];\n engineCounters?: PersistedRunState[\"engineCounters\"];\n }): Promise<void> {\n this.runs.set(args.runId, {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n engineCounters: args.engineCounters,\n status: \"running\",\n queue: [],\n outputsByNode: {} as Record<NodeId, NodeOutputs>,\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n });\n }\n\n async load(runId: string): Promise<PersistedRunState | undefined> {\n return this.runs.get(decodeURIComponent(runId) as RunId);\n }\n\n async save(state: PersistedRunState): Promise<void> {\n this.runs.set(state.runId, state);\n }\n\n async deleteRun(runId: RunId): Promise<void> {\n this.runs.delete(runId);\n }\n\n async listRuns(args: Readonly<{ workflowId?: string; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {\n const limit = args?.limit ?? 50;\n const workflowId = args?.workflowId ? decodeURIComponent(args.workflowId) : undefined;\n const summaries = [...this.runs.values()]\n .filter((s) => (workflowId ? s.workflowId === workflowId : true))\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, limit)\n .map((s) => RunSummaryMapper.fromPersistedState(s));\n return summaries;\n }\n\n async listRunsOlderThan(\n args: Readonly<{ beforeIso: string; limit?: number }>,\n ): Promise<ReadonlyArray<RunPruneCandidate>> {\n const limit = args.limit ?? 100;\n const out: RunPruneCandidate[] = [];\n for (const s of this.runs.values()) {\n if (s.status !== \"completed\" && s.status !== \"failed\") continue;\n const finishedAt = RunFinishedAtFactory.resolveIso(s);\n if (!finishedAt || finishedAt >= args.beforeIso) continue;\n out.push({\n runId: s.runId,\n workflowId: s.workflowId,\n startedAt: s.startedAt,\n finishedAt,\n });\n }\n out.sort((a, b) => a.finishedAt.localeCompare(b.finishedAt));\n return out.slice(0, limit);\n }\n}\n","import { PGlite } from \"@electric-sql/pglite\";\nimport { injectable } from \"@codemation/core\";\nimport { PrismaPg } from \"@prisma/adapter-pg\";\nimport { PrismaPGlite } from \"pglite-prisma-adapter\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\nexport type PglitePrismaClients = Readonly<{\n prismaClient: PrismaClient;\n pglite: PGlite;\n}>;\n\n@injectable()\nexport class PrismaClientFactory {\n createPostgres(databaseUrl: string): PrismaClient {\n const adapter = new PrismaPg({ connectionString: databaseUrl });\n return new PrismaClient({ adapter });\n }\n\n async createPglite(dataDir: string): Promise<PglitePrismaClients> {\n const pglite = new PGlite(dataDir);\n await pglite.waitReady;\n const adapter = new PrismaPGlite(pglite);\n const prismaClient = new PrismaClient({ adapter });\n return { prismaClient, pglite };\n }\n}\n","import type { PersistedTriggerSetupState, TriggerInstanceId, TriggerSetupStateRepository } from \"@codemation/core\";\nimport { inject, injectable } from \"@codemation/core\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\ntype TriggerSetupStateJson = Readonly<{\n state: PersistedTriggerSetupState[\"state\"];\n}>;\n\n@injectable()\nexport class PrismaTriggerSetupStateRepository implements TriggerSetupStateRepository {\n constructor(@inject(PrismaClient) private readonly prisma: PrismaClient) {}\n\n async load(trigger: TriggerInstanceId): Promise<PersistedTriggerSetupState | undefined> {\n const row = await this.prisma.triggerSetupState.findUnique({\n where: {\n workflowId_nodeId: {\n workflowId: trigger.workflowId,\n nodeId: trigger.nodeId,\n },\n },\n });\n if (!row) {\n return undefined;\n }\n return {\n trigger: {\n workflowId: row.workflowId,\n nodeId: row.nodeId,\n },\n updatedAt: row.updatedAt,\n state: (JSON.parse(row.stateJson) as TriggerSetupStateJson).state,\n };\n }\n\n async save(state: PersistedTriggerSetupState): Promise<void> {\n await this.prisma.triggerSetupState.upsert({\n where: {\n workflowId_nodeId: {\n workflowId: state.trigger.workflowId,\n nodeId: state.trigger.nodeId,\n },\n },\n create: {\n workflowId: state.trigger.workflowId,\n nodeId: state.trigger.nodeId,\n updatedAt: state.updatedAt,\n stateJson: JSON.stringify({\n state: state.state,\n } satisfies TriggerSetupStateJson),\n },\n update: {\n updatedAt: state.updatedAt,\n stateJson: JSON.stringify({\n state: state.state,\n } satisfies TriggerSetupStateJson),\n },\n });\n }\n\n async delete(trigger: TriggerInstanceId): Promise<void> {\n await this.prisma.triggerSetupState.deleteMany({\n where: {\n workflowId: trigger.workflowId,\n nodeId: trigger.nodeId,\n },\n });\n }\n}\n","import { inject, injectable } from \"@codemation/core\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\nimport type {\n WorkflowActivationRepository,\n WorkflowActivationRow,\n} from \"../../domain/workflows/WorkflowActivationRepository\";\n\n@injectable()\nexport class PrismaWorkflowActivationRepository implements WorkflowActivationRepository {\n constructor(@inject(PrismaClient) private readonly prisma: PrismaClient) {}\n\n async loadAll(): Promise<ReadonlyArray<WorkflowActivationRow>> {\n const rows = await this.prisma.workflowActivation.findMany();\n return rows.map((row) => ({\n workflowId: row.workflowId,\n isActive: row.isActive,\n }));\n }\n\n async upsert(workflowId: string, active: boolean): Promise<void> {\n const id = decodeURIComponent(workflowId);\n const updatedAt = new Date().toISOString();\n await this.prisma.workflowActivation.upsert({\n where: { workflowId: id },\n create: {\n workflowId: id,\n isActive: active,\n updatedAt,\n },\n update: {\n isActive: active,\n updatedAt,\n },\n });\n }\n}\n","import type { RunCurrentState } from \"@codemation/core\";\nimport { inject, injectable } from \"@codemation/core\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { WorkflowDebuggerOverlayState } from \"../../domain/workflows/WorkflowDebuggerOverlayState\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\ntype DebuggerOverlayStateJson = Readonly<{\n currentState: RunCurrentState;\n}>;\n\n@injectable()\nexport class PrismaWorkflowDebuggerOverlayRepository implements WorkflowDebuggerOverlayRepository {\n constructor(@inject(PrismaClient) private readonly prisma: PrismaClient) {}\n\n async load(workflowId: string): Promise<WorkflowDebuggerOverlayState | undefined> {\n const decodedWorkflowId = decodeURIComponent(workflowId);\n const row = await this.prisma.workflowDebuggerOverlay.findUnique({\n where: { workflowId: decodedWorkflowId },\n });\n if (!row) {\n return undefined;\n }\n return this.rowToState(row);\n }\n\n async save(state: WorkflowDebuggerOverlayState): Promise<void> {\n await this.prisma.workflowDebuggerOverlay.upsert({\n where: { workflowId: state.workflowId },\n create: {\n workflowId: state.workflowId,\n updatedAt: state.updatedAt,\n copiedFromRunId: state.copiedFromRunId ?? null,\n stateJson: JSON.stringify(this.toStateJson(state)),\n },\n update: {\n updatedAt: state.updatedAt,\n copiedFromRunId: state.copiedFromRunId ?? null,\n stateJson: JSON.stringify(this.toStateJson(state)),\n },\n });\n }\n\n private rowToState(\n row: Readonly<{\n workflowId: string;\n updatedAt: string;\n copiedFromRunId: string | null;\n stateJson: string;\n }>,\n ): WorkflowDebuggerOverlayState {\n const parsed = JSON.parse(row.stateJson) as DebuggerOverlayStateJson;\n return {\n workflowId: row.workflowId,\n updatedAt: row.updatedAt,\n copiedFromRunId: row.copiedFromRunId ?? undefined,\n currentState: parsed.currentState,\n };\n }\n\n private toStateJson(state: WorkflowDebuggerOverlayState): DebuggerOverlayStateJson {\n return {\n currentState: state.currentState,\n };\n }\n}\n","import type {\n NodeId,\n NodeOutputs,\n ParentExecutionRef,\n PersistedRunState,\n RunId,\n RunPruneCandidate,\n RunSummary,\n WorkflowExecutionRepository,\n WorkflowId,\n} from \"@codemation/core\";\nimport { inject, injectable } from \"@codemation/core\";\nimport type { WorkflowRunRepository } from \"../../domain/runs/WorkflowRunRepository\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\n/** JSON blob stored in stateJson: workflowSnapshot, mutableState, pending, queue, outputsByNode, nodeSnapshotsByNodeId, connectionInvocations, engineCounters */\ninterface StateJsonBlob {\n control?: PersistedRunState[\"control\"];\n workflowSnapshot?: PersistedRunState[\"workflowSnapshot\"];\n mutableState?: PersistedRunState[\"mutableState\"];\n policySnapshot?: PersistedRunState[\"policySnapshot\"];\n engineCounters?: PersistedRunState[\"engineCounters\"];\n pending?: PersistedRunState[\"pending\"];\n queue: PersistedRunState[\"queue\"];\n outputsByNode: Record<NodeId, NodeOutputs>;\n nodeSnapshotsByNodeId: PersistedRunState[\"nodeSnapshotsByNodeId\"];\n connectionInvocations?: PersistedRunState[\"connectionInvocations\"];\n}\n\n@injectable()\nexport class PrismaWorkflowRunRepository implements WorkflowRunRepository, WorkflowExecutionRepository {\n constructor(@inject(PrismaClient) private readonly prisma: PrismaClient) {}\n\n async createRun(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: PersistedRunState[\"executionOptions\"];\n control?: PersistedRunState[\"control\"];\n workflowSnapshot?: PersistedRunState[\"workflowSnapshot\"];\n mutableState?: PersistedRunState[\"mutableState\"];\n policySnapshot?: PersistedRunState[\"policySnapshot\"];\n engineCounters?: PersistedRunState[\"engineCounters\"];\n }): Promise<void> {\n const now = new Date().toISOString();\n const state: PersistedRunState = {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n engineCounters: args.engineCounters,\n status: \"running\",\n queue: [],\n outputsByNode: {} as Record<NodeId, NodeOutputs>,\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n };\n const stateJson = this.serializeStateBlob(state);\n await this.prisma.run.create({\n data: {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n status: \"running\",\n parentJson: args.parent ? JSON.stringify(args.parent) : null,\n executionOptionsJson: args.executionOptions ? JSON.stringify(args.executionOptions) : null,\n updatedAt: now,\n stateJson,\n },\n });\n }\n\n async load(runId: string): Promise<PersistedRunState | undefined> {\n const id = decodeURIComponent(runId) as RunId;\n const row = await this.prisma.run.findUnique({ where: { runId: id } });\n if (!row) return undefined;\n return this.rowToPersistedRunState(row);\n }\n\n async save(state: PersistedRunState): Promise<void> {\n const now = new Date().toISOString();\n const stateJson = this.serializeStateBlob(state);\n await this.prisma.run.upsert({\n where: { runId: state.runId },\n create: {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: state.status,\n parentJson: state.parent ? JSON.stringify(state.parent) : null,\n executionOptionsJson: state.executionOptions ? JSON.stringify(state.executionOptions) : null,\n updatedAt: now,\n stateJson,\n },\n update: {\n status: state.status,\n parentJson: state.parent ? JSON.stringify(state.parent) : null,\n executionOptionsJson: state.executionOptions ? JSON.stringify(state.executionOptions) : null,\n updatedAt: now,\n stateJson,\n },\n });\n }\n\n async listRuns(args: Readonly<{ workflowId?: string; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {\n const limit = args?.limit ?? 50;\n const workflowId = args?.workflowId ? decodeURIComponent(args.workflowId) : undefined;\n const rows = await this.prisma.run.findMany({\n where: workflowId ? { workflowId } : undefined,\n orderBy: { startedAt: \"desc\" },\n take: limit,\n });\n return rows.map((r) => this.rowToRunSummary(r));\n }\n\n async deleteRun(runId: RunId): Promise<void> {\n const id = decodeURIComponent(runId);\n await this.prisma.run.delete({ where: { runId: id } });\n }\n\n async listRunsOlderThan(\n args: Readonly<{ beforeIso: string; limit?: number }>,\n ): Promise<ReadonlyArray<RunPruneCandidate>> {\n const limit = args.limit ?? 100;\n const rows = await this.prisma.run.findMany({\n where: {\n status: { in: [\"completed\", \"failed\"] },\n updatedAt: { lt: args.beforeIso },\n },\n orderBy: { updatedAt: \"asc\" },\n take: limit,\n });\n return rows.map((r) => this.rowToPruneCandidate(r));\n }\n\n private serializeStateBlob(state: PersistedRunState): string {\n const blob: StateJsonBlob = {\n control: state.control,\n workflowSnapshot: state.workflowSnapshot,\n mutableState: state.mutableState,\n policySnapshot: state.policySnapshot,\n engineCounters: state.engineCounters,\n pending: state.pending,\n queue: state.queue,\n outputsByNode: state.outputsByNode,\n nodeSnapshotsByNodeId: state.nodeSnapshotsByNodeId,\n connectionInvocations: state.connectionInvocations,\n };\n return JSON.stringify(blob);\n }\n\n private parseStateBlob(json: string): StateJsonBlob {\n const parsed = JSON.parse(json) as StateJsonBlob;\n return {\n control: parsed.control,\n workflowSnapshot: parsed.workflowSnapshot,\n mutableState: parsed.mutableState,\n policySnapshot: parsed.policySnapshot,\n engineCounters: parsed.engineCounters,\n pending: parsed.pending,\n queue: parsed.queue ?? [],\n outputsByNode: (parsed.outputsByNode ?? {}) as Record<NodeId, NodeOutputs>,\n nodeSnapshotsByNodeId: parsed.nodeSnapshotsByNodeId ?? {},\n connectionInvocations: parsed.connectionInvocations,\n };\n }\n\n private rowToPersistedRunState(row: {\n runId: string;\n workflowId: string;\n startedAt: string;\n status: string;\n parentJson: string | null;\n executionOptionsJson: string | null;\n stateJson: string;\n }): PersistedRunState {\n const blob = this.parseStateBlob(row.stateJson);\n return {\n runId: row.runId as RunId,\n workflowId: row.workflowId as WorkflowId,\n startedAt: row.startedAt,\n status: row.status as PersistedRunState[\"status\"],\n parent: row.parentJson ? (JSON.parse(row.parentJson) as ParentExecutionRef) : undefined,\n executionOptions: row.executionOptionsJson\n ? (JSON.parse(row.executionOptionsJson) as PersistedRunState[\"executionOptions\"])\n : undefined,\n control: blob.control,\n workflowSnapshot: blob.workflowSnapshot,\n mutableState: blob.mutableState,\n policySnapshot: blob.policySnapshot,\n engineCounters: blob.engineCounters,\n pending: blob.pending,\n queue: blob.queue,\n outputsByNode: blob.outputsByNode,\n nodeSnapshotsByNodeId: blob.nodeSnapshotsByNodeId,\n connectionInvocations: blob.connectionInvocations,\n };\n }\n\n private rowToPruneCandidate(row: {\n runId: string;\n workflowId: string;\n startedAt: string;\n updatedAt: string;\n }): RunPruneCandidate {\n return {\n runId: row.runId as RunId,\n workflowId: row.workflowId as WorkflowId,\n startedAt: row.startedAt,\n finishedAt: row.updatedAt,\n };\n }\n\n private rowToRunSummary(row: {\n runId: string;\n workflowId: string;\n startedAt: string;\n status: string;\n parentJson: string | null;\n executionOptionsJson: string | null;\n updatedAt: string;\n }): RunSummary {\n const status = row.status as RunSummary[\"status\"];\n const finishedAt = status === \"completed\" || status === \"failed\" ? row.updatedAt : undefined;\n return {\n runId: row.runId as RunId,\n workflowId: row.workflowId as WorkflowId,\n startedAt: row.startedAt,\n status,\n finishedAt,\n parent: row.parentJson ? (JSON.parse(row.parentJson) as ParentExecutionRef) : undefined,\n executionOptions: row.executionOptionsJson\n ? (JSON.parse(row.executionOptionsJson) as RunSummary[\"executionOptions\"])\n : undefined,\n };\n }\n}\n","import type { ResolvedDatabasePersistence } from \"./DatabasePersistenceResolver\";\nimport type { CodemationSchedulerKind } from \"../../presentation/config/CodemationConfig\";\n\n/**\n * Ensures scheduler and database selections are compatible (e.g. BullMQ requires shared TCP PostgreSQL).\n */\nexport class SchedulerPersistenceCompatibilityValidator {\n validate(args: Readonly<{ schedulerKind: CodemationSchedulerKind; persistence: ResolvedDatabasePersistence }>): void {\n if (args.schedulerKind === \"bullmq\" && args.persistence.kind === \"none\") {\n throw new Error(\n \"BullMQ requires PostgreSQL persistence. Configure runtime.database with a postgresql URL (embedded PGlite is not compatible with BullMQ).\",\n );\n }\n if (args.schedulerKind === \"bullmq\" && args.persistence.kind === \"pglite\") {\n throw new Error(\n 'BullMQ requires a shared PostgreSQL database. PGlite cannot be used with the BullMQ scheduler. Set runtime.database.kind to \"postgresql\" with a PostgreSQL URL, or use the local scheduler when using PGlite.',\n );\n }\n }\n}\n","import { BullmqScheduler } from \"@codemation/queue-bullmq\";\nimport type { WorkerRuntimeScheduler } from \"../../infrastructure/runtime/WorkerRuntimeScheduler\";\nimport type { ResolvedDatabasePersistence } from \"../../infrastructure/persistence/DatabasePersistenceResolver\";\nimport { DatabasePersistenceResolver } from \"../../infrastructure/persistence/DatabasePersistenceResolver\";\nimport { SchedulerPersistenceCompatibilityValidator } from \"../../infrastructure/persistence/SchedulerPersistenceCompatibilityValidator\";\nimport type {\n CodemationApplicationRuntimeConfig,\n CodemationEventBusKind,\n CodemationSchedulerKind,\n} from \"../../presentation/config/CodemationConfig\";\n\nexport type ResolvedImplementationSelection = Readonly<{\n databasePersistence: ResolvedDatabasePersistence;\n eventBusKind: CodemationEventBusKind;\n queuePrefix: string;\n redisUrl?: string;\n schedulerKind: CodemationSchedulerKind;\n workerRuntimeScheduler?: WorkerRuntimeScheduler;\n}>;\n\nexport class ResolvedImplementationSelectionFactory {\n constructor(\n private readonly databasePersistenceResolver: DatabasePersistenceResolver = new DatabasePersistenceResolver(),\n private readonly schedulerPersistenceCompatibilityValidator: SchedulerPersistenceCompatibilityValidator = new SchedulerPersistenceCompatibilityValidator(),\n ) {}\n\n resolve(\n args: Readonly<{\n consumerRoot: string;\n runtimeConfig: CodemationApplicationRuntimeConfig;\n env: Readonly<NodeJS.ProcessEnv>;\n }>,\n ): ResolvedImplementationSelection {\n const databasePersistence = this.databasePersistenceResolver.resolve({\n runtimeConfig: args.runtimeConfig,\n env: args.env,\n consumerRoot: args.consumerRoot,\n });\n const redisUrl = args.runtimeConfig.eventBus?.redisUrl ?? args.env.REDIS_URL;\n const schedulerKind = this.resolveSchedulerKind(args.runtimeConfig, args.env, redisUrl);\n const eventBusKind = this.resolveEventBusKind(args.runtimeConfig, args.env, schedulerKind, redisUrl);\n const queuePrefix =\n args.runtimeConfig.scheduler?.queuePrefix ??\n args.runtimeConfig.eventBus?.queuePrefix ??\n args.env.QUEUE_PREFIX ??\n \"codemation\";\n if (schedulerKind === \"bullmq\" && eventBusKind !== \"redis\") {\n throw new Error(\n \"BullMQ scheduling requires a Redis event bus so worker events can be forwarded to connected clients.\",\n );\n }\n if (eventBusKind === \"redis\" && !redisUrl) {\n throw new Error(\"Redis event bus requires runtime.eventBus.redisUrl or REDIS_URL.\");\n }\n this.schedulerPersistenceCompatibilityValidator.validate({ schedulerKind, persistence: databasePersistence });\n const workerRuntimeScheduler =\n schedulerKind === \"bullmq\"\n ? new BullmqScheduler({ url: this.requireRedisUrl(redisUrl) }, queuePrefix)\n : undefined;\n return {\n databasePersistence,\n eventBusKind,\n queuePrefix,\n redisUrl,\n schedulerKind,\n workerRuntimeScheduler,\n };\n }\n\n private resolveSchedulerKind(\n runtimeConfig: CodemationApplicationRuntimeConfig,\n env: Readonly<NodeJS.ProcessEnv>,\n redisUrl: string | undefined,\n ): CodemationSchedulerKind {\n const configuredKind = runtimeConfig.scheduler?.kind ?? this.readSchedulerKind(env.CODEMATION_SCHEDULER);\n if (configuredKind) {\n return configuredKind;\n }\n return redisUrl ? \"bullmq\" : \"local\";\n }\n\n private resolveEventBusKind(\n runtimeConfig: CodemationApplicationRuntimeConfig,\n env: Readonly<NodeJS.ProcessEnv>,\n schedulerKind: CodemationSchedulerKind,\n redisUrl: string | undefined,\n ): CodemationEventBusKind {\n const configuredKind = runtimeConfig.eventBus?.kind ?? this.readEventBusKind(env.CODEMATION_EVENT_BUS);\n if (configuredKind) {\n return configuredKind;\n }\n if (schedulerKind === \"bullmq\") {\n return \"redis\";\n }\n return redisUrl ? \"redis\" : \"memory\";\n }\n\n private readSchedulerKind(value: string | undefined): CodemationSchedulerKind | undefined {\n if (value === \"local\" || value === \"bullmq\") {\n return value;\n }\n return undefined;\n }\n\n private readEventBusKind(value: string | undefined): CodemationEventBusKind | undefined {\n if (value === \"memory\" || value === \"redis\") {\n return value;\n }\n return undefined;\n }\n\n private requireRedisUrl(redisUrl: string | undefined): string {\n if (!redisUrl) {\n throw new Error(\"Redis-backed runtime requires runtime.eventBus.redisUrl or REDIS_URL.\");\n }\n return redisUrl;\n }\n}\n","import type { AppConfig } from \"../../presentation/config/AppConfig\";\nimport type { CodemationAuthConfig } from \"../../presentation/config/CodemationAuthConfig\";\nimport type { CodemationApplicationRuntimeConfig } from \"../../presentation/config/CodemationConfig\";\nimport type { CodemationWhitelabelConfig } from \"../../presentation/config/CodemationWhitelabelConfig\";\nimport { ResolvedImplementationSelectionFactory } from \"./ResolvedImplementationSelectionFactory\";\n\nexport class AppConfigFactory {\n constructor(\n private readonly implementationSelectionFactory: ResolvedImplementationSelectionFactory = new ResolvedImplementationSelectionFactory(),\n ) {}\n\n create(\n args: Readonly<{\n repoRoot: string;\n consumerRoot: string;\n env: NodeJS.ProcessEnv;\n workflowSources: ReadonlyArray<string>;\n runtimeConfig: CodemationApplicationRuntimeConfig;\n authConfig: CodemationAuthConfig | undefined;\n whitelabelConfig: CodemationWhitelabelConfig;\n }>,\n ): AppConfig {\n const selection = this.implementationSelectionFactory.resolve({\n consumerRoot: args.consumerRoot,\n env: args.env,\n runtimeConfig: args.runtimeConfig,\n });\n const workerQueues = args.runtimeConfig.scheduler?.workerQueues ?? [];\n const queuePrefix = args.runtimeConfig.scheduler?.queuePrefix ?? args.runtimeConfig.eventBus?.queuePrefix;\n const databaseUrl =\n selection.databasePersistence.kind === \"postgresql\"\n ? selection.databasePersistence.databaseUrl\n : args.runtimeConfig.database?.url?.trim() || undefined;\n\n return {\n consumerRoot: args.consumerRoot,\n repoRoot: args.repoRoot,\n env: args.env,\n workflowSources: [...args.workflowSources],\n databaseUrl,\n database: args.runtimeConfig.database,\n scheduler: {\n kind: selection.schedulerKind,\n queuePrefix,\n workerQueues,\n redisUrl: selection.redisUrl,\n },\n eventing: {\n kind: selection.eventBusKind,\n queuePrefix,\n redisUrl: selection.redisUrl,\n },\n auth: args.authConfig,\n whitelabel: args.whitelabelConfig,\n };\n }\n}\n","import type { RunEventBus, RunEventSubscription } from \"@codemation/core\";\nimport { CoreTokens, inject, injectable } from \"@codemation/core\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport type { WorkflowWebsocketPublisher } from \"./WorkflowWebsocketPublisher\";\n\n@injectable()\nexport class WorkflowRunEventWebsocketRelay {\n private subscription: RunEventSubscription | null = null;\n\n constructor(\n @inject(ApplicationTokens.WorkflowWebsocketPublisher)\n private readonly workflowWebsocketPublisher: WorkflowWebsocketPublisher,\n @inject(CoreTokens.RunEventBus)\n private readonly runEventBus: RunEventBus,\n ) {}\n\n async start(): Promise<void> {\n if (this.subscription) {\n return;\n }\n this.subscription = await this.runEventBus.subscribe(async (event) => {\n await this.workflowWebsocketPublisher.publishToRoom(event.workflowId, {\n kind: \"event\",\n event,\n });\n });\n }\n\n async stop(): Promise<void> {\n if (!this.subscription) {\n return;\n }\n await this.subscription.close();\n this.subscription = null;\n }\n}\n","import type { PGlite } from \"@electric-sql/pglite\";\nimport type { Container } from \"@codemation/core\";\nimport { Engine } from \"@codemation/core/bootstrap\";\nimport { WorkflowRunEventWebsocketRelay } from \"../application/websocket/WorkflowRunEventWebsocketRelay\";\nimport type { BootRuntimeSummary } from \"../application/dev/BootRuntimeSummary.types\";\nimport type { PrismaClient } from \"../infrastructure/persistence/generated/prisma-client/client.js\";\nimport { WorkflowWebsocketServer } from \"../presentation/websocket/WorkflowWebsocketServer\";\nimport type { ResolvedImplementationSelection } from \"./runtime/ResolvedImplementationSelectionFactory\";\n\nexport class PreparedCodemationRuntime {\n constructor(\n readonly container: Container,\n readonly runtimeSummary: BootRuntimeSummary,\n readonly implementationSelection: ResolvedImplementationSelection,\n readonly usesProvidedPrismaClientOverride: boolean,\n private readonly ownedPrismaClient: PrismaClient | null,\n private readonly ownedPglite: PGlite | null,\n ) {}\n\n async stop(args?: Readonly<{ stopWebsocketServer?: boolean }>): Promise<void> {\n if (this.container.isRegistered(Engine, true)) {\n await this.container.resolve(Engine).stop();\n }\n if (this.container.isRegistered(WorkflowRunEventWebsocketRelay, true)) {\n await this.container.resolve(WorkflowRunEventWebsocketRelay).stop();\n }\n if (args?.stopWebsocketServer !== false && this.container.isRegistered(WorkflowWebsocketServer, true)) {\n await this.container.resolve(WorkflowWebsocketServer).stop();\n }\n if (this.ownedPrismaClient) {\n await this.ownedPrismaClient.$disconnect();\n }\n if (this.ownedPglite) {\n await this.ownedPglite.close();\n }\n }\n}\n","import type { PGlite } from \"@electric-sql/pglite\";\nimport path from \"node:path\";\nimport type {\n Container,\n RunEventBus,\n TriggerSetupStateRepository,\n WorkflowExecutionRepository,\n} from \"@codemation/core\";\nimport {\n CoreTokens,\n EventPublishingWorkflowExecutionRepository,\n InMemoryRunEventBus,\n instanceCachingFactory,\n SystemClock,\n} from \"@codemation/core\";\nimport {\n ConfigDrivenOffloadPolicy,\n DefaultDrivingScheduler,\n DefaultExecutionContextFactory,\n InlineDrivingScheduler,\n InMemoryBinaryStorage,\n InMemoryRunDataFactory,\n} from \"@codemation/core/bootstrap\";\nimport { RedisRunEventBus } from \"@codemation/eventbus-redis\";\nimport type { BootRuntimeSummary } from \"../application/dev/BootRuntimeSummary.types\";\nimport { BootRuntimeSnapshotHolder } from \"../application/dev/BootRuntimeSnapshotHolder\";\nimport { ApplicationTokens } from \"../applicationTokens\";\nimport { UserAccountService } from \"../domain/users/UserAccountServiceRegistry\";\nimport type { WorkflowRunRepository } from \"../domain/runs/WorkflowRunRepository\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { CodemationAuthConfig } from \"../presentation/config/CodemationAuthConfig\";\nimport type { CodemationApplicationRuntimeConfig } from \"../presentation/config/CodemationConfig\";\nimport type { CodemationWhitelabelConfig } from \"../presentation/config/CodemationWhitelabelConfig\";\nimport { CredentialSessionServiceImpl } from \"../domain/credentials/CredentialServices\";\nimport { LocalFilesystemBinaryStorage } from \"../infrastructure/binary/LocalFilesystemBinaryStorageRegistry\";\nimport {\n InMemoryCredentialStore,\n PrismaCredentialStore,\n} from \"../infrastructure/persistence/CredentialPersistenceStore\";\nimport { InMemoryTriggerSetupStateRepository } from \"../infrastructure/persistence/InMemoryTriggerSetupStateRepository\";\nimport { InMemoryWorkflowActivationRepository } from \"../infrastructure/persistence/InMemoryWorkflowActivationRepository\";\nimport { InMemoryWorkflowDebuggerOverlayRepository } from \"../infrastructure/persistence/InMemoryWorkflowDebuggerOverlayRepository\";\nimport { InMemoryWorkflowRunRepository } from \"../infrastructure/persistence/InMemoryWorkflowRunRepository\";\nimport { PrismaClientFactory } from \"../infrastructure/persistence/PrismaClientFactory\";\nimport { PrismaClient } from \"../infrastructure/persistence/generated/prisma-client/client.js\";\nimport { PrismaTriggerSetupStateRepository } from \"../infrastructure/persistence/PrismaTriggerSetupStateRepository\";\nimport { PrismaWorkflowActivationRepository } from \"../infrastructure/persistence/PrismaWorkflowActivationRepository\";\nimport { PrismaWorkflowDebuggerOverlayRepository } from \"../infrastructure/persistence/PrismaWorkflowDebuggerOverlayRepository\";\nimport { PrismaWorkflowRunRepository } from \"../infrastructure/persistence/PrismaWorkflowRunRepository\";\nimport type { ResolvedDatabasePersistence } from \"../infrastructure/persistence/DatabasePersistenceResolver\";\nimport { AppConfigFactory } from \"./runtime/AppConfigFactory\";\nimport type { ResolvedImplementationSelection } from \"./runtime/ResolvedImplementationSelectionFactory\";\nimport { ResolvedImplementationSelectionFactory } from \"./runtime/ResolvedImplementationSelectionFactory\";\nimport { PreparedCodemationRuntime } from \"./PreparedCodemationRuntime\";\nimport type { AppConfig } from \"../presentation/config/AppConfig\";\n\ntype PrismaClientResolution = Readonly<{\n prismaClient: PrismaClient;\n ownedPrismaClient?: PrismaClient;\n ownedPglite?: PGlite;\n}>;\n\ntype PreparedRuntimePersistence = Readonly<{\n workflowExecutionRepository: WorkflowExecutionRepository;\n triggerSetupStateRepository: TriggerSetupStateRepository;\n workflowRunRepository?: WorkflowRunRepository;\n workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository;\n prismaClient?: PrismaClient;\n ownedPrismaClient?: PrismaClient;\n ownedPglite?: PGlite;\n}>;\n\nexport class PreparedCodemationRuntimeFactory {\n constructor(\n private readonly implementationSelectionFactory: ResolvedImplementationSelectionFactory = new ResolvedImplementationSelectionFactory(),\n private readonly appConfigFactory: AppConfigFactory = new AppConfigFactory(),\n ) {}\n\n async prepare(\n args: Readonly<{\n container: Container;\n repoRoot: string;\n consumerRoot: string;\n env: NodeJS.ProcessEnv;\n workflowSources: ReadonlyArray<string>;\n runtimeConfig: CodemationApplicationRuntimeConfig;\n applicationAuthConfig: CodemationAuthConfig | undefined;\n whitelabelConfig: CodemationWhitelabelConfig;\n hasConfiguredCredentialSessionServiceRegistration: boolean;\n }>,\n ): Promise<PreparedCodemationRuntime> {\n const usesProvidedPrismaClientOverride = this.hasProvidedPrismaClientOverride(args.container);\n const implementationSelection = this.implementationSelectionFactory.resolve({\n consumerRoot: args.consumerRoot,\n env: args.env,\n runtimeConfig: args.runtimeConfig,\n });\n const runtimeSummary = this.createRuntimeSummary(implementationSelection);\n args.container.resolve(BootRuntimeSnapshotHolder).set(runtimeSummary);\n const eventBus = this.createRunEventBus(implementationSelection);\n const persistence = await this.createRunPersistence(args.container, implementationSelection, eventBus);\n const binaryStorage = this.createBinaryStorage(args.repoRoot);\n const appConfig: AppConfig = this.appConfigFactory.create({\n repoRoot: args.repoRoot,\n consumerRoot: args.consumerRoot,\n env: args.env,\n workflowSources: args.workflowSources,\n runtimeConfig: args.runtimeConfig,\n authConfig: args.applicationAuthConfig,\n whitelabelConfig: args.whitelabelConfig,\n });\n\n args.container.registerInstance(CoreTokens.RunEventBus, eventBus);\n args.container.registerInstance(CoreTokens.WorkflowExecutionRepository, persistence.workflowExecutionRepository);\n args.container.registerInstance(CoreTokens.TriggerSetupStateRepository, persistence.triggerSetupStateRepository);\n args.container.registerInstance(CoreTokens.RunDataFactory, new InMemoryRunDataFactory());\n args.container.registerInstance(CoreTokens.BinaryStorage, binaryStorage);\n args.container.registerInstance(\n CoreTokens.ExecutionContextFactory,\n new DefaultExecutionContextFactory(binaryStorage),\n );\n args.container.registerInstance(ApplicationTokens.AppConfig, appConfig);\n args.container.registerInstance(ApplicationTokens.Clock, new SystemClock());\n args.container.registerInstance(ApplicationTokens.CodemationAuthConfig, args.applicationAuthConfig);\n args.container.registerInstance(ApplicationTokens.CodemationWhitelabelConfig, args.whitelabelConfig);\n args.container.registerInstance(ApplicationTokens.WebSocketPort, this.resolveWebSocketPort(args.env));\n args.container.registerInstance(ApplicationTokens.WebSocketBindHost, args.env.CODEMATION_WS_BIND_HOST ?? \"0.0.0.0\");\n args.container.register(UserAccountService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const prismaClient = dependencyContainer.isRegistered(PrismaClient, true)\n ? dependencyContainer.resolve(PrismaClient)\n : undefined;\n return new UserAccountService(\n dependencyContainer.resolve(ApplicationTokens.CodemationAuthConfig),\n prismaClient,\n );\n }),\n });\n args.container.registerInstance(\n ApplicationTokens.WorkflowDebuggerOverlayRepository,\n persistence.workflowDebuggerOverlayRepository,\n );\n if (persistence.workflowRunRepository) {\n args.container.registerInstance(ApplicationTokens.WorkflowRunRepository, persistence.workflowRunRepository);\n }\n if (persistence.prismaClient) {\n args.container.registerInstance(PrismaClient, persistence.prismaClient);\n args.container.registerInstance(ApplicationTokens.PrismaClient, persistence.prismaClient);\n }\n const workflowActivationRepository = persistence.prismaClient\n ? args.container.resolve(PrismaWorkflowActivationRepository)\n : args.container.resolve(InMemoryWorkflowActivationRepository);\n args.container.registerInstance(ApplicationTokens.WorkflowActivationRepository, workflowActivationRepository);\n if (implementationSelection.databasePersistence.kind !== \"none\") {\n args.container.registerInstance(ApplicationTokens.CredentialStore, args.container.resolve(PrismaCredentialStore));\n } else {\n args.container.registerInstance(\n ApplicationTokens.CredentialStore,\n args.container.resolve(InMemoryCredentialStore),\n );\n }\n if (!args.hasConfiguredCredentialSessionServiceRegistration) {\n args.container.register(CoreTokens.CredentialSessionService, {\n useFactory: instanceCachingFactory((dependencyContainer) =>\n dependencyContainer.resolve(CredentialSessionServiceImpl),\n ),\n });\n }\n if (implementationSelection.workerRuntimeScheduler) {\n args.container.registerInstance(\n ApplicationTokens.WorkerRuntimeScheduler,\n implementationSelection.workerRuntimeScheduler,\n );\n }\n this.registerRuntimeNodeActivationScheduler(args.container);\n\n return new PreparedCodemationRuntime(\n args.container,\n runtimeSummary,\n implementationSelection,\n usesProvidedPrismaClientOverride,\n persistence.ownedPrismaClient ?? null,\n persistence.ownedPglite ?? null,\n );\n }\n\n private createRuntimeSummary(selection: ResolvedImplementationSelection): BootRuntimeSummary {\n return {\n databasePersistence: selection.databasePersistence,\n eventBusKind: selection.eventBusKind,\n queuePrefix: selection.queuePrefix,\n schedulerKind: selection.schedulerKind,\n redisUrl: selection.redisUrl,\n };\n }\n\n private createRunEventBus(selection: ResolvedImplementationSelection): RunEventBus {\n if (selection.eventBusKind === \"redis\") {\n return new RedisRunEventBus(this.requireRedisUrl(selection.redisUrl), selection.queuePrefix);\n }\n return new InMemoryRunEventBus();\n }\n\n private async createRunPersistence(\n container: Container,\n selection: ResolvedImplementationSelection,\n eventBus: RunEventBus,\n ): Promise<PreparedRuntimePersistence> {\n if (selection.databasePersistence.kind === \"none\") {\n const workflowRunRepository = container.resolve(InMemoryWorkflowRunRepository);\n return {\n workflowRunRepository,\n triggerSetupStateRepository: container.resolve(InMemoryTriggerSetupStateRepository),\n workflowDebuggerOverlayRepository: container.resolve(InMemoryWorkflowDebuggerOverlayRepository),\n workflowExecutionRepository: new EventPublishingWorkflowExecutionRepository(workflowRunRepository, eventBus),\n };\n }\n const prismaClientResolution = await this.resolveInjectedOrOwnedPrismaClient(\n container,\n selection.databasePersistence,\n );\n const childContainer = container.createChildContainer();\n childContainer.registerInstance(PrismaClient, prismaClientResolution.prismaClient);\n const workflowRunRepository = childContainer.resolve(PrismaWorkflowRunRepository);\n const triggerSetupStateRepository = childContainer.resolve(PrismaTriggerSetupStateRepository);\n const workflowDebuggerOverlayRepository = childContainer.resolve(PrismaWorkflowDebuggerOverlayRepository);\n return {\n prismaClient: prismaClientResolution.prismaClient,\n ownedPrismaClient: prismaClientResolution.ownedPrismaClient,\n ownedPglite: prismaClientResolution.ownedPglite,\n workflowRunRepository,\n triggerSetupStateRepository,\n workflowDebuggerOverlayRepository,\n workflowExecutionRepository: new EventPublishingWorkflowExecutionRepository(workflowRunRepository, eventBus),\n };\n }\n\n private hasProvidedPrismaClientOverride(container: Container): boolean {\n return container.isRegistered(PrismaClient, true);\n }\n\n private async resolveInjectedOrOwnedPrismaClient(\n container: Container,\n persistence: Exclude<ResolvedDatabasePersistence, Readonly<{ kind: \"none\" }>>,\n ): Promise<PrismaClientResolution> {\n if (this.hasProvidedPrismaClientOverride(container)) {\n return {\n prismaClient: container.resolve(PrismaClient),\n };\n }\n const factory = container.resolve(PrismaClientFactory);\n if (persistence.kind === \"postgresql\") {\n const prismaClient = factory.createPostgres(persistence.databaseUrl);\n return {\n prismaClient,\n ownedPrismaClient: prismaClient,\n };\n }\n if (persistence.kind !== \"pglite\") {\n throw new Error(\"Unexpected database persistence mode for Prisma.\");\n }\n const { prismaClient, pglite } = await factory.createPglite(persistence.dataDir);\n return {\n prismaClient,\n ownedPrismaClient: prismaClient,\n ownedPglite: pglite,\n };\n }\n\n private registerRuntimeNodeActivationScheduler(container: Container): void {\n container.register(CoreTokens.NodeActivationScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const inlineScheduler = dependencyContainer.resolve(InlineDrivingScheduler);\n if (!dependencyContainer.isRegistered(ApplicationTokens.WorkerRuntimeScheduler, true)) {\n return inlineScheduler;\n }\n return new DefaultDrivingScheduler(\n new ConfigDrivenOffloadPolicy(),\n dependencyContainer.resolve(ApplicationTokens.WorkerRuntimeScheduler),\n inlineScheduler,\n );\n }),\n });\n }\n\n private createBinaryStorage(repoRoot: string): InMemoryBinaryStorage | LocalFilesystemBinaryStorage {\n if (!repoRoot) {\n return new InMemoryBinaryStorage();\n }\n return new LocalFilesystemBinaryStorage(path.join(repoRoot, \".codemation\", \"binary\"));\n }\n\n private requireRedisUrl(redisUrl: string | undefined): string {\n if (!redisUrl) {\n throw new Error(\"Redis-backed runtime requires runtime.eventBus.redisUrl or REDIS_URL.\");\n }\n return redisUrl;\n }\n\n private resolveWebSocketPort(env: Readonly<NodeJS.ProcessEnv>): number {\n const rawPort = env.CODEMATION_WS_PORT ?? env.VITE_CODEMATION_WS_PORT;\n const parsedPort = Number(rawPort);\n if (Number.isInteger(parsedPort) && parsedPort > 0) {\n return parsedPort;\n }\n return 3001;\n }\n}\n","import { ApiPaths } from \"../ApiPaths\";\n\n/**\n * Routes that must remain callable without an authenticated Codemation session.\n * @see ApiPaths — keep in sync with webhook + dev-only endpoints.\n */\nexport class HonoHttpAnonymousRoutePolicy {\n private static readonly webhookPrefix = `${ApiPaths.webhooks()}/`;\n\n static isAnonymousRoute(request: Request): boolean {\n const url = new URL(request.url);\n const pathname = url.pathname;\n if (pathname === ApiPaths.webhooks() || pathname.startsWith(this.webhookPrefix)) {\n return true;\n }\n if (pathname === \"/api/dev/runtime\" || pathname === \"/api/dev/bootstrap-summary\") {\n return true;\n }\n if (pathname === ApiPaths.userInviteVerify() || pathname === ApiPaths.userInviteAccept()) {\n return true;\n }\n if (pathname === ApiPaths.whitelabelLogo()) {\n return true;\n }\n return false;\n }\n}\n","import { inject, injectAll, injectable } from \"@codemation/core\";\nimport { Hono } from \"hono\";\nimport type { SessionVerifier } from \"../../../application/auth/SessionVerifier\";\nimport { ApplicationTokens } from \"../../../applicationTokens\";\nimport { BinaryHttpRouteHandler } from \"../routeHandlers/BinaryHttpRouteHandlerFactory\";\nimport { ServerHttpErrorResponseFactory } from \"../ServerHttpErrorResponseFactory\";\nimport type { HonoApiRouteRegistrar } from \"./HonoApiRouteRegistrar\";\nimport { HonoHttpAnonymousRoutePolicy } from \"./HonoHttpAnonymousRoutePolicyRegistry\";\n\n@injectable()\nexport class CodemationHonoApiApp {\n private readonly app: Hono;\n\n constructor(\n @inject(ApplicationTokens.SessionVerifier)\n sessionVerifier: SessionVerifier,\n @injectAll(ApplicationTokens.HonoApiRouteRegistrar)\n registrars: ReadonlyArray<HonoApiRouteRegistrar>,\n @inject(BinaryHttpRouteHandler)\n binaryHttpRouteHandler: BinaryHttpRouteHandler,\n ) {\n const app = new Hono().basePath(\"/api\");\n app.onError((error, _c) => ServerHttpErrorResponseFactory.fromUnknown(error));\n app.use(\"*\", async (c, next) => {\n if (HonoHttpAnonymousRoutePolicy.isAnonymousRoute(c.req.raw)) {\n await next();\n return;\n }\n const principal = await sessionVerifier.verify(c.req.raw);\n if (!principal) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n await next();\n });\n for (const registrar of registrars) {\n registrar.register(app);\n }\n app.get(\"/workflows/:workflowId/debugger-overlay/binary/:binaryId/content\", (c) =>\n binaryHttpRouteHandler.getWorkflowOverlayBinaryContent(c.req.raw, {\n workflowId: c.req.param(\"workflowId\"),\n binaryId: c.req.param(\"binaryId\"),\n }),\n );\n app.post(\"/workflows/:workflowId/debugger-overlay/binary/upload\", (c) =>\n binaryHttpRouteHandler.postWorkflowDebuggerOverlayBinaryUpload(c.req.raw, {\n workflowId: c.req.param(\"workflowId\"),\n }),\n );\n app.notFound((c) => {\n const method = c.req.method.toUpperCase();\n const url = new URL(c.req.url);\n return c.json({ error: `Unknown API route: ${method} ${url.pathname}` }, 404);\n });\n this.app = app;\n }\n\n getHono(): Hono {\n return this.app;\n }\n\n fetch(request: Request): Response | Promise<Response> {\n return this.app.fetch(request);\n }\n}\n","import type { WorkflowDefinition } from \"@codemation/core\";\nimport { inject, injectable } from \"@codemation/core\";\nimport type { LoggerFactory } from \"../logging/Logger\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\n\n@injectable()\nexport class WebhookEndpointPathValidator {\n constructor(@inject(ApplicationTokens.LoggerFactory) private readonly loggerFactory: LoggerFactory) {}\n\n validateAndWarn(workflows: ReadonlyArray<WorkflowDefinition>): void {\n const logger = this.loggerFactory.create(\"codemation.webhooks.path\");\n for (const wf of workflows) {\n for (const node of wf.nodes) {\n if (node.kind !== \"trigger\") {\n continue;\n }\n const cfg = node.config as { endpointKey?: unknown };\n if (typeof cfg.endpointKey !== \"string\") {\n continue;\n }\n const path = cfg.endpointKey;\n if (path.includes(\".\")) {\n logger.warn(\n `Webhook endpoint path \"${path}\" in workflow \"${wf.id}\" contains a dot; use a stable URL segment without dots for predictable routing.`,\n );\n }\n if (path.includes(\"/\")) {\n logger.warn(\n `Webhook endpoint path \"${path}\" in workflow \"${wf.id}\" contains \"/\"; use a single URL segment (no slashes).`,\n );\n }\n }\n }\n }\n}\n","import { injectable } from \"@codemation/core\";\n\n@injectable()\nexport class CodemationIdFactory {\n makeRunId(): string {\n return `run_${Date.now()}_${Math.random().toString(16).slice(2)}`;\n }\n\n makeActivationId(): string {\n return `act_${Date.now()}_${Math.random().toString(16).slice(2)}`;\n }\n}\n","import { injectAll, injectable } from \"@codemation/core\";\nimport type { Command } from \"../../application/bus/Command\";\nimport type { CommandBus } from \"../../application/bus/CommandBus\";\nimport type { CommandHandler } from \"../../application/bus/CommandHandler\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { commandHandlerMetadataKey } from \"./HandlesCommandRegistry\";\n\ntype CommandType = abstract new (...args: any[]) => Command<unknown>;\n\n@injectable()\nexport class InMemoryCommandBus implements CommandBus {\n private readonly handlersByCommandType: ReadonlyMap<CommandType, CommandHandler<Command<unknown>, unknown>>;\n\n constructor(\n @injectAll(ApplicationTokens.CommandHandler)\n handlers: ReadonlyArray<CommandHandler<Command<unknown>, unknown>>,\n ) {\n this.handlersByCommandType = this.createHandlersByCommandType(handlers);\n }\n\n async execute<TResult>(command: Command<TResult>): Promise<TResult> {\n const handler = this.handlersByCommandType.get(command.constructor as CommandType);\n if (!handler) {\n throw new Error(`No command handler registered for ${command.constructor.name}`);\n }\n return (await handler.execute(command as Command<unknown>)) as TResult;\n }\n\n private createHandlersByCommandType(\n handlers: ReadonlyArray<CommandHandler<Command<unknown>, unknown>>,\n ): ReadonlyMap<CommandType, CommandHandler<Command<unknown>, unknown>> {\n const handlersByCommandType = new Map<CommandType, CommandHandler<Command<unknown>, unknown>>();\n for (const handler of handlers) {\n const commandType = Reflect.getMetadata(commandHandlerMetadataKey, handler.constructor) as\n | CommandType\n | undefined;\n if (!commandType) {\n throw new Error(`Command handler ${handler.constructor.name} is missing @HandlesCommand metadata.`);\n }\n if (handlersByCommandType.has(commandType)) {\n throw new Error(`Duplicate command handler registered for ${commandType.name}.`);\n }\n handlersByCommandType.set(commandType, handler);\n }\n return handlersByCommandType;\n }\n}\n","import { injectable, registry } from \"@codemation/core\";\nimport type { DomainEvent } from \"../../application/bus/DomainEvent\";\nimport type { DomainEventHandler } from \"../../application/bus/DomainEventHandler\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\n\ntype AbstractType<TInstance> = abstract new (...args: any[]) => TInstance;\ntype ConcreteType<TInstance> = new (...args: any[]) => TInstance;\n\nexport const domainEventHandlerMetadataKey = Symbol.for(\"codemation.infrastructure.di.DomainEventHandler\");\n\nexport class HandlesDomainEvent {\n static for<TEvent extends DomainEvent>(eventType: AbstractType<TEvent>): ClassDecorator {\n return (target) => {\n Reflect.defineMetadata(domainEventHandlerMetadataKey, eventType, target);\n injectable()(target as never);\n registry([\n {\n token: ApplicationTokens.DomainEventHandler,\n useClass: target as unknown as ConcreteType<DomainEventHandler<DomainEvent>>,\n },\n ])(target as never);\n };\n }\n}\n","import { injectAll, injectable } from \"@codemation/core\";\nimport type { DomainEvent } from \"../../application/bus/DomainEvent\";\nimport type { DomainEventBus } from \"../../application/bus/DomainEventBus\";\nimport type { DomainEventHandler } from \"../../application/bus/DomainEventHandler\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { domainEventHandlerMetadataKey } from \"./HandlesDomainEventRegistry\";\n\ntype DomainEventType = abstract new (...args: any[]) => DomainEvent;\n\n@injectable()\nexport class InMemoryDomainEventBus implements DomainEventBus {\n private readonly handlersByEventType: ReadonlyMap<DomainEventType, ReadonlyArray<DomainEventHandler<DomainEvent>>>;\n\n constructor(\n @injectAll(ApplicationTokens.DomainEventHandler)\n handlers: ReadonlyArray<DomainEventHandler<DomainEvent>>,\n ) {\n this.handlersByEventType = this.createHandlersByEventType(handlers);\n }\n\n async publish(event: DomainEvent): Promise<void> {\n const handlers = this.handlersByEventType.get(event.constructor as DomainEventType) ?? [];\n for (const handler of handlers) {\n await handler.handle(event);\n }\n }\n\n private createHandlersByEventType(\n handlers: ReadonlyArray<DomainEventHandler<DomainEvent>>,\n ): ReadonlyMap<DomainEventType, ReadonlyArray<DomainEventHandler<DomainEvent>>> {\n const handlersByEventType = new Map<DomainEventType, Array<DomainEventHandler<DomainEvent>>>();\n for (const handler of handlers) {\n const eventType = Reflect.getMetadata(domainEventHandlerMetadataKey, handler.constructor) as\n | DomainEventType\n | undefined;\n if (!eventType) {\n throw new Error(`Domain event handler ${handler.constructor.name} is missing @HandlesDomainEvent metadata.`);\n }\n const currentHandlers = handlersByEventType.get(eventType) ?? [];\n currentHandlers.push(handler);\n handlersByEventType.set(eventType, currentHandlers);\n }\n return new Map(\n [...handlersByEventType.entries()].map(([eventType, eventHandlers]) => [eventType, [...eventHandlers]] as const),\n );\n }\n}\n","import { injectAll, injectable } from \"@codemation/core\";\nimport type { Query } from \"../../application/bus/Query\";\nimport type { QueryBus } from \"../../application/bus/QueryBus\";\nimport type { QueryHandler } from \"../../application/bus/QueryHandler\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { queryHandlerMetadataKey } from \"./HandlesQueryRegistry\";\n\ntype QueryType = abstract new (...args: any[]) => Query<unknown>;\n\n@injectable()\nexport class InMemoryQueryBus implements QueryBus {\n private readonly handlersByQueryType: ReadonlyMap<QueryType, QueryHandler<Query<unknown>, unknown>>;\n\n constructor(\n @injectAll(ApplicationTokens.QueryHandler)\n handlers: ReadonlyArray<QueryHandler<Query<unknown>, unknown>>,\n ) {\n this.handlersByQueryType = this.createHandlersByQueryType(handlers);\n }\n\n async execute<TResult>(query: Query<TResult>): Promise<TResult> {\n const handler = this.handlersByQueryType.get(query.constructor as QueryType);\n if (!handler) {\n throw new Error(`No query handler registered for ${query.constructor.name}`);\n }\n return (await handler.execute(query as Query<unknown>)) as TResult;\n }\n\n private createHandlersByQueryType(\n handlers: ReadonlyArray<QueryHandler<Query<unknown>, unknown>>,\n ): ReadonlyMap<QueryType, QueryHandler<Query<unknown>, unknown>> {\n const handlersByQueryType = new Map<QueryType, QueryHandler<Query<unknown>, unknown>>();\n for (const handler of handlers) {\n const queryType = Reflect.getMetadata(queryHandlerMetadataKey, handler.constructor) as QueryType | undefined;\n if (!queryType) {\n throw new Error(`Query handler ${handler.constructor.name} is missing @HandlesQuery metadata.`);\n }\n if (handlersByQueryType.has(queryType)) {\n throw new Error(`Duplicate query handler registered for ${queryType.name}.`);\n }\n handlersByQueryType.set(queryType, handler);\n }\n return handlersByQueryType;\n }\n}\n","import { getToken } from \"@auth/core/jwt\";\nimport type { AuthenticatedPrincipal } from \"../../application/auth/AuthenticatedPrincipal\";\nimport type { SessionVerifier } from \"../../application/auth/SessionVerifier\";\n\nexport class AuthJsSessionVerifier implements SessionVerifier {\n constructor(private readonly authSecret: string) {}\n\n async verify(request: Request): Promise<AuthenticatedPrincipal | null> {\n const requestUrl = new URL(request.url);\n const secureCookie = requestUrl.protocol === \"https:\";\n const token = await getToken({\n req: request,\n secret: this.authSecret,\n secureCookie,\n salt: \"authjs.session-token\",\n });\n if (!token?.sub || typeof token.sub !== \"string\") {\n return null;\n }\n return {\n id: token.sub,\n email: typeof token.email === \"string\" ? token.email : null,\n name: typeof token.name === \"string\" ? token.name : null,\n };\n }\n}\n","import type { AuthenticatedPrincipal } from \"../../application/auth/AuthenticatedPrincipal\";\nimport type { SessionVerifier } from \"../../application/auth/SessionVerifier\";\n\nexport class DevelopmentSessionBypassVerifier implements SessionVerifier {\n async verify(): Promise<AuthenticatedPrincipal | null> {\n return {\n id: \"codemation-development-bypass\",\n email: \"development@codemation.local\",\n name: \"Development bypass user\",\n };\n }\n}\n","import type { WorkflowDefinition, WorkflowExecutionRepository, WorkflowRepository } from \"@codemation/core\";\nimport { CoreTokens, inject, injectable } from \"@codemation/core\";\nimport { Engine } from \"@codemation/core/bootstrap\";\nimport { WorkflowDefinitionRepository } from \"../../domain/workflows/WorkflowDefinitionRepository\";\n\n@injectable()\nexport class WorkflowDefinitionRepositoryAdapter implements WorkflowDefinitionRepository {\n constructor(\n @inject(Engine) private readonly engine: Engine,\n @inject(CoreTokens.WorkflowRepository) private readonly workflowRepository: WorkflowRepository,\n ) {}\n\n async listDefinitions(): Promise<ReadonlyArray<WorkflowDefinition>> {\n return [...this.workflowRepository.list()];\n }\n\n async getDefinition(workflowId: string): Promise<WorkflowDefinition | undefined> {\n return this.workflowRepository.get(decodeURIComponent(workflowId));\n }\n\n async resolveSnapshot(\n args: Readonly<{ workflowId: string; workflowSnapshot?: unknown }>,\n ): Promise<WorkflowDefinition | undefined> {\n return this.engine.resolveWorkflowSnapshot({\n workflowId: decodeURIComponent(args.workflowId),\n workflowSnapshot: args.workflowSnapshot as NonNullable<\n Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>\n >[\"workflowSnapshot\"],\n });\n }\n}\n","import type {\n PersistedRunState,\n RunId,\n RunSummary,\n WorkflowExecutionListingRepository,\n WorkflowExecutionRepository,\n} from \"@codemation/core\";\nimport { CoreTokens, inject, injectable } from \"@codemation/core\";\nimport type { WorkflowRunRepository as WorkflowRunRepositoryContract } from \"../../domain/runs/WorkflowRunRepository\";\n\n@injectable()\nexport class WorkflowRunRepository implements WorkflowRunRepositoryContract {\n constructor(\n @inject(CoreTokens.WorkflowExecutionRepository)\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n ) {}\n\n async load(runId: string): Promise<PersistedRunState | undefined> {\n return (await this.workflowExecutionRepository.load(decodeURIComponent(runId))) as PersistedRunState | undefined;\n }\n\n async save(state: PersistedRunState): Promise<void> {\n await this.workflowExecutionRepository.save(state);\n }\n\n async listRuns(args: Readonly<{ workflowId?: string; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {\n const listingStore = this.workflowExecutionRepository as unknown as Partial<WorkflowExecutionListingRepository>;\n if (!listingStore.listRuns) {\n return [];\n }\n return (await listingStore.listRuns({\n workflowId: args.workflowId ? decodeURIComponent(args.workflowId) : undefined,\n limit: args.limit,\n })) as ReadonlyArray<RunSummary>;\n }\n\n async deleteRun(runId: RunId): Promise<void> {\n const id = decodeURIComponent(runId) as RunId;\n const deletable = this.workflowExecutionRepository as WorkflowExecutionRepository & {\n deleteRun?: (rid: RunId) => Promise<void>;\n };\n if (deletable.deleteRun) {\n await deletable.deleteRun(id);\n }\n }\n}\n","import type { WorkflowDefinition } from \"@codemation/core\";\nimport { InMemoryLiveWorkflowRepository } from \"@codemation/core\";\nimport type { AIAgentConnectionWorkflowExpander } from \"@codemation/core-nodes\";\n\n/** Host-owned mutable workflow repository; expands AI agent connections before registration. */\nexport class LiveWorkflowRepository extends InMemoryLiveWorkflowRepository {\n constructor(private readonly connectionExpander: AIAgentConnectionWorkflowExpander) {\n super();\n }\n\n setWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void {\n super.setWorkflows(workflows.map((workflow) => this.connectionExpander.expand(workflow)));\n }\n}\n","import type { Container } from \"@codemation/core\";\nimport type {\n CodemationClassRegistration,\n CodemationContainerRegistration,\n CodemationValueRegistration,\n} from \"./CodemationContainerRegistration\";\n\nexport class CodemationContainerRegistrationRegistrar {\n apply(container: Container, registrations: ReadonlyArray<CodemationContainerRegistration<unknown>>): void {\n for (const registration of registrations) {\n this.applyRegistration(container, registration);\n }\n }\n\n private applyRegistration(container: Container, registration: CodemationContainerRegistration<unknown>): void {\n if (this.isValueRegistration(registration)) {\n container.registerInstance(registration.token, registration.useValue);\n return;\n }\n if (this.isClassRegistration(registration)) {\n container.register(registration.token, {\n useClass: registration.useClass as never,\n });\n return;\n }\n container.register(registration.token, {\n useFactory: (dependencyContainer) => registration.useFactory(dependencyContainer),\n });\n }\n\n private isValueRegistration(\n registration: CodemationContainerRegistration<unknown>,\n ): registration is CodemationValueRegistration<unknown> {\n return \"useValue\" in registration;\n }\n\n private isClassRegistration(\n registration: CodemationContainerRegistration<unknown>,\n ): registration is CodemationClassRegistration<unknown> {\n return \"useClass\" in registration;\n }\n}\n","import \"reflect-metadata\";\n\nimport type { Container, WorkflowDefinition } from \"@codemation/core\";\nimport { CoreTokens, instanceCachingFactory, container as tsyringeContainer } from \"@codemation/core\";\nimport {\n EngineRuntimeRegistrar,\n PersistedWorkflowTokenRegistry,\n WorkflowRepositoryWebhookTriggerMatcher,\n} from \"@codemation/core/bootstrap\";\nimport { AIAgentConnectionWorkflowExpander, ConnectionCredentialNodeConfigFactory } from \"@codemation/core-nodes\";\nimport { WorkflowRunEventWebsocketRelay } from \"../application/websocket/WorkflowRunEventWebsocketRelay\";\nimport { ApplicationTokens } from \"../applicationTokens\";\nimport { CodemationApplication } from \"../codemationApplication\";\nimport type { CredentialType } from \"../domain/credentials/CredentialServices\";\nimport {\n CredentialBindingService,\n CredentialFieldEnvOverlayService,\n CredentialInstanceService,\n CredentialMaterialResolver,\n CredentialRuntimeMaterialService,\n CredentialSecretCipher,\n CredentialSessionServiceImpl,\n CredentialTestService,\n CredentialTypeRegistryImpl,\n} from \"../domain/credentials/CredentialServices\";\nimport { OAuth2ConnectService } from \"../domain/credentials/OAuth2ConnectServiceFactory\";\nimport { OAuth2ProviderRegistry } from \"../domain/credentials/OAuth2ProviderRegistry\";\nimport { WorkflowCredentialNodeResolver } from \"../domain/credentials/WorkflowCredentialNodeResolver\";\nimport { UserAccountService } from \"../domain/users/UserAccountServiceRegistry\";\nimport type { WorkflowDebuggerOverlayRepository } from \"../domain/workflows/WorkflowDebuggerOverlayRepository\";\nimport type { WorkflowDefinitionRepository } from \"../domain/workflows/WorkflowDefinitionRepository\";\nimport type { WorkflowRunRepository } from \"../domain/runs/WorkflowRunRepository\";\nimport { WorkflowActivationPreflight } from \"../domain/workflows/WorkflowActivationPreflight\";\nimport { WorkflowActivationPreflightRules } from \"../domain/workflows/WorkflowActivationPreflightRules\";\nimport { BootRuntimeSnapshotHolder } from \"../application/dev/BootRuntimeSnapshotHolder\";\nimport { DevBootstrapSummaryAssembler } from \"../application/dev/DevBootstrapSummaryAssembler\";\nimport { WorkflowDefinitionMapper } from \"../application/mapping/WorkflowDefinitionMapper\";\nimport { WorkflowPolicyUiPresentationFactory } from \"../application/mapping/WorkflowPolicyUiPresentationFactory\";\nimport { WorkflowWebsocketServer } from \"../presentation/websocket/WorkflowWebsocketServer\";\nimport { DevBootstrapSummaryHttpRouteHandler } from \"../presentation/http/routeHandlers/DevBootstrapSummaryHttpRouteHandler\";\nimport { WhitelabelLogoHttpRouteHandler } from \"../presentation/http/routeHandlers/WhitelabelLogoHttpRouteHandler\";\nimport { CodemationHonoApiApp } from \"../presentation/http/hono/CodemationHonoApiAppFactory\";\nimport { RequestToWebhookItemMapper } from \"../infrastructure/webhooks/RequestToWebhookItemMapper\";\nimport { WebhookEndpointPathValidator } from \"../application/workflows/WebhookEndpointPathValidator\";\nimport { CodemationIdFactory } from \"../infrastructure/ids/CodemationIdFactory\";\nimport { InMemoryCommandBus } from \"../infrastructure/di/InMemoryCommandBus\";\nimport { InMemoryDomainEventBus } from \"../infrastructure/di/InMemoryDomainEventBus\";\nimport { InMemoryQueryBus } from \"../infrastructure/di/InMemoryQueryBus\";\nimport { AuthJsSessionVerifier } from \"../infrastructure/auth/AuthJsSessionVerifier\";\nimport { DevelopmentSessionBypassVerifier } from \"../infrastructure/auth/DevelopmentSessionBypassVerifier\";\nimport {\n InMemoryCredentialStore,\n PrismaCredentialStore,\n} from \"../infrastructure/persistence/CredentialPersistenceStore\";\nimport { InMemoryTriggerSetupStateRepository } from \"../infrastructure/persistence/InMemoryTriggerSetupStateRepository\";\nimport { InMemoryWorkflowActivationRepository } from \"../infrastructure/persistence/InMemoryWorkflowActivationRepository\";\nimport { InMemoryWorkflowDebuggerOverlayRepository } from \"../infrastructure/persistence/InMemoryWorkflowDebuggerOverlayRepository\";\nimport { InMemoryWorkflowRunRepository } from \"../infrastructure/persistence/InMemoryWorkflowRunRepository\";\nimport { PrismaClientFactory } from \"../infrastructure/persistence/PrismaClientFactory\";\nimport { PrismaMigrationDeployer } from \"../infrastructure/persistence/PrismaMigrationDeployer\";\nimport { PrismaTriggerSetupStateRepository } from \"../infrastructure/persistence/PrismaTriggerSetupStateRepository\";\nimport { PrismaWorkflowActivationRepository } from \"../infrastructure/persistence/PrismaWorkflowActivationRepository\";\nimport { PrismaWorkflowDebuggerOverlayRepository } from \"../infrastructure/persistence/PrismaWorkflowDebuggerOverlayRepository\";\nimport { RuntimeWorkflowActivationPolicy } from \"../infrastructure/persistence/RuntimeWorkflowActivationPolicy\";\nimport { WorkflowDefinitionRepositoryAdapter } from \"../infrastructure/persistence/WorkflowDefinitionRepositoryAdapter\";\nimport { WorkflowRunRepository as SqlWorkflowRunRepository } from \"../infrastructure/persistence/WorkflowRunRepository\";\nimport { LiveWorkflowRepository } from \"../infrastructure/runtime/LiveWorkflowRepository\";\nimport { LogLevelPolicyFactory, logLevelPolicyFactory } from \"../infrastructure/logging/LogLevelPolicyFactory\";\nimport { ServerLoggerFactory } from \"../infrastructure/logging/ServerLoggerFactory\";\nimport type { AppConfig } from \"../presentation/config/AppConfig\";\nimport type { CodemationApplicationRuntimeConfig } from \"../presentation/config/CodemationConfig\";\nimport type { CodemationContainerRegistration } from \"./CodemationContainerRegistration\";\nimport { CodemationContainerRegistrationRegistrar } from \"./CodemationContainerRegistrationRegistrar\";\n\ntype CodemationContainerState = Readonly<{\n application: CodemationApplication;\n registrations: ReadonlyArray<CodemationContainerRegistration<unknown>>;\n runtimeConfig: CodemationApplicationRuntimeConfig;\n workflows: ReadonlyArray<WorkflowDefinition>;\n credentialTypes: ReadonlyArray<CredentialType<any, any, unknown>>;\n sharedWorkflowWebsocketServer: WorkflowWebsocketServer | null;\n}>;\n\nexport class CodemationContainerFactory {\n constructor(\n private readonly containerRegistrationRegistrar: CodemationContainerRegistrationRegistrar = new CodemationContainerRegistrationRegistrar(),\n ) {}\n\n create(state: CodemationContainerState): Container {\n const container = tsyringeContainer.createChildContainer();\n this.registerCoreInfrastructure(container, state);\n this.registerRepositoriesAndBuses(container);\n this.registerApplicationServicesAndRoutes(container);\n this.registerOperationalInfrastructure(container);\n this.registerConfiguredRegistrations(container, state.registrations);\n this.registerCredentialTypes(container, state.credentialTypes);\n this.synchronizeLiveWorkflowRepository(container, state.workflows);\n return container;\n }\n\n private registerCredentialTypes(\n container: Container,\n credentialTypes: ReadonlyArray<CredentialType<any, any, unknown>>,\n ): void {\n const registry = container.resolve(CredentialTypeRegistryImpl);\n for (const credentialType of credentialTypes) {\n registry.register(credentialType);\n }\n }\n\n private registerConfiguredRegistrations(\n container: Container,\n registrations: ReadonlyArray<CodemationContainerRegistration<unknown>>,\n ): void {\n if (registrations.length === 0) {\n return;\n }\n this.containerRegistrationRegistrar.apply(container, registrations);\n }\n\n private registerCoreInfrastructure(container: Container, state: CodemationContainerState): void {\n container.registerInstance(BootRuntimeSnapshotHolder, new BootRuntimeSnapshotHolder());\n container.registerInstance(CodemationApplication, state.application);\n container.registerInstance(CoreTokens.PersistedWorkflowTokenRegistry, new PersistedWorkflowTokenRegistry());\n container.register(CredentialTypeRegistryImpl, {\n useFactory: instanceCachingFactory(() => new CredentialTypeRegistryImpl()),\n });\n container.register(CoreTokens.CredentialTypeRegistry, {\n useFactory: instanceCachingFactory((dependencyContainer) =>\n dependencyContainer.resolve(CredentialTypeRegistryImpl),\n ),\n });\n container.register(CodemationIdFactory, { useClass: CodemationIdFactory });\n container.register(CoreTokens.RunIdFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(CodemationIdFactory)),\n });\n container.register(CoreTokens.ActivationIdFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(CodemationIdFactory)),\n });\n container.register(CoreTokens.LiveWorkflowRepository, {\n useFactory: instanceCachingFactory(\n () =>\n new LiveWorkflowRepository(\n new AIAgentConnectionWorkflowExpander(new ConnectionCredentialNodeConfigFactory()),\n ),\n ),\n });\n container.register(CoreTokens.WorkflowRepository, {\n useFactory: instanceCachingFactory((dependencyContainer) =>\n dependencyContainer.resolve(CoreTokens.LiveWorkflowRepository),\n ),\n });\n container.registerInstance(CoreTokens.NodeResolver, container);\n const runtimeWorkflowActivationPolicy = new RuntimeWorkflowActivationPolicy();\n container.registerInstance(RuntimeWorkflowActivationPolicy, runtimeWorkflowActivationPolicy);\n container.registerInstance(CoreTokens.WorkflowActivationPolicy, runtimeWorkflowActivationPolicy);\n new EngineRuntimeRegistrar().register(container, {\n resolveEngineExecutionLimits: () => state.runtimeConfig.engineExecutionLimits,\n webhookTriggerMatcherProvider: {\n createMatcher: (dependencyContainer) => {\n const serverLoggerFactory = dependencyContainer.resolve(ServerLoggerFactory);\n const webhookRoutingLogger = serverLoggerFactory.create(\"codemation.webhooks.routing\");\n return new WorkflowRepositoryWebhookTriggerMatcher(\n dependencyContainer.resolve(CoreTokens.WorkflowRepository),\n dependencyContainer.resolve(CoreTokens.WorkflowActivationPolicy),\n {\n warn: (message) => webhookRoutingLogger.warn(message),\n info: (message) => webhookRoutingLogger.debug(message),\n },\n );\n },\n },\n triggerRuntimeDiagnosticsProvider: {\n create: (dependencyContainer) => {\n const triggerRuntimeLogger = dependencyContainer\n .resolve(ServerLoggerFactory)\n .create(\"codemation.engine.triggers\");\n return {\n info: (message) => triggerRuntimeLogger.debug(message),\n warn: (message) => triggerRuntimeLogger.warn(message),\n };\n },\n },\n });\n container.registerInstance(LogLevelPolicyFactory, logLevelPolicyFactory);\n container.register(ServerLoggerFactory, { useClass: ServerLoggerFactory });\n container.register(ApplicationTokens.LoggerFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(ServerLoggerFactory)),\n });\n container.register(ApplicationTokens.PerformanceDiagnosticsLogger, {\n useFactory: instanceCachingFactory((dependencyContainer) =>\n dependencyContainer.resolve(ServerLoggerFactory).createPerformanceDiagnostics(\"codemation.performance\"),\n ),\n });\n container.register(WorkflowWebsocketServer, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n if (state.sharedWorkflowWebsocketServer) {\n return state.sharedWorkflowWebsocketServer;\n }\n return new WorkflowWebsocketServer(\n dependencyContainer.resolve(ApplicationTokens.WebSocketPort),\n dependencyContainer.resolve(ApplicationTokens.WebSocketBindHost),\n dependencyContainer.resolve(ServerLoggerFactory).create(\"codemation-websocket.server\"),\n );\n }),\n });\n container.register(PrismaClientFactory, { useClass: PrismaClientFactory });\n container.register(PrismaMigrationDeployer, { useClass: PrismaMigrationDeployer });\n container.register(WorkflowPolicyUiPresentationFactory, { useClass: WorkflowPolicyUiPresentationFactory });\n container.register(WorkflowDefinitionMapper, { useClass: WorkflowDefinitionMapper });\n container.register(RequestToWebhookItemMapper, { useClass: RequestToWebhookItemMapper });\n container.register(WebhookEndpointPathValidator, { useClass: WebhookEndpointPathValidator });\n container.register(CredentialSecretCipher, { useClass: CredentialSecretCipher });\n container.register(CredentialMaterialResolver, { useClass: CredentialMaterialResolver });\n container.register(CredentialFieldEnvOverlayService, { useClass: CredentialFieldEnvOverlayService });\n container.register(CredentialRuntimeMaterialService, { useClass: CredentialRuntimeMaterialService });\n container.register(WorkflowCredentialNodeResolver, { useClass: WorkflowCredentialNodeResolver });\n container.register(CredentialInstanceService, { useClass: CredentialInstanceService });\n container.register(CredentialBindingService, { useClass: CredentialBindingService });\n container.register(WorkflowActivationPreflightRules, { useClass: WorkflowActivationPreflightRules });\n container.register(WorkflowActivationPreflight, { useClass: WorkflowActivationPreflight });\n container.register(CredentialTestService, { useClass: CredentialTestService });\n container.register(CredentialSessionServiceImpl, { useClass: CredentialSessionServiceImpl });\n container.register(OAuth2ProviderRegistry, { useClass: OAuth2ProviderRegistry });\n container.register(OAuth2ConnectService, { useClass: OAuth2ConnectService });\n container.register(DevelopmentSessionBypassVerifier, { useClass: DevelopmentSessionBypassVerifier });\n container.register(AuthJsSessionVerifier, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const appConfig = dependencyContainer.resolve<AppConfig>(ApplicationTokens.AppConfig);\n return new AuthJsSessionVerifier(appConfig.env.AUTH_SECRET ?? \"\");\n }),\n });\n container.register(UserAccountService, { useClass: UserAccountService });\n }\n\n private registerRepositoriesAndBuses(container: Container): void {\n container.register(WorkflowDefinitionRepositoryAdapter, { useClass: WorkflowDefinitionRepositoryAdapter });\n container.register(InMemoryWorkflowRunRepository, { useClass: InMemoryWorkflowRunRepository });\n container.register(InMemoryTriggerSetupStateRepository, { useClass: InMemoryTriggerSetupStateRepository });\n container.register(InMemoryCredentialStore, { useClass: InMemoryCredentialStore });\n container.register(SqlWorkflowRunRepository, { useClass: SqlWorkflowRunRepository });\n container.register(InMemoryWorkflowDebuggerOverlayRepository, {\n useClass: InMemoryWorkflowDebuggerOverlayRepository,\n });\n container.register(PrismaTriggerSetupStateRepository, { useClass: PrismaTriggerSetupStateRepository });\n container.register(PrismaWorkflowDebuggerOverlayRepository, {\n useClass: PrismaWorkflowDebuggerOverlayRepository,\n });\n container.register(PrismaWorkflowActivationRepository, { useClass: PrismaWorkflowActivationRepository });\n container.register(InMemoryWorkflowActivationRepository, { useClass: InMemoryWorkflowActivationRepository });\n container.register(PrismaCredentialStore, { useClass: PrismaCredentialStore });\n container.register(ApplicationTokens.WorkflowDefinitionRepository, {\n useFactory: instanceCachingFactory(\n (dependencyContainer) =>\n dependencyContainer.resolve(WorkflowDefinitionRepositoryAdapter) as unknown as WorkflowDefinitionRepository,\n ),\n });\n container.register(ApplicationTokens.WorkflowRunRepository, {\n useFactory: instanceCachingFactory(\n (dependencyContainer) =>\n dependencyContainer.resolve(SqlWorkflowRunRepository) as unknown as WorkflowRunRepository,\n ),\n });\n container.register(ApplicationTokens.WorkflowDebuggerOverlayRepository, {\n useFactory: instanceCachingFactory(\n (dependencyContainer) =>\n dependencyContainer.resolve(\n InMemoryWorkflowDebuggerOverlayRepository,\n ) as unknown as WorkflowDebuggerOverlayRepository,\n ),\n });\n container.register(ApplicationTokens.CredentialStore, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(InMemoryCredentialStore)),\n });\n container.register(InMemoryQueryBus, { useClass: InMemoryQueryBus });\n container.register(InMemoryCommandBus, { useClass: InMemoryCommandBus });\n container.register(InMemoryDomainEventBus, { useClass: InMemoryDomainEventBus });\n container.register(ApplicationTokens.QueryBus, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(InMemoryQueryBus)),\n });\n container.register(ApplicationTokens.CommandBus, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(InMemoryCommandBus)),\n });\n container.register(ApplicationTokens.DomainEventBus, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(InMemoryDomainEventBus)),\n });\n }\n\n private registerApplicationServicesAndRoutes(container: Container): void {\n container.register(DevBootstrapSummaryAssembler, { useClass: DevBootstrapSummaryAssembler });\n container.register(DevBootstrapSummaryHttpRouteHandler, { useClass: DevBootstrapSummaryHttpRouteHandler });\n container.register(WhitelabelLogoHttpRouteHandler, { useClass: WhitelabelLogoHttpRouteHandler });\n container.register(CodemationHonoApiApp, { useClass: CodemationHonoApiApp });\n }\n\n private registerOperationalInfrastructure(container: Container): void {\n container.register(ApplicationTokens.WorkflowWebsocketPublisher, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(WorkflowWebsocketServer)),\n });\n container.register(WorkflowRunEventWebsocketRelay, { useClass: WorkflowRunEventWebsocketRelay });\n }\n\n private synchronizeLiveWorkflowRepository(container: Container, workflows: ReadonlyArray<WorkflowDefinition>): void {\n const liveWorkflowRepository = container.resolve(CoreTokens.LiveWorkflowRepository);\n liveWorkflowRepository.setWorkflows(workflows);\n if (container.isRegistered(WebhookEndpointPathValidator, true)) {\n container.resolve(WebhookEndpointPathValidator).validateAndWarn(workflows);\n }\n }\n}\n","import { PrismaMigrationDeployer } from \"../../infrastructure/persistence/PrismaMigrationDeployer\";\nimport { RuntimeWorkflowActivationPolicy } from \"../../infrastructure/persistence/RuntimeWorkflowActivationPolicy\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { PreparedCodemationRuntime } from \"../PreparedCodemationRuntime\";\n\nexport class CliRuntimeBootService {\n async boot(args: Readonly<{ preparedRuntime: PreparedCodemationRuntime }>): Promise<void> {\n await this.applyDatabaseMigrations(args.preparedRuntime);\n await args.preparedRuntime.container\n .resolve(RuntimeWorkflowActivationPolicy)\n .hydrateFromRepository(args.preparedRuntime.container.resolve(ApplicationTokens.WorkflowActivationRepository));\n }\n\n private async applyDatabaseMigrations(preparedRuntime: PreparedCodemationRuntime): Promise<void> {\n const appConfig = preparedRuntime.container.resolve(ApplicationTokens.AppConfig);\n if (\n preparedRuntime.implementationSelection.databasePersistence.kind === \"none\" ||\n preparedRuntime.usesProvidedPrismaClientOverride ||\n appConfig.env.CODEMATION_SKIP_STARTUP_MIGRATIONS === \"true\"\n ) {\n return;\n }\n await preparedRuntime.container\n .resolve(PrismaMigrationDeployer)\n .deployPersistence(preparedRuntime.implementationSelection.databasePersistence, appConfig.env);\n }\n}\n","import { CoreTokens } from \"@codemation/core\";\nimport { instanceCachingFactory } from \"@codemation/core\";\nimport { Engine } from \"@codemation/core/bootstrap\";\nimport { PrismaMigrationDeployer } from \"../../infrastructure/persistence/PrismaMigrationDeployer\";\nimport { RuntimeWorkflowActivationPolicy } from \"../../infrastructure/persistence/RuntimeWorkflowActivationPolicy\";\nimport { DevelopmentSessionBypassVerifier } from \"../../infrastructure/auth/DevelopmentSessionBypassVerifier\";\nimport { AuthJsSessionVerifier } from \"../../infrastructure/auth/AuthJsSessionVerifier\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { WorkflowRunEventWebsocketRelay } from \"../../application/websocket/WorkflowRunEventWebsocketRelay\";\nimport { ApiPaths } from \"../../presentation/http/ApiPaths\";\nimport { WorkflowWebsocketServer } from \"../../presentation/websocket/WorkflowWebsocketServer\";\nimport { PreparedCodemationRuntime } from \"../PreparedCodemationRuntime\";\n\nexport class FrontendRuntimeBootService {\n async boot(\n args: Readonly<{\n preparedRuntime: PreparedCodemationRuntime;\n skipPresentationServers?: boolean;\n }>,\n ): Promise<void> {\n await this.applyDatabaseMigrations(args.preparedRuntime);\n await this.hydrateWorkflowActivationPolicy(args.preparedRuntime);\n this.registerSessionVerification(args.preparedRuntime);\n args.preparedRuntime.container.registerInstance(CoreTokens.WebhookBasePath, ApiPaths.webhooks());\n if (args.skipPresentationServers === true) {\n return;\n }\n const workflowRepository = args.preparedRuntime.container.resolve(CoreTokens.WorkflowRepository);\n await args.preparedRuntime.container.resolve(Engine).start([...workflowRepository.list()]);\n await args.preparedRuntime.container.resolve(WorkflowWebsocketServer).start();\n await args.preparedRuntime.container.resolve(WorkflowRunEventWebsocketRelay).start();\n }\n\n private async applyDatabaseMigrations(preparedRuntime: PreparedCodemationRuntime): Promise<void> {\n const appConfig = preparedRuntime.container.resolve(ApplicationTokens.AppConfig);\n if (\n preparedRuntime.implementationSelection.databasePersistence.kind === \"none\" ||\n preparedRuntime.usesProvidedPrismaClientOverride ||\n appConfig.env.CODEMATION_SKIP_STARTUP_MIGRATIONS === \"true\"\n ) {\n return;\n }\n await preparedRuntime.container\n .resolve(PrismaMigrationDeployer)\n .deployPersistence(preparedRuntime.implementationSelection.databasePersistence, appConfig.env);\n }\n\n private async hydrateWorkflowActivationPolicy(preparedRuntime: PreparedCodemationRuntime): Promise<void> {\n await preparedRuntime.container\n .resolve(RuntimeWorkflowActivationPolicy)\n .hydrateFromRepository(preparedRuntime.container.resolve(ApplicationTokens.WorkflowActivationRepository));\n }\n\n private registerSessionVerification(preparedRuntime: PreparedCodemationRuntime): void {\n const appConfig = preparedRuntime.container.resolve(ApplicationTokens.AppConfig);\n const env = appConfig.env;\n const authConfig = appConfig.auth;\n const isProduction = env.NODE_ENV === \"production\";\n if (isProduction && !authConfig) {\n throw new Error(\"CodemationConfig.auth is required when NODE_ENV is production.\");\n }\n if (isProduction && authConfig?.allowUnauthenticatedInDevelopment === true) {\n throw new Error(\n \"CodemationAuthConfig.allowUnauthenticatedInDevelopment is not allowed when NODE_ENV is production.\",\n );\n }\n const bypassAllowed = !isProduction && authConfig?.allowUnauthenticatedInDevelopment === true;\n if (bypassAllowed) {\n preparedRuntime.container.register(ApplicationTokens.SessionVerifier, {\n useFactory: instanceCachingFactory((dependencyContainer) =>\n dependencyContainer.resolve(DevelopmentSessionBypassVerifier),\n ),\n });\n return;\n }\n const secret = env.AUTH_SECRET ?? \"\";\n if (!secret) {\n throw new Error(\n \"AUTH_SECRET is required unless CodemationAuthConfig.allowUnauthenticatedInDevelopment is enabled in a non-production environment.\",\n );\n }\n preparedRuntime.container.register(ApplicationTokens.SessionVerifier, {\n useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(AuthJsSessionVerifier)),\n });\n }\n}\n","import { CoreTokens } from \"@codemation/core\";\nimport { Engine } from \"@codemation/core/bootstrap\";\nimport type { WorkerRuntimeHandle } from \"../../infrastructure/runtime/WorkerRuntimeScheduler\";\nimport { PrismaMigrationDeployer } from \"../../infrastructure/persistence/PrismaMigrationDeployer\";\nimport { RuntimeWorkflowActivationPolicy } from \"../../infrastructure/persistence/RuntimeWorkflowActivationPolicy\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { ApiPaths } from \"../../presentation/http/ApiPaths\";\nimport { PreparedCodemationRuntime } from \"../PreparedCodemationRuntime\";\n\nexport class WorkerRuntimeBootService {\n async boot(\n args: Readonly<{\n preparedRuntime: PreparedCodemationRuntime;\n queues: ReadonlyArray<string>;\n }>,\n ): Promise<Readonly<{ stop: () => Promise<void> }>> {\n await this.applyDatabaseMigrations(args.preparedRuntime);\n await args.preparedRuntime.container\n .resolve(RuntimeWorkflowActivationPolicy)\n .hydrateFromRepository(args.preparedRuntime.container.resolve(ApplicationTokens.WorkflowActivationRepository));\n args.preparedRuntime.container.registerInstance(CoreTokens.WebhookBasePath, ApiPaths.webhooks());\n if (!args.preparedRuntime.container.isRegistered(ApplicationTokens.WorkerRuntimeScheduler, true)) {\n throw new Error(\"Worker mode requires a BullMQ scheduler backed by a Redis event bus.\");\n }\n const workflows = args.preparedRuntime.container.resolve(CoreTokens.WorkflowRepository).list();\n const engine = args.preparedRuntime.container.resolve(Engine);\n await engine.start([...workflows]);\n const workflowsById = new Map(workflows.map((workflow) => [workflow.id, workflow] as const));\n const scheduler = args.preparedRuntime.container.resolve(ApplicationTokens.WorkerRuntimeScheduler);\n const executionLimitsPolicy = args.preparedRuntime.container.resolve(CoreTokens.EngineExecutionLimitsPolicy);\n const worker: WorkerRuntimeHandle = scheduler.createWorker({\n queues: args.queues,\n workflowsById,\n nodeResolver: args.preparedRuntime.container.resolve(CoreTokens.NodeResolver),\n credentialSessions: args.preparedRuntime.container.resolve(CoreTokens.CredentialSessionService),\n workflowExecutionRepository: args.preparedRuntime.container.resolve(CoreTokens.WorkflowExecutionRepository),\n continuation: engine,\n binaryStorage: args.preparedRuntime.container.resolve(CoreTokens.BinaryStorage),\n workflows: args.preparedRuntime.container.resolve(CoreTokens.WorkflowRunnerService),\n executionLimitsPolicy,\n });\n return {\n stop: async () => {\n await worker.stop();\n await scheduler.close();\n await args.preparedRuntime.stop({ stopWebsocketServer: false });\n },\n };\n }\n\n private async applyDatabaseMigrations(preparedRuntime: PreparedCodemationRuntime): Promise<void> {\n const appConfig = preparedRuntime.container.resolve(ApplicationTokens.AppConfig);\n if (\n preparedRuntime.implementationSelection.databasePersistence.kind === \"none\" ||\n preparedRuntime.usesProvidedPrismaClientOverride ||\n appConfig.env.CODEMATION_SKIP_STARTUP_MIGRATIONS === \"true\"\n ) {\n return;\n }\n await preparedRuntime.container\n .resolve(PrismaMigrationDeployer)\n .deployPersistence(preparedRuntime.implementationSelection.databasePersistence, appConfig.env);\n }\n}\n","import \"reflect-metadata\";\n\nimport type { Container, WorkflowDefinition } from \"@codemation/core\";\nimport { CoreTokens } from \"@codemation/core\";\nimport type { BootRuntimeSummary } from \"./application/dev/BootRuntimeSummary.types\";\nimport \"./application/commands/CopyRunToWorkflowDebuggerCommandHandler\";\nimport \"./application/commands/CredentialCommandHandlers\";\nimport \"./application/commands/HandleWebhookInvocationCommandHandler\";\nimport \"./application/commands/ReplayWorkflowNodeCommandHandler\";\nimport \"./application/commands/ReplaceMutableRunWorkflowSnapshotCommandHandler\";\nimport \"./application/commands/ReplaceWorkflowDebuggerOverlayCommandHandler\";\nimport \"./application/commands/SetPinnedNodeInputCommandHandler\";\nimport \"./application/commands/SetWorkflowActivationCommandHandler\";\nimport \"./application/commands/StartWorkflowRunCommandHandler\";\nimport \"./application/commands/UploadOverlayPinnedBinaryCommandHandler\";\nimport \"./application/commands/UserAccountCommandHandlers\";\nimport \"./application/queries/CredentialQueryHandlers\";\nimport \"./application/queries/GetRunBinaryAttachmentQueryHandler\";\nimport \"./application/queries/GetRunStateQueryHandler\";\nimport \"./application/queries/GetWorkflowDebuggerOverlayQueryHandler\";\nimport \"./application/queries/GetWorkflowDetailQueryHandler\";\nimport \"./application/queries/GetWorkflowOverlayBinaryAttachmentQueryHandler\";\nimport \"./application/queries/GetWorkflowSummariesQueryHandler\";\nimport \"./application/queries/ListWorkflowRunsQueryHandler\";\nimport \"./application/queries/UserAccountQueryHandlers\";\nimport \"./application/binary/OverlayPinnedBinaryUploadService\";\nimport \"./presentation/http/hono/registrars/BinaryHonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/CredentialHonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/DevHonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/OAuth2HonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/RunHonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/UserHonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/WebhookHonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/WhitelabelHonoApiRouteRegistrar\";\nimport \"./presentation/http/hono/registrars/WorkflowHonoApiRouteRegistrar\";\nimport \"./presentation/http/routeHandlers/BinaryHttpRouteHandlerFactory\";\nimport \"./presentation/http/routeHandlers/CredentialHttpRouteHandler\";\nimport \"./presentation/http/routeHandlers/OAuth2HttpRouteHandlerFactory\";\nimport \"./presentation/http/routeHandlers/RunHttpRouteHandler\";\nimport \"./presentation/http/routeHandlers/UserHttpRouteHandlerFactory\";\nimport \"./presentation/http/routeHandlers/WebhookHttpRouteHandler\";\nimport \"./presentation/http/routeHandlers/WorkflowHttpRouteHandler\";\nimport { logLevelPolicyFactory } from \"./infrastructure/logging/LogLevelPolicyFactory\";\nimport { FrameworkBuiltinCredentialTypesRegistrar } from \"./infrastructure/credentials/FrameworkBuiltinCredentialTypesRegistrar\";\nimport { OpenAiApiKeyCredentialHealthTester } from \"./infrastructure/credentials/OpenAiApiKeyCredentialHealthTester\";\nimport { OpenAiApiKeyCredentialTypeFactory } from \"./infrastructure/credentials/OpenAiApiKeyCredentialTypeFactory\";\nimport { CodemationPluginRegistrar } from \"./infrastructure/config/CodemationPluginRegistrar\";\nimport type { CredentialType } from \"./domain/credentials/CredentialServices\";\nimport { CredentialTypeRegistryImpl } from \"./domain/credentials/CredentialServices\";\nimport type { CodemationAuthConfig } from \"./presentation/config/CodemationAuthConfig\";\nimport type { CodemationApplicationRuntimeConfig, CodemationConfig } from \"./presentation/config/CodemationConfig\";\nimport type { NormalizedCodemationConfig } from \"./presentation/config/CodemationConfigNormalizer\";\nimport { CodemationConfigNormalizer } from \"./presentation/config/CodemationConfigNormalizer\";\nimport type { CodemationPlugin } from \"./presentation/config/CodemationPlugin\";\nimport type { CodemationWhitelabelConfig } from \"./presentation/config/CodemationWhitelabelConfig\";\nimport { WorkflowWebsocketServer } from \"./presentation/websocket/WorkflowWebsocketServer\";\nimport { ApplicationTokens } from \"./applicationTokens\";\nimport { CodemationBootstrapRequest } from \"./bootstrap/CodemationBootstrapRequest\";\nimport type { CodemationContainerRegistration } from \"./bootstrap/CodemationContainerRegistration\";\nimport { CodemationFrontendBootstrapRequest } from \"./bootstrap/CodemationFrontendBootstrapRequest\";\nimport { PreparedCodemationRuntime } from \"./bootstrap/PreparedCodemationRuntime\";\nimport { PreparedCodemationRuntimeFactory } from \"./bootstrap/PreparedCodemationRuntimeFactory\";\nimport { CodemationContainerFactory } from \"./bootstrap/CodemationContainerFactory\";\nimport { CodemationWorkerBootstrapRequest } from \"./bootstrap/CodemationWorkerBootstrapRequest\";\nimport { AppConfigFactory } from \"./bootstrap/runtime/AppConfigFactory\";\nimport { CliRuntimeBootService } from \"./bootstrap/boot/CliRuntimeBootService\";\nimport { FrontendRuntimeBootService } from \"./bootstrap/boot/FrontendRuntimeBootService\";\nimport { WorkerRuntimeBootService } from \"./bootstrap/boot/WorkerRuntimeBootService\";\n\ntype StopHandle = Readonly<{ stop: () => Promise<void> }>;\n\nexport type CodemationStopHandle = StopHandle;\n\nexport type CodemationApplicationConfig = CodemationConfig;\n\nexport class CodemationApplication {\n private readonly pluginRegistrar: CodemationPluginRegistrar;\n private readonly containerFactory: CodemationContainerFactory;\n private readonly preparedRuntimeFactory: PreparedCodemationRuntimeFactory;\n private readonly configNormalizer: CodemationConfigNormalizer;\n private readonly appConfigFactory: AppConfigFactory;\n private readonly cliRuntimeBootService: CliRuntimeBootService;\n private readonly frontendRuntimeBootService: FrontendRuntimeBootService;\n private readonly workerRuntimeBootService: WorkerRuntimeBootService;\n\n private configuredContainer: Container | null = null;\n private preparedRuntime: PreparedCodemationRuntime | null = null;\n private workflows: WorkflowDefinition[] = [];\n private runtimeConfig: CodemationApplicationRuntimeConfig = {};\n private containerRegistrations: ReadonlyArray<CodemationContainerRegistration<unknown>> = [];\n private hasConfiguredCredentialSessionServiceRegistration = false;\n private plugins: ReadonlyArray<CodemationPlugin> = [];\n private sharedWorkflowWebsocketServer: WorkflowWebsocketServer | null = null;\n private applicationAuthConfig: CodemationAuthConfig | undefined;\n private whitelabelConfig: CodemationWhitelabelConfig = {};\n private frameworkBuiltinCredentialTypesRegistered = false;\n private credentialTypes: Array<CredentialType<any, any, unknown>> = [];\n\n constructor(\n pluginRegistrar: CodemationPluginRegistrar = new CodemationPluginRegistrar(),\n containerFactory: CodemationContainerFactory = new CodemationContainerFactory(),\n preparedRuntimeFactory: PreparedCodemationRuntimeFactory = new PreparedCodemationRuntimeFactory(),\n configNormalizer: CodemationConfigNormalizer = new CodemationConfigNormalizer(),\n appConfigFactory: AppConfigFactory = new AppConfigFactory(),\n cliRuntimeBootService: CliRuntimeBootService = new CliRuntimeBootService(),\n frontendRuntimeBootService: FrontendRuntimeBootService = new FrontendRuntimeBootService(),\n workerRuntimeBootService: WorkerRuntimeBootService = new WorkerRuntimeBootService(),\n ) {\n this.pluginRegistrar = pluginRegistrar;\n this.containerFactory = containerFactory;\n this.preparedRuntimeFactory = preparedRuntimeFactory;\n this.configNormalizer = configNormalizer;\n this.appConfigFactory = appConfigFactory;\n this.cliRuntimeBootService = cliRuntimeBootService;\n this.frontendRuntimeBootService = frontendRuntimeBootService;\n this.workerRuntimeBootService = workerRuntimeBootService;\n }\n\n useConfig(config: CodemationApplicationConfig): this {\n const normalizedConfig: NormalizedCodemationConfig = this.configNormalizer.normalize(config);\n logLevelPolicyFactory.create().applyCodemationLogConfig(normalizedConfig.log);\n if (normalizedConfig.workflows) {\n this.useWorkflows(normalizedConfig.workflows);\n }\n this.useContainerRegistrations(normalizedConfig.containerRegistrations);\n if (!this.frameworkBuiltinCredentialTypesRegistered) {\n new FrameworkBuiltinCredentialTypesRegistrar(\n new OpenAiApiKeyCredentialTypeFactory(new OpenAiApiKeyCredentialHealthTester(globalThis.fetch)),\n ).register(this, normalizedConfig);\n this.frameworkBuiltinCredentialTypesRegistered = true;\n }\n if (normalizedConfig.credentialTypes) {\n for (const credentialType of normalizedConfig.credentialTypes) {\n this.registerCredentialType(credentialType);\n }\n }\n if (normalizedConfig.plugins) {\n this.usePlugins(normalizedConfig.plugins);\n }\n if (normalizedConfig.runtime) {\n this.useRuntimeConfig(normalizedConfig.runtime);\n }\n if (normalizedConfig.auth !== undefined) {\n this.applicationAuthConfig = normalizedConfig.auth;\n }\n this.whitelabelConfig = normalizedConfig.whitelabel ?? {};\n return this;\n }\n\n useWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): this {\n this.workflows = [...workflows];\n this.invalidatePreparedState();\n return this;\n }\n\n useRuntimeConfig(runtimeConfig: CodemationApplicationRuntimeConfig): this {\n this.runtimeConfig = {\n ...this.runtimeConfig,\n ...runtimeConfig,\n ...(runtimeConfig.engineExecutionLimits !== undefined\n ? {\n engineExecutionLimits: {\n ...this.runtimeConfig.engineExecutionLimits,\n ...runtimeConfig.engineExecutionLimits,\n },\n }\n : {}),\n };\n this.invalidatePreparedState();\n return this;\n }\n\n private useContainerRegistrations(registrations: ReadonlyArray<CodemationContainerRegistration<unknown>>): this {\n this.containerRegistrations = [...registrations];\n this.hasConfiguredCredentialSessionServiceRegistration = registrations.some(\n (entry) => entry.token === CoreTokens.CredentialSessionService,\n );\n this.invalidatePreparedState();\n return this;\n }\n\n usePlugins(plugins: ReadonlyArray<CodemationPlugin>): this {\n this.plugins = [...plugins];\n return this;\n }\n\n useSharedWorkflowWebsocketServer(workflowWebsocketServer: WorkflowWebsocketServer): this {\n this.sharedWorkflowWebsocketServer = workflowWebsocketServer;\n if (this.configuredContainer) {\n this.configuredContainer.registerInstance(WorkflowWebsocketServer, workflowWebsocketServer);\n this.configuredContainer.registerInstance(ApplicationTokens.WorkflowWebsocketPublisher, workflowWebsocketServer);\n }\n return this;\n }\n\n getRuntimeConfig(): CodemationApplicationRuntimeConfig {\n return { ...this.runtimeConfig };\n }\n\n getWorkflows(): ReadonlyArray<WorkflowDefinition> {\n return [...this.workflows];\n }\n\n getContainer(): Container {\n return this.ensureConfiguredContainer();\n }\n\n getBootRuntimeSummary(): BootRuntimeSummary | null {\n return this.preparedRuntime?.runtimeSummary ?? null;\n }\n\n registerCredentialType(type: CredentialType<any, any, unknown>): void {\n if (this.credentialTypes.some((entry) => entry.definition.typeId === type.definition.typeId)) {\n return;\n }\n this.credentialTypes.push(type);\n if (this.configuredContainer) {\n this.configuredContainer.resolve(CredentialTypeRegistryImpl).register(type);\n }\n }\n\n async applyPlugins(request: CodemationBootstrapRequest): Promise<void> {\n const container = this.ensureConfiguredContainer();\n const env = request.resolveEnvironment();\n await this.pluginRegistrar.apply({\n plugins: this.plugins,\n container,\n appConfig: this.appConfigFactory.create({\n repoRoot: request.repoRoot,\n consumerRoot: request.consumerRoot,\n env,\n workflowSources: request.workflowSources,\n runtimeConfig: this.runtimeConfig,\n authConfig: this.applicationAuthConfig,\n whitelabelConfig: this.whitelabelConfig,\n }),\n registerCredentialType: (type) => this.registerCredentialType(type),\n loggerFactory: container.resolve(ApplicationTokens.LoggerFactory),\n });\n }\n\n async prepareContainer(request: CodemationBootstrapRequest): Promise<PreparedCodemationRuntime> {\n if (this.preparedRuntime) {\n return this.preparedRuntime;\n }\n const env = request.resolveEnvironment();\n this.preparedRuntime = await this.preparedRuntimeFactory.prepare({\n container: this.ensureConfiguredContainer(),\n repoRoot: request.repoRoot,\n consumerRoot: request.consumerRoot,\n env,\n workflowSources: request.workflowSources,\n runtimeConfig: this.runtimeConfig,\n applicationAuthConfig: this.applicationAuthConfig,\n whitelabelConfig: this.whitelabelConfig,\n hasConfiguredCredentialSessionServiceRegistration: this.hasConfiguredCredentialSessionServiceRegistration,\n });\n return this.preparedRuntime;\n }\n\n async bootCli(request: CodemationBootstrapRequest): Promise<PreparedCodemationRuntime> {\n const preparedRuntime = await this.prepareContainer(request);\n await this.cliRuntimeBootService.boot({ preparedRuntime });\n return preparedRuntime;\n }\n\n async bootFrontend(request: CodemationFrontendBootstrapRequest): Promise<PreparedCodemationRuntime> {\n const preparedRuntime = await this.prepareContainer(request.bootstrap);\n await this.frontendRuntimeBootService.boot({\n preparedRuntime,\n skipPresentationServers: request.skipPresentationServers,\n });\n return preparedRuntime;\n }\n\n async bootWorker(request: CodemationWorkerBootstrapRequest): Promise<CodemationStopHandle> {\n const preparedRuntime = await this.prepareContainer(request.bootstrap);\n void request.bootstrapSource;\n return await this.workerRuntimeBootService.boot({\n preparedRuntime,\n queues: request.queues,\n });\n }\n\n async stop(args?: Readonly<{ stopWebsocketServer?: boolean }>): Promise<void> {\n if (!this.preparedRuntime) {\n return;\n }\n await this.preparedRuntime.stop(args);\n }\n\n private ensureConfiguredContainer(): Container {\n if (this.configuredContainer) {\n return this.configuredContainer;\n }\n this.configuredContainer = this.containerFactory.create({\n application: this,\n registrations: this.containerRegistrations,\n runtimeConfig: this.runtimeConfig,\n workflows: this.workflows,\n credentialTypes: this.credentialTypes,\n sharedWorkflowWebsocketServer: this.sharedWorkflowWebsocketServer,\n });\n return this.configuredContainer;\n }\n\n private invalidatePreparedState(): void {\n this.configuredContainer = null;\n this.preparedRuntime = null;\n }\n}\n","export class CodemationBootstrapRequest {\n readonly consumerRoot: string;\n readonly repoRoot: string;\n readonly workflowSources: ReadonlyArray<string>;\n readonly env?: Readonly<NodeJS.ProcessEnv>;\n\n constructor(\n args: Readonly<{\n consumerRoot: string;\n repoRoot: string;\n workflowSources?: ReadonlyArray<string>;\n env?: Readonly<NodeJS.ProcessEnv>;\n }>,\n ) {\n this.consumerRoot = args.consumerRoot;\n this.repoRoot = args.repoRoot;\n this.workflowSources = [...(args.workflowSources ?? [])];\n this.env = args.env;\n }\n\n resolveEnvironment(): NodeJS.ProcessEnv {\n return {\n ...process.env,\n ...(this.env ?? {}),\n };\n }\n}\n","import { CodemationBootstrapRequest } from \"./CodemationBootstrapRequest\";\n\nexport class CodemationFrontendBootstrapRequest {\n readonly bootstrap: CodemationBootstrapRequest;\n readonly skipPresentationServers: boolean;\n\n constructor(\n args: Readonly<{\n bootstrap: CodemationBootstrapRequest;\n skipPresentationServers?: boolean;\n }>,\n ) {\n this.bootstrap = args.bootstrap;\n this.skipPresentationServers = args.skipPresentationServers ?? false;\n }\n}\n"],"mappings":"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"}