@betterportal/theme-embedded 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,421 @@
1
+ import { createConfigSchema, createEventSchemas } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { buildOriginPolicy, buildServiceViewUrl, eventHeaders, eventObservability, htmlResponse, jsonResponse, resolveAppRoute, resolveServiceForTenant, resolveThemeHostname, resolveThemeRequestContext, serviceBaseUrl, withObservedEvent } from "@betterportal/framework";
4
+ import { BPService, BetterPortalConfigSchema } from "@betterportal/plugin-bsb";
5
+ import { loadEmbeddedAsset } from "./assets.js";
6
+ import { renderEmbeddedHostPage } from "./theme/index.js";
7
+ const PluginConfigSchema = av.object({
8
+ host: av.string().minLength(1).default("0.0.0.0"),
9
+ port: av.int().min(1).default(3110),
10
+ betterportal: BetterPortalConfigSchema
11
+ }, { unknownKeys: "strip" });
12
+ function parseAbsoluteHttpUrl(value) {
13
+ if (!/^https?:\/\//i.test(value))
14
+ return null;
15
+ try {
16
+ return new URL(value);
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function normalizeOrigin(value) {
23
+ return parseAbsoluteHttpUrl(value)?.origin ?? null;
24
+ }
25
+ function sameOrigin(a, b) {
26
+ if (a.toLowerCase() === b.toLowerCase())
27
+ return true;
28
+ try {
29
+ return new URL(a).host.toLowerCase() === new URL(b).host.toLowerCase();
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ function resolveSafeServiceViewTarget(service, route, currentPath, themeOrigin) {
36
+ const viewUrl = buildServiceViewUrl(service, route, currentPath);
37
+ const parsed = parseAbsoluteHttpUrl(viewUrl);
38
+ if (!parsed) {
39
+ return {
40
+ ok: false,
41
+ error: "Invalid BetterPortal route: content service must use an absolute http(s) origin."
42
+ };
43
+ }
44
+ if (sameOrigin(parsed.origin, themeOrigin)) {
45
+ return {
46
+ ok: false,
47
+ error: "Invalid BetterPortal route: content service resolves to the theme origin."
48
+ };
49
+ }
50
+ return {
51
+ ok: true,
52
+ origin: parsed.origin,
53
+ path: `${parsed.pathname}${parsed.search}`,
54
+ url: viewUrl
55
+ };
56
+ }
57
+ function resolveSafeServiceTarget(service, path, themeOrigin) {
58
+ const baseUrl = serviceBaseUrl(service);
59
+ const serviceOrigin = normalizeOrigin(baseUrl);
60
+ if (!serviceOrigin) {
61
+ return {
62
+ ok: false,
63
+ error: "Invalid BetterPortal route: content service must use an absolute http(s) origin."
64
+ };
65
+ }
66
+ if (sameOrigin(serviceOrigin, themeOrigin)) {
67
+ return {
68
+ ok: false,
69
+ error: "Invalid BetterPortal route: content service resolves to the theme origin."
70
+ };
71
+ }
72
+ const resolvedPath = path.startsWith("/") ? path : `/${path}`;
73
+ return {
74
+ ok: true,
75
+ origin: serviceOrigin,
76
+ path: resolvedPath,
77
+ url: `${baseUrl}${resolvedPath}`
78
+ };
79
+ }
80
+ const Config = createConfigSchema({
81
+ name: "service-betterportal-theme-embedded",
82
+ description: "Embedded BetterPortal theme",
83
+ tags: ["betterportal", "theme", "embedded", "htmx"],
84
+ documentation: ["./README.md"]
85
+ }, PluginConfigSchema);
86
+ const EventSchemas = createEventSchemas({
87
+ emitEvents: {},
88
+ onEvents: {},
89
+ emitReturnableEvents: {},
90
+ onReturnableEvents: {},
91
+ emitBroadcast: {},
92
+ onBroadcast: {}
93
+ });
94
+ export class Plugin extends BPService {
95
+ static Config = Config;
96
+ static EventSchemas = EventSchemas;
97
+ constructor(cfg) {
98
+ super({ ...cfg, eventSchemas: EventSchemas });
99
+ }
100
+ definition() {
101
+ return {
102
+ manifest: {
103
+ pluginId: "service.betterportal.theme.embedded",
104
+ title: "Embedded Theme",
105
+ description: "Minimal htmx theme for embedding BetterPortal content without iframes.",
106
+ category: "theme",
107
+ capabilities: ["theme"]
108
+ },
109
+ registry: { routes: [] }
110
+ };
111
+ }
112
+ get betterportal() {
113
+ return this.bp;
114
+ }
115
+ headerTrustOptions() {
116
+ return {
117
+ trustedProxyHeaders: this.betterportal.trustedProxyHeaders,
118
+ cfProxy: this.betterportal.cfProxy
119
+ };
120
+ }
121
+ async onRegistered(_registry, obs) {
122
+ this.registerRoutes();
123
+ obs.log.info("Embedded theme initialized");
124
+ }
125
+ requirePortalConfig() {
126
+ const cfg = this.getPortalConfig();
127
+ if (!cfg) {
128
+ throw new Error("Embedded theme has no portal config yet - waiting for control-plane sync. Verify the theme is installed and the CP is reachable.");
129
+ }
130
+ return cfg;
131
+ }
132
+ registerRoutes() {
133
+ this.app.get("/_themes/embedded/assets/**", (event) => this.handleAsset(event));
134
+ this.app.get("/llms.txt", (event) => this.handleLlmsTxt(event));
135
+ this.app.get("/.well-known/bp/ai.json", (event) => this.handleAiManifest(event));
136
+ this.app.get("/.well-known/bp/manifest", (event) => this.handleManifest(event));
137
+ this.app.get("/.well-known/bp/public", (event) => this.handlePublicDiscovery(event));
138
+ this.app.get("/.well-known/bp/health", (event) => this.handleHealth(event));
139
+ this.app.get("/**", (event) => this.handleIndex(event));
140
+ }
141
+ appPublicUrl(app) {
142
+ const hostname = app?.hostnames[0];
143
+ if (!hostname)
144
+ return undefined;
145
+ return /^https?:\/\//i.test(hostname) ? hostname : `https://${hostname}`;
146
+ }
147
+ resolveManagementApp(portalConfig) {
148
+ const appId = portalConfig.configManagement.managementAppId;
149
+ const app = appId ? portalConfig.apps.find((entry) => entry.id === appId) : undefined;
150
+ return { appId, tenantId: app?.tenantId, url: this.appPublicUrl(app) };
151
+ }
152
+ resolveConfigManagerUrl(portalConfig, tenantId) {
153
+ const tenant = portalConfig.tenants.find((entry) => entry.id === tenantId);
154
+ const direct = tenant?.services.find((service) => service.enabled && service.serviceId === "service.betterportal.config-manager");
155
+ if (direct)
156
+ return direct.hostname;
157
+ for (const activation of portalConfig.sharedServiceActivations.filter((entry) => entry.tenantId === tenantId && entry.enabled)) {
158
+ const shared = portalConfig.sharedServiceCatalog.find((service) => service.id === activation.sharedServiceId && service.enabled && service.serviceId === "service.betterportal.config-manager");
159
+ if (shared)
160
+ return shared.baseUrl;
161
+ }
162
+ return undefined;
163
+ }
164
+ discoveryUrls(portalConfig, tenantId, tenantUrl) {
165
+ const configManagerUrl = this.resolveConfigManagerUrl(portalConfig, tenantId);
166
+ return {
167
+ configManagerUrl,
168
+ catalogUrl: configManagerUrl ? `${configManagerUrl}/.well-known/bp/automation/catalog?tenantUrl=${encodeURIComponent(tenantUrl)}` : undefined,
169
+ managementDiscoveryUrl: configManagerUrl ? `${configManagerUrl}/.well-known/bp/management` : undefined,
170
+ managementCurrentUrl: configManagerUrl ? `${configManagerUrl}/.well-known/bp/manage/current?tenantUrl=${encodeURIComponent(tenantUrl)}` : undefined
171
+ };
172
+ }
173
+ resolveThemeAiContext(activeEvent) {
174
+ const portalConfig = this.getPortalConfig();
175
+ if (!portalConfig)
176
+ return null;
177
+ const context = resolveThemeRequestContext(portalConfig, eventHeaders(activeEvent), activeEvent.req.headers.get("host") ?? undefined, this.headerTrustOptions());
178
+ if (!context)
179
+ return null;
180
+ const tenantUrl = activeEvent.url.origin;
181
+ return {
182
+ tenant: { id: context.tenant.id, title: context.tenant.title },
183
+ app: { id: context.app.id, title: context.app.title },
184
+ tenantUrl,
185
+ urls: this.discoveryUrls(portalConfig, context.tenant.id, tenantUrl),
186
+ management: this.resolveManagementApp(portalConfig)
187
+ };
188
+ }
189
+ aiManifest(context, traceId) {
190
+ return {
191
+ protocol: "betterportal-ai.v1",
192
+ tenant: context.tenant,
193
+ app: { ...context.app, url: context.tenantUrl },
194
+ configManagerUrl: context.urls.configManagerUrl,
195
+ automation: { catalogUrl: context.urls.catalogUrl },
196
+ management: {
197
+ appUrl: context.management.url,
198
+ appId: context.management.appId,
199
+ tenantId: context.management.tenantId,
200
+ discoveryUrl: context.urls.managementDiscoveryUrl,
201
+ currentUrl: context.urls.managementCurrentUrl,
202
+ platformAdmin: {
203
+ available: true,
204
+ usage: "operator-only",
205
+ aiPolicy: "do-not-use-for-user-tasks"
206
+ }
207
+ },
208
+ ...(traceId ? { traceId } : {})
209
+ };
210
+ }
211
+ async handleAiManifest(event) {
212
+ return withObservedEvent(event, this.observability, "theme.embedded.ai_manifest", (activeEvent, span) => {
213
+ const context = this.resolveThemeAiContext(activeEvent);
214
+ if (!context)
215
+ return jsonResponse({ error: "Unable to resolve tenant/app AI context" }, 404);
216
+ return jsonResponse(this.aiManifest(context, span.traceId));
217
+ });
218
+ }
219
+ async handleLlmsTxt(event) {
220
+ return withObservedEvent(event, this.observability, "theme.embedded.llms_txt", (activeEvent) => {
221
+ const context = this.resolveThemeAiContext(activeEvent);
222
+ if (!context)
223
+ return new Response("BetterPortal app context is not available yet.\n", { status: 404, headers: { "content-type": "text/plain; charset=utf-8", "cache-control": "no-store" } });
224
+ const lines = [
225
+ `# ${context.app.title}`,
226
+ "",
227
+ "This is a BetterPortal tenant app.",
228
+ "",
229
+ `Tenant ID: ${context.tenant.id}`,
230
+ `Tenant Title: ${context.tenant.title}`,
231
+ `App ID: ${context.app.id}`,
232
+ `App URL: ${context.tenantUrl}`,
233
+ "",
234
+ "Discovery:",
235
+ "- AI manifest: /.well-known/bp/ai.json",
236
+ `- Automation catalog: ${context.urls.catalogUrl ?? "not available"}`,
237
+ `- Management discovery: ${context.urls.managementDiscoveryUrl ?? "not available"}`,
238
+ `- Management app URL: ${context.management.url ?? "not configured"}`,
239
+ "",
240
+ "Use the automation catalog for business/service actions.",
241
+ "Use management discovery and the management app URL for user-owned app, tenant, service, route, menu, fragment, and theme configuration.",
242
+ "Platform admin is operator-only. AI agents must not use platform admin for user tasks.",
243
+ "If an action schema has missing required values, ask the user for those values before calling the API.",
244
+ "Persist BetterPortal response headers from BP-SetHeader until expiry and send live headers on later BP API calls. Apply BP-RemoveHeader when returned.",
245
+ "Referer and Origin help BetterPortal resolve tenant/app context; explicit discovered URLs and BP headers are preferred for API calls.",
246
+ ""
247
+ ];
248
+ return new Response(lines.join("\n"), { headers: { "content-type": "text/plain; charset=utf-8", "cache-control": "no-store" } });
249
+ });
250
+ }
251
+ async handlePublicDiscovery(event) {
252
+ return withObservedEvent(event, this.observability, "theme.embedded.public_discovery", (activeEvent, span) => {
253
+ const context = this.resolveThemeAiContext(activeEvent);
254
+ if (!context)
255
+ return jsonResponse({ error: "Unable to resolve tenant/app context" }, 404);
256
+ return jsonResponse({
257
+ protocol: "betterportal-automation.v1",
258
+ tenantId: context.tenant.id,
259
+ appId: context.app.id,
260
+ tenantUrl: context.tenantUrl,
261
+ configManagerUrl: context.urls.configManagerUrl,
262
+ catalogUrl: context.urls.catalogUrl,
263
+ aiManifestUrl: "/.well-known/bp/ai.json",
264
+ managementDiscoveryUrl: context.urls.managementDiscoveryUrl,
265
+ traceId: span.traceId
266
+ });
267
+ });
268
+ }
269
+ async handleAsset(event) {
270
+ return withObservedEvent(event, this.observability, "theme.embedded.asset", async (activeEvent) => {
271
+ const assetPath = activeEvent.url.pathname.replace(/^\/_themes\/embedded\/assets\/?/, "");
272
+ const asset = await loadEmbeddedAsset(assetPath);
273
+ if (!asset) {
274
+ return jsonResponse({ error: "Asset not found" }, 404);
275
+ }
276
+ return htmlResponse(asset.body, 200, asset.contentType, {
277
+ "cache-control": assetPath === "embedded-core.js"
278
+ ? "no-store"
279
+ : "public, max-age=3600"
280
+ });
281
+ });
282
+ }
283
+ logThemeContextResolutionFailure(event, error) {
284
+ const obs = eventObservability(event);
285
+ if (!obs)
286
+ return;
287
+ const normalizedError = error instanceof Error ? error : null;
288
+ obs.logger.warn("BetterPortal embedded context not resolved for request host={host} origin={origin} referer={referer}: {reason}", {
289
+ host: event.req.headers.get("host") ?? "",
290
+ origin: event.req.headers.get("origin") ?? "",
291
+ referer: event.req.headers.get("referer") ?? "",
292
+ reason: normalizedError?.message ?? "no active app matched request host/origin/referer"
293
+ });
294
+ }
295
+ tagRequestContext(event, tenantId, appId) {
296
+ event.__bpTenantId = tenantId;
297
+ event.__bpAppId = appId;
298
+ }
299
+ async handleIndex(event) {
300
+ return withObservedEvent(event, this.observability, "theme.embedded.index", async (activeEvent, span) => {
301
+ const sourceHostname = resolveThemeHostname(eventHeaders(activeEvent), this.headerTrustOptions());
302
+ const portalConfig = this.getPortalConfig();
303
+ if (!portalConfig) {
304
+ return new Response("<!doctype html><html><body style=\"font-family:sans-serif;padding:1rem;\">" +
305
+ "<strong>BetterPortal embedded theme is waiting for control-plane sync.</strong>" +
306
+ "</body></html>", { status: 503, headers: { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" } });
307
+ }
308
+ const requestContext = resolveThemeRequestContext(portalConfig, eventHeaders(activeEvent), activeEvent.req.headers.get("host") ?? undefined, this.headerTrustOptions());
309
+ if (!requestContext) {
310
+ this.logThemeContextResolutionFailure(activeEvent);
311
+ return jsonResponse({
312
+ error: "Unable to resolve tenant/app context for embedded theme request"
313
+ }, 404);
314
+ }
315
+ this.tagRequestContext(activeEvent, requestContext.tenant.id, requestContext.app.id);
316
+ const themeOrigin = activeEvent.url.origin;
317
+ const currentRoute = resolveAppRoute(requestContext.app, activeEvent.url.pathname) ??
318
+ resolveAppRoute(requestContext.app, requestContext.app.defaultRoute);
319
+ const enabledRoutes = requestContext.app.routes.filter((route) => route.enabled);
320
+ const routeLinks = enabledRoutes
321
+ .map((route) => {
322
+ const routeBinding = resolveServiceForTenant(portalConfig, route.serviceId, requestContext);
323
+ if (!routeBinding)
324
+ return null;
325
+ const safeTarget = resolveSafeServiceViewTarget(routeBinding.service, route, route.path, themeOrigin);
326
+ return {
327
+ id: route.id,
328
+ href: route.path,
329
+ requestUrl: safeTarget.ok ? safeTarget.url : undefined,
330
+ serviceId: route.serviceId,
331
+ active: route.path === (currentRoute?.path ?? requestContext.app.defaultRoute),
332
+ error: safeTarget.ok ? undefined : safeTarget.error
333
+ };
334
+ })
335
+ .filter((route) => route !== null);
336
+ const backgroundServices = Array.from(new Map(routeLinks
337
+ .filter((route) => route.requestUrl)
338
+ .map((route) => [route.serviceId, {
339
+ serviceId: route.serviceId,
340
+ origin: new URL(route.requestUrl).origin
341
+ }])).values());
342
+ const initialRouteBinding = currentRoute
343
+ ? resolveServiceForTenant(portalConfig, currentRoute.serviceId, requestContext)
344
+ : null;
345
+ const initialSafeTarget = currentRoute && initialRouteBinding
346
+ ? resolveSafeServiceViewTarget(initialRouteBinding.service, currentRoute, activeEvent.url.pathname, themeOrigin)
347
+ : null;
348
+ const initialRouteUrl = initialSafeTarget?.ok
349
+ ? initialSafeTarget.url + activeEvent.url.search
350
+ : undefined;
351
+ const initialRouteError = initialSafeTarget && !initialSafeTarget.ok
352
+ ? initialSafeTarget.error
353
+ : undefined;
354
+ const appFragments = requestContext.app.fragments;
355
+ const embeddedFragments = appFragments?.embedded ?? [];
356
+ for (const fragment of embeddedFragments.filter((entry) => entry.enabled)) {
357
+ const binding = resolveServiceForTenant(portalConfig, fragment.serviceId, requestContext);
358
+ if (!binding)
359
+ continue;
360
+ const safeTarget = resolveSafeServiceTarget(binding.service, fragment.targetPath, themeOrigin);
361
+ if (!safeTarget.ok)
362
+ continue;
363
+ routeLinks.push({
364
+ id: `fragment:${fragment.fragmentId}`,
365
+ href: fragment.targetPath,
366
+ requestUrl: safeTarget.url,
367
+ serviceId: fragment.serviceId,
368
+ active: false
369
+ });
370
+ }
371
+ const originPolicy = buildOriginPolicy(requestContext);
372
+ const discoveryUrls = this.discoveryUrls(portalConfig, requestContext.tenant.id, activeEvent.url.origin);
373
+ return new Response(renderEmbeddedHostPage({
374
+ title: requestContext.app.title,
375
+ assetBaseUrl: "/_themes/embedded/assets",
376
+ initialRouteUrl,
377
+ initialRouteError,
378
+ initialServiceId: currentRoute?.serviceId,
379
+ routeLinks,
380
+ backgroundServices,
381
+ aiManifestUrl: "/.well-known/bp/ai.json",
382
+ automationCatalogUrl: discoveryUrls.catalogUrl,
383
+ managementDiscoveryUrl: discoveryUrls.managementDiscoveryUrl
384
+ }), {
385
+ status: 200,
386
+ headers: {
387
+ "content-type": "text/html; charset=utf-8",
388
+ ...(sourceHostname ? { "x-bp-source-hostname": sourceHostname } : {}),
389
+ "cache-control": "no-store",
390
+ "x-bp-allowed-origin": originPolicy.allowedOrigins[0] ?? "",
391
+ "x-bp-trace-id": span.traceId
392
+ }
393
+ });
394
+ });
395
+ }
396
+ async handleManifest(event) {
397
+ return withObservedEvent(event, this.observability, "theme.embedded.manifest", (_activeEvent, span) => {
398
+ return jsonResponse({
399
+ ...this.manifest,
400
+ traceId: span.traceId
401
+ });
402
+ });
403
+ }
404
+ async handleHealth(event) {
405
+ return withObservedEvent(event, this.observability, "theme.embedded.health", () => {
406
+ return jsonResponse({
407
+ ok: true,
408
+ plugin: "service-betterportal-theme-embedded",
409
+ port: this.config.port
410
+ });
411
+ });
412
+ }
413
+ async run(obs) {
414
+ await super.run(obs);
415
+ }
416
+ async dispose() {
417
+ await super.dispose();
418
+ }
419
+ }
420
+ export { Config, EventSchemas };
421
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-embedded/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type PluginManifest, type HtmlRenderable } from "@betterportal/framework";
2
+ export interface EmbeddedShellContext {
3
+ title: string;
4
+ assetBaseUrl: string;
5
+ bodyHtml: HtmlRenderable;
6
+ aiManifestUrl?: string;
7
+ automationCatalogUrl?: string;
8
+ managementDiscoveryUrl?: string;
9
+ }
10
+ export interface EmbeddedRouteLink {
11
+ id: string;
12
+ href: string;
13
+ requestUrl?: string;
14
+ serviceId: string;
15
+ active: boolean;
16
+ error?: string;
17
+ }
18
+ export interface EmbeddedHostPageContext {
19
+ title: string;
20
+ assetBaseUrl: string;
21
+ initialRouteUrl?: string;
22
+ initialServiceId?: string;
23
+ initialRouteError?: string;
24
+ routeLinks: EmbeddedRouteLink[];
25
+ backgroundServices: Array<{
26
+ serviceId: string;
27
+ origin: string;
28
+ }>;
29
+ aiManifestUrl?: string;
30
+ automationCatalogUrl?: string;
31
+ managementDiscoveryUrl?: string;
32
+ }
33
+ export declare const EmbeddedManifest: PluginManifest;
34
+ export declare function renderEmbeddedShell(context: EmbeddedShellContext): string;
35
+ export declare function renderEmbeddedHostPage(context: EmbeddedHostPageContext): string;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/service-betterportal-theme-embedded/theme/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzG,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,kBAAkB,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,gBAAgB,EAAE,cAiB7B,CAAC;AAqEH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAEzE;AAiDD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAS/E"}
@@ -0,0 +1,106 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
2
+ /** @jsxImportSource jsx-htmx */
3
+ import { css } from "jsx-htmx";
4
+ import { createPluginManifest } from "@betterportal/framework";
5
+ export const EmbeddedManifest = createPluginManifest({
6
+ pluginId: "service.betterportal.theme.embedded",
7
+ title: "BetterPortal Embedded Theme",
8
+ description: "Minimal wrapper theme for BetterPortal embed use cases.",
9
+ version: "1.0.0",
10
+ category: "theme",
11
+ deploymentModes: ["bp-hosted", "customer-hosted", "self-hosted"],
12
+ capabilities: ["theme", "theme.embed", "theme.htmx"],
13
+ supportedThemes: ["embedded"],
14
+ supportedRenderModes: ["fragment", "embed"],
15
+ views: [],
16
+ configSchemas: [],
17
+ permissions: [],
18
+ adminApis: [],
19
+ cacheHints: {
20
+ metadataTtlSeconds: 1800
21
+ }
22
+ });
23
+ function EmbeddedDocument(context) {
24
+ return (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("meta", { name: "htmx-config", content: '{"selfRequestsOnly":false,"historyCacheSize":0,"mode":"cors","extensions":"bp-embedded"}' }), _jsx("link", { rel: "llms", href: "/llms.txt" }), _jsx("link", { rel: "alternate", type: "application/json", title: "BetterPortal AI Manifest", href: context.aiManifestUrl ?? "/.well-known/bp/ai.json" }), _jsx("meta", { name: "betterportal:ai-manifest", content: context.aiManifestUrl ?? "/.well-known/bp/ai.json" }), context.automationCatalogUrl ? _jsx("meta", { name: "betterportal:automation-catalog", content: context.automationCatalogUrl }) : "", context.managementDiscoveryUrl ? _jsx("meta", { name: "betterportal:management-discovery", content: context.managementDiscoveryUrl }) : "", _jsx("title", { children: context.title }), _jsx("script", { src: `${context.assetBaseUrl}/embedded-core.js`, defer: true }), _jsx("style", { children: css({
25
+ "html, body": {
26
+ width: "100%",
27
+ height: "100%",
28
+ margin: 0,
29
+ padding: 0,
30
+ background: "transparent"
31
+ },
32
+ "body.shell-embed": {
33
+ width: "100%",
34
+ minHeight: "100%",
35
+ overflow: "hidden"
36
+ },
37
+ ".bp-embedded": {
38
+ width: "100%",
39
+ height: "100%",
40
+ minHeight: "100%",
41
+ position: "relative"
42
+ },
43
+ ".bp-embedded__main": {
44
+ width: "100%",
45
+ height: "100%",
46
+ minHeight: "100%",
47
+ position: "relative"
48
+ },
49
+ ".bp-embedded__loader": {
50
+ width: "100%",
51
+ minHeight: "12rem",
52
+ display: "grid",
53
+ placeItems: "center",
54
+ color: "#64748b",
55
+ font: "14px/1.4 system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
56
+ },
57
+ ".bp-embedded__error": {
58
+ boxSizing: "border-box",
59
+ width: "100%",
60
+ padding: "1rem",
61
+ color: "#991b1b",
62
+ background: "#fef2f2",
63
+ border: "1px solid #fecaca",
64
+ font: "14px/1.4 system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
65
+ },
66
+ ".bp-embedded__loading": {
67
+ opacity: "0.72",
68
+ transition: "opacity 120ms ease"
69
+ }
70
+ }) })] }), _jsx("body", { class: "shell-embed", children: context.bodyHtml })] }));
71
+ }
72
+ export function renderEmbeddedShell(context) {
73
+ return `<!DOCTYPE html>${EmbeddedDocument(context)}`;
74
+ }
75
+ function buildServiceMap(routeLinks) {
76
+ const map = {};
77
+ for (const route of routeLinks) {
78
+ if (route.serviceId && !map[route.serviceId]) {
79
+ try {
80
+ if (!route.requestUrl)
81
+ continue;
82
+ map[route.serviceId] = new URL(route.requestUrl).origin;
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ }
88
+ }
89
+ return map;
90
+ }
91
+ function EmbeddedBody(context) {
92
+ const serviceMap = buildServiceMap(context.routeLinks);
93
+ const hasInitialRouteError = Boolean(context.initialRouteError);
94
+ return (_jsxs("div", { class: "bp-embedded", "data-bp-embedded-root": "", "data-bp-services": JSON.stringify(serviceMap), "data-bp-background-services": JSON.stringify(context.backgroundServices), "data-bp-initial-service": context.initialServiceId, "hx-ext": "bp-embedded", children: [_jsx("div", { "data-bp-background-fragments": "", hidden: true }), _jsx("div", { class: "bp-embedded__main", "data-bp-main-outlet": "", "data-bp-service": context.initialServiceId, "hx-get": context.initialRouteUrl ?? "", "hx-trigger": context.initialRouteUrl && !hasInitialRouteError ? "load" : undefined, "hx-target": "this", "hx-swap": "innerHTML", children: hasInitialRouteError ? (_jsx("div", { class: "bp-embedded__error", children: context.initialRouteError })) : (_jsx("div", { class: "bp-embedded__loader", children: "Loading" })) })] }));
95
+ }
96
+ export function renderEmbeddedHostPage(context) {
97
+ return renderEmbeddedShell({
98
+ title: context.title,
99
+ assetBaseUrl: context.assetBaseUrl,
100
+ aiManifestUrl: context.aiManifestUrl,
101
+ automationCatalogUrl: context.automationCatalogUrl,
102
+ managementDiscoveryUrl: context.managementDiscoveryUrl,
103
+ bodyHtml: EmbeddedBody(context)
104
+ });
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/service-betterportal-theme-embedded/theme/index.tsx"],"names":[],"mappings":"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"}