@burdenoff/microfe-vibecontrols 2026.601.1 → 2026.601.2

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.
@@ -1,24 +1,24 @@
1
1
  import { useTr as e } from "./shared/hooks/useTr.js";
2
2
  import t, { Suspense as n, useEffect as r } from "react";
3
- import { Navigate as i, Route as a, Routes as o, useLocation as s, useParams as c } from "react-router-dom";
4
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
- import { FeatureGate as ee } from "@burdenoff/fe-libs/shared/feature-flags";
3
+ import { Navigate as i, Route as a, Routes as ee, useLocation as o, useParams as s } from "react-router-dom";
4
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
+ import { FeatureGate as u } from "@burdenoff/fe-libs/shared/feature-flags";
6
6
  //#region src/VibeControlsRoutes.tsx
7
- var d = t.lazy(() => import("./pages/OverviewPage.js").then((e) => ({ default: e.OverviewPage }))), f = t.lazy(() => import("./pages/AgentsLandingPage.js").then((e) => ({ default: e.AgentsLandingPage }))), p = t.lazy(() => import("./pages/AgentDetailsPage.js").then((e) => ({ default: e.AgentDetailsPage }))), m = t.lazy(() => import("./pages/TargetDetailsPage.js").then((e) => ({ default: e.TargetDetailsPage }))), h = t.lazy(() => import("./pages/SessionsPage.js").then((e) => ({ default: e.SessionsPage }))), g = t.lazy(() => import("./pages/SessionDetailsPage.js").then((e) => ({ default: e.SessionDetailsPage }))), _ = t.lazy(() => import("./pages/VibesPage.js").then((e) => ({ default: e.VibesPage }))), v = t.lazy(() => import("./pages/VibeDetailsPage.js").then((e) => ({ default: e.VibeDetailsPage }))), y = t.lazy(() => import("./pages/NoteDetailsPage.js").then((e) => ({ default: e.NoteDetailsPage }))), b = t.lazy(() => import("./pages/TunnelsLandingPage.js").then((e) => ({ default: e.TunnelsLandingPage }))), x = t.lazy(() => import("./pages/tunnels/TunnelDetailsPage.js").then((e) => ({ default: e.TunnelDetailsPage }))), S = t.lazy(() => import("./components/tunnels/TunnelCreateWizard.js").then((e) => ({ default: e.TunnelCreateWizard }))), C = t.lazy(() => import("./pages/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), w = t.lazy(() => import("./pages/HealthPage.js").then((e) => ({ default: e.HealthPage }))), T = t.lazy(() => import("./pages/GettingStartedPage.js").then((e) => ({ default: e.GettingStartedPage }))), E = t.lazy(() => import("./pages/SharedSessionPage.js").then((e) => ({ default: e.SharedSessionPage }))), D = t.lazy(() => import("./pages/VibeDeckPage.js").then((e) => ({ default: e.VibeDeckPage }))), O = t.lazy(() => import("./pages/SharedVibeDeckPage.js").then((e) => ({ default: e.SharedVibeDeckPage }))), k = t.lazy(() => import("./pages/VibeCalendarPage.js").then((e) => ({ default: e.VibeCalendarPage }))), A = t.lazy(() => import("./pages/VibeTaskDetailPage.js").then((e) => ({ default: e.VibeTaskDetailPage }))), te = t.lazy(() => import("./pages/ScheduledJobDetailPage.js").then((e) => ({ default: e.ScheduledJobDetailPage }))), j = t.lazy(() => import("./pages/ActionsPage.js").then((e) => ({ default: e.ActionsPage }))), M = t.lazy(() => import("./pages/VibeAuditPage.js").then((e) => ({ default: e.VibeAuditPage }))), N = t.lazy(() => import("./pages/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), P = t.lazy(() => import("./pages/VibeDocsPage.js").then((e) => ({ default: e.VibeDocsPage }))), F = t.lazy(() => import("./pages/LogsPage.js").then((e) => ({ default: e.LogsPage }))), I = t.lazy(() => import("./pages/CatalogPage.js").then((e) => ({ default: e.CatalogPage }))), L = t.lazy(() => import("./pages/CatalogDetailPage.js").then((e) => ({ default: e.CatalogDetailPage }))), R = t.lazy(() => import("./pages/CatalogDocsPage.js").then((e) => ({ default: e.CatalogDocsPage }))), z = t.lazy(() => import("./pages/ComponentsPage.js").then((e) => ({ default: e.ComponentsPage }))), B = t.lazy(() => import("./pages/ComponentDetailPage.js").then((e) => ({ default: e.ComponentDetailPage }))), V = t.lazy(() => import("./pages/ComponentDocsPage.js").then((e) => ({ default: e.ComponentDocsPage }))), H = t.lazy(() => import("./pages/TemplatesPage.js").then((e) => ({ default: e.TemplatesPage }))), U = t.lazy(() => import("./pages/TemplateDetailPage.js").then((e) => ({ default: e.TemplateDetailPage }))), W = t.lazy(() => import("./pages/PluginStandalonePage.js").then((e) => ({ default: e.PluginStandalonePage }))), G = t.lazy(() => import("./pages/PluginsCatalogPage.js").then((e) => ({ default: e.PluginsCatalogPage }))), K = t.lazy(() => import("./pages/ai/AIPage.js").then((e) => ({ default: e.AIPage }))), q = t.lazy(() => import("./pages/ai/AISessionDetailPage.js").then((e) => ({ default: e.AISessionDetailPage }))), J = t.lazy(() => import("./pages/ai/AgentManagerPage.js").then((e) => ({ default: e.AgentManagerPage }))), Y = t.lazy(() => import("./pages/ai/AIBookmarksPage.js").then((e) => ({ default: e.AIBookmarksPage })));
8
- function X() {
9
- return /* @__PURE__ */ l("div", {
7
+ var d = t.lazy(() => import("./pages/OverviewPage.js").then((e) => ({ default: e.OverviewPage }))), f = t.lazy(() => import("./pages/AgentsLandingPage.js").then((e) => ({ default: e.AgentsLandingPage }))), p = t.lazy(() => import("./pages/AgentDetailsPage.js").then((e) => ({ default: e.AgentDetailsPage }))), m = t.lazy(() => import("./pages/TargetDetailsPage.js").then((e) => ({ default: e.TargetDetailsPage }))), h = t.lazy(() => import("./pages/SessionsPage.js").then((e) => ({ default: e.SessionsPage }))), g = t.lazy(() => import("./pages/SessionDetailsPage.js").then((e) => ({ default: e.SessionDetailsPage }))), _ = t.lazy(() => import("./pages/VibesPage.js").then((e) => ({ default: e.VibesPage }))), v = t.lazy(() => import("./pages/VibeDetailsPage.js").then((e) => ({ default: e.VibeDetailsPage }))), y = t.lazy(() => import("./pages/NoteDetailsPage.js").then((e) => ({ default: e.NoteDetailsPage }))), b = t.lazy(() => import("./pages/TunnelsLandingPage.js").then((e) => ({ default: e.TunnelsLandingPage }))), x = t.lazy(() => import("./pages/tunnels/TunnelDetailsPage.js").then((e) => ({ default: e.TunnelDetailsPage }))), S = t.lazy(() => import("./components/tunnels/TunnelCreateWizard.js").then((e) => ({ default: e.TunnelCreateWizard }))), C = t.lazy(() => import("./pages/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), w = t.lazy(() => import("./pages/HealthPage.js").then((e) => ({ default: e.HealthPage }))), T = t.lazy(() => import("./pages/GettingStartedPage.js").then((e) => ({ default: e.GettingStartedPage }))), E = t.lazy(() => import("./pages/SharedSessionPage.js").then((e) => ({ default: e.SharedSessionPage }))), D = t.lazy(() => import("./pages/VibeDeckPage.js").then((e) => ({ default: e.VibeDeckPage }))), O = t.lazy(() => import("./pages/SharedVibeDeckPage.js").then((e) => ({ default: e.SharedVibeDeckPage }))), k = t.lazy(() => import("./pages/VibeCalendarPage.js").then((e) => ({ default: e.VibeCalendarPage }))), A = t.lazy(() => import("./pages/VibeTaskDetailPage.js").then((e) => ({ default: e.VibeTaskDetailPage }))), te = t.lazy(() => import("./pages/ScheduledJobDetailPage.js").then((e) => ({ default: e.ScheduledJobDetailPage }))), j = t.lazy(() => import("./pages/ActionsPage.js").then((e) => ({ default: e.ActionsPage }))), M = t.lazy(() => import("./pages/VibeAuditPage.js").then((e) => ({ default: e.VibeAuditPage }))), N = t.lazy(() => import("./pages/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), P = t.lazy(() => import("./pages/VibeDocsPage.js").then((e) => ({ default: e.VibeDocsPage }))), F = t.lazy(() => import("./pages/LogsPage.js").then((e) => ({ default: e.LogsPage }))), I = t.lazy(() => import("./pages/CatalogPage.js").then((e) => ({ default: e.CatalogPage }))), L = t.lazy(() => import("./pages/CatalogDetailPage.js").then((e) => ({ default: e.CatalogDetailPage }))), R = t.lazy(() => import("./pages/CatalogDocsPage.js").then((e) => ({ default: e.CatalogDocsPage }))), z = t.lazy(() => import("./pages/ComponentsPage.js").then((e) => ({ default: e.ComponentsPage }))), B = t.lazy(() => import("./pages/ComponentDetailPage.js").then((e) => ({ default: e.ComponentDetailPage }))), V = t.lazy(() => import("./pages/ComponentDocsPage.js").then((e) => ({ default: e.ComponentDocsPage }))), H = t.lazy(() => import("./pages/TemplatesPage.js").then((e) => ({ default: e.TemplatesPage }))), U = t.lazy(() => import("./pages/TemplateDetailPage.js").then((e) => ({ default: e.TemplateDetailPage }))), W = t.lazy(() => import("./pages/PluginsCatalogPage.js").then((e) => ({ default: e.PluginsCatalogPage }))), G = t.lazy(() => import("./pages/ai/AIPage.js").then((e) => ({ default: e.AIPage }))), K = t.lazy(() => import("./pages/ai/AISessionDetailPage.js").then((e) => ({ default: e.AISessionDetailPage }))), q = t.lazy(() => import("./pages/ai/AgentManagerPage.js").then((e) => ({ default: e.AgentManagerPage }))), J = t.lazy(() => import("./pages/ai/AIBookmarksPage.js").then((e) => ({ default: e.AIBookmarksPage })));
8
+ function Y() {
9
+ return /* @__PURE__ */ c("div", {
10
10
  className: "flex items-center justify-center h-full min-h-[200px]",
11
- children: /* @__PURE__ */ l("div", { className: "animate-pulse bg-muted rounded w-full h-full" })
11
+ children: /* @__PURE__ */ c("div", { className: "animate-pulse bg-muted rounded w-full h-full" })
12
12
  });
13
13
  }
14
- function Z() {
15
- let { pathname: e } = s();
14
+ function X() {
15
+ let { pathname: e } = o();
16
16
  return r(() => {
17
17
  let e = document.querySelector("main");
18
18
  e && (e.scrollTop = 0);
19
19
  }, [e]), null;
20
20
  }
21
- var Q = new Set([
21
+ var Z = new Set([
22
22
  "overview",
23
23
  "templates",
24
24
  "contexts",
@@ -29,318 +29,314 @@ var Q = new Set([
29
29
  "playground",
30
30
  "config"
31
31
  ]);
32
- function ne() {
33
- let { tab: e } = c();
34
- return e === "plan" ? /* @__PURE__ */ l(i, {
32
+ function Q() {
33
+ let { tab: e } = s();
34
+ return e === "plan" ? /* @__PURE__ */ c(i, {
35
35
  to: "/vibecontrols/ai-tools/plan",
36
36
  replace: !0
37
- }) : e && Q.has(e) ? /* @__PURE__ */ l(i, {
37
+ }) : e && Z.has(e) ? /* @__PURE__ */ c(i, {
38
38
  to: `/vibecontrols/ai-tools/ai/${e}`,
39
39
  replace: !0
40
- }) : /* @__PURE__ */ l(i, {
40
+ }) : /* @__PURE__ */ c(i, {
41
41
  to: "/vibecontrols/ai-tools/ai/overview",
42
42
  replace: !0
43
43
  });
44
44
  }
45
- function re() {
46
- return /* @__PURE__ */ l("div", {
45
+ function ne() {
46
+ return /* @__PURE__ */ c("div", {
47
47
  className: "flex items-center justify-center h-full min-h-[200px] text-text-secondary text-sm",
48
48
  children: e()("vibecontrols.pages.featureDisabled", "This feature is currently disabled. You can enable it from Feature Previews.")
49
49
  });
50
50
  }
51
51
  function $(e, t, n = !0) {
52
- return /* @__PURE__ */ l(ee, {
52
+ return /* @__PURE__ */ c(u, {
53
53
  flag: e,
54
54
  defaultValue: n,
55
- fallback: /* @__PURE__ */ l(re, {}),
55
+ fallback: /* @__PURE__ */ c(ne, {}),
56
56
  children: t
57
57
  });
58
58
  }
59
- function ie() {
60
- return /* @__PURE__ */ u(n, {
61
- fallback: /* @__PURE__ */ l(X, {}),
62
- children: [/* @__PURE__ */ l(Z, {}), /* @__PURE__ */ u(o, { children: [
63
- /* @__PURE__ */ l(a, {
59
+ function re() {
60
+ return /* @__PURE__ */ l(n, {
61
+ fallback: /* @__PURE__ */ c(Y, {}),
62
+ children: [/* @__PURE__ */ c(X, {}), /* @__PURE__ */ l(ee, { children: [
63
+ /* @__PURE__ */ c(a, {
64
64
  index: !0,
65
- element: $("vibecontrols.overview", /* @__PURE__ */ l(d, {}))
66
- }),
67
- /* @__PURE__ */ l(a, {
68
- path: "plugin/:pluginKey",
69
- element: $("vibecontrols.vibes", /* @__PURE__ */ l(W, {}))
65
+ element: $("vibecontrols.overview", /* @__PURE__ */ c(d, {}))
70
66
  }),
71
- /* @__PURE__ */ l(a, {
67
+ /* @__PURE__ */ c(a, {
72
68
  path: "plugins",
73
- element: $("vibecontrols.vibes", /* @__PURE__ */ l(G, {}))
69
+ element: $("vibecontrols.vibes", /* @__PURE__ */ c(W, {}))
74
70
  }),
75
- /* @__PURE__ */ l(a, {
71
+ /* @__PURE__ */ c(a, {
76
72
  path: "agents",
77
- element: $("vibecontrols.agents", /* @__PURE__ */ l(f, {}))
73
+ element: $("vibecontrols.agents", /* @__PURE__ */ c(f, {}))
78
74
  }),
79
- /* @__PURE__ */ l(a, {
75
+ /* @__PURE__ */ c(a, {
80
76
  path: "agents/new",
81
- element: /* @__PURE__ */ l(i, {
77
+ element: /* @__PURE__ */ c(i, {
82
78
  to: "../agents?create=true",
83
79
  replace: !0
84
80
  })
85
81
  }),
86
- /* @__PURE__ */ l(a, {
82
+ /* @__PURE__ */ c(a, {
87
83
  path: "agents/:id",
88
- element: $("vibecontrols.agents", /* @__PURE__ */ l(p, {}))
84
+ element: $("vibecontrols.agents", /* @__PURE__ */ c(p, {}))
89
85
  }),
90
- /* @__PURE__ */ l(a, {
86
+ /* @__PURE__ */ c(a, {
91
87
  path: "sessions",
92
- element: $("vibecontrols.sessions", /* @__PURE__ */ l(h, {}))
88
+ element: $("vibecontrols.sessions", /* @__PURE__ */ c(h, {}))
93
89
  }),
94
- /* @__PURE__ */ l(a, {
90
+ /* @__PURE__ */ c(a, {
95
91
  path: "vibes",
96
- element: $("vibecontrols.vibes", /* @__PURE__ */ l(_, {}))
92
+ element: $("vibecontrols.vibes", /* @__PURE__ */ c(_, {}))
97
93
  }),
98
- /* @__PURE__ */ l(a, {
94
+ /* @__PURE__ */ c(a, {
99
95
  path: "vibes/new",
100
- element: /* @__PURE__ */ l(i, {
96
+ element: /* @__PURE__ */ c(i, {
101
97
  to: "../vibes?create=true",
102
98
  replace: !0
103
99
  })
104
100
  }),
105
- /* @__PURE__ */ l(a, {
101
+ /* @__PURE__ */ c(a, {
106
102
  path: "vibes/:id",
107
- element: $("vibecontrols.vibes", /* @__PURE__ */ l(v, {}))
103
+ element: $("vibecontrols.vibes", /* @__PURE__ */ c(v, {}))
108
104
  }),
109
- /* @__PURE__ */ l(a, {
105
+ /* @__PURE__ */ c(a, {
110
106
  path: "vibes/:id/docs/*",
111
- element: $("vibecontrols.vibes", /* @__PURE__ */ l(P, {}))
107
+ element: $("vibecontrols.vibes", /* @__PURE__ */ c(P, {}))
112
108
  }),
113
- /* @__PURE__ */ l(a, {
109
+ /* @__PURE__ */ c(a, {
114
110
  path: "notes/:id",
115
- element: $("vibecontrols.vibes", /* @__PURE__ */ l(y, {}))
111
+ element: $("vibecontrols.vibes", /* @__PURE__ */ c(y, {}))
116
112
  }),
117
- /* @__PURE__ */ l(a, {
113
+ /* @__PURE__ */ c(a, {
118
114
  path: "sessions/:id",
119
- element: $("vibecontrols.sessions", /* @__PURE__ */ l(g, {}))
115
+ element: $("vibecontrols.sessions", /* @__PURE__ */ c(g, {}))
120
116
  }),
121
- /* @__PURE__ */ l(a, {
117
+ /* @__PURE__ */ c(a, {
122
118
  path: "ai",
123
- element: $("vibecontrols.ai", /* @__PURE__ */ l(J, {}))
119
+ element: $("vibecontrols.ai", /* @__PURE__ */ c(q, {}))
124
120
  }),
125
- /* @__PURE__ */ l(a, {
121
+ /* @__PURE__ */ c(a, {
126
122
  path: "ai/bookmarks",
127
- element: $("vibecontrols.ai", /* @__PURE__ */ l(Y, {}))
123
+ element: $("vibecontrols.ai", /* @__PURE__ */ c(J, {}))
128
124
  }),
129
- /* @__PURE__ */ l(a, {
125
+ /* @__PURE__ */ c(a, {
130
126
  path: "ai/:tab",
131
- element: $("vibecontrols.ai", /* @__PURE__ */ l(J, {}))
127
+ element: $("vibecontrols.ai", /* @__PURE__ */ c(q, {}))
132
128
  }),
133
- /* @__PURE__ */ l(a, {
129
+ /* @__PURE__ */ c(a, {
134
130
  path: "ai/sessions/:sessionId",
135
- element: $("vibecontrols.ai", /* @__PURE__ */ l(J, {}))
131
+ element: $("vibecontrols.ai", /* @__PURE__ */ c(q, {}))
136
132
  }),
137
- /* @__PURE__ */ l(a, {
133
+ /* @__PURE__ */ c(a, {
138
134
  path: "ai-tools",
139
- element: /* @__PURE__ */ l(i, {
135
+ element: /* @__PURE__ */ c(i, {
140
136
  to: "ai/overview",
141
137
  replace: !0
142
138
  })
143
139
  }),
144
- /* @__PURE__ */ l(a, {
140
+ /* @__PURE__ */ c(a, {
145
141
  path: "ai-tools/plan",
146
- element: $("vibecontrols.ai", /* @__PURE__ */ l(K, {}))
142
+ element: $("vibecontrols.ai", /* @__PURE__ */ c(G, {}))
147
143
  }),
148
- /* @__PURE__ */ l(a, {
144
+ /* @__PURE__ */ c(a, {
149
145
  path: "ai-tools/ai",
150
- element: /* @__PURE__ */ l(i, {
146
+ element: /* @__PURE__ */ c(i, {
151
147
  to: "overview",
152
148
  replace: !0
153
149
  })
154
150
  }),
155
- /* @__PURE__ */ l(a, {
151
+ /* @__PURE__ */ c(a, {
156
152
  path: "ai-tools/ai/:tab",
157
- element: $("vibecontrols.ai", /* @__PURE__ */ l(K, {}))
153
+ element: $("vibecontrols.ai", /* @__PURE__ */ c(G, {}))
158
154
  }),
159
- /* @__PURE__ */ l(a, {
155
+ /* @__PURE__ */ c(a, {
160
156
  path: "ai-tools/:tab",
161
- element: /* @__PURE__ */ l(ne, {})
157
+ element: /* @__PURE__ */ c(Q, {})
162
158
  }),
163
- /* @__PURE__ */ l(a, {
159
+ /* @__PURE__ */ c(a, {
164
160
  path: "ai-tools/sessions/:sessionId",
165
- element: $("vibecontrols.ai", /* @__PURE__ */ l(q, {}))
161
+ element: $("vibecontrols.ai", /* @__PURE__ */ c(K, {}))
166
162
  }),
167
- /* @__PURE__ */ l(a, {
163
+ /* @__PURE__ */ c(a, {
168
164
  path: "targets",
169
- element: /* @__PURE__ */ l(i, {
165
+ element: /* @__PURE__ */ c(i, {
170
166
  to: "../agents?tab=targets",
171
167
  replace: !0
172
168
  })
173
169
  }),
174
- /* @__PURE__ */ l(a, {
170
+ /* @__PURE__ */ c(a, {
175
171
  path: "targets/:id",
176
- element: $("vibecontrols.agents", /* @__PURE__ */ l(m, {}))
172
+ element: $("vibecontrols.agents", /* @__PURE__ */ c(m, {}))
177
173
  }),
178
- /* @__PURE__ */ l(a, {
174
+ /* @__PURE__ */ c(a, {
179
175
  path: "agent-graph",
180
- element: /* @__PURE__ */ l(i, {
176
+ element: /* @__PURE__ */ c(i, {
181
177
  to: "../agents?tab=graph",
182
178
  replace: !0
183
179
  })
184
180
  }),
185
- /* @__PURE__ */ l(a, {
181
+ /* @__PURE__ */ c(a, {
186
182
  path: "catalogs",
187
- element: $("vibecontrols.catalogs", /* @__PURE__ */ l(I, {}))
183
+ element: $("vibecontrols.catalogs", /* @__PURE__ */ c(I, {}))
188
184
  }),
189
- /* @__PURE__ */ l(a, {
185
+ /* @__PURE__ */ c(a, {
190
186
  path: "catalogs/:id",
191
- element: $("vibecontrols.catalogs", /* @__PURE__ */ l(L, {}))
187
+ element: $("vibecontrols.catalogs", /* @__PURE__ */ c(L, {}))
192
188
  }),
193
- /* @__PURE__ */ l(a, {
189
+ /* @__PURE__ */ c(a, {
194
190
  path: "catalogs/:id/docs/*",
195
- element: $("vibecontrols.catalogs", /* @__PURE__ */ l(R, {}))
191
+ element: $("vibecontrols.catalogs", /* @__PURE__ */ c(R, {}))
196
192
  }),
197
- /* @__PURE__ */ l(a, {
193
+ /* @__PURE__ */ c(a, {
198
194
  path: "components",
199
- element: $("vibecontrols.components", /* @__PURE__ */ l(z, {}))
195
+ element: $("vibecontrols.components", /* @__PURE__ */ c(z, {}))
200
196
  }),
201
- /* @__PURE__ */ l(a, {
197
+ /* @__PURE__ */ c(a, {
202
198
  path: "components/:id",
203
- element: $("vibecontrols.components", /* @__PURE__ */ l(B, {}))
199
+ element: $("vibecontrols.components", /* @__PURE__ */ c(B, {}))
204
200
  }),
205
- /* @__PURE__ */ l(a, {
201
+ /* @__PURE__ */ c(a, {
206
202
  path: "components/:id/docs/*",
207
- element: $("vibecontrols.components", /* @__PURE__ */ l(V, {}))
203
+ element: $("vibecontrols.components", /* @__PURE__ */ c(V, {}))
208
204
  }),
209
- /* @__PURE__ */ l(a, {
205
+ /* @__PURE__ */ c(a, {
210
206
  path: "templates",
211
- element: $("vibecontrols.templates", /* @__PURE__ */ l(H, {}))
207
+ element: $("vibecontrols.templates", /* @__PURE__ */ c(H, {}))
212
208
  }),
213
- /* @__PURE__ */ l(a, {
209
+ /* @__PURE__ */ c(a, {
214
210
  path: "templates/:id",
215
- element: $("vibecontrols.templates", /* @__PURE__ */ l(U, {}))
211
+ element: $("vibecontrols.templates", /* @__PURE__ */ c(U, {}))
216
212
  }),
217
- /* @__PURE__ */ l(a, {
213
+ /* @__PURE__ */ c(a, {
218
214
  path: "actions",
219
- element: $("vibecontrols.actions", /* @__PURE__ */ l(j, {}))
215
+ element: $("vibecontrols.actions", /* @__PURE__ */ c(j, {}))
220
216
  }),
221
- /* @__PURE__ */ l(a, {
217
+ /* @__PURE__ */ c(a, {
222
218
  path: "vibedeck",
223
- element: $("vibecontrols.vibedeck", /* @__PURE__ */ l(D, {}))
219
+ element: $("vibecontrols.vibedeck", /* @__PURE__ */ c(D, {}))
224
220
  }),
225
- /* @__PURE__ */ l(a, {
221
+ /* @__PURE__ */ c(a, {
226
222
  path: "calendar",
227
- element: $("vibecontrols.calendar", /* @__PURE__ */ l(k, {}))
223
+ element: $("vibecontrols.calendar", /* @__PURE__ */ c(k, {}))
228
224
  }),
229
- /* @__PURE__ */ l(a, {
225
+ /* @__PURE__ */ c(a, {
230
226
  path: "calendar/:viewType",
231
- element: $("vibecontrols.calendar", /* @__PURE__ */ l(k, {}))
227
+ element: $("vibecontrols.calendar", /* @__PURE__ */ c(k, {}))
232
228
  }),
233
- /* @__PURE__ */ l(a, {
229
+ /* @__PURE__ */ c(a, {
234
230
  path: "calendar/task/:taskId",
235
- element: $("vibecontrols.calendar", /* @__PURE__ */ l(A, {}))
231
+ element: $("vibecontrols.calendar", /* @__PURE__ */ c(A, {}))
236
232
  }),
237
- /* @__PURE__ */ l(a, {
233
+ /* @__PURE__ */ c(a, {
238
234
  path: "calendar/scheduled-job/:jobId",
239
- element: $("vibecontrols.calendar", /* @__PURE__ */ l(te, {}))
235
+ element: $("vibecontrols.calendar", /* @__PURE__ */ c(te, {}))
240
236
  }),
241
- /* @__PURE__ */ l(a, {
237
+ /* @__PURE__ */ c(a, {
242
238
  path: "webhooks",
243
- element: /* @__PURE__ */ l(i, {
239
+ element: /* @__PURE__ */ c(i, {
244
240
  to: "/devportal/webhooks",
245
241
  replace: !0
246
242
  })
247
243
  }),
248
- /* @__PURE__ */ l(a, {
244
+ /* @__PURE__ */ c(a, {
249
245
  path: "webhooks/new",
250
- element: /* @__PURE__ */ l(i, {
246
+ element: /* @__PURE__ */ c(i, {
251
247
  to: "/devportal/webhooks/new",
252
248
  replace: !0
253
249
  })
254
250
  }),
255
- /* @__PURE__ */ l(a, {
251
+ /* @__PURE__ */ c(a, {
256
252
  path: "webhooks/:id",
257
- element: /* @__PURE__ */ l(i, {
253
+ element: /* @__PURE__ */ c(i, {
258
254
  to: "/devportal/webhooks",
259
255
  replace: !0
260
256
  })
261
257
  }),
262
- /* @__PURE__ */ l(a, {
258
+ /* @__PURE__ */ c(a, {
263
259
  path: "gitops",
264
- element: /* @__PURE__ */ l(i, {
260
+ element: /* @__PURE__ */ c(i, {
265
261
  to: "../vibes",
266
262
  replace: !0
267
263
  })
268
264
  }),
269
- /* @__PURE__ */ l(a, {
265
+ /* @__PURE__ */ c(a, {
270
266
  path: "gitops/:tab",
271
- element: /* @__PURE__ */ l(i, {
267
+ element: /* @__PURE__ */ c(i, {
272
268
  to: "../vibes",
273
269
  replace: !0
274
270
  })
275
271
  }),
276
- /* @__PURE__ */ l(a, {
272
+ /* @__PURE__ */ c(a, {
277
273
  path: "tunnels",
278
- element: $("vibecontrols.tunnels", /* @__PURE__ */ l(b, {}))
274
+ element: $("vibecontrols.tunnels", /* @__PURE__ */ c(b, {}))
279
275
  }),
280
- /* @__PURE__ */ l(a, {
276
+ /* @__PURE__ */ c(a, {
281
277
  path: "tunnels/new",
282
- element: $("vibecontrols.tunnels", /* @__PURE__ */ l(S, {}))
278
+ element: $("vibecontrols.tunnels", /* @__PURE__ */ c(S, {}))
283
279
  }),
284
- /* @__PURE__ */ l(a, {
280
+ /* @__PURE__ */ c(a, {
285
281
  path: "tunnels/:tunnelId",
286
- element: $("vibecontrols.tunnels", /* @__PURE__ */ l(x, {}))
282
+ element: $("vibecontrols.tunnels", /* @__PURE__ */ c(x, {}))
287
283
  }),
288
- /* @__PURE__ */ l(a, {
284
+ /* @__PURE__ */ c(a, {
289
285
  path: "health",
290
- element: $("vibecontrols.health", /* @__PURE__ */ l(w, {}))
286
+ element: $("vibecontrols.health", /* @__PURE__ */ c(w, {}))
291
287
  }),
292
- /* @__PURE__ */ l(a, {
288
+ /* @__PURE__ */ c(a, {
293
289
  path: "analytics",
294
- element: $("vibecontrols.analytics", /* @__PURE__ */ l(N, {}))
290
+ element: $("vibecontrols.analytics", /* @__PURE__ */ c(N, {}))
295
291
  }),
296
- /* @__PURE__ */ l(a, {
292
+ /* @__PURE__ */ c(a, {
297
293
  path: "audit",
298
- element: $("vibecontrols.audit-log", /* @__PURE__ */ l(M, {}), !1)
294
+ element: $("vibecontrols.audit-log", /* @__PURE__ */ c(M, {}), !1)
299
295
  }),
300
- /* @__PURE__ */ l(a, {
296
+ /* @__PURE__ */ c(a, {
301
297
  path: "logs",
302
- element: $("vibecontrols.agents", /* @__PURE__ */ l(F, {}))
298
+ element: $("vibecontrols.agents", /* @__PURE__ */ c(F, {}))
303
299
  }),
304
- /* @__PURE__ */ l(a, {
300
+ /* @__PURE__ */ c(a, {
305
301
  path: "settings",
306
- element: $("vibecontrols.settings", /* @__PURE__ */ l(C, {}))
302
+ element: $("vibecontrols.settings", /* @__PURE__ */ c(C, {}))
307
303
  }),
308
- /* @__PURE__ */ l(a, {
304
+ /* @__PURE__ */ c(a, {
309
305
  path: "getting-started",
310
- element: /* @__PURE__ */ l(T, {})
306
+ element: /* @__PURE__ */ c(T, {})
311
307
  }),
312
- /* @__PURE__ */ l(a, {
308
+ /* @__PURE__ */ c(a, {
313
309
  path: "share/:token",
314
- element: /* @__PURE__ */ l(E, {})
310
+ element: /* @__PURE__ */ c(E, {})
315
311
  }),
316
- /* @__PURE__ */ l(a, {
312
+ /* @__PURE__ */ c(a, {
317
313
  path: "deck/:token",
318
- element: /* @__PURE__ */ l(O, {})
314
+ element: /* @__PURE__ */ c(O, {})
319
315
  }),
320
- /* @__PURE__ */ l(a, {
316
+ /* @__PURE__ */ c(a, {
321
317
  path: "access",
322
- element: /* @__PURE__ */ l(i, {
318
+ element: /* @__PURE__ */ c(i, {
323
319
  to: "../agents?tab=targets",
324
320
  replace: !0
325
321
  })
326
322
  }),
327
- /* @__PURE__ */ l(a, {
323
+ /* @__PURE__ */ c(a, {
328
324
  path: "ssh-targets",
329
- element: /* @__PURE__ */ l(i, {
325
+ element: /* @__PURE__ */ c(i, {
330
326
  to: "../agents?tab=targets",
331
327
  replace: !0
332
328
  })
333
329
  }),
334
- /* @__PURE__ */ l(a, {
330
+ /* @__PURE__ */ c(a, {
335
331
  path: "ssh-terminals",
336
- element: /* @__PURE__ */ l(i, {
332
+ element: /* @__PURE__ */ c(i, {
337
333
  to: "../agents?tab=targets",
338
334
  replace: !0
339
335
  })
340
336
  }),
341
- /* @__PURE__ */ l(a, {
337
+ /* @__PURE__ */ c(a, {
342
338
  path: "*",
343
- element: /* @__PURE__ */ l(i, {
339
+ element: /* @__PURE__ */ c(i, {
344
340
  to: "",
345
341
  replace: !0
346
342
  })
@@ -349,6 +345,6 @@ function ie() {
349
345
  });
350
346
  }
351
347
  //#endregion
352
- export { ie as VibeControlsRoutes };
348
+ export { re as VibeControlsRoutes };
353
349
 
354
350
  //# sourceMappingURL=VibeControlsRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VibeControlsRoutes.js","names":[],"sources":["../src/VibeControlsRoutes.tsx"],"sourcesContent":["import React, { Suspense, useEffect } from 'react';\nimport { Navigate, Route, Routes, useLocation, useParams } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTr } from './shared/hooks/useTr';\n\n// Lazy load - All pages (required for @/ alias resolution when consumed by host app)\nconst OverviewPage = React.lazy(() =>\n import('./pages/OverviewPage').then((m) => ({ default: m.OverviewPage }))\n);\n\n// Other pages\nconst AgentsLandingPage = React.lazy(() =>\n import('./pages/AgentsLandingPage').then((m) => ({ default: m.AgentsLandingPage }))\n);\nconst AgentDetailsPage = React.lazy(() =>\n import('./pages/AgentDetailsPage').then((m) => ({ default: m.AgentDetailsPage }))\n);\nconst TargetDetailsPage = React.lazy(() =>\n import('./pages/TargetDetailsPage').then((m) => ({ default: m.TargetDetailsPage }))\n);\nconst SessionsPage = React.lazy(() =>\n import('./pages/SessionsPage').then((m) => ({ default: m.SessionsPage }))\n);\nconst SessionDetailsPage = React.lazy(() =>\n import('./pages/SessionDetailsPage').then((m) => ({ default: m.SessionDetailsPage }))\n);\nconst VibesPage = React.lazy(() =>\n import('./pages/VibesPage').then((m) => ({ default: m.VibesPage }))\n);\nconst VibeDetailsPage = React.lazy(() =>\n import('./pages/VibeDetailsPage').then((m) => ({ default: m.VibeDetailsPage }))\n);\nconst NoteDetailsPage = React.lazy(() =>\n import('./pages/NoteDetailsPage').then((m) => ({ default: m.NoteDetailsPage }))\n);\nconst TunnelsLandingPage = React.lazy(() =>\n import('./pages/TunnelsLandingPage').then((m) => ({ default: m.TunnelsLandingPage }))\n);\nconst TunnelDetailsPage = React.lazy(() =>\n import('./pages/tunnels/TunnelDetailsPage').then((m) => ({ default: m.TunnelDetailsPage }))\n);\nconst TunnelCreateWizard = React.lazy(() =>\n import('./components/tunnels/TunnelCreateWizard').then((m) => ({ default: m.TunnelCreateWizard }))\n);\nconst SettingsPage = React.lazy(() =>\n import('./pages/SettingsPage').then((m) => ({ default: m.SettingsPage }))\n);\nconst HealthPage = React.lazy(() =>\n import('./pages/HealthPage').then((m) => ({ default: m.HealthPage }))\n);\nconst GettingStartedPage = React.lazy(() =>\n import('./pages/GettingStartedPage').then((m) => ({ default: m.GettingStartedPage }))\n);\nconst SharedSessionPage = React.lazy(() =>\n import('./pages/SharedSessionPage').then((m) => ({ default: m.SharedSessionPage }))\n);\nconst VibeDeckPage = React.lazy(() =>\n import('./pages/VibeDeckPage').then((m) => ({ default: m.VibeDeckPage }))\n);\nconst SharedVibeDeckPage = React.lazy(() =>\n import('./pages/SharedVibeDeckPage').then((m) => ({ default: m.SharedVibeDeckPage }))\n);\nconst VibeCalendarPage = React.lazy(() =>\n import('./pages/VibeCalendarPage').then((m) => ({ default: m.VibeCalendarPage }))\n);\nconst VibeTaskDetailPage = React.lazy(() =>\n import('./pages/VibeTaskDetailPage').then((m) => ({ default: m.VibeTaskDetailPage }))\n);\nconst ScheduledJobDetailPage = React.lazy(() =>\n import('./pages/ScheduledJobDetailPage').then((m) => ({ default: m.ScheduledJobDetailPage }))\n);\nconst ActionsPage = React.lazy(() =>\n import('./pages/ActionsPage').then((m) => ({ default: m.ActionsPage }))\n);\nconst VibeAuditPage = React.lazy(() =>\n import('./pages/VibeAuditPage').then((m) => ({ default: m.VibeAuditPage }))\n);\nconst AnalyticsPage = React.lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst VibeDocsPage = React.lazy(() =>\n import('./pages/VibeDocsPage').then((m) => ({ default: m.VibeDocsPage }))\n);\nconst LogsPage = React.lazy(() =>\n import('./pages/LogsPage').then((m) => ({ default: m.LogsPage }))\n);\n\n// Catalog, Components, Templates pages\nconst CatalogPage = React.lazy(() =>\n import('./pages/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CatalogDetailPage = React.lazy(() =>\n import('./pages/CatalogDetailPage').then((m) => ({ default: m.CatalogDetailPage }))\n);\nconst CatalogDocsPage = React.lazy(() =>\n import('./pages/CatalogDocsPage').then((m) => ({ default: m.CatalogDocsPage }))\n);\nconst ComponentsPage = React.lazy(() =>\n import('./pages/ComponentsPage').then((m) => ({ default: m.ComponentsPage }))\n);\nconst ComponentDetailPage = React.lazy(() =>\n import('./pages/ComponentDetailPage').then((m) => ({ default: m.ComponentDetailPage }))\n);\nconst ComponentDocsPage = React.lazy(() =>\n import('./pages/ComponentDocsPage').then((m) => ({ default: m.ComponentDocsPage }))\n);\nconst TemplatesPage = React.lazy(() =>\n import('./pages/TemplatesPage').then((m) => ({ default: m.TemplatesPage }))\n);\nconst TemplateDetailPage = React.lazy(() =>\n import('./pages/TemplateDetailPage').then((m) => ({ default: m.TemplateDetailPage }))\n);\nconst PluginStandalonePage = React.lazy(() =>\n import('./pages/PluginStandalonePage').then((m) => ({ default: m.PluginStandalonePage }))\n);\nconst PluginsCatalogPage = React.lazy(() =>\n import('./pages/PluginsCatalogPage').then((m) => ({ default: m.PluginsCatalogPage }))\n);\n\n// AI pages\nconst AIPage = React.lazy(() => import('./pages/ai/AIPage').then((m) => ({ default: m.AIPage })));\nconst AISessionDetailPage = React.lazy(() =>\n import('./pages/ai/AISessionDetailPage').then((m) => ({ default: m.AISessionDetailPage }))\n);\nconst AgentManagerPage = React.lazy(() =>\n import('./pages/ai/AgentManagerPage').then((m) => ({ default: m.AgentManagerPage }))\n);\nconst AIBookmarksPage = React.lazy(() =>\n import('./pages/ai/AIBookmarksPage').then((m) => ({ default: m.AIBookmarksPage }))\n);\n\n// Loading fallback component\nfunction PageLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px]\">\n <div className=\"animate-pulse bg-muted rounded w-full h-full\" />\n </div>\n );\n}\n\n/**\n * Internal router for the VibeControls microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * Routes:\n * - / → Overview page (dashboard)\n * - /agents → Agents management page\n * - /agents/:id → Agent details page\n * - /sessions → Sessions management page\n * - /sessions/:id → Session details page\n * - /vibes → Vibes (projects) management page\n * - /vibes/:id → Vibe details page (includes Notes tab)\n * - /settings → Settings page\n * - /webhooks → Legacy redirect to Developer Portal webhooks\n * - /health → Health monitoring page\n * - /* → Catch-all redirects to overview\n */\nfunction ScrollToTop() {\n const { pathname } = useLocation();\n useEffect(() => {\n // The scrollable container is the <main> element with overflow-auto\n // inside AppShellLayout, not the window itself.\n const main = document.querySelector('main');\n if (main) main.scrollTop = 0;\n }, [pathname]);\n return null;\n}\n\n/**\n * Legacy redirect: /ai-tools/<tab> → /ai-tools/ai/<tab>.\n *\n * Before the Plan / AI mode toggle the page was reachable directly at\n * /ai-tools/<tab>. New shape is /ai-tools/<mode>/<tab>. We keep the\n * legacy links working by mapping the captured `:tab` param: if it\n * resolves to a known AI sub-tab, redirect there; if it's literally\n * \"plan\", route to the Plan page; otherwise fall back to AI overview.\n */\nconst VALID_AI_TABS = new Set<string>([\n 'overview',\n 'templates',\n 'contexts',\n 'prompts',\n 'sessions',\n 'tasks',\n 'stats',\n 'playground',\n 'config',\n]);\n\nfunction LegacyAIToolsRedirect() {\n const { tab } = useParams<{ tab?: string }>();\n if (tab === 'plan') {\n return <Navigate to=\"/vibecontrols/ai-tools/plan\" replace />;\n }\n if (tab && VALID_AI_TABS.has(tab)) {\n return <Navigate to={`/vibecontrols/ai-tools/ai/${tab}`} replace />;\n }\n return <Navigate to=\"/vibecontrols/ai-tools/ai/overview\" replace />;\n}\n\n/**\n * Fallback shown when a feature flag is OFF.\n */\nfunction FeatureDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px] text-text-secondary text-sm\">\n {tr(\n 'vibecontrols.pages.featureDisabled',\n 'This feature is currently disabled. You can enable it from Feature Previews.'\n )}\n </div>\n );\n}\n\n/**\n * Helper: wraps a page element in a FeatureGate.\n * defaultValue={true} means the feature shows by default (before flags are seeded).\n * Only hides when a flag is explicitly set to false.\n */\nfunction gated(flag: string, element: React.ReactNode, defaultValue = true): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={defaultValue} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport function VibeControlsRoutes() {\n return (\n <Suspense fallback={<PageLoadingFallback />}>\n <ScrollToTop />\n <Routes>\n {/* Default route - overview page */}\n <Route index element={gated('vibecontrols.overview', <OverviewPage />)} />\n\n {/* Core pages */}\n {/* PR-9 standalone plugin route — deep-link any contribution\n from any mount point as a full-page view. Wrapped in the\n same `gated()` envelope as every other authenticated route\n for consistent authz; the page-level\n `vibes.tabs.iframe-host` feature flag still gates rendering\n once the user is past the entitlement check. */}\n <Route\n path=\"plugin/:pluginKey\"\n element={gated('vibecontrols.vibes', <PluginStandalonePage />)}\n />\n {/* Plugins catalog — searchable grid of every published plugin. */}\n <Route path=\"plugins\" element={gated('vibecontrols.vibes', <PluginsCatalogPage />)} />\n\n <Route path=\"agents\" element={gated('vibecontrols.agents', <AgentsLandingPage />)} />\n <Route path=\"agents/new\" element={<Navigate to=\"../agents?create=true\" replace />} />\n <Route path=\"agents/:id\" element={gated('vibecontrols.agents', <AgentDetailsPage />)} />\n <Route path=\"sessions\" element={gated('vibecontrols.sessions', <SessionsPage />)} />\n <Route path=\"vibes\" element={gated('vibecontrols.vibes', <VibesPage />)} />\n <Route path=\"vibes/new\" element={<Navigate to=\"../vibes?create=true\" replace />} />\n <Route path=\"vibes/:id\" element={gated('vibecontrols.vibes', <VibeDetailsPage />)} />\n <Route path=\"vibes/:id/docs/*\" element={gated('vibecontrols.vibes', <VibeDocsPage />)} />\n <Route path=\"notes/:id\" element={gated('vibecontrols.vibes', <NoteDetailsPage />)} />\n <Route\n path=\"sessions/:id\"\n element={gated('vibecontrols.sessions', <SessionDetailsPage />)}\n />\n {/* Agent Manager — multi-session tabbed UI (replaces old AI page) */}\n <Route path=\"ai\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n {/* Saved messages — listed BEFORE ai/:tab so \"bookmarks\" is not consumed as a tab. */}\n <Route path=\"ai/bookmarks\" element={gated('vibecontrols.ai', <AIBookmarksPage />)} />\n <Route path=\"ai/:tab\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n <Route\n path=\"ai/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AgentManagerPage />)}\n />\n {/* AI Tools — Plan / AI modes:\n /ai-tools → /ai-tools/ai/overview (redirect)\n /ai-tools/plan → Plan mode (plannotator iframe)\n /ai-tools/ai → /ai-tools/ai/overview (redirect)\n /ai-tools/ai/:tab → AI mode with active sub-tab\n Legacy /ai-tools/<tab> URLs from before the Plan mode rollout\n redirect into the new shape via LegacyAIToolsRedirect. */}\n <Route path=\"ai-tools\" element={<Navigate to=\"ai/overview\" replace />} />\n <Route path=\"ai-tools/plan\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/ai\" element={<Navigate to=\"overview\" replace />} />\n <Route path=\"ai-tools/ai/:tab\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/:tab\" element={<LegacyAIToolsRedirect />} />\n <Route\n path=\"ai-tools/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AISessionDetailPage />)}\n />\n\n {/* Targets list lives in the Targets & Agents landing; per-target\n detail is its own page (mirrors agents/:id). */}\n <Route path=\"targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"targets/:id\" element={gated('vibecontrols.agents', <TargetDetailsPage />)} />\n {/* Agent Graph is also a tab inside the Targets & Agents landing. */}\n <Route path=\"agent-graph\" element={<Navigate to=\"../agents?tab=graph\" replace />} />\n\n {/* Catalog */}\n <Route path=\"catalogs\" element={gated('vibecontrols.catalogs', <CatalogPage />)} />\n <Route\n path=\"catalogs/:id\"\n element={gated('vibecontrols.catalogs', <CatalogDetailPage />)}\n />\n <Route\n path=\"catalogs/:id/docs/*\"\n element={gated('vibecontrols.catalogs', <CatalogDocsPage />)}\n />\n <Route path=\"components\" element={gated('vibecontrols.components', <ComponentsPage />)} />\n <Route\n path=\"components/:id\"\n element={gated('vibecontrols.components', <ComponentDetailPage />)}\n />\n <Route\n path=\"components/:id/docs/*\"\n element={gated('vibecontrols.components', <ComponentDocsPage />)}\n />\n <Route path=\"templates\" element={gated('vibecontrols.templates', <TemplatesPage />)} />\n <Route\n path=\"templates/:id\"\n element={gated('vibecontrols.templates', <TemplateDetailPage />)}\n />\n\n {/* Automation */}\n <Route path=\"actions\" element={gated('vibecontrols.actions', <ActionsPage />)} />\n <Route path=\"vibedeck\" element={gated('vibecontrols.vibedeck', <VibeDeckPage />)} />\n <Route path=\"calendar\" element={gated('vibecontrols.calendar', <VibeCalendarPage />)} />\n <Route\n path=\"calendar/:viewType\"\n element={gated('vibecontrols.calendar', <VibeCalendarPage />)}\n />\n <Route\n path=\"calendar/task/:taskId\"\n element={gated('vibecontrols.calendar', <VibeTaskDetailPage />)}\n />\n {/* ScheduledJob (wspace-scheduler-svc) — separate id space\n from VibeCalendarTask above, so it needs its own route. */}\n <Route\n path=\"calendar/scheduled-job/:jobId\"\n element={gated('vibecontrols.calendar', <ScheduledJobDetailPage />)}\n />\n <Route path=\"webhooks\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n <Route path=\"webhooks/new\" element={<Navigate to=\"/devportal/webhooks/new\" replace />} />\n <Route path=\"webhooks/:id\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n {/* GitOps consolidated into Vibe detail tab — old /gitops routes redirect to vibes list. */}\n <Route path=\"gitops\" element={<Navigate to=\"../vibes\" replace />} />\n <Route path=\"gitops/:tab\" element={<Navigate to=\"../vibes\" replace />} />\n\n {/* Infrastructure */}\n <Route path=\"tunnels\" element={gated('vibecontrols.tunnels', <TunnelsLandingPage />)} />\n <Route path=\"tunnels/new\" element={gated('vibecontrols.tunnels', <TunnelCreateWizard />)} />\n <Route\n path=\"tunnels/:tunnelId\"\n element={gated('vibecontrols.tunnels', <TunnelDetailsPage />)}\n />\n\n {/* Insights */}\n <Route path=\"health\" element={gated('vibecontrols.health', <HealthPage />)} />\n <Route path=\"analytics\" element={gated('vibecontrols.analytics', <AnalyticsPage />)} />\n <Route path=\"audit\" element={gated('vibecontrols.audit-log', <VibeAuditPage />, false)} />\n <Route path=\"logs\" element={gated('vibecontrols.agents', <LogsPage />)} />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated('vibecontrols.settings', <SettingsPage />)} />\n\n {/* Setup */}\n {/* Not gated — onboarding flow must always be reachable */}\n <Route path=\"getting-started\" element={<GettingStartedPage />} />\n\n {/* Shared public routes (no gating — accessible via public links) */}\n <Route path=\"share/:token\" element={<SharedSessionPage />} />\n <Route path=\"deck/:token\" element={<SharedVibeDeckPage />} />\n\n {/* Legacy redirects */}\n <Route path=\"access\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-terminals\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n\n {/* Catch-all route - redirect to overview */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VibeControlsRoutes.js","names":[],"sources":["../src/VibeControlsRoutes.tsx"],"sourcesContent":["import React, { Suspense, useEffect } from 'react';\nimport { Navigate, Route, Routes, useLocation, useParams } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTr } from './shared/hooks/useTr';\n\n// Lazy load - All pages (required for @/ alias resolution when consumed by host app)\nconst OverviewPage = React.lazy(() =>\n import('./pages/OverviewPage').then((m) => ({ default: m.OverviewPage }))\n);\n\n// Other pages\nconst AgentsLandingPage = React.lazy(() =>\n import('./pages/AgentsLandingPage').then((m) => ({ default: m.AgentsLandingPage }))\n);\nconst AgentDetailsPage = React.lazy(() =>\n import('./pages/AgentDetailsPage').then((m) => ({ default: m.AgentDetailsPage }))\n);\nconst TargetDetailsPage = React.lazy(() =>\n import('./pages/TargetDetailsPage').then((m) => ({ default: m.TargetDetailsPage }))\n);\nconst SessionsPage = React.lazy(() =>\n import('./pages/SessionsPage').then((m) => ({ default: m.SessionsPage }))\n);\nconst SessionDetailsPage = React.lazy(() =>\n import('./pages/SessionDetailsPage').then((m) => ({ default: m.SessionDetailsPage }))\n);\nconst VibesPage = React.lazy(() =>\n import('./pages/VibesPage').then((m) => ({ default: m.VibesPage }))\n);\nconst VibeDetailsPage = React.lazy(() =>\n import('./pages/VibeDetailsPage').then((m) => ({ default: m.VibeDetailsPage }))\n);\nconst NoteDetailsPage = React.lazy(() =>\n import('./pages/NoteDetailsPage').then((m) => ({ default: m.NoteDetailsPage }))\n);\nconst TunnelsLandingPage = React.lazy(() =>\n import('./pages/TunnelsLandingPage').then((m) => ({ default: m.TunnelsLandingPage }))\n);\nconst TunnelDetailsPage = React.lazy(() =>\n import('./pages/tunnels/TunnelDetailsPage').then((m) => ({ default: m.TunnelDetailsPage }))\n);\nconst TunnelCreateWizard = React.lazy(() =>\n import('./components/tunnels/TunnelCreateWizard').then((m) => ({ default: m.TunnelCreateWizard }))\n);\nconst SettingsPage = React.lazy(() =>\n import('./pages/SettingsPage').then((m) => ({ default: m.SettingsPage }))\n);\nconst HealthPage = React.lazy(() =>\n import('./pages/HealthPage').then((m) => ({ default: m.HealthPage }))\n);\nconst GettingStartedPage = React.lazy(() =>\n import('./pages/GettingStartedPage').then((m) => ({ default: m.GettingStartedPage }))\n);\nconst SharedSessionPage = React.lazy(() =>\n import('./pages/SharedSessionPage').then((m) => ({ default: m.SharedSessionPage }))\n);\nconst VibeDeckPage = React.lazy(() =>\n import('./pages/VibeDeckPage').then((m) => ({ default: m.VibeDeckPage }))\n);\nconst SharedVibeDeckPage = React.lazy(() =>\n import('./pages/SharedVibeDeckPage').then((m) => ({ default: m.SharedVibeDeckPage }))\n);\nconst VibeCalendarPage = React.lazy(() =>\n import('./pages/VibeCalendarPage').then((m) => ({ default: m.VibeCalendarPage }))\n);\nconst VibeTaskDetailPage = React.lazy(() =>\n import('./pages/VibeTaskDetailPage').then((m) => ({ default: m.VibeTaskDetailPage }))\n);\nconst ScheduledJobDetailPage = React.lazy(() =>\n import('./pages/ScheduledJobDetailPage').then((m) => ({ default: m.ScheduledJobDetailPage }))\n);\nconst ActionsPage = React.lazy(() =>\n import('./pages/ActionsPage').then((m) => ({ default: m.ActionsPage }))\n);\nconst VibeAuditPage = React.lazy(() =>\n import('./pages/VibeAuditPage').then((m) => ({ default: m.VibeAuditPage }))\n);\nconst AnalyticsPage = React.lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst VibeDocsPage = React.lazy(() =>\n import('./pages/VibeDocsPage').then((m) => ({ default: m.VibeDocsPage }))\n);\nconst LogsPage = React.lazy(() =>\n import('./pages/LogsPage').then((m) => ({ default: m.LogsPage }))\n);\n\n// Catalog, Components, Templates pages\nconst CatalogPage = React.lazy(() =>\n import('./pages/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CatalogDetailPage = React.lazy(() =>\n import('./pages/CatalogDetailPage').then((m) => ({ default: m.CatalogDetailPage }))\n);\nconst CatalogDocsPage = React.lazy(() =>\n import('./pages/CatalogDocsPage').then((m) => ({ default: m.CatalogDocsPage }))\n);\nconst ComponentsPage = React.lazy(() =>\n import('./pages/ComponentsPage').then((m) => ({ default: m.ComponentsPage }))\n);\nconst ComponentDetailPage = React.lazy(() =>\n import('./pages/ComponentDetailPage').then((m) => ({ default: m.ComponentDetailPage }))\n);\nconst ComponentDocsPage = React.lazy(() =>\n import('./pages/ComponentDocsPage').then((m) => ({ default: m.ComponentDocsPage }))\n);\nconst TemplatesPage = React.lazy(() =>\n import('./pages/TemplatesPage').then((m) => ({ default: m.TemplatesPage }))\n);\nconst TemplateDetailPage = React.lazy(() =>\n import('./pages/TemplateDetailPage').then((m) => ({ default: m.TemplateDetailPage }))\n);\nconst PluginsCatalogPage = React.lazy(() =>\n import('./pages/PluginsCatalogPage').then((m) => ({ default: m.PluginsCatalogPage }))\n);\n\n// AI pages\nconst AIPage = React.lazy(() => import('./pages/ai/AIPage').then((m) => ({ default: m.AIPage })));\nconst AISessionDetailPage = React.lazy(() =>\n import('./pages/ai/AISessionDetailPage').then((m) => ({ default: m.AISessionDetailPage }))\n);\nconst AgentManagerPage = React.lazy(() =>\n import('./pages/ai/AgentManagerPage').then((m) => ({ default: m.AgentManagerPage }))\n);\nconst AIBookmarksPage = React.lazy(() =>\n import('./pages/ai/AIBookmarksPage').then((m) => ({ default: m.AIBookmarksPage }))\n);\n\n// Loading fallback component\nfunction PageLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px]\">\n <div className=\"animate-pulse bg-muted rounded w-full h-full\" />\n </div>\n );\n}\n\n/**\n * Internal router for the VibeControls microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * Routes:\n * - / → Overview page (dashboard)\n * - /agents → Agents management page\n * - /agents/:id → Agent details page\n * - /sessions → Sessions management page\n * - /sessions/:id → Session details page\n * - /vibes → Vibes (projects) management page\n * - /vibes/:id → Vibe details page (includes Notes tab)\n * - /settings → Settings page\n * - /webhooks → Legacy redirect to Developer Portal webhooks\n * - /health → Health monitoring page\n * - /* → Catch-all redirects to overview\n */\nfunction ScrollToTop() {\n const { pathname } = useLocation();\n useEffect(() => {\n // The scrollable container is the <main> element with overflow-auto\n // inside AppShellLayout, not the window itself.\n const main = document.querySelector('main');\n if (main) main.scrollTop = 0;\n }, [pathname]);\n return null;\n}\n\n/**\n * Legacy redirect: /ai-tools/<tab> → /ai-tools/ai/<tab>.\n *\n * Before the Plan / AI mode toggle the page was reachable directly at\n * /ai-tools/<tab>. New shape is /ai-tools/<mode>/<tab>. We keep the\n * legacy links working by mapping the captured `:tab` param: if it\n * resolves to a known AI sub-tab, redirect there; if it's literally\n * \"plan\", route to the Plan page; otherwise fall back to AI overview.\n */\nconst VALID_AI_TABS = new Set<string>([\n 'overview',\n 'templates',\n 'contexts',\n 'prompts',\n 'sessions',\n 'tasks',\n 'stats',\n 'playground',\n 'config',\n]);\n\nfunction LegacyAIToolsRedirect() {\n const { tab } = useParams<{ tab?: string }>();\n if (tab === 'plan') {\n return <Navigate to=\"/vibecontrols/ai-tools/plan\" replace />;\n }\n if (tab && VALID_AI_TABS.has(tab)) {\n return <Navigate to={`/vibecontrols/ai-tools/ai/${tab}`} replace />;\n }\n return <Navigate to=\"/vibecontrols/ai-tools/ai/overview\" replace />;\n}\n\n/**\n * Fallback shown when a feature flag is OFF.\n */\nfunction FeatureDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px] text-text-secondary text-sm\">\n {tr(\n 'vibecontrols.pages.featureDisabled',\n 'This feature is currently disabled. You can enable it from Feature Previews.'\n )}\n </div>\n );\n}\n\n/**\n * Helper: wraps a page element in a FeatureGate.\n * defaultValue={true} means the feature shows by default (before flags are seeded).\n * Only hides when a flag is explicitly set to false.\n */\nfunction gated(flag: string, element: React.ReactNode, defaultValue = true): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={defaultValue} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport function VibeControlsRoutes() {\n return (\n <Suspense fallback={<PageLoadingFallback />}>\n <ScrollToTop />\n <Routes>\n {/* Default route - overview page */}\n <Route index element={gated('vibecontrols.overview', <OverviewPage />)} />\n\n {/* Core pages */}\n {/* Plugins catalog — searchable grid of every published plugin. */}\n <Route path=\"plugins\" element={gated('vibecontrols.vibes', <PluginsCatalogPage />)} />\n\n <Route path=\"agents\" element={gated('vibecontrols.agents', <AgentsLandingPage />)} />\n <Route path=\"agents/new\" element={<Navigate to=\"../agents?create=true\" replace />} />\n <Route path=\"agents/:id\" element={gated('vibecontrols.agents', <AgentDetailsPage />)} />\n <Route path=\"sessions\" element={gated('vibecontrols.sessions', <SessionsPage />)} />\n <Route path=\"vibes\" element={gated('vibecontrols.vibes', <VibesPage />)} />\n <Route path=\"vibes/new\" element={<Navigate to=\"../vibes?create=true\" replace />} />\n <Route path=\"vibes/:id\" element={gated('vibecontrols.vibes', <VibeDetailsPage />)} />\n <Route path=\"vibes/:id/docs/*\" element={gated('vibecontrols.vibes', <VibeDocsPage />)} />\n <Route path=\"notes/:id\" element={gated('vibecontrols.vibes', <NoteDetailsPage />)} />\n <Route\n path=\"sessions/:id\"\n element={gated('vibecontrols.sessions', <SessionDetailsPage />)}\n />\n {/* Agent Manager — multi-session tabbed UI (replaces old AI page) */}\n <Route path=\"ai\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n {/* Saved messages — listed BEFORE ai/:tab so \"bookmarks\" is not consumed as a tab. */}\n <Route path=\"ai/bookmarks\" element={gated('vibecontrols.ai', <AIBookmarksPage />)} />\n <Route path=\"ai/:tab\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n <Route\n path=\"ai/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AgentManagerPage />)}\n />\n {/* AI Tools — Plan / AI modes:\n /ai-tools → /ai-tools/ai/overview (redirect)\n /ai-tools/plan → Plan mode (plannotator iframe)\n /ai-tools/ai → /ai-tools/ai/overview (redirect)\n /ai-tools/ai/:tab → AI mode with active sub-tab\n Legacy /ai-tools/<tab> URLs from before the Plan mode rollout\n redirect into the new shape via LegacyAIToolsRedirect. */}\n <Route path=\"ai-tools\" element={<Navigate to=\"ai/overview\" replace />} />\n <Route path=\"ai-tools/plan\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/ai\" element={<Navigate to=\"overview\" replace />} />\n <Route path=\"ai-tools/ai/:tab\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/:tab\" element={<LegacyAIToolsRedirect />} />\n <Route\n path=\"ai-tools/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AISessionDetailPage />)}\n />\n\n {/* Targets list lives in the Targets & Agents landing; per-target\n detail is its own page (mirrors agents/:id). */}\n <Route path=\"targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"targets/:id\" element={gated('vibecontrols.agents', <TargetDetailsPage />)} />\n {/* Agent Graph is also a tab inside the Targets & Agents landing. */}\n <Route path=\"agent-graph\" element={<Navigate to=\"../agents?tab=graph\" replace />} />\n\n {/* Catalog */}\n <Route path=\"catalogs\" element={gated('vibecontrols.catalogs', <CatalogPage />)} />\n <Route\n path=\"catalogs/:id\"\n element={gated('vibecontrols.catalogs', <CatalogDetailPage />)}\n />\n <Route\n path=\"catalogs/:id/docs/*\"\n element={gated('vibecontrols.catalogs', <CatalogDocsPage />)}\n />\n <Route path=\"components\" element={gated('vibecontrols.components', <ComponentsPage />)} />\n <Route\n path=\"components/:id\"\n element={gated('vibecontrols.components', <ComponentDetailPage />)}\n />\n <Route\n path=\"components/:id/docs/*\"\n element={gated('vibecontrols.components', <ComponentDocsPage />)}\n />\n <Route path=\"templates\" element={gated('vibecontrols.templates', <TemplatesPage />)} />\n <Route\n path=\"templates/:id\"\n element={gated('vibecontrols.templates', <TemplateDetailPage />)}\n />\n\n {/* Automation */}\n <Route path=\"actions\" element={gated('vibecontrols.actions', <ActionsPage />)} />\n <Route path=\"vibedeck\" element={gated('vibecontrols.vibedeck', <VibeDeckPage />)} />\n <Route path=\"calendar\" element={gated('vibecontrols.calendar', <VibeCalendarPage />)} />\n <Route\n path=\"calendar/:viewType\"\n element={gated('vibecontrols.calendar', <VibeCalendarPage />)}\n />\n <Route\n path=\"calendar/task/:taskId\"\n element={gated('vibecontrols.calendar', <VibeTaskDetailPage />)}\n />\n {/* ScheduledJob (wspace-scheduler-svc) — separate id space\n from VibeCalendarTask above, so it needs its own route. */}\n <Route\n path=\"calendar/scheduled-job/:jobId\"\n element={gated('vibecontrols.calendar', <ScheduledJobDetailPage />)}\n />\n <Route path=\"webhooks\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n <Route path=\"webhooks/new\" element={<Navigate to=\"/devportal/webhooks/new\" replace />} />\n <Route path=\"webhooks/:id\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n {/* GitOps consolidated into Vibe detail tab — old /gitops routes redirect to vibes list. */}\n <Route path=\"gitops\" element={<Navigate to=\"../vibes\" replace />} />\n <Route path=\"gitops/:tab\" element={<Navigate to=\"../vibes\" replace />} />\n\n {/* Infrastructure */}\n <Route path=\"tunnels\" element={gated('vibecontrols.tunnels', <TunnelsLandingPage />)} />\n <Route path=\"tunnels/new\" element={gated('vibecontrols.tunnels', <TunnelCreateWizard />)} />\n <Route\n path=\"tunnels/:tunnelId\"\n element={gated('vibecontrols.tunnels', <TunnelDetailsPage />)}\n />\n\n {/* Insights */}\n <Route path=\"health\" element={gated('vibecontrols.health', <HealthPage />)} />\n <Route path=\"analytics\" element={gated('vibecontrols.analytics', <AnalyticsPage />)} />\n <Route path=\"audit\" element={gated('vibecontrols.audit-log', <VibeAuditPage />, false)} />\n <Route path=\"logs\" element={gated('vibecontrols.agents', <LogsPage />)} />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated('vibecontrols.settings', <SettingsPage />)} />\n\n {/* Setup */}\n {/* Not gated — onboarding flow must always be reachable */}\n <Route path=\"getting-started\" element={<GettingStartedPage />} />\n\n {/* Shared public routes (no gating — accessible via public links) */}\n <Route path=\"share/:token\" element={<SharedSessionPage />} />\n <Route path=\"deck/:token\" element={<SharedVibeDeckPage />} />\n\n {/* Legacy redirects */}\n <Route path=\"access\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-terminals\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n\n {/* Catch-all route - redirect to overview */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-vibecontrols",
3
- "version": "2026.601.1",
3
+ "version": "2026.601.2",
4
4
  "description": "VibeControls microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,151 +0,0 @@
1
- import { useListAgentsQuery as e } from "../generated/wspace-operations.js";
2
- import { useVibeControlsStore as t } from "../store/vibeControlsStore.js";
3
- import { useActiveAgentProfile as n } from "../hooks/useActiveAgentProfile.js";
4
- import { mintScopedIframeToken as r } from "../services/iframeToken.js";
5
- import { PluginIframeMount as i } from "../components/plugins/PluginIframeMount.js";
6
- import { useMemo as a } from "react";
7
- import { useParams as o, useSearchParams as s } from "react-router-dom";
8
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
9
- import { Card as u } from "@burdenoff/fe-libs/ui";
10
- import { useFeatureFlagDetails as d } from "@burdenoff/fe-libs/shared/feature-flags";
11
- import { usePluginContributions as f } from "@burdenoff/fe-libs/shared/plugins";
12
- //#region src/pages/PluginStandalonePage.tsx
13
- function p() {
14
- let { pluginKey: p } = o(), [m] = s(), h = m.get("mount") ?? "vibe.detailTab", g = d("vibes.tabs.iframe-host")?.value === !0, _ = a(() => {
15
- let e = m.get("context");
16
- if (!e) return {};
17
- try {
18
- let t = e.replace(/-/g, "+").replace(/_/g, "/"), n = t.length % 4 == 0 ? t : t + "=".repeat(4 - t.length % 4), r = atob(n), i = JSON.parse(r);
19
- return i && typeof i == "object" ? i : {};
20
- } catch {
21
- return {};
22
- }
23
- }, [m]), v = t((e) => e.activeAgentId), y = t((e) => e.defaultAgentForVibe), { data: b, loading: x } = e({ fetchPolicy: "cache-and-network" }), S = a(() => b?.vibecontrolsAgents ?? [], [b]), C = a(() => {
24
- let e = typeof _.agentId == "string" ? _.agentId : null, t = typeof _.vibeId == "string" ? _.vibeId : null;
25
- if (e) return S.find((t) => t.id === e) ?? null;
26
- if (t) {
27
- let e = y?.[t];
28
- if (e) return S.find((t) => t.id === e) ?? null;
29
- }
30
- return v ? S.find((e) => e.id === v) ?? null : S[0] ?? null;
31
- }, [
32
- S,
33
- v,
34
- y,
35
- _
36
- ]), { active: w } = n(C?.id ?? null), T = a(() => {
37
- if (!g || !C?.tunnelUrl) return [];
38
- let e = w ?? "default", t = C.id;
39
- return [{
40
- tunnelUrl: C.tunnelUrl,
41
- profile: e,
42
- label: C.name ?? C.id,
43
- mintIframeToken: async ({ pathPrefixes: n }) => r(t, e, n)
44
- }];
45
- }, [
46
- g,
47
- C,
48
- w
49
- ]), { data: E, isFetching: D } = f(T, {
50
- mountPoint: h,
51
- enabled: g && T.length > 0
52
- }), O = a(() => p ? E.find((e) => e.pluginKey === p && e.contribution.mountPoint === h) ?? null : null, [
53
- E,
54
- p,
55
- h
56
- ]);
57
- return g ? p ? x && S.length === 0 ? /* @__PURE__ */ c("div", {
58
- className: "p-6",
59
- children: /* @__PURE__ */ c(u, { children: /* @__PURE__ */ c("div", {
60
- className: "p-6 text-text-secondary",
61
- children: "Loading…"
62
- }) })
63
- }) : !C || !C.tunnelUrl ? /* @__PURE__ */ c("div", {
64
- className: "p-6",
65
- children: /* @__PURE__ */ c(u, { children: /* @__PURE__ */ l("div", {
66
- className: "p-6 text-text-secondary",
67
- children: [
68
- "No agent available to serve ",
69
- /* @__PURE__ */ c("code", { children: p }),
70
- ". Attach an agent first."
71
- ]
72
- }) })
73
- }) : D && !O ? /* @__PURE__ */ c("div", {
74
- className: "p-6",
75
- children: /* @__PURE__ */ c(u, { children: /* @__PURE__ */ l("div", {
76
- className: "p-6 text-text-secondary",
77
- children: [
78
- "Looking for ",
79
- p,
80
- "…"
81
- ]
82
- }) })
83
- }) : O ? /* @__PURE__ */ c("div", {
84
- className: "p-4 sm:p-6 h-full",
85
- children: /* @__PURE__ */ c(u, {
86
- className: "h-[80vh] min-h-[500px]",
87
- children: /* @__PURE__ */ c("div", {
88
- className: "p-0 h-full",
89
- children: /* @__PURE__ */ c(i, {
90
- contribution: O,
91
- tunnel: O.tunnel,
92
- restPaths: O.capabilities.restPaths.length > 0 ? O.capabilities.restPaths : [`/ui/${O.pluginKey}`],
93
- context: _,
94
- agentId: C.id,
95
- profile: O.tunnel.profile,
96
- theme: {
97
- colorMode: "light",
98
- tokens: {}
99
- },
100
- locale: "en",
101
- featureFlags: {},
102
- hostVersion: "1.0.0"
103
- })
104
- })
105
- })
106
- }) : /* @__PURE__ */ c("div", {
107
- className: "p-6",
108
- children: /* @__PURE__ */ c(u, { children: /* @__PURE__ */ l("div", {
109
- className: "p-6 text-status-error-text",
110
- children: [
111
- "Plugin ",
112
- /* @__PURE__ */ c("code", {
113
- className: "font-mono",
114
- children: p
115
- }),
116
- " doesn't contribute to mount",
117
- /* @__PURE__ */ l("code", {
118
- className: "font-mono",
119
- children: [" ", h]
120
- }),
121
- " on agent",
122
- " ",
123
- C.name ?? C.id,
124
- "."
125
- ]
126
- }) })
127
- }) : /* @__PURE__ */ c("div", {
128
- className: "p-6",
129
- children: /* @__PURE__ */ c(u, { children: /* @__PURE__ */ c("div", {
130
- className: "p-6 text-status-error-text",
131
- children: "Missing plugin key in URL."
132
- }) })
133
- }) : /* @__PURE__ */ c("div", {
134
- className: "p-6",
135
- children: /* @__PURE__ */ c(u, { children: /* @__PURE__ */ l("div", {
136
- className: "p-6 text-text-secondary",
137
- children: [
138
- "Iframe-host is disabled in this workspace. Ask an admin to enable",
139
- /* @__PURE__ */ c("code", {
140
- className: "font-mono text-xs",
141
- children: " vibes.tabs.iframe-host"
142
- }),
143
- "."
144
- ]
145
- }) })
146
- });
147
- }
148
- //#endregion
149
- export { p as PluginStandalonePage };
150
-
151
- //# sourceMappingURL=PluginStandalonePage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginStandalonePage.js","names":[],"sources":["../../src/pages/PluginStandalonePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\n\nimport { Card } from '@burdenoff/fe-libs/ui';\nimport { useFeatureFlagDetails } from '@burdenoff/fe-libs/shared/feature-flags';\nimport {\n type DiscoveredContribution,\n type MountTunnel,\n usePluginContributions,\n} from '@burdenoff/fe-libs/shared/plugins';\n\nimport { useVibeControlsStore } from '@/store/vibeControlsStore';\nimport { useListAgentsQuery } from '@/generated/wspace-operations';\nimport { useActiveAgentProfile } from '@/hooks/useActiveAgentProfile';\nimport { mintScopedIframeToken } from '@/services/iframeToken';\nimport { PluginIframeMount } from '@/components/plugins/PluginIframeMount';\n\n/**\n * PR-9 deep-link route — `/plugin/:pluginKey?mount=<id>&context=<base64url(json)>`.\n *\n * Full-page view of any plugin contribution from any mount point. URL\n * params are a routing hint; the actual context flows into the iframe\n * via `host:init` postMessage (the trust boundary). The page validates\n * the requested context against the user's accessible agents and only\n * mounts the iframe when the chosen tunnel resolves to an agent the\n * user owns / has access to.\n *\n * Behind the same `vibes.tabs.iframe-host` feature flag the in-tab\n * iframe surface uses. When the flag is off, this page renders an\n * empty-state instead of mounting any iframe.\n */\nexport function PluginStandalonePage() {\n const { pluginKey } = useParams<{ pluginKey: string }>();\n const [searchParams] = useSearchParams();\n const requestedMount = searchParams.get('mount') ?? 'vibe.detailTab';\n\n // ── feature flag ────────────────────────────────────────────────────\n const iframeHostFlag = useFeatureFlagDetails('vibes.tabs.iframe-host');\n const enableIframeHost = iframeHostFlag?.value === true;\n\n // ── decode URL context (untrusted hint) ────────────────────────────\n const requestedContext = useMemo<Record<string, unknown>>(() => {\n const raw = searchParams.get('context');\n if (!raw) return {};\n try {\n // base64url → base64 → JSON\n const padded = raw.replace(/-/g, '+').replace(/_/g, '/');\n const pad = padded.length % 4 === 0 ? padded : padded + '='.repeat(4 - (padded.length % 4));\n const decoded = atob(pad);\n const parsed = JSON.parse(decoded);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n }, [searchParams]);\n\n // ── pick the effective agent ───────────────────────────────────────\n // 1. If the URL hint names an `agentId`, use that agent directly.\n // 2. Else if the URL hint names a `vibeId`, honour\n // `defaultAgentForVibe` if set, else fall back to the user's most\n // recently active agent.\n // 3. Else the user's most recently active agent.\n const activeAgentId = useVibeControlsStore((s) => s.activeAgentId);\n const defaultAgentForVibe = useVibeControlsStore((s) => s.defaultAgentForVibe);\n const { data: agentsData, loading: agentsLoading } = useListAgentsQuery({\n fetchPolicy: 'cache-and-network',\n });\n const allAgents = useMemo(() => agentsData?.vibecontrolsAgents ?? [], [agentsData]);\n\n const effectiveAgent = useMemo(() => {\n const ctxAgentId =\n typeof requestedContext.agentId === 'string' ? requestedContext.agentId : null;\n const ctxVibeId = typeof requestedContext.vibeId === 'string' ? requestedContext.vibeId : null;\n if (ctxAgentId) return allAgents.find((a: { id: string }) => a.id === ctxAgentId) ?? null;\n if (ctxVibeId) {\n const defaulted = defaultAgentForVibe?.[ctxVibeId];\n if (defaulted) return allAgents.find((a: { id: string }) => a.id === defaulted) ?? null;\n }\n if (activeAgentId) return allAgents.find((a: { id: string }) => a.id === activeAgentId) ?? null;\n return allAgents[0] ?? null;\n }, [allAgents, activeAgentId, defaultAgentForVibe, requestedContext]);\n\n const { active: activeProfile } = useActiveAgentProfile(effectiveAgent?.id ?? null);\n\n // ── tunnel + discovery ─────────────────────────────────────────────\n const tunnels = useMemo<MountTunnel[]>(() => {\n if (!enableIframeHost || !effectiveAgent?.tunnelUrl) return [];\n const profile = activeProfile ?? 'default';\n const agentIdForToken = effectiveAgent.id;\n return [\n {\n tunnelUrl: effectiveAgent.tunnelUrl,\n profile,\n label: effectiveAgent.name ?? effectiveAgent.id,\n mintIframeToken: async ({ pathPrefixes }) => {\n return mintScopedIframeToken(agentIdForToken, profile, pathPrefixes);\n },\n },\n ];\n }, [enableIframeHost, effectiveAgent, activeProfile]);\n\n const { data: contributions, isFetching } = usePluginContributions(tunnels, {\n mountPoint: requestedMount,\n enabled: enableIframeHost && tunnels.length > 0,\n });\n\n const target = useMemo<DiscoveredContribution | null>(() => {\n if (!pluginKey) return null;\n return (\n contributions.find(\n (c) => c.pluginKey === pluginKey && c.contribution.mountPoint === requestedMount\n ) ?? null\n );\n }, [contributions, pluginKey, requestedMount]);\n\n if (!enableIframeHost) {\n return (\n <div className=\"p-6\">\n <Card>\n <div className=\"p-6 text-text-secondary\">\n Iframe-host is disabled in this workspace. Ask an admin to enable\n <code className=\"font-mono text-xs\"> vibes.tabs.iframe-host</code>.\n </div>\n </Card>\n </div>\n );\n }\n\n if (!pluginKey) {\n return (\n <div className=\"p-6\">\n <Card>\n <div className=\"p-6 text-status-error-text\">Missing plugin key in URL.</div>\n </Card>\n </div>\n );\n }\n\n if (agentsLoading && allAgents.length === 0) {\n return (\n <div className=\"p-6\">\n <Card>\n <div className=\"p-6 text-text-secondary\">Loading…</div>\n </Card>\n </div>\n );\n }\n\n if (!effectiveAgent || !effectiveAgent.tunnelUrl) {\n return (\n <div className=\"p-6\">\n <Card>\n <div className=\"p-6 text-text-secondary\">\n No agent available to serve <code>{pluginKey}</code>. Attach an agent first.\n </div>\n </Card>\n </div>\n );\n }\n\n if (isFetching && !target) {\n return (\n <div className=\"p-6\">\n <Card>\n <div className=\"p-6 text-text-secondary\">Looking for {pluginKey}…</div>\n </Card>\n </div>\n );\n }\n\n if (!target) {\n return (\n <div className=\"p-6\">\n <Card>\n <div className=\"p-6 text-status-error-text\">\n Plugin <code className=\"font-mono\">{pluginKey}</code> doesn&apos;t contribute to mount\n <code className=\"font-mono\"> {requestedMount}</code> on agent{' '}\n {effectiveAgent.name ?? effectiveAgent.id}.\n </div>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"p-4 sm:p-6 h-full\">\n <Card className=\"h-[80vh] min-h-[500px]\">\n <div className=\"p-0 h-full\">\n <PluginIframeMount\n contribution={target}\n tunnel={target.tunnel}\n restPaths={\n target.capabilities.restPaths.length > 0\n ? target.capabilities.restPaths\n : [`/ui/${target.pluginKey}`]\n }\n context={requestedContext}\n agentId={effectiveAgent.id}\n profile={target.tunnel.profile}\n theme={{ colorMode: 'light', tokens: {} }}\n locale=\"en\"\n featureFlags={{}}\n hostVersion=\"1.0.0\"\n />\n </div>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}