@codemation/host 0.0.14 → 0.0.16

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 (77) hide show
  1. package/dist/{AppConfigFactory-DmHOpg8O.d.ts → AppConfigFactory-D_ReOKfV.d.ts} +5 -3
  2. package/dist/{AppConfigFactory-DWIz2hy-.js → AppConfigFactory-JjNqYnGg.js} +41 -3
  3. package/dist/AppConfigFactory-JjNqYnGg.js.map +1 -0
  4. package/dist/{AppContainerFactory-B5eRpvAa.js → AppContainerFactory-_dnF0VOf.js} +272 -105
  5. package/dist/AppContainerFactory-_dnF0VOf.js.map +1 -0
  6. package/dist/{CodemationConfig-D2ULNkec.d.ts → CodemationConfig-u80ZoIrc.d.ts} +18 -10
  7. package/dist/{CodemationConfigNormalizer-CBLxXaRV.d.ts → CodemationConfigNormalizer-DCt0mPPz.d.ts} +2 -2
  8. package/dist/{CodemationConsumerConfigLoader-BLvzcfb7.d.ts → CodemationConsumerConfigLoader-C8iscLBJ.d.ts} +4 -2
  9. package/dist/{CodemationConsumerConfigLoader-BBzAr6L_.js → CodemationConsumerConfigLoader-LGrCspIx.js} +18 -4
  10. package/dist/CodemationConsumerConfigLoader-LGrCspIx.js.map +1 -0
  11. package/dist/CodemationPluginListMerger-CGwOTdZ7.js +57 -0
  12. package/dist/CodemationPluginListMerger-CGwOTdZ7.js.map +1 -0
  13. package/dist/{CodemationPluginListMerger-B0-e4CJ6.d.ts → CodemationPluginListMerger-ZY3R_kTo.d.ts} +79 -117
  14. package/dist/{CredentialServices-BeuMtqYA.d.ts → CredentialServices-Uo1jxSYB.d.ts} +2 -2
  15. package/dist/PublicFrontendBootstrap-p7mS8aWG.d.ts +50 -0
  16. package/dist/{FrontendAppConfigFactory-Bj-DZNlt.d.ts → PublicFrontendBootstrapFactory-BA65IXL4.d.ts} +19 -4
  17. package/dist/{FrontendAppConfigJsonCodec-nOCQI0ag.js → PublicFrontendBootstrapJsonCodec-BdiVGG5R.js} +76 -2
  18. package/dist/PublicFrontendBootstrapJsonCodec-BdiVGG5R.js.map +1 -0
  19. package/dist/PublicFrontendBootstrapJsonCodec-DjkkKXcq.d.ts +35 -0
  20. package/dist/client.d.ts +3 -3
  21. package/dist/client.js +2 -2
  22. package/dist/consumer.d.ts +3 -3
  23. package/dist/consumer.js +1 -1
  24. package/dist/credentials.d.ts +2 -2
  25. package/dist/index.d.ts +44 -12
  26. package/dist/index.js +8 -8
  27. package/dist/nextServer.d.ts +30 -9
  28. package/dist/nextServer.js +4 -4
  29. package/dist/{persistenceServer-CaehMh3M.d.ts → persistenceServer-BKbOs-TQ.d.ts} +2 -2
  30. package/dist/{persistenceServer-DVeWUbc3.js → persistenceServer-J2teHIIg.js} +2 -2
  31. package/dist/{persistenceServer-DVeWUbc3.js.map → persistenceServer-J2teHIIg.js.map} +1 -1
  32. package/dist/persistenceServer.d.ts +4 -4
  33. package/dist/persistenceServer.js +2 -2
  34. package/dist/{server-C65z_kqm.js → server-CVC7QBwT.js} +42 -25
  35. package/dist/server-CVC7QBwT.js.map +1 -0
  36. package/dist/{server-Dyo8qh4k.d.ts → server-CbcnGZHm.d.ts} +14 -19
  37. package/dist/server.d.ts +10 -10
  38. package/dist/server.js +7 -7
  39. package/package.json +5 -5
  40. package/src/application/dev/BootRuntimeSummary.types.ts +2 -0
  41. package/src/application/dev/DevBootstrapSummaryAssembler.ts +1 -0
  42. package/src/application/dev/DevBootstrapSummaryJson.types.ts +6 -0
  43. package/src/bootstrap/AppContainerFactory.ts +101 -6
  44. package/src/bootstrap/runtime/AppConfigFactory.ts +22 -2
  45. package/src/client.ts +4 -0
  46. package/src/index.ts +13 -5
  47. package/src/infrastructure/config/CodemationPluginRegistrar.ts +6 -0
  48. package/src/infrastructure/di/HandlesCommandRegistry.ts +1 -10
  49. package/src/infrastructure/di/HandlesQueryRegistry.ts +1 -10
  50. package/src/nextServer.ts +4 -0
  51. package/src/presentation/config/AppConfig.ts +6 -0
  52. package/src/presentation/config/CodemationPackageManifest.ts +1 -7
  53. package/src/presentation/config/CodemationPlugin.ts +45 -9
  54. package/src/presentation/config/CodemationPluginListMerger.ts +30 -26
  55. package/src/presentation/frontend/InternalAuthBootstrap.ts +12 -0
  56. package/src/presentation/frontend/InternalAuthBootstrapFactory.ts +26 -0
  57. package/src/presentation/frontend/InternalAuthBootstrapJsonCodec.ts +49 -0
  58. package/src/presentation/frontend/PublicFrontendBootstrap.ts +12 -0
  59. package/src/presentation/frontend/PublicFrontendBootstrapFactory.ts +23 -0
  60. package/src/presentation/frontend/PublicFrontendBootstrapJsonCodec.ts +48 -0
  61. package/src/presentation/http/ApiPaths.ts +10 -0
  62. package/src/presentation/http/hono/HonoHttpAnonymousRoutePolicyRegistry.ts +3 -0
  63. package/src/presentation/http/hono/registrars/BootstrapHonoApiRouteRegistrar.ts +32 -0
  64. package/src/presentation/http/routeHandlers/InternalAuthBootstrapHttpRouteHandler.ts +18 -0
  65. package/src/presentation/http/routeHandlers/PublicFrontendBootstrapHttpRouteHandler.ts +18 -0
  66. package/src/presentation/server/CodemationConsumerConfigLoader.ts +16 -3
  67. package/src/presentation/server/CodemationPluginDiscovery.ts +59 -28
  68. package/src/server.ts +6 -0
  69. package/dist/AppConfigFactory-DWIz2hy-.js.map +0 -1
  70. package/dist/AppContainerFactory-B5eRpvAa.js.map +0 -1
  71. package/dist/CodemationConsumerConfigLoader-BBzAr6L_.js.map +0 -1
  72. package/dist/CodemationPluginListMerger-DrVOw9KP.js +0 -57
  73. package/dist/CodemationPluginListMerger-DrVOw9KP.js.map +0 -1
  74. package/dist/FrontendAppConfig-D50wjj_n.d.ts +0 -27
  75. package/dist/FrontendAppConfigJsonCodec-1_L7H_Qo.d.ts +0 -20
  76. package/dist/FrontendAppConfigJsonCodec-nOCQI0ag.js.map +0 -1
  77. package/dist/server-C65z_kqm.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-CVC7QBwT.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 if (\n process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === \"true\" &&\n typeof discoveredPackage.developmentEntry === \"string\" &&\n discoveredPackage.developmentEntry.trim().length > 0\n ) {\n return discoveredPackage.developmentEntry;\n }\n return discoveredPackage.pluginEntry;\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,18 +1,8 @@
1
- import { a as CodemationConfig, g as AppConfig, v as CodemationPlugin } from "./CodemationConfig-D2ULNkec.js";
2
- import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-BLvzcfb7.js";
3
- import { t as AppConfigFactory } from "./AppConfigFactory-DmHOpg8O.js";
4
- import { i as WorkflowSummary, r as WorkflowDto } from "./FrontendAppConfigFactory-Bj-DZNlt.js";
1
+ import { a as CodemationConfig, g as AppConfig, y as CodemationPlugin } from "./CodemationConfig-u80ZoIrc.js";
2
+ import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-C8iscLBJ.js";
3
+ import { t as AppConfigFactory } from "./AppConfigFactory-D_ReOKfV.js";
4
+ import { a as WorkflowDto, o as WorkflowSummary } from "./PublicFrontendBootstrapFactory-BA65IXL4.js";
5
5
 
6
- //#region src/presentation/config/CodemationPackageManifest.d.ts
7
- interface CodemationPluginPackageManifest {
8
- readonly kind: "plugin";
9
- readonly entry: string;
10
- readonly exportName?: string;
11
- }
12
- interface CodemationPackageManifest {
13
- readonly plugin?: CodemationPluginPackageManifest;
14
- }
15
- //#endregion
16
6
  //#region src/presentation/http/ApiPaths.d.ts
17
7
  declare class ApiPaths {
18
8
  private static readonly apiBasePath;
@@ -23,6 +13,7 @@ declare class ApiPaths {
23
13
  private static readonly webhooksBasePath;
24
14
  private static readonly usersBasePath;
25
15
  private static readonly whitelabelBasePath;
16
+ private static readonly bootstrapBasePath;
26
17
  static workflows(): string;
27
18
  static workflow(workflowId: string): string;
28
19
  static workflowActivation(workflowId: string): string;
@@ -62,6 +53,8 @@ declare class ApiPaths {
62
53
  static runBinaryContent(runId: string, binaryId: string): string;
63
54
  /** Anonymous: consumer logo from `codemation.config.ts` whitelabel.logoPath. */
64
55
  static whitelabelLogo(): string;
56
+ static frontendBootstrap(): string;
57
+ static internalAuthBootstrap(): string;
65
58
  }
66
59
  //#endregion
67
60
  //#region src/presentation/http/CodemationServerGatewayFactory.d.ts
@@ -105,13 +98,14 @@ declare class AppConfigLoader {
105
98
  type CodemationDiscoveredPluginPackage = Readonly<{
106
99
  packageName: string;
107
100
  packageRoot: string;
108
- manifest: NonNullable<CodemationPackageManifest["plugin"]>;
101
+ pluginEntry: string;
109
102
  developmentEntry?: string;
110
103
  }>;
111
104
  type CodemationResolvedPluginPackage = Readonly<CodemationDiscoveredPluginPackage & {
112
105
  plugin: CodemationPlugin;
113
106
  }>;
114
107
  declare class CodemationPluginDiscovery {
108
+ private readonly pluginPackageMetadata;
115
109
  discover(consumerRoot: string): Promise<ReadonlyArray<CodemationDiscoveredPluginPackage>>;
116
110
  resolvePlugins(consumerRoot: string): Promise<ReadonlyArray<CodemationResolvedPluginPackage>>;
117
111
  resolveDiscoveredPackages(discoveredPackages: ReadonlyArray<CodemationDiscoveredPluginPackage>): Promise<ReadonlyArray<CodemationResolvedPluginPackage>>;
@@ -119,10 +113,11 @@ declare class CodemationPluginDiscovery {
119
113
  private readPackageJson;
120
114
  private loadPlugin;
121
115
  private resolvePluginValue;
122
- private isPlugin;
123
- private isPluginConstructor;
116
+ private isPluginConfig;
124
117
  private resolvePluginEntry;
125
118
  private resolveDevelopmentPluginEntry;
119
+ private exists;
120
+ private resolvePluginModuleSpecifier;
126
121
  }
127
122
  //#endregion
128
123
  //#region src/presentation/server/WorkflowModulePathFinder.d.ts
@@ -147,5 +142,5 @@ declare class WorkflowDiscoveryPathSegmentsComputer {
147
142
  }>): readonly string[] | undefined;
148
143
  }
149
144
  //#endregion
150
- export { CodemationResolvedPluginPackage as a, CodemationServerGateway as c, CodemationPluginPackageManifest as d, CodemationPluginDiscovery as i, ApiPaths as l, WorkflowModulePathFinder as n, AppConfigLoadResult as o, CodemationDiscoveredPluginPackage as r, AppConfigLoader as s, WorkflowDiscoveryPathSegmentsComputer as t, CodemationPackageManifest as u };
151
- //# sourceMappingURL=server-Dyo8qh4k.d.ts.map
145
+ export { CodemationResolvedPluginPackage as a, CodemationServerGateway as c, CodemationPluginDiscovery as i, ApiPaths as l, WorkflowModulePathFinder as n, AppConfigLoadResult as o, CodemationDiscoveredPluginPackage as r, AppConfigLoader as s, WorkflowDiscoveryPathSegmentsComputer as t };
146
+ //# sourceMappingURL=server-CbcnGZHm.d.ts.map
package/dist/server.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import "./CodemationAuthConfig-Bh2cCNCI.js";
2
- import { t as FrontendAppConfig } from "./FrontendAppConfig-D50wjj_n.js";
3
- import { n as CodemationFrontendAuthSnapshotJsonCodec, t as FrontendAppConfigJsonCodec } from "./FrontendAppConfigJsonCodec-1_L7H_Qo.js";
2
+ import { n as InternalAuthBootstrap, r as FrontendAppConfig, t as PublicFrontendBootstrap } from "./PublicFrontendBootstrap-p7mS8aWG.js";
3
+ import { i as CodemationFrontendAuthSnapshotJsonCodec, n as InternalAuthBootstrapJsonCodec, r as FrontendAppConfigJsonCodec, t as PublicFrontendBootstrapJsonCodec } from "./PublicFrontendBootstrapJsonCodec-DjkkKXcq.js";
4
4
  import "./index-CkiptHb-.js";
5
- import "./CodemationConfig-D2ULNkec.js";
6
- import "./CodemationConfigNormalizer-CBLxXaRV.js";
7
- import { i as CodemationConsumerAppResolver, n as CodemationConsumerConfigResolution, r as CodemationConsumerApp, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-BLvzcfb7.js";
8
- import { r as PrismaClient } from "./AppConfigFactory-DmHOpg8O.js";
9
- import { a as CodemationResolvedPluginPackage, c as CodemationServerGateway, i as CodemationPluginDiscovery, l as ApiPaths, n as WorkflowModulePathFinder, o as AppConfigLoadResult, r as CodemationDiscoveredPluginPackage, s as AppConfigLoader, t as WorkflowDiscoveryPathSegmentsComputer } from "./server-Dyo8qh4k.js";
10
- import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-CaehMh3M.js";
11
- import { n as CodemationFrontendAuthSnapshotFactory, t as FrontendAppConfigFactory } from "./FrontendAppConfigFactory-Bj-DZNlt.js";
12
- export { ApiPaths, AppConfigLoadResult, AppConfigLoader, CodemationConsumerApp, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationConsumerConfigResolution, CodemationDiscoveredPluginPackage, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationResolvedPluginPackage, CodemationServerGateway, FrontendAppConfig, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, PrismaClient, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
5
+ import "./CodemationConfig-u80ZoIrc.js";
6
+ import "./CodemationConfigNormalizer-DCt0mPPz.js";
7
+ import { i as CodemationConsumerAppResolver, n as CodemationConsumerConfigResolution, r as CodemationConsumerApp, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-C8iscLBJ.js";
8
+ import { r as PrismaClient } from "./AppConfigFactory-D_ReOKfV.js";
9
+ import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-BKbOs-TQ.js";
10
+ import { a as CodemationResolvedPluginPackage, c as CodemationServerGateway, i as CodemationPluginDiscovery, l as ApiPaths, n as WorkflowModulePathFinder, o as AppConfigLoadResult, r as CodemationDiscoveredPluginPackage, s as AppConfigLoader, t as WorkflowDiscoveryPathSegmentsComputer } from "./server-CbcnGZHm.js";
11
+ import { i as CodemationFrontendAuthSnapshotFactory, n as InternalAuthBootstrapFactory, r as FrontendAppConfigFactory, t as PublicFrontendBootstrapFactory } from "./PublicFrontendBootstrapFactory-BA65IXL4.js";
12
+ export { ApiPaths, AppConfigLoadResult, AppConfigLoader, CodemationConsumerApp, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationConsumerConfigResolution, CodemationDiscoveredPluginPackage, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationResolvedPluginPackage, CodemationServerGateway, FrontendAppConfig, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, InternalAuthBootstrap, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, PrismaClient, PublicFrontendBootstrap, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
package/dist/server.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import "./ConsoleLogger-ClPU7jtc.js";
2
- import { n as CodemationFrontendAuthSnapshotJsonCodec, t as FrontendAppConfigJsonCodec } from "./FrontendAppConfigJsonCodec-nOCQI0ag.js";
3
- import { i as CodemationConsumerAppResolver, n as WorkflowDiscoveryPathSegmentsComputer, r as WorkflowModulePathFinder, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-BBzAr6L_.js";
2
+ import { i as CodemationFrontendAuthSnapshotJsonCodec, n as InternalAuthBootstrapJsonCodec, r as FrontendAppConfigJsonCodec, t as PublicFrontendBootstrapJsonCodec } from "./PublicFrontendBootstrapJsonCodec-BdiVGG5R.js";
3
+ import { i as CodemationConsumerAppResolver, n as WorkflowDiscoveryPathSegmentsComputer, r as WorkflowModulePathFinder, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-LGrCspIx.js";
4
4
  import "./ServerLoggerFactory-BltIIDfQ.js";
5
5
  import "./decorateParam-DrsXNPuw.js";
6
6
  import "./decorate-B0PP651O.js";
7
7
  import "./CredentialServices-DNb3CZwW.js";
8
- import { _ as ApiPaths, h as CodemationFrontendAuthSnapshotFactory, m as FrontendAppConfigFactory } from "./AppContainerFactory-B5eRpvAa.js";
9
- import "./AppConfigFactory-DWIz2hy-.js";
10
- import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-DVeWUbc3.js";
11
- import { n as AppConfigLoader, r as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-C65z_kqm.js";
8
+ import { _ as CodemationFrontendAuthSnapshotFactory, g as FrontendAppConfigFactory, h as InternalAuthBootstrapFactory, m as PublicFrontendBootstrapFactory, y as ApiPaths } from "./AppContainerFactory-_dnF0VOf.js";
9
+ import "./AppConfigFactory-JjNqYnGg.js";
10
+ import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-J2teHIIg.js";
11
+ import { n as AppConfigLoader, r as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-CVC7QBwT.js";
12
12
 
13
13
  var PrismaClient = import_client.PrismaClient;
14
- export { ApiPaths, AppConfigLoader, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationServerGateway, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, PrismaClient, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
14
+ export { ApiPaths, AppConfigLoader, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationServerGateway, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, PrismaClient, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemation/host",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -109,9 +109,9 @@
109
109
  "tsx": "^4.21.0",
110
110
  "ws": "^8.19.0",
111
111
  "zxcvbn": "^4.4.2",
112
- "@codemation/core": "0.0.14",
113
- "@codemation/core-nodes": "0.0.14",
114
- "@codemation/eventbus-redis": "0.0.14"
112
+ "@codemation/core": "0.0.16",
113
+ "@codemation/eventbus-redis": "0.0.16",
114
+ "@codemation/core-nodes": "0.0.16"
115
115
  },
116
116
  "devDependencies": {
117
117
  "@playwright/test": "^1.58.2",
@@ -136,7 +136,7 @@
136
136
  "tsdown": "^0.15.5",
137
137
  "typescript": "^5.9.3",
138
138
  "vitest": "^4.0.18",
139
- "@codemation/core-nodes-gmail": "0.0.14"
139
+ "@codemation/core-nodes-gmail": "0.0.16"
140
140
  },
141
141
  "scripts": {
142
142
  "prisma:generate": "prisma generate && node ./scripts/ensure-prisma-runtime-sourcemaps.mjs",
@@ -1,4 +1,5 @@
1
1
  import type { AppPersistenceConfig } from "../../presentation/config/AppConfig";
2
+ import type { AppPluginLoadSummary } from "../../presentation/config/AppConfig";
2
3
  import type { CodemationEventBusKind, CodemationSchedulerKind } from "../../presentation/config/CodemationConfig";
3
4
 
4
5
  /** Resolved persistence + scheduler wiring captured at host prepare time (dev banner / diagnostics). */
@@ -8,4 +9,5 @@ export type BootRuntimeSummary = Readonly<{
8
9
  queuePrefix: string;
9
10
  schedulerKind: CodemationSchedulerKind;
10
11
  redisUrl?: string;
12
+ plugins: ReadonlyArray<AppPluginLoadSummary>;
11
13
  }>;
@@ -35,6 +35,7 @@ export class DevBootstrapSummaryAssembler {
35
35
  eventBusLabel: this.formatEventBus(summary),
36
36
  redisUrlRedacted: this.formatRedis(summary),
37
37
  activeWorkflows: active,
38
+ plugins: [...summary.plugins].sort((left, right) => left.packageName.localeCompare(right.packageName)),
38
39
  };
39
40
  }
40
41
 
@@ -6,4 +6,10 @@ export type DevBootstrapSummaryJson = Readonly<{
6
6
  eventBusLabel: string;
7
7
  redisUrlRedacted?: string;
8
8
  activeWorkflows: ReadonlyArray<Readonly<{ id: string; name: string }>>;
9
+ plugins: ReadonlyArray<
10
+ Readonly<{
11
+ packageName: string;
12
+ source: "configured" | "discovered";
13
+ }>
14
+ >;
9
15
  }>;
@@ -22,12 +22,52 @@ import {
22
22
  WorkflowRepositoryWebhookTriggerMatcher,
23
23
  } from "@codemation/core/bootstrap";
24
24
  import { AIAgentConnectionWorkflowExpander, ConnectionCredentialNodeConfigFactory } from "@codemation/core-nodes";
25
- import "../application/commands/CredentialCommandHandlers";
26
- import "../application/commands/UserAccountCommandHandlers";
27
- import "../application/commands/WorkflowCommandHandlers";
28
- import "../application/queries/CredentialQueryHandlers";
29
- import "../application/queries/UserAccountQueryHandlers";
30
- import "../application/queries/WorkflowQueryHandlers";
25
+ import {
26
+ CreateCredentialInstanceCommandHandler,
27
+ DeleteCredentialInstanceCommandHandler,
28
+ TestCredentialInstanceCommandHandler,
29
+ UpdateCredentialInstanceCommandHandler,
30
+ UpsertCredentialBindingCommandHandler,
31
+ } from "../application/commands/CredentialCommandHandlers";
32
+ import {
33
+ AcceptUserInviteCommandHandler,
34
+ InviteUserCommandHandler,
35
+ RegenerateUserInviteCommandHandler,
36
+ UpdateUserAccountStatusCommandHandler,
37
+ UpsertLocalBootstrapUserCommandHandler,
38
+ } from "../application/commands/UserAccountCommandHandlers";
39
+ import {
40
+ CopyRunToWorkflowDebuggerCommandHandler,
41
+ HandleWebhookInvocationCommandHandler,
42
+ ReplaceMutableRunWorkflowSnapshotCommandHandler,
43
+ ReplaceWorkflowDebuggerOverlayCommandHandler,
44
+ ReplayWorkflowNodeCommandHandler,
45
+ SetPinnedNodeInputCommandHandler,
46
+ SetWorkflowActivationCommandHandler,
47
+ StartWorkflowRunCommandHandler,
48
+ UploadOverlayPinnedBinaryCommandHandler,
49
+ } from "../application/commands/WorkflowCommandHandlers";
50
+ import {
51
+ GetCredentialFieldEnvStatusQueryHandler,
52
+ GetCredentialInstanceQueryHandler,
53
+ GetCredentialInstanceWithSecretsQueryHandler,
54
+ GetWorkflowCredentialHealthQueryHandler,
55
+ ListCredentialInstancesQueryHandler,
56
+ ListCredentialTypesQueryHandler,
57
+ } from "../application/queries/CredentialQueryHandlers";
58
+ import {
59
+ ListUserAccountsQueryHandler,
60
+ VerifyUserInviteQueryHandler,
61
+ } from "../application/queries/UserAccountQueryHandlers";
62
+ import {
63
+ GetRunBinaryAttachmentQueryHandler,
64
+ GetRunStateQueryHandler,
65
+ GetWorkflowDebuggerOverlayQueryHandler,
66
+ GetWorkflowDetailQueryHandler,
67
+ GetWorkflowOverlayBinaryAttachmentQueryHandler,
68
+ GetWorkflowSummariesQueryHandler,
69
+ ListWorkflowRunsQueryHandler,
70
+ } from "../application/queries/WorkflowQueryHandlers";
31
71
  import { OpenAiApiKeyCredentialHealthTester } from "../infrastructure/credentials/OpenAiApiKeyCredentialHealthTester";
32
72
  import { OpenAiApiKeyCredentialTypeFactory } from "../infrastructure/credentials/OpenAiApiKeyCredentialTypeFactory";
33
73
  import { CodemationPluginRegistrar } from "../infrastructure/config/CodemationPluginRegistrar";
@@ -61,10 +101,15 @@ import { WorkflowPolicyUiPresentationFactory } from "../application/mapping/Work
61
101
  import { WorkflowWebsocketServer } from "../presentation/websocket/WorkflowWebsocketServer";
62
102
  import { CodemationFrontendAuthSnapshotFactory } from "../presentation/frontend/CodemationFrontendAuthSnapshotFactory";
63
103
  import { FrontendAppConfigFactory } from "../presentation/frontend/FrontendAppConfigFactory";
104
+ import { InternalAuthBootstrapFactory } from "../presentation/frontend/InternalAuthBootstrapFactory";
105
+ import { PublicFrontendBootstrapFactory } from "../presentation/frontend/PublicFrontendBootstrapFactory";
64
106
  import { DevBootstrapSummaryHttpRouteHandler } from "../presentation/http/routeHandlers/DevBootstrapSummaryHttpRouteHandler";
107
+ import { InternalAuthBootstrapHttpRouteHandler } from "../presentation/http/routeHandlers/InternalAuthBootstrapHttpRouteHandler";
108
+ import { PublicFrontendBootstrapHttpRouteHandler } from "../presentation/http/routeHandlers/PublicFrontendBootstrapHttpRouteHandler";
65
109
  import { WhitelabelLogoHttpRouteHandler } from "../presentation/http/routeHandlers/WhitelabelLogoHttpRouteHandler";
66
110
  import { CodemationHonoApiApp } from "../presentation/http/hono/CodemationHonoApiAppFactory";
67
111
  import { BinaryHonoApiRouteRegistrar } from "../presentation/http/hono/registrars/BinaryHonoApiRouteRegistrar";
112
+ import { BootstrapHonoApiRouteRegistrar } from "../presentation/http/hono/registrars/BootstrapHonoApiRouteRegistrar";
68
113
  import { CredentialHonoApiRouteRegistrar } from "../presentation/http/hono/registrars/CredentialHonoApiRouteRegistrar";
69
114
  import { DevHonoApiRouteRegistrar } from "../presentation/http/hono/registrars/DevHonoApiRouteRegistrar";
70
115
  import { OAuth2HonoApiRouteRegistrar } from "../presentation/http/hono/registrars/OAuth2HonoApiRouteRegistrar";
@@ -124,8 +169,47 @@ type PrismaOwnership = Readonly<{
124
169
  }>;
125
170
 
126
171
  export class AppContainerFactory {
172
+ private static readonly queryHandlers = [
173
+ GetCredentialFieldEnvStatusQueryHandler,
174
+ GetCredentialInstanceQueryHandler,
175
+ GetCredentialInstanceWithSecretsQueryHandler,
176
+ GetWorkflowCredentialHealthQueryHandler,
177
+ ListCredentialInstancesQueryHandler,
178
+ ListCredentialTypesQueryHandler,
179
+ ListUserAccountsQueryHandler,
180
+ VerifyUserInviteQueryHandler,
181
+ GetRunBinaryAttachmentQueryHandler,
182
+ GetRunStateQueryHandler,
183
+ GetWorkflowDebuggerOverlayQueryHandler,
184
+ GetWorkflowDetailQueryHandler,
185
+ GetWorkflowOverlayBinaryAttachmentQueryHandler,
186
+ GetWorkflowSummariesQueryHandler,
187
+ ListWorkflowRunsQueryHandler,
188
+ ] as const;
189
+ private static readonly commandHandlers = [
190
+ CreateCredentialInstanceCommandHandler,
191
+ DeleteCredentialInstanceCommandHandler,
192
+ TestCredentialInstanceCommandHandler,
193
+ UpdateCredentialInstanceCommandHandler,
194
+ UpsertCredentialBindingCommandHandler,
195
+ AcceptUserInviteCommandHandler,
196
+ InviteUserCommandHandler,
197
+ RegenerateUserInviteCommandHandler,
198
+ UpdateUserAccountStatusCommandHandler,
199
+ UpsertLocalBootstrapUserCommandHandler,
200
+ CopyRunToWorkflowDebuggerCommandHandler,
201
+ HandleWebhookInvocationCommandHandler,
202
+ ReplaceMutableRunWorkflowSnapshotCommandHandler,
203
+ ReplaceWorkflowDebuggerOverlayCommandHandler,
204
+ ReplayWorkflowNodeCommandHandler,
205
+ SetPinnedNodeInputCommandHandler,
206
+ SetWorkflowActivationCommandHandler,
207
+ StartWorkflowRunCommandHandler,
208
+ UploadOverlayPinnedBinaryCommandHandler,
209
+ ] as const;
127
210
  private static readonly honoRouteRegistrars = [
128
211
  BinaryHonoApiRouteRegistrar,
212
+ BootstrapHonoApiRouteRegistrar,
129
213
  CredentialHonoApiRouteRegistrar,
130
214
  DevHonoApiRouteRegistrar,
131
215
  OAuth2HonoApiRouteRegistrar,
@@ -327,6 +411,8 @@ export class AppContainerFactory {
327
411
  container.register(OAuth2ConnectService, { useClass: OAuth2ConnectService });
328
412
  container.register(CodemationFrontendAuthSnapshotFactory, { useClass: CodemationFrontendAuthSnapshotFactory });
329
413
  container.register(FrontendAppConfigFactory, { useClass: FrontendAppConfigFactory });
414
+ container.register(PublicFrontendBootstrapFactory, { useClass: PublicFrontendBootstrapFactory });
415
+ container.register(InternalAuthBootstrapFactory, { useClass: InternalAuthBootstrapFactory });
330
416
  container.register(DatabaseMigrations, { useClass: DatabaseMigrations });
331
417
  container.register(FrontendRuntime, { useClass: FrontendRuntime });
332
418
  container.register(WorkerRuntime, { useClass: WorkerRuntime });
@@ -397,6 +483,12 @@ export class AppContainerFactory {
397
483
  container.register(InMemoryQueryBus, { useClass: InMemoryQueryBus });
398
484
  container.register(InMemoryCommandBus, { useClass: InMemoryCommandBus });
399
485
  container.register(InMemoryDomainEventBus, { useClass: InMemoryDomainEventBus });
486
+ for (const handler of AppContainerFactory.queryHandlers) {
487
+ container.register(ApplicationTokens.QueryHandler, { useClass: handler });
488
+ }
489
+ for (const handler of AppContainerFactory.commandHandlers) {
490
+ container.register(ApplicationTokens.CommandHandler, { useClass: handler });
491
+ }
400
492
  container.register(ApplicationTokens.QueryBus, {
401
493
  useFactory: instanceCachingFactory((dependencyContainer) => dependencyContainer.resolve(InMemoryQueryBus)),
402
494
  });
@@ -411,6 +503,8 @@ export class AppContainerFactory {
411
503
  private registerApplicationServicesAndRoutes(container: Container): void {
412
504
  container.register(DevBootstrapSummaryAssembler, { useClass: DevBootstrapSummaryAssembler });
413
505
  container.register(DevBootstrapSummaryHttpRouteHandler, { useClass: DevBootstrapSummaryHttpRouteHandler });
506
+ container.register(PublicFrontendBootstrapHttpRouteHandler, { useClass: PublicFrontendBootstrapHttpRouteHandler });
507
+ container.register(InternalAuthBootstrapHttpRouteHandler, { useClass: InternalAuthBootstrapHttpRouteHandler });
414
508
  container.register(WhitelabelLogoHttpRouteHandler, { useClass: WhitelabelLogoHttpRouteHandler });
415
509
  for (const registrar of AppContainerFactory.honoRouteRegistrars) {
416
510
  container.register(ApplicationTokens.HonoApiRouteRegistrar, { useClass: registrar });
@@ -561,6 +655,7 @@ export class AppContainerFactory {
561
655
  return {
562
656
  databasePersistence: appConfig.persistence,
563
657
  eventBusKind: appConfig.eventing.kind,
658
+ plugins: appConfig.pluginLoadSummary ?? [],
564
659
  queuePrefix: appConfig.scheduler.queuePrefix ?? appConfig.eventing.queuePrefix ?? "codemation",
565
660
  schedulerKind: appConfig.scheduler.kind,
566
661
  redisUrl: appConfig.scheduler.redisUrl ?? appConfig.eventing.redisUrl,
@@ -1,5 +1,6 @@
1
1
  import { CoreTokens } from "@codemation/core";
2
- import type { AppConfig } from "../../presentation/config/AppConfig";
2
+ import type { AppConfig, AppPluginLoadSummary } from "../../presentation/config/AppConfig";
3
+ import { CodemationPluginPackageMetadata } from "../../presentation/config/CodemationPlugin";
3
4
  import type { NormalizedCodemationConfig } from "../../presentation/config/CodemationConfigNormalizer";
4
5
  import type {
5
6
  CodemationApplicationRuntimeConfig,
@@ -10,6 +11,8 @@ import type {
10
11
  import path from "node:path";
11
12
 
12
13
  export class AppConfigFactory {
14
+ private readonly pluginPackageMetadata = new CodemationPluginPackageMetadata();
15
+
13
16
  create(
14
17
  args: Readonly<{
15
18
  repoRoot: string;
@@ -30,6 +33,7 @@ export class AppConfigFactory {
30
33
  const hasConfiguredCredentialSessionServiceRegistration = args.config.containerRegistrations.some(
31
34
  (entry) => entry.token === CoreTokens.CredentialSessionService,
32
35
  );
36
+ const plugins = [...(args.config.plugins ?? [])];
33
37
 
34
38
  return {
35
39
  consumerRoot: args.consumerRoot,
@@ -39,7 +43,8 @@ export class AppConfigFactory {
39
43
  workflows: [...(args.config.workflows ?? [])],
40
44
  containerRegistrations: [...args.config.containerRegistrations],
41
45
  credentialTypes: [...(args.config.credentialTypes ?? [])],
42
- plugins: [...(args.config.plugins ?? [])],
46
+ plugins,
47
+ pluginLoadSummary: this.createConfiguredPluginLoadSummary(plugins),
43
48
  hasConfiguredCredentialSessionServiceRegistration,
44
49
  log: args.config.log,
45
50
  engineExecutionLimits: runtimeConfig.engineExecutionLimits,
@@ -65,6 +70,21 @@ export class AppConfigFactory {
65
70
  };
66
71
  }
67
72
 
73
+ private createConfiguredPluginLoadSummary(plugins: AppConfig["plugins"]): AppConfig["pluginLoadSummary"] {
74
+ const summaries: AppPluginLoadSummary[] = [];
75
+ for (const plugin of plugins) {
76
+ const packageName = this.pluginPackageMetadata.readPackageName(plugin);
77
+ if (!packageName) {
78
+ continue;
79
+ }
80
+ summaries.push({
81
+ packageName,
82
+ source: "configured",
83
+ });
84
+ }
85
+ return summaries;
86
+ }
87
+
68
88
  private resolvePersistence(
69
89
  runtimeConfig: CodemationApplicationRuntimeConfig,
70
90
  env: NodeJS.ProcessEnv,
package/src/client.ts CHANGED
@@ -6,5 +6,9 @@ export type {
6
6
  CodemationFrontendAuthProviderSnapshot,
7
7
  CodemationFrontendAuthSnapshot,
8
8
  } from "./presentation/frontend/CodemationFrontendAuthSnapshot";
9
+ export type { InternalAuthBootstrap } from "./presentation/frontend/InternalAuthBootstrap";
10
+ export type { PublicFrontendBootstrap } from "./presentation/frontend/PublicFrontendBootstrap";
9
11
  export { CodemationFrontendAuthSnapshotJsonCodec } from "./presentation/frontend/CodemationFrontendAuthSnapshotJsonCodec";
10
12
  export { FrontendAppConfigJsonCodec } from "./presentation/frontend/FrontendAppConfigJsonCodec";
13
+ export { InternalAuthBootstrapJsonCodec } from "./presentation/frontend/InternalAuthBootstrapJsonCodec";
14
+ export { PublicFrontendBootstrapJsonCodec } from "./presentation/frontend/PublicFrontendBootstrapJsonCodec";
package/src/index.ts CHANGED
@@ -12,7 +12,7 @@ export { AppConfigFactory } from "./bootstrap/runtime/AppConfigFactory";
12
12
  export { ApplicationTokens } from "./applicationTokens";
13
13
  export { CodemationBootstrapRequest } from "./bootstrap/CodemationBootstrapRequest";
14
14
  export type { CodemationWhitelabelConfig } from "./presentation/config/CodemationWhitelabelConfig";
15
- export type { AppConfig } from "./presentation/config/AppConfig";
15
+ export type { AppConfig, AppPluginLoadSummary } from "./presentation/config/AppConfig";
16
16
  export type {
17
17
  CodemationAuthConfig,
18
18
  CodemationAuthKind,
@@ -48,19 +48,27 @@ export type {
48
48
  CodemationLogLevelName,
49
49
  CodemationLogRule,
50
50
  } from "./presentation/config/CodemationLogConfig";
51
+ export type { CodemationPackageManifest } from "./presentation/config/CodemationPackageManifest";
51
52
  export type {
52
- CodemationPackageManifest,
53
- CodemationPluginPackageManifest,
54
- } from "./presentation/config/CodemationPackageManifest";
55
- export type { CodemationPlugin, CodemationPluginContext } from "./presentation/config/CodemationPlugin";
53
+ CodemationPlugin,
54
+ CodemationPluginConfig,
55
+ CodemationPluginContext,
56
+ } from "./presentation/config/CodemationPlugin";
57
+ export { CodemationPluginPackageMetadata, definePlugin } from "./presentation/config/CodemationPlugin";
56
58
  export { CodemationPluginListMerger } from "./presentation/config/CodemationPluginListMerger";
57
59
  export type { CodemationWorkflowDiscovery } from "./presentation/config/CodemationWorkflowDiscovery";
60
+ export type { InternalAuthBootstrap } from "./presentation/frontend/InternalAuthBootstrap";
61
+ export type { PublicFrontendBootstrap } from "./presentation/frontend/PublicFrontendBootstrap";
58
62
  export {
59
63
  ApiPaths,
60
64
  CodemationFrontendAuthSnapshotFactory,
61
65
  CodemationFrontendAuthSnapshotJsonCodec,
62
66
  FrontendAppConfigFactory,
63
67
  FrontendAppConfigJsonCodec,
68
+ InternalAuthBootstrapFactory,
69
+ InternalAuthBootstrapJsonCodec,
70
+ PublicFrontendBootstrapFactory,
71
+ PublicFrontendBootstrapJsonCodec,
64
72
  CodemationConsumerConfigLoader,
65
73
  CodemationPostgresPrismaClientFactory,
66
74
  CodemationServerGateway,
@@ -15,6 +15,12 @@ export class CodemationPluginRegistrar {
15
15
  }>,
16
16
  ): Promise<void> {
17
17
  for (const plugin of args.plugins) {
18
+ for (const credentialType of plugin.credentialTypes ?? []) {
19
+ args.registerCredentialType(credentialType);
20
+ }
21
+ if (!plugin.register) {
22
+ continue;
23
+ }
18
24
  await plugin.register({
19
25
  container: args.container,
20
26
  appConfig: args.appConfig,
@@ -1,10 +1,7 @@
1
- import { injectable, registry } from "@codemation/core";
1
+ import { injectable } from "@codemation/core";
2
2
  import type { Command } from "../../application/bus/Command";
3
- import type { CommandHandler } from "../../application/bus/CommandHandler";
4
- import { ApplicationTokens } from "../../applicationTokens";
5
3
 
6
4
  type AbstractType<TInstance> = abstract new (...args: any[]) => TInstance;
7
- type ConcreteType<TInstance> = new (...args: any[]) => TInstance;
8
5
 
9
6
  export const commandHandlerMetadataKey = Symbol.for("codemation.infrastructure.di.CommandHandler");
10
7
 
@@ -13,12 +10,6 @@ export class HandlesCommand {
13
10
  return (target) => {
14
11
  Reflect.defineMetadata(commandHandlerMetadataKey, commandType, target);
15
12
  injectable()(target as never);
16
- registry([
17
- {
18
- token: ApplicationTokens.CommandHandler,
19
- useClass: target as unknown as ConcreteType<CommandHandler<Command<unknown>, unknown>>,
20
- },
21
- ])(target as never);
22
13
  };
23
14
  }
24
15
  }
@@ -1,10 +1,7 @@
1
- import { injectable, registry } from "@codemation/core";
1
+ import { injectable } from "@codemation/core";
2
2
  import type { Query } from "../../application/bus/Query";
3
- import type { QueryHandler } from "../../application/bus/QueryHandler";
4
- import { ApplicationTokens } from "../../applicationTokens";
5
3
 
6
4
  type AbstractType<TInstance> = abstract new (...args: any[]) => TInstance;
7
- type ConcreteType<TInstance> = new (...args: any[]) => TInstance;
8
5
 
9
6
  export const queryHandlerMetadataKey = Symbol.for("codemation.infrastructure.di.QueryHandler");
10
7
 
@@ -13,12 +10,6 @@ export class HandlesQuery {
13
10
  return (target) => {
14
11
  Reflect.defineMetadata(queryHandlerMetadataKey, queryType, target);
15
12
  injectable()(target as never);
16
- registry([
17
- {
18
- token: ApplicationTokens.QueryHandler,
19
- useClass: target as unknown as ConcreteType<QueryHandler<Query<unknown>, unknown>>,
20
- },
21
- ])(target as never);
22
13
  };
23
14
  }
24
15
  }
package/src/nextServer.ts CHANGED
@@ -27,7 +27,11 @@ export type {
27
27
  CodemationFrontendAuthSnapshot,
28
28
  } from "./presentation/frontend/CodemationFrontendAuthSnapshot";
29
29
  export type { FrontendAppConfig } from "./presentation/frontend/FrontendAppConfig";
30
+ export type { InternalAuthBootstrap } from "./presentation/frontend/InternalAuthBootstrap";
31
+ export type { PublicFrontendBootstrap } from "./presentation/frontend/PublicFrontendBootstrap";
30
32
  export { FrontendAppConfigFactory } from "./presentation/frontend/FrontendAppConfigFactory";
33
+ export { InternalAuthBootstrapFactory } from "./presentation/frontend/InternalAuthBootstrapFactory";
34
+ export { PublicFrontendBootstrapFactory } from "./presentation/frontend/PublicFrontendBootstrapFactory";
31
35
  export { CredentialBindingService, CredentialInstanceService } from "./domain/credentials/CredentialServices";
32
36
  export { RequestToWebhookItemMapper } from "./infrastructure/webhooks/RequestToWebhookItemMapper";
33
37
  export { CodemationHonoApiApp } from "./presentation/http/hono/CodemationHonoApiAppFactory";
@@ -16,6 +16,11 @@ export type AppPersistenceConfig =
16
16
  | Readonly<{ kind: "postgresql"; databaseUrl: string }>
17
17
  | Readonly<{ kind: "pglite"; dataDir: string }>;
18
18
 
19
+ export type AppPluginLoadSummary = Readonly<{
20
+ packageName: string;
21
+ source: "configured" | "discovered";
22
+ }>;
23
+
19
24
  export interface AppConfig {
20
25
  readonly consumerRoot: string;
21
26
  readonly repoRoot: string;
@@ -25,6 +30,7 @@ export interface AppConfig {
25
30
  readonly containerRegistrations: ReadonlyArray<CodemationContainerRegistration<unknown>>;
26
31
  readonly credentialTypes: ReadonlyArray<AnyCredentialType>;
27
32
  readonly plugins: ReadonlyArray<CodemationPlugin>;
33
+ readonly pluginLoadSummary?: ReadonlyArray<AppPluginLoadSummary>;
28
34
  readonly hasConfiguredCredentialSessionServiceRegistration: boolean;
29
35
  readonly log?: CodemationLogConfig;
30
36
  readonly engineExecutionLimits?: CodemationEngineExecutionLimitsConfig;
@@ -1,9 +1,3 @@
1
- export interface CodemationPluginPackageManifest {
2
- readonly kind: "plugin";
3
- readonly entry: string;
4
- readonly exportName?: string;
5
- }
6
-
7
1
  export interface CodemationPackageManifest {
8
- readonly plugin?: CodemationPluginPackageManifest;
2
+ readonly plugin?: string;
9
3
  }