@codemation/host 0.7.0 → 0.8.0

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 (47) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE +37 -1
  3. package/dist/{AppConfigFactory-DnLoQ9Li.d.ts → AppConfigFactory-BT0y0LVC.d.ts} +3 -3
  4. package/dist/{AppContainerFactory-DqKYCRNP.js → AppContainerFactory-DRTjG7nG.js} +13 -5
  5. package/dist/{AppContainerFactory-DqKYCRNP.js.map → AppContainerFactory-DRTjG7nG.js.map} +1 -1
  6. package/dist/{CodemationAppContext-CKVv9W9q.d.ts → CodemationAppContext-CGFYVcSb.d.ts} +7 -1
  7. package/dist/{CodemationAuthoring.types-NGkBcmmT.js → CodemationAuthoring.types-BteaR3Dc.js} +3 -2
  8. package/dist/CodemationAuthoring.types-BteaR3Dc.js.map +1 -0
  9. package/dist/{CodemationAuthoring.types-DA3G3s6d.d.ts → CodemationAuthoring.types-DiKKogum.d.ts} +7 -2
  10. package/dist/{CodemationConfigNormalizer-BAKjetJ6.d.ts → CodemationConfigNormalizer-48f-T66P.d.ts} +2 -2
  11. package/dist/{CodemationConsumerConfigLoader-GYpBBvqE.js → CodemationConsumerConfigLoader-By-6tuGc.js} +3 -1
  12. package/dist/CodemationConsumerConfigLoader-By-6tuGc.js.map +1 -0
  13. package/dist/{CodemationConsumerConfigLoader-nxOqvv46.d.ts → CodemationConsumerConfigLoader-_PIYqwVx.d.ts} +3 -2
  14. package/dist/{CodemationPluginListMerger-DKLAHT2b.d.ts → CodemationPluginListMerger-DP7djJ9S.d.ts} +50 -25
  15. package/dist/{CredentialServices-Be2I60Th.d.ts → CredentialServices-BLloBztI.d.ts} +2 -2
  16. package/dist/{InternalHonoApiRouteRegistrar-Ce1yxpnO.d.ts → InternalHonoApiRouteRegistrar-c7t3KnV_.d.ts} +1 -1
  17. package/dist/{PublicFrontendBootstrapFactory-CY2FS-5g.d.ts → PublicFrontendBootstrapFactory-Dv04tJ-6.d.ts} +2 -2
  18. package/dist/authoring.d.ts +2 -2
  19. package/dist/authoring.js +1 -1
  20. package/dist/consumer.d.ts +3 -3
  21. package/dist/consumer.js +1 -1
  22. package/dist/credentials.d.ts +2 -2
  23. package/dist/index.d.ts +44 -13
  24. package/dist/index.js +100 -7
  25. package/dist/index.js.map +1 -0
  26. package/dist/nextServer.d.ts +7 -33
  27. package/dist/nextServer.js +1 -1
  28. package/dist/pairing.d.ts +1 -1
  29. package/dist/{persistenceServer-CeTHtC6E.d.ts → persistenceServer-B71RGvSj.d.ts} +3 -3
  30. package/dist/persistenceServer.d.ts +4 -4
  31. package/dist/{server-C4bS62rg.d.ts → server-09PKasWR.d.ts} +5 -5
  32. package/dist/{server-Y7kxwtCK.js → server-vtRCPgRJ.js} +3 -3
  33. package/dist/{server-Y7kxwtCK.js.map → server-vtRCPgRJ.js.map} +1 -1
  34. package/dist/server.d.ts +7 -7
  35. package/dist/server.js +3 -3
  36. package/package.json +26 -24
  37. package/src/bootstrap/AppContainerFactory.ts +21 -3
  38. package/src/bootstrap/runtime/HeadlessApiRuntime.ts +47 -0
  39. package/src/credentials/ControlPlaneCatalogFetcher.ts +6 -6
  40. package/src/index.ts +3 -0
  41. package/src/presentation/config/CodemationAuthoring.types.ts +7 -1
  42. package/src/presentation/config/CodemationConfig.ts +6 -0
  43. package/src/presentation/http/HeadlessHttpServerFactory.ts +56 -0
  44. package/src/presentation/server/CodemationConsumerConfigLoader.ts +7 -2
  45. package/src/presentation/websocket/WorkflowWebsocketServerFactory.ts +16 -0
  46. package/dist/CodemationAuthoring.types-NGkBcmmT.js.map +0 -1
  47. package/dist/CodemationConsumerConfigLoader-GYpBBvqE.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,20 +1,113 @@
1
- import { n as definePlugin, t as defineCodemationApp } from "./CodemationAuthoring.types-NGkBcmmT.js";
2
- import "./LogLevelPolicyFactory-DCUzIN6G.js";
1
+ import { n as definePlugin, t as defineCodemationApp } from "./CodemationAuthoring.types-BteaR3Dc.js";
2
+ import { n as logLevelPolicyFactory } from "./LogLevelPolicyFactory-DCUzIN6G.js";
3
3
  import { t as ApiPaths } from "./ApiPaths-Dv1dcHu_.js";
4
4
  import { i as CodemationFrontendAuthSnapshotJsonCodec, n as InternalAuthBootstrapJsonCodec, r as FrontendAppConfigJsonCodec, t as PublicFrontendBootstrapJsonCodec } from "./PublicFrontendBootstrapJsonCodec-CegIF_ne.js";
5
- import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-GYpBBvqE.js";
6
- import { o as BootTimer } from "./ServerLoggerFactory-Ckk52S3w.js";
5
+ import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-By-6tuGc.js";
6
+ import { o as BootTimer, t as ServerLoggerFactory } from "./ServerLoggerFactory-Ckk52S3w.js";
7
7
  import "./decorateParam-BWxkAUSj.js";
8
8
  import "./decorate-CXWmflG_.js";
9
9
  import { f as ApplicationRequestError, m as ApplicationTokens } from "./CredentialServices-Dk8yypeL.js";
10
10
  import "./CodemationTsyringeTypeInfoRegistrar-Bj6FJYFz.js";
11
- import { D as FrontendAppConfigFactory, E as InternalAuthBootstrapFactory, F as StartWorkflowRunCommand, I as UpsertLocalBootstrapUserCommand, L as ListUserAccountsQuery, N as GetRunStateQuery, O as CodemationFrontendAuthSnapshotFactory, T as PublicFrontendBootstrapFactory, a as GetCollectionQuery, c as InsertCollectionRowCommand, d as FrontendRuntime, f as CollectionSchemaSyncerHolder, i as GetCollectionRowQuery, l as DeleteCollectionRowCommand, m as AppContainerLifecycle, n as ListCollectionsQuery, o as UpdateCollectionRowCommand, p as DatabaseMigrations, r as ListCollectionRowsQuery, s as SyncCollectionsCommand, t as AppContainerFactory, u as WorkerRuntime } from "./AppContainerFactory-DqKYCRNP.js";
11
+ import { C as CodemationHonoApiApp, D as FrontendAppConfigFactory, E as InternalAuthBootstrapFactory, F as StartWorkflowRunCommand, I as UpsertLocalBootstrapUserCommand, L as ListUserAccountsQuery, N as GetRunStateQuery, O as CodemationFrontendAuthSnapshotFactory, T as PublicFrontendBootstrapFactory, a as GetCollectionQuery, c as InsertCollectionRowCommand, d as FrontendRuntime, f as CollectionSchemaSyncerHolder, i as GetCollectionRowQuery, k as WorkflowWebsocketServer, l as DeleteCollectionRowCommand, m as AppContainerLifecycle, n as ListCollectionsQuery, o as UpdateCollectionRowCommand, p as DatabaseMigrations, r as ListCollectionRowsQuery, s as SyncCollectionsCommand, t as AppContainerFactory, u as WorkerRuntime } from "./AppContainerFactory-DRTjG7nG.js";
12
12
  import "./WorkflowPolicyUiPresentationFactory-Bb-ae_Zh.js";
13
13
  import "./InternalPingRegistrar-DY3kSfxP.js";
14
14
  import { r as CodemationPluginPackageMetadata, t as AppConfigFactory } from "./AppConfigFactory-Cx4qQvRk.js";
15
15
  import { n as CodemationBootstrapRequest, t as CodemationPluginListMerger } from "./CodemationPluginListMerger-D1B1IEbt.js";
16
16
  import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-C-hH4z6l.js";
17
- import { r as CodemationServerGateway } from "./server-Y7kxwtCK.js";
17
+ import { r as CodemationServerGateway } from "./server-vtRCPgRJ.js";
18
18
  import { workflow } from "@codemation/core-nodes";
19
+ import { createServer } from "node:http";
19
20
 
20
- export { ApiPaths, AppConfigFactory, AppContainerFactory, AppContainerLifecycle, ApplicationRequestError, ApplicationTokens, BootTimer, CodemationBootstrapRequest, CodemationConsumerConfigLoader, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginListMerger, CodemationPluginPackageMetadata, CodemationPostgresPrismaClientFactory, CodemationServerGateway, CollectionSchemaSyncerHolder, DatabaseMigrations, DeleteCollectionRowCommand, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, FrontendRuntime, GetCollectionQuery, GetCollectionRowQuery, GetRunStateQuery, InsertCollectionRowCommand, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, ListCollectionRowsQuery, ListCollectionsQuery, ListUserAccountsQuery, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, StartWorkflowRunCommand, SyncCollectionsCommand, UpdateCollectionRowCommand, UpsertLocalBootstrapUserCommand, WorkerRuntime, defineCodemationApp, definePlugin, workflow };
21
+ //#region src/bootstrap/runtime/HeadlessApiRuntime.ts
22
+ /**
23
+ * Boots the Codemation API + WebSocket servers without the Next.js UI process.
24
+ * Used by `codemation serve web --headless` for workspace pod containers where the
25
+ * UI is served externally (e.g. from the control-plane's customer-ui).
26
+ */
27
+ var HeadlessApiRuntime = class {
28
+ constructor(appContainerFactory, websocketServerFactory, httpServerFactory, logger) {
29
+ this.appContainerFactory = appContainerFactory;
30
+ this.websocketServerFactory = websocketServerFactory;
31
+ this.httpServerFactory = httpServerFactory;
32
+ this.logger = logger;
33
+ }
34
+ async start(appConfig) {
35
+ const port = Number(appConfig.env.PORT ?? 4001);
36
+ this.logger.info(`Starting codemation headless API runtime`);
37
+ this.logger.info(`HTTP port: ${port}, WS port: ${appConfig.webSocketPort}`);
38
+ const websocketServer = this.websocketServerFactory.create(appConfig);
39
+ const container = await this.appContainerFactory.create({
40
+ appConfig,
41
+ sharedWorkflowWebsocketServer: websocketServer
42
+ });
43
+ await container.resolve(FrontendRuntime).start();
44
+ const honoApp = container.resolve(CodemationHonoApiApp);
45
+ const httpServer = this.httpServerFactory.create(honoApp, port, this.logger);
46
+ await new Promise((resolve) => {
47
+ httpServer.listen(port, () => {
48
+ this.logger.info(`codemation headless API listening on port ${port}`);
49
+ resolve();
50
+ });
51
+ });
52
+ }
53
+ };
54
+
55
+ //#endregion
56
+ //#region src/presentation/websocket/WorkflowWebsocketServerFactory.ts
57
+ const loggerFactory = new ServerLoggerFactory(logLevelPolicyFactory);
58
+ var WorkflowWebsocketServerFactory = class {
59
+ create(appConfig) {
60
+ return new WorkflowWebsocketServer(appConfig.webSocketPort, appConfig.webSocketBindHost, loggerFactory.create("codemation-websocket.server"));
61
+ }
62
+ };
63
+
64
+ //#endregion
65
+ //#region src/presentation/http/HeadlessHttpServerFactory.ts
66
+ /**
67
+ * Creates a Node.js http.Server that bridges IncomingMessage to Hono's Fetch API.
68
+ * Used by {@link import("../../bootstrap/runtime/HeadlessApiRuntime").HeadlessApiRuntime}
69
+ * to serve the Hono API without Next.js.
70
+ */
71
+ var HeadlessHttpServerFactory = class {
72
+ create(honoApp, port, logger) {
73
+ return createServer((req, res) => {
74
+ const url = new URL(req.url ?? "/", `http://${req.headers.host ?? `127.0.0.1:${port}`}`);
75
+ const headers = new Headers();
76
+ for (const [key, value] of Object.entries(req.headers)) {
77
+ if (value === void 0) continue;
78
+ if (Array.isArray(value)) for (const v of value) headers.append(key, v);
79
+ else headers.set(key, value);
80
+ }
81
+ const chunks = [];
82
+ req.on("data", (chunk) => chunks.push(chunk));
83
+ req.on("end", () => {
84
+ const body = chunks.length > 0 ? Buffer.concat(chunks) : null;
85
+ const fetchRequest = new Request(url, {
86
+ method: req.method ?? "GET",
87
+ headers,
88
+ body: body?.byteLength ? body : void 0,
89
+ duplex: "half"
90
+ });
91
+ Promise.resolve(honoApp.fetch(fetchRequest)).then(async (fetchResponse) => {
92
+ const responseHeaders = {};
93
+ fetchResponse.headers.forEach((value, key) => {
94
+ responseHeaders[key] = value;
95
+ });
96
+ res.writeHead(fetchResponse.status, responseHeaders);
97
+ const responseBody = await fetchResponse.arrayBuffer();
98
+ res.end(Buffer.from(responseBody));
99
+ }).catch((err) => {
100
+ logger.error("Unhandled request error", err instanceof Error ? err : new Error(String(err)));
101
+ if (!res.headersSent) {
102
+ res.writeHead(500);
103
+ res.end("Internal server error");
104
+ }
105
+ });
106
+ });
107
+ });
108
+ }
109
+ };
110
+
111
+ //#endregion
112
+ export { ApiPaths, AppConfigFactory, AppContainerFactory, AppContainerLifecycle, ApplicationRequestError, ApplicationTokens, BootTimer, CodemationBootstrapRequest, CodemationConsumerConfigLoader, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginListMerger, CodemationPluginPackageMetadata, CodemationPostgresPrismaClientFactory, CodemationServerGateway, CollectionSchemaSyncerHolder, DatabaseMigrations, DeleteCollectionRowCommand, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, FrontendRuntime, GetCollectionQuery, GetCollectionRowQuery, GetRunStateQuery, HeadlessApiRuntime, HeadlessHttpServerFactory, InsertCollectionRowCommand, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, ListCollectionRowsQuery, ListCollectionsQuery, ListUserAccountsQuery, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, StartWorkflowRunCommand, SyncCollectionsCommand, UpdateCollectionRowCommand, UpsertLocalBootstrapUserCommand, WorkerRuntime, WorkflowWebsocketServerFactory, defineCodemationApp, definePlugin, workflow };
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["appContainerFactory: AppContainerFactory","websocketServerFactory: WorkflowWebsocketServerFactory","httpServerFactory: HeadlessHttpServerFactory","logger: Logger","chunks: Buffer[]","responseHeaders: Record<string, string>"],"sources":["../src/bootstrap/runtime/HeadlessApiRuntime.ts","../src/presentation/websocket/WorkflowWebsocketServerFactory.ts","../src/presentation/http/HeadlessHttpServerFactory.ts"],"sourcesContent":["import type { AppConfig } from \"../../presentation/config/AppConfig\";\nimport type { AppContainerFactory } from \"../AppContainerFactory\";\nimport { FrontendRuntime } from \"./FrontendRuntime\";\nimport { CodemationHonoApiApp } from \"../../presentation/http/hono/CodemationHonoApiAppFactory\";\nimport type { WorkflowWebsocketServerFactory } from \"../../presentation/websocket/WorkflowWebsocketServerFactory\";\nimport type { HeadlessHttpServerFactory } from \"../../presentation/http/HeadlessHttpServerFactory\";\nimport type { Logger } from \"../../application/logging/Logger\";\n\n/**\n * Boots the Codemation API + WebSocket servers without the Next.js UI process.\n * Used by `codemation serve web --headless` for workspace pod containers where the\n * UI is served externally (e.g. from the control-plane's customer-ui).\n */\nexport class HeadlessApiRuntime {\n constructor(\n private readonly appContainerFactory: AppContainerFactory,\n private readonly websocketServerFactory: WorkflowWebsocketServerFactory,\n private readonly httpServerFactory: HeadlessHttpServerFactory,\n private readonly logger: Logger,\n ) {}\n\n async start(appConfig: AppConfig): Promise<void> {\n const port = Number(appConfig.env.PORT ?? 4001);\n\n this.logger.info(`Starting codemation headless API runtime`);\n this.logger.info(`HTTP port: ${port}, WS port: ${appConfig.webSocketPort}`);\n\n const websocketServer = this.websocketServerFactory.create(appConfig);\n\n const container = await this.appContainerFactory.create({\n appConfig,\n sharedWorkflowWebsocketServer: websocketServer,\n });\n\n await container.resolve(FrontendRuntime).start();\n\n const honoApp = container.resolve(CodemationHonoApiApp);\n const httpServer = this.httpServerFactory.create(honoApp, port, this.logger);\n\n await new Promise<void>((resolve) => {\n httpServer.listen(port, () => {\n this.logger.info(`codemation headless API listening on port ${port}`);\n resolve();\n });\n });\n }\n}\n","import type { AppConfig } from \"../config/AppConfig\";\nimport { WorkflowWebsocketServer } from \"./WorkflowWebsocketServer\";\nimport { logLevelPolicyFactory } from \"../../infrastructure/logging/LogLevelPolicyFactory\";\nimport { ServerLoggerFactory } from \"../../infrastructure/logging/ServerLoggerFactory\";\n\nconst loggerFactory = new ServerLoggerFactory(logLevelPolicyFactory);\n\nexport class WorkflowWebsocketServerFactory {\n create(appConfig: AppConfig): WorkflowWebsocketServer {\n return new WorkflowWebsocketServer(\n appConfig.webSocketPort,\n appConfig.webSocketBindHost,\n loggerFactory.create(\"codemation-websocket.server\"),\n );\n }\n}\n","import { createServer, type Server } from \"node:http\";\nimport type { Logger } from \"../../application/logging/Logger\";\nimport type { CodemationHonoApiApp } from \"./hono/CodemationHonoApiAppFactory\";\n\n/**\n * Creates a Node.js http.Server that bridges IncomingMessage to Hono's Fetch API.\n * Used by {@link import(\"../../bootstrap/runtime/HeadlessApiRuntime\").HeadlessApiRuntime}\n * to serve the Hono API without Next.js.\n */\nexport class HeadlessHttpServerFactory {\n create(honoApp: CodemationHonoApiApp, port: number, logger: Logger): Server {\n return createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? `127.0.0.1:${port}`}`);\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n // eslint-disable-next-line codemation/no-buffer-everything -- node:http bridge; no streaming alternative when adapting IncomingMessage to Fetch API Request\n const body = chunks.length > 0 ? Buffer.concat(chunks) : null;\n const fetchRequest = new Request(url, {\n method: req.method ?? \"GET\",\n headers,\n body: body?.byteLength ? body : undefined,\n // @ts-expect-error — Node's Request needs duplex for streaming; required in some runtimes\n duplex: \"half\",\n });\n Promise.resolve(honoApp.fetch(fetchRequest))\n .then(async (fetchResponse: Response) => {\n const responseHeaders: Record<string, string> = {};\n fetchResponse.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n res.writeHead(fetchResponse.status, responseHeaders);\n // eslint-disable-next-line codemation/no-buffer-everything -- node:http bridge; Hono Fetch Response must be fully buffered to write to ServerResponse\n const responseBody = await fetchResponse.arrayBuffer();\n res.end(Buffer.from(responseBody));\n })\n .catch((err: unknown) => {\n logger.error(\"Unhandled request error\", err instanceof Error ? err : new Error(String(err)));\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal server error\");\n }\n });\n });\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAa,qBAAb,MAAgC;CAC9B,YACE,AAAiBA,qBACjB,AAAiBC,wBACjB,AAAiBC,mBACjB,AAAiBC,QACjB;EAJiB;EACA;EACA;EACA;;CAGnB,MAAM,MAAM,WAAqC;EAC/C,MAAM,OAAO,OAAO,UAAU,IAAI,QAAQ,KAAK;AAE/C,OAAK,OAAO,KAAK,2CAA2C;AAC5D,OAAK,OAAO,KAAK,cAAc,KAAK,aAAa,UAAU,gBAAgB;EAE3E,MAAM,kBAAkB,KAAK,uBAAuB,OAAO,UAAU;EAErE,MAAM,YAAY,MAAM,KAAK,oBAAoB,OAAO;GACtD;GACA,+BAA+B;GAChC,CAAC;AAEF,QAAM,UAAU,QAAQ,gBAAgB,CAAC,OAAO;EAEhD,MAAM,UAAU,UAAU,QAAQ,qBAAqB;EACvD,MAAM,aAAa,KAAK,kBAAkB,OAAO,SAAS,MAAM,KAAK,OAAO;AAE5E,QAAM,IAAI,SAAe,YAAY;AACnC,cAAW,OAAO,YAAY;AAC5B,SAAK,OAAO,KAAK,6CAA6C,OAAO;AACrE,aAAS;KACT;IACF;;;;;;ACvCN,MAAM,gBAAgB,IAAI,oBAAoB,sBAAsB;AAEpE,IAAa,iCAAb,MAA4C;CAC1C,OAAO,WAA+C;AACpD,SAAO,IAAI,wBACT,UAAU,eACV,UAAU,mBACV,cAAc,OAAO,8BAA8B,CACpD;;;;;;;;;;;ACJL,IAAa,4BAAb,MAAuC;CACrC,OAAO,SAA+B,MAAc,QAAwB;AAC1E,SAAO,cAAc,KAAK,QAAQ;GAChC,MAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,QAAQ,aAAa,SAAS;GACxF,MAAM,UAAU,IAAI,SAAS;AAC7B,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,QAAQ,EAAE;AACtD,QAAI,UAAU,OAAW;AACzB,QAAI,MAAM,QAAQ,MAAM,CACtB,MAAK,MAAM,KAAK,MAAO,SAAQ,OAAO,KAAK,EAAE;QAE7C,SAAQ,IAAI,KAAK,MAAM;;GAG3B,MAAMC,SAAmB,EAAE;AAC3B,OAAI,GAAG,SAAS,UAAkB,OAAO,KAAK,MAAM,CAAC;AACrD,OAAI,GAAG,aAAa;IAElB,MAAM,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,OAAO,GAAG;IACzD,MAAM,eAAe,IAAI,QAAQ,KAAK;KACpC,QAAQ,IAAI,UAAU;KACtB;KACA,MAAM,MAAM,aAAa,OAAO;KAEhC,QAAQ;KACT,CAAC;AACF,YAAQ,QAAQ,QAAQ,MAAM,aAAa,CAAC,CACzC,KAAK,OAAO,kBAA4B;KACvC,MAAMC,kBAA0C,EAAE;AAClD,mBAAc,QAAQ,SAAS,OAAO,QAAQ;AAC5C,sBAAgB,OAAO;OACvB;AACF,SAAI,UAAU,cAAc,QAAQ,gBAAgB;KAEpD,MAAM,eAAe,MAAM,cAAc,aAAa;AACtD,SAAI,IAAI,OAAO,KAAK,aAAa,CAAC;MAClC,CACD,OAAO,QAAiB;AACvB,YAAO,MAAM,2BAA2B,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;AAC5F,SAAI,CAAC,IAAI,aAAa;AACpB,UAAI,UAAU,IAAI;AAClB,UAAI,IAAI,wBAAwB;;MAElC;KACJ;IACF"}
@@ -1,21 +1,20 @@
1
1
  import { n as RunIntentService, t as OAuthFlowExecutor } from "./index-DilAYwnH.js";
2
2
  import { D as WebhookInvocationMatch, F as ActivationIdFactory, I as BinaryAttachment, L as Item, X as WorkflowDefinition, o as BinaryStorage, q as RunIdFactory, w as WorkflowActivationPolicy } from "./ItemsInputNormalizer-_RwIfRIQ.js";
3
- import { r as AppConfig } from "./CodemationAppContext-CKVv9W9q.js";
3
+ import { r as AppConfig } from "./CodemationAppContext-CGFYVcSb.js";
4
4
  import { l as Logger, u as LoggerFactory } from "./CodemationWhitelabelConfig-Ca2mCUeC.js";
5
5
  import { n as logLevelPolicyFactory, t as LogLevelPolicyFactory } from "./LogLevelPolicyFactory-ewCHLDLn.js";
6
6
  import { a as CodemationFrontendAuthSnapshot, i as CodemationFrontendAuthProviderSnapshot, n as InternalAuthBootstrap, r as FrontendAppConfig, t as PublicFrontendBootstrap } from "./PublicFrontendBootstrap-Cev3qK46.js";
7
- import "./CodemationConfigNormalizer-BAKjetJ6.js";
8
- import { a as CredentialSecretCipher, i as CredentialInstanceService, o as McpServerCatalog, r as CredentialBindingService, t as CredentialStore } from "./CredentialServices-Be2I60Th.js";
7
+ import "./CodemationConfigNormalizer-48f-T66P.js";
8
+ import { a as CredentialSecretCipher, i as CredentialInstanceService, o as McpServerCatalog, r as CredentialBindingService, t as CredentialStore } from "./CredentialServices-BLloBztI.js";
9
9
  import "./CredentialContractsRegistry-Bq2bq28t.js";
10
10
  import "./TelemetryContracts-BtDx84Cp.js";
11
11
  import { i as WorkflowSummary, t as WorkflowDto } from "./WorkflowViewContracts-B7aFQcIw.js";
12
- import { _ as AppContainerFactory, a as HonoApiRouteRegistrar, c as WorkerRuntime, d as ServerLoggerFactory, f as LogFilter, g as AppContainerLifecycle, h as DatabaseMigrations, i as ManagedCorsMiddleware, l as FrontendRuntime, n as CodemationBootstrapRequest, o as WorkflowDebuggerOverlayRepository, p as WorkflowRunRepository, r as ApplicationTokens, s as SessionVerifier, t as CodemationPluginListMerger, u as WorkflowRunRetentionPruneScheduler, v as WorkflowWebsocketServer, x as CommandBus, y as QueryBus } from "./CodemationPluginListMerger-DKLAHT2b.js";
13
- import { t as AppConfigFactory } from "./AppConfigFactory-DnLoQ9Li.js";
14
- import { n as InternalAuthBootstrapFactory, r as FrontendAppConfigFactory, t as PublicFrontendBootstrapFactory } from "./PublicFrontendBootstrapFactory-CY2FS-5g.js";
15
- import { t as InternalHonoApiRouteRegistrar } from "./InternalHonoApiRouteRegistrar-Ce1yxpnO.js";
12
+ import { S as CommandBus, _ as AppContainerLifecycle, a as CodemationHonoApiApp, b as QueryBus, c as SessionVerifier, d as WorkflowRunRetentionPruneScheduler, f as ServerLoggerFactory, g as DatabaseMigrations, i as WorkflowDebuggerOverlayRepository, l as WorkerRuntime, m as WorkflowRunRepository, n as CodemationBootstrapRequest, o as BinaryHttpRouteHandler, p as LogFilter, r as ApplicationTokens, s as ServerHttpRouteParams, t as CodemationPluginListMerger, u as FrontendRuntime, v as AppContainerFactory, y as WorkflowWebsocketServer } from "./CodemationPluginListMerger-DP7djJ9S.js";
13
+ import { t as AppConfigFactory } from "./AppConfigFactory-BT0y0LVC.js";
14
+ import "./InternalHonoApiRouteRegistrar-c7t3KnV_.js";
15
+ import { n as InternalAuthBootstrapFactory, r as FrontendAppConfigFactory, t as PublicFrontendBootstrapFactory } from "./PublicFrontendBootstrapFactory-Dv04tJ-6.js";
16
16
  import { t as WorkflowPolicyUiPresentationFactory } from "./WorkflowPolicyUiPresentationFactory-6MyjCvBO.js";
17
17
  import { t as PairingConfig } from "./pairing.types-snfZ_OzB.js";
18
- import { Hono } from "hono";
19
18
 
20
19
  //#region src/application/dev/DevBootstrapSummaryJson.types.d.ts
21
20
  type DevBootstrapSummaryJson = Readonly<{
@@ -132,31 +131,6 @@ declare class RequestToWebhookItemMapper {
132
131
  private toQuery;
133
132
  }
134
133
  //#endregion
135
- //#region src/presentation/http/ServerHttpRouteParams.d.ts
136
- type ServerHttpRouteParams = Readonly<Record<string, string>>;
137
- //#endregion
138
- //#region src/presentation/http/routeHandlers/BinaryHttpRouteHandlerFactory.d.ts
139
- declare class BinaryHttpRouteHandler {
140
- private readonly queryBus;
141
- private readonly commandBus;
142
- private readonly binaryStorage;
143
- constructor(queryBus: QueryBus, commandBus: CommandBus, binaryStorage: BinaryStorage);
144
- getRunBinaryContent(_: Request, params: ServerHttpRouteParams): Promise<Response>;
145
- getWorkflowOverlayBinaryContent(_: Request, params: ServerHttpRouteParams): Promise<Response>;
146
- postWorkflowDebuggerOverlayBinaryUpload(request: Request, params: ServerHttpRouteParams): Promise<Response>;
147
- private createBinaryResponse;
148
- private createContentDisposition;
149
- private escapeFilename;
150
- }
151
- //#endregion
152
- //#region src/presentation/http/hono/CodemationHonoApiAppFactory.d.ts
153
- declare class CodemationHonoApiApp {
154
- private readonly app;
155
- constructor(sessionVerifier: SessionVerifier, registrars: ReadonlyArray<HonoApiRouteRegistrar>, binaryHttpRouteHandler: BinaryHttpRouteHandler, internalRegistrars: ReadonlyArray<InternalHonoApiRouteRegistrar>, corsMiddlewareList: ReadonlyArray<ManagedCorsMiddleware>);
156
- getHono(): Hono;
157
- fetch(request: Request): Response | Promise<Response>;
158
- }
159
- //#endregion
160
134
  //#region src/presentation/http/routeHandlers/CredentialHttpRouteHandler.d.ts
161
135
  declare class CredentialHttpRouteHandler {
162
136
  private readonly queryBus;
@@ -5,7 +5,7 @@ import "./decorateParam-BWxkAUSj.js";
5
5
  import "./decorate-CXWmflG_.js";
6
6
  import { a as CredentialInstanceService, i as CredentialBindingService, m as ApplicationTokens } from "./CredentialServices-Dk8yypeL.js";
7
7
  import "./CodemationTsyringeTypeInfoRegistrar-Bj6FJYFz.js";
8
- import { A as WorkflowDefinitionMapper, C as CodemationHonoApiApp, D as FrontendAppConfigFactory, E as InternalAuthBootstrapFactory, P as RunBinaryAttachmentLookupService, S as CredentialHttpRouteHandler, T as PublicFrontendBootstrapFactory, _ as WorkflowHttpRouteHandler, b as RunHttpRouteHandler, d as FrontendRuntime, h as WorkflowRunRetentionPruneScheduler, k as WorkflowWebsocketServer, m as AppContainerLifecycle, p as DatabaseMigrations, t as AppContainerFactory, u as WorkerRuntime, v as WebhookHttpRouteHandler, w as BinaryHttpRouteHandler, x as OAuth2HttpRouteHandler, y as RequestToWebhookItemMapper } from "./AppContainerFactory-DqKYCRNP.js";
8
+ import { A as WorkflowDefinitionMapper, C as CodemationHonoApiApp, D as FrontendAppConfigFactory, E as InternalAuthBootstrapFactory, P as RunBinaryAttachmentLookupService, S as CredentialHttpRouteHandler, T as PublicFrontendBootstrapFactory, _ as WorkflowHttpRouteHandler, b as RunHttpRouteHandler, d as FrontendRuntime, h as WorkflowRunRetentionPruneScheduler, k as WorkflowWebsocketServer, m as AppContainerLifecycle, p as DatabaseMigrations, t as AppContainerFactory, u as WorkerRuntime, v as WebhookHttpRouteHandler, w as BinaryHttpRouteHandler, x as OAuth2HttpRouteHandler, y as RequestToWebhookItemMapper } from "./AppContainerFactory-DRTjG7nG.js";
9
9
  import { t as WorkflowPolicyUiPresentationFactory } from "./WorkflowPolicyUiPresentationFactory-Bb-ae_Zh.js";
10
10
  import "./InternalPingRegistrar-DY3kSfxP.js";
11
11
  import { t as AppConfigFactory } from "./AppConfigFactory-Cx4qQvRk.js";
package/dist/pairing.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./index-DilAYwnH.js";
2
2
  import { g as TypeToken } from "./ItemsInputNormalizer-_RwIfRIQ.js";
3
- import { t as InternalHonoApiRouteRegistrar } from "./InternalHonoApiRouteRegistrar-Ce1yxpnO.js";
3
+ import { t as InternalHonoApiRouteRegistrar } from "./InternalHonoApiRouteRegistrar-c7t3KnV_.js";
4
4
  import { i as PairingVerificationSuccess, n as PairingVerificationFailure, r as PairingVerificationResult, t as PairingConfig } from "./pairing.types-snfZ_OzB.js";
5
5
  import { Hono, MiddlewareHandler } from "hono";
6
6
 
@@ -1,5 +1,5 @@
1
- import { i as AppPersistenceConfig } from "./CodemationAppContext-CKVv9W9q.js";
2
- import { i as PrismaClient } from "./AppConfigFactory-DnLoQ9Li.js";
1
+ import { i as AppPersistenceConfig } from "./CodemationAppContext-CGFYVcSb.js";
2
+ import { i as PrismaClient } from "./AppConfigFactory-BT0y0LVC.js";
3
3
 
4
4
  //#region src/infrastructure/persistence/CodemationPostgresPrismaClientFactory.d.ts
5
5
  declare class CodemationPostgresPrismaClientFactory {
@@ -27,4 +27,4 @@ declare class CodemationDatabaseUrlParser {
27
27
  }
28
28
  //#endregion
29
29
  export { CodemationPostgresPrismaClientFactory as n, CodemationDatabaseUrlParser as t };
30
- //# sourceMappingURL=persistenceServer-CeTHtC6E.d.ts.map
30
+ //# sourceMappingURL=persistenceServer-B71RGvSj.d.ts.map
@@ -1,8 +1,8 @@
1
1
  import "./index-DilAYwnH.js";
2
2
  import "./ItemsInputNormalizer-_RwIfRIQ.js";
3
- import { i as AppPersistenceConfig } from "./CodemationAppContext-CKVv9W9q.js";
3
+ import { i as AppPersistenceConfig } from "./CodemationAppContext-CGFYVcSb.js";
4
4
  import "./CodemationWhitelabelConfig-Ca2mCUeC.js";
5
- import "./CodemationConfigNormalizer-BAKjetJ6.js";
6
- import { n as PrismaMigrationDeployer, r as PrismaDatabaseClient, t as AppConfigFactory } from "./AppConfigFactory-DnLoQ9Li.js";
7
- import { n as CodemationPostgresPrismaClientFactory, t as CodemationDatabaseUrlParser } from "./persistenceServer-CeTHtC6E.js";
5
+ import "./CodemationConfigNormalizer-48f-T66P.js";
6
+ import { n as PrismaMigrationDeployer, r as PrismaDatabaseClient, t as AppConfigFactory } from "./AppConfigFactory-BT0y0LVC.js";
7
+ import { n as CodemationPostgresPrismaClientFactory, t as CodemationDatabaseUrlParser } from "./persistenceServer-B71RGvSj.js";
8
8
  export { AppConfigFactory, AppPersistenceConfig, CodemationDatabaseUrlParser, CodemationPostgresPrismaClientFactory, PrismaDatabaseClient as PrismaClient, PrismaMigrationDeployer };
@@ -1,8 +1,8 @@
1
- import { m as CodemationConfig, o as CodemationPlugin, r as AppConfig } from "./CodemationAppContext-CKVv9W9q.js";
2
- import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-nxOqvv46.js";
1
+ import { m as CodemationConfig, o as CodemationPlugin, r as AppConfig } from "./CodemationAppContext-CGFYVcSb.js";
2
+ import { t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-_PIYqwVx.js";
3
3
  import { i as WorkflowSummary, t as WorkflowDto } from "./WorkflowViewContracts-B7aFQcIw.js";
4
- import { t as AppConfigFactory } from "./AppConfigFactory-DnLoQ9Li.js";
5
- import { a as ProcessRunOptions, o as ProcessRunResult, s as ProcessRunner } from "./PublicFrontendBootstrapFactory-CY2FS-5g.js";
4
+ import { t as AppConfigFactory } from "./AppConfigFactory-BT0y0LVC.js";
5
+ import { a as ProcessRunOptions, o as ProcessRunResult, s as ProcessRunner } from "./PublicFrontendBootstrapFactory-Dv04tJ-6.js";
6
6
  import { ChildProcess } from "node:child_process";
7
7
 
8
8
  //#region src/process/ExecaProcessRunner.d.ts
@@ -104,4 +104,4 @@ declare class WorkflowDiscoveryPathSegmentsComputer {
104
104
  }
105
105
  //#endregion
106
106
  export { CodemationResolvedPluginPackage as a, CodemationServerGateway as c, CodemationPluginDiscovery as i, ExecaProcessRunner as l, WorkflowModulePathFinder as n, AppConfigLoadResult as o, CodemationDiscoveredPluginPackage as r, AppConfigLoader as s, WorkflowDiscoveryPathSegmentsComputer as t };
107
- //# sourceMappingURL=server-C4bS62rg.d.ts.map
107
+ //# sourceMappingURL=server-09PKasWR.d.ts.map
@@ -1,6 +1,6 @@
1
- import { a as CodemationConfigNormalizer, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-GYpBBvqE.js";
1
+ import { a as CodemationConfigNormalizer, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-By-6tuGc.js";
2
2
  import { m as ApplicationTokens } from "./CredentialServices-Dk8yypeL.js";
3
- import { A as WorkflowDefinitionMapper, C as CodemationHonoApiApp, M as GetWorkflowDetailQuery, d as FrontendRuntime, j as GetWorkflowSummariesQuery, m as AppContainerLifecycle, t as AppContainerFactory } from "./AppContainerFactory-DqKYCRNP.js";
3
+ import { A as WorkflowDefinitionMapper, C as CodemationHonoApiApp, M as GetWorkflowDetailQuery, d as FrontendRuntime, j as GetWorkflowSummariesQuery, m as AppContainerLifecycle, t as AppContainerFactory } from "./AppContainerFactory-DRTjG7nG.js";
4
4
  import { r as CodemationPluginPackageMetadata, t as AppConfigFactory } from "./AppConfigFactory-Cx4qQvRk.js";
5
5
  import { readFile, readdir } from "node:fs/promises";
6
6
  import path from "node:path";
@@ -219,4 +219,4 @@ var CodemationPluginDiscovery = class {
219
219
 
220
220
  //#endregion
221
221
  export { AppConfigLoader as n, CodemationServerGateway as r, CodemationPluginDiscovery as t };
222
- //# sourceMappingURL=server-Y7kxwtCK.js.map
222
+ //# sourceMappingURL=server-vtRCPgRJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-Y7kxwtCK.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 mcpServers?: 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 if (pluginValue.mcpServers !== undefined && !Array.isArray(pluginValue.mcpServers)) {\n return false;\n }\n return (\n pluginValue.register !== undefined ||\n pluginValue.credentialTypes !== undefined ||\n pluginValue.mcpServers !== undefined ||\n pluginValue.sandbox !== undefined ||\n Object.keys(pluginValue).length === 0\n );\n }\n\n private resolvePluginEntry(discoveredPackage: CodemationDiscoveredPluginPackage): string {\n const preferSource =\n process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === \"true\" &&\n typeof discoveredPackage.developmentEntry === \"string\" &&\n discoveredPackage.developmentEntry.trim().length > 0;\n const selectedEntry = preferSource ? discoveredPackage.developmentEntry : discoveredPackage.pluginEntry;\n return selectedEntry;\n }\n\n private async resolveDevelopmentPluginEntry(packageRoot: string): Promise<string | undefined> {\n const candidates = [\n path.resolve(packageRoot, \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"codemation.plugin.js\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.js\"),\n ];\n for (const candidate of candidates) {\n if (await this.exists(candidate)) {\n return path.relative(packageRoot, candidate);\n }\n }\n return undefined;\n }\n\n private async exists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath, \"utf8\");\n return true;\n } catch {\n return false;\n }\n }\n\n private resolvePluginModuleSpecifier(pluginModulePath: string): string {\n return pathToFileURL(pluginModulePath).href;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server-vtRCPgRJ.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 mcpServers?: 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 if (pluginValue.mcpServers !== undefined && !Array.isArray(pluginValue.mcpServers)) {\n return false;\n }\n return (\n pluginValue.register !== undefined ||\n pluginValue.credentialTypes !== undefined ||\n pluginValue.mcpServers !== undefined ||\n pluginValue.sandbox !== undefined ||\n Object.keys(pluginValue).length === 0\n );\n }\n\n private resolvePluginEntry(discoveredPackage: CodemationDiscoveredPluginPackage): string {\n const preferSource =\n process.env.CODEMATION_PREFER_PLUGIN_SOURCE_ENTRY === \"true\" &&\n typeof discoveredPackage.developmentEntry === \"string\" &&\n discoveredPackage.developmentEntry.trim().length > 0;\n const selectedEntry = preferSource ? discoveredPackage.developmentEntry : discoveredPackage.pluginEntry;\n return selectedEntry;\n }\n\n private async resolveDevelopmentPluginEntry(packageRoot: string): Promise<string | undefined> {\n const candidates = [\n path.resolve(packageRoot, \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"codemation.plugin.js\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.ts\"),\n path.resolve(packageRoot, \"src\", \"codemation.plugin.js\"),\n ];\n for (const candidate of candidates) {\n if (await this.exists(candidate)) {\n return path.relative(packageRoot, candidate);\n }\n }\n return undefined;\n }\n\n private async exists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath, \"utf8\");\n return true;\n } catch {\n return false;\n }\n }\n\n private resolvePluginModuleSpecifier(pluginModulePath: string): string {\n return pathToFileURL(pluginModulePath).href;\n }\n}\n"],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import "./index-DilAYwnH.js";
2
2
  import "./ItemsInputNormalizer-_RwIfRIQ.js";
3
- import "./CodemationAppContext-CKVv9W9q.js";
3
+ import "./CodemationAppContext-CGFYVcSb.js";
4
4
  import "./CodemationWhitelabelConfig-Ca2mCUeC.js";
5
5
  import { a as ApiPaths, i as CodemationFrontendAuthSnapshotJsonCodec, n as InternalAuthBootstrapJsonCodec, r as FrontendAppConfigJsonCodec, t as PublicFrontendBootstrapJsonCodec } from "./PublicFrontendBootstrapJsonCodec-CXG9Dxft.js";
6
6
  import { n as InternalAuthBootstrap, r as FrontendAppConfig, t as PublicFrontendBootstrap } from "./PublicFrontendBootstrap-Cev3qK46.js";
7
- import "./CodemationConfigNormalizer-BAKjetJ6.js";
8
- import { i as CodemationConsumerAppResolver, n as CodemationConsumerConfigResolution, r as CodemationConsumerApp, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-nxOqvv46.js";
7
+ import "./CodemationConfigNormalizer-48f-T66P.js";
8
+ import { i as CodemationConsumerAppResolver, n as CodemationConsumerConfigResolution, r as CodemationConsumerApp, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-_PIYqwVx.js";
9
9
  import "./WorkflowViewContracts-B7aFQcIw.js";
10
- import { r as PrismaDatabaseClient } from "./AppConfigFactory-DnLoQ9Li.js";
11
- import { a as ProcessRunOptions, i as CodemationFrontendAuthSnapshotFactory, n as InternalAuthBootstrapFactory, o as ProcessRunResult, r as FrontendAppConfigFactory, s as ProcessRunner, t as PublicFrontendBootstrapFactory } from "./PublicFrontendBootstrapFactory-CY2FS-5g.js";
12
- import { n as CodemationPostgresPrismaClientFactory } from "./persistenceServer-CeTHtC6E.js";
13
- import { a as CodemationResolvedPluginPackage, c as CodemationServerGateway, i as CodemationPluginDiscovery, l as ExecaProcessRunner, n as WorkflowModulePathFinder, o as AppConfigLoadResult, r as CodemationDiscoveredPluginPackage, s as AppConfigLoader, t as WorkflowDiscoveryPathSegmentsComputer } from "./server-C4bS62rg.js";
10
+ import { r as PrismaDatabaseClient } from "./AppConfigFactory-BT0y0LVC.js";
11
+ import { a as ProcessRunOptions, i as CodemationFrontendAuthSnapshotFactory, n as InternalAuthBootstrapFactory, o as ProcessRunResult, r as FrontendAppConfigFactory, s as ProcessRunner, t as PublicFrontendBootstrapFactory } from "./PublicFrontendBootstrapFactory-Dv04tJ-6.js";
12
+ import { n as CodemationPostgresPrismaClientFactory } from "./persistenceServer-B71RGvSj.js";
13
+ import { a as CodemationResolvedPluginPackage, c as CodemationServerGateway, i as CodemationPluginDiscovery, l as ExecaProcessRunner, n as WorkflowModulePathFinder, o as AppConfigLoadResult, r as CodemationDiscoveredPluginPackage, s as AppConfigLoader, t as WorkflowDiscoveryPathSegmentsComputer } from "./server-09PKasWR.js";
14
14
  export { ApiPaths, AppConfigLoadResult, AppConfigLoader, CodemationConsumerApp, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationConsumerConfigResolution, CodemationDiscoveredPluginPackage, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationResolvedPluginPackage, CodemationServerGateway, ExecaProcessRunner, FrontendAppConfig, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, InternalAuthBootstrap, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, PrismaDatabaseClient as PrismaClient, ProcessRunOptions, ProcessRunResult, ProcessRunner, PublicFrontendBootstrap, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
package/dist/server.js CHANGED
@@ -1,17 +1,17 @@
1
1
  import "./LogLevelPolicyFactory-DCUzIN6G.js";
2
2
  import { t as ApiPaths } from "./ApiPaths-Dv1dcHu_.js";
3
3
  import { i as CodemationFrontendAuthSnapshotJsonCodec, n as InternalAuthBootstrapJsonCodec, r as FrontendAppConfigJsonCodec, t as PublicFrontendBootstrapJsonCodec } from "./PublicFrontendBootstrapJsonCodec-CegIF_ne.js";
4
- import { i as CodemationConsumerAppResolver, n as WorkflowDiscoveryPathSegmentsComputer, r as WorkflowModulePathFinder, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-GYpBBvqE.js";
4
+ import { i as CodemationConsumerAppResolver, n as WorkflowDiscoveryPathSegmentsComputer, r as WorkflowModulePathFinder, t as CodemationConsumerConfigLoader } from "./CodemationConsumerConfigLoader-By-6tuGc.js";
5
5
  import "./ServerLoggerFactory-Ckk52S3w.js";
6
6
  import "./decorateParam-BWxkAUSj.js";
7
7
  import "./decorate-CXWmflG_.js";
8
8
  import "./CredentialServices-Dk8yypeL.js";
9
9
  import "./CodemationTsyringeTypeInfoRegistrar-Bj6FJYFz.js";
10
- import { D as FrontendAppConfigFactory, E as InternalAuthBootstrapFactory, O as CodemationFrontendAuthSnapshotFactory, T as PublicFrontendBootstrapFactory, g as ExecaProcessRunner } from "./AppContainerFactory-DqKYCRNP.js";
10
+ import { D as FrontendAppConfigFactory, E as InternalAuthBootstrapFactory, O as CodemationFrontendAuthSnapshotFactory, T as PublicFrontendBootstrapFactory, g as ExecaProcessRunner } from "./AppContainerFactory-DRTjG7nG.js";
11
11
  import "./WorkflowPolicyUiPresentationFactory-Bb-ae_Zh.js";
12
12
  import "./InternalPingRegistrar-DY3kSfxP.js";
13
13
  import "./AppConfigFactory-Cx4qQvRk.js";
14
14
  import { t as CodemationPostgresPrismaClientFactory } from "./persistenceServer-C-hH4z6l.js";
15
- import { n as AppConfigLoader, r as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-Y7kxwtCK.js";
15
+ import { n as AppConfigLoader, r as CodemationServerGateway, t as CodemationPluginDiscovery } from "./server-vtRCPgRJ.js";
16
16
 
17
17
  export { ApiPaths, AppConfigLoader, CodemationConsumerAppResolver, CodemationConsumerConfigLoader, CodemationFrontendAuthSnapshotFactory, CodemationFrontendAuthSnapshotJsonCodec, CodemationPluginDiscovery, CodemationPostgresPrismaClientFactory, CodemationServerGateway, ExecaProcessRunner, FrontendAppConfigFactory, FrontendAppConfigJsonCodec, InternalAuthBootstrapFactory, InternalAuthBootstrapJsonCodec, PublicFrontendBootstrapFactory, PublicFrontendBootstrapJsonCodec, WorkflowDiscoveryPathSegmentsComputer, WorkflowModulePathFinder };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemation/host",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -88,50 +88,38 @@
88
88
  "@aws-sdk/lib-storage": "^3.1049.0",
89
89
  "@better-auth/prisma-adapter": "^1.5.6",
90
90
  "@libsql/client": "^0.17.2",
91
- "@monaco-editor/react": "^4.7.0",
92
91
  "@prisma/adapter-libsql": "^7.6.0",
93
92
  "@prisma/adapter-pg": "^7.0.0",
94
93
  "@prisma/client": "^7.0.0",
95
94
  "@prisma/client-runtime-utils": "^7.5.0",
96
- "@tanstack/react-query": "^5.90.21",
97
- "@types/bcryptjs": "^3.0.0",
98
- "@uiw/react-json-view": "2.0.0-alpha.41",
99
- "@xyflow/react": "^12.10.1",
100
95
  "ai": "^6.0.168",
101
96
  "bcryptjs": "^3.0.3",
102
97
  "better-auth": "^1.5.6",
103
98
  "bullmq": "^5.58.3",
104
- "dagre": "^0.8.5",
105
- "date-fns": "^4.1.0",
106
- "execa": "^9.6.1",
107
99
  "hono": "^4.12.8",
108
100
  "jose": "^6.2.2",
109
- "lucide-react": "^0.577.0",
110
- "monaco-editor": "^0.55.1",
111
101
  "pg": "^8.16.3",
112
- "pretty-ms": "^9.3.0",
113
102
  "prisma": "^7.0.0",
114
- "rc-tree": "^5.13.1",
115
- "react": "^19.2.4",
116
- "react-dom": "^19.2.4",
117
- "react-router-dom": "^7.13.1",
118
- "react-use-websocket": "^4.13.0",
119
103
  "reflect-metadata": "^0.2.2",
120
104
  "sanitize-filename": "^1.6.4",
121
105
  "serialize-javascript": "^7.0.4",
106
+ "dotenv": "^17.3.1",
107
+ "execa": "^9.6.1",
122
108
  "tsx": "^4.21.0",
123
109
  "ws": "^8.19.0",
124
- "zxcvbn": "^4.4.2",
125
- "@codemation/core": "0.11.0",
126
- "@codemation/managed-auth": "0.1.0",
127
- "@codemation/eventbus-redis": "0.0.38",
128
- "@codemation/core-nodes": "0.8.0"
110
+ "@codemation/core-nodes": "0.8.1",
111
+ "@codemation/eventbus-redis": "0.0.39",
112
+ "@codemation/core": "0.11.1",
113
+ "@codemation/managed-auth": "0.1.0"
129
114
  },
130
115
  "devDependencies": {
116
+ "@monaco-editor/react": "^4.7.0",
131
117
  "@playwright/test": "^1.58.2",
118
+ "@tanstack/react-query": "^5.90.21",
132
119
  "@tanstack/react-router": "^1.167.3",
133
120
  "@testing-library/jest-dom": "^6.9.1",
134
121
  "@testing-library/react": "^16.3.2",
122
+ "@types/bcryptjs": "^3.0.0",
135
123
  "@types/dagre": "^0.7.54",
136
124
  "@types/node": "^25.3.5",
137
125
  "@types/pg": "^8.15.5",
@@ -140,17 +128,31 @@
140
128
  "@types/serialize-javascript": "^5.0.4",
141
129
  "@types/ws": "^8.18.1",
142
130
  "@types/zxcvbn": "^4.4.5",
131
+ "@uiw/react-json-view": "2.0.0-alpha.41",
143
132
  "@vitest/coverage-v8": "^4.0.18",
144
- "dotenv": "^17.3.1",
133
+ "@xyflow/react": "^12.10.1",
134
+ "dagre": "^0.8.5",
135
+ "date-fns": "^4.1.0",
145
136
  "eslint": "^10.0.3",
137
+ "execa": "^9.6.1",
146
138
  "jsdom": "^28.1.0",
139
+ "lucide-react": "^0.577.0",
140
+ "monaco-editor": "^0.55.1",
147
141
  "monocart-coverage-reports": "^2.12.9",
148
142
  "monocart-reporter": "^2.10.0",
143
+ "pretty-ms": "^9.3.0",
144
+ "rc-tree": "^5.13.1",
145
+ "react": "^19.2.4",
146
+ "react-dom": "^19.2.4",
147
+ "react-router-dom": "^7.13.1",
148
+ "react-use-websocket": "^4.13.0",
149
149
  "testcontainers": "^10.28.0",
150
150
  "tsdown": "^0.15.5",
151
151
  "typescript": "^5.9.3",
152
152
  "vitest": "^4.0.18",
153
- "zod": "^4.3.6"
153
+ "zod": "^4.3.6",
154
+ "zxcvbn": "^4.4.2",
155
+ "@codemation/core-nodes-gmail": "0.3.1"
154
156
  },
155
157
  "scripts": {
156
158
  "changeset:verify": "pnpm --workspace-root run changeset:verify",
@@ -393,7 +393,9 @@ export class AppContainerFactory {
393
393
  // Register the no-op publisher as a fallback so OtelExecutionTelemetryFactory can always
394
394
  // resolve the token. registerOperationalInfrastructure overrides this with the WS relay.
395
395
  container.registerInstance(ApplicationTokens.TelemetrySpanPublisher, NoOpTelemetrySpanPublisher);
396
- BootTimer.measure("appContainer.registerCoreInfrastructure", () => this.registerCoreInfrastructure(container, inputs));
396
+ BootTimer.measure("appContainer.registerCoreInfrastructure", () =>
397
+ this.registerCoreInfrastructure(container, inputs),
398
+ );
397
399
  BootTimer.measure("appContainer.registerRepositoriesAndBuses", () => this.registerRepositoriesAndBuses(container));
398
400
  BootTimer.measure("appContainer.registerApplicationServicesAndRoutes", () =>
399
401
  this.registerApplicationServicesAndRoutes(container, inputs.appConfig),
@@ -481,7 +483,7 @@ export class AppContainerFactory {
481
483
  });
482
484
  }
483
485
 
484
- private mergeConfigMcpServers(container: Container, appConfig: AppConfig): void {
486
+ private mergeConfigMcpServers(container: Container, appConfig: AppConfig): void {
485
487
  const catalog = container.resolve(McpServerCatalog);
486
488
  catalog.merge("config", appConfig.mcpServers ?? []);
487
489
  }
@@ -988,7 +990,23 @@ private mergeConfigMcpServers(container: Container, appConfig: AppConfig): void
988
990
  }
989
991
 
990
992
  private registerPairingInfrastructure(container: Container, appConfig: AppConfig): void {
991
- const pairingConfig = new PairingConfigFactory().create(appConfig.env);
993
+ const isManagedMode = appConfig.auth?.kind === "managed";
994
+ let pairingConfig;
995
+ try {
996
+ pairingConfig = new PairingConfigFactory().create(appConfig.env);
997
+ } catch (err) {
998
+ if (isManagedMode) {
999
+ // In managed mode the secret is required — let the error surface.
1000
+ throw err;
1001
+ }
1002
+ // In non-managed mode an invalid-but-present WORKSPACE_PAIRING_SECRET is a misconfiguration
1003
+ // warning, not a fatal error. Log and continue without pairing.
1004
+ const logger = container.resolve(ServerLoggerFactory).create("codemation.pairing");
1005
+ logger.warn(
1006
+ `WORKSPACE_PAIRING_SECRET is set but invalid — pairing disabled. ${err instanceof Error ? err.message : String(err)}`,
1007
+ );
1008
+ return;
1009
+ }
992
1010
  if (!pairingConfig) {
993
1011
  // Pairing is optional in non-production environments (local dev without CP integration).
994
1012
  // Emit a startup warning so operators know the workspace-mcp HMAC channel is inactive.