@codemation/host 0.0.15 → 0.0.18

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 (85) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +37 -0
  3. package/dist/{AppConfigFactory-DmHOpg8O.d.ts → AppConfigFactory-Co4STjwt.d.ts} +5 -3
  4. package/dist/{AppConfigFactory-DWIz2hy-.js → AppConfigFactory-DxoZ4v8r.js} +40 -3
  5. package/dist/AppConfigFactory-DxoZ4v8r.js.map +1 -0
  6. package/dist/{AppContainerFactory-B5eRpvAa.js → AppContainerFactory-z9aUDFiJ.js} +275 -105
  7. package/dist/AppContainerFactory-z9aUDFiJ.js.map +1 -0
  8. package/dist/{CodemationConfig-D2ULNkec.d.ts → CodemationConfig-COs4GcOE.d.ts} +18 -10
  9. package/dist/{CodemationConfigNormalizer-CBLxXaRV.d.ts → CodemationConfigNormalizer-B7w1JA_2.d.ts} +2 -2
  10. package/dist/{CodemationConsumerConfigLoader-BBzAr6L_.js → CodemationConsumerConfigLoader-C_ISRrpI.js} +28 -7
  11. package/dist/CodemationConsumerConfigLoader-C_ISRrpI.js.map +1 -0
  12. package/dist/{CodemationConsumerConfigLoader-BLvzcfb7.d.ts → CodemationConsumerConfigLoader-OlXKw-us.d.ts} +6 -2
  13. package/dist/CodemationPluginListMerger-CGwOTdZ7.js +57 -0
  14. package/dist/CodemationPluginListMerger-CGwOTdZ7.js.map +1 -0
  15. package/dist/{CodemationPluginListMerger-B0-e4CJ6.d.ts → CodemationPluginListMerger-_ZIiOQxB.d.ts} +79 -117
  16. package/dist/{CredentialServices-BeuMtqYA.d.ts → CredentialServices-D3VTczpC.d.ts} +3 -3
  17. package/dist/PublicFrontendBootstrap-p7mS8aWG.d.ts +50 -0
  18. package/dist/{FrontendAppConfigFactory-Bj-DZNlt.d.ts → PublicFrontendBootstrapFactory-CE4oGogq.d.ts} +19 -4
  19. package/dist/{FrontendAppConfigJsonCodec-nOCQI0ag.js → PublicFrontendBootstrapJsonCodec-BdiVGG5R.js} +76 -2
  20. package/dist/PublicFrontendBootstrapJsonCodec-BdiVGG5R.js.map +1 -0
  21. package/dist/PublicFrontendBootstrapJsonCodec-DjkkKXcq.d.ts +35 -0
  22. package/dist/client.d.ts +3 -3
  23. package/dist/client.js +2 -2
  24. package/dist/consumer.d.ts +4 -4
  25. package/dist/consumer.js +1 -1
  26. package/dist/credentials.d.ts +3 -3
  27. package/dist/devServerSidecar.d.ts +1 -1
  28. package/dist/{index-CkiptHb-.d.ts → index-DbYzycTC.d.ts} +215 -71
  29. package/dist/index.d.ts +150 -13
  30. package/dist/index.js +94 -8
  31. package/dist/index.js.map +1 -0
  32. package/dist/nextServer.d.ts +30 -9
  33. package/dist/nextServer.js +4 -4
  34. package/dist/{persistenceServer-DVeWUbc3.js → persistenceServer-C4L1uMKn.js} +2 -2
  35. package/dist/{persistenceServer-DVeWUbc3.js.map → persistenceServer-C4L1uMKn.js.map} +1 -1
  36. package/dist/{persistenceServer-CaehMh3M.d.ts → persistenceServer-Cr-zCuEr.d.ts} +2 -2
  37. package/dist/persistenceServer.d.ts +5 -5
  38. package/dist/persistenceServer.js +2 -2
  39. package/dist/{server-Dyo8qh4k.d.ts → server-B6k53aZj.d.ts} +14 -19
  40. package/dist/{server-C65z_kqm.js → server-DDVXr7BN.js} +42 -25
  41. package/dist/server-DDVXr7BN.js.map +1 -0
  42. package/dist/server.d.ts +11 -11
  43. package/dist/server.js +7 -7
  44. package/package.json +9 -6
  45. package/playwright.scaffolded-dev.config.ts +46 -0
  46. package/src/application/dev/BootRuntimeSummary.types.ts +2 -0
  47. package/src/application/dev/DevBootstrapSummaryAssembler.ts +1 -0
  48. package/src/application/dev/DevBootstrapSummaryJson.types.ts +6 -0
  49. package/src/bootstrap/AppContainerFactory.ts +101 -6
  50. package/src/bootstrap/runtime/AppConfigFactory.ts +22 -2
  51. package/src/client.ts +4 -0
  52. package/src/index.ts +21 -5
  53. package/src/infrastructure/config/CodemationPluginRegistrar.ts +6 -0
  54. package/src/infrastructure/di/HandlesCommandRegistry.ts +1 -10
  55. package/src/infrastructure/di/HandlesQueryRegistry.ts +1 -10
  56. package/src/nextServer.ts +4 -0
  57. package/src/presentation/config/AppConfig.ts +6 -0
  58. package/src/presentation/config/CodemationAuthoring.types.ts +169 -0
  59. package/src/presentation/config/CodemationPackageManifest.ts +1 -7
  60. package/src/presentation/config/CodemationPlugin.ts +45 -8
  61. package/src/presentation/config/CodemationPluginListMerger.ts +30 -26
  62. package/src/presentation/frontend/CodemationFrontendAuthSnapshotFactory.ts +7 -0
  63. package/src/presentation/frontend/InternalAuthBootstrap.ts +12 -0
  64. package/src/presentation/frontend/InternalAuthBootstrapFactory.ts +26 -0
  65. package/src/presentation/frontend/InternalAuthBootstrapJsonCodec.ts +49 -0
  66. package/src/presentation/frontend/PublicFrontendBootstrap.ts +12 -0
  67. package/src/presentation/frontend/PublicFrontendBootstrapFactory.ts +23 -0
  68. package/src/presentation/frontend/PublicFrontendBootstrapJsonCodec.ts +48 -0
  69. package/src/presentation/http/ApiPaths.ts +10 -0
  70. package/src/presentation/http/hono/HonoHttpAnonymousRoutePolicyRegistry.ts +3 -0
  71. package/src/presentation/http/hono/registrars/BootstrapHonoApiRouteRegistrar.ts +32 -0
  72. package/src/presentation/http/routeHandlers/InternalAuthBootstrapHttpRouteHandler.ts +18 -0
  73. package/src/presentation/http/routeHandlers/PublicFrontendBootstrapHttpRouteHandler.ts +18 -0
  74. package/src/presentation/server/CodemationConsumerConfigLoader.ts +28 -6
  75. package/src/presentation/server/CodemationPluginDiscovery.ts +59 -28
  76. package/src/server.ts +6 -0
  77. package/dist/AppConfigFactory-DWIz2hy-.js.map +0 -1
  78. package/dist/AppContainerFactory-B5eRpvAa.js.map +0 -1
  79. package/dist/CodemationConsumerConfigLoader-BBzAr6L_.js.map +0 -1
  80. package/dist/CodemationPluginListMerger-DrVOw9KP.js +0 -57
  81. package/dist/CodemationPluginListMerger-DrVOw9KP.js.map +0 -1
  82. package/dist/FrontendAppConfig-D50wjj_n.d.ts +0 -27
  83. package/dist/FrontendAppConfigJsonCodec-1_L7H_Qo.d.ts +0 -20
  84. package/dist/FrontendAppConfigJsonCodec-nOCQI0ag.js.map +0 -1
  85. package/dist/server-C65z_kqm.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/presentation/config/CodemationAuthoring.types.ts"],"sourcesContent":["import type { AnyCredentialType, DefinedNode, WorkflowDefinition } from \"@codemation/core\";\nimport type { CodemationAppContext } from \"./CodemationAppContext\";\nimport type {\n CodemationAppDefinition,\n CodemationAppSchedulerConfig,\n CodemationConfig,\n CodemationDatabaseConfig,\n} from \"./CodemationConfig\";\nimport type { CodemationPlugin, CodemationPluginContext } from \"./CodemationPlugin\";\nimport type { CodemationWhitelabelConfig } from \"./CodemationWhitelabelConfig\";\n\nexport interface FriendlyCodemationDatabaseConfig {\n readonly kind: \"postgresql\" | \"pglite\";\n readonly url?: string;\n readonly dataDir?: string;\n}\n\nexport interface FriendlyCodemationExecutionConfig {\n readonly mode?: \"inline\" | \"queue\";\n readonly queuePrefix?: string;\n readonly workerQueues?: ReadonlyArray<string>;\n readonly redisUrl?: string;\n}\n\nexport interface DefineCodemationAppOptions extends Omit<\n CodemationConfig,\n \"app\" | \"credentialTypes\" | \"register\" | \"whitelabel\" | \"auth\"\n> {\n readonly name?: string;\n readonly auth?: CodemationConfig[\"auth\"];\n readonly database?: FriendlyCodemationDatabaseConfig;\n readonly execution?: FriendlyCodemationExecutionConfig;\n readonly nodes?: ReadonlyArray<DefinedNode<string, Record<string, unknown>, unknown, unknown>>;\n readonly credentialTypes?: ReadonlyArray<AnyCredentialType>;\n readonly credentials?: ReadonlyArray<AnyCredentialType>;\n readonly register?: (context: CodemationAppContext) => void;\n readonly whitelabel?: CodemationWhitelabelConfig;\n}\n\nexport interface DefinePluginOptions {\n readonly name?: string;\n readonly pluginPackageId?: string;\n readonly nodes?: ReadonlyArray<DefinedNode<string, Record<string, unknown>, unknown, unknown>>;\n readonly credentials?: ReadonlyArray<AnyCredentialType>;\n readonly register?: (context: CodemationPluginContext) => void | Promise<void>;\n readonly sandbox?: DefineCodemationAppOptions & Readonly<{ workflows?: ReadonlyArray<WorkflowDefinition> }>;\n}\n\nclass CodemationAuthoringConfigFactory {\n static createApp(options: DefineCodemationAppOptions): CodemationConfig {\n const appDefinition = this.createAppDefinition(options);\n const credentialTypes = [...(options.credentialTypes ?? []), ...(options.credentials ?? [])];\n const register = this.composeAppRegister(options.register, options.nodes);\n const { workflows, workflowDiscovery, plugins, runtime, log } = options;\n return {\n workflows,\n workflowDiscovery,\n plugins,\n runtime,\n log,\n app: appDefinition,\n credentialTypes,\n register,\n };\n }\n\n static createPlugin(\n options: DefinePluginOptions,\n ): CodemationPlugin & Readonly<{ sandbox?: DefinePluginOptions[\"sandbox\"] }> {\n return {\n pluginPackageId: options.pluginPackageId,\n sandbox: options.sandbox,\n async register(context: CodemationPluginContext): Promise<void> {\n for (const nodeDefinition of options.nodes ?? []) {\n nodeDefinition.register(context);\n }\n for (const credential of options.credentials ?? []) {\n context.registerCredentialType(credential);\n }\n await options.register?.(context);\n },\n };\n }\n\n private static createAppDefinition(options: DefineCodemationAppOptions): CodemationAppDefinition | undefined {\n const scheduler = this.createSchedulerConfig(options.execution);\n const database = this.createDatabaseConfig(options.database);\n const whitelabel = this.createWhitelabel(options.name, options.whitelabel);\n if (!options.auth && !database && !scheduler && !whitelabel) {\n return undefined;\n }\n return {\n auth: options.auth,\n database,\n scheduler,\n whitelabel,\n };\n }\n\n private static createDatabaseConfig(\n database: FriendlyCodemationDatabaseConfig | undefined,\n ): CodemationDatabaseConfig | undefined {\n if (!database) {\n return undefined;\n }\n if (database.kind === \"pglite\") {\n return {\n kind: \"pglite\",\n pgliteDataDir: database.dataDir,\n };\n }\n return {\n kind: \"postgresql\",\n url: database.url,\n };\n }\n\n private static createSchedulerConfig(\n execution: FriendlyCodemationExecutionConfig | undefined,\n ): CodemationAppSchedulerConfig | undefined {\n if (!execution) {\n return undefined;\n }\n return {\n kind: execution.mode,\n queuePrefix: execution.queuePrefix,\n workerQueues: execution.workerQueues,\n redisUrl: execution.redisUrl,\n };\n }\n\n private static createWhitelabel(\n name: string | undefined,\n whitelabel: CodemationWhitelabelConfig | undefined,\n ): CodemationWhitelabelConfig | undefined {\n if (!name && !whitelabel) {\n return undefined;\n }\n return {\n productName: name ?? whitelabel?.productName,\n logoPath: whitelabel?.logoPath,\n };\n }\n\n private static composeAppRegister(\n register: ((context: CodemationAppContext) => void) | undefined,\n nodes: ReadonlyArray<DefinedNode<string, Record<string, unknown>, unknown, unknown>> | undefined,\n ): ((context: CodemationAppContext) => void) | undefined {\n if (!register && (!nodes || nodes.length === 0)) {\n return undefined;\n }\n return (context: CodemationAppContext) => {\n for (const nodeDefinition of nodes ?? []) {\n nodeDefinition.register(context);\n }\n register?.(context);\n };\n }\n}\n\nexport function defineCodemationApp(options: DefineCodemationAppOptions): CodemationConfig {\n return CodemationAuthoringConfigFactory.createApp(options);\n}\n\nexport function definePlugin(\n options: DefinePluginOptions,\n): CodemationPlugin & Readonly<{ sandbox?: DefinePluginOptions[\"sandbox\"] }> {\n return CodemationAuthoringConfigFactory.createPlugin(options);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgDA,IAAM,mCAAN,MAAuC;CACrC,OAAO,UAAU,SAAuD;EACtE,MAAM,gBAAgB,KAAK,oBAAoB,QAAQ;EACvD,MAAM,kBAAkB,CAAC,GAAI,QAAQ,mBAAmB,EAAE,EAAG,GAAI,QAAQ,eAAe,EAAE,CAAE;EAC5F,MAAM,WAAW,KAAK,mBAAmB,QAAQ,UAAU,QAAQ,MAAM;EACzE,MAAM,EAAE,WAAW,mBAAmB,SAAS,SAAS,QAAQ;AAChE,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,KAAK;GACL;GACA;GACD;;CAGH,OAAO,aACL,SAC2E;AAC3E,SAAO;GACL,iBAAiB,QAAQ;GACzB,SAAS,QAAQ;GACjB,MAAM,SAAS,SAAiD;AAC9D,SAAK,MAAM,kBAAkB,QAAQ,SAAS,EAAE,CAC9C,gBAAe,SAAS,QAAQ;AAElC,SAAK,MAAM,cAAc,QAAQ,eAAe,EAAE,CAChD,SAAQ,uBAAuB,WAAW;AAE5C,UAAM,QAAQ,WAAW,QAAQ;;GAEpC;;CAGH,OAAe,oBAAoB,SAA0E;EAC3G,MAAM,YAAY,KAAK,sBAAsB,QAAQ,UAAU;EAC/D,MAAM,WAAW,KAAK,qBAAqB,QAAQ,SAAS;EAC5D,MAAM,aAAa,KAAK,iBAAiB,QAAQ,MAAM,QAAQ,WAAW;AAC1E,MAAI,CAAC,QAAQ,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,WAC/C;AAEF,SAAO;GACL,MAAM,QAAQ;GACd;GACA;GACA;GACD;;CAGH,OAAe,qBACb,UACsC;AACtC,MAAI,CAAC,SACH;AAEF,MAAI,SAAS,SAAS,SACpB,QAAO;GACL,MAAM;GACN,eAAe,SAAS;GACzB;AAEH,SAAO;GACL,MAAM;GACN,KAAK,SAAS;GACf;;CAGH,OAAe,sBACb,WAC0C;AAC1C,MAAI,CAAC,UACH;AAEF,SAAO;GACL,MAAM,UAAU;GAChB,aAAa,UAAU;GACvB,cAAc,UAAU;GACxB,UAAU,UAAU;GACrB;;CAGH,OAAe,iBACb,MACA,YACwC;AACxC,MAAI,CAAC,QAAQ,CAAC,WACZ;AAEF,SAAO;GACL,aAAa,QAAQ,YAAY;GACjC,UAAU,YAAY;GACvB;;CAGH,OAAe,mBACb,UACA,OACuD;AACvD,MAAI,CAAC,aAAa,CAAC,SAAS,MAAM,WAAW,GAC3C;AAEF,UAAQ,YAAkC;AACxC,QAAK,MAAM,kBAAkB,SAAS,EAAE,CACtC,gBAAe,SAAS,QAAQ;AAElC,cAAW,QAAQ;;;;AAKzB,SAAgB,oBAAoB,SAAuD;AACzF,QAAO,iCAAiC,UAAU,QAAQ;;AAG5D,SAAgB,aACd,SAC2E;AAC3E,QAAO,iCAAiC,aAAa,QAAQ"}
@@ -1,13 +1,13 @@
1
1
  import { l as Logger, u as LoggerFactory } from "./CodemationAuthConfig-Bh2cCNCI.js";
2
2
  import { t as LogLevelPolicy } from "./LogLevelPolicy-BS_NlAOg.js";
3
- import { n as CodemationFrontendAuthProviderSnapshot, r as CodemationFrontendAuthSnapshot, t as FrontendAppConfig } from "./FrontendAppConfig-D50wjj_n.js";
4
- import { C as CredentialTypeDefinition, E as ActivationIdFactory, M as WorkflowDefinition, O as Item, P as BinaryStorage, R as WebhookInvocationMatch, U as Clock, _ as CredentialOAuth2AuthDefinition, j as RunIdFactory, k as NodeDefinition, t as RunIntentService, z as WorkflowActivationPolicy } from "./index-CkiptHb-.js";
5
- import { g as AppConfig } from "./CodemationConfig-D2ULNkec.js";
6
- import "./CodemationConfigNormalizer-CBLxXaRV.js";
7
- import { a as CredentialInstanceService, c as CredentialFieldEnvOverlayService, i as CredentialBindingService, l as CredentialTypeRegistryImpl, o as CredentialMaterialResolver, r as CredentialRuntimeMaterialService, s as CredentialSecretCipher, t as CredentialStore } from "./CredentialServices-BeuMtqYA.js";
8
- import { _ as QueryBus, a as SessionVerifier, c as DatabaseMigrations, d as WorkflowWebsocketServer, f as RunBinaryAttachmentLookupService, i as HonoApiRouteRegistrar, l as AppContainerLifecycle, n as CodemationBootstrapRequest, o as WorkerRuntime, p as WorkflowRunRepository, r as ApplicationTokens, s as FrontendRuntime, t as CodemationPluginListMerger, u as AppContainerFactory, v as CommandBus } from "./CodemationPluginListMerger-B0-e4CJ6.js";
9
- import { t as AppConfigFactory } from "./AppConfigFactory-DmHOpg8O.js";
10
- import { i as WorkflowSummary, r as WorkflowDto, t as FrontendAppConfigFactory } from "./FrontendAppConfigFactory-Bj-DZNlt.js";
3
+ import { a as CodemationFrontendAuthSnapshot, i as CodemationFrontendAuthProviderSnapshot, n as InternalAuthBootstrap, r as FrontendAppConfig, t as PublicFrontendBootstrap } from "./PublicFrontendBootstrap-p7mS8aWG.js";
4
+ import { A as RunIdFactory, D as Item, E as BinaryAttachment, F as BinaryStorage, K as WorkflowActivationPolicy, N as WorkflowDefinition, O as NodeDefinition, S as CredentialTypeDefinition, T as ActivationIdFactory, Z as Clock, g as CredentialOAuth2AuthDefinition, q as WebhookInvocationMatch, t as RunIntentService } from "./index-DbYzycTC.js";
5
+ import { g as AppConfig } from "./CodemationConfig-COs4GcOE.js";
6
+ import "./CodemationConfigNormalizer-B7w1JA_2.js";
7
+ import { a as CredentialInstanceService, c as CredentialFieldEnvOverlayService, i as CredentialBindingService, l as CredentialTypeRegistryImpl, o as CredentialMaterialResolver, r as CredentialRuntimeMaterialService, s as CredentialSecretCipher, t as CredentialStore } from "./CredentialServices-D3VTczpC.js";
8
+ import { a as WorkflowDebuggerOverlayRepository, c as WorkerRuntime, d as AppContainerLifecycle, f as AppContainerFactory, g as CommandBus, i as HonoApiRouteRegistrar, l as FrontendRuntime, m as QueryBus, n as CodemationBootstrapRequest, o as WorkflowRunRepository, p as WorkflowWebsocketServer, r as ApplicationTokens, s as SessionVerifier, t as CodemationPluginListMerger, u as DatabaseMigrations } from "./CodemationPluginListMerger-_ZIiOQxB.js";
9
+ import { t as AppConfigFactory } from "./AppConfigFactory-Co4STjwt.js";
10
+ import { a as WorkflowDto, n as InternalAuthBootstrapFactory, o as WorkflowSummary, r as FrontendAppConfigFactory, t as PublicFrontendBootstrapFactory } from "./PublicFrontendBootstrapFactory-CE4oGogq.js";
11
11
  import { Hono } from "hono";
12
12
 
13
13
  //#region src/application/dev/DevBootstrapSummaryJson.types.d.ts
@@ -22,6 +22,10 @@ type DevBootstrapSummaryJson = Readonly<{
22
22
  id: string;
23
23
  name: string;
24
24
  }>>;
25
+ plugins: ReadonlyArray<Readonly<{
26
+ packageName: string;
27
+ source: "configured" | "discovered";
28
+ }>>;
25
29
  }>;
26
30
  //#endregion
27
31
  //#region src/application/logging/LogFilter.d.ts
@@ -84,6 +88,23 @@ declare class ServerLoggerFactory implements LoggerFactory {
84
88
  createPerformanceDiagnostics(scope: string): Logger;
85
89
  }
86
90
  //#endregion
91
+ //#region src/application/binary/RunBinaryAttachmentLookupService.d.ts
92
+ declare class RunBinaryAttachmentLookupService {
93
+ private readonly workflowRunRepository;
94
+ private readonly workflowDebuggerOverlayRepository;
95
+ constructor(workflowRunRepository: WorkflowRunRepository, workflowDebuggerOverlayRepository: WorkflowDebuggerOverlayRepository);
96
+ findForRun(runId: string, binaryId: string): Promise<BinaryAttachment | undefined>;
97
+ findForWorkflowOverlay(workflowId: string, binaryId: string): Promise<BinaryAttachment | undefined>;
98
+ private findInRunState;
99
+ private findInCurrentState;
100
+ private findInOutputsByNode;
101
+ private findInNodeSnapshots;
102
+ private findInCurrentStateSnapshots;
103
+ private findInMutableState;
104
+ private findInPortItemMap;
105
+ private findInItems;
106
+ }
107
+ //#endregion
87
108
  //#region src/application/mapping/DataMapper.d.ts
88
109
  interface DataMapper<TSource, TTarget> {
89
110
  map(source: TSource): Promise<TTarget>;
@@ -320,5 +341,5 @@ declare class WorkflowHttpRouteHandler {
320
341
  postCopyWorkflowDebuggerOverlay(request: Request, params: ServerHttpRouteParams): Promise<Response>;
321
342
  }
322
343
  //#endregion
323
- export { AppConfigFactory, AppContainerFactory, AppContainerLifecycle, ApplicationTokens, BinaryHttpRouteHandler, CodemationBootstrapRequest, type CodemationFrontendAuthProviderSnapshot, type CodemationFrontendAuthSnapshot, CodemationHonoApiApp, CodemationPluginListMerger, CredentialBindingService, CredentialHttpRouteHandler, CredentialInstanceService, DatabaseMigrations, type DevBootstrapSummaryJson, FilteringLogger, type FrontendAppConfig, FrontendAppConfigFactory, FrontendRuntime, type LogFilter, LogLevelPolicyFactory, type Logger, type LoggerFactory, OAuth2HttpRouteHandler, PerformanceLogPolicy, PerformanceLogPolicyFactory, RequestToWebhookItemMapper, RunBinaryAttachmentLookupService, RunHttpRouteHandler, ServerLoggerFactory, WebhookHttpRouteHandler, WorkerRuntime, WorkflowDefinitionMapper, WorkflowHttpRouteHandler, WorkflowPolicyUiPresentationFactory, WorkflowRunRetentionPruneScheduler, WorkflowWebsocketServer, logLevelPolicyFactory, performanceLogPolicyFactory };
344
+ export { AppConfigFactory, AppContainerFactory, AppContainerLifecycle, ApplicationTokens, BinaryHttpRouteHandler, CodemationBootstrapRequest, type CodemationFrontendAuthProviderSnapshot, type CodemationFrontendAuthSnapshot, CodemationHonoApiApp, CodemationPluginListMerger, CredentialBindingService, CredentialHttpRouteHandler, CredentialInstanceService, DatabaseMigrations, type DevBootstrapSummaryJson, FilteringLogger, type FrontendAppConfig, FrontendAppConfigFactory, FrontendRuntime, type InternalAuthBootstrap, InternalAuthBootstrapFactory, type LogFilter, LogLevelPolicyFactory, type Logger, type LoggerFactory, OAuth2HttpRouteHandler, PerformanceLogPolicy, PerformanceLogPolicyFactory, type PublicFrontendBootstrap, PublicFrontendBootstrapFactory, RequestToWebhookItemMapper, RunBinaryAttachmentLookupService, RunHttpRouteHandler, ServerLoggerFactory, WebhookHttpRouteHandler, WorkerRuntime, WorkflowDefinitionMapper, WorkflowHttpRouteHandler, WorkflowPolicyUiPresentationFactory, WorkflowRunRetentionPruneScheduler, WorkflowWebsocketServer, logLevelPolicyFactory, performanceLogPolicyFactory };
324
345
  //# sourceMappingURL=nextServer.d.ts.map
@@ -3,9 +3,9 @@ import { a as FilteringLogger, i as PerformanceLogPolicy, n as PerformanceLogPol
3
3
  import { n as __decorateMetadata, t as __decorateParam } from "./decorateParam-DrsXNPuw.js";
4
4
  import { t as __decorate } from "./decorate-B0PP651O.js";
5
5
  import { a as CredentialInstanceService, i as CredentialBindingService, u as ApplicationTokens } from "./CredentialServices-DNb3CZwW.js";
6
- import { S as RunBinaryAttachmentLookupService, a as AppContainerLifecycle, c as RequestToWebhookItemMapper, d as CredentialHttpRouteHandler, f as CodemationHonoApiApp, g as WorkflowWebsocketServer, i as DatabaseMigrations, l as RunHttpRouteHandler, m as FrontendAppConfigFactory, n as WorkerRuntime, o as WorkflowHttpRouteHandler, p as BinaryHttpRouteHandler, r as FrontendRuntime, s as WebhookHttpRouteHandler, t as AppContainerFactory, u as OAuth2HttpRouteHandler, v as WorkflowDefinitionMapper, y as WorkflowPolicyUiPresentationFactory } from "./AppContainerFactory-B5eRpvAa.js";
7
- import { t as AppConfigFactory } from "./AppConfigFactory-DWIz2hy-.js";
8
- import { n as CodemationBootstrapRequest, t as CodemationPluginListMerger } from "./CodemationPluginListMerger-DrVOw9KP.js";
6
+ import { a as AppContainerLifecycle, b as WorkflowDefinitionMapper, c as RequestToWebhookItemMapper, d as CredentialHttpRouteHandler, f as CodemationHonoApiApp, g as FrontendAppConfigFactory, h as InternalAuthBootstrapFactory, i as DatabaseMigrations, l as RunHttpRouteHandler, m as PublicFrontendBootstrapFactory, n as WorkerRuntime, o as WorkflowHttpRouteHandler, p as BinaryHttpRouteHandler, r as FrontendRuntime, s as WebhookHttpRouteHandler, t as AppContainerFactory, u as OAuth2HttpRouteHandler, v as WorkflowWebsocketServer, w as RunBinaryAttachmentLookupService, x as WorkflowPolicyUiPresentationFactory } from "./AppContainerFactory-z9aUDFiJ.js";
7
+ import { t as AppConfigFactory } from "./AppConfigFactory-DxoZ4v8r.js";
8
+ import { n as CodemationBootstrapRequest, t as CodemationPluginListMerger } from "./CodemationPluginListMerger-CGwOTdZ7.js";
9
9
  import { CoreTokens, RunFinishedAtFactory, inject, injectable } from "@codemation/core";
10
10
 
11
11
  //#region src/application/binary/RunStateBinaryStorageKeysCollector.ts
@@ -123,5 +123,5 @@ WorkflowRunRetentionPruneScheduler = __decorate([
123
123
  ], WorkflowRunRetentionPruneScheduler);
124
124
 
125
125
  //#endregion
126
- export { AppConfigFactory, AppContainerFactory, AppContainerLifecycle, ApplicationTokens, BinaryHttpRouteHandler, CodemationBootstrapRequest, CodemationHonoApiApp, CodemationPluginListMerger, CredentialBindingService, CredentialHttpRouteHandler, CredentialInstanceService, DatabaseMigrations, FilteringLogger, FrontendAppConfigFactory, FrontendRuntime, LogLevelPolicyFactory, OAuth2HttpRouteHandler, PerformanceLogPolicy, PerformanceLogPolicyFactory, RequestToWebhookItemMapper, RunBinaryAttachmentLookupService, RunHttpRouteHandler, ServerLoggerFactory, WebhookHttpRouteHandler, WorkerRuntime, WorkflowDefinitionMapper, WorkflowHttpRouteHandler, WorkflowPolicyUiPresentationFactory, WorkflowRunRetentionPruneScheduler, WorkflowWebsocketServer, logLevelPolicyFactory, performanceLogPolicyFactory };
126
+ export { AppConfigFactory, AppContainerFactory, AppContainerLifecycle, ApplicationTokens, BinaryHttpRouteHandler, CodemationBootstrapRequest, CodemationHonoApiApp, CodemationPluginListMerger, CredentialBindingService, CredentialHttpRouteHandler, CredentialInstanceService, DatabaseMigrations, FilteringLogger, FrontendAppConfigFactory, FrontendRuntime, InternalAuthBootstrapFactory, LogLevelPolicyFactory, OAuth2HttpRouteHandler, PerformanceLogPolicy, PerformanceLogPolicyFactory, PublicFrontendBootstrapFactory, RequestToWebhookItemMapper, RunBinaryAttachmentLookupService, RunHttpRouteHandler, ServerLoggerFactory, WebhookHttpRouteHandler, WorkerRuntime, WorkflowDefinitionMapper, WorkflowHttpRouteHandler, WorkflowPolicyUiPresentationFactory, WorkflowRunRetentionPruneScheduler, WorkflowWebsocketServer, logLevelPolicyFactory, performanceLogPolicyFactory };
127
127
  //# sourceMappingURL=nextServer.js.map
@@ -1,5 +1,5 @@
1
1
  import { i as __toESM } from "./chunk-7V6ThxGB.js";
2
- import { r as require_client } from "./AppConfigFactory-DWIz2hy-.js";
2
+ import { i as require_client } from "./AppConfigFactory-DxoZ4v8r.js";
3
3
  import { PrismaPg } from "@prisma/adapter-pg";
4
4
 
5
5
  //#region src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.ts
@@ -16,4 +16,4 @@ var import_client = /* @__PURE__ */ __toESM(require_client(), 1);
16
16
 
17
17
  //#endregion
18
18
  export { CodemationPostgresPrismaClientFactory as n, import_client as t };
19
- //# sourceMappingURL=persistenceServer-DVeWUbc3.js.map
19
+ //# sourceMappingURL=persistenceServer-C4L1uMKn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistenceServer-DVeWUbc3.js","names":["PrismaClient"],"sources":["../src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.ts","../src/persistenceServer.ts"],"sourcesContent":["import { PrismaPg } from \"@prisma/adapter-pg\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\nexport class CodemationPostgresPrismaClientFactory {\n static create(databaseUrl: string): PrismaClient {\n const adapter = new PrismaPg({ connectionString: databaseUrl });\n return new PrismaClient({ adapter });\n }\n}\n","export { CodemationPostgresPrismaClientFactory } from \"./infrastructure/persistence/CodemationPostgresPrismaClientFactory\";\nexport type { AppPersistenceConfig } from \"./presentation/config/AppConfig\";\nexport { AppConfigFactory } from \"./bootstrap/runtime/AppConfigFactory\";\nexport { PrismaMigrationDeployer } from \"./infrastructure/persistence/PrismaMigrationDeployer\";\nexport { PrismaClient } from \"./infrastructure/persistence/generated/prisma-client/client.js\";\n"],"mappings":";;;;;;AAGA,IAAa,wCAAb,MAAmD;CACjD,OAAO,OAAO,aAAmC;AAE/C,SAAO,IAAIA,6BAAa,EAAE,SADV,IAAI,SAAS,EAAE,kBAAkB,aAAa,CAAC,EAC5B,CAAC"}
1
+ {"version":3,"file":"persistenceServer-C4L1uMKn.js","names":["PrismaClient"],"sources":["../src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.ts","../src/persistenceServer.ts"],"sourcesContent":["import { PrismaPg } from \"@prisma/adapter-pg\";\nimport { PrismaClient } from \"./generated/prisma-client/client.js\";\n\nexport class CodemationPostgresPrismaClientFactory {\n static create(databaseUrl: string): PrismaClient {\n const adapter = new PrismaPg({ connectionString: databaseUrl });\n return new PrismaClient({ adapter });\n }\n}\n","export { CodemationPostgresPrismaClientFactory } from \"./infrastructure/persistence/CodemationPostgresPrismaClientFactory\";\nexport type { AppPersistenceConfig } from \"./presentation/config/AppConfig\";\nexport { AppConfigFactory } from \"./bootstrap/runtime/AppConfigFactory\";\nexport { PrismaMigrationDeployer } from \"./infrastructure/persistence/PrismaMigrationDeployer\";\nexport { PrismaClient } from \"./infrastructure/persistence/generated/prisma-client/client.js\";\n"],"mappings":";;;;;;AAGA,IAAa,wCAAb,MAAmD;CACjD,OAAO,OAAO,aAAmC;AAE/C,SAAO,IAAIA,6BAAa,EAAE,SADV,IAAI,SAAS,EAAE,kBAAkB,aAAa,CAAC,EAC5B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { r as PrismaClient } from "./AppConfigFactory-DmHOpg8O.js";
1
+ import { r as PrismaClient } from "./AppConfigFactory-Co4STjwt.js";
2
2
 
3
3
  //#region src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.d.ts
4
4
  declare class CodemationPostgresPrismaClientFactory {
@@ -6,4 +6,4 @@ declare class CodemationPostgresPrismaClientFactory {
6
6
  }
7
7
  //#endregion
8
8
  export { CodemationPostgresPrismaClientFactory as t };
9
- //# sourceMappingURL=persistenceServer-CaehMh3M.d.ts.map
9
+ //# sourceMappingURL=persistenceServer-Cr-zCuEr.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import "./CodemationAuthConfig-Bh2cCNCI.js";
2
- import "./index-CkiptHb-.js";
3
- import { _ as AppPersistenceConfig } from "./CodemationConfig-D2ULNkec.js";
4
- import "./CodemationConfigNormalizer-CBLxXaRV.js";
5
- import { n as PrismaMigrationDeployer, r as PrismaClient, t as AppConfigFactory } from "./AppConfigFactory-DmHOpg8O.js";
6
- import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-CaehMh3M.js";
2
+ import "./index-DbYzycTC.js";
3
+ import { _ as AppPersistenceConfig } from "./CodemationConfig-COs4GcOE.js";
4
+ import "./CodemationConfigNormalizer-B7w1JA_2.js";
5
+ import { n as PrismaMigrationDeployer, r as PrismaClient, t as AppConfigFactory } from "./AppConfigFactory-Co4STjwt.js";
6
+ import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-Cr-zCuEr.js";
7
7
  export { AppConfigFactory, AppPersistenceConfig, CodemationPostgresPrismaClientFactory, PrismaClient, PrismaMigrationDeployer };
@@ -1,6 +1,6 @@
1
1
  import "./decorate-B0PP651O.js";
2
- import { n as PrismaMigrationDeployer, t as AppConfigFactory } from "./AppConfigFactory-DWIz2hy-.js";
3
- import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-DVeWUbc3.js";
2
+ import { r as PrismaMigrationDeployer, t as AppConfigFactory } from "./AppConfigFactory-DxoZ4v8r.js";
3
+ import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-C4L1uMKn.js";
4
4
 
5
5
  var PrismaClient = import_client.PrismaClient;
6
6
  export { AppConfigFactory, CodemationPostgresPrismaClientFactory, PrismaClient, PrismaMigrationDeployer };
@@ -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-COs4GcOE.js";
2
+ import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-OlXKw-us.js";
3
+ import { t as AppConfigFactory } from "./AppConfigFactory-Co4STjwt.js";
4
+ import { a as WorkflowDto, o as WorkflowSummary } from "./PublicFrontendBootstrapFactory-CE4oGogq.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-B6k53aZj.d.ts.map
@@ -1,7 +1,7 @@
1
- import { a as CodemationConfigNormalizer, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-BBzAr6L_.js";
1
+ import { a as CodemationConfigNormalizer, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-C_ISRrpI.js";
2
2
  import { u as ApplicationTokens } from "./CredentialServices-DNb3CZwW.js";
3
- import { a as AppContainerLifecycle, b as GetWorkflowSummariesQuery, f as CodemationHonoApiApp, r as FrontendRuntime, t as AppContainerFactory, v as WorkflowDefinitionMapper, x as GetWorkflowDetailQuery } from "./AppContainerFactory-B5eRpvAa.js";
4
- import { t as AppConfigFactory } from "./AppConfigFactory-DWIz2hy-.js";
3
+ import { C as GetWorkflowDetailQuery, S as GetWorkflowSummariesQuery, a as AppContainerLifecycle, b as WorkflowDefinitionMapper, f as CodemationHonoApiApp, r as FrontendRuntime, t as AppContainerFactory } from "./AppContainerFactory-z9aUDFiJ.js";
4
+ import { n as CodemationPluginPackageMetadata, t as AppConfigFactory } from "./AppConfigFactory-DxoZ4v8r.js";
5
5
  import { readFile, readdir } from "node:fs/promises";
6
6
  import path from "node:path";
7
7
  import { pathToFileURL } from "node:url";
@@ -114,6 +114,7 @@ var AppConfigLoader = class {
114
114
  //#endregion
115
115
  //#region src/presentation/server/CodemationPluginDiscovery.ts
116
116
  var CodemationPluginDiscovery = class {
117
+ pluginPackageMetadata = new CodemationPluginPackageMetadata();
117
118
  async discover(consumerRoot) {
118
119
  const nodeModulesRoot = path.resolve(consumerRoot, "node_modules");
119
120
  const packageRoots = await this.collectPackageRoots(nodeModulesRoot);
@@ -121,12 +122,12 @@ var CodemationPluginDiscovery = class {
121
122
  for (const packageRoot of packageRoots) {
122
123
  const packageJson = await this.readPackageJson(path.resolve(packageRoot, "package.json"));
123
124
  const pluginManifest = packageJson.codemation?.plugin;
124
- if (!packageJson.name || !pluginManifest || pluginManifest.kind !== "plugin") continue;
125
+ if (!packageJson.name || typeof pluginManifest !== "string" || pluginManifest.trim().length === 0) continue;
125
126
  discoveredPackages.push({
126
127
  packageName: packageJson.name,
127
128
  packageRoot,
128
- manifest: pluginManifest,
129
- developmentEntry: this.resolveDevelopmentPluginEntry(packageJson)
129
+ pluginEntry: pluginManifest,
130
+ developmentEntry: await this.resolveDevelopmentPluginEntry(packageRoot)
130
131
  });
131
132
  }
132
133
  return discoveredPackages.sort((left, right) => left.packageName.localeCompare(right.packageName));
@@ -170,36 +171,52 @@ var CodemationPluginDiscovery = class {
170
171
  }
171
172
  }
172
173
  async loadPlugin(discoveredPackage) {
173
- const importedModule = await import(pathToFileURL(path.resolve(discoveredPackage.packageRoot, this.resolvePluginEntry(discoveredPackage))).href);
174
- const pluginExportName = discoveredPackage.manifest.exportName;
175
- const exportedValue = (pluginExportName ? importedModule[pluginExportName] : void 0) ?? importedModule.default ?? importedModule.codemationPlugin;
174
+ const pluginModulePath = path.resolve(discoveredPackage.packageRoot, this.resolvePluginEntry(discoveredPackage));
175
+ const exportedValue = (await import(
176
+ /* webpackIgnore: true */
177
+ this.resolvePluginModuleSpecifier(pluginModulePath)
178
+ )).default;
176
179
  const plugin = this.resolvePluginValue(exportedValue);
177
- if (!plugin) throw new Error(`Plugin package "${discoveredPackage.packageName}" did not export a Codemation plugin instance.`);
178
- return plugin;
180
+ if (!plugin) throw new Error(`Plugin package "${discoveredPackage.packageName}" did not default-export a Codemation plugin.`);
181
+ return this.pluginPackageMetadata.attachPackageName(plugin, discoveredPackage.packageName);
179
182
  }
180
183
  resolvePluginValue(value) {
181
- if (this.isPlugin(value)) return value;
182
- if (this.isPluginConstructor(value)) return new value();
184
+ if (this.isPluginConfig(value)) return value;
183
185
  return null;
184
186
  }
185
- isPlugin(value) {
186
- return Boolean(value) && typeof value === "object" && typeof value.register === "function";
187
- }
188
- isPluginConstructor(value) {
189
- return typeof value === "function" && this.isPlugin(value.prototype);
187
+ isPluginConfig(value) {
188
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
189
+ const pluginValue = value;
190
+ if (pluginValue.register !== void 0 && typeof pluginValue.register !== "function") return false;
191
+ if (pluginValue.credentialTypes !== void 0 && !Array.isArray(pluginValue.credentialTypes)) return false;
192
+ return pluginValue.register !== void 0 || pluginValue.credentialTypes !== void 0 || pluginValue.sandbox !== void 0 || Object.keys(pluginValue).length === 0;
190
193
  }
191
194
  resolvePluginEntry(discoveredPackage) {
192
195
  if (process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === "true" && typeof discoveredPackage.developmentEntry === "string" && discoveredPackage.developmentEntry.trim().length > 0) return discoveredPackage.developmentEntry;
193
- return discoveredPackage.manifest.entry;
196
+ return discoveredPackage.pluginEntry;
197
+ }
198
+ async resolveDevelopmentPluginEntry(packageRoot) {
199
+ const candidates = [
200
+ path.resolve(packageRoot, "codemation.plugin.ts"),
201
+ path.resolve(packageRoot, "codemation.plugin.js"),
202
+ path.resolve(packageRoot, "src", "codemation.plugin.ts"),
203
+ path.resolve(packageRoot, "src", "codemation.plugin.js")
204
+ ];
205
+ for (const candidate of candidates) if (await this.exists(candidate)) return path.relative(packageRoot, candidate);
206
+ }
207
+ async exists(filePath) {
208
+ try {
209
+ await readFile(filePath, "utf8");
210
+ return true;
211
+ } catch {
212
+ return false;
213
+ }
194
214
  }
195
- resolveDevelopmentPluginEntry(packageJson) {
196
- const exportRecord = packageJson.exports?.["./codemation-plugin"];
197
- if (!exportRecord || typeof exportRecord !== "object") return;
198
- const importPath = exportRecord.import;
199
- return typeof importPath === "string" && importPath.trim().length > 0 ? importPath : void 0;
215
+ resolvePluginModuleSpecifier(pluginModulePath) {
216
+ return pathToFileURL(pluginModulePath).href;
200
217
  }
201
218
  };
202
219
 
203
220
  //#endregion
204
221
  export { AppConfigLoader as n, CodemationServerGateway as r, CodemationPluginDiscovery as t };
205
- //# sourceMappingURL=server-C65z_kqm.js.map
222
+ //# sourceMappingURL=server-DDVXr7BN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-DDVXr7BN.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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"}
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";
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 };
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
+ import "./index-DbYzycTC.js";
5
+ import "./CodemationConfig-COs4GcOE.js";
6
+ import "./CodemationConfigNormalizer-B7w1JA_2.js";
7
+ import { i as CodemationConsumerAppResolver, n as CodemationConsumerConfigResolution, r as CodemationConsumerApp, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-OlXKw-us.js";
8
+ import { r as PrismaClient } from "./AppConfigFactory-Co4STjwt.js";
9
+ import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-Cr-zCuEr.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-B6k53aZj.js";
11
+ import { i as CodemationFrontendAuthSnapshotFactory, n as InternalAuthBootstrapFactory, r as FrontendAppConfigFactory, t as PublicFrontendBootstrapFactory } from "./PublicFrontendBootstrapFactory-CE4oGogq.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-C_ISRrpI.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-z9aUDFiJ.js";
9
+ import "./AppConfigFactory-DxoZ4v8r.js";
10
+ import { n as CodemationPostgresPrismaClientFactory, t as import_client } from "./persistenceServer-C4L1uMKn.js";
11
+ import { n as AppConfigLoader, r as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-DDVXr7BN.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.15",
3
+ "version": "0.0.18",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -11,6 +11,7 @@
11
11
  "url": "https://github.com/MadeRelevant/codemation",
12
12
  "directory": "packages/host"
13
13
  },
14
+ "license": "SEE LICENSE IN LICENSE",
14
15
  "type": "module",
15
16
  "main": "./dist/index.js",
16
17
  "module": "./dist/index.js",
@@ -109,9 +110,9 @@
109
110
  "tsx": "^4.21.0",
110
111
  "ws": "^8.19.0",
111
112
  "zxcvbn": "^4.4.2",
112
- "@codemation/core-nodes": "0.0.15",
113
- "@codemation/core": "0.0.15",
114
- "@codemation/eventbus-redis": "0.0.15"
113
+ "@codemation/core": "0.0.18",
114
+ "@codemation/core-nodes": "0.0.18",
115
+ "@codemation/eventbus-redis": "0.0.18"
115
116
  },
116
117
  "devDependencies": {
117
118
  "@playwright/test": "^1.58.2",
@@ -136,7 +137,7 @@
136
137
  "tsdown": "^0.15.5",
137
138
  "typescript": "^5.9.3",
138
139
  "vitest": "^4.0.18",
139
- "@codemation/core-nodes-gmail": "0.0.15"
140
+ "@codemation/core-nodes-gmail": "0.0.18"
140
141
  },
141
142
  "scripts": {
142
143
  "prisma:generate": "prisma generate && node ./scripts/ensure-prisma-runtime-sourcemaps.mjs",
@@ -148,7 +149,9 @@
148
149
  "test:unit": "vitest run --config vitest.unit.config.ts",
149
150
  "test:integration": "vitest run --config vitest.integration.config.ts",
150
151
  "test:ui": "vitest run --config vitest.ui.config.ts",
151
- "test:browser": "pnpm exec tsx test/playwright/scripts/run-browser-e2e.ts",
152
+ "test:browser": "pnpm run test:browser:serve-web && pnpm run test:browser:scaffolded-dev",
153
+ "test:browser:serve-web": "pnpm exec tsx test/playwright/scripts/run-browser-e2e.ts",
154
+ "test:browser:scaffolded-dev": "pnpm exec tsx test/playwright/scripts/run-scaffolded-dev-browser-e2e.ts",
152
155
  "test:browser:install": "playwright install chromium",
153
156
  "test:e2e": "vitest run --config vitest.e2e.config.ts",
154
157
  "coverage": "pnpm -w run coverage",
@@ -0,0 +1,46 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { defineConfig, devices } from "@playwright/test";
4
+
5
+ const hostPackageRoot = path.dirname(fileURLToPath(import.meta.url));
6
+ const repoRoot = path.resolve(hostPackageRoot, "..", "..");
7
+
8
+ export default defineConfig({
9
+ timeout: 600_000,
10
+ testDir: path.join(hostPackageRoot, "test/playwright-scaffolded-dev/specs"),
11
+ outputDir: path.join(hostPackageRoot, "test-results/scaffolded-dev"),
12
+ fullyParallel: false,
13
+ workers: 1,
14
+ forbidOnly: Boolean(process.env.CI),
15
+ retries: process.env.CI ? 1 : 0,
16
+ reporter: [
17
+ ["list"],
18
+ [
19
+ "monocart-reporter",
20
+ {
21
+ name: "Codemation scaffolded dev browser",
22
+ outputFile: path.join(repoRoot, "coverage/raw/browser-scaffolded/monocart-report.html"),
23
+ coverage: {
24
+ outputDir: path.join(repoRoot, "coverage/raw/browser-scaffolded"),
25
+ lcov: true,
26
+ sourceFilter: (sourcePath: string) =>
27
+ sourcePath.includes("packages/create-codemation/src") ||
28
+ sourcePath.includes("packages/cli/src") ||
29
+ sourcePath.includes("packages/host/src") ||
30
+ sourcePath.includes("packages/next-host/src"),
31
+ },
32
+ },
33
+ ],
34
+ ],
35
+ use: {
36
+ trace: "retain-on-failure",
37
+ video: "retain-on-failure",
38
+ screenshot: "only-on-failure",
39
+ },
40
+ projects: [
41
+ {
42
+ name: "chromium",
43
+ use: { ...devices["Desktop Chrome"] },
44
+ },
45
+ ],
46
+ });
@@ -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
  }>;