@burdenoff/microfe-bigconsole 2026.624.2 → 2026.625.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/bigconsole/BigConsoleRoutes.js +93 -93
  2. package/dist/bigconsole/assistant/assistantApi.js +215 -0
  3. package/dist/bigconsole/assistant/assistantApi.js.map +1 -0
  4. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js +119 -0
  5. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js.map +1 -0
  6. package/dist/bigconsole/assistant/index.js +2 -0
  7. package/dist/bigconsole/assistant/pageContext.js +51 -0
  8. package/dist/bigconsole/assistant/pageContext.js.map +1 -0
  9. package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +48 -48
  10. package/dist/bigconsole/components/dashboard/DashboardToolbar.js +52 -52
  11. package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
  12. package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +33 -33
  13. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +179 -179
  14. package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
  15. package/dist/bigconsole/components/dashboard/WidgetPalette.js +38 -38
  16. package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +32 -32
  17. package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +31 -31
  18. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +98 -98
  19. package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
  20. package/dist/bigconsole/components/parser/ExportParserDialog.js +31 -31
  21. package/dist/bigconsole/components/parser/ImportParserDialog.js +162 -162
  22. package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
  23. package/dist/bigconsole/components/widgets/ActionConfigDialog.js +79 -79
  24. package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
  25. package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
  26. package/dist/bigconsole/components/widgets/PropertiesPanel.js +307 -307
  27. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  28. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js +222 -222
  29. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js.map +1 -1
  30. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +23 -23
  31. package/dist/bigconsole/index.js +3 -0
  32. package/dist/bigconsole/pages/DashboardBuilderPage.js +74 -74
  33. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  34. package/dist/bigconsole/pages/DashboardViewPage.js +168 -189
  35. package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
  36. package/dist/bigconsole/pages/DashboardsPage.js +266 -310
  37. package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
  38. package/dist/bigconsole/pages/DataParsersPage.js +148 -194
  39. package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
  40. package/dist/bigconsole/pages/DataSinkBuilderPage.js +252 -246
  41. package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
  42. package/dist/bigconsole/pages/DataSinkViewPage.js +256 -231
  43. package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
  44. package/dist/bigconsole/pages/DataSinksPage.js +173 -219
  45. package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
  46. package/dist/bigconsole/pages/HomePage.js +125 -141
  47. package/dist/bigconsole/pages/HomePage.js.map +1 -1
  48. package/dist/bigconsole/pages/InsightsPage.js +159 -184
  49. package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
  50. package/dist/bigconsole/pages/ParserBuilderPage.js +401 -393
  51. package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
  52. package/dist/bigconsole/pages/ParserViewPage.js +220 -201
  53. package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
  54. package/dist/bigconsole/pages/PipelineBuilderPage.js +212 -206
  55. package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
  56. package/dist/bigconsole/pages/PipelineViewPage.js +204 -181
  57. package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
  58. package/dist/bigconsole/pages/PipelinesPage.js +107 -150
  59. package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
  60. package/dist/bigconsole/pages/SettingsPage.js +184 -171
  61. package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
  62. package/dist/bigconsole/pages/WidgetDemoPage.js +69 -81
  63. package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
  64. package/dist/bigconsole/pages/WorkflowViewPage.js +230 -216
  65. package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
  66. package/dist/bigconsole/pages/WorkflowsPage.js +106 -149
  67. package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
  68. package/dist/generated/wspace-operations.js +87 -36
  69. package/dist/generated/wspace-operations.js.map +1 -1
  70. package/dist/index.js +3 -1
  71. package/package.json +6 -2
@@ -0,0 +1,119 @@
1
+ import { createAssistantSandbox as e, createAssistantSession as t, extendAssistantSandboxTTL as n, findExistingSandbox as r, getAssistantMessages as i, sendAssistantPromptAsync as a, waitForAssistantServiceReady as o, waitForSandboxReady as s } from "./assistantApi.js";
2
+ import { gatherPageContext as c } from "./pageContext.js";
3
+ import { useCallback as l, useMemo as u, useRef as d } from "react";
4
+ import { useAuthToken as f } from "@burdenoff/fe-libs/shared/providers/shell";
5
+ //#region src/bigconsole/assistant/createSandboxAssistantTransport.ts
6
+ var p = "assistant", m = 18e4, h = 1500, g = 3e4;
7
+ function _(e) {
8
+ try {
9
+ let t = e === "workspaceId" ? "burdenoff-active-context-workspace" : "burdenoff-active-context-organization", n = localStorage.getItem(t);
10
+ if (n) return n;
11
+ let r = sessionStorage.getItem("bf-active-profile");
12
+ if (!r) return "";
13
+ let i = localStorage.getItem(`bf-p-${r}-context`);
14
+ return i ? JSON.parse(i)[e] ?? "" : "";
15
+ } catch {
16
+ return "";
17
+ }
18
+ }
19
+ function v(e) {
20
+ return new URLSearchParams(window.location.search).get("workspace") ?? _("workspaceId") ?? e ?? "";
21
+ }
22
+ function y() {
23
+ return new URLSearchParams(window.location.search).get("org") ?? _("organizationId");
24
+ }
25
+ function b(e) {
26
+ return e.info?.time?.created ?? 0;
27
+ }
28
+ function x(e) {
29
+ return (e ?? []).filter((e) => e.type === "text" && typeof e.text == "string").map((e) => e.text?.trim() ?? "").filter(Boolean).join("\n");
30
+ }
31
+ function S(e) {
32
+ return (e ?? []).filter((e) => e.type === "tool" && e.tool).map((e) => {
33
+ let t = e.state?.status ?? "running", n = e.tool ?? "tool";
34
+ return t === "completed" ? `Completed: ${n}` : t === "failed" ? `Failed: ${n}` : `Running: ${n}`;
35
+ });
36
+ }
37
+ function C(e, t) {
38
+ let n = e.filter((e) => e.info?.role === "assistant" && b(e) >= t).sort((e, t) => b(e) - b(t));
39
+ if (n.length === 0) return {
40
+ content: "Thinking…",
41
+ done: !1
42
+ };
43
+ let r = n[n.length - 1], i = x(r.parts), a = S(r.parts);
44
+ return {
45
+ content: [i, ...a].filter(Boolean).join("\n\n") || "Thinking…",
46
+ done: !!r.info?.time?.completed && (!!i || a.length > 0)
47
+ };
48
+ }
49
+ function w(e) {
50
+ return e.replace(/(Authorization\s*:\s*Bearer\s+)[^\s\n]+/gi, "$1[REDACTED]").replace(/(X-Workspace-Authorization\s*:\s*Bearer\s+)[^\s\n]+/gi, "$1[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9._-]+\.[A-Za-z0-9._-]+\b/g, "[REDACTED_JWT]").replace(/\bsk-ant-[A-Za-z0-9-]+\b/g, "[REDACTED_API_KEY]");
51
+ }
52
+ function T(e) {
53
+ let t = e instanceof Error ? e.message.toLowerCase() : String(e).toLowerCase();
54
+ return t.includes("rate limit exceeded") || t.includes("unauthorized") || t.includes("k8s api error 401") ? !1 : [
55
+ "sandbox not found",
56
+ "sandbox is not running",
57
+ "sandbox service not available yet",
58
+ "sandbox failed",
59
+ "sandbox startup timed out",
60
+ "assistant service did not become healthy",
61
+ "proxy error: 404",
62
+ "proxy error: 502",
63
+ "proxy error: 503"
64
+ ].some((e) => t.includes(e));
65
+ }
66
+ function E() {
67
+ let { getAccessToken: _, getWorkspaceToken: b, userId: x, workspaceId: S } = f(), E = d(null), D = d(null), O = l(async (n, i) => {
68
+ let a = E.current;
69
+ if (!a) {
70
+ if (a = await r(n, p, i), !a) {
71
+ if (!_()) throw Error("The assistant requires an authenticated session. Please sign in again.");
72
+ a = await e(p, n, i);
73
+ }
74
+ await s(a, n, i), await o(a, n, i), E.current = a;
75
+ }
76
+ let c = D.current;
77
+ return c || (c = (await t(a, n, p, i)).sessionId, D.current = c), {
78
+ sandboxId: a,
79
+ sessionId: c
80
+ };
81
+ }, [_]), k = l(async ({ prompt: e, onProgress: t, signal: r }) => {
82
+ let o = v(S);
83
+ if (!o) throw Error("The assistant needs an active workspace. Open a workspace and try again.");
84
+ let s = {
85
+ accessToken: _(),
86
+ workspaceToken: b(),
87
+ userId: x,
88
+ organizationId: y()
89
+ }, l = async (u) => {
90
+ try {
91
+ let { sandboxId: l, sessionId: u } = await O(o, s), d = Date.now();
92
+ await a(l, o, u, e, p, c(), s);
93
+ let f = Date.now() + m, _ = Date.now(), v = C([], d);
94
+ for (; Date.now() < f;) {
95
+ if (r.aborted) throw Error("Cancelled");
96
+ if (v = C(await i(l, o, u, s, 50), d), t(w(v.content)), v.done) break;
97
+ Date.now() - _ > g && (await n(l, o, 600, s).catch(() => void 0), _ = Date.now()), await new Promise((e) => setTimeout(e, h));
98
+ }
99
+ if (!v.done) throw Error("The assistant timed out while responding. Please try again.");
100
+ return { text: w(v.content) };
101
+ } catch (e) {
102
+ if (u === 1 && T(e)) return E.current = null, D.current = null, l(2);
103
+ throw e;
104
+ }
105
+ };
106
+ return l(1);
107
+ }, [
108
+ S,
109
+ O,
110
+ _,
111
+ b,
112
+ x
113
+ ]);
114
+ return u(() => ({ sendPrompt: k }), [k]);
115
+ }
116
+ //#endregion
117
+ export { E as useSandboxAssistantTransport };
118
+
119
+ //# sourceMappingURL=createSandboxAssistantTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../../src/bigconsole/assistant/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * BigConsole adapter for the shared fe-libs AssistantWidget.\n *\n * The floating widget (fe-libs, Layer 1) is backend-agnostic — it calls an\n * injected `AssistantTransport`. This hook builds a transport that drives the\n * sandbox AI assistant (combined `assistant` mode = docs Q&A + api-calls): it\n * provisions/reuses a sandbox, opens a session, dispatches the prompt async,\n * then polls for the streamed answer. The agent introspects the GraphQL schema\n * and performs API calls on the user's behalf using their workspace token,\n * contextual to the current screen (via `gatherPageContext`).\n *\n * This is a faithful port of microfe-vibecontrols'\n * `services/createSandboxAssistantTransport.ts`; the only product-specific\n * difference lives in `assistantApi.createAssistantSandbox`\n * (`AI_ASSISTANT_PRODUCT=bigconsole`).\n */\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useAuthToken } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n createAssistantSandbox,\n createAssistantSession,\n extendAssistantSandboxTTL,\n findExistingSandbox,\n getAssistantMessages,\n sendAssistantPromptAsync,\n waitForAssistantServiceReady,\n waitForSandboxReady,\n} from './assistantApi';\nimport { gatherPageContext } from './pageContext';\nimport type { AssistantMode, AssistantRawMessage, AssistantSandboxAuthContext } from './types';\n\n/**\n * Locally-defined mirror of the fe-libs `AssistantTransport` contract.\n *\n * Intentionally NOT imported from `@burdenoff/fe-libs`: microfe's tsconfig maps\n * `@burdenoff/fe-libs/*` to fe-libs *source*, so vite-plugin-dts would rewrite a\n * cross-package type used in this hook's public signature to a broken\n * source-relative path in the emitted `.d.ts`. Structural typing makes this\n * shape assignable to fe-libs' `AssistantTransport` at the call site\n * (bigconsole-app's AppShell), which is where compatibility is enforced.\n */\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n}\n\nconst MODE: AssistantMode = 'assistant';\nconst STREAM_BUDGET_MS = 180_000;\nconst POLL_INTERVAL_MS = 1500;\nconst TTL_EXTEND_INTERVAL_MS = 30_000;\n\n// ── Context helpers (mirror vibecontrols' resolution) ────────────────\n\nfunction getProfileContextValue(key: 'workspaceId' | 'organizationId'): string {\n try {\n const activeContextKey =\n key === 'workspaceId' ? 'burdenoff-active-context-workspace' : 'burdenoff-active-context-organization';\n const activeContextValue = localStorage.getItem(activeContextKey);\n if (activeContextValue) return activeContextValue;\n\n const activeProfileId = sessionStorage.getItem('bf-active-profile');\n if (!activeProfileId) return '';\n const raw = localStorage.getItem(`bf-p-${activeProfileId}-context`);\n if (!raw) return '';\n const context = JSON.parse(raw) as { workspaceId?: string; organizationId?: string };\n return context[key] ?? '';\n } catch {\n return '';\n }\n}\n\nfunction getWorkspaceId(fallback: string | null): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('workspace') ?? getProfileContextValue('workspaceId') ?? fallback ?? '';\n}\n\nfunction getOrganizationId(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('org') ?? getProfileContextValue('organizationId');\n}\n\n// ── Message-progress helpers (pure; mirror vibecontrols) ─────────────\n\nfunction getRawMessageCreatedAt(message: AssistantRawMessage): number {\n return message.info?.time?.created ?? 0;\n}\n\nfunction getAssistantText(parts: AssistantRawMessage['parts']): string {\n return (parts ?? [])\n .filter((part) => part.type === 'text' && typeof part.text === 'string')\n .map((part) => part.text?.trim() ?? '')\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction getToolProgress(parts: AssistantRawMessage['parts']): string[] {\n return (parts ?? [])\n .filter((part) => part.type === 'tool' && part.tool)\n .map((part) => {\n const status = part.state?.status ?? 'running';\n const tool = part.tool ?? 'tool';\n if (status === 'completed') return `Completed: ${tool}`;\n if (status === 'failed') return `Failed: ${tool}`;\n return `Running: ${tool}`;\n });\n}\n\nfunction buildProgress(messages: AssistantRawMessage[], sinceMs: number): { content: string; done: boolean } {\n const relevant = messages\n .filter((message) => message.info?.role === 'assistant' && getRawMessageCreatedAt(message) >= sinceMs)\n .sort((left, right) => getRawMessageCreatedAt(left) - getRawMessageCreatedAt(right));\n\n if (relevant.length === 0) return { content: 'Thinking…', done: false };\n\n const latest = relevant[relevant.length - 1]!;\n const text = getAssistantText(latest.parts);\n const toolProgress = getToolProgress(latest.parts);\n const content = [text, ...toolProgress].filter(Boolean).join('\\n\\n') || 'Thinking…';\n\n return {\n content,\n done: Boolean(latest.info?.time?.completed) && (Boolean(text) || toolProgress.length > 0),\n };\n}\n\nfunction sanitize(response: string): string {\n return response\n .replace(/(Authorization\\s*:\\s*Bearer\\s+)[^\\s\\n]+/gi, '$1[REDACTED]')\n .replace(/(X-Workspace-Authorization\\s*:\\s*Bearer\\s+)[^\\s\\n]+/gi, '$1[REDACTED]')\n .replace(/\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9._-]+\\.[A-Za-z0-9._-]+\\b/g, '[REDACTED_JWT]')\n .replace(/\\bsk-ant-[A-Za-z0-9-]+\\b/g, '[REDACTED_API_KEY]');\n}\n\nfunction isRecoverable(error: unknown): boolean {\n const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n if (\n message.includes('rate limit exceeded') ||\n message.includes('unauthorized') ||\n message.includes('k8s api error 401')\n ) {\n return false;\n }\n return [\n 'sandbox not found',\n 'sandbox is not running',\n 'sandbox service not available yet',\n 'sandbox failed',\n 'sandbox startup timed out',\n 'assistant service did not become healthy',\n 'proxy error: 404',\n 'proxy error: 502',\n 'proxy error: 503',\n ].some((fragment) => message.includes(fragment));\n}\n\n/**\n * Returns a memoized `AssistantTransport` wired to the BigConsole sandbox\n * assistant agent. The sandbox + session are cached in refs so follow-up turns\n * reuse the warm environment for the lifetime of the host shell.\n */\nexport function useSandboxAssistantTransport(): AssistantTransport {\n const { getAccessToken, getWorkspaceToken, userId, workspaceId: ctxWorkspaceId } = useAuthToken();\n\n const sandboxIdRef = useRef<string | null>(null);\n const sessionIdRef = useRef<string | null>(null);\n\n const ensureRuntime = useCallback(\n async (\n workspaceId: string,\n authContext: AssistantSandboxAuthContext\n ): Promise<{ sandboxId: string; sessionId: string }> => {\n let sandboxId = sandboxIdRef.current;\n if (!sandboxId) {\n sandboxId = await findExistingSandbox(workspaceId, MODE, authContext);\n if (!sandboxId) {\n if (!getAccessToken()) {\n throw new Error('The assistant requires an authenticated session. Please sign in again.');\n }\n sandboxId = await createAssistantSandbox(MODE, workspaceId, authContext);\n }\n await waitForSandboxReady(sandboxId, workspaceId, authContext);\n await waitForAssistantServiceReady(sandboxId, workspaceId, authContext);\n sandboxIdRef.current = sandboxId;\n }\n\n let sessionId = sessionIdRef.current;\n if (!sessionId) {\n const result = await createAssistantSession(sandboxId, workspaceId, MODE, authContext);\n sessionId = result.sessionId;\n sessionIdRef.current = sessionId;\n }\n\n return { sandboxId, sessionId };\n },\n [getAccessToken]\n );\n\n const sendPrompt = useCallback(\n async ({ prompt, onProgress, signal }: AssistantSendArgs): Promise<{ text: string }> => {\n const workspaceId = getWorkspaceId(ctxWorkspaceId);\n if (!workspaceId) {\n throw new Error('The assistant needs an active workspace. Open a workspace and try again.');\n }\n const authContext: AssistantSandboxAuthContext = {\n accessToken: getAccessToken(),\n workspaceToken: getWorkspaceToken(),\n userId,\n organizationId: getOrganizationId(),\n };\n\n const run = async (attempt: 1 | 2): Promise<{ text: string }> => {\n try {\n const { sandboxId, sessionId } = await ensureRuntime(workspaceId, authContext);\n\n const startedAt = Date.now();\n await sendAssistantPromptAsync(\n sandboxId,\n workspaceId,\n sessionId,\n prompt,\n MODE,\n gatherPageContext(),\n authContext\n );\n\n const timeoutAt = Date.now() + STREAM_BUDGET_MS;\n let lastTtlExtensionAt = Date.now();\n let progress = buildProgress([], startedAt);\n\n while (Date.now() < timeoutAt) {\n if (signal.aborted) throw new Error('Cancelled');\n\n const messages = await getAssistantMessages(sandboxId, workspaceId, sessionId, authContext, 50);\n progress = buildProgress(messages, startedAt);\n onProgress(sanitize(progress.content));\n if (progress.done) break;\n\n if (Date.now() - lastTtlExtensionAt > TTL_EXTEND_INTERVAL_MS) {\n await extendAssistantSandboxTTL(sandboxId, workspaceId, 600, authContext).catch(() => undefined);\n lastTtlExtensionAt = Date.now();\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n if (!progress.done) {\n throw new Error('The assistant timed out while responding. Please try again.');\n }\n\n return { text: sanitize(progress.content) };\n } catch (error) {\n // A stale/expired sandbox or session is recoverable — drop the warm\n // refs and retry once from a clean runtime.\n if (attempt === 1 && isRecoverable(error)) {\n sandboxIdRef.current = null;\n sessionIdRef.current = null;\n return run(2);\n }\n throw error;\n }\n };\n\n return run(1);\n },\n [ctxWorkspaceId, ensureRuntime, getAccessToken, getWorkspaceToken, userId]\n );\n\n return useMemo<AssistantTransport>(() => ({ sendPrompt }), [sendPrompt]);\n}\n"],"mappings":";;;;;AAoDA,IAAM,IAAsB,aACtB,IAAmB,MACnB,IAAmB,MACnB,IAAyB;AAI/B,SAAS,EAAuB,GAA+C;AAC7E,KAAI;EACF,IAAM,IACJ,MAAQ,gBAAgB,uCAAuC,yCAC3D,IAAqB,aAAa,QAAQ,EAAiB;AACjE,MAAI,EAAoB,QAAO;EAE/B,IAAM,IAAkB,eAAe,QAAQ,oBAAoB;AACnE,MAAI,CAAC,EAAiB,QAAO;EAC7B,IAAM,IAAM,aAAa,QAAQ,QAAQ,EAAgB,UAAU;AAGnE,SAFK,IACW,KAAK,MAAM,EAAI,CAChB,MAAQ,KAFN;SAGX;AACN,SAAO;;;AAIX,SAAS,EAAe,GAAiC;AAEvD,QADe,IAAI,gBAAgB,OAAO,SAAS,OAAO,CAC5C,IAAI,YAAY,IAAI,EAAuB,cAAc,IAAI,KAAY;;AAGzF,SAAS,IAA4B;AAEnC,QADe,IAAI,gBAAgB,OAAO,SAAS,OAAO,CAC5C,IAAI,MAAM,IAAI,EAAuB,iBAAiB;;AAKtE,SAAS,EAAuB,GAAsC;AACpE,QAAO,EAAQ,MAAM,MAAM,WAAW;;AAGxC,SAAS,EAAiB,GAA6C;AACrE,SAAQ,KAAS,EAAE,EAChB,QAAQ,MAAS,EAAK,SAAS,UAAU,OAAO,EAAK,QAAS,SAAS,CACvE,KAAK,MAAS,EAAK,MAAM,MAAM,IAAI,GAAG,CACtC,OAAO,QAAQ,CACf,KAAK,KAAK;;AAGf,SAAS,EAAgB,GAA+C;AACtE,SAAQ,KAAS,EAAE,EAChB,QAAQ,MAAS,EAAK,SAAS,UAAU,EAAK,KAAK,CACnD,KAAK,MAAS;EACb,IAAM,IAAS,EAAK,OAAO,UAAU,WAC/B,IAAO,EAAK,QAAQ;AAG1B,SAFI,MAAW,cAAoB,cAAc,MAC7C,MAAW,WAAiB,WAAW,MACpC,YAAY;GACnB;;AAGN,SAAS,EAAc,GAAiC,GAAqD;CAC3G,IAAM,IAAW,EACd,QAAQ,MAAY,EAAQ,MAAM,SAAS,eAAe,EAAuB,EAAQ,IAAI,EAAQ,CACrG,MAAM,GAAM,MAAU,EAAuB,EAAK,GAAG,EAAuB,EAAM,CAAC;AAEtF,KAAI,EAAS,WAAW,EAAG,QAAO;EAAE,SAAS;EAAa,MAAM;EAAO;CAEvE,IAAM,IAAS,EAAS,EAAS,SAAS,IACpC,IAAO,EAAiB,EAAO,MAAM,EACrC,IAAe,EAAgB,EAAO,MAAM;AAGlD,QAAO;EACL,SAHc,CAAC,GAAM,GAAG,EAAa,CAAC,OAAO,QAAQ,CAAC,KAAK,OAAO,IAAI;EAItE,MAAM,EAAQ,EAAO,MAAM,MAAM,cAAe,EAAQ,KAAS,EAAa,SAAS;EACxF;;AAGH,SAAS,EAAS,GAA0B;AAC1C,QAAO,EACJ,QAAQ,6CAA6C,eAAe,CACpE,QAAQ,yDAAyD,eAAe,CAChF,QAAQ,4DAA4D,iBAAiB,CACrF,QAAQ,6BAA6B,qBAAqB;;AAG/D,SAAS,EAAc,GAAyB;CAC9C,IAAM,IAAU,aAAiB,QAAQ,EAAM,QAAQ,aAAa,GAAG,OAAO,EAAM,CAAC,aAAa;AAQlG,QANE,EAAQ,SAAS,sBAAsB,IACvC,EAAQ,SAAS,eAAe,IAChC,EAAQ,SAAS,oBAAoB,GAE9B,KAEF;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,MAAM,MAAa,EAAQ,SAAS,EAAS,CAAC;;AAQlD,SAAgB,IAAmD;CACjE,IAAM,EAAE,mBAAgB,sBAAmB,WAAQ,aAAa,MAAmB,GAAc,EAE3F,IAAe,EAAsB,KAAK,EAC1C,IAAe,EAAsB,KAAK,EAE1C,IAAgB,EACpB,OACE,GACA,MACsD;EACtD,IAAI,IAAY,EAAa;AAC7B,MAAI,CAAC,GAAW;AAEd,OADA,IAAY,MAAM,EAAoB,GAAa,GAAM,EAAY,EACjE,CAAC,GAAW;AACd,QAAI,CAAC,GAAgB,CACnB,OAAU,MAAM,yEAAyE;AAE3F,QAAY,MAAM,EAAuB,GAAM,GAAa,EAAY;;AAI1E,GAFA,MAAM,EAAoB,GAAW,GAAa,EAAY,EAC9D,MAAM,EAA6B,GAAW,GAAa,EAAY,EACvE,EAAa,UAAU;;EAGzB,IAAI,IAAY,EAAa;AAO7B,SANK,MAEH,KADe,MAAM,EAAuB,GAAW,GAAa,GAAM,EAAY,EACnE,WACnB,EAAa,UAAU,IAGlB;GAAE;GAAW;GAAW;IAEjC,CAAC,EAAe,CACjB,EAEK,IAAa,EACjB,OAAO,EAAE,WAAQ,eAAY,gBAA2D;EACtF,IAAM,IAAc,EAAe,EAAe;AAClD,MAAI,CAAC,EACH,OAAU,MAAM,2EAA2E;EAE7F,IAAM,IAA2C;GAC/C,aAAa,GAAgB;GAC7B,gBAAgB,GAAmB;GACnC;GACA,gBAAgB,GAAmB;GACpC,EAEK,IAAM,OAAO,MAA8C;AAC/D,OAAI;IACF,IAAM,EAAE,cAAW,iBAAc,MAAM,EAAc,GAAa,EAAY,EAExE,IAAY,KAAK,KAAK;AAC5B,UAAM,EACJ,GACA,GACA,GACA,GACA,GACA,GAAmB,EACnB,EACD;IAED,IAAM,IAAY,KAAK,KAAK,GAAG,GAC3B,IAAqB,KAAK,KAAK,EAC/B,IAAW,EAAc,EAAE,EAAE,EAAU;AAE3C,WAAO,KAAK,KAAK,GAAG,IAAW;AAC7B,SAAI,EAAO,QAAS,OAAU,MAAM,YAAY;AAKhD,SAFA,IAAW,EADM,MAAM,EAAqB,GAAW,GAAa,GAAW,GAAa,GAAG,EAC5D,EAAU,EAC7C,EAAW,EAAS,EAAS,QAAQ,CAAC,EAClC,EAAS,KAAM;AAOnB,KALI,KAAK,KAAK,GAAG,IAAqB,MACpC,MAAM,EAA0B,GAAW,GAAa,KAAK,EAAY,CAAC,YAAY,KAAA,EAAU,EAChG,IAAqB,KAAK,KAAK,GAGjC,MAAM,IAAI,SAAS,MAAY,WAAW,GAAS,EAAiB,CAAC;;AAGvE,QAAI,CAAC,EAAS,KACZ,OAAU,MAAM,8DAA8D;AAGhF,WAAO,EAAE,MAAM,EAAS,EAAS,QAAQ,EAAE;YACpC,GAAO;AAGd,QAAI,MAAY,KAAK,EAAc,EAAM,CAGvC,QAFA,EAAa,UAAU,MACvB,EAAa,UAAU,MAChB,EAAI,EAAE;AAEf,UAAM;;;AAIV,SAAO,EAAI,EAAE;IAEf;EAAC;EAAgB;EAAe;EAAgB;EAAmB;EAAO,CAC3E;AAED,QAAO,SAAmC,EAAE,eAAY,GAAG,CAAC,EAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "./pageContext.js";
2
+ import "./createSandboxAssistantTransport.js";
@@ -0,0 +1,51 @@
1
+ //#region src/bigconsole/assistant/pageContext.ts
2
+ function e() {
3
+ let e = window.location.href, t = window.location.pathname.split("/").filter(Boolean).slice(0, 3).join("/") || "home", r = n(window.location.pathname, window.location.search);
4
+ return {
5
+ currentUrl: e,
6
+ currentPage: t,
7
+ entityType: r.entityType,
8
+ entityId: r.entityId,
9
+ platform: "bigconsole",
10
+ version: "2026.430.500",
11
+ viewportSize: `${window.innerWidth}x${window.innerHeight}`,
12
+ userAgent: navigator.userAgent,
13
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
14
+ };
15
+ }
16
+ function t(e, t) {
17
+ return t.match(e);
18
+ }
19
+ function n(e, n) {
20
+ let i = new URLSearchParams(n);
21
+ for (let [n, i] of [
22
+ [/^\/bigconsole\/dashboards\/[^/]+\/parsers\/([^/]+)(?:\/edit)?$/, "BIGCONSOLE_PARSER"],
23
+ [/^\/bigconsole\/dashboards\/([^/]+)(?:\/builder)?$/, "BIGCONSOLE_DASHBOARD"],
24
+ [/^\/bigconsole\/datasinks\/([^/]+)(?:\/edit)?$/, "BIGCONSOLE_DATASINK"],
25
+ [/^\/bigconsole\/parsers\/([^/]+)(?:\/edit)?$/, "BIGCONSOLE_PARSER"],
26
+ [/^\/bigconsole\/pipelines\/([^/]+)(?:\/edit)?$/, "BIGCONSOLE_PIPELINE"],
27
+ [/^\/bigconsole\/workflows\/([^/]+)(?:\/edit)?$/, "BIGCONSOLE_WORKFLOW"]
28
+ ]) {
29
+ let a = t(n, e);
30
+ if (a && a[1] && !r(a[1])) return {
31
+ entityType: i,
32
+ entityId: a[1],
33
+ metadata: { routePattern: n.source }
34
+ };
35
+ }
36
+ let a = i.get("tab") ?? (() => {
37
+ let t = e.split("/").filter(Boolean);
38
+ return t.length > 2 ? t[t.length - 1] : void 0;
39
+ })();
40
+ return {
41
+ activeTab: a ?? void 0,
42
+ metadata: { ...a ? { activeTab: a } : {} }
43
+ };
44
+ }
45
+ function r(e) {
46
+ return e === "new" || e === "builder" || e === "list";
47
+ }
48
+ //#endregion
49
+ export { e as gatherPageContext, n as resolveBigConsoleConversationContext };
50
+
51
+ //# sourceMappingURL=pageContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageContext.js","names":[],"sources":["../../../src/bigconsole/assistant/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering for BigConsole — captures the user's current browser\n * context to be sent alongside every assistant prompt for better AI awareness.\n *\n * Mirrors microfe-vibecontrols' `utils/pageContext.ts`. The agent filters the\n * payload to an allow-list (`ai-assistant/src/context-loader.ts` →\n * `ALLOWED_CONTEXT_KEYS`), so the keys MUST be `currentUrl` (NOT `activeUrl`)\n * and the generic `entityType` / `entityId`, or the value is silently dropped.\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PageContext {\n // `currentUrl` (NOT `activeUrl`) — must match the agent's allowed-context-key\n // contract, otherwise the agent filters it out.\n currentUrl: string;\n currentPage: string;\n // The entity the user is currently looking at, resolved from the route. Lets\n // the assistant act on \"this / current / here\" without asking for an id.\n entityType?: string;\n entityId?: string;\n platform: string;\n version: string;\n viewportSize: string;\n userAgent: string;\n timestamp: string;\n}\n\nexport function gatherPageContext(): PageContext {\n const url = window.location.href;\n const pathSegments = window.location.pathname.split('/').filter(Boolean);\n const currentPage = pathSegments.slice(0, 3).join('/') || 'home';\n const entity = resolveBigConsoleConversationContext(window.location.pathname, window.location.search);\n\n return {\n currentUrl: url,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n platform: 'bigconsole',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.430.500',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction matchPath(pattern: RegExp, pathname: string): RegExpMatchArray | null {\n return pathname.match(pattern);\n}\n\n/**\n * Maps the current BigConsole route to `{ entityType, entityId }`. The BigConsole\n * MFE mounts under the `/bigconsole` base path in the host shell, so detail\n * routes are matched as `/bigconsole/<collection>/:id`.\n *\n * More specific routes (e.g. dashboard-scoped parsers, builder/edit sub-routes)\n * are matched before their parent so the most relevant entity wins.\n */\nexport function resolveBigConsoleConversationContext(pathname: string, search: string): ConversationContextShape {\n const params = new URLSearchParams(search);\n\n const directMatches: Array<[RegExp, string]> = [\n // Dashboard-scoped parser detail (more specific than the bare parser route).\n [/^\\/bigconsole\\/dashboards\\/[^/]+\\/parsers\\/([^/]+)(?:\\/edit)?$/, 'BIGCONSOLE_PARSER'],\n // Dashboard detail + builder.\n [/^\\/bigconsole\\/dashboards\\/([^/]+)(?:\\/builder)?$/, 'BIGCONSOLE_DASHBOARD'],\n // Data sinks.\n [/^\\/bigconsole\\/datasinks\\/([^/]+)(?:\\/edit)?$/, 'BIGCONSOLE_DATASINK'],\n // Parsers.\n [/^\\/bigconsole\\/parsers\\/([^/]+)(?:\\/edit)?$/, 'BIGCONSOLE_PARSER'],\n // Pipelines.\n [/^\\/bigconsole\\/pipelines\\/([^/]+)(?:\\/edit)?$/, 'BIGCONSOLE_PIPELINE'],\n // Workflows (BigConsole-native list/view; the SDK builder uses /workflow/...).\n [/^\\/bigconsole\\/workflows\\/([^/]+)(?:\\/edit)?$/, 'BIGCONSOLE_WORKFLOW'],\n ];\n\n for (const [pattern, entityType] of directMatches) {\n const match = matchPath(pattern, pathname);\n if (match && match[1] && !isReservedSegment(match[1])) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n const activeTab =\n params.get('tab') ??\n (() => {\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 2 ? segments[segments.length - 1] : undefined;\n })();\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n },\n };\n}\n\n/**\n * Static segments that share a route shape with `:id` detail routes\n * (e.g. `/bigconsole/datasinks/new`, `/bigconsole/parsers/new`). These are\n * pages, not entities, so they must not be reported as an `entityId`.\n */\nfunction isReservedSegment(segment: string): boolean {\n return segment === 'new' || segment === 'builder' || segment === 'list';\n}\n"],"mappings":";AAiCA,SAAgB,IAAiC;CAC/C,IAAM,IAAM,OAAO,SAAS,MAEtB,IADe,OAAO,SAAS,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACvC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,QACpD,IAAS,EAAqC,OAAO,SAAS,UAAU,OAAO,SAAS,OAAO;AAErG,QAAO;EACL,YAAY;EACZ;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,UAAU;EACV,SAA6C;EAC7C,cAAc,GAAG,OAAO,WAAW,GAAG,OAAO;EAC7C,WAAW,UAAU;EACrB,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC;;AAGH,SAAS,EAAU,GAAiB,GAA2C;AAC7E,QAAO,EAAS,MAAM,EAAQ;;AAWhC,SAAgB,EAAqC,GAAkB,GAA0C;CAC/G,IAAM,IAAS,IAAI,gBAAgB,EAAO;AAiB1C,MAAK,IAAM,CAAC,GAAS,MAf0B;EAE7C,CAAC,kEAAkE,oBAAoB;EAEvF,CAAC,qDAAqD,uBAAuB;EAE7E,CAAC,iDAAiD,sBAAsB;EAExE,CAAC,+CAA+C,oBAAoB;EAEpE,CAAC,iDAAiD,sBAAsB;EAExE,CAAC,iDAAiD,sBAAsB;EACzE,EAEkD;EACjD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,KAAS,EAAM,MAAM,CAAC,EAAkB,EAAM,GAAG,CACnD,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;CAIL,IAAM,IACJ,EAAO,IAAI,MAAM,WACV;EACL,IAAM,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AACpD,SAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;KAC3D;AAEN,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU,EACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE,EACnC;EACF;;AAQH,SAAS,EAAkB,GAA0B;AACnD,QAAO,MAAY,SAAS,MAAY,aAAa,MAAY"}
@@ -2,8 +2,8 @@ import e from "./TemplatePicker/TemplatePicker.js";
2
2
  import "./TemplatePicker/index.js";
3
3
  import { memo as t, useCallback as n, useEffect as r, useRef as i, useState as a } from "react";
4
4
  import { Copy as o, LayoutDashboard as s, Plus as c, Tag as l, X as u } from "lucide-react";
5
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
6
- import { Badge as p, Button as m, Dialog as h, DialogContent as g, DialogDescription as _, DialogFooter as v, DialogHeader as y, DialogTitle as b, Input as x, Spinner as S, Textarea as C } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as d, Button as f, Dialog as p, DialogContent as m, DialogDescription as h, DialogFooter as g, DialogHeader as _, DialogTitle as v, Input as y, Spinner as b, Textarea as x } from "@burdenoff/fe-libs/ui";
6
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
7
7
  //#region src/bigconsole/components/dashboard/CreateDashboardDialog.tsx
8
8
  var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, showTemplates: D = !0 }) {
9
9
  let [O, k] = a("blank"), [A, j] = a(""), [M, N] = a(""), [P, F] = a([]), [I, L] = a(""), [R, z] = a(null), [B, V] = a(null), H = i(null);
@@ -63,24 +63,24 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
63
63
  R,
64
64
  E
65
65
  ]);
66
- return /* @__PURE__ */ d(h, {
66
+ return /* @__PURE__ */ S(p, {
67
67
  open: t,
68
68
  onOpenChange: (e) => !e && !w && T(),
69
- children: /* @__PURE__ */ f(g, {
69
+ children: /* @__PURE__ */ C(m, {
70
70
  style: {
71
71
  maxWidth: O === "template" ? "900px" : "480px",
72
72
  padding: 0,
73
73
  transition: "max-width 0.2s ease"
74
74
  },
75
- children: [/* @__PURE__ */ d(y, {
75
+ children: [/* @__PURE__ */ S(_, {
76
76
  style: { padding: "var(--space-pagePadding) var(--space-pagePadding) 0" },
77
- children: /* @__PURE__ */ f("div", {
77
+ children: /* @__PURE__ */ C("div", {
78
78
  style: {
79
79
  display: "flex",
80
80
  alignItems: "center",
81
81
  gap: "var(--space-formGap)"
82
82
  },
83
- children: [/* @__PURE__ */ d("div", {
83
+ children: [/* @__PURE__ */ S("div", {
84
84
  style: {
85
85
  display: "flex",
86
86
  height: "var(--size-controlHeight-lg)",
@@ -91,12 +91,12 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
91
91
  backgroundColor: "var(--color-action-primary-bg)",
92
92
  boxShadow: "var(--shadow-elevation-2)"
93
93
  },
94
- children: /* @__PURE__ */ d(s, { style: {
94
+ children: /* @__PURE__ */ S(s, { style: {
95
95
  height: "var(--size-icon-lg)",
96
96
  width: "var(--size-icon-lg)",
97
97
  color: "var(--color-action-primary-text)"
98
98
  } })
99
- }), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d(b, {
99
+ }), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S(v, {
100
100
  style: {
101
101
  fontSize: "var(--font-size-heading-h4)",
102
102
  fontWeight: "var(--font-weight-bold)",
@@ -104,7 +104,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
104
104
  margin: 0
105
105
  },
106
106
  children: "Create New Dashboard"
107
- }), /* @__PURE__ */ d(_, {
107
+ }), /* @__PURE__ */ S(h, {
108
108
  style: {
109
109
  fontSize: "var(--font-size-body-sm)",
110
110
  color: "var(--color-text-secondary)",
@@ -113,12 +113,12 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
113
113
  children: "Create a new dashboard to visualize your data"
114
114
  })] })]
115
115
  })
116
- }), /* @__PURE__ */ f("form", {
116
+ }), /* @__PURE__ */ C("form", {
117
117
  onSubmit: q,
118
118
  children: [
119
- D && /* @__PURE__ */ d("div", {
119
+ D && /* @__PURE__ */ S("div", {
120
120
  style: { padding: "var(--space-pagePadding) var(--space-pagePadding) 0" },
121
- children: /* @__PURE__ */ f("div", {
121
+ children: /* @__PURE__ */ C("div", {
122
122
  style: {
123
123
  display: "flex",
124
124
  gap: "var(--space-controlGap)",
@@ -126,7 +126,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
126
126
  backgroundColor: "var(--color-bg-sunken)",
127
127
  borderRadius: "var(--radius-button)"
128
128
  },
129
- children: [/* @__PURE__ */ f("button", {
129
+ children: [/* @__PURE__ */ C("button", {
130
130
  type: "button",
131
131
  onClick: () => {
132
132
  k("blank"), z(null);
@@ -148,11 +148,11 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
148
148
  boxShadow: O === "blank" ? "var(--shadow-elevation-1)" : "none",
149
149
  transition: "all 0.15s ease"
150
150
  },
151
- children: [/* @__PURE__ */ d(c, { style: {
151
+ children: [/* @__PURE__ */ S(c, { style: {
152
152
  height: "var(--size-icon-sm)",
153
153
  width: "var(--size-icon-sm)"
154
154
  } }), "Blank Dashboard"]
155
- }), /* @__PURE__ */ f("button", {
155
+ }), /* @__PURE__ */ C("button", {
156
156
  type: "button",
157
157
  onClick: () => k("template"),
158
158
  style: {
@@ -172,32 +172,32 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
172
172
  boxShadow: O === "template" ? "var(--shadow-elevation-1)" : "none",
173
173
  transition: "all 0.15s ease"
174
174
  },
175
- children: [/* @__PURE__ */ d(o, { style: {
175
+ children: [/* @__PURE__ */ S(o, { style: {
176
176
  height: "var(--size-icon-sm)",
177
177
  width: "var(--size-icon-sm)"
178
178
  } }), "From Template"]
179
179
  })]
180
180
  })
181
181
  }),
182
- O === "template" && /* @__PURE__ */ d("div", {
182
+ O === "template" && /* @__PURE__ */ S("div", {
183
183
  style: {
184
184
  padding: "var(--space-pagePadding)",
185
185
  maxHeight: "400px",
186
186
  overflowY: "auto"
187
187
  },
188
- children: /* @__PURE__ */ d(e, {
188
+ children: /* @__PURE__ */ S(e, {
189
189
  selectedTemplateId: R?.id,
190
190
  onSelect: K,
191
191
  compact: !0
192
192
  })
193
193
  }),
194
- /* @__PURE__ */ f("div", {
194
+ /* @__PURE__ */ C("div", {
195
195
  style: { padding: "var(--space-pagePadding)" },
196
196
  children: [
197
- /* @__PURE__ */ f("div", {
197
+ /* @__PURE__ */ C("div", {
198
198
  style: { marginBottom: "var(--space-formGap)" },
199
199
  children: [
200
- /* @__PURE__ */ f("label", {
200
+ /* @__PURE__ */ C("label", {
201
201
  htmlFor: "dashboard-name",
202
202
  style: {
203
203
  display: "block",
@@ -206,7 +206,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
206
206
  color: "var(--color-text-primary)",
207
207
  marginBottom: "var(--space-controlGap)"
208
208
  },
209
- children: ["Dashboard Name", /* @__PURE__ */ d("span", {
209
+ children: ["Dashboard Name", /* @__PURE__ */ S("span", {
210
210
  style: {
211
211
  color: "var(--color-status-error-text)",
212
212
  marginLeft: "var(--space-controlGap)"
@@ -214,7 +214,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
214
214
  children: "*"
215
215
  })]
216
216
  }),
217
- /* @__PURE__ */ d(x, {
217
+ /* @__PURE__ */ S(y, {
218
218
  ref: H,
219
219
  id: "dashboard-name",
220
220
  type: "text",
@@ -230,7 +230,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
230
230
  borderColor: B ? "var(--color-status-error-border)" : void 0
231
231
  }
232
232
  }),
233
- B && /* @__PURE__ */ d("p", {
233
+ B && /* @__PURE__ */ S("p", {
234
234
  style: {
235
235
  fontSize: "var(--font-size-body-sm)",
236
236
  color: "var(--color-status-error-text)",
@@ -241,9 +241,9 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
241
241
  })
242
242
  ]
243
243
  }),
244
- /* @__PURE__ */ f("div", {
244
+ /* @__PURE__ */ C("div", {
245
245
  style: { marginBottom: "var(--space-formGap)" },
246
- children: [/* @__PURE__ */ f("label", {
246
+ children: [/* @__PURE__ */ C("label", {
247
247
  htmlFor: "dashboard-description",
248
248
  style: {
249
249
  display: "block",
@@ -252,7 +252,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
252
252
  color: "var(--color-text-primary)",
253
253
  marginBottom: "var(--space-controlGap)"
254
254
  },
255
- children: ["Description", /* @__PURE__ */ d("span", {
255
+ children: ["Description", /* @__PURE__ */ S("span", {
256
256
  style: {
257
257
  color: "var(--color-text-muted)",
258
258
  fontWeight: "var(--font-weight-regular)",
@@ -260,7 +260,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
260
260
  },
261
261
  children: "(optional)"
262
262
  })]
263
- }), /* @__PURE__ */ d(C, {
263
+ }), /* @__PURE__ */ S(x, {
264
264
  id: "dashboard-description",
265
265
  value: M,
266
266
  onChange: (e) => N(e.target.value),
@@ -273,8 +273,8 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
273
273
  }
274
274
  })]
275
275
  }),
276
- /* @__PURE__ */ f("div", { children: [
277
- /* @__PURE__ */ f("label", {
276
+ /* @__PURE__ */ C("div", { children: [
277
+ /* @__PURE__ */ C("label", {
278
278
  htmlFor: "dashboard-tags",
279
279
  style: {
280
280
  display: "flex",
@@ -286,12 +286,12 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
286
286
  marginBottom: "var(--space-controlGap)"
287
287
  },
288
288
  children: [
289
- /* @__PURE__ */ d(l, { style: {
289
+ /* @__PURE__ */ S(l, { style: {
290
290
  height: "var(--size-icon-sm)",
291
291
  width: "var(--size-icon-sm)"
292
292
  } }),
293
293
  "Tags",
294
- /* @__PURE__ */ d("span", {
294
+ /* @__PURE__ */ S("span", {
295
295
  style: {
296
296
  color: "var(--color-text-muted)",
297
297
  fontWeight: "var(--font-weight-regular)"
@@ -300,14 +300,14 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
300
300
  })
301
301
  ]
302
302
  }),
303
- P.length > 0 && /* @__PURE__ */ d("div", {
303
+ P.length > 0 && /* @__PURE__ */ S("div", {
304
304
  style: {
305
305
  display: "flex",
306
306
  flexWrap: "wrap",
307
307
  gap: "var(--space-controlGap)",
308
308
  marginBottom: "var(--space-controlGap)"
309
309
  },
310
- children: P.map((e) => /* @__PURE__ */ f(p, {
310
+ children: P.map((e) => /* @__PURE__ */ C(d, {
311
311
  variant: "secondary",
312
312
  style: {
313
313
  display: "flex",
@@ -315,7 +315,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
315
315
  gap: "4px",
316
316
  paddingRight: "4px"
317
317
  },
318
- children: [e, /* @__PURE__ */ d("button", {
318
+ children: [e, /* @__PURE__ */ S("button", {
319
319
  type: "button",
320
320
  onClick: () => W(e),
321
321
  disabled: w,
@@ -333,19 +333,19 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
333
333
  },
334
334
  onMouseOver: (e) => e.currentTarget.style.opacity = "1",
335
335
  onMouseOut: (e) => e.currentTarget.style.opacity = "0.7",
336
- children: /* @__PURE__ */ d(u, { style: {
336
+ children: /* @__PURE__ */ S(u, { style: {
337
337
  height: "12px",
338
338
  width: "12px"
339
339
  } })
340
340
  })]
341
341
  }, e))
342
342
  }),
343
- /* @__PURE__ */ f("div", {
343
+ /* @__PURE__ */ C("div", {
344
344
  style: {
345
345
  display: "flex",
346
346
  gap: "var(--space-controlGap)"
347
347
  },
348
- children: [/* @__PURE__ */ d(x, {
348
+ children: [/* @__PURE__ */ S(y, {
349
349
  id: "dashboard-tags",
350
350
  type: "text",
351
351
  value: I,
@@ -358,7 +358,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
358
358
  height: "var(--size-controlHeight-md)",
359
359
  fontSize: "var(--font-size-body-sm)"
360
360
  }
361
- }), /* @__PURE__ */ d(m, {
361
+ }), /* @__PURE__ */ S(f, {
362
362
  type: "button",
363
363
  variant: "outline",
364
364
  onClick: U,
@@ -367,7 +367,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
367
367
  children: "Add"
368
368
  })]
369
369
  }),
370
- /* @__PURE__ */ d("p", {
370
+ /* @__PURE__ */ S("p", {
371
371
  style: {
372
372
  fontSize: "var(--font-size-body-xs)",
373
373
  color: "var(--color-text-muted)",
@@ -378,7 +378,7 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
378
378
  ] })
379
379
  ]
380
380
  }),
381
- /* @__PURE__ */ f(v, {
381
+ /* @__PURE__ */ C(g, {
382
382
  style: {
383
383
  padding: "var(--space-formGap) var(--space-pagePadding)",
384
384
  borderTop: "1px solid var(--color-border)",
@@ -387,37 +387,37 @@ var w = t(function({ isOpen: t, isCreating: w = !1, onClose: T, onCreate: E, sho
387
387
  justifyContent: "flex-end",
388
388
  gap: "var(--space-controlGap)"
389
389
  },
390
- children: [/* @__PURE__ */ d(m, {
390
+ children: [/* @__PURE__ */ S(f, {
391
391
  type: "button",
392
392
  variant: "outline",
393
393
  onClick: T,
394
394
  disabled: w,
395
395
  style: { height: "var(--size-controlHeight-md)" },
396
396
  children: "Cancel"
397
- }), /* @__PURE__ */ d(m, {
397
+ }), /* @__PURE__ */ S(f, {
398
398
  type: "submit",
399
399
  disabled: w || !A.trim(),
400
400
  style: {
401
401
  height: "var(--size-controlHeight-md)",
402
402
  backgroundColor: "var(--color-action-primary-bg)"
403
403
  },
404
- children: w ? /* @__PURE__ */ f("span", {
404
+ children: w ? /* @__PURE__ */ C("span", {
405
405
  style: {
406
406
  display: "flex",
407
407
  alignItems: "center",
408
408
  gap: "var(--space-iconGap)"
409
409
  },
410
- children: [/* @__PURE__ */ d(S, { style: {
410
+ children: [/* @__PURE__ */ S(b, { style: {
411
411
  height: "var(--size-icon-sm)",
412
412
  width: "var(--size-icon-sm)"
413
413
  } }), "Creating..."]
414
- }) : /* @__PURE__ */ f("span", {
414
+ }) : /* @__PURE__ */ C("span", {
415
415
  style: {
416
416
  display: "flex",
417
417
  alignItems: "center",
418
418
  gap: "var(--space-iconGap)"
419
419
  },
420
- children: [/* @__PURE__ */ d(c, { style: {
420
+ children: [/* @__PURE__ */ S(c, { style: {
421
421
  height: "var(--size-icon-sm)",
422
422
  width: "var(--size-icon-sm)"
423
423
  } }), "Create Dashboard"]