@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.
- package/dist/components/agents/AgentForm.js +129 -127
- package/dist/components/agents/AgentForm.js.map +1 -1
- package/dist/components/shared/InstallTabs.js +19 -7
- package/dist/components/shared/InstallTabs.js.map +1 -1
- package/dist/pages/ActionsPage.js +209 -204
- package/dist/pages/ActionsPage.js.map +1 -1
- package/dist/pages/AgentDetailsPage.js +678 -648
- package/dist/pages/AgentDetailsPage.js.map +1 -1
- package/dist/pages/AgentGraphPage.js +112 -108
- package/dist/pages/AgentGraphPage.js.map +1 -1
- package/dist/pages/AgentsPage.js +159 -155
- package/dist/pages/AgentsPage.js.map +1 -1
- package/dist/pages/AnalyticsPage.js +140 -136
- package/dist/pages/AnalyticsPage.js.map +1 -1
- package/dist/pages/CatalogDetailPage.js +249 -244
- package/dist/pages/CatalogDetailPage.js.map +1 -1
- package/dist/pages/CatalogPage.js +73 -68
- package/dist/pages/CatalogPage.js.map +1 -1
- package/dist/pages/ComponentDetailPage.js +195 -164
- package/dist/pages/ComponentDetailPage.js.map +1 -1
- package/dist/pages/ComponentsPage.js +80 -75
- package/dist/pages/ComponentsPage.js.map +1 -1
- package/dist/pages/EnvTopologyPage.js +100 -95
- package/dist/pages/EnvTopologyPage.js.map +1 -1
- package/dist/pages/HealthPage.js +331 -204
- package/dist/pages/HealthPage.js.map +1 -1
- package/dist/pages/LogsPage.js +54 -49
- package/dist/pages/LogsPage.js.map +1 -1
- package/dist/pages/OverviewPage.js +159 -129
- package/dist/pages/OverviewPage.js.map +1 -1
- package/dist/pages/PluginsCatalogPage.js +72 -78
- package/dist/pages/PluginsCatalogPage.js.map +1 -1
- package/dist/pages/SessionDetailsPage.js +517 -512
- package/dist/pages/SessionDetailsPage.js.map +1 -1
- package/dist/pages/SessionsPage.js +1084 -1079
- package/dist/pages/SessionsPage.js.map +1 -1
- package/dist/pages/SettingsPage.js +107 -103
- package/dist/pages/SettingsPage.js.map +1 -1
- package/dist/pages/TargetDetailsPage.js +131 -123
- package/dist/pages/TargetDetailsPage.js.map +1 -1
- package/dist/pages/TargetsPage.js +198 -194
- package/dist/pages/TargetsPage.js.map +1 -1
- package/dist/pages/TemplatesPage.js +77 -71
- package/dist/pages/TemplatesPage.js.map +1 -1
- package/dist/pages/VibeAuditPage.js +83 -78
- package/dist/pages/VibeAuditPage.js.map +1 -1
- package/dist/pages/VibeCalendarPage.js +109 -104
- package/dist/pages/VibeCalendarPage.js.map +1 -1
- package/dist/pages/VibeDeckPage.js +222 -217
- package/dist/pages/VibeDeckPage.js.map +1 -1
- package/dist/pages/VibeDetailsPage.js +532 -501
- package/dist/pages/VibeDetailsPage.js.map +1 -1
- package/dist/pages/VibesPage.js +137 -133
- package/dist/pages/VibesPage.js.map +1 -1
- package/dist/pages/WebhooksPage.js +329 -324
- package/dist/pages/WebhooksPage.js.map +1 -1
- package/dist/pages/ai/AIPage.js +149 -144
- package/dist/pages/ai/AIPage.js.map +1 -1
- package/package.json +2 -2
package/dist/pages/ai/AIPage.js
CHANGED
|
@@ -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
|
|
5
|
-
import { EmptyState as
|
|
6
|
-
import { AI_CORE_PACKAGE as
|
|
7
|
-
import { PluginGate as
|
|
8
|
-
import { RequireAgentReachable as
|
|
9
|
-
import { useActiveAgentProfile as
|
|
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
|
|
12
|
-
import { PageSkeleton as
|
|
13
|
-
import { PluginHarnessPicker as
|
|
14
|
-
import { AITemplatesTab as
|
|
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
|
|
17
|
-
import { AITasksTab as
|
|
18
|
-
import { AIStatsTab as
|
|
19
|
-
import { AIPlaygroundTab as
|
|
20
|
-
import { BridleConfigPanel as
|
|
21
|
-
import { AIOverviewTab as
|
|
22
|
-
import { InstructionFilesManager as
|
|
23
|
-
import { AISessionsTab as
|
|
24
|
-
import { AIQueueTab as
|
|
25
|
-
import { ClaudeCredentialsCard as
|
|
26
|
-
import { AIPlanPanel as
|
|
27
|
-
import { AIModeToggle as
|
|
28
|
-
import { useCallback as
|
|
29
|
-
import { useI18n as
|
|
30
|
-
import { BarChart3 as
|
|
31
|
-
import { useMatch as
|
|
32
|
-
import { usePermissions as
|
|
33
|
-
import { jsx as
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
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
|
|
38
|
+
var z = [
|
|
38
39
|
{
|
|
39
40
|
id: "overview",
|
|
40
|
-
icon:
|
|
41
|
+
icon: w
|
|
41
42
|
},
|
|
42
43
|
{
|
|
43
44
|
id: "templates",
|
|
44
|
-
icon:
|
|
45
|
+
icon: S
|
|
45
46
|
},
|
|
46
47
|
{
|
|
47
48
|
id: "contexts",
|
|
48
|
-
icon:
|
|
49
|
+
icon: C
|
|
49
50
|
},
|
|
50
51
|
{
|
|
51
52
|
id: "prompts",
|
|
52
|
-
icon:
|
|
53
|
+
icon: D
|
|
53
54
|
},
|
|
54
55
|
{
|
|
55
56
|
id: "instructions",
|
|
56
|
-
icon:
|
|
57
|
+
icon: A
|
|
57
58
|
},
|
|
58
59
|
{
|
|
59
60
|
id: "sessions",
|
|
60
|
-
icon:
|
|
61
|
+
icon: O
|
|
61
62
|
},
|
|
62
63
|
{
|
|
63
64
|
id: "queue",
|
|
64
|
-
icon:
|
|
65
|
+
icon: T
|
|
65
66
|
},
|
|
66
67
|
{
|
|
67
68
|
id: "tasks",
|
|
68
|
-
icon:
|
|
69
|
+
icon: E
|
|
69
70
|
},
|
|
70
71
|
{
|
|
71
72
|
id: "stats",
|
|
72
|
-
icon:
|
|
73
|
+
icon: x
|
|
73
74
|
},
|
|
74
75
|
{
|
|
75
76
|
id: "playground",
|
|
76
|
-
icon:
|
|
77
|
+
icon: k
|
|
77
78
|
},
|
|
78
79
|
{
|
|
79
80
|
id: "config",
|
|
80
|
-
icon:
|
|
81
|
+
icon: w
|
|
81
82
|
}
|
|
82
|
-
],
|
|
83
|
-
function
|
|
84
|
-
let { t:
|
|
85
|
-
let n =
|
|
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
|
-
}, [
|
|
88
|
+
}, [x]), H = y((e) => {
|
|
88
89
|
switch (e) {
|
|
89
|
-
case "overview": return
|
|
90
|
-
case "templates": return
|
|
91
|
-
case "contexts": return
|
|
92
|
-
case "prompts": return
|
|
93
|
-
case "instructions": return
|
|
94
|
-
case "sessions": return
|
|
95
|
-
case "queue": return
|
|
96
|
-
case "tasks": return
|
|
97
|
-
case "stats": return
|
|
98
|
-
case "playground": return
|
|
99
|
-
case "config": return
|
|
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
|
-
}, [
|
|
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
|
|
105
|
-
id:
|
|
106
|
-
profile:
|
|
107
|
-
}), [
|
|
108
|
-
|
|
109
|
-
}, [
|
|
110
|
-
|
|
111
|
-
}, [
|
|
112
|
-
$(
|
|
113
|
-
}, [
|
|
114
|
-
$(
|
|
115
|
-
}, [
|
|
116
|
-
return
|
|
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__ */
|
|
119
|
-
}) :
|
|
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__ */
|
|
123
|
-
title:
|
|
124
|
-
description:
|
|
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__ */
|
|
131
|
+
/* @__PURE__ */ P("div", {
|
|
127
132
|
"data-tour": "vibecontrols-ai-mode-toggle",
|
|
128
|
-
children: /* @__PURE__ */
|
|
133
|
+
children: /* @__PURE__ */ P(se, {
|
|
129
134
|
aiHref: `/ai-tools/ai/${k}`,
|
|
130
|
-
activeMode:
|
|
135
|
+
activeMode: E
|
|
131
136
|
})
|
|
132
137
|
}),
|
|
133
|
-
|
|
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__ */
|
|
141
|
+
children: /* @__PURE__ */ P("nav", {
|
|
137
142
|
className: "flex gap-1 overflow-x-auto pb-1",
|
|
138
143
|
role: "tablist",
|
|
139
|
-
children:
|
|
144
|
+
children: z.map((e) => {
|
|
140
145
|
let t = e.icon, n = k === e.id;
|
|
141
|
-
return /* @__PURE__ */
|
|
146
|
+
return /* @__PURE__ */ F("button", {
|
|
142
147
|
type: "button",
|
|
143
148
|
role: "tab",
|
|
144
149
|
"aria-selected": n,
|
|
145
|
-
onClick: () =>
|
|
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__ */
|
|
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__ */
|
|
157
|
+
W && U.length === 0 ? /* @__PURE__ */ P(c, {
|
|
153
158
|
variant: "rows",
|
|
154
159
|
count: 6
|
|
155
|
-
}) : G ? /* @__PURE__ */
|
|
156
|
-
title:
|
|
157
|
-
message:
|
|
158
|
-
onRetry:
|
|
159
|
-
}) :
|
|
160
|
-
agentId:
|
|
161
|
-
children: /* @__PURE__ */
|
|
162
|
-
agent:
|
|
163
|
-
tunnelUrl:
|
|
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__ */
|
|
166
|
-
agentId:
|
|
167
|
-
children: /* @__PURE__ */
|
|
170
|
+
}) : /* @__PURE__ */ P(a, {
|
|
171
|
+
agentId: q,
|
|
172
|
+
children: /* @__PURE__ */ P("div", {
|
|
168
173
|
"data-tour": "vibecontrols-ai-plugin-gate",
|
|
169
|
-
children: /* @__PURE__ */
|
|
170
|
-
agentId:
|
|
171
|
-
required: [
|
|
174
|
+
children: /* @__PURE__ */ P(ne, {
|
|
175
|
+
agentId: q,
|
|
176
|
+
required: [ee],
|
|
172
177
|
mode: "all",
|
|
173
|
-
eyebrow:
|
|
174
|
-
title:
|
|
175
|
-
description:
|
|
176
|
-
onInstalled:
|
|
177
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
186
|
-
agentId:
|
|
187
|
-
packages:
|
|
188
|
-
title:
|
|
189
|
-
description:
|
|
190
|
-
onChange:
|
|
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__ */
|
|
193
|
-
k === "overview" && /* @__PURE__ */
|
|
194
|
-
agent:
|
|
195
|
-
onNavigateToSession:
|
|
197
|
+
/* @__PURE__ */ F("div", { children: [
|
|
198
|
+
k === "overview" && /* @__PURE__ */ P(g, {
|
|
199
|
+
agent: Y,
|
|
200
|
+
onNavigateToSession: X
|
|
196
201
|
}),
|
|
197
|
-
k === "templates" && /* @__PURE__ */
|
|
198
|
-
k === "contexts" && /* @__PURE__ */
|
|
199
|
-
k === "prompts" && /* @__PURE__ */
|
|
200
|
-
k === "instructions" && /* @__PURE__ */
|
|
201
|
-
k === "sessions" && /* @__PURE__ */
|
|
202
|
-
agent:
|
|
203
|
-
onNavigateToSession:
|
|
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__ */
|
|
206
|
-
agent:
|
|
207
|
-
onNavigateToSession:
|
|
210
|
+
k === "queue" && /* @__PURE__ */ P(ie, {
|
|
211
|
+
agent: Y,
|
|
212
|
+
onNavigateToSession: X
|
|
208
213
|
}),
|
|
209
|
-
k === "tasks" && /* @__PURE__ */
|
|
210
|
-
k === "stats" && /* @__PURE__ */
|
|
211
|
-
k === "playground" && /* @__PURE__ */
|
|
212
|
-
k === "config" && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
222
|
-
icon: /* @__PURE__ */
|
|
223
|
-
title:
|
|
224
|
-
description:
|
|
225
|
-
action: /* @__PURE__ */
|
|
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: () =>
|
|
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:
|
|
234
|
+
children: V("ai.goToAgents", "Go to Agents")
|
|
230
235
|
})
|
|
231
236
|
})
|
|
232
237
|
]
|
|
233
|
-
}) : /* @__PURE__ */
|
|
234
|
-
title:
|
|
235
|
-
description:
|
|
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 {
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,IAAM,IAAsD;CAC1D;EAAE,IAAI;EAAY,MAAM;EAAiB;CACzC;EAAE,IAAI;EAAa,MAAM;EAAW;CACpC;EAAE,IAAI;EAAY,MAAM;EAAU;CAClC;EAAE,IAAI;EAAW,MAAM;EAAe;CACtC;EAAE,IAAI;EAAgB,MAAM;EAAY;CACxC;EAAE,IAAI;EAAY,MAAM;EAAgB;CACxC;EAAE,IAAI;EAAS,MAAM;EAAY;CACjC;EAAE,IAAI;EAAS,MAAM;EAAU;CAC/B;EAAE,IAAI;EAAS,MAAM;EAAW;CAChC;EAAE,IAAI;EAAc,MAAM;EAAM;CAChC;EAAE,IAAI;EAAU,MAAM;EAAiB;CACxC,EAEK,IAAY,IAAI,IAAY,EAAK,KAAK,MAAM,EAAE,GAAG,CAAC;AAcxD,SAAgB,IAAS;CACvB,IAAM,EAAE,SAAM,IAAS,EAGjB,EAAE,kBAAe,WAAW,MAAuB,GAAgB,EACnE,IAAgB,EAAc,EAAiB,WAAW,EAC1D,EAAE,KAAK,MAAa,GAA6B,EAEjD,IADiB,EAAS,6BAA6B,GACjB,SAAS,MAC/C,IAAmB,KAAY,EAAU,IAAI,EAAS,GAAI,IAAqB,YAC/E,IAAiB,GAAiB,EAElC,IAAK,GACR,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAE,CACJ,EAEK,IAAW,GACd,MAAyB;AACxB,UAAQ,GAAR;GACE,KAAK,WACH,QAAO,EAAG,eAAe,WAAW;GACtC,KAAK,YACH,QAAO,EAAG,gBAAgB,YAAY;GACxC,KAAK,WACH,QAAO,EAAG,eAAe,WAAW;GACtC,KAAK,UACH,QAAO,EAAG,cAAc,UAAU;GACpC,KAAK,eACH,QAAO,EAAG,mBAAmB,eAAe;GAC9C,KAAK,WACH,QAAO,EAAG,gBAAgB,WAAW;GACvC,KAAK,QACH,QAAO,EAAG,YAAY,QAAQ;GAChC,KAAK,QACH,QAAO,EAAG,YAAY,QAAQ;GAChC,KAAK,QACH,QAAO,EAAG,YAAY,QAAQ;GAChC,KAAK,aACH,QAAO,EAAG,iBAAiB,aAAa;GAC1C,KAAK,SACH,QAAO,EAAG,aAAa,SAAS;GAClC,QACE,QAAO;;IAGb,CAAC,EAAG,CACL,EAEK,EAAE,WAAQ,SAAS,GAAe,OAAO,GAAa,eAAY,GAAsB;AAO9F,CAAI,KACF,QAAQ,MAAM,8CAA8C,EAAY;CAE1E,IAAM,IAAc,QACZ,EAAO,MAAM,MAAU,EAAM,YAAY,EAAM,UAAU,IAAI,MACnE,CAAC,EAAO,CACT,EACK,IAAU,GAAa,MAAM,IAI7B,EAAE,QAAQ,MAAkB,EAAsB,GAAa,MAAM,KAAK,EAC1E,IAAW,SACR;EAAE,IAAI;EAAS,SAAS;EAAe,GAC9C,CAAC,GAAS,EAAc,CACzB,EAEK,KAAY,GACf,MAAe;AACd,IAAe,MAAQ,aAAa,iBAAiB,gBAAgB,IAAM;IAE7E,CAAC,EAAe,CACjB,EAEK,IAAoB,GACvB,MAAsB;AACrB,IAAe,sBAAsB,IAAY;IAEnD,CAAC,EAAe,CACjB,EAEK,KAAW,CAAC,CAAC,GAOb,CAAC,GAAiB,KAAsB,GAAwB,KAAK,EAOrE,KAAkB,QAAkB;AAGxC,EAFA,EAAmB,EAAG,sBAAsB,qCAAqC,CAAC,EAClF,QAAQ,KAAK,8DAA8D,EAC3E,EAAe,MAAM;IACpB,CAAC,GAAI,EAAe,CAAC,EAClB,KAAsB,QAAkB;AAG5C,EAFA,EAAmB,EAAG,qBAAqB,mBAAmB,CAAC,EAE/D,QAAQ,KAAK,8BAA8B;IAC1C,CAAC,EAAG,CAAC;AAmBR,QAjBI,IAEA,kBAAC,GAAD;EAAY,WAAU;YACpB,kBAAC,GAAD,EAAc,SAAQ,UAAW,CAAA;EACtB,CAAA,GAIZ,IAUH,kBAAC,GAAD;EAAY,WAAU;YAAtB;GACE,kBAAC,GAAD;IACE,OAAO,EAAG,UAAU,KAAK;IACzB,aAAa,EACX,kBACA,oFACD;IACD,CAAA;GAQF,kBAAC,OAAD;IAAK,aAAU;cACb,kBAAC,GAAD;KAAc,QAAQ,gBAAgB;KAAyB;KAAc,CAAA;IACzE,CAAA;GAGL,MAAe,QACd,kBAAC,OAAD;IACE,WAAU;IACV,aAAU;cAEV,kBAAC,OAAD;KAAK,WAAU;KAAkC,MAAK;eACnD,EAAK,KAAK,MAAQ;MACjB,IAAM,IAAO,EAAI,MACX,IAAW,MAAc,EAAI;AACnC,aACE,kBAAC,UAAD;OACE,MAAK;OAEL,MAAK;OACL,iBAAe;OACf,eAAe,GAAU,EAAI,GAAG;OAChC,WAAW,+JACT,IACI,oDACA;iBATR,CAYE,kBAAC,GAAD,EAAM,WAAU,0BAA2B,CAAA,EAC1C,EAAS,EAAI,GAAG,CACV;SAZF,EAAI,GAYF;OAEX;KACE,CAAA;IACF,CAAA;GAIP,KAAiB,EAAO,WAAW,IAClC,kBAAC,GAAD;IAAc,SAAQ;IAAO,OAAO;IAAK,CAAA,GACvC,IACF,kBAAC,IAAD;IACE,OAAO,EAAG,uBAAuB,kCAAkC;IACnE,SAAS,EACP,yBACA,mEACD;IACD,SAAS;IACT,CAAA,GACC,KAkBD,MAAe,SACjB,kBAAC,GAAD;IAAgC;cAC9B,kBAAC,GAAD;KAAa,OAAO;KAAU,WAAW,GAAa,aAAa;KAAQ,CAAA;IACrD,CAAA,GAExB,kBAAC,GAAD;IAAgC;cAG9B,kBAAC,OAAD;KAAK,aAAU;eACb,kBAAC,GAAD;MACW;MACT,UAAU,CAAC,EAAgB;MAC3B,MAAK;MACL,SAAS,EAAG,qBAAqB,qBAAqB;MACtD,OAAO,EAAG,0BAA0B,8BAA8B;MAClE,aAAa,EACX,8BACA,oHACD;MACD,aAAa;gBAEb,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACG,KACC,kBAAC,OAAD;SACE,MAAK;SACL,WAAU;mBAET;SACG,CAAA;QAER,kBAAC,IAAD;SACW;SACT,UAAU;SACV,OAAO,EAAG,qBAAqB,eAAe;SAC9C,aAAa,EACX,oBACA,uIACD;SACD,UAAU;SACV,CAAA;QACF,kBAAC,OAAD,EAAA,UAAA;SACG,MAAc,cACb,kBAAC,GAAD;UAAe,OAAO;UAAU,qBAAqB;UAAqB,CAAA;SAE3E,MAAc,eAAe,kBAAC,IAAD,EAAyB,YAAW,CAAA;SACjE,MAAc,cAAc,kBAAC,GAAD,EAAe,OAAO,GAAY,CAAA;SAC9D,MAAc,aAAa,kBAAC,IAAD,EAAc,OAAO,GAAY,CAAA;SAC5D,MAAc,kBAAkB,kBAAC,GAAD,EAAkC,YAAW,CAAA;SAC7E,MAAc,cACb,kBAAC,IAAD;UAAe,OAAO;UAAU,qBAAqB;UAAqB,CAAA;SAE3E,MAAc,WACb,kBAAC,GAAD;UAAY,OAAO;UAAU,qBAAqB;UAAqB,CAAA;SAExE,MAAc,WAAW,kBAAC,GAAD,EAAc,CAAA;SACvC,MAAc,WAAW,kBAAC,GAAD,EAAY,OAAO,GAAY,CAAA;SACxD,MAAc,gBAAgB,kBAAC,GAAD,EAAiB,OAAO,GAAY,CAAA;SAClE,MAAc,YACb,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAuB,OAAO,GAAY,CAAA,EAC1C,kBAAC,IAAD,EAAmB,OAAO,GAAY,CAAA,CAClC;;SAEJ,EAAA,CAAA;QACF;;MACK,CAAA;KACT,CAAA;IACgB,CAAA,GApFxB,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD,EAAgB,WAAU,8BAA+B,CAAA;IAC/D,OAAO,EAAG,oBAAoB,4BAA4B;IAC1D,aAAa,EACX,+BACA,uHACD;IACD,QACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAe,UAAU;KACxC,WAAU;eAET,EAAG,iBAAiB,eAAe;KAC7B,CAAA;IAEX,CAAA;GAsEO;MA9JX,kBAAC,GAAD;EACE,OAAO,EAAG,mBAAmB,gBAAgB;EAC7C,aAAa,EAAG,yBAAyB,kDAAkD;EAC3F,CAAA"}
|
|
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.
|
|
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.
|
|
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",
|