@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.
- package/dist/bigconsole/BigConsoleRoutes.js +93 -93
- package/dist/bigconsole/assistant/assistantApi.js +215 -0
- package/dist/bigconsole/assistant/assistantApi.js.map +1 -0
- package/dist/bigconsole/assistant/createSandboxAssistantTransport.js +119 -0
- package/dist/bigconsole/assistant/createSandboxAssistantTransport.js.map +1 -0
- package/dist/bigconsole/assistant/index.js +2 -0
- package/dist/bigconsole/assistant/pageContext.js +51 -0
- package/dist/bigconsole/assistant/pageContext.js.map +1 -0
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +48 -48
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +52 -52
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +33 -33
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +179 -179
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +38 -38
- package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +32 -32
- package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +31 -31
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +98 -98
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ExportParserDialog.js +31 -31
- package/dist/bigconsole/components/parser/ImportParserDialog.js +162 -162
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +79 -79
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +307 -307
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetConfigDialog.js +222 -222
- package/dist/bigconsole/components/widgets/WidgetConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +23 -23
- package/dist/bigconsole/index.js +3 -0
- package/dist/bigconsole/pages/DashboardBuilderPage.js +74 -74
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +168 -189
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +266 -310
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +148 -194
- package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +252 -246
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +256 -231
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinksPage.js +173 -219
- package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
- package/dist/bigconsole/pages/HomePage.js +125 -141
- package/dist/bigconsole/pages/HomePage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +159 -184
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +401 -393
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +220 -201
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +212 -206
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +204 -181
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +107 -150
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +184 -171
- package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +69 -81
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +230 -216
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +106 -149
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/generated/wspace-operations.js +87 -36
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/index.js +3 -1
- 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":"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"}
|
|
@@ -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 {
|
|
6
|
-
import {
|
|
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__ */
|
|
66
|
+
return /* @__PURE__ */ S(p, {
|
|
67
67
|
open: t,
|
|
68
68
|
onOpenChange: (e) => !e && !w && T(),
|
|
69
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
75
|
+
children: [/* @__PURE__ */ S(_, {
|
|
76
76
|
style: { padding: "var(--space-pagePadding) var(--space-pagePadding) 0" },
|
|
77
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
116
|
+
}), /* @__PURE__ */ C("form", {
|
|
117
117
|
onSubmit: q,
|
|
118
118
|
children: [
|
|
119
|
-
D && /* @__PURE__ */
|
|
119
|
+
D && /* @__PURE__ */ S("div", {
|
|
120
120
|
style: { padding: "var(--space-pagePadding) var(--space-pagePadding) 0" },
|
|
121
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
188
|
+
children: /* @__PURE__ */ S(e, {
|
|
189
189
|
selectedTemplateId: R?.id,
|
|
190
190
|
onSelect: K,
|
|
191
191
|
compact: !0
|
|
192
192
|
})
|
|
193
193
|
}),
|
|
194
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ C("div", {
|
|
195
195
|
style: { padding: "var(--space-pagePadding)" },
|
|
196
196
|
children: [
|
|
197
|
-
/* @__PURE__ */
|
|
197
|
+
/* @__PURE__ */ C("div", {
|
|
198
198
|
style: { marginBottom: "var(--space-formGap)" },
|
|
199
199
|
children: [
|
|
200
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
244
|
+
/* @__PURE__ */ C("div", {
|
|
245
245
|
style: { marginBottom: "var(--space-formGap)" },
|
|
246
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
277
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
343
|
+
/* @__PURE__ */ C("div", {
|
|
344
344
|
style: {
|
|
345
345
|
display: "flex",
|
|
346
346
|
gap: "var(--space-controlGap)"
|
|
347
347
|
},
|
|
348
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
420
|
+
children: [/* @__PURE__ */ S(c, { style: {
|
|
421
421
|
height: "var(--size-icon-sm)",
|
|
422
422
|
width: "var(--size-icon-sm)"
|
|
423
423
|
} }), "Create Dashboard"]
|