@codemation/host 0.3.0 → 0.3.1

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 (26) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/{AppContainerFactory-D9je1sSV.js → AppContainerFactory-DL_qZ80U.js} +84 -132
  3. package/dist/AppContainerFactory-DL_qZ80U.js.map +1 -0
  4. package/dist/index.js +2 -2
  5. package/dist/nextServer.js +1 -1
  6. package/dist/{server-C_ZIEOTY.js → server-DteBORJX.js} +2 -2
  7. package/dist/{server-C_ZIEOTY.js.map → server-DteBORJX.js.map} +1 -1
  8. package/dist/server.js +2 -2
  9. package/package.json +5 -5
  10. package/src/bootstrap/AppContainerFactory.ts +77 -81
  11. package/src/bootstrap/CodemationContainerRegistrationRegistrar.ts +1 -3
  12. package/src/infrastructure/config/CodemationPluginRegistrar.ts +2 -6
  13. package/src/infrastructure/di/HandlesDomainEventRegistry.ts +5 -7
  14. package/src/presentation/http/hono/registrars/AuthHonoApiRouteRegistrar.ts +1 -3
  15. package/src/presentation/http/hono/registrars/BinaryHonoApiRouteRegistrar.ts +1 -3
  16. package/src/presentation/http/hono/registrars/BootstrapHonoApiRouteRegistrar.ts +1 -3
  17. package/src/presentation/http/hono/registrars/CredentialHonoApiRouteRegistrar.ts +1 -3
  18. package/src/presentation/http/hono/registrars/DevHonoApiRouteRegistrar.ts +1 -3
  19. package/src/presentation/http/hono/registrars/OAuth2HonoApiRouteRegistrar.ts +1 -3
  20. package/src/presentation/http/hono/registrars/RunHonoApiRouteRegistrar.ts +1 -3
  21. package/src/presentation/http/hono/registrars/TelemetryHonoApiRouteRegistrar.ts +1 -3
  22. package/src/presentation/http/hono/registrars/UserHonoApiRouteRegistrar.ts +1 -3
  23. package/src/presentation/http/hono/registrars/WebhookHonoApiRouteRegistrar.ts +1 -3
  24. package/src/presentation/http/hono/registrars/WhitelabelHonoApiRouteRegistrar.ts +1 -3
  25. package/src/presentation/http/hono/registrars/WorkflowHonoApiRouteRegistrar.ts +1 -3
  26. package/dist/AppContainerFactory-D9je1sSV.js.map +0 -1
package/dist/index.js CHANGED
@@ -6,11 +6,11 @@ import "./ServerLoggerFactory-CsNW5qhz.js";
6
6
  import "./decorateParam-D7WPDFAf.js";
7
7
  import "./decorate-Dq0XLibd.js";
8
8
  import { d as ApplicationTokens } from "./CredentialServices-BNBMFOPt.js";
9
- import { D as ListUserAccountsQuery, E as UpsertLocalBootstrapUserCommand, _ as FrontendAppConfigFactory, a as AppContainerLifecycle, b as ApiPaths, g as InternalAuthBootstrapFactory, h as PublicFrontendBootstrapFactory, i as DatabaseMigrations, n as WorkerRuntime, r as FrontendRuntime, t as AppContainerFactory, v as CodemationFrontendAuthSnapshotFactory } from "./AppContainerFactory-D9je1sSV.js";
9
+ import { D as ListUserAccountsQuery, E as UpsertLocalBootstrapUserCommand, _ as FrontendAppConfigFactory, a as AppContainerLifecycle, b as ApiPaths, g as InternalAuthBootstrapFactory, h as PublicFrontendBootstrapFactory, i as DatabaseMigrations, n as WorkerRuntime, r as FrontendRuntime, t as AppContainerFactory, v as CodemationFrontendAuthSnapshotFactory } from "./AppContainerFactory-DL_qZ80U.js";
10
10
  import { n as CodemationPluginPackageMetadata, t as AppConfigFactory } from "./AppConfigFactory-BPp02HMv.js";
11
11
  import { n as CodemationBootstrapRequest, t as CodemationPluginListMerger } from "./CodemationPluginListMerger-_lZaa6gO.js";
12
12
  import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-CA0_q0D7.js";
13
- import { r as CodemationServerGateway } from "./server-C_ZIEOTY.js";
13
+ import { r as CodemationServerGateway } from "./server-DteBORJX.js";
14
14
  import { workflow } from "@codemation/core-nodes";
15
15
 
16
16
  export { ApiPaths, AppConfigFactory, AppContainerFactory, AppContainerLifecycle, ApplicationTokens, CodemationBootstrapRequest, CodemationConsumerConfigLoader, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginListMerger, CodemationPluginPackageMetadata, CodemationPostgresPrismaClientFactory, CodemationServerGateway, DatabaseMigrations, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, FrontendRuntime, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, ListUserAccountsQuery, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, UpsertLocalBootstrapUserCommand, WorkerRuntime, defineCodemationApp, definePlugin, workflow };
@@ -3,7 +3,7 @@ import { a as FilteringLogger, i as PerformanceLogPolicy, n as PerformanceLogPol
3
3
  import "./decorateParam-D7WPDFAf.js";
4
4
  import "./decorate-Dq0XLibd.js";
5
5
  import { a as CredentialInstanceService, d as ApplicationTokens, i as CredentialBindingService } from "./CredentialServices-BNBMFOPt.js";
6
- import { S as WorkflowPolicyUiPresentationFactory, T as RunBinaryAttachmentLookupService, _ as FrontendAppConfigFactory, a as AppContainerLifecycle, c as WebhookHttpRouteHandler, d as OAuth2HttpRouteHandler, f as CredentialHttpRouteHandler, g as InternalAuthBootstrapFactory, h as PublicFrontendBootstrapFactory, i as DatabaseMigrations, l as RequestToWebhookItemMapper, m as BinaryHttpRouteHandler, n as WorkerRuntime, o as WorkflowRunRetentionPruneScheduler, p as CodemationHonoApiApp, r as FrontendRuntime, s as WorkflowHttpRouteHandler, t as AppContainerFactory, u as RunHttpRouteHandler, x as WorkflowDefinitionMapper, y as WorkflowWebsocketServer } from "./AppContainerFactory-D9je1sSV.js";
6
+ import { S as WorkflowPolicyUiPresentationFactory, T as RunBinaryAttachmentLookupService, _ as FrontendAppConfigFactory, a as AppContainerLifecycle, c as WebhookHttpRouteHandler, d as OAuth2HttpRouteHandler, f as CredentialHttpRouteHandler, g as InternalAuthBootstrapFactory, h as PublicFrontendBootstrapFactory, i as DatabaseMigrations, l as RequestToWebhookItemMapper, m as BinaryHttpRouteHandler, n as WorkerRuntime, o as WorkflowRunRetentionPruneScheduler, p as CodemationHonoApiApp, r as FrontendRuntime, s as WorkflowHttpRouteHandler, t as AppContainerFactory, u as RunHttpRouteHandler, x as WorkflowDefinitionMapper, y as WorkflowWebsocketServer } from "./AppContainerFactory-DL_qZ80U.js";
7
7
  import { t as AppConfigFactory } from "./AppConfigFactory-BPp02HMv.js";
8
8
  import { n as CodemationBootstrapRequest, t as CodemationPluginListMerger } from "./CodemationPluginListMerger-_lZaa6gO.js";
9
9
 
@@ -1,6 +1,6 @@
1
1
  import { a as CodemationConfigNormalizer, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-DovlxZNb.js";
2
2
  import { d as ApplicationTokens } from "./CredentialServices-BNBMFOPt.js";
3
- import { C as GetWorkflowSummariesQuery, a as AppContainerLifecycle, p as CodemationHonoApiApp, r as FrontendRuntime, t as AppContainerFactory, w as GetWorkflowDetailQuery, x as WorkflowDefinitionMapper } from "./AppContainerFactory-D9je1sSV.js";
3
+ import { C as GetWorkflowSummariesQuery, a as AppContainerLifecycle, p as CodemationHonoApiApp, r as FrontendRuntime, t as AppContainerFactory, w as GetWorkflowDetailQuery, x as WorkflowDefinitionMapper } from "./AppContainerFactory-DL_qZ80U.js";
4
4
  import { n as CodemationPluginPackageMetadata, t as AppConfigFactory } from "./AppConfigFactory-BPp02HMv.js";
5
5
  import { readFile, readdir } from "node:fs/promises";
6
6
  import path from "node:path";
@@ -218,4 +218,4 @@ var CodemationPluginDiscovery = class {
218
218
 
219
219
  //#endregion
220
220
  export { AppConfigLoader as n, CodemationServerGateway as r, CodemationPluginDiscovery as t };
221
- //# sourceMappingURL=server-C_ZIEOTY.js.map
221
+ //# sourceMappingURL=server-DteBORJX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-C_ZIEOTY.js","names":["config: CodemationConfig","consumerRoot: string","configSource?: string","workflowSources: ReadonlyArray<string>","env?: Readonly<NodeJS.ProcessEnv>","consumerConfigLoader: CodemationConsumerConfigLoader","appConfigFactory: AppConfigFactory","discoveredPackages: CodemationDiscoveredPluginPackage[]","resolvedPackages: CodemationResolvedPluginPackage[]","packageRoots: string[]"],"sources":["../src/presentation/http/CodemationServerGatewayFactory.ts","../src/presentation/server/AppConfigLoader.ts","../src/presentation/server/CodemationPluginDiscovery.ts"],"sourcesContent":["import { accessSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { QueryBus } from \"../../application/bus/QueryBus\";\nimport type { WorkflowDto, WorkflowSummary } from \"../../application/contracts/WorkflowViewContracts\";\nimport { WorkflowDefinitionMapper } from \"../../application/mapping/WorkflowDefinitionMapper\";\nimport { GetWorkflowDetailQuery } from \"../../application/queries/GetWorkflowDetailQuery\";\nimport { GetWorkflowSummariesQuery } from \"../../application/queries/GetWorkflowSummariesQuery\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { AppContainerFactory } from \"../../bootstrap/AppContainerFactory\";\nimport { AppContainerLifecycle } from \"../../bootstrap/AppContainerLifecycle\";\nimport { FrontendRuntime } from \"../../bootstrap/runtime/FrontendRuntime\";\nimport { AppConfigFactory } from \"../../bootstrap/runtime/AppConfigFactory\";\nimport type { CodemationConfig } from \"../config/CodemationConfig\";\nimport { CodemationConfigNormalizer } from \"../config/CodemationConfigNormalizer\";\nimport { CodemationHonoApiApp } from \"./hono/CodemationHonoApiAppFactory\";\n\ntype ServerGatewayContext = Readonly<{\n container: import(\"@codemation/core\").Container;\n httpApi: CodemationHonoApiApp;\n queryBus: QueryBus;\n workflowDefinitionMapper: WorkflowDefinitionMapper;\n}>;\n\nexport class CodemationServerGateway {\n private static readonly contextsByConfig = new WeakMap<object, Promise<ServerGatewayContext>>();\n\n constructor(\n private readonly config: CodemationConfig,\n private readonly consumerRoot: string,\n private readonly configSource?: string,\n private readonly workflowSources: ReadonlyArray<string> = [],\n private readonly env?: Readonly<NodeJS.ProcessEnv>,\n ) {}\n\n async dispatch(request: Request): Promise<Response> {\n return await (await this.getContext()).httpApi.fetch(request);\n }\n\n async prepare(): Promise<void> {\n await this.getContext();\n }\n\n async close(): Promise<void> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (!cachedContext) {\n return;\n }\n CodemationServerGateway.contextsByConfig.delete(this.config as object);\n await (await cachedContext).container.resolve(AppContainerLifecycle).stop();\n }\n\n async loadWorkflowSummaries(): Promise<ReadonlyArray<WorkflowSummary>> {\n const context = await this.getContext();\n const workflows = await context.queryBus.execute(new GetWorkflowSummariesQuery());\n return workflows.map((workflow) => context.workflowDefinitionMapper.toSummary(workflow));\n }\n\n async loadWorkflowDetail(workflowId: string): Promise<WorkflowDto> {\n const context = await this.getContext();\n const workflow = await context.queryBus.execute(new GetWorkflowDetailQuery(workflowId));\n if (!workflow) {\n throw new Error(`Unknown workflowId: ${workflowId}`);\n }\n return await context.workflowDefinitionMapper.map(workflow);\n }\n\n private getContext(): Promise<ServerGatewayContext> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (cachedContext) {\n return cachedContext;\n }\n const nextContext = this.createContext();\n CodemationServerGateway.contextsByConfig.set(this.config as object, nextContext);\n return nextContext;\n }\n\n private async createContext(): Promise<ServerGatewayContext> {\n const repoRoot = this.detectWorkspaceRoot(this.consumerRoot);\n // This gateway is the config/env boundary that materializes AppConfig from raw inputs.\n // eslint-disable-next-line no-restricted-properties\n const env = this.env ?? process.env;\n const appConfig = new AppConfigFactory().create({\n repoRoot,\n consumerRoot: this.consumerRoot,\n env,\n config: new CodemationConfigNormalizer().normalize(this.config),\n workflowSources: this.resolveWorkflowSources(),\n });\n const container = await new AppContainerFactory().create({\n appConfig,\n sharedWorkflowWebsocketServer: null,\n });\n await container.resolve(FrontendRuntime).start();\n return {\n container,\n httpApi: container.resolve(CodemationHonoApiApp),\n queryBus: container.resolve(ApplicationTokens.QueryBus),\n workflowDefinitionMapper: container.resolve(WorkflowDefinitionMapper),\n };\n }\n\n private resolveWorkflowSources(): ReadonlyArray<string> {\n if (this.workflowSources.length > 0) {\n return [...this.workflowSources];\n }\n if (!this.configSource || !this.config.workflows || this.config.workflows.length === 0) {\n return [];\n }\n return [this.configSource];\n }\n private detectWorkspaceRoot(startDirectory: string): string {\n let currentDirectory = path.resolve(startDirectory);\n while (true) {\n try {\n accessSync(path.resolve(currentDirectory, \"pnpm-workspace.yaml\"));\n return currentDirectory;\n } catch {\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n return startDirectory;\n }\n currentDirectory = parentDirectory;\n }\n }\n }\n}\n","import type { AppConfig } from \"../config/AppConfig\";\nimport { CodemationConsumerConfigLoader } from \"./CodemationConsumerConfigLoader\";\nimport { AppConfigFactory } from \"../../bootstrap/runtime/AppConfigFactory\";\n\nexport type AppConfigLoadResult = Readonly<{\n appConfig: AppConfig;\n bootstrapSource: string | null;\n}>;\n\nexport class AppConfigLoader {\n constructor(\n private readonly consumerConfigLoader: CodemationConsumerConfigLoader = new CodemationConsumerConfigLoader(),\n private readonly appConfigFactory: AppConfigFactory = new AppConfigFactory(),\n ) {}\n\n async load(\n args: Readonly<{\n consumerRoot: string;\n repoRoot: string;\n env: NodeJS.ProcessEnv;\n configPathOverride?: string;\n }>,\n ): Promise<AppConfigLoadResult> {\n const resolution = await this.consumerConfigLoader.load({\n consumerRoot: args.consumerRoot,\n configPathOverride: args.configPathOverride,\n });\n return {\n appConfig: this.appConfigFactory.create({\n repoRoot: args.repoRoot,\n consumerRoot: args.consumerRoot,\n env: args.env,\n config: resolution.config,\n workflowSources: resolution.workflowSources,\n }),\n bootstrapSource: resolution.bootstrapSource,\n };\n }\n}\n","import type { CodemationPackageManifest } from \"../config/CodemationPackageManifest\";\nimport { CodemationPluginPackageMetadata, type CodemationPlugin } from \"../config/CodemationPlugin\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport type CodemationDiscoveredPluginPackage = Readonly<{\n packageName: string;\n packageRoot: string;\n pluginEntry: string;\n developmentEntry?: string;\n}>;\n\nexport type CodemationResolvedPluginPackage = Readonly<\n CodemationDiscoveredPluginPackage & {\n plugin: CodemationPlugin;\n }\n>;\n\ntype PackageJsonShape = Readonly<{\n codemation?: CodemationPackageManifest;\n name?: string;\n exports?: Readonly<Record<string, unknown>>;\n}>;\n\nexport class CodemationPluginDiscovery {\n private readonly pluginPackageMetadata = new CodemationPluginPackageMetadata();\n\n async discover(consumerRoot: string): Promise<ReadonlyArray<CodemationDiscoveredPluginPackage>> {\n const nodeModulesRoot = path.resolve(consumerRoot, \"node_modules\");\n const packageRoots = await this.collectPackageRoots(nodeModulesRoot);\n const discoveredPackages: CodemationDiscoveredPluginPackage[] = [];\n for (const packageRoot of packageRoots) {\n const packageJson = await this.readPackageJson(path.resolve(packageRoot, \"package.json\"));\n const pluginManifest = packageJson.codemation?.plugin;\n if (!packageJson.name || typeof pluginManifest !== \"string\" || pluginManifest.trim().length === 0) {\n continue;\n }\n discoveredPackages.push({\n packageName: packageJson.name,\n packageRoot,\n pluginEntry: pluginManifest,\n developmentEntry: await this.resolveDevelopmentPluginEntry(packageRoot),\n });\n }\n return discoveredPackages.sort((left, right) => left.packageName.localeCompare(right.packageName));\n }\n\n async resolvePlugins(consumerRoot: string): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const discoveredPackages = await this.discover(consumerRoot);\n return await this.resolveDiscoveredPackages(discoveredPackages);\n }\n\n async resolveDiscoveredPackages(\n discoveredPackages: ReadonlyArray<CodemationDiscoveredPluginPackage>,\n ): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const resolvedPackages: CodemationResolvedPluginPackage[] = [];\n for (const discoveredPackage of discoveredPackages) {\n resolvedPackages.push({\n ...discoveredPackage,\n plugin: await this.loadPlugin(discoveredPackage),\n });\n }\n return resolvedPackages;\n }\n\n private async collectPackageRoots(nodeModulesRoot: string): Promise<ReadonlyArray<string>> {\n try {\n const entries = await readdir(nodeModulesRoot, { withFileTypes: true });\n const packageRoots: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n continue;\n }\n if (entry.name.startsWith(\"@\")) {\n const scopedEntries = await readdir(path.resolve(nodeModulesRoot, entry.name), { withFileTypes: true });\n for (const scopedEntry of scopedEntries) {\n if (scopedEntry.isDirectory() || scopedEntry.isSymbolicLink()) {\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name, scopedEntry.name));\n }\n }\n continue;\n }\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name));\n }\n return packageRoots;\n } catch {\n return [];\n }\n }\n\n private async readPackageJson(packageJsonPath: string): Promise<PackageJsonShape> {\n try {\n const rawPackageJson = await readFile(packageJsonPath, \"utf8\");\n return JSON.parse(rawPackageJson) as PackageJsonShape;\n } catch {\n return {};\n }\n }\n\n private async loadPlugin(discoveredPackage: CodemationDiscoveredPluginPackage): Promise<CodemationPlugin> {\n const pluginModulePath = path.resolve(discoveredPackage.packageRoot, this.resolvePluginEntry(discoveredPackage));\n const importedModule = (await import(\n /* webpackIgnore: true */ this.resolvePluginModuleSpecifier(pluginModulePath)\n )) as Record<string, unknown>;\n const exportedValue = importedModule.default;\n const plugin = this.resolvePluginValue(exportedValue);\n if (!plugin) {\n throw new Error(`Plugin package \"${discoveredPackage.packageName}\" did not default-export a Codemation plugin.`);\n }\n return this.pluginPackageMetadata.attachPackageName(plugin, discoveredPackage.packageName);\n }\n\n private resolvePluginValue(value: unknown): CodemationPlugin | null {\n if (this.isPluginConfig(value)) {\n return value;\n }\n return null;\n }\n\n private isPluginConfig(value: unknown): value is CodemationPlugin {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const pluginValue = value as {\n credentialTypes?: unknown;\n register?: unknown;\n sandbox?: unknown;\n };\n if (pluginValue.register !== undefined && typeof pluginValue.register !== \"function\") {\n return false;\n }\n if (pluginValue.credentialTypes !== undefined && !Array.isArray(pluginValue.credentialTypes)) {\n return false;\n }\n return (\n pluginValue.register !== undefined ||\n pluginValue.credentialTypes !== undefined ||\n pluginValue.sandbox !== undefined ||\n Object.keys(pluginValue).length === 0\n );\n }\n\n private resolvePluginEntry(discoveredPackage: CodemationDiscoveredPluginPackage): string {\n const preferSource =\n process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === \"true\" &&\n typeof discoveredPackage.developmentEntry === \"string\" &&\n discoveredPackage.developmentEntry.trim().length > 0;\n const selectedEntry = preferSource ? discoveredPackage.developmentEntry : discoveredPackage.pluginEntry;\n return selectedEntry;\n }\n\n private async resolveDevelopmentPluginEntry(packageRoot: string): Promise<string | undefined> {\n const candidates = [\n path.resolve(packageRoot, \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"codemation.plugin.js\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.js\"),\n ];\n for (const candidate of candidates) {\n if (await this.exists(candidate)) {\n return path.relative(packageRoot, candidate);\n }\n }\n return undefined;\n }\n\n private async exists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath, \"utf8\");\n return true;\n } catch {\n return false;\n }\n }\n\n private resolvePluginModuleSpecifier(pluginModulePath: string): string {\n return pathToFileURL(pluginModulePath).href;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server-DteBORJX.js","names":["config: CodemationConfig","consumerRoot: string","configSource?: string","workflowSources: ReadonlyArray<string>","env?: Readonly<NodeJS.ProcessEnv>","consumerConfigLoader: CodemationConsumerConfigLoader","appConfigFactory: AppConfigFactory","discoveredPackages: CodemationDiscoveredPluginPackage[]","resolvedPackages: CodemationResolvedPluginPackage[]","packageRoots: string[]"],"sources":["../src/presentation/http/CodemationServerGatewayFactory.ts","../src/presentation/server/AppConfigLoader.ts","../src/presentation/server/CodemationPluginDiscovery.ts"],"sourcesContent":["import { accessSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { QueryBus } from \"../../application/bus/QueryBus\";\nimport type { WorkflowDto, WorkflowSummary } from \"../../application/contracts/WorkflowViewContracts\";\nimport { WorkflowDefinitionMapper } from \"../../application/mapping/WorkflowDefinitionMapper\";\nimport { GetWorkflowDetailQuery } from \"../../application/queries/GetWorkflowDetailQuery\";\nimport { GetWorkflowSummariesQuery } from \"../../application/queries/GetWorkflowSummariesQuery\";\nimport { ApplicationTokens } from \"../../applicationTokens\";\nimport { AppContainerFactory } from \"../../bootstrap/AppContainerFactory\";\nimport { AppContainerLifecycle } from \"../../bootstrap/AppContainerLifecycle\";\nimport { FrontendRuntime } from \"../../bootstrap/runtime/FrontendRuntime\";\nimport { AppConfigFactory } from \"../../bootstrap/runtime/AppConfigFactory\";\nimport type { CodemationConfig } from \"../config/CodemationConfig\";\nimport { CodemationConfigNormalizer } from \"../config/CodemationConfigNormalizer\";\nimport { CodemationHonoApiApp } from \"./hono/CodemationHonoApiAppFactory\";\n\ntype ServerGatewayContext = Readonly<{\n container: import(\"@codemation/core\").Container;\n httpApi: CodemationHonoApiApp;\n queryBus: QueryBus;\n workflowDefinitionMapper: WorkflowDefinitionMapper;\n}>;\n\nexport class CodemationServerGateway {\n private static readonly contextsByConfig = new WeakMap<object, Promise<ServerGatewayContext>>();\n\n constructor(\n private readonly config: CodemationConfig,\n private readonly consumerRoot: string,\n private readonly configSource?: string,\n private readonly workflowSources: ReadonlyArray<string> = [],\n private readonly env?: Readonly<NodeJS.ProcessEnv>,\n ) {}\n\n async dispatch(request: Request): Promise<Response> {\n return await (await this.getContext()).httpApi.fetch(request);\n }\n\n async prepare(): Promise<void> {\n await this.getContext();\n }\n\n async close(): Promise<void> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (!cachedContext) {\n return;\n }\n CodemationServerGateway.contextsByConfig.delete(this.config as object);\n await (await cachedContext).container.resolve(AppContainerLifecycle).stop();\n }\n\n async loadWorkflowSummaries(): Promise<ReadonlyArray<WorkflowSummary>> {\n const context = await this.getContext();\n const workflows = await context.queryBus.execute(new GetWorkflowSummariesQuery());\n return workflows.map((workflow) => context.workflowDefinitionMapper.toSummary(workflow));\n }\n\n async loadWorkflowDetail(workflowId: string): Promise<WorkflowDto> {\n const context = await this.getContext();\n const workflow = await context.queryBus.execute(new GetWorkflowDetailQuery(workflowId));\n if (!workflow) {\n throw new Error(`Unknown workflowId: ${workflowId}`);\n }\n return await context.workflowDefinitionMapper.map(workflow);\n }\n\n private getContext(): Promise<ServerGatewayContext> {\n const cachedContext = CodemationServerGateway.contextsByConfig.get(this.config as object);\n if (cachedContext) {\n return cachedContext;\n }\n const nextContext = this.createContext();\n CodemationServerGateway.contextsByConfig.set(this.config as object, nextContext);\n return nextContext;\n }\n\n private async createContext(): Promise<ServerGatewayContext> {\n const repoRoot = this.detectWorkspaceRoot(this.consumerRoot);\n // This gateway is the config/env boundary that materializes AppConfig from raw inputs.\n // eslint-disable-next-line no-restricted-properties\n const env = this.env ?? process.env;\n const appConfig = new AppConfigFactory().create({\n repoRoot,\n consumerRoot: this.consumerRoot,\n env,\n config: new CodemationConfigNormalizer().normalize(this.config),\n workflowSources: this.resolveWorkflowSources(),\n });\n const container = await new AppContainerFactory().create({\n appConfig,\n sharedWorkflowWebsocketServer: null,\n });\n await container.resolve(FrontendRuntime).start();\n return {\n container,\n httpApi: container.resolve(CodemationHonoApiApp),\n queryBus: container.resolve(ApplicationTokens.QueryBus),\n workflowDefinitionMapper: container.resolve(WorkflowDefinitionMapper),\n };\n }\n\n private resolveWorkflowSources(): ReadonlyArray<string> {\n if (this.workflowSources.length > 0) {\n return [...this.workflowSources];\n }\n if (!this.configSource || !this.config.workflows || this.config.workflows.length === 0) {\n return [];\n }\n return [this.configSource];\n }\n private detectWorkspaceRoot(startDirectory: string): string {\n let currentDirectory = path.resolve(startDirectory);\n while (true) {\n try {\n accessSync(path.resolve(currentDirectory, \"pnpm-workspace.yaml\"));\n return currentDirectory;\n } catch {\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n return startDirectory;\n }\n currentDirectory = parentDirectory;\n }\n }\n }\n}\n","import type { AppConfig } from \"../config/AppConfig\";\nimport { CodemationConsumerConfigLoader } from \"./CodemationConsumerConfigLoader\";\nimport { AppConfigFactory } from \"../../bootstrap/runtime/AppConfigFactory\";\n\nexport type AppConfigLoadResult = Readonly<{\n appConfig: AppConfig;\n bootstrapSource: string | null;\n}>;\n\nexport class AppConfigLoader {\n constructor(\n private readonly consumerConfigLoader: CodemationConsumerConfigLoader = new CodemationConsumerConfigLoader(),\n private readonly appConfigFactory: AppConfigFactory = new AppConfigFactory(),\n ) {}\n\n async load(\n args: Readonly<{\n consumerRoot: string;\n repoRoot: string;\n env: NodeJS.ProcessEnv;\n configPathOverride?: string;\n }>,\n ): Promise<AppConfigLoadResult> {\n const resolution = await this.consumerConfigLoader.load({\n consumerRoot: args.consumerRoot,\n configPathOverride: args.configPathOverride,\n });\n return {\n appConfig: this.appConfigFactory.create({\n repoRoot: args.repoRoot,\n consumerRoot: args.consumerRoot,\n env: args.env,\n config: resolution.config,\n workflowSources: resolution.workflowSources,\n }),\n bootstrapSource: resolution.bootstrapSource,\n };\n }\n}\n","import type { CodemationPackageManifest } from \"../config/CodemationPackageManifest\";\nimport { CodemationPluginPackageMetadata, type CodemationPlugin } from \"../config/CodemationPlugin\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport type CodemationDiscoveredPluginPackage = Readonly<{\n packageName: string;\n packageRoot: string;\n pluginEntry: string;\n developmentEntry?: string;\n}>;\n\nexport type CodemationResolvedPluginPackage = Readonly<\n CodemationDiscoveredPluginPackage & {\n plugin: CodemationPlugin;\n }\n>;\n\ntype PackageJsonShape = Readonly<{\n codemation?: CodemationPackageManifest;\n name?: string;\n exports?: Readonly<Record<string, unknown>>;\n}>;\n\nexport class CodemationPluginDiscovery {\n private readonly pluginPackageMetadata = new CodemationPluginPackageMetadata();\n\n async discover(consumerRoot: string): Promise<ReadonlyArray<CodemationDiscoveredPluginPackage>> {\n const nodeModulesRoot = path.resolve(consumerRoot, \"node_modules\");\n const packageRoots = await this.collectPackageRoots(nodeModulesRoot);\n const discoveredPackages: CodemationDiscoveredPluginPackage[] = [];\n for (const packageRoot of packageRoots) {\n const packageJson = await this.readPackageJson(path.resolve(packageRoot, \"package.json\"));\n const pluginManifest = packageJson.codemation?.plugin;\n if (!packageJson.name || typeof pluginManifest !== \"string\" || pluginManifest.trim().length === 0) {\n continue;\n }\n discoveredPackages.push({\n packageName: packageJson.name,\n packageRoot,\n pluginEntry: pluginManifest,\n developmentEntry: await this.resolveDevelopmentPluginEntry(packageRoot),\n });\n }\n return discoveredPackages.sort((left, right) => left.packageName.localeCompare(right.packageName));\n }\n\n async resolvePlugins(consumerRoot: string): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const discoveredPackages = await this.discover(consumerRoot);\n return await this.resolveDiscoveredPackages(discoveredPackages);\n }\n\n async resolveDiscoveredPackages(\n discoveredPackages: ReadonlyArray<CodemationDiscoveredPluginPackage>,\n ): Promise<ReadonlyArray<CodemationResolvedPluginPackage>> {\n const resolvedPackages: CodemationResolvedPluginPackage[] = [];\n for (const discoveredPackage of discoveredPackages) {\n resolvedPackages.push({\n ...discoveredPackage,\n plugin: await this.loadPlugin(discoveredPackage),\n });\n }\n return resolvedPackages;\n }\n\n private async collectPackageRoots(nodeModulesRoot: string): Promise<ReadonlyArray<string>> {\n try {\n const entries = await readdir(nodeModulesRoot, { withFileTypes: true });\n const packageRoots: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n continue;\n }\n if (entry.name.startsWith(\"@\")) {\n const scopedEntries = await readdir(path.resolve(nodeModulesRoot, entry.name), { withFileTypes: true });\n for (const scopedEntry of scopedEntries) {\n if (scopedEntry.isDirectory() || scopedEntry.isSymbolicLink()) {\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name, scopedEntry.name));\n }\n }\n continue;\n }\n packageRoots.push(path.resolve(nodeModulesRoot, entry.name));\n }\n return packageRoots;\n } catch {\n return [];\n }\n }\n\n private async readPackageJson(packageJsonPath: string): Promise<PackageJsonShape> {\n try {\n const rawPackageJson = await readFile(packageJsonPath, \"utf8\");\n return JSON.parse(rawPackageJson) as PackageJsonShape;\n } catch {\n return {};\n }\n }\n\n private async loadPlugin(discoveredPackage: CodemationDiscoveredPluginPackage): Promise<CodemationPlugin> {\n const pluginModulePath = path.resolve(discoveredPackage.packageRoot, this.resolvePluginEntry(discoveredPackage));\n const importedModule = (await import(\n /* webpackIgnore: true */ this.resolvePluginModuleSpecifier(pluginModulePath)\n )) as Record<string, unknown>;\n const exportedValue = importedModule.default;\n const plugin = this.resolvePluginValue(exportedValue);\n if (!plugin) {\n throw new Error(`Plugin package \"${discoveredPackage.packageName}\" did not default-export a Codemation plugin.`);\n }\n return this.pluginPackageMetadata.attachPackageName(plugin, discoveredPackage.packageName);\n }\n\n private resolvePluginValue(value: unknown): CodemationPlugin | null {\n if (this.isPluginConfig(value)) {\n return value;\n }\n return null;\n }\n\n private isPluginConfig(value: unknown): value is CodemationPlugin {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const pluginValue = value as {\n credentialTypes?: unknown;\n register?: unknown;\n sandbox?: unknown;\n };\n if (pluginValue.register !== undefined && typeof pluginValue.register !== \"function\") {\n return false;\n }\n if (pluginValue.credentialTypes !== undefined && !Array.isArray(pluginValue.credentialTypes)) {\n return false;\n }\n return (\n pluginValue.register !== undefined ||\n pluginValue.credentialTypes !== undefined ||\n pluginValue.sandbox !== undefined ||\n Object.keys(pluginValue).length === 0\n );\n }\n\n private resolvePluginEntry(discoveredPackage: CodemationDiscoveredPluginPackage): string {\n const preferSource =\n process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === \"true\" &&\n typeof discoveredPackage.developmentEntry === \"string\" &&\n discoveredPackage.developmentEntry.trim().length > 0;\n const selectedEntry = preferSource ? discoveredPackage.developmentEntry : discoveredPackage.pluginEntry;\n return selectedEntry;\n }\n\n private async resolveDevelopmentPluginEntry(packageRoot: string): Promise<string | undefined> {\n const candidates = [\n path.resolve(packageRoot, \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"codemation.plugin.js\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.js\"),\n ];\n for (const candidate of candidates) {\n if (await this.exists(candidate)) {\n return path.relative(packageRoot, candidate);\n }\n }\n return undefined;\n }\n\n private async exists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath, \"utf8\");\n return true;\n } catch {\n return false;\n }\n }\n\n private resolvePluginModuleSpecifier(pluginModulePath: string): string {\n return pathToFileURL(pluginModulePath).href;\n }\n}\n"],"mappings":"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"}
package/dist/server.js CHANGED
@@ -5,9 +5,9 @@ import "./ServerLoggerFactory-CsNW5qhz.js";
5
5
  import "./decorateParam-D7WPDFAf.js";
6
6
  import "./decorate-Dq0XLibd.js";
7
7
  import "./CredentialServices-BNBMFOPt.js";
8
- import { _ as FrontendAppConfigFactory, b as ApiPaths, g as InternalAuthBootstrapFactory, h as PublicFrontendBootstrapFactory, v as CodemationFrontendAuthSnapshotFactory } from "./AppContainerFactory-D9je1sSV.js";
8
+ import { _ as FrontendAppConfigFactory, b as ApiPaths, g as InternalAuthBootstrapFactory, h as PublicFrontendBootstrapFactory, v as CodemationFrontendAuthSnapshotFactory } from "./AppContainerFactory-DL_qZ80U.js";
9
9
  import "./AppConfigFactory-BPp02HMv.js";
10
10
  import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-CA0_q0D7.js";
11
- import { n as AppConfigLoader, r as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-C_ZIEOTY.js";
11
+ import { n as AppConfigLoader, r as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-DteBORJX.js";
12
12
 
13
13
  export { ApiPaths, AppConfigLoader, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationServerGateway, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemation/host",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -119,9 +119,9 @@
119
119
  "tsx": "^4.21.0",
120
120
  "ws": "^8.19.0",
121
121
  "zxcvbn": "^4.4.2",
122
- "@codemation/core": "0.8.0",
123
- "@codemation/core-nodes": "0.4.2",
124
- "@codemation/eventbus-redis": "0.0.30"
122
+ "@codemation/core": "0.8.1",
123
+ "@codemation/core-nodes": "0.4.3",
124
+ "@codemation/eventbus-redis": "0.0.31"
125
125
  },
126
126
  "devDependencies": {
127
127
  "@playwright/test": "^1.58.2",
@@ -147,7 +147,7 @@
147
147
  "typescript": "^5.9.3",
148
148
  "vitest": "^4.0.18",
149
149
  "zod": "^4.3.6",
150
- "@codemation/core-nodes-gmail": "0.1.4"
150
+ "@codemation/core-nodes-gmail": "0.1.5"
151
151
  },
152
152
  "scripts": {
153
153
  "changeset:verify": "pnpm --workspace-root run changeset:verify",
@@ -365,7 +365,7 @@ export class AppContainerFactory {
365
365
  dependencyContainer.resolve(CredentialTypeRegistryImpl),
366
366
  ),
367
367
  });
368
- container.register(CodemationIdFactory, { useClass: CodemationIdFactory });
368
+ container.registerSingleton(CodemationIdFactory, CodemationIdFactory);
369
369
  container.register(CoreTokens.RunIdFactory, {
370
370
  useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(CodemationIdFactory)),
371
371
  });
@@ -420,7 +420,7 @@ export class AppContainerFactory {
420
420
  },
421
421
  });
422
422
  container.registerInstance(LogLevelPolicyFactory, logLevelPolicyFactory);
423
- container.register(ServerLoggerFactory, { useClass: ServerLoggerFactory });
423
+ container.registerSingleton(ServerLoggerFactory, ServerLoggerFactory);
424
424
  container.register(ApplicationTokens.LoggerFactory, {
425
425
  useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(ServerLoggerFactory)),
426
426
  });
@@ -441,43 +441,41 @@ export class AppContainerFactory {
441
441
  );
442
442
  }),
443
443
  });
444
- container.register(PrismaClientFactory, { useClass: PrismaClientFactory });
445
- container.register(WorkflowPolicyUiPresentationFactory, { useClass: WorkflowPolicyUiPresentationFactory });
446
- container.register(WorkflowDefinitionMapper, { useClass: WorkflowDefinitionMapper });
447
- container.register(RequestToWebhookItemMapper, { useClass: RequestToWebhookItemMapper });
448
- container.register(WebhookEndpointPathValidator, { useClass: WebhookEndpointPathValidator });
449
- container.register(CredentialSecretCipher, { useClass: CredentialSecretCipher });
450
- container.register(CredentialMaterialResolver, { useClass: CredentialMaterialResolver });
451
- container.register(CredentialFieldEnvOverlayService, { useClass: CredentialFieldEnvOverlayService });
452
- container.register(CredentialRuntimeMaterialService, { useClass: CredentialRuntimeMaterialService });
453
- container.register(WorkflowCredentialNodeResolver, { useClass: WorkflowCredentialNodeResolver });
454
- container.register(CredentialInstanceService, { useClass: CredentialInstanceService });
455
- container.register(CredentialBindingService, { useClass: CredentialBindingService });
456
- container.register(WorkflowActivationPreflightRules, { useClass: WorkflowActivationPreflightRules });
457
- container.register(WorkflowActivationPreflight, { useClass: WorkflowActivationPreflight });
458
- container.register(CredentialTestService, { useClass: CredentialTestService });
459
- container.register(CredentialSessionServiceImpl, { useClass: CredentialSessionServiceImpl });
444
+ container.registerSingleton(PrismaClientFactory, PrismaClientFactory);
445
+ container.registerSingleton(WorkflowPolicyUiPresentationFactory, WorkflowPolicyUiPresentationFactory);
446
+ container.registerSingleton(WorkflowDefinitionMapper, WorkflowDefinitionMapper);
447
+ container.registerSingleton(RequestToWebhookItemMapper, RequestToWebhookItemMapper);
448
+ container.registerSingleton(WebhookEndpointPathValidator, WebhookEndpointPathValidator);
449
+ container.registerSingleton(CredentialSecretCipher, CredentialSecretCipher);
450
+ container.registerSingleton(CredentialMaterialResolver, CredentialMaterialResolver);
451
+ container.registerSingleton(CredentialFieldEnvOverlayService, CredentialFieldEnvOverlayService);
452
+ container.registerSingleton(CredentialRuntimeMaterialService, CredentialRuntimeMaterialService);
453
+ container.registerSingleton(WorkflowCredentialNodeResolver, WorkflowCredentialNodeResolver);
454
+ container.registerSingleton(CredentialInstanceService, CredentialInstanceService);
455
+ container.registerSingleton(CredentialBindingService, CredentialBindingService);
456
+ container.registerSingleton(WorkflowActivationPreflightRules, WorkflowActivationPreflightRules);
457
+ container.registerSingleton(WorkflowActivationPreflight, WorkflowActivationPreflight);
458
+ container.registerSingleton(CredentialTestService, CredentialTestService);
459
+ container.registerSingleton(CredentialSessionServiceImpl, CredentialSessionServiceImpl);
460
460
  if (!inputs.appConfig.hasConfiguredCredentialSessionServiceRegistration) {
461
461
  container.register(CoreTokens.CredentialSessionService, { useToken: CredentialSessionServiceImpl });
462
462
  }
463
- container.register(OAuth2ProviderRegistry, { useClass: OAuth2ProviderRegistry });
464
- container.register(OAuth2ConnectService, { useClass: OAuth2ConnectService });
465
- container.register(CodemationFrontendAuthSnapshotFactory, { useClass: CodemationFrontendAuthSnapshotFactory });
466
- container.register(FrontendAppConfigFactory, { useClass: FrontendAppConfigFactory });
467
- container.register(PublicFrontendBootstrapFactory, { useClass: PublicFrontendBootstrapFactory });
468
- container.register(InternalAuthBootstrapFactory, { useClass: InternalAuthBootstrapFactory });
469
- container.register(DatabaseMigrations, { useClass: DatabaseMigrations });
470
- container.register(FrontendRuntime, { useClass: FrontendRuntime });
471
- container.register(WorkerRuntime, { useClass: WorkerRuntime });
472
- container.register(DevelopmentSessionBypassVerifier, { useClass: DevelopmentSessionBypassVerifier });
473
- container.register(SecureRequestDetector, { useClass: SecureRequestDetector });
474
- container.register(InAppCallbackUrlPolicy, { useClass: InAppCallbackUrlPolicy });
475
- container.register(AuthSessionCookieFactory, { useClass: AuthSessionCookieFactory });
476
- container.register(CodemationBetterAuthBcryptPasswordCodec, { useClass: CodemationBetterAuthBcryptPasswordCodec });
477
- container.register(CodemationBetterAuthDatabaseOptionsFactory, {
478
- useClass: CodemationBetterAuthDatabaseOptionsFactory,
479
- });
480
- container.register(UserAccountSessionPolicy, { useClass: UserAccountSessionPolicy });
463
+ container.registerSingleton(OAuth2ProviderRegistry, OAuth2ProviderRegistry);
464
+ container.registerSingleton(OAuth2ConnectService, OAuth2ConnectService);
465
+ container.registerSingleton(CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotFactory);
466
+ container.registerSingleton(FrontendAppConfigFactory, FrontendAppConfigFactory);
467
+ container.registerSingleton(PublicFrontendBootstrapFactory, PublicFrontendBootstrapFactory);
468
+ container.registerSingleton(InternalAuthBootstrapFactory, InternalAuthBootstrapFactory);
469
+ container.registerSingleton(DatabaseMigrations, DatabaseMigrations);
470
+ container.registerSingleton(FrontendRuntime, FrontendRuntime);
471
+ container.registerSingleton(WorkerRuntime, WorkerRuntime);
472
+ container.registerSingleton(DevelopmentSessionBypassVerifier, DevelopmentSessionBypassVerifier);
473
+ container.registerSingleton(SecureRequestDetector, SecureRequestDetector);
474
+ container.registerSingleton(InAppCallbackUrlPolicy, InAppCallbackUrlPolicy);
475
+ container.registerSingleton(AuthSessionCookieFactory, AuthSessionCookieFactory);
476
+ container.registerSingleton(CodemationBetterAuthBcryptPasswordCodec, CodemationBetterAuthBcryptPasswordCodec);
477
+ container.registerSingleton(CodemationBetterAuthDatabaseOptionsFactory, CodemationBetterAuthDatabaseOptionsFactory);
478
+ container.registerSingleton(UserAccountSessionPolicy, UserAccountSessionPolicy);
481
479
  container.register(CodemationBetterAuthBaseUrlPolicy, {
482
480
  useFactory: instanceCachingFactory(
483
481
  (dependencyContainer) =>
@@ -524,7 +522,7 @@ export class AppContainerFactory {
524
522
  return new BetterAuthApiSessionVerifier(runtime, eligibility);
525
523
  }),
526
524
  });
527
- container.register(CodemationSessionVerifier, { useClass: CodemationSessionVerifier });
525
+ container.registerSingleton(CodemationSessionVerifier, CodemationSessionVerifier);
528
526
  container.register(ApplicationTokens.SessionVerifier, {
529
527
  useFactory: instanceCachingFactory((dependencyContainer) => {
530
528
  const appConfig = dependencyContainer.resolve<AppConfig>(ApplicationTokens.AppConfig);
@@ -564,53 +562,51 @@ export class AppContainerFactory {
564
562
  }
565
563
 
566
564
  private registerRepositoriesAndBuses(container: Container): void {
567
- container.register(OtelIdentityFactory, { useClass: OtelIdentityFactory });
568
- container.register(TelemetryPrivacyPolicy, { useClass: TelemetryPrivacyPolicy });
569
- container.register(TelemetryEnricherChain, { useClass: TelemetryEnricherChain });
570
- container.register(TelemetryRetentionTimestampFactory, { useClass: TelemetryRetentionTimestampFactory });
571
- container.register(TelemetryQueryService, { useClass: TelemetryQueryService });
572
- container.register(NoOpTelemetryExporter, { useClass: NoOpTelemetryExporter });
565
+ container.registerSingleton(OtelIdentityFactory, OtelIdentityFactory);
566
+ container.registerSingleton(TelemetryPrivacyPolicy, TelemetryPrivacyPolicy);
567
+ container.registerSingleton(TelemetryEnricherChain, TelemetryEnricherChain);
568
+ container.registerSingleton(TelemetryRetentionTimestampFactory, TelemetryRetentionTimestampFactory);
569
+ container.registerSingleton(TelemetryQueryService, TelemetryQueryService);
570
+ container.registerSingleton(NoOpTelemetryExporter, NoOpTelemetryExporter);
573
571
  container.register(CompositeTelemetryExporter, {
574
572
  useFactory: instanceCachingFactory(
575
573
  (dependencyContainer) => new CompositeTelemetryExporter([dependencyContainer.resolve(NoOpTelemetryExporter)]),
576
574
  ),
577
575
  });
578
- container.register(OtelExecutionTelemetryFactory, { useClass: OtelExecutionTelemetryFactory });
579
- container.register(InMemoryRunTraceContextRepository, { useClass: InMemoryRunTraceContextRepository });
580
- container.register(InMemoryTelemetrySpanStore, { useClass: InMemoryTelemetrySpanStore });
581
- container.register(InMemoryTelemetryArtifactStore, { useClass: InMemoryTelemetryArtifactStore });
582
- container.register(InMemoryTelemetryMetricPointStore, { useClass: InMemoryTelemetryMetricPointStore });
583
- container.register(PrismaRunTraceContextRepository, { useClass: PrismaRunTraceContextRepository });
584
- container.register(PrismaTelemetrySpanStore, { useClass: PrismaTelemetrySpanStore });
585
- container.register(PrismaTelemetryArtifactStore, { useClass: PrismaTelemetryArtifactStore });
586
- container.register(PrismaTelemetryMetricPointStore, { useClass: PrismaTelemetryMetricPointStore });
587
- container.register(WorkflowDefinitionRepositoryAdapter, { useClass: WorkflowDefinitionRepositoryAdapter });
588
- container.register(InMemoryWorkflowRunRepository, { useClass: InMemoryWorkflowRunRepository });
589
- container.register(InMemoryTriggerSetupStateRepository, { useClass: InMemoryTriggerSetupStateRepository });
590
- container.register(InMemoryCredentialStore, { useClass: InMemoryCredentialStore });
591
- container.register(SqlWorkflowRunRepository, { useClass: SqlWorkflowRunRepository });
592
- container.register(InMemoryWorkflowDebuggerOverlayRepository, {
593
- useClass: InMemoryWorkflowDebuggerOverlayRepository,
594
- });
595
- container.register(PrismaTriggerSetupStateRepository, { useClass: PrismaTriggerSetupStateRepository });
596
- container.register(PrismaWorkflowDebuggerOverlayRepository, { useClass: PrismaWorkflowDebuggerOverlayRepository });
597
- container.register(PrismaWorkflowActivationRepository, { useClass: PrismaWorkflowActivationRepository });
598
- container.register(InMemoryWorkflowActivationRepository, { useClass: InMemoryWorkflowActivationRepository });
599
- container.register(PrismaCredentialStore, { useClass: PrismaCredentialStore });
576
+ container.registerSingleton(OtelExecutionTelemetryFactory, OtelExecutionTelemetryFactory);
577
+ container.registerSingleton(InMemoryRunTraceContextRepository, InMemoryRunTraceContextRepository);
578
+ container.registerSingleton(InMemoryTelemetrySpanStore, InMemoryTelemetrySpanStore);
579
+ container.registerSingleton(InMemoryTelemetryArtifactStore, InMemoryTelemetryArtifactStore);
580
+ container.registerSingleton(InMemoryTelemetryMetricPointStore, InMemoryTelemetryMetricPointStore);
581
+ container.registerSingleton(PrismaRunTraceContextRepository, PrismaRunTraceContextRepository);
582
+ container.registerSingleton(PrismaTelemetrySpanStore, PrismaTelemetrySpanStore);
583
+ container.registerSingleton(PrismaTelemetryArtifactStore, PrismaTelemetryArtifactStore);
584
+ container.registerSingleton(PrismaTelemetryMetricPointStore, PrismaTelemetryMetricPointStore);
585
+ container.registerSingleton(WorkflowDefinitionRepositoryAdapter, WorkflowDefinitionRepositoryAdapter);
586
+ container.registerSingleton(InMemoryWorkflowRunRepository, InMemoryWorkflowRunRepository);
587
+ container.registerSingleton(InMemoryTriggerSetupStateRepository, InMemoryTriggerSetupStateRepository);
588
+ container.registerSingleton(InMemoryCredentialStore, InMemoryCredentialStore);
589
+ container.registerSingleton(SqlWorkflowRunRepository, SqlWorkflowRunRepository);
590
+ container.registerSingleton(InMemoryWorkflowDebuggerOverlayRepository, InMemoryWorkflowDebuggerOverlayRepository);
591
+ container.registerSingleton(PrismaTriggerSetupStateRepository, PrismaTriggerSetupStateRepository);
592
+ container.registerSingleton(PrismaWorkflowDebuggerOverlayRepository, PrismaWorkflowDebuggerOverlayRepository);
593
+ container.registerSingleton(PrismaWorkflowActivationRepository, PrismaWorkflowActivationRepository);
594
+ container.registerSingleton(InMemoryWorkflowActivationRepository, InMemoryWorkflowActivationRepository);
595
+ container.registerSingleton(PrismaCredentialStore, PrismaCredentialStore);
600
596
  container.register(ApplicationTokens.WorkflowDefinitionRepository, {
601
597
  useFactory: instanceCachingFactory(
602
598
  (dependencyContainer) =>
603
599
  dependencyContainer.resolve(WorkflowDefinitionRepositoryAdapter) as unknown as WorkflowDefinitionRepository,
604
600
  ),
605
601
  });
606
- container.register(InMemoryQueryBus, { useClass: InMemoryQueryBus });
607
- container.register(InMemoryCommandBus, { useClass: InMemoryCommandBus });
608
- container.register(InMemoryDomainEventBus, { useClass: InMemoryDomainEventBus });
602
+ container.registerSingleton(InMemoryQueryBus, InMemoryQueryBus);
603
+ container.registerSingleton(InMemoryCommandBus, InMemoryCommandBus);
604
+ container.registerSingleton(InMemoryDomainEventBus, InMemoryDomainEventBus);
609
605
  for (const handler of AppContainerFactory.queryHandlers) {
610
- container.register(ApplicationTokens.QueryHandler, { useClass: handler });
606
+ container.registerSingleton(ApplicationTokens.QueryHandler, handler);
611
607
  }
612
608
  for (const handler of AppContainerFactory.commandHandlers) {
613
- container.register(ApplicationTokens.CommandHandler, { useClass: handler });
609
+ container.registerSingleton(ApplicationTokens.CommandHandler, handler);
614
610
  }
615
611
  container.register(ApplicationTokens.QueryBus, {
616
612
  useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(InMemoryQueryBus)),
@@ -629,25 +625,25 @@ export class AppContainerFactory {
629
625
  }
630
626
 
631
627
  private registerApplicationServicesAndRoutes(container: Container): void {
632
- container.register(DevBootstrapSummaryAssembler, { useClass: DevBootstrapSummaryAssembler });
633
- container.register(DevBootstrapSummaryHttpRouteHandler, { useClass: DevBootstrapSummaryHttpRouteHandler });
634
- container.register(AuthHttpRouteHandler, { useClass: AuthHttpRouteHandler });
635
- container.register(PublicFrontendBootstrapHttpRouteHandler, { useClass: PublicFrontendBootstrapHttpRouteHandler });
636
- container.register(InternalAuthBootstrapHttpRouteHandler, { useClass: InternalAuthBootstrapHttpRouteHandler });
637
- container.register(WhitelabelLogoHttpRouteHandler, { useClass: WhitelabelLogoHttpRouteHandler });
628
+ container.registerSingleton(DevBootstrapSummaryAssembler, DevBootstrapSummaryAssembler);
629
+ container.registerSingleton(DevBootstrapSummaryHttpRouteHandler, DevBootstrapSummaryHttpRouteHandler);
630
+ container.registerSingleton(AuthHttpRouteHandler, AuthHttpRouteHandler);
631
+ container.registerSingleton(PublicFrontendBootstrapHttpRouteHandler, PublicFrontendBootstrapHttpRouteHandler);
632
+ container.registerSingleton(InternalAuthBootstrapHttpRouteHandler, InternalAuthBootstrapHttpRouteHandler);
633
+ container.registerSingleton(WhitelabelLogoHttpRouteHandler, WhitelabelLogoHttpRouteHandler);
638
634
  for (const registrar of AppContainerFactory.honoRouteRegistrars) {
639
- container.register(ApplicationTokens.HonoApiRouteRegistrar, { useClass: registrar });
635
+ container.registerSingleton(ApplicationTokens.HonoApiRouteRegistrar, registrar);
640
636
  }
641
- container.register(CodemationHonoApiApp, { useClass: CodemationHonoApiApp });
637
+ container.registerSingleton(CodemationHonoApiApp, CodemationHonoApiApp);
642
638
  }
643
639
 
644
640
  private registerOperationalInfrastructure(container: Container): void {
645
641
  container.register(ApplicationTokens.WorkflowWebsocketPublisher, {
646
642
  useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(WorkflowWebsocketServer)),
647
643
  });
648
- container.register(WorkflowRunEventWebsocketRelay, { useClass: WorkflowRunEventWebsocketRelay });
649
- container.register(RunEventBusTelemetryReporter, { useClass: RunEventBusTelemetryReporter });
650
- container.register(WorkflowRunRetentionPruneScheduler, { useClass: WorkflowRunRetentionPruneScheduler });
644
+ container.registerSingleton(WorkflowRunEventWebsocketRelay, WorkflowRunEventWebsocketRelay);
645
+ container.registerSingleton(RunEventBusTelemetryReporter, RunEventBusTelemetryReporter);
646
+ container.registerSingleton(WorkflowRunRetentionPruneScheduler, WorkflowRunRetentionPruneScheduler);
651
647
  }
652
648
 
653
649
  private async registerRuntimeInfrastructure(container: Container, appConfig: AppConfig): Promise<PrismaOwnership> {
@@ -18,9 +18,7 @@ export class CodemationContainerRegistrationRegistrar {
18
18
  return;
19
19
  }
20
20
  if (this.isClassRegistration(registration)) {
21
- container.register(registration.token, {
22
- useClass: registration.useClass as never,
23
- });
21
+ container.registerSingleton(registration.token as never, registration.useClass as never);
24
22
  return;
25
23
  }
26
24
  container.register(registration.token, {
@@ -27,17 +27,13 @@ export class CodemationPluginRegistrar {
27
27
  loggerFactory: args.loggerFactory,
28
28
  registerCredentialType: (type) => args.registerCredentialType(type),
29
29
  registerNode: (token, implementation) => {
30
- args.container.register(token, {
31
- useClass: (implementation ?? token) as never,
32
- });
30
+ args.container.registerSingleton(token as never, (implementation ?? token) as never);
33
31
  },
34
32
  registerValue: (token, value) => {
35
33
  args.container.registerInstance(token, value);
36
34
  },
37
35
  registerClass: (token, implementation) => {
38
- args.container.register(token, {
39
- useClass: implementation as never,
40
- });
36
+ args.container.registerSingleton(token as never, implementation as never);
41
37
  },
42
38
  registerFactory: (token, factory) => {
43
39
  args.container.register(token, {
@@ -1,4 +1,4 @@
1
- import { injectable, registry } from "@codemation/core";
1
+ import { container as tsyringeContainer, injectable } from "@codemation/core";
2
2
  import type { DomainEvent } from "../../application/bus/DomainEvent";
3
3
  import type { DomainEventHandler } from "../../application/bus/DomainEventHandler";
4
4
  import { ApplicationTokens } from "../../applicationTokens";
@@ -13,12 +13,10 @@ export class HandlesDomainEvent {
13
13
  return (target) => {
14
14
  Reflect.defineMetadata(domainEventHandlerMetadataKey, eventType, target);
15
15
  injectable()(target as never);
16
- registry([
17
- {
18
- token: ApplicationTokens.DomainEventHandler,
19
- useClass: target as unknown as ConcreteType<DomainEventHandler<DomainEvent>>,
20
- },
21
- ])(target as never);
16
+ tsyringeContainer.registerSingleton(
17
+ ApplicationTokens.DomainEventHandler as never,
18
+ target as unknown as ConcreteType<DomainEventHandler<DomainEvent>>,
19
+ );
22
20
  };
23
21
  }
24
22
  }
@@ -1,12 +1,10 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { CodemationBetterAuthRuntime } from "../../../../infrastructure/auth/CodemationBetterAuthRuntime";
5
4
  import { AuthHttpRouteHandler } from "../../routeHandlers/AuthHttpRouteHandlerFactory";
6
5
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
7
6
 
8
7
  @injectable()
9
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: AuthHonoApiRouteRegistrar }])
10
8
  export class AuthHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
11
9
  constructor(
12
10
  @inject(AuthHttpRouteHandler) private readonly handler: AuthHttpRouteHandler,
@@ -1,12 +1,10 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { BinaryHttpRouteHandler } from "../../routeHandlers/BinaryHttpRouteHandlerFactory";
5
4
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
6
5
 
7
6
  /** Run-scoped binary content. Workflow overlay binary GET/POST are registered on {@link CodemationHonoApiApp} after route registrars. */
8
7
  @injectable()
9
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: BinaryHonoApiRouteRegistrar }])
10
8
  export class BinaryHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
11
9
  constructor(@inject(BinaryHttpRouteHandler) private readonly handler: BinaryHttpRouteHandler) {}
12
10
 
@@ -1,14 +1,12 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
3
 
4
- import { ApplicationTokens } from "../../../../applicationTokens";
5
4
  import { ApiPaths } from "../../ApiPaths";
6
5
  import { InternalAuthBootstrapHttpRouteHandler } from "../../routeHandlers/InternalAuthBootstrapHttpRouteHandler";
7
6
  import { PublicFrontendBootstrapHttpRouteHandler } from "../../routeHandlers/PublicFrontendBootstrapHttpRouteHandler";
8
7
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
9
8
 
10
9
  @injectable()
11
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: BootstrapHonoApiRouteRegistrar }])
12
10
  export class BootstrapHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
13
11
  constructor(
14
12
  @inject(PublicFrontendBootstrapHttpRouteHandler)
@@ -1,11 +1,9 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { CredentialHttpRouteHandler } from "../../routeHandlers/CredentialHttpRouteHandler";
5
4
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
6
5
 
7
6
  @injectable()
8
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: CredentialHonoApiRouteRegistrar }])
9
7
  export class CredentialHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
10
8
  constructor(@inject(CredentialHttpRouteHandler) private readonly handler: CredentialHttpRouteHandler) {}
11
9
 
@@ -1,11 +1,9 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { DevBootstrapSummaryHttpRouteHandler } from "../../routeHandlers/DevBootstrapSummaryHttpRouteHandler";
5
4
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
6
5
 
7
6
  @injectable()
8
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: DevHonoApiRouteRegistrar }])
9
7
  export class DevHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
10
8
  constructor(
11
9
  @inject(DevBootstrapSummaryHttpRouteHandler) private readonly handler: DevBootstrapSummaryHttpRouteHandler,
@@ -1,11 +1,9 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { OAuth2HttpRouteHandler } from "../../routeHandlers/OAuth2HttpRouteHandlerFactory";
5
4
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
6
5
 
7
6
  @injectable()
8
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: OAuth2HonoApiRouteRegistrar }])
9
7
  export class OAuth2HonoApiRouteRegistrar implements HonoApiRouteRegistrar {
10
8
  constructor(@inject(OAuth2HttpRouteHandler) private readonly handler: OAuth2HttpRouteHandler) {}
11
9
 
@@ -1,11 +1,9 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { RunHttpRouteHandler } from "../../routeHandlers/RunHttpRouteHandler";
5
4
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
6
5
 
7
6
  @injectable()
8
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: RunHonoApiRouteRegistrar }])
9
7
  export class RunHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
10
8
  constructor(@inject(RunHttpRouteHandler) private readonly handler: RunHttpRouteHandler) {}
11
9
 
@@ -1,11 +1,9 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { TelemetryHttpRouteHandler } from "../../routeHandlers/TelemetryHttpRouteHandler";
5
4
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
6
5
 
7
6
  @injectable()
8
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: TelemetryHonoApiRouteRegistrar }])
9
7
  export class TelemetryHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
10
8
  constructor(@inject(TelemetryHttpRouteHandler) private readonly handler: TelemetryHttpRouteHandler) {}
11
9
 
@@ -1,11 +1,9 @@
1
- import { inject, injectable, registry } from "@codemation/core";
1
+ import { inject, injectable } from "@codemation/core";
2
2
  import { Hono } from "hono";
3
- import { ApplicationTokens } from "../../../../applicationTokens";
4
3
  import { UserHttpRouteHandler } from "../../routeHandlers/UserHttpRouteHandlerFactory";
5
4
  import type { HonoApiRouteRegistrar } from "../HonoApiRouteRegistrar";
6
5
 
7
6
  @injectable()
8
- @registry([{ token: ApplicationTokens.HonoApiRouteRegistrar, useClass: UserHonoApiRouteRegistrar }])
9
7
  export class UserHonoApiRouteRegistrar implements HonoApiRouteRegistrar {
10
8
  constructor(@inject(UserHttpRouteHandler) private readonly handler: UserHttpRouteHandler) {}
11
9