@burdenoff/microfe-vibecontrols 2026.625.3 → 2026.626.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.
Files changed (59) hide show
  1. package/dist/components/agents/AgentForm.js +129 -127
  2. package/dist/components/agents/AgentForm.js.map +1 -1
  3. package/dist/components/shared/InstallTabs.js +19 -7
  4. package/dist/components/shared/InstallTabs.js.map +1 -1
  5. package/dist/pages/ActionsPage.js +209 -204
  6. package/dist/pages/ActionsPage.js.map +1 -1
  7. package/dist/pages/AgentDetailsPage.js +678 -648
  8. package/dist/pages/AgentDetailsPage.js.map +1 -1
  9. package/dist/pages/AgentGraphPage.js +112 -108
  10. package/dist/pages/AgentGraphPage.js.map +1 -1
  11. package/dist/pages/AgentsPage.js +159 -155
  12. package/dist/pages/AgentsPage.js.map +1 -1
  13. package/dist/pages/AnalyticsPage.js +140 -136
  14. package/dist/pages/AnalyticsPage.js.map +1 -1
  15. package/dist/pages/CatalogDetailPage.js +249 -244
  16. package/dist/pages/CatalogDetailPage.js.map +1 -1
  17. package/dist/pages/CatalogPage.js +73 -68
  18. package/dist/pages/CatalogPage.js.map +1 -1
  19. package/dist/pages/ComponentDetailPage.js +195 -164
  20. package/dist/pages/ComponentDetailPage.js.map +1 -1
  21. package/dist/pages/ComponentsPage.js +80 -75
  22. package/dist/pages/ComponentsPage.js.map +1 -1
  23. package/dist/pages/EnvTopologyPage.js +100 -95
  24. package/dist/pages/EnvTopologyPage.js.map +1 -1
  25. package/dist/pages/HealthPage.js +331 -204
  26. package/dist/pages/HealthPage.js.map +1 -1
  27. package/dist/pages/LogsPage.js +54 -49
  28. package/dist/pages/LogsPage.js.map +1 -1
  29. package/dist/pages/OverviewPage.js +159 -129
  30. package/dist/pages/OverviewPage.js.map +1 -1
  31. package/dist/pages/PluginsCatalogPage.js +72 -78
  32. package/dist/pages/PluginsCatalogPage.js.map +1 -1
  33. package/dist/pages/SessionDetailsPage.js +517 -512
  34. package/dist/pages/SessionDetailsPage.js.map +1 -1
  35. package/dist/pages/SessionsPage.js +1084 -1079
  36. package/dist/pages/SessionsPage.js.map +1 -1
  37. package/dist/pages/SettingsPage.js +107 -103
  38. package/dist/pages/SettingsPage.js.map +1 -1
  39. package/dist/pages/TargetDetailsPage.js +131 -123
  40. package/dist/pages/TargetDetailsPage.js.map +1 -1
  41. package/dist/pages/TargetsPage.js +198 -194
  42. package/dist/pages/TargetsPage.js.map +1 -1
  43. package/dist/pages/TemplatesPage.js +77 -71
  44. package/dist/pages/TemplatesPage.js.map +1 -1
  45. package/dist/pages/VibeAuditPage.js +83 -78
  46. package/dist/pages/VibeAuditPage.js.map +1 -1
  47. package/dist/pages/VibeCalendarPage.js +109 -104
  48. package/dist/pages/VibeCalendarPage.js.map +1 -1
  49. package/dist/pages/VibeDeckPage.js +222 -217
  50. package/dist/pages/VibeDeckPage.js.map +1 -1
  51. package/dist/pages/VibeDetailsPage.js +532 -501
  52. package/dist/pages/VibeDetailsPage.js.map +1 -1
  53. package/dist/pages/VibesPage.js +137 -133
  54. package/dist/pages/VibesPage.js.map +1 -1
  55. package/dist/pages/WebhooksPage.js +329 -324
  56. package/dist/pages/WebhooksPage.js.map +1 -1
  57. package/dist/pages/ai/AIPage.js +149 -144
  58. package/dist/pages/ai/AIPage.js.map +1 -1
  59. package/package.json +2 -2
@@ -1,241 +1,246 @@
1
1
  import { useVibeNavigate as e } from "../../providers/VibeControlsProvider.js";
2
2
  import t from "../../hooks/useCachedInitialData.js";
3
3
  import { PageHeader as n } from "../../components/shared/PageHeader.js";
4
- import { ErrorState as ee } from "../../components/shared/ErrorState.js";
5
- import { EmptyState as r } from "../../components/shared/EmptyState.js";
6
- import { AI_CORE_PACKAGE as i, AI_PROVIDER_PACKAGES as a } from "../../constants/pluginCatalog.js";
7
- import { PluginGate as o } from "../../components/shared/PluginGate.js";
8
- import { RequireAgentReachable as s } from "../../components/shared/RequireAgentReachable.js";
9
- import { useActiveAgentProfile as c } from "../../hooks/useActiveAgentProfile.js";
4
+ import { ErrorState as r } from "../../components/shared/ErrorState.js";
5
+ import { EmptyState as i } from "../../components/shared/EmptyState.js";
6
+ import { AI_CORE_PACKAGE as ee, AI_PROVIDER_PACKAGES as te } from "../../constants/pluginCatalog.js";
7
+ import { PluginGate as ne } from "../../components/shared/PluginGate.js";
8
+ import { RequireAgentReachable as a } from "../../components/shared/RequireAgentReachable.js";
9
+ import { useActiveAgentProfile as o } from "../../hooks/useActiveAgentProfile.js";
10
10
  import "../../components/shared/index.js";
11
- import { VIBE_PERMISSIONS as l } from "../../constants/permissions.js";
12
- import { PageSkeleton as u } from "../../components/shared/PageSkeleton.js";
13
- import { PluginHarnessPicker as te } from "../../components/ai/PluginHarnessPicker.js";
14
- import { AITemplatesTab as ne } from "../../components/ai/AITemplatesTab.js";
11
+ import { VIBE_PERMISSIONS as s } from "../../constants/permissions.js";
12
+ import { PageSkeleton as c } from "../../components/shared/PageSkeleton.js";
13
+ import { PluginHarnessPicker as l } from "../../components/ai/PluginHarnessPicker.js";
14
+ import { AITemplatesTab as u } from "../../components/ai/AITemplatesTab.js";
15
15
  import { AIContextsTab as d } from "../../components/ai/AIContextsTab.js";
16
- import { AIPromptsTab as re } from "../../components/ai/AIPromptsTab.js";
17
- import { AITasksTab as f } from "../../components/ai/AITasksTab.js";
18
- import { AIStatsTab as p } from "../../components/ai/AIStatsTab.js";
19
- import { AIPlaygroundTab as m } from "../../components/ai/AIPlaygroundTab.js";
20
- import { BridleConfigPanel as ie } from "../../components/agent-manager/BridleConfigPanel.js";
21
- import { AIOverviewTab as h } from "../../components/ai/AIOverviewTab.js";
22
- import { InstructionFilesManager as g } from "../../components/ai/InstructionFilesManager.js";
23
- import { AISessionsTab as ae } from "../../components/ai/AISessionsTab.js";
24
- import { AIQueueTab as _ } from "../../components/ai/AIQueueTab.js";
25
- import { ClaudeCredentialsCard as v } from "../../components/ai/ClaudeCredentialsCard.js";
26
- import { AIPlanPanel as y } from "../../components/ai/AIPlanPanel.js";
27
- import { AIModeToggle as b } from "../../components/ai/AIModeToggle.js";
28
- import { useCallback as x, useMemo as S, useState as oe } from "react";
29
- import { useI18n as se } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
30
- import { BarChart3 as C, FileCode2 as w, FileText as T, LayoutDashboard as E, ListChecks as D, ListTodo as O, MessageSquare as k, MessagesSquare as A, Play as j, ScrollText as M } from "lucide-react";
31
- import { useMatch as N, useParams as P } from "react-router-dom";
32
- import { usePermissions as F } from "@burdenoff/fe-libs/shared/providers/shell";
33
- import { jsx as I, jsxs as L } from "react/jsx-runtime";
34
- import { AccessDenied as R } from "@burdenoff/fe-libs/shared/components";
35
- import { MotionPage as z } from "@burdenoff/fe-libs/shared/motion";
16
+ import { AIPromptsTab as f } from "../../components/ai/AIPromptsTab.js";
17
+ import { AITasksTab as p } from "../../components/ai/AITasksTab.js";
18
+ import { AIStatsTab as m } from "../../components/ai/AIStatsTab.js";
19
+ import { AIPlaygroundTab as h } from "../../components/ai/AIPlaygroundTab.js";
20
+ import { BridleConfigPanel as re } from "../../components/agent-manager/BridleConfigPanel.js";
21
+ import { AIOverviewTab as g } from "../../components/ai/AIOverviewTab.js";
22
+ import { InstructionFilesManager as _ } from "../../components/ai/InstructionFilesManager.js";
23
+ import { AISessionsTab as v } from "../../components/ai/AISessionsTab.js";
24
+ import { AIQueueTab as ie } from "../../components/ai/AIQueueTab.js";
25
+ import { ClaudeCredentialsCard as ae } from "../../components/ai/ClaudeCredentialsCard.js";
26
+ import { AIPlanPanel as oe } from "../../components/ai/AIPlanPanel.js";
27
+ import { AIModeToggle as se } from "../../components/ai/AIModeToggle.js";
28
+ import { useCallback as y, useMemo as b, useState as ce } from "react";
29
+ import { useI18n as le } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
30
+ import { BarChart3 as x, FileCode2 as S, FileText as C, LayoutDashboard as w, ListChecks as T, ListTodo as E, MessageSquare as D, MessagesSquare as O, Play as k, ScrollText as A } from "lucide-react";
31
+ import { useMatch as j, useParams as M } from "react-router-dom";
32
+ import { usePermissions as N } from "@burdenoff/fe-libs/shared/providers/shell";
33
+ import { jsx as P, jsxs as F } from "react/jsx-runtime";
34
+ import { PagePurpose as I } from "@burdenoff/fe-libs/ui";
35
+ import { AccessDenied as L } from "@burdenoff/fe-libs/shared/components";
36
+ import { MotionPage as R } from "@burdenoff/fe-libs/shared/motion";
36
37
  //#region src/pages/ai/AIPage.tsx
37
- var B = [
38
+ var z = [
38
39
  {
39
40
  id: "overview",
40
- icon: E
41
+ icon: w
41
42
  },
42
43
  {
43
44
  id: "templates",
44
- icon: w
45
+ icon: S
45
46
  },
46
47
  {
47
48
  id: "contexts",
48
- icon: T
49
+ icon: C
49
50
  },
50
51
  {
51
52
  id: "prompts",
52
- icon: k
53
+ icon: D
53
54
  },
54
55
  {
55
56
  id: "instructions",
56
- icon: M
57
+ icon: A
57
58
  },
58
59
  {
59
60
  id: "sessions",
60
- icon: A
61
+ icon: O
61
62
  },
62
63
  {
63
64
  id: "queue",
64
- icon: D
65
+ icon: T
65
66
  },
66
67
  {
67
68
  id: "tasks",
68
- icon: O
69
+ icon: E
69
70
  },
70
71
  {
71
72
  id: "stats",
72
- icon: C
73
+ icon: x
73
74
  },
74
75
  {
75
76
  id: "playground",
76
- icon: j
77
+ icon: k
77
78
  },
78
79
  {
79
80
  id: "config",
80
- icon: E
81
+ icon: w
81
82
  }
82
- ], V = new Set(B.map((e) => e.id));
83
- function H() {
84
- let { t: C } = se(), { hasPermission: w, isLoading: T } = F(), E = w(l.AGENT_READ), { tab: D } = P(), O = N("vibecontrols/ai-tools/plan") ? "plan" : "ai", k = D && V.has(D) ? D : "overview", j = e(), M = x((e, t) => {
85
- let n = C(e);
83
+ ], B = new Set(z.map((e) => e.id));
84
+ function V() {
85
+ let { t: x } = le(), { hasPermission: S, isLoading: C } = N(), w = S(s.AGENT_READ), { tab: T } = M(), E = j("vibecontrols/ai-tools/plan") ? "plan" : "ai", k = T && B.has(T) ? T : "overview", A = e(), V = y((e, t) => {
86
+ let n = x(e);
86
87
  return n === e ? t : n;
87
- }, [C]), H = x((e) => {
88
+ }, [x]), H = y((e) => {
88
89
  switch (e) {
89
- case "overview": return M("ai.overview", "Overview");
90
- case "templates": return M("ai.templates", "Templates");
91
- case "contexts": return M("ai.contexts", "Contexts");
92
- case "prompts": return M("ai.prompts", "Prompts");
93
- case "instructions": return M("ai.instructions", "Instructions");
94
- case "sessions": return M("nav.sessions", "Sessions");
95
- case "queue": return M("ai.queue", "Queue");
96
- case "tasks": return M("ai.tasks", "Tasks");
97
- case "stats": return M("ai.stats", "Stats");
98
- case "playground": return M("ai.playground", "Playground");
99
- case "config": return M("ai.config", "Config");
90
+ case "overview": return V("ai.overview", "Overview");
91
+ case "templates": return V("ai.templates", "Templates");
92
+ case "contexts": return V("ai.contexts", "Contexts");
93
+ case "prompts": return V("ai.prompts", "Prompts");
94
+ case "instructions": return V("ai.instructions", "Instructions");
95
+ case "sessions": return V("nav.sessions", "Sessions");
96
+ case "queue": return V("ai.queue", "Queue");
97
+ case "tasks": return V("ai.tasks", "Tasks");
98
+ case "stats": return V("ai.stats", "Stats");
99
+ case "playground": return V("ai.playground", "Playground");
100
+ case "config": return V("ai.config", "Config");
100
101
  default: return e;
101
102
  }
102
- }, [M]), { agents: U, loading: W, error: G, refetch: K } = t();
103
+ }, [V]), { agents: U, loading: W, error: G, refetch: ue } = t();
103
104
  G && console.error("[ai] failed to load initial workspace data", G);
104
- let q = S(() => U.find((e) => e.isActive && e.tunnelUrl) ?? null, [U]), J = q?.id ?? "", { active: Y } = c(q?.id ?? null), X = S(() => ({
105
- id: J,
106
- profile: Y
107
- }), [J, Y]), ce = x((e) => {
108
- j(e === "overview" ? "/ai-tools/ai" : `/ai-tools/ai/${e}`);
109
- }, [j]), Z = x((e) => {
110
- j(`/ai-tools/sessions/${e}`);
111
- }, [j]), le = !!J, [Q, $] = oe(null), ue = x(() => {
112
- $(M("ai.pluginInstalled", "Plugin installed. Opening AI chat…")), console.info("[ai] orchestrator install completed — navigating to AI chat"), j("/ai");
113
- }, [M, j]), de = x(() => {
114
- $(M("ai.harnessUpdated", "Harness updated.")), console.info("[ai] harness picker changed");
115
- }, [M]);
116
- return T ? /* @__PURE__ */ I(z, {
105
+ let K = b(() => U.find((e) => e.isActive && e.tunnelUrl) ?? null, [U]), q = K?.id ?? "", { active: J } = o(K?.id ?? null), Y = b(() => ({
106
+ id: q,
107
+ profile: J
108
+ }), [q, J]), de = y((e) => {
109
+ A(e === "overview" ? "/ai-tools/ai" : `/ai-tools/ai/${e}`);
110
+ }, [A]), X = y((e) => {
111
+ A(`/ai-tools/sessions/${e}`);
112
+ }, [A]), Z = !!q, [Q, $] = ce(null), fe = y(() => {
113
+ $(V("ai.pluginInstalled", "Plugin installed. Opening AI chat…")), console.info("[ai] orchestrator install completed — navigating to AI chat"), A("/ai");
114
+ }, [V, A]), pe = y(() => {
115
+ $(V("ai.harnessUpdated", "Harness updated.")), console.info("[ai] harness picker changed");
116
+ }, [V]);
117
+ return C ? /* @__PURE__ */ P(R, {
117
118
  className: "space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen",
118
- children: /* @__PURE__ */ I(u, { variant: "detail" })
119
- }) : E ? /* @__PURE__ */ L(z, {
119
+ children: /* @__PURE__ */ P(c, { variant: "detail" })
120
+ }) : w ? /* @__PURE__ */ F(R, {
120
121
  className: "space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen",
121
122
  children: [
122
- /* @__PURE__ */ I(n, {
123
- title: M("nav.ai", "AI"),
124
- description: M("ai.description", "Manage AI sessions, prompts, templates, and contexts for your vibecoding workflow")
123
+ /* @__PURE__ */ P(n, {
124
+ title: V("nav.ai", "AI"),
125
+ description: V("ai.description", "Manage AI sessions, prompts, templates, and contexts for your vibecoding workflow")
126
+ }),
127
+ /* @__PURE__ */ P(I, {
128
+ icon: /* @__PURE__ */ P(D, { className: "size-4" }),
129
+ children: V("ai.purpose", "This is your AI workspace for vibecoding — chat with an assistant that has your vibe’s context, save reusable prompts and templates, plan multi-step work, and review past AI sessions. Switch between Plan mode (break work into steps) and AI mode (the full toolset) to go from idea to running code without leaving VibeControls.")
125
130
  }),
126
- /* @__PURE__ */ I("div", {
131
+ /* @__PURE__ */ P("div", {
127
132
  "data-tour": "vibecontrols-ai-mode-toggle",
128
- children: /* @__PURE__ */ I(b, {
133
+ children: /* @__PURE__ */ P(se, {
129
134
  aiHref: `/ai-tools/ai/${k}`,
130
- activeMode: O
135
+ activeMode: E
131
136
  })
132
137
  }),
133
- O === "ai" && /* @__PURE__ */ I("div", {
138
+ E === "ai" && /* @__PURE__ */ P("div", {
134
139
  className: "border-b border-border-default -mx-4 sm:-mx-6 px-4 sm:px-6",
135
140
  "data-tour": "vibecontrols-ai-tabs-nav",
136
- children: /* @__PURE__ */ I("nav", {
141
+ children: /* @__PURE__ */ P("nav", {
137
142
  className: "flex gap-1 overflow-x-auto pb-1",
138
143
  role: "tablist",
139
- children: B.map((e) => {
144
+ children: z.map((e) => {
140
145
  let t = e.icon, n = k === e.id;
141
- return /* @__PURE__ */ L("button", {
146
+ return /* @__PURE__ */ F("button", {
142
147
  type: "button",
143
148
  role: "tab",
144
149
  "aria-selected": n,
145
- onClick: () => ce(e.id),
150
+ onClick: () => de(e.id),
146
151
  className: `flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-t-md border-b-2 px-2.5 py-2 text-xs font-medium transition-colors sm:px-3 sm:py-2.5 sm:text-sm ${n ? "border-action-primary-bg text-action-primary-bg" : "border-transparent text-text-secondary hover:text-text-primary hover:border-border-default"}`,
147
- children: [/* @__PURE__ */ I(t, { className: "size-3.5 sm:h-4 sm:w-4" }), H(e.id)]
152
+ children: [/* @__PURE__ */ P(t, { className: "size-3.5 sm:h-4 sm:w-4" }), H(e.id)]
148
153
  }, e.id);
149
154
  })
150
155
  })
151
156
  }),
152
- W && U.length === 0 ? /* @__PURE__ */ I(u, {
157
+ W && U.length === 0 ? /* @__PURE__ */ P(c, {
153
158
  variant: "rows",
154
159
  count: 6
155
- }) : G ? /* @__PURE__ */ I(ee, {
156
- title: M("ai.loadFailed.title", "Could not load the AI workspace"),
157
- message: M("ai.loadFailed.message", "We couldn't load the AI workspace. Please try again in a moment."),
158
- onRetry: K
159
- }) : le ? O === "plan" ? /* @__PURE__ */ I(s, {
160
- agentId: J,
161
- children: /* @__PURE__ */ I(y, {
162
- agent: X,
163
- tunnelUrl: q?.tunnelUrl ?? null
160
+ }) : G ? /* @__PURE__ */ P(r, {
161
+ title: V("ai.loadFailed.title", "Could not load the AI workspace"),
162
+ message: V("ai.loadFailed.message", "We couldn't load the AI workspace. Please try again in a moment."),
163
+ onRetry: ue
164
+ }) : Z ? E === "plan" ? /* @__PURE__ */ P(a, {
165
+ agentId: q,
166
+ children: /* @__PURE__ */ P(oe, {
167
+ agent: Y,
168
+ tunnelUrl: K?.tunnelUrl ?? null
164
169
  })
165
- }) : /* @__PURE__ */ I(s, {
166
- agentId: J,
167
- children: /* @__PURE__ */ I("div", {
170
+ }) : /* @__PURE__ */ P(a, {
171
+ agentId: q,
172
+ children: /* @__PURE__ */ P("div", {
168
173
  "data-tour": "vibecontrols-ai-plugin-gate",
169
- children: /* @__PURE__ */ I(o, {
170
- agentId: J,
171
- required: [i],
174
+ children: /* @__PURE__ */ P(ne, {
175
+ agentId: q,
176
+ required: [ee],
172
177
  mode: "all",
173
- eyebrow: M("ai.pluginRequired", "AI plugin required"),
174
- title: M("ai.installOrchestrator", "Install the AI orchestrator"),
175
- description: M("ai.installOrchestratorDesc", "The AI page routes prompts and sessions through the AI orchestrator plugin on your agent. Install it to continue."),
176
- onInstalled: ue,
177
- children: /* @__PURE__ */ L("div", {
178
+ eyebrow: V("ai.pluginRequired", "AI plugin required"),
179
+ title: V("ai.installOrchestrator", "Install the AI orchestrator"),
180
+ description: V("ai.installOrchestratorDesc", "The AI page routes prompts and sessions through the AI orchestrator plugin on your agent. Install it to continue."),
181
+ onInstalled: fe,
182
+ children: /* @__PURE__ */ F("div", {
178
183
  className: "space-y-6",
179
184
  children: [
180
- Q && /* @__PURE__ */ I("div", {
185
+ Q && /* @__PURE__ */ P("div", {
181
186
  role: "status",
182
187
  className: "rounded-md border border-status-success-border bg-status-success-bg px-3 py-2 text-xs text-status-success-text",
183
188
  children: Q
184
189
  }),
185
- /* @__PURE__ */ I(te, {
186
- agentId: J,
187
- packages: a,
188
- title: M("ai.harnessesTitle", "AI harnesses"),
189
- description: M("ai.harnessesDesc", "Install and manage the coding-agent harnesses available on this agent. You can install multiple and switch between them per-session."),
190
- onChange: de
190
+ /* @__PURE__ */ P(l, {
191
+ agentId: q,
192
+ packages: te,
193
+ title: V("ai.harnessesTitle", "AI harnesses"),
194
+ description: V("ai.harnessesDesc", "Install and manage the coding-agent harnesses available on this agent. You can install multiple and switch between them per-session."),
195
+ onChange: pe
191
196
  }),
192
- /* @__PURE__ */ L("div", { children: [
193
- k === "overview" && /* @__PURE__ */ I(h, {
194
- agent: X,
195
- onNavigateToSession: Z
197
+ /* @__PURE__ */ F("div", { children: [
198
+ k === "overview" && /* @__PURE__ */ P(g, {
199
+ agent: Y,
200
+ onNavigateToSession: X
196
201
  }),
197
- k === "templates" && /* @__PURE__ */ I(ne, { agentId: J }),
198
- k === "contexts" && /* @__PURE__ */ I(d, { agent: X }),
199
- k === "prompts" && /* @__PURE__ */ I(re, { agent: X }),
200
- k === "instructions" && /* @__PURE__ */ I(g, { agentId: J }),
201
- k === "sessions" && /* @__PURE__ */ I(ae, {
202
- agent: X,
203
- onNavigateToSession: Z
202
+ k === "templates" && /* @__PURE__ */ P(u, { agentId: q }),
203
+ k === "contexts" && /* @__PURE__ */ P(d, { agent: Y }),
204
+ k === "prompts" && /* @__PURE__ */ P(f, { agent: Y }),
205
+ k === "instructions" && /* @__PURE__ */ P(_, { agentId: q }),
206
+ k === "sessions" && /* @__PURE__ */ P(v, {
207
+ agent: Y,
208
+ onNavigateToSession: X
204
209
  }),
205
- k === "queue" && /* @__PURE__ */ I(_, {
206
- agent: X,
207
- onNavigateToSession: Z
210
+ k === "queue" && /* @__PURE__ */ P(ie, {
211
+ agent: Y,
212
+ onNavigateToSession: X
208
213
  }),
209
- k === "tasks" && /* @__PURE__ */ I(f, {}),
210
- k === "stats" && /* @__PURE__ */ I(p, { agent: X }),
211
- k === "playground" && /* @__PURE__ */ I(m, { agent: X }),
212
- k === "config" && /* @__PURE__ */ L("div", {
214
+ k === "tasks" && /* @__PURE__ */ P(p, {}),
215
+ k === "stats" && /* @__PURE__ */ P(m, { agent: Y }),
216
+ k === "playground" && /* @__PURE__ */ P(h, { agent: Y }),
217
+ k === "config" && /* @__PURE__ */ F("div", {
213
218
  className: "space-y-6",
214
- children: [/* @__PURE__ */ I(v, { agent: X }), /* @__PURE__ */ I(ie, { agent: X })]
219
+ children: [/* @__PURE__ */ P(ae, { agent: Y }), /* @__PURE__ */ P(re, { agent: Y })]
215
220
  })
216
221
  ] })
217
222
  ]
218
223
  })
219
224
  })
220
225
  })
221
- }) : /* @__PURE__ */ I(r, {
222
- icon: /* @__PURE__ */ I(A, { className: "size-8 text-text-secondary" }),
223
- title: M("ai.noActiveAgent", "No active agent available"),
224
- description: M("ai.noActiveAgentDescription", "AI features require an active agent with a configured tunnel URL and API key. Add an agent or start an existing one."),
225
- action: /* @__PURE__ */ I("button", {
226
+ }) : /* @__PURE__ */ P(i, {
227
+ icon: /* @__PURE__ */ P(O, { className: "size-8 text-text-secondary" }),
228
+ title: V("ai.noActiveAgent", "No active agent available"),
229
+ description: V("ai.noActiveAgentDescription", "AI features require an active agent with a configured tunnel URL and API key. Add an agent or start an existing one."),
230
+ action: /* @__PURE__ */ P("button", {
226
231
  type: "button",
227
- onClick: () => j("/agents"),
232
+ onClick: () => A("/agents"),
228
233
  className: "px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors text-sm",
229
- children: M("ai.goToAgents", "Go to Agents")
234
+ children: V("ai.goToAgents", "Go to Agents")
230
235
  })
231
236
  })
232
237
  ]
233
- }) : /* @__PURE__ */ I(R, {
234
- title: M("ai.denied.title", "Access Denied"),
235
- description: M("ai.denied.description", "You do not have permission to view AI features.")
238
+ }) : /* @__PURE__ */ P(L, {
239
+ title: V("ai.denied.title", "Access Denied"),
240
+ description: V("ai.denied.description", "You do not have permission to view AI features.")
236
241
  });
237
242
  }
238
243
  //#endregion
239
- export { H as AIPage };
244
+ export { V as AIPage };
240
245
 
241
246
  //# sourceMappingURL=AIPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AIPage.js","names":[],"sources":["../../../src/pages/ai/AIPage.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport { useMatch, useParams } from 'react-router-dom';\nimport {\n LayoutDashboard,\n FileCode2,\n FileText,\n MessageSquare,\n MessagesSquare,\n ListTodo,\n ListChecks,\n BarChart3,\n Play,\n ScrollText,\n} from 'lucide-react';\nimport { MotionPage } from '@burdenoff/fe-libs/shared/motion';\nimport {\n PageHeader,\n EmptyState,\n ErrorState,\n PluginGate,\n RequireAgentReachable,\n} from '@/components/shared';\nimport { PageSkeleton } from '@/components/shared/PageSkeleton';\nimport { useVibeNavigate } from '@/providers/VibeControlsProvider';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied } from '@burdenoff/fe-libs/shared/components';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '@/constants/permissions';\nimport { useCachedInitialData } from '@/hooks/useCachedInitialData';\nimport { useActiveAgentProfile } from '@/hooks/useActiveAgentProfile';\nimport { AI_CORE_PACKAGE, AI_PROVIDER_PACKAGES } from '@/constants/pluginCatalog';\nimport { PluginHarnessPicker } from '@/components/ai/PluginHarnessPicker';\n\nimport { AIOverviewTab } from '@/components/ai/AIOverviewTab';\nimport { AITemplatesTab } from '@/components/ai/AITemplatesTab';\nimport { AIContextsTab } from '@/components/ai/AIContextsTab';\nimport { AIPromptsTab } from '@/components/ai/AIPromptsTab';\nimport { InstructionFilesManager } from '@/components/ai/InstructionFilesManager';\nimport { AISessionsTab } from '@/components/ai/AISessionsTab';\nimport { AITasksTab } from '@/components/ai/AITasksTab';\nimport { AIQueueTab } from '@/components/ai/AIQueueTab';\nimport { AIStatsTab } from '@/components/ai/AIStatsTab';\nimport { AIPlaygroundTab } from '@/components/ai/AIPlaygroundTab';\nimport { ClaudeCredentialsCard } from '@/components/ai/ClaudeCredentialsCard';\nimport { BridleConfigPanel } from '@/components/agent-manager/BridleConfigPanel';\nimport { AIPlanPanel } from '@/components/ai/AIPlanPanel';\nimport { AIModeToggle } from '@/components/ai/AIModeToggle';\n\ntype AIMode = 'plan' | 'ai';\n\ntype AITab =\n | 'overview'\n | 'templates'\n | 'contexts'\n | 'prompts'\n | 'instructions'\n | 'sessions'\n | 'queue'\n | 'tasks'\n | 'stats'\n | 'playground'\n | 'config';\n\nconst tabs: { id: AITab; icon: typeof LayoutDashboard }[] = [\n { id: 'overview', icon: LayoutDashboard },\n { id: 'templates', icon: FileCode2 },\n { id: 'contexts', icon: FileText },\n { id: 'prompts', icon: MessageSquare },\n { id: 'instructions', icon: ScrollText },\n { id: 'sessions', icon: MessagesSquare },\n { id: 'queue', icon: ListChecks },\n { id: 'tasks', icon: ListTodo },\n { id: 'stats', icon: BarChart3 },\n { id: 'playground', icon: Play },\n { id: 'config', icon: LayoutDashboard },\n];\n\nconst validTabs = new Set<string>(tabs.map((t) => t.id));\n\n/**\n * AI page — tab-based layout for AI / vibecoding features.\n *\n * URL shape:\n * /ai-tools → routed to /ai-tools/ai/overview (handled in VibeControlsRoutes).\n * /ai-tools/plan → Plan mode (full-bleed plannotator iframe panel).\n * /ai-tools/ai/:tab → AI mode (the existing 9 sub-tabs).\n *\n * The mode toggle below `PageHeader` switches between the two without a\n * full route reload — the AIPlanPanel inside Plan mode reuses the same\n * agent context that AI mode already loaded.\n */\nexport function AIPage() {\n const { t } = useI18n();\n // The AI surface is agent-centric — gate it on `agent:read`, consistent\n // with AgentsLandingPage (defense-in-depth; the gateway enforces it too).\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canReadAgents = hasPermission(VIBE_PERMISSIONS.AGENT_READ);\n const { tab: tabParam } = useParams<{ tab?: string }>();\n const planRouteMatch = useMatch('vibecontrols/ai-tools/plan');\n const activeMode: AIMode = planRouteMatch ? 'plan' : 'ai';\n const activeTab: AITab = tabParam && validTabs.has(tabParam) ? (tabParam as AITab) : 'overview';\n const handleNavigate = useVibeNavigate();\n\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const tabLabel = useCallback(\n (tabId: AITab): string => {\n switch (tabId) {\n case 'overview':\n return tr('ai.overview', 'Overview');\n case 'templates':\n return tr('ai.templates', 'Templates');\n case 'contexts':\n return tr('ai.contexts', 'Contexts');\n case 'prompts':\n return tr('ai.prompts', 'Prompts');\n case 'instructions':\n return tr('ai.instructions', 'Instructions');\n case 'sessions':\n return tr('nav.sessions', 'Sessions');\n case 'queue':\n return tr('ai.queue', 'Queue');\n case 'tasks':\n return tr('ai.tasks', 'Tasks');\n case 'stats':\n return tr('ai.stats', 'Stats');\n case 'playground':\n return tr('ai.playground', 'Playground');\n case 'config':\n return tr('ai.config', 'Config');\n default:\n return tabId;\n }\n },\n [tr]\n );\n\n const { agents, loading: agentsLoading, error: agentsError, refetch } = useCachedInitialData();\n\n // If the initial data query throws (e.g. gateway query-cost limit, network\n // error, transient federation issue), surface a friendly fallback rather\n // than the raw GraphQL error. The technical details still go to the console\n // for debuggability — without PII, since the error message itself never\n // contains secrets.\n if (agentsError) {\n console.error('[ai] failed to load initial workspace data', agentsError);\n }\n const activeAgent = useMemo(\n () => agents.find((agent) => agent.isActive && agent.tunnelUrl) ?? null,\n [agents]\n );\n const agentId = activeAgent?.id ?? '';\n // AgentRef threads the canonical agent → profile → plugins/data\n // hierarchy through every aiApi call. Components receive the ref\n // and construct paths via `agentApiPath(profile, ...)`.\n const { active: activeProfile } = useActiveAgentProfile(activeAgent?.id ?? null);\n const agentRef = useMemo(\n () => ({ id: agentId, profile: activeProfile }),\n [agentId, activeProfile]\n );\n\n const switchTab = useCallback(\n (tab: AITab) => {\n handleNavigate(tab === 'overview' ? '/ai-tools/ai' : `/ai-tools/ai/${tab}`);\n },\n [handleNavigate]\n );\n\n const navigateToSession = useCallback(\n (sessionId: string) => {\n handleNavigate(`/ai-tools/sessions/${sessionId}`);\n },\n [handleNavigate]\n );\n\n const hasAgent = !!agentId;\n\n // Surface install lifecycle for debuggability. PluginGate / PluginHarnessPicker\n // already render inline error chips, but a console breadcrumb + a top-level\n // banner helps when the install actually succeeds on the agent but a stale\n // detection cache hides the success — without this the install button looked\n // like it silently swallowed errors.\n const [lastInstallNote, setLastInstallNote] = useState<string | null>(null);\n // PluginGate fires this only on the unsatisfied → satisfied transition (once\n // the orchestrator is actually live on the agent). When that happens, route\n // straight into the AI chat (AgentManagerPage at `/ai`) instead of leaving\n // the user on a \"Refreshing…\" note that needed a manual reload (G5). No\n // window.location.reload() — the SPA navigation re-renders the workbench with\n // the freshly-detected plugin state.\n const handleInstalled = useCallback(() => {\n setLastInstallNote(tr('ai.pluginInstalled', 'Plugin installed. Opening AI chat…'));\n console.info('[ai] orchestrator install completed — navigating to AI chat');\n handleNavigate('/ai');\n }, [tr, handleNavigate]);\n const handleHarnessChange = useCallback(() => {\n setLastInstallNote(tr('ai.harnessUpdated', 'Harness updated.'));\n\n console.info('[ai] harness picker changed');\n }, [tr]);\n\n if (permissionsLoading) {\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n <PageSkeleton variant=\"detail\" />\n </MotionPage>\n );\n }\n\n if (!canReadAgents) {\n return (\n <AccessDenied\n title={tr('ai.denied.title', 'Access Denied')}\n description={tr('ai.denied.description', 'You do not have permission to view AI features.')}\n />\n );\n }\n\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n <PageHeader\n title={tr('nav.ai', 'AI')}\n description={tr(\n 'ai.description',\n 'Manage AI sessions, prompts, templates, and contexts for your vibecoding workflow'\n )}\n />\n\n {/* Mode pivot — Plan / AI. Sits below PageHeader, above the\n AI-mode sub-tab strip. Switching to Plan hides the 9 sub-tabs\n and renders the AIPlanPanel in their place. Stays inside\n /ai-tools so the active sub-tab survives the toggle. */}\n {/* AIModeToggle is a custom component that doesn't forward rest props\n onto a DOM node, so the tour anchor lives on a wrapper <div>. */}\n <div data-tour=\"vibecontrols-ai-mode-toggle\">\n <AIModeToggle aiHref={`/ai-tools/ai/${activeTab}`} activeMode={activeMode} />\n </div>\n\n {/* AI sub-tab navigation — only rendered in AI mode. */}\n {activeMode === 'ai' && (\n <div\n className=\"border-b border-border-default -mx-4 sm:-mx-6 px-4 sm:px-6\"\n data-tour=\"vibecontrols-ai-tabs-nav\"\n >\n <nav className=\"flex gap-1 overflow-x-auto pb-1\" role=\"tablist\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n const isActive = activeTab === tab.id;\n return (\n <button\n type=\"button\"\n key={tab.id}\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => switchTab(tab.id)}\n className={`flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-t-md border-b-2 px-2.5 py-2 text-xs font-medium transition-colors sm:px-3 sm:py-2.5 sm:text-sm ${\n isActive\n ? 'border-action-primary-bg text-action-primary-bg'\n : 'border-transparent text-text-secondary hover:text-text-primary hover:border-border-default'\n }`}\n >\n <Icon className=\"size-3.5 sm:h-4 sm:w-4\" />\n {tabLabel(tab.id)}\n </button>\n );\n })}\n </nav>\n </div>\n )}\n\n {/* Content */}\n {agentsLoading && agents.length === 0 ? (\n <PageSkeleton variant=\"rows\" count={6} />\n ) : agentsError ? (\n <ErrorState\n title={tr('ai.loadFailed.title', 'Could not load the AI workspace')}\n message={tr(\n 'ai.loadFailed.message',\n \"We couldn't load the AI workspace. Please try again in a moment.\"\n )}\n onRetry={refetch}\n />\n ) : !hasAgent ? (\n <EmptyState\n icon={<MessagesSquare className=\"size-8 text-text-secondary\" />}\n title={tr('ai.noActiveAgent', 'No active agent available')}\n description={tr(\n 'ai.noActiveAgentDescription',\n 'AI features require an active agent with a configured tunnel URL and API key. Add an agent or start an existing one.'\n )}\n action={\n <button\n type=\"button\"\n onClick={() => handleNavigate('/agents')}\n className=\"px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors text-sm\"\n >\n {tr('ai.goToAgents', 'Go to Agents')}\n </button>\n }\n />\n ) : activeMode === 'plan' ? (\n <RequireAgentReachable agentId={agentId}>\n <AIPlanPanel agent={agentRef} tunnelUrl={activeAgent?.tunnelUrl ?? null} />\n </RequireAgentReachable>\n ) : (\n <RequireAgentReachable agentId={agentId}>\n {/* PluginGate is a custom component that doesn't forward rest props\n onto a DOM node, so the tour anchor lives on a wrapper <div>. */}\n <div data-tour=\"vibecontrols-ai-plugin-gate\">\n <PluginGate\n agentId={agentId}\n required={[AI_CORE_PACKAGE]}\n mode=\"all\"\n eyebrow={tr('ai.pluginRequired', 'AI plugin required')}\n title={tr('ai.installOrchestrator', 'Install the AI orchestrator')}\n description={tr(\n 'ai.installOrchestratorDesc',\n 'The AI page routes prompts and sessions through the AI orchestrator plugin on your agent. Install it to continue.'\n )}\n onInstalled={handleInstalled}\n >\n <div className=\"space-y-6\">\n {lastInstallNote && (\n <div\n role=\"status\"\n className=\"rounded-md border border-status-success-border bg-status-success-bg px-3 py-2 text-xs text-status-success-text\"\n >\n {lastInstallNote}\n </div>\n )}\n <PluginHarnessPicker\n agentId={agentId}\n packages={AI_PROVIDER_PACKAGES}\n title={tr('ai.harnessesTitle', 'AI harnesses')}\n description={tr(\n 'ai.harnessesDesc',\n 'Install and manage the coding-agent harnesses available on this agent. You can install multiple and switch between them per-session.'\n )}\n onChange={handleHarnessChange}\n />\n <div>\n {activeTab === 'overview' && (\n <AIOverviewTab agent={agentRef} onNavigateToSession={navigateToSession} />\n )}\n {activeTab === 'templates' && <AITemplatesTab agentId={agentId} />}\n {activeTab === 'contexts' && <AIContextsTab agent={agentRef} />}\n {activeTab === 'prompts' && <AIPromptsTab agent={agentRef} />}\n {activeTab === 'instructions' && <InstructionFilesManager agentId={agentId} />}\n {activeTab === 'sessions' && (\n <AISessionsTab agent={agentRef} onNavigateToSession={navigateToSession} />\n )}\n {activeTab === 'queue' && (\n <AIQueueTab agent={agentRef} onNavigateToSession={navigateToSession} />\n )}\n {activeTab === 'tasks' && <AITasksTab />}\n {activeTab === 'stats' && <AIStatsTab agent={agentRef} />}\n {activeTab === 'playground' && <AIPlaygroundTab agent={agentRef} />}\n {activeTab === 'config' && (\n <div className=\"space-y-6\">\n <ClaudeCredentialsCard agent={agentRef} />\n <BridleConfigPanel agent={agentRef} />\n </div>\n )}\n </div>\n </div>\n </PluginGate>\n </div>\n </RequireAgentReachable>\n )}\n </MotionPage>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AIPage.js","names":[],"sources":["../../../src/pages/ai/AIPage.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport { useMatch, useParams } from 'react-router-dom';\nimport {\n LayoutDashboard,\n FileCode2,\n FileText,\n MessageSquare,\n MessagesSquare,\n ListTodo,\n ListChecks,\n BarChart3,\n Play,\n ScrollText,\n} from 'lucide-react';\nimport { MotionPage } from '@burdenoff/fe-libs/shared/motion';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport {\n PageHeader,\n EmptyState,\n ErrorState,\n PluginGate,\n RequireAgentReachable,\n} from '@/components/shared';\nimport { PageSkeleton } from '@/components/shared/PageSkeleton';\nimport { useVibeNavigate } from '@/providers/VibeControlsProvider';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AccessDenied } from '@burdenoff/fe-libs/shared/components';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '@/constants/permissions';\nimport { useCachedInitialData } from '@/hooks/useCachedInitialData';\nimport { useActiveAgentProfile } from '@/hooks/useActiveAgentProfile';\nimport { AI_CORE_PACKAGE, AI_PROVIDER_PACKAGES } from '@/constants/pluginCatalog';\nimport { PluginHarnessPicker } from '@/components/ai/PluginHarnessPicker';\n\nimport { AIOverviewTab } from '@/components/ai/AIOverviewTab';\nimport { AITemplatesTab } from '@/components/ai/AITemplatesTab';\nimport { AIContextsTab } from '@/components/ai/AIContextsTab';\nimport { AIPromptsTab } from '@/components/ai/AIPromptsTab';\nimport { InstructionFilesManager } from '@/components/ai/InstructionFilesManager';\nimport { AISessionsTab } from '@/components/ai/AISessionsTab';\nimport { AITasksTab } from '@/components/ai/AITasksTab';\nimport { AIQueueTab } from '@/components/ai/AIQueueTab';\nimport { AIStatsTab } from '@/components/ai/AIStatsTab';\nimport { AIPlaygroundTab } from '@/components/ai/AIPlaygroundTab';\nimport { ClaudeCredentialsCard } from '@/components/ai/ClaudeCredentialsCard';\nimport { BridleConfigPanel } from '@/components/agent-manager/BridleConfigPanel';\nimport { AIPlanPanel } from '@/components/ai/AIPlanPanel';\nimport { AIModeToggle } from '@/components/ai/AIModeToggle';\n\ntype AIMode = 'plan' | 'ai';\n\ntype AITab =\n | 'overview'\n | 'templates'\n | 'contexts'\n | 'prompts'\n | 'instructions'\n | 'sessions'\n | 'queue'\n | 'tasks'\n | 'stats'\n | 'playground'\n | 'config';\n\nconst tabs: { id: AITab; icon: typeof LayoutDashboard }[] = [\n { id: 'overview', icon: LayoutDashboard },\n { id: 'templates', icon: FileCode2 },\n { id: 'contexts', icon: FileText },\n { id: 'prompts', icon: MessageSquare },\n { id: 'instructions', icon: ScrollText },\n { id: 'sessions', icon: MessagesSquare },\n { id: 'queue', icon: ListChecks },\n { id: 'tasks', icon: ListTodo },\n { id: 'stats', icon: BarChart3 },\n { id: 'playground', icon: Play },\n { id: 'config', icon: LayoutDashboard },\n];\n\nconst validTabs = new Set<string>(tabs.map((t) => t.id));\n\n/**\n * AI page — tab-based layout for AI / vibecoding features.\n *\n * URL shape:\n * /ai-tools → routed to /ai-tools/ai/overview (handled in VibeControlsRoutes).\n * /ai-tools/plan → Plan mode (full-bleed plannotator iframe panel).\n * /ai-tools/ai/:tab → AI mode (the existing 9 sub-tabs).\n *\n * The mode toggle below `PageHeader` switches between the two without a\n * full route reload — the AIPlanPanel inside Plan mode reuses the same\n * agent context that AI mode already loaded.\n */\nexport function AIPage() {\n const { t } = useI18n();\n // The AI surface is agent-centric — gate it on `agent:read`, consistent\n // with AgentsLandingPage (defense-in-depth; the gateway enforces it too).\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canReadAgents = hasPermission(VIBE_PERMISSIONS.AGENT_READ);\n const { tab: tabParam } = useParams<{ tab?: string }>();\n const planRouteMatch = useMatch('vibecontrols/ai-tools/plan');\n const activeMode: AIMode = planRouteMatch ? 'plan' : 'ai';\n const activeTab: AITab = tabParam && validTabs.has(tabParam) ? (tabParam as AITab) : 'overview';\n const handleNavigate = useVibeNavigate();\n\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const tabLabel = useCallback(\n (tabId: AITab): string => {\n switch (tabId) {\n case 'overview':\n return tr('ai.overview', 'Overview');\n case 'templates':\n return tr('ai.templates', 'Templates');\n case 'contexts':\n return tr('ai.contexts', 'Contexts');\n case 'prompts':\n return tr('ai.prompts', 'Prompts');\n case 'instructions':\n return tr('ai.instructions', 'Instructions');\n case 'sessions':\n return tr('nav.sessions', 'Sessions');\n case 'queue':\n return tr('ai.queue', 'Queue');\n case 'tasks':\n return tr('ai.tasks', 'Tasks');\n case 'stats':\n return tr('ai.stats', 'Stats');\n case 'playground':\n return tr('ai.playground', 'Playground');\n case 'config':\n return tr('ai.config', 'Config');\n default:\n return tabId;\n }\n },\n [tr]\n );\n\n const { agents, loading: agentsLoading, error: agentsError, refetch } = useCachedInitialData();\n\n // If the initial data query throws (e.g. gateway query-cost limit, network\n // error, transient federation issue), surface a friendly fallback rather\n // than the raw GraphQL error. The technical details still go to the console\n // for debuggability — without PII, since the error message itself never\n // contains secrets.\n if (agentsError) {\n console.error('[ai] failed to load initial workspace data', agentsError);\n }\n const activeAgent = useMemo(\n () => agents.find((agent) => agent.isActive && agent.tunnelUrl) ?? null,\n [agents]\n );\n const agentId = activeAgent?.id ?? '';\n // AgentRef threads the canonical agent → profile → plugins/data\n // hierarchy through every aiApi call. Components receive the ref\n // and construct paths via `agentApiPath(profile, ...)`.\n const { active: activeProfile } = useActiveAgentProfile(activeAgent?.id ?? null);\n const agentRef = useMemo(\n () => ({ id: agentId, profile: activeProfile }),\n [agentId, activeProfile]\n );\n\n const switchTab = useCallback(\n (tab: AITab) => {\n handleNavigate(tab === 'overview' ? '/ai-tools/ai' : `/ai-tools/ai/${tab}`);\n },\n [handleNavigate]\n );\n\n const navigateToSession = useCallback(\n (sessionId: string) => {\n handleNavigate(`/ai-tools/sessions/${sessionId}`);\n },\n [handleNavigate]\n );\n\n const hasAgent = !!agentId;\n\n // Surface install lifecycle for debuggability. PluginGate / PluginHarnessPicker\n // already render inline error chips, but a console breadcrumb + a top-level\n // banner helps when the install actually succeeds on the agent but a stale\n // detection cache hides the success — without this the install button looked\n // like it silently swallowed errors.\n const [lastInstallNote, setLastInstallNote] = useState<string | null>(null);\n // PluginGate fires this only on the unsatisfied → satisfied transition (once\n // the orchestrator is actually live on the agent). When that happens, route\n // straight into the AI chat (AgentManagerPage at `/ai`) instead of leaving\n // the user on a \"Refreshing…\" note that needed a manual reload (G5). No\n // window.location.reload() — the SPA navigation re-renders the workbench with\n // the freshly-detected plugin state.\n const handleInstalled = useCallback(() => {\n setLastInstallNote(tr('ai.pluginInstalled', 'Plugin installed. Opening AI chat…'));\n console.info('[ai] orchestrator install completed — navigating to AI chat');\n handleNavigate('/ai');\n }, [tr, handleNavigate]);\n const handleHarnessChange = useCallback(() => {\n setLastInstallNote(tr('ai.harnessUpdated', 'Harness updated.'));\n\n console.info('[ai] harness picker changed');\n }, [tr]);\n\n if (permissionsLoading) {\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n <PageSkeleton variant=\"detail\" />\n </MotionPage>\n );\n }\n\n if (!canReadAgents) {\n return (\n <AccessDenied\n title={tr('ai.denied.title', 'Access Denied')}\n description={tr('ai.denied.description', 'You do not have permission to view AI features.')}\n />\n );\n }\n\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n <PageHeader\n title={tr('nav.ai', 'AI')}\n description={tr(\n 'ai.description',\n 'Manage AI sessions, prompts, templates, and contexts for your vibecoding workflow'\n )}\n />\n\n <PagePurpose icon={<MessageSquare className=\"size-4\" />}>\n {tr(\n 'ai.purpose',\n 'This is your AI workspace for vibecoding — chat with an assistant that has your vibe’s context, save reusable prompts and templates, plan multi-step work, and review past AI sessions. Switch between Plan mode (break work into steps) and AI mode (the full toolset) to go from idea to running code without leaving VibeControls.'\n )}\n </PagePurpose>\n\n {/* Mode pivot — Plan / AI. Sits below PageHeader, above the\n AI-mode sub-tab strip. Switching to Plan hides the 9 sub-tabs\n and renders the AIPlanPanel in their place. Stays inside\n /ai-tools so the active sub-tab survives the toggle. */}\n {/* AIModeToggle is a custom component that doesn't forward rest props\n onto a DOM node, so the tour anchor lives on a wrapper <div>. */}\n <div data-tour=\"vibecontrols-ai-mode-toggle\">\n <AIModeToggle aiHref={`/ai-tools/ai/${activeTab}`} activeMode={activeMode} />\n </div>\n\n {/* AI sub-tab navigation — only rendered in AI mode. */}\n {activeMode === 'ai' && (\n <div\n className=\"border-b border-border-default -mx-4 sm:-mx-6 px-4 sm:px-6\"\n data-tour=\"vibecontrols-ai-tabs-nav\"\n >\n <nav className=\"flex gap-1 overflow-x-auto pb-1\" role=\"tablist\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n const isActive = activeTab === tab.id;\n return (\n <button\n type=\"button\"\n key={tab.id}\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => switchTab(tab.id)}\n className={`flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-t-md border-b-2 px-2.5 py-2 text-xs font-medium transition-colors sm:px-3 sm:py-2.5 sm:text-sm ${\n isActive\n ? 'border-action-primary-bg text-action-primary-bg'\n : 'border-transparent text-text-secondary hover:text-text-primary hover:border-border-default'\n }`}\n >\n <Icon className=\"size-3.5 sm:h-4 sm:w-4\" />\n {tabLabel(tab.id)}\n </button>\n );\n })}\n </nav>\n </div>\n )}\n\n {/* Content */}\n {agentsLoading && agents.length === 0 ? (\n <PageSkeleton variant=\"rows\" count={6} />\n ) : agentsError ? (\n <ErrorState\n title={tr('ai.loadFailed.title', 'Could not load the AI workspace')}\n message={tr(\n 'ai.loadFailed.message',\n \"We couldn't load the AI workspace. Please try again in a moment.\"\n )}\n onRetry={refetch}\n />\n ) : !hasAgent ? (\n <EmptyState\n icon={<MessagesSquare className=\"size-8 text-text-secondary\" />}\n title={tr('ai.noActiveAgent', 'No active agent available')}\n description={tr(\n 'ai.noActiveAgentDescription',\n 'AI features require an active agent with a configured tunnel URL and API key. Add an agent or start an existing one.'\n )}\n action={\n <button\n type=\"button\"\n onClick={() => handleNavigate('/agents')}\n className=\"px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors text-sm\"\n >\n {tr('ai.goToAgents', 'Go to Agents')}\n </button>\n }\n />\n ) : activeMode === 'plan' ? (\n <RequireAgentReachable agentId={agentId}>\n <AIPlanPanel agent={agentRef} tunnelUrl={activeAgent?.tunnelUrl ?? null} />\n </RequireAgentReachable>\n ) : (\n <RequireAgentReachable agentId={agentId}>\n {/* PluginGate is a custom component that doesn't forward rest props\n onto a DOM node, so the tour anchor lives on a wrapper <div>. */}\n <div data-tour=\"vibecontrols-ai-plugin-gate\">\n <PluginGate\n agentId={agentId}\n required={[AI_CORE_PACKAGE]}\n mode=\"all\"\n eyebrow={tr('ai.pluginRequired', 'AI plugin required')}\n title={tr('ai.installOrchestrator', 'Install the AI orchestrator')}\n description={tr(\n 'ai.installOrchestratorDesc',\n 'The AI page routes prompts and sessions through the AI orchestrator plugin on your agent. Install it to continue.'\n )}\n onInstalled={handleInstalled}\n >\n <div className=\"space-y-6\">\n {lastInstallNote && (\n <div\n role=\"status\"\n className=\"rounded-md border border-status-success-border bg-status-success-bg px-3 py-2 text-xs text-status-success-text\"\n >\n {lastInstallNote}\n </div>\n )}\n <PluginHarnessPicker\n agentId={agentId}\n packages={AI_PROVIDER_PACKAGES}\n title={tr('ai.harnessesTitle', 'AI harnesses')}\n description={tr(\n 'ai.harnessesDesc',\n 'Install and manage the coding-agent harnesses available on this agent. You can install multiple and switch between them per-session.'\n )}\n onChange={handleHarnessChange}\n />\n <div>\n {activeTab === 'overview' && (\n <AIOverviewTab agent={agentRef} onNavigateToSession={navigateToSession} />\n )}\n {activeTab === 'templates' && <AITemplatesTab agentId={agentId} />}\n {activeTab === 'contexts' && <AIContextsTab agent={agentRef} />}\n {activeTab === 'prompts' && <AIPromptsTab agent={agentRef} />}\n {activeTab === 'instructions' && <InstructionFilesManager agentId={agentId} />}\n {activeTab === 'sessions' && (\n <AISessionsTab agent={agentRef} onNavigateToSession={navigateToSession} />\n )}\n {activeTab === 'queue' && (\n <AIQueueTab agent={agentRef} onNavigateToSession={navigateToSession} />\n )}\n {activeTab === 'tasks' && <AITasksTab />}\n {activeTab === 'stats' && <AIStatsTab agent={agentRef} />}\n {activeTab === 'playground' && <AIPlaygroundTab agent={agentRef} />}\n {activeTab === 'config' && (\n <div className=\"space-y-6\">\n <ClaudeCredentialsCard agent={agentRef} />\n <BridleConfigPanel agent={agentRef} />\n </div>\n )}\n </div>\n </div>\n </PluginGate>\n </div>\n </RequireAgentReachable>\n )}\n </MotionPage>\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.625.3",
3
+ "version": "2026.626.2",
4
4
  "description": "VibeControls microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [
@@ -59,7 +59,7 @@
59
59
  "license": "PROPRIETARY",
60
60
  "dependencies": {
61
61
  "@apollo/client": "4.1.9",
62
- "@burdenoff/fe-libs": "2026.625.3",
62
+ "@burdenoff/fe-libs": "2026.625.5",
63
63
  "@tanstack/react-query": "^5.90.16",
64
64
  "@xyflow/react": "^12.10.2",
65
65
  "clsx": "^2.1.1",