@burdenoff/microfe-vibecontrols 2026.617.1 → 2026.618.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/components/assistant/AssistantChatArea.js +1 -0
- package/dist/components/assistant/AssistantChatArea.js.map +1 -1
- package/dist/components/assistant/AssistantModeSelector.js +20 -19
- package/dist/components/assistant/AssistantModeSelector.js.map +1 -1
- package/dist/config/assistantUsecases.js +11 -0
- package/dist/config/assistantUsecases.js.map +1 -1
- package/dist/index.js +4 -3
- package/dist/services/assistantApi.js +9 -3
- package/dist/services/assistantApi.js.map +1 -1
- package/dist/services/createSandboxAssistantTransport.js +120 -0
- package/dist/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/store/assistantStore.js +1 -1
- package/dist/store/assistantStore.js.map +1 -1
- package/package.json +5 -1
|
@@ -14,6 +14,7 @@ import { useAuthToken as ae } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
|
14
14
|
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
15
15
|
//#region src/components/assistant/AssistantChatArea.tsx
|
|
16
16
|
var oe = {
|
|
17
|
+
assistant: 18e4,
|
|
17
18
|
general: 18e4,
|
|
18
19
|
"api-calls": 18e4,
|
|
19
20
|
"vibe-plugins": 6e5
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantChatArea.js","names":[],"sources":["../../../src/components/assistant/AssistantChatArea.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, type FC } from 'react';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useAuthToken } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { AssistantChatInput } from './AssistantChatInput';\nimport { AssistantMessageList } from './AssistantMessageList';\nimport { AssistantModeSelector } from './AssistantModeSelector';\nimport { AssistantWelcome } from './AssistantWelcome';\nimport { useAssistantStore } from '@/store/assistantStore';\nimport {\n checkAssistantAiCredits,\n createAssistantSandbox,\n createAssistantSession,\n extendAssistantSandboxTTL,\n findExistingSandbox,\n getAssistantArtifacts,\n getAssistantMessages,\n getAssistantSession,\n reportAssistantAiTokenUsage,\n sendAssistantPromptAsync,\n waitForAssistantServiceReady,\n waitForSandboxReady,\n type AssistantRawMessage,\n type AssistantSandboxAuthContext,\n} from '@/services/assistantApi';\nimport { gatherPageContext } from '@/utils/pageContext';\nimport { dispatchAssistantQuotaExhausted, notifyAiCreditsUpdated } from '@/utils/aiCredits';\nimport { isQuotaExhaustedError } from '@/utils/quotaUtils';\nimport { useTr } from '../../shared/hooks/useTr';\nimport type {\n AssistantArtifact,\n AssistantConversationStatus,\n AssistantMode,\n Message,\n} from '@/types/assistant';\n\n// How long the client streams progress before giving up on a turn. Chat replies\n// (general / api-calls) finish in seconds; a vibe-plugins build is a multi-step\n// pipeline (read docs → scaffold → bun install → bun build → checklist) that runs\n// for minutes, so it gets a much larger budget. The sandbox TTL is auto-extended\n// every 30s during the poll loop, so a longer budget never outlives the sandbox.\nconst STREAM_BUDGET_MS: Record<AssistantMode, number> = {\n general: 180_000,\n 'api-calls': 180_000,\n 'vibe-plugins': 600_000,\n};\nconst DEFAULT_STREAM_BUDGET_MS = 180_000;\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction getProfileContextValue(key: 'workspaceId' | 'organizationId'): string {\n try {\n const activeContextKey =\n key === 'workspaceId'\n ? 'burdenoff-active-context-workspace'\n : '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 {\n workspaceId?: string;\n organizationId?: string;\n };\n return context[key] ?? '';\n } catch {\n return '';\n }\n}\n\nfunction getWorkspaceId(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('workspace') ?? getProfileContextValue('workspaceId');\n}\n\nfunction getOrganizationId(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('org') ?? getProfileContextValue('organizationId');\n}\n\nfunction isRecoverableAssistantError(error: unknown): boolean {\n const message =\n error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n\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\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 'session mode mismatch',\n ].some((fragment) => message.includes(fragment));\n}\n\nfunction sanitizeAssistantResponse(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 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 buildAssistantProgress(\n messages: AssistantRawMessage[],\n sinceMs: number\n): {\n content: string;\n done: boolean;\n tokens?: { input: number; output: number };\n model?: string;\n} {\n const relevant = messages\n .filter(\n (message) => message.info?.role === 'assistant' && getRawMessageCreatedAt(message) >= sinceMs\n )\n .sort((left, right) => getRawMessageCreatedAt(left) - getRawMessageCreatedAt(right));\n\n if (relevant.length === 0) {\n return { content: 'Thinking...', done: false };\n }\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 tokens: latest.info?.tokens,\n // \"provider/model\" id for this turn — drives the cost-weighted credit charge.\n model:\n latest.info?.providerID && latest.info?.modelID\n ? `${latest.info.providerID}/${latest.info.modelID}`\n : undefined,\n };\n}\n\nfunction getConversationStatusMessage(status: AssistantConversationStatus): string {\n switch (status) {\n case 'provisioning':\n return 'Starting assistant environment...';\n case 'connecting':\n return 'Connecting to assistant...';\n case 'streaming':\n return 'Thinking...';\n default:\n return '';\n }\n}\n\nexport const AssistantChatArea: FC = () => {\n const tr = useTr();\n const apollo = useGatewayClient('workspace');\n const { getAccessToken, getWorkspaceToken, userId } = useAuthToken();\n\n const {\n conversations,\n activeConversationId,\n mode,\n processingByConversationId,\n setMode,\n setConversationMode,\n setActiveConversation,\n createConversation,\n addMessage,\n updateMessage,\n patchMessage,\n setConversationProcessing,\n clearConversationProcessing,\n setBackendSessionId,\n clearBackendSessionId,\n setSandbox,\n clearSandbox,\n } = useAssistantStore();\n\n const activeConversation = conversations.find(\n (conversation) => conversation.id === activeConversationId\n );\n const messages = activeConversation?.messages ?? [];\n const activeProcessing = activeConversationId\n ? processingByConversationId[activeConversationId]\n : undefined;\n const activeStreamingMessageId = activeProcessing?.messageId ?? null;\n const activeIsProcessing =\n activeProcessing?.status === 'provisioning' ||\n activeProcessing?.status === 'connecting' ||\n activeProcessing?.status === 'streaming';\n\n const updateConversationStage = useCallback(\n (\n conversationId: string,\n assistantMessageId: string,\n status: AssistantConversationStatus,\n content?: string\n ) => {\n setConversationProcessing(conversationId, status, assistantMessageId, null);\n if (content) {\n updateMessage(conversationId, assistantMessageId, content);\n } else {\n updateMessage(conversationId, assistantMessageId, getConversationStatusMessage(status));\n }\n },\n [setConversationProcessing, updateMessage]\n );\n\n const ensureAssistantRuntime = useCallback(\n async (\n conversationId: string,\n assistantMessageId: string,\n currentMode: AssistantMode,\n workspaceId: string,\n authContext: AssistantSandboxAuthContext\n ): Promise<{ sandboxId: string; sessionId: string }> => {\n let currentSandboxId =\n useAssistantStore.getState().sandboxesByMode[currentMode]?.sandboxId ?? null;\n\n if (!currentSandboxId) {\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'provisioning',\n 'Looking for existing environment...'\n );\n const existingId = await findExistingSandbox(apollo, workspaceId, currentMode, authContext);\n\n if (existingId) {\n currentSandboxId = existingId;\n setSandbox(currentMode, currentSandboxId, 'provisioning');\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'provisioning',\n 'Reusing assistant environment...'\n );\n await waitForSandboxReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 300_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'provisioning', message)\n );\n await waitForAssistantServiceReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 90_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'connecting', message)\n );\n setSandbox(currentMode, currentSandboxId, 'running');\n } else {\n if (currentMode === 'api-calls' && !getAccessToken()) {\n throw new Error(\n 'API Calls mode requires an authenticated session. Please sign in again.'\n );\n }\n\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'provisioning',\n 'Starting assistant environment...'\n );\n setSandbox(currentMode, null, 'provisioning');\n currentSandboxId = await createAssistantSandbox(\n apollo,\n currentMode,\n workspaceId,\n authContext\n );\n\n setSandbox(currentMode, currentSandboxId, 'provisioning');\n await waitForSandboxReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 300_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'provisioning', message)\n );\n await waitForAssistantServiceReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 90_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'connecting', message)\n );\n setSandbox(currentMode, currentSandboxId, 'running');\n }\n }\n\n let sessionId =\n useAssistantStore\n .getState()\n .conversations.find((conversation) => conversation.id === conversationId)\n ?.backendSessionId ?? null;\n\n if (sessionId) {\n try {\n const session = await getAssistantSession(\n apollo,\n currentSandboxId,\n workspaceId,\n sessionId,\n authContext\n );\n if (session.mode !== currentMode) {\n throw new Error(\n `Session mode mismatch: expected ${currentMode}, received ${session.mode}`\n );\n }\n } catch {\n clearBackendSessionId(conversationId);\n sessionId = null;\n }\n }\n\n if (!sessionId) {\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'connecting',\n 'Preparing session...'\n );\n const result = await createAssistantSession(\n apollo,\n currentSandboxId,\n workspaceId,\n currentMode,\n authContext\n );\n sessionId = result.sessionId;\n setBackendSessionId(conversationId, sessionId);\n }\n\n return {\n sandboxId: currentSandboxId,\n sessionId,\n };\n },\n [\n apollo,\n clearBackendSessionId,\n getAccessToken,\n setBackendSessionId,\n setSandbox,\n updateConversationStage,\n ]\n );\n\n const handleSend = useCallback(\n async (content: string) => {\n // Only block re-entry while a turn is genuinely in-flight. Earlier code\n // checked for *any* entry in the map, which stuck around as `complete`\n // / `error` after the first turn — making every subsequent message\n // silently disappear (the input cleared but handleSend bailed before\n // adding the user message to the conversation).\n if (activeConversationId) {\n const inflightStatus = processingByConversationId[activeConversationId]?.status;\n if (\n inflightStatus === 'provisioning' ||\n inflightStatus === 'connecting' ||\n inflightStatus === 'streaming'\n ) {\n return;\n }\n }\n\n const selectedMode = useAssistantStore.getState().mode;\n let conversationId = activeConversationId;\n const currentConversation = conversationId\n ? useAssistantStore\n .getState()\n .conversations.find((conversation) => conversation.id === conversationId)\n : undefined;\n\n if (!conversationId) {\n conversationId = createConversation(undefined, selectedMode);\n } else if (\n currentConversation &&\n currentConversation.mode !== selectedMode &&\n (currentConversation.messages.length > 0 || currentConversation.backendSessionId)\n ) {\n conversationId = createConversation(undefined, selectedMode);\n } else if (currentConversation && currentConversation.mode !== selectedMode) {\n setConversationMode(conversationId, selectedMode);\n }\n\n if (!conversationId) return;\n\n const workspaceId = getWorkspaceId();\n const authContext: AssistantSandboxAuthContext = {\n accessToken: getAccessToken(),\n workspaceToken: getWorkspaceToken(),\n userId,\n organizationId: getOrganizationId(),\n };\n\n const userMessage: Message = {\n id: generateId(),\n role: 'user',\n content,\n timestamp: new Date().toISOString(),\n };\n addMessage(conversationId, userMessage);\n\n const assistantMessageId = generateId();\n addMessage(conversationId, {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date().toISOString(),\n });\n\n const applyAssistantResponse = (\n response: string,\n artifacts?: AssistantArtifact[],\n sessionId?: string,\n sandboxId?: string\n ) => {\n patchMessage(conversationId, assistantMessageId, {\n content: sanitizeAssistantResponse(response),\n metadata:\n artifacts?.length || sessionId || sandboxId\n ? {\n artifacts,\n mode: selectedMode,\n sessionId,\n sandboxId,\n }\n : undefined,\n });\n };\n\n const sendWithRealBackend = async (attempt: 1 | 2 = 1): Promise<void> => {\n // Pre-flight AI-credit gate. The wspace gateway's @usage(checkQuota)\n // rejects with 429 QUOTA_EXHAUSTED when the monthly token budget is\n // depleted — block the send (don't provision a sandbox or dispatch the\n // prompt) and surface the upgrade dialog instead of a generic error.\n try {\n await checkAssistantAiCredits(apollo, workspaceId, authContext);\n } catch (creditError) {\n if (isQuotaExhaustedError(creditError)) {\n dispatchAssistantQuotaExhausted('ai-credits');\n applyAssistantResponse(\n \"You've run out of AI credits for this billing cycle. Upgrade your plan to keep chatting.\"\n );\n setConversationProcessing(conversationId, 'error', assistantMessageId, null);\n return;\n }\n // The pre-flight gate exists ONLY to catch a genuine QUOTA_EXHAUSTED\n // rejection. Any other failure here is a transient fault in the\n // credit check itself — e.g. the usage subgraph's getUsageSummary /\n // checkAiCredits intermittently 500s (Postgres/Prisma blip) and the\n // gateway masks it as the opaque \"Unexpected error.\". That is NOT\n // proof the user is out of budget, so it must not abort an otherwise\n // valid send. Fail open and proceed: the wspace gateway's\n // @usage(checkQuota) on createSandbox still enforces the real budget\n // downstream (a truly over-quota caller is stopped there with a 429\n // that surfaces the upgrade dialog via the outer catch).\n console.warn(\n '[assistant] AI-credit pre-flight check failed with a non-quota error; proceeding — gateway @usage(checkQuota) still enforces the real budget downstream',\n creditError\n );\n }\n\n try {\n const { sandboxId, sessionId } = await ensureAssistantRuntime(\n conversationId,\n assistantMessageId,\n selectedMode,\n workspaceId,\n authContext\n );\n\n updateConversationStage(conversationId, assistantMessageId, 'streaming', 'Thinking...');\n const promptStartedAt = Date.now();\n await sendAssistantPromptAsync(\n apollo,\n sandboxId,\n workspaceId,\n sessionId,\n content,\n selectedMode,\n gatherPageContext(),\n authContext\n );\n\n let result = buildAssistantProgress([], promptStartedAt);\n const timeoutAt =\n Date.now() + (STREAM_BUDGET_MS[selectedMode] ?? DEFAULT_STREAM_BUDGET_MS);\n let lastTtlExtensionAt = Date.now();\n\n while (Date.now() < timeoutAt) {\n const sessionMessages = await getAssistantMessages(\n apollo,\n sandboxId,\n workspaceId,\n sessionId,\n authContext,\n 50\n );\n\n result = buildAssistantProgress(sessionMessages, promptStartedAt);\n patchMessage(conversationId, assistantMessageId, {\n content: sanitizeAssistantResponse(result.content),\n });\n\n if (result.done) break;\n\n if (Date.now() - lastTtlExtensionAt > 30_000) {\n await extendAssistantSandboxTTL(\n apollo,\n sandboxId,\n workspaceId,\n 600,\n authContext\n ).catch(() => undefined);\n lastTtlExtensionAt = Date.now();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1500));\n }\n\n // For non-build modes a timeout is a hard failure. For vibe-plugins the\n // prompt runs async server-side (/sessions/:id/prompt-async) and keeps\n // writing artifacts after the poll budget elapses, so we surface whatever\n // it has produced instead of discarding the turn.\n if (!result.done && selectedMode !== 'vibe-plugins') {\n throw new Error('Assistant response timed out while streaming progress');\n }\n\n const artifacts =\n selectedMode === 'vibe-plugins'\n ? await getAssistantArtifacts(\n apollo,\n sandboxId,\n workspaceId,\n sessionId,\n authContext\n ).catch(() => [])\n : undefined;\n\n if (!result.done) {\n // vibe-plugins build still running in the background. Append a note so\n // the user knows the answer is partial and the artifacts will finish.\n result = {\n ...result,\n content: `${result.content}\\n\\n_Still building in the background — any artifacts below will finish shortly. Re-open this conversation to pick up the completed plugin._`,\n };\n }\n\n applyAssistantResponse(result.content, artifacts, sessionId, sandboxId);\n\n if (result.tokens) {\n patchMessage(conversationId, assistantMessageId, { tokens: result.tokens });\n // Charge the real token usage against the AI-credits quota (the\n // gateway records it via @usage(trackUsage)). We AWAIT it before\n // marking the turn complete / re-enabling input: otherwise a rapid\n // follow-up send would run its pre-flight checkAiCredits against a\n // stale balance (this turn's charge still in flight) and could\n // dispatch a prompt that should have been blocked, letting fast\n // sends bypass the credit cap. Still best-effort — a charge failure\n // never blocks the displayed answer.\n try {\n await reportAssistantAiTokenUsage(\n apollo,\n workspaceId,\n sessionId,\n assistantMessageId,\n result.model,\n result.tokens,\n authContext\n );\n notifyAiCreditsUpdated();\n } catch {\n // ignore — server-side @usage tracking is the source of truth\n }\n }\n setConversationProcessing(conversationId, 'complete', assistantMessageId, null);\n } catch (error) {\n if (attempt === 1 && isRecoverableAssistantError(error)) {\n clearBackendSessionId(conversationId);\n clearSandbox(selectedMode);\n return sendWithRealBackend(2);\n }\n\n throw error;\n }\n };\n\n try {\n if (!workspaceId) {\n throw new Error('Assistant backend is unavailable without an active workspace context.');\n }\n await sendWithRealBackend();\n } catch (error) {\n // A quota error reaching here is the sandbox-environment wall hit\n // during runtime provisioning (createSandbox @usage). Surface the\n // upgrade dialog instead of a generic failure (the AI-credit wall is\n // already handled by the pre-flight gate above).\n if (isQuotaExhaustedError(error)) {\n dispatchAssistantQuotaExhausted('sandbox');\n applyAssistantResponse(\n \"You've reached your sandbox limit on the current plan. Upgrade to start the AI assistant.\"\n );\n setConversationProcessing(conversationId, 'error', assistantMessageId, null);\n return;\n }\n const errorMessage = error instanceof Error ? error.message : 'Something went wrong';\n setConversationProcessing(conversationId, 'error', assistantMessageId, errorMessage);\n updateMessage(\n conversationId,\n assistantMessageId,\n `Sorry, an error occurred: ${errorMessage}. Please try again.`\n );\n }\n },\n [\n activeConversationId,\n addMessage,\n apollo,\n clearBackendSessionId,\n clearSandbox,\n conversations,\n createConversation,\n ensureAssistantRuntime,\n getAccessToken,\n getWorkspaceToken,\n patchMessage,\n processingByConversationId,\n setBackendSessionId,\n setConversationMode,\n setConversationProcessing,\n updateConversationStage,\n updateMessage,\n userId,\n ]\n );\n\n const handleSuggestionClick = useCallback(\n (suggestion: string) => {\n void handleSend(suggestion);\n },\n [handleSend]\n );\n\n // Auto-send any prompt that was queued by `useOpenAssistantHelp` (from\n // the shared GetHelpButton). We keep the latest handleSend in a ref so\n // the subscription effect below doesn't need to tear down on every\n // render — the store subscription lives for the component lifetime and\n // always calls the freshest handler.\n const handleSendRef = useRef(handleSend);\n useEffect(() => {\n handleSendRef.current = handleSend;\n }, [handleSend]);\n\n useEffect(() => {\n // Flush any prompt that was queued before this component mounted.\n const initial = useAssistantStore.getState().consumePendingPrompt();\n if (initial) {\n void handleSendRef.current(initial);\n }\n\n // Watch for new prompts queued while we're already mounted.\n const unsubscribe = useAssistantStore.subscribe((state, prev) => {\n if (state.pendingPrompt && state.pendingPrompt !== prev.pendingPrompt) {\n const queued = useAssistantStore.getState().consumePendingPrompt();\n if (queued) {\n void handleSendRef.current(queued);\n }\n }\n });\n return unsubscribe;\n }, []);\n\n const handleModeChange = useCallback(\n (newMode: AssistantMode) => {\n const currentConversation = activeConversationId\n ? useAssistantStore\n .getState()\n .conversations.find((conversation) => conversation.id === activeConversationId)\n : undefined;\n\n if (\n currentConversation &&\n (currentConversation.messages.length > 0 || currentConversation.backendSessionId)\n ) {\n if (currentConversation.mode !== newMode) {\n const reusableDraft = useAssistantStore\n .getState()\n .conversations.find(\n (conversation) =>\n conversation.mode === newMode &&\n conversation.messages.length === 0 &&\n !conversation.backendSessionId &&\n !useAssistantStore.getState().processingByConversationId[conversation.id]\n );\n\n if (reusableDraft) {\n setActiveConversation(reusableDraft.id);\n } else {\n createConversation(undefined, newMode);\n }\n }\n } else if (activeConversationId) {\n setConversationMode(activeConversationId, newMode);\n }\n\n setMode(newMode);\n },\n [activeConversationId, createConversation, setActiveConversation, setConversationMode, setMode]\n );\n\n return (\n <div className=\"flex flex-col flex-1 overflow-hidden pt-3\">\n {messages.length === 0 ? (\n <AssistantWelcome mode={mode} onSuggestionClick={handleSuggestionClick} />\n ) : (\n <AssistantMessageList messages={messages} streamingMessageId={activeStreamingMessageId} />\n )}\n\n <div>\n <div className=\"px-3 pb-1\">\n <AssistantModeSelector mode={mode} onModeChange={handleModeChange} />\n </div>\n <AssistantChatInput\n onSend={(value) => void handleSend(value)}\n disabled={activeIsProcessing}\n placeholder={tr(\n 'vibecontrols.assistant.chatArea.placeholder',\n `Ask about ${mode.replace(/-/g, ' ')}...`\n )}\n />\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssistantChatArea.js","names":[],"sources":["../../../src/components/assistant/AssistantChatArea.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, type FC } from 'react';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useAuthToken } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { AssistantChatInput } from './AssistantChatInput';\nimport { AssistantMessageList } from './AssistantMessageList';\nimport { AssistantModeSelector } from './AssistantModeSelector';\nimport { AssistantWelcome } from './AssistantWelcome';\nimport { useAssistantStore } from '@/store/assistantStore';\nimport {\n checkAssistantAiCredits,\n createAssistantSandbox,\n createAssistantSession,\n extendAssistantSandboxTTL,\n findExistingSandbox,\n getAssistantArtifacts,\n getAssistantMessages,\n getAssistantSession,\n reportAssistantAiTokenUsage,\n sendAssistantPromptAsync,\n waitForAssistantServiceReady,\n waitForSandboxReady,\n type AssistantRawMessage,\n type AssistantSandboxAuthContext,\n} from '@/services/assistantApi';\nimport { gatherPageContext } from '@/utils/pageContext';\nimport { dispatchAssistantQuotaExhausted, notifyAiCreditsUpdated } from '@/utils/aiCredits';\nimport { isQuotaExhaustedError } from '@/utils/quotaUtils';\nimport { useTr } from '../../shared/hooks/useTr';\nimport type {\n AssistantArtifact,\n AssistantConversationStatus,\n AssistantMode,\n Message,\n} from '@/types/assistant';\n\n// How long the client streams progress before giving up on a turn. Chat replies\n// (general / api-calls) finish in seconds; a vibe-plugins build is a multi-step\n// pipeline (read docs → scaffold → bun install → bun build → checklist) that runs\n// for minutes, so it gets a much larger budget. The sandbox TTL is auto-extended\n// every 30s during the poll loop, so a longer budget never outlives the sandbox.\nconst STREAM_BUDGET_MS: Record<AssistantMode, number> = {\n assistant: 180_000,\n general: 180_000,\n 'api-calls': 180_000,\n 'vibe-plugins': 600_000,\n};\nconst DEFAULT_STREAM_BUDGET_MS = 180_000;\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction getProfileContextValue(key: 'workspaceId' | 'organizationId'): string {\n try {\n const activeContextKey =\n key === 'workspaceId'\n ? 'burdenoff-active-context-workspace'\n : '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 {\n workspaceId?: string;\n organizationId?: string;\n };\n return context[key] ?? '';\n } catch {\n return '';\n }\n}\n\nfunction getWorkspaceId(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('workspace') ?? getProfileContextValue('workspaceId');\n}\n\nfunction getOrganizationId(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('org') ?? getProfileContextValue('organizationId');\n}\n\nfunction isRecoverableAssistantError(error: unknown): boolean {\n const message =\n error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n\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\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 'session mode mismatch',\n ].some((fragment) => message.includes(fragment));\n}\n\nfunction sanitizeAssistantResponse(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 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 buildAssistantProgress(\n messages: AssistantRawMessage[],\n sinceMs: number\n): {\n content: string;\n done: boolean;\n tokens?: { input: number; output: number };\n model?: string;\n} {\n const relevant = messages\n .filter(\n (message) => message.info?.role === 'assistant' && getRawMessageCreatedAt(message) >= sinceMs\n )\n .sort((left, right) => getRawMessageCreatedAt(left) - getRawMessageCreatedAt(right));\n\n if (relevant.length === 0) {\n return { content: 'Thinking...', done: false };\n }\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 tokens: latest.info?.tokens,\n // \"provider/model\" id for this turn — drives the cost-weighted credit charge.\n model:\n latest.info?.providerID && latest.info?.modelID\n ? `${latest.info.providerID}/${latest.info.modelID}`\n : undefined,\n };\n}\n\nfunction getConversationStatusMessage(status: AssistantConversationStatus): string {\n switch (status) {\n case 'provisioning':\n return 'Starting assistant environment...';\n case 'connecting':\n return 'Connecting to assistant...';\n case 'streaming':\n return 'Thinking...';\n default:\n return '';\n }\n}\n\nexport const AssistantChatArea: FC = () => {\n const tr = useTr();\n const apollo = useGatewayClient('workspace');\n const { getAccessToken, getWorkspaceToken, userId } = useAuthToken();\n\n const {\n conversations,\n activeConversationId,\n mode,\n processingByConversationId,\n setMode,\n setConversationMode,\n setActiveConversation,\n createConversation,\n addMessage,\n updateMessage,\n patchMessage,\n setConversationProcessing,\n clearConversationProcessing,\n setBackendSessionId,\n clearBackendSessionId,\n setSandbox,\n clearSandbox,\n } = useAssistantStore();\n\n const activeConversation = conversations.find(\n (conversation) => conversation.id === activeConversationId\n );\n const messages = activeConversation?.messages ?? [];\n const activeProcessing = activeConversationId\n ? processingByConversationId[activeConversationId]\n : undefined;\n const activeStreamingMessageId = activeProcessing?.messageId ?? null;\n const activeIsProcessing =\n activeProcessing?.status === 'provisioning' ||\n activeProcessing?.status === 'connecting' ||\n activeProcessing?.status === 'streaming';\n\n const updateConversationStage = useCallback(\n (\n conversationId: string,\n assistantMessageId: string,\n status: AssistantConversationStatus,\n content?: string\n ) => {\n setConversationProcessing(conversationId, status, assistantMessageId, null);\n if (content) {\n updateMessage(conversationId, assistantMessageId, content);\n } else {\n updateMessage(conversationId, assistantMessageId, getConversationStatusMessage(status));\n }\n },\n [setConversationProcessing, updateMessage]\n );\n\n const ensureAssistantRuntime = useCallback(\n async (\n conversationId: string,\n assistantMessageId: string,\n currentMode: AssistantMode,\n workspaceId: string,\n authContext: AssistantSandboxAuthContext\n ): Promise<{ sandboxId: string; sessionId: string }> => {\n let currentSandboxId =\n useAssistantStore.getState().sandboxesByMode[currentMode]?.sandboxId ?? null;\n\n if (!currentSandboxId) {\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'provisioning',\n 'Looking for existing environment...'\n );\n const existingId = await findExistingSandbox(apollo, workspaceId, currentMode, authContext);\n\n if (existingId) {\n currentSandboxId = existingId;\n setSandbox(currentMode, currentSandboxId, 'provisioning');\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'provisioning',\n 'Reusing assistant environment...'\n );\n await waitForSandboxReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 300_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'provisioning', message)\n );\n await waitForAssistantServiceReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 90_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'connecting', message)\n );\n setSandbox(currentMode, currentSandboxId, 'running');\n } else {\n if (currentMode === 'api-calls' && !getAccessToken()) {\n throw new Error(\n 'API Calls mode requires an authenticated session. Please sign in again.'\n );\n }\n\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'provisioning',\n 'Starting assistant environment...'\n );\n setSandbox(currentMode, null, 'provisioning');\n currentSandboxId = await createAssistantSandbox(\n apollo,\n currentMode,\n workspaceId,\n authContext\n );\n\n setSandbox(currentMode, currentSandboxId, 'provisioning');\n await waitForSandboxReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 300_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'provisioning', message)\n );\n await waitForAssistantServiceReady(\n apollo,\n currentSandboxId,\n workspaceId,\n authContext,\n 90_000,\n (message) =>\n updateConversationStage(conversationId, assistantMessageId, 'connecting', message)\n );\n setSandbox(currentMode, currentSandboxId, 'running');\n }\n }\n\n let sessionId =\n useAssistantStore\n .getState()\n .conversations.find((conversation) => conversation.id === conversationId)\n ?.backendSessionId ?? null;\n\n if (sessionId) {\n try {\n const session = await getAssistantSession(\n apollo,\n currentSandboxId,\n workspaceId,\n sessionId,\n authContext\n );\n if (session.mode !== currentMode) {\n throw new Error(\n `Session mode mismatch: expected ${currentMode}, received ${session.mode}`\n );\n }\n } catch {\n clearBackendSessionId(conversationId);\n sessionId = null;\n }\n }\n\n if (!sessionId) {\n updateConversationStage(\n conversationId,\n assistantMessageId,\n 'connecting',\n 'Preparing session...'\n );\n const result = await createAssistantSession(\n apollo,\n currentSandboxId,\n workspaceId,\n currentMode,\n authContext\n );\n sessionId = result.sessionId;\n setBackendSessionId(conversationId, sessionId);\n }\n\n return {\n sandboxId: currentSandboxId,\n sessionId,\n };\n },\n [\n apollo,\n clearBackendSessionId,\n getAccessToken,\n setBackendSessionId,\n setSandbox,\n updateConversationStage,\n ]\n );\n\n const handleSend = useCallback(\n async (content: string) => {\n // Only block re-entry while a turn is genuinely in-flight. Earlier code\n // checked for *any* entry in the map, which stuck around as `complete`\n // / `error` after the first turn — making every subsequent message\n // silently disappear (the input cleared but handleSend bailed before\n // adding the user message to the conversation).\n if (activeConversationId) {\n const inflightStatus = processingByConversationId[activeConversationId]?.status;\n if (\n inflightStatus === 'provisioning' ||\n inflightStatus === 'connecting' ||\n inflightStatus === 'streaming'\n ) {\n return;\n }\n }\n\n const selectedMode = useAssistantStore.getState().mode;\n let conversationId = activeConversationId;\n const currentConversation = conversationId\n ? useAssistantStore\n .getState()\n .conversations.find((conversation) => conversation.id === conversationId)\n : undefined;\n\n if (!conversationId) {\n conversationId = createConversation(undefined, selectedMode);\n } else if (\n currentConversation &&\n currentConversation.mode !== selectedMode &&\n (currentConversation.messages.length > 0 || currentConversation.backendSessionId)\n ) {\n conversationId = createConversation(undefined, selectedMode);\n } else if (currentConversation && currentConversation.mode !== selectedMode) {\n setConversationMode(conversationId, selectedMode);\n }\n\n if (!conversationId) return;\n\n const workspaceId = getWorkspaceId();\n const authContext: AssistantSandboxAuthContext = {\n accessToken: getAccessToken(),\n workspaceToken: getWorkspaceToken(),\n userId,\n organizationId: getOrganizationId(),\n };\n\n const userMessage: Message = {\n id: generateId(),\n role: 'user',\n content,\n timestamp: new Date().toISOString(),\n };\n addMessage(conversationId, userMessage);\n\n const assistantMessageId = generateId();\n addMessage(conversationId, {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date().toISOString(),\n });\n\n const applyAssistantResponse = (\n response: string,\n artifacts?: AssistantArtifact[],\n sessionId?: string,\n sandboxId?: string\n ) => {\n patchMessage(conversationId, assistantMessageId, {\n content: sanitizeAssistantResponse(response),\n metadata:\n artifacts?.length || sessionId || sandboxId\n ? {\n artifacts,\n mode: selectedMode,\n sessionId,\n sandboxId,\n }\n : undefined,\n });\n };\n\n const sendWithRealBackend = async (attempt: 1 | 2 = 1): Promise<void> => {\n // Pre-flight AI-credit gate. The wspace gateway's @usage(checkQuota)\n // rejects with 429 QUOTA_EXHAUSTED when the monthly token budget is\n // depleted — block the send (don't provision a sandbox or dispatch the\n // prompt) and surface the upgrade dialog instead of a generic error.\n try {\n await checkAssistantAiCredits(apollo, workspaceId, authContext);\n } catch (creditError) {\n if (isQuotaExhaustedError(creditError)) {\n dispatchAssistantQuotaExhausted('ai-credits');\n applyAssistantResponse(\n \"You've run out of AI credits for this billing cycle. Upgrade your plan to keep chatting.\"\n );\n setConversationProcessing(conversationId, 'error', assistantMessageId, null);\n return;\n }\n // The pre-flight gate exists ONLY to catch a genuine QUOTA_EXHAUSTED\n // rejection. Any other failure here is a transient fault in the\n // credit check itself — e.g. the usage subgraph's getUsageSummary /\n // checkAiCredits intermittently 500s (Postgres/Prisma blip) and the\n // gateway masks it as the opaque \"Unexpected error.\". That is NOT\n // proof the user is out of budget, so it must not abort an otherwise\n // valid send. Fail open and proceed: the wspace gateway's\n // @usage(checkQuota) on createSandbox still enforces the real budget\n // downstream (a truly over-quota caller is stopped there with a 429\n // that surfaces the upgrade dialog via the outer catch).\n console.warn(\n '[assistant] AI-credit pre-flight check failed with a non-quota error; proceeding — gateway @usage(checkQuota) still enforces the real budget downstream',\n creditError\n );\n }\n\n try {\n const { sandboxId, sessionId } = await ensureAssistantRuntime(\n conversationId,\n assistantMessageId,\n selectedMode,\n workspaceId,\n authContext\n );\n\n updateConversationStage(conversationId, assistantMessageId, 'streaming', 'Thinking...');\n const promptStartedAt = Date.now();\n await sendAssistantPromptAsync(\n apollo,\n sandboxId,\n workspaceId,\n sessionId,\n content,\n selectedMode,\n gatherPageContext(),\n authContext\n );\n\n let result = buildAssistantProgress([], promptStartedAt);\n const timeoutAt =\n Date.now() + (STREAM_BUDGET_MS[selectedMode] ?? DEFAULT_STREAM_BUDGET_MS);\n let lastTtlExtensionAt = Date.now();\n\n while (Date.now() < timeoutAt) {\n const sessionMessages = await getAssistantMessages(\n apollo,\n sandboxId,\n workspaceId,\n sessionId,\n authContext,\n 50\n );\n\n result = buildAssistantProgress(sessionMessages, promptStartedAt);\n patchMessage(conversationId, assistantMessageId, {\n content: sanitizeAssistantResponse(result.content),\n });\n\n if (result.done) break;\n\n if (Date.now() - lastTtlExtensionAt > 30_000) {\n await extendAssistantSandboxTTL(\n apollo,\n sandboxId,\n workspaceId,\n 600,\n authContext\n ).catch(() => undefined);\n lastTtlExtensionAt = Date.now();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1500));\n }\n\n // For non-build modes a timeout is a hard failure. For vibe-plugins the\n // prompt runs async server-side (/sessions/:id/prompt-async) and keeps\n // writing artifacts after the poll budget elapses, so we surface whatever\n // it has produced instead of discarding the turn.\n if (!result.done && selectedMode !== 'vibe-plugins') {\n throw new Error('Assistant response timed out while streaming progress');\n }\n\n const artifacts =\n selectedMode === 'vibe-plugins'\n ? await getAssistantArtifacts(\n apollo,\n sandboxId,\n workspaceId,\n sessionId,\n authContext\n ).catch(() => [])\n : undefined;\n\n if (!result.done) {\n // vibe-plugins build still running in the background. Append a note so\n // the user knows the answer is partial and the artifacts will finish.\n result = {\n ...result,\n content: `${result.content}\\n\\n_Still building in the background — any artifacts below will finish shortly. Re-open this conversation to pick up the completed plugin._`,\n };\n }\n\n applyAssistantResponse(result.content, artifacts, sessionId, sandboxId);\n\n if (result.tokens) {\n patchMessage(conversationId, assistantMessageId, { tokens: result.tokens });\n // Charge the real token usage against the AI-credits quota (the\n // gateway records it via @usage(trackUsage)). We AWAIT it before\n // marking the turn complete / re-enabling input: otherwise a rapid\n // follow-up send would run its pre-flight checkAiCredits against a\n // stale balance (this turn's charge still in flight) and could\n // dispatch a prompt that should have been blocked, letting fast\n // sends bypass the credit cap. Still best-effort — a charge failure\n // never blocks the displayed answer.\n try {\n await reportAssistantAiTokenUsage(\n apollo,\n workspaceId,\n sessionId,\n assistantMessageId,\n result.model,\n result.tokens,\n authContext\n );\n notifyAiCreditsUpdated();\n } catch {\n // ignore — server-side @usage tracking is the source of truth\n }\n }\n setConversationProcessing(conversationId, 'complete', assistantMessageId, null);\n } catch (error) {\n if (attempt === 1 && isRecoverableAssistantError(error)) {\n clearBackendSessionId(conversationId);\n clearSandbox(selectedMode);\n return sendWithRealBackend(2);\n }\n\n throw error;\n }\n };\n\n try {\n if (!workspaceId) {\n throw new Error('Assistant backend is unavailable without an active workspace context.');\n }\n await sendWithRealBackend();\n } catch (error) {\n // A quota error reaching here is the sandbox-environment wall hit\n // during runtime provisioning (createSandbox @usage). Surface the\n // upgrade dialog instead of a generic failure (the AI-credit wall is\n // already handled by the pre-flight gate above).\n if (isQuotaExhaustedError(error)) {\n dispatchAssistantQuotaExhausted('sandbox');\n applyAssistantResponse(\n \"You've reached your sandbox limit on the current plan. Upgrade to start the AI assistant.\"\n );\n setConversationProcessing(conversationId, 'error', assistantMessageId, null);\n return;\n }\n const errorMessage = error instanceof Error ? error.message : 'Something went wrong';\n setConversationProcessing(conversationId, 'error', assistantMessageId, errorMessage);\n updateMessage(\n conversationId,\n assistantMessageId,\n `Sorry, an error occurred: ${errorMessage}. Please try again.`\n );\n }\n },\n [\n activeConversationId,\n addMessage,\n apollo,\n clearBackendSessionId,\n clearSandbox,\n conversations,\n createConversation,\n ensureAssistantRuntime,\n getAccessToken,\n getWorkspaceToken,\n patchMessage,\n processingByConversationId,\n setBackendSessionId,\n setConversationMode,\n setConversationProcessing,\n updateConversationStage,\n updateMessage,\n userId,\n ]\n );\n\n const handleSuggestionClick = useCallback(\n (suggestion: string) => {\n void handleSend(suggestion);\n },\n [handleSend]\n );\n\n // Auto-send any prompt that was queued by `useOpenAssistantHelp` (from\n // the shared GetHelpButton). We keep the latest handleSend in a ref so\n // the subscription effect below doesn't need to tear down on every\n // render — the store subscription lives for the component lifetime and\n // always calls the freshest handler.\n const handleSendRef = useRef(handleSend);\n useEffect(() => {\n handleSendRef.current = handleSend;\n }, [handleSend]);\n\n useEffect(() => {\n // Flush any prompt that was queued before this component mounted.\n const initial = useAssistantStore.getState().consumePendingPrompt();\n if (initial) {\n void handleSendRef.current(initial);\n }\n\n // Watch for new prompts queued while we're already mounted.\n const unsubscribe = useAssistantStore.subscribe((state, prev) => {\n if (state.pendingPrompt && state.pendingPrompt !== prev.pendingPrompt) {\n const queued = useAssistantStore.getState().consumePendingPrompt();\n if (queued) {\n void handleSendRef.current(queued);\n }\n }\n });\n return unsubscribe;\n }, []);\n\n const handleModeChange = useCallback(\n (newMode: AssistantMode) => {\n const currentConversation = activeConversationId\n ? useAssistantStore\n .getState()\n .conversations.find((conversation) => conversation.id === activeConversationId)\n : undefined;\n\n if (\n currentConversation &&\n (currentConversation.messages.length > 0 || currentConversation.backendSessionId)\n ) {\n if (currentConversation.mode !== newMode) {\n const reusableDraft = useAssistantStore\n .getState()\n .conversations.find(\n (conversation) =>\n conversation.mode === newMode &&\n conversation.messages.length === 0 &&\n !conversation.backendSessionId &&\n !useAssistantStore.getState().processingByConversationId[conversation.id]\n );\n\n if (reusableDraft) {\n setActiveConversation(reusableDraft.id);\n } else {\n createConversation(undefined, newMode);\n }\n }\n } else if (activeConversationId) {\n setConversationMode(activeConversationId, newMode);\n }\n\n setMode(newMode);\n },\n [activeConversationId, createConversation, setActiveConversation, setConversationMode, setMode]\n );\n\n return (\n <div className=\"flex flex-col flex-1 overflow-hidden pt-3\">\n {messages.length === 0 ? (\n <AssistantWelcome mode={mode} onSuggestionClick={handleSuggestionClick} />\n ) : (\n <AssistantMessageList messages={messages} streamingMessageId={activeStreamingMessageId} />\n )}\n\n <div>\n <div className=\"px-3 pb-1\">\n <AssistantModeSelector mode={mode} onModeChange={handleModeChange} />\n </div>\n <AssistantChatInput\n onSend={(value) => void handleSend(value)}\n disabled={activeIsProcessing}\n placeholder={tr(\n 'vibecontrols.assistant.chatArea.placeholder',\n `Ask about ${mode.replace(/-/g, ' ')}...`\n )}\n />\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,50 +1,51 @@
|
|
|
1
1
|
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
2
|
import { ASSISTANT_MODES as t } from "../../types/assistant.js";
|
|
3
3
|
import { useEffect as n, useRef as r, useState as i } from "react";
|
|
4
|
-
import { ChevronDown as a, Code as o, HelpCircle as s,
|
|
5
|
-
import { jsx as
|
|
4
|
+
import { ChevronDown as a, Code as o, HelpCircle as s, Sparkles as c, Zap as l } from "lucide-react";
|
|
5
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/assistant/AssistantModeSelector.tsx
|
|
7
|
-
var
|
|
7
|
+
var f = {
|
|
8
|
+
assistant: c,
|
|
8
9
|
"api-calls": o,
|
|
9
|
-
"vibe-plugins":
|
|
10
|
+
"vibe-plugins": l,
|
|
10
11
|
general: s
|
|
11
|
-
},
|
|
12
|
-
let c = e(), [
|
|
12
|
+
}, p = ({ mode: o, onModeChange: s }) => {
|
|
13
|
+
let c = e(), [l, p] = i(!1), m = r(null), h = t.find((e) => e.id === o), g = f[o];
|
|
13
14
|
return n(() => {
|
|
14
|
-
if (!
|
|
15
|
+
if (!l) return;
|
|
15
16
|
let e = (e) => {
|
|
16
17
|
m.current && !m.current.contains(e.target) && p(!1);
|
|
17
18
|
};
|
|
18
19
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
19
|
-
}, [
|
|
20
|
+
}, [l]), /* @__PURE__ */ d("div", {
|
|
20
21
|
ref: m,
|
|
21
22
|
className: "relative",
|
|
22
|
-
children: [/* @__PURE__ */
|
|
23
|
+
children: [/* @__PURE__ */ d("button", {
|
|
23
24
|
type: "button",
|
|
24
|
-
onClick: () => p(!
|
|
25
|
+
onClick: () => p(!l),
|
|
25
26
|
className: "flex items-center gap-1 px-2 py-1 text-[10px] font-medium text-text-secondary bg-bg-sunken border border-border-default rounded-md hover:bg-bg-elevated transition-colors",
|
|
26
27
|
"aria-label": c("vibecontrols.assistant.modeSelector.ariaLabel", "Select assistant mode"),
|
|
27
28
|
"data-testid": "assistant-mode-selector",
|
|
28
29
|
children: [
|
|
29
|
-
/* @__PURE__ */
|
|
30
|
-
/* @__PURE__ */
|
|
31
|
-
/* @__PURE__ */
|
|
30
|
+
/* @__PURE__ */ u(g, { className: "size-3" }),
|
|
31
|
+
/* @__PURE__ */ u("span", { children: h.label }),
|
|
32
|
+
/* @__PURE__ */ u(a, { className: `size-3 transition-transform ${l ? "rotate-180" : ""}` })
|
|
32
33
|
]
|
|
33
|
-
}),
|
|
34
|
+
}), l && /* @__PURE__ */ u("div", {
|
|
34
35
|
className: "absolute bottom-full left-0 mb-1 w-56 bg-bg-surface border border-border-default rounded-lg shadow-lg z-50 py-1",
|
|
35
36
|
children: t.map((e) => {
|
|
36
|
-
let t =
|
|
37
|
-
return /* @__PURE__ */
|
|
37
|
+
let t = f[e.id], n = e.id === o;
|
|
38
|
+
return /* @__PURE__ */ d("button", {
|
|
38
39
|
type: "button",
|
|
39
40
|
onClick: () => {
|
|
40
41
|
s(e.id), p(!1);
|
|
41
42
|
},
|
|
42
43
|
"data-testid": `assistant-mode-option-${e.id}`,
|
|
43
44
|
className: `w-full text-left px-3 py-2 flex items-start gap-2 hover:bg-bg-elevated transition-colors ${n ? "bg-bg-elevated" : ""}`,
|
|
44
|
-
children: [/* @__PURE__ */
|
|
45
|
+
children: [/* @__PURE__ */ u(t, { className: "size-3.5 mt-0.5 text-text-secondary flex-shrink-0" }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("div", {
|
|
45
46
|
className: "text-xs font-medium text-text-primary",
|
|
46
47
|
children: e.label
|
|
47
|
-
}), /* @__PURE__ */
|
|
48
|
+
}), /* @__PURE__ */ u("div", {
|
|
48
49
|
className: "text-[10px] text-text-muted leading-tight",
|
|
49
50
|
children: e.description
|
|
50
51
|
})] })]
|
|
@@ -54,6 +55,6 @@ var d = {
|
|
|
54
55
|
});
|
|
55
56
|
};
|
|
56
57
|
//#endregion
|
|
57
|
-
export {
|
|
58
|
+
export { p as AssistantModeSelector };
|
|
58
59
|
|
|
59
60
|
//# sourceMappingURL=AssistantModeSelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantModeSelector.js","names":[],"sources":["../../../src/components/assistant/AssistantModeSelector.tsx"],"sourcesContent":["import { useState, useRef, useEffect, type FC } from 'react';\nimport { ChevronDown, Zap, Code, HelpCircle } from 'lucide-react';\nimport type { AssistantMode } from '@/types/assistant';\nimport { ASSISTANT_MODES } from '@/types/assistant';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface Props {\n mode: AssistantMode;\n onModeChange: (mode: AssistantMode) => void;\n}\n\nconst MODE_ICONS: Record<AssistantMode, typeof Zap> = {\n 'api-calls': Code,\n 'vibe-plugins': Zap,\n general: HelpCircle,\n};\n\nexport const AssistantModeSelector: FC<Props> = ({ mode, onModeChange }) => {\n const tr = useTr();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const currentMode = ASSISTANT_MODES.find((m) => m.id === mode)!;\n const Icon = MODE_ICONS[mode];\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [open]);\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1 px-2 py-1 text-[10px] font-medium text-text-secondary bg-bg-sunken border border-border-default rounded-md hover:bg-bg-elevated transition-colors\"\n aria-label={tr('vibecontrols.assistant.modeSelector.ariaLabel', 'Select assistant mode')}\n data-testid=\"assistant-mode-selector\"\n >\n <Icon className=\"size-3\" />\n <span>{currentMode.label}</span>\n <ChevronDown className={`size-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute bottom-full left-0 mb-1 w-56 bg-bg-surface border border-border-default rounded-lg shadow-lg z-50 py-1\">\n {ASSISTANT_MODES.map((m) => {\n const ModeIcon = MODE_ICONS[m.id];\n const isActive = m.id === mode;\n return (\n <button\n type=\"button\"\n key={m.id}\n onClick={() => {\n onModeChange(m.id);\n setOpen(false);\n }}\n data-testid={`assistant-mode-option-${m.id}`}\n className={`w-full text-left px-3 py-2 flex items-start gap-2 hover:bg-bg-elevated transition-colors ${\n isActive ? 'bg-bg-elevated' : ''\n }`}\n >\n <ModeIcon className=\"size-3.5 mt-0.5 text-text-secondary flex-shrink-0\" />\n <div>\n <div className=\"text-xs font-medium text-text-primary\">{m.label}</div>\n <div className=\"text-[10px] text-text-muted leading-tight\">{m.description}</div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;AAWA,IAAM,IAAgD;CACpD,aAAa;CACb,gBAAgB;CAChB,SAAS;CACV,EAEY,KAAoC,EAAE,SAAM,sBAAmB;CAC1E,IAAM,IAAK,GAAO,EACZ,CAAC,GAAM,KAAW,EAAS,GAAM,EACjC,IAAe,EAAuB,KAAK,EAE3C,IAAc,EAAgB,MAAM,MAAM,EAAE,OAAO,EAAK,EACxD,IAAO,EAAW;AAaxB,QAXA,QAAgB;AACd,MAAI,CAAC,EAAM;EACX,IAAM,KAAsB,MAAkB;AAC5C,GAAI,EAAa,WAAW,CAAC,EAAa,QAAQ,SAAS,EAAE,OAAe,IAC1E,EAAQ,GAAM;;AAIlB,SADA,SAAS,iBAAiB,aAAa,EAAmB,QAC7C,SAAS,oBAAoB,aAAa,EAAmB;IACzE,CAAC,EAAK,CAAC,EAGR,kBAAC,OAAD;EAAK,KAAK;EAAc,WAAU;YAAlC,CACE,kBAAC,UAAD;GACE,MAAK;GACL,eAAe,EAAQ,CAAC,EAAK;GAC7B,WAAU;GACV,cAAY,EAAG,iDAAiD,wBAAwB;GACxF,eAAY;aALd;IAOE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;IAC3B,kBAAC,QAAD,EAAA,UAAO,EAAY,OAAa,CAAA;IAChC,kBAAC,GAAD,EAAa,WAAW,+BAA+B,IAAO,eAAe,MAAQ,CAAA;IAC9E;MAER,KACC,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAgB,KAAK,MAAM;IAC1B,IAAM,IAAW,EAAW,EAAE,KACxB,IAAW,EAAE,OAAO;AAC1B,WACE,kBAAC,UAAD;KACE,MAAK;KAEL,eAAe;AAEb,MADA,EAAa,EAAE,GAAG,EAClB,EAAQ,GAAM;;KAEhB,eAAa,yBAAyB,EAAE;KACxC,WAAW,4FACT,IAAW,mBAAmB;eATlC,CAYE,kBAAC,GAAD,EAAU,WAAU,qDAAsD,CAAA,EAC1E,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAyC,EAAE;MAAY,CAAA,EACtE,kBAAC,OAAD;MAAK,WAAU;gBAA6C,EAAE;MAAkB,CAAA,CAC5E,EAAA,CAAA,CACC;OAfF,EAAE,GAeA;KAEX;GACE,CAAA,CAEJ"}
|
|
1
|
+
{"version":3,"file":"AssistantModeSelector.js","names":[],"sources":["../../../src/components/assistant/AssistantModeSelector.tsx"],"sourcesContent":["import { useState, useRef, useEffect, type FC } from 'react';\nimport { ChevronDown, Zap, Code, HelpCircle, Sparkles } from 'lucide-react';\nimport type { AssistantMode } from '@/types/assistant';\nimport { ASSISTANT_MODES } from '@/types/assistant';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface Props {\n mode: AssistantMode;\n onModeChange: (mode: AssistantMode) => void;\n}\n\nconst MODE_ICONS: Record<AssistantMode, typeof Zap> = {\n assistant: Sparkles,\n 'api-calls': Code,\n 'vibe-plugins': Zap,\n general: HelpCircle,\n};\n\nexport const AssistantModeSelector: FC<Props> = ({ mode, onModeChange }) => {\n const tr = useTr();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const currentMode = ASSISTANT_MODES.find((m) => m.id === mode)!;\n const Icon = MODE_ICONS[mode];\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [open]);\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1 px-2 py-1 text-[10px] font-medium text-text-secondary bg-bg-sunken border border-border-default rounded-md hover:bg-bg-elevated transition-colors\"\n aria-label={tr('vibecontrols.assistant.modeSelector.ariaLabel', 'Select assistant mode')}\n data-testid=\"assistant-mode-selector\"\n >\n <Icon className=\"size-3\" />\n <span>{currentMode.label}</span>\n <ChevronDown className={`size-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute bottom-full left-0 mb-1 w-56 bg-bg-surface border border-border-default rounded-lg shadow-lg z-50 py-1\">\n {ASSISTANT_MODES.map((m) => {\n const ModeIcon = MODE_ICONS[m.id];\n const isActive = m.id === mode;\n return (\n <button\n type=\"button\"\n key={m.id}\n onClick={() => {\n onModeChange(m.id);\n setOpen(false);\n }}\n data-testid={`assistant-mode-option-${m.id}`}\n className={`w-full text-left px-3 py-2 flex items-start gap-2 hover:bg-bg-elevated transition-colors ${\n isActive ? 'bg-bg-elevated' : ''\n }`}\n >\n <ModeIcon className=\"size-3.5 mt-0.5 text-text-secondary flex-shrink-0\" />\n <div>\n <div className=\"text-xs font-medium text-text-primary\">{m.label}</div>\n <div className=\"text-[10px] text-text-muted leading-tight\">{m.description}</div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;AAWA,IAAM,IAAgD;CACpD,WAAW;CACX,aAAa;CACb,gBAAgB;CAChB,SAAS;CACV,EAEY,KAAoC,EAAE,SAAM,sBAAmB;CAC1E,IAAM,IAAK,GAAO,EACZ,CAAC,GAAM,KAAW,EAAS,GAAM,EACjC,IAAe,EAAuB,KAAK,EAE3C,IAAc,EAAgB,MAAM,MAAM,EAAE,OAAO,EAAK,EACxD,IAAO,EAAW;AAaxB,QAXA,QAAgB;AACd,MAAI,CAAC,EAAM;EACX,IAAM,KAAsB,MAAkB;AAC5C,GAAI,EAAa,WAAW,CAAC,EAAa,QAAQ,SAAS,EAAE,OAAe,IAC1E,EAAQ,GAAM;;AAIlB,SADA,SAAS,iBAAiB,aAAa,EAAmB,QAC7C,SAAS,oBAAoB,aAAa,EAAmB;IACzE,CAAC,EAAK,CAAC,EAGR,kBAAC,OAAD;EAAK,KAAK;EAAc,WAAU;YAAlC,CACE,kBAAC,UAAD;GACE,MAAK;GACL,eAAe,EAAQ,CAAC,EAAK;GAC7B,WAAU;GACV,cAAY,EAAG,iDAAiD,wBAAwB;GACxF,eAAY;aALd;IAOE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;IAC3B,kBAAC,QAAD,EAAA,UAAO,EAAY,OAAa,CAAA;IAChC,kBAAC,GAAD,EAAa,WAAW,+BAA+B,IAAO,eAAe,MAAQ,CAAA;IAC9E;MAER,KACC,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAgB,KAAK,MAAM;IAC1B,IAAM,IAAW,EAAW,EAAE,KACxB,IAAW,EAAE,OAAO;AAC1B,WACE,kBAAC,UAAD;KACE,MAAK;KAEL,eAAe;AAEb,MADA,EAAa,EAAE,GAAG,EAClB,EAAQ,GAAM;;KAEhB,eAAa,yBAAyB,EAAE;KACxC,WAAW,4FACT,IAAW,mBAAmB;eATlC,CAYE,kBAAC,GAAD,EAAU,WAAU,qDAAsD,CAAA,EAC1E,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAyC,EAAE;MAAY,CAAA,EACtE,kBAAC,OAAD;MAAK,WAAU;gBAA6C,EAAE;MAAkB,CAAA,CAC5E,EAAA,CAAA,CACC;OAfF,EAAE,GAeA;KAEX;GACE,CAAA,CAEJ"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
//#region src/config/assistantUsecases.ts
|
|
2
2
|
var e = [
|
|
3
|
+
{
|
|
4
|
+
id: "assistant",
|
|
5
|
+
label: "Assistant",
|
|
6
|
+
description: "Ask questions and run operations on the current screen — answers from the docs and makes API calls for you",
|
|
7
|
+
suggestions: [
|
|
8
|
+
"What can I do on this screen?",
|
|
9
|
+
"Create a new vibe called demo",
|
|
10
|
+
"List my recent sessions",
|
|
11
|
+
"How do tunnels work?"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
3
14
|
{
|
|
4
15
|
id: "api-calls",
|
|
5
16
|
label: "API Calls",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistantUsecases.js","names":[],"sources":["../../src/config/assistantUsecases.ts"],"sourcesContent":["export const ASSISTANT_USECASE_CONFIG = [\n {\n id: 'api-calls',\n label: 'API Calls',\n description: 'Make API calls in context with the active product and your credentials',\n suggestions: [\n 'Show me all API endpoints for sessions',\n 'How do I create an agent via the API?',\n 'List vibes using the REST API',\n 'What headers are needed for authentication?',\n ],\n },\n {\n id: 'vibe-plugins',\n label: 'Vibe Plugins',\n description: 'Build and learn about Vibe Plugins for extending VibeControls',\n suggestions: [\n 'How do I create a new Vibe Plugin?',\n 'What is the plugin manifest structure?',\n 'Explain the plugin lifecycle hooks',\n 'Show me a plugin example with frontend UI',\n ],\n },\n {\n id: 'general',\n label: 'General',\n description: 'General help with VibeControls concepts and features',\n suggestions: [\n 'What is a Vibe in VibeControls?',\n 'How do agents connect to the platform?',\n 'Explain the session lifecycle',\n 'What are tunnels used for?',\n ],\n },\n] as const;\n\nexport type AssistantUsecaseId = (typeof ASSISTANT_USECASE_CONFIG)[number]['id'];\n"],"mappings":";AAAA,IAAa,IAA2B;CACtC;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CACF"}
|
|
1
|
+
{"version":3,"file":"assistantUsecases.js","names":[],"sources":["../../src/config/assistantUsecases.ts"],"sourcesContent":["export const ASSISTANT_USECASE_CONFIG = [\n {\n id: 'assistant',\n label: 'Assistant',\n description:\n 'Ask questions and run operations on the current screen — answers from the docs and makes API calls for you',\n suggestions: [\n 'What can I do on this screen?',\n 'Create a new vibe called demo',\n 'List my recent sessions',\n 'How do tunnels work?',\n ],\n },\n {\n id: 'api-calls',\n label: 'API Calls',\n description: 'Make API calls in context with the active product and your credentials',\n suggestions: [\n 'Show me all API endpoints for sessions',\n 'How do I create an agent via the API?',\n 'List vibes using the REST API',\n 'What headers are needed for authentication?',\n ],\n },\n {\n id: 'vibe-plugins',\n label: 'Vibe Plugins',\n description: 'Build and learn about Vibe Plugins for extending VibeControls',\n suggestions: [\n 'How do I create a new Vibe Plugin?',\n 'What is the plugin manifest structure?',\n 'Explain the plugin lifecycle hooks',\n 'Show me a plugin example with frontend UI',\n ],\n },\n {\n id: 'general',\n label: 'General',\n description: 'General help with VibeControls concepts and features',\n suggestions: [\n 'What is a Vibe in VibeControls?',\n 'How do agents connect to the platform?',\n 'Explain the session lifecycle',\n 'What are tunnels used for?',\n ],\n },\n] as const;\n\nexport type AssistantUsecaseId = (typeof ASSISTANT_USECASE_CONFIG)[number]['id'];\n"],"mappings":";AAAA,IAAa,IAA2B;CACtC;EACE,IAAI;EACJ,OAAO;EACP,aACE;EACF,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CACF"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { config as Gv, resetVibeControlsConfig as Kv, setVibeControlsConfig as q
|
|
|
6
6
|
import { useAssistantStore as Jv } from "./store/assistantStore.js";
|
|
7
7
|
import { AIAssistantPanel as Yv } from "./components/assistant/AIAssistantPanel.js";
|
|
8
8
|
import "./components/assistant/index.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
export { Yv as AIAssistantPanel, e as ActionExecutionFieldsFragmentDoc, t as ActionFieldsFragmentDoc, n as AddAgentFromTunnelDocument, r as AddComponentToCatalogDocument, i as AddScorecardMetricDocument, a as AddVibeToCatalogDocument, o as AdminRevokeVibeLlmContextTokenDocument, s as AdoptAgentSessionDocument, c as AgentBackupRequestDocument, l as AgentCodeServerStartDocument, u as AgentCodeServerStatusDocument, d as AgentCodeServerStopDocument, f as AgentCommandsDocument, p as AgentConnectionConfigDocument, m as AgentConnectionFieldsFragmentDoc, h as AgentEditorOpenDocument, g as AgentFieldsFragmentDoc, _ as AgentHeartbeatDocument, v as AgentHeartbeatSubscriptionDocument, y as AgentMeshLinkFieldsFragmentDoc, b as AgentMessageBookmarkFieldsFragmentDoc, x as AgentPlaygroundConfigDocument, S as AgentPluginsDocument, C as AgentSecretRevealDocument, w as AgentSecurityScanMutateDocument, T as AgentSecurityScanProxyDocument, E as AgentSelfUpdateDocument, D as AgentSessionOrphansDocument, O as AgentStatusChangedDocument, k as AgentUpdateCheckDocument, A as AgentUpdateCheckNowDocument, j as AgentUpdateStatusDocument, M as AiContextFieldsFragmentDoc, N as AiPromptPickerFieldsFragmentDoc, P as AllVibeLlmContextTokensDocument, F as ApplyScorecardTemplateDocument, I as ArchiveVibeDocument, L as AttachAgentToVibeDocument, R as AttachTunnelDomainDocument, z as AvailableNoteTagsDocument, B as BulkDeleteVibeAuditLogsDocument, V as BulkRestartSessionsDocument, H as BulkSetConfigurationsDocument, U as BulkStopSessionsDocument, W as BulkTerminateSessionsDocument, G as CatalogFieldsFragmentDoc, K as CatalogUpdatedDocument, q as CheckAiCreditsDocument, J as CheckSessionHealthDocument, Y as CollaboratorJoinedDocument, X as CollaboratorLeftDocument, Z as CompileDocsSiteDocument, Q as ComponentFieldsFragmentDoc, $ as ConfigurationChangedDocument, ee as ConfigurationFieldsFragmentDoc, te as ConnectAgentToTargetDocument, ne as CreateActionDocument, re as CreateAgentDocument, ie as CreateAgentInstructionFileDocument, ae as CreateAgentMessageBookmarkDocument, oe as CreateAiContextDocument, se as CreateCatalogDocument, ce as CreateComponentDocument, le as CreateDocsPageDocument, ue as CreateDocsSiteDocument, de as CreateNoteDocument, fe as CreateNoteTagDocument, pe as CreateSandboxDocument, me as CreateSessionDocument, he as CreateSessionShareLinkDocument, ge as CreateTargetDocument, _e as CreateTunnelDocument, ve as CreateVibeCalendarTaskDocument, ye as CreateVibeDeckButtonDocument, be as CreateVibeDeckDocument, xe as CreateVibeDeckShareLinkDocument, Se as CreateVibeDocument, Ce as CreateWebhookDocument, we as DeactivateAgentDocument, Te as DeleteActionDocument, Ee as DeleteAgentDocument, De as DeleteAgentInstructionFileDocument, Oe as DeleteAgentMessageBookmarkDocument, ke as DeleteAiContextDocument, Ae as DeleteCatalogDocument, je as DeleteComponentDocument, Me as DeleteConfigurationDocument, Ne as DeleteDeploymentDocument, Pe as DeleteDocsPageDocument, Fe as DeleteDocsSiteDocument, Ie as DeleteNoteDocument, Le as DeleteSettingsSecretDocument, Re as DeleteTargetDocument, ze as DeleteTemplateDocument, Be as DeleteTunnelDocument, Ve as DeleteTunnelDomainDocument, He as DeleteVibeAuditLogDocument, Ue as DeleteVibeCalendarTaskDocument, We as DeleteVibeDeckButtonDocument, Ge as DeleteVibeDeckDocument, Ke as DeleteVibeDocument, qe as DeleteVibeEnvVarDocument, Je as DeleteWebhookDocument, Ye as DeployAgentViaMeshDocument, Xe as DetachAgentFromVibeDocument, Ze as DetachTunnelDomainDocument, Qe as DisableDocsBuildImageDocument, $e as DisconnectAgentFromTargetDocument, et as DocsContentDocument, tt as DuplicateActionDocument, nt as DuplicateVibeDeckDocument, rt as EntityTagPickerAssignmentFieldsFragmentDoc, it as EntityTagPickerAvailableTagFieldsFragmentDoc, at as EntityTagPickerAvailableTagsDocument, ot as EntityTagPickerCreateTagDocument, st as EntityTagPickerGetEntityTagsDocument, ct as EntityTagPickerSearchTagsDocument, lt as EntityTagPickerTagEntityDocument, ut as EntityTagPickerUntagEntityDocument, dt as ExecuteActionDocument, ft as ExecuteAgentMeshRequestDocument, pt as ExecuteScheduledJobNowDocument, mt as ExecuteSharedVibeDeckButtonDocument, ht as ExecuteVibeDeckButtonDocument, gt as ExportSessionsDocument, _t as ExportVibeAuditLogsDocument, vt as ExtendSandboxTtlDocument, yt as ForkGitHubRepoDocument, bt as GenerateAgentGraphContextUrlDocument, xt as GenerateDocsSignedUrlDocument, St as GenerateVibeLlmContextUrlDocument, Ct as GetActionDocument, wt as GetActiveSandboxesDocument, Tt as GetAgentConnectionEventsDocument, Et as GetAgentDocument, Dt as GetAgentGraphDocument, Ot as GetAgentInstructionFileDocument, kt as GetAgentMeshGraphDocument, At as GetAiContextDocument, jt as GetCatalogDependencyGraphDocument, Mt as GetCatalogDocument, Nt as GetCatalogSbomDocument, Pt as GetComponentDeploymentsDocument, Ft as GetComponentDocument, It as GetConfigurationDocument, Lt as GetConfigurationValueDocument, Rt as GetDefaultVibeDeckDocument, zt as GetDocsRevisionDocument, Bt as GetDocsSiteDocument, Vt as GetEnvTopologyDocument, Ht as GetFileDownloadUrlDocument, Ut as GetInstallAgentJobStatusDocument, Wt as GetNoteDocument, Gt as GetNoteTagsDocument, Kt as GetRecentSandboxActivityDocument, qt as GetSandboxDocument, Jt as GetSandboxStatsDocument, Yt as GetScheduledJobDetailDocument, Xt as GetScheduledJobsForCalendarDocument, Zt as GetSchedulerMetricsForAnalyticsDocument, Qt as GetScorecardDocument, $t as GetScorecardMetricHistoryDocument, en as GetScorecardPushTokenInfoDocument, tn as GetScorecardTemplatesDocument, nn as GetScorecardsDocument, rn as GetSessionCollaboratorsDocument, an as GetSessionConnectionEventsDocument, on as GetSessionDocument, sn as GetSessionShareLinksDocument, cn as GetSessionSharesDocument, ln as GetSessionsSharedWithMeDocument, un as GetSharedVibeDeckDocument, dn as GetTargetDocument, fn as GetTemplateDocument, pn as GetTunnelAuditDocument, mn as GetTunnelBySlugDocument, hn as GetTunnelDocument, gn as GetTunnelUsageDocument, _n as GetUiSessionDocument, vn as GetVibeAuditLogDocument, yn as GetVibeAuditLogStatsDocument, bn as GetVibeCalendarTaskDocument, xn as GetVibeCatalogsDocument, Sn as GetVibeDeckDocument, Cn as GetVibeDocsSiteDocument, wn as GetVibeDocument, Tn as GetVibeEnvVarsDocument, En as GetVibeFeatureCatalogDocument, Dn as GetVibeFeatureFlagsDocument, On as GetVibeLinkedEntitiesDocument, kn as GetVibeLinkedSandboxesDocument, An as GetVibeLinkedScheduledJobsDocument, jn as GetWebhookDocument, Mn as GetWorkspaceFilesDocument, Nn as ImportTargetsFromConfigDocument, Pn as InstallAgentOnTargetDocument, Fn as InstallAgentPluginDocument, In as InstantiateTemplateDocument, Ln as InstructionFileFieldsFragmentDoc, Rn as IssueTunnelSessionDocument, zn as JoinSharedSessionDocument, Bn as LeaveSharedSessionDocument, Vn as LinkEntityToVibeDocument, Hn as ListActionExecutionsDocument, Un as ListActionsDocument, Wn as ListActiveConnectionsDocument, Gn as ListActiveTunnelsWithSessionsDocument, Kn as ListAgentInstructionFilesDocument, qn as ListAgentProfilesDocument, Jn as ListAgentsDocument, Yn as ListAiContextsDocument, Xn as ListAiPromptsDocument, Zn as ListAllComponentsForCatalogDocument, Qn as ListCatalogsDocument, $n as ListComponentsDocument, er as ListConfigurationsDocument, tr as ListDocsBuildImagesDocument, nr as ListNotesDocument, rr as ListSessionsDocument, ir as ListTargetsDocument, ar as ListTemplatesDocument, or as ListTunnelDomainsDocument, sr as ListTunnelProvidersDocument, cr as ListTunnelSessionsDocument, lr as ListTunnelsDocument, ur as ListVibeAuditLogsDocument, dr as ListVibeCalendarExecutionsDocument, fr as ListVibeCalendarTasksDocument, pr as ListVibeDeckButtonsDocument, mr as ListVibeDeckShareLinksDocument, hr as ListVibeDecksDocument, gr as ListVibesDocument, _r as ListWebhooksDocument, vr as MeshAgentFieldsFragmentDoc, yr as MeshDeployJobStatusDocument, br as MintAgentCapabilityDocument, xr as MoveVibeDeckButtonDocument, Sr as MoveVibeDocument, Cr as MyAgentMessageBookmarksDocument, wr as MySettingsByCategoryDocument, Tr as MySettingsDocument, Er as MyVibeLlmContextPreviewDocument, Dr as MyVibeLlmContextSettingsDocument, Or as MyVibeLlmContextTokenAuditsDocument, kr as MyVibeLlmContextTokensDocument, Ar as NoteFieldsFragmentDoc, jr as NoteTagAssignmentFieldsFragmentDoc, Mr as NukeVibecontrolsAgentDocument, Nr as OnVibeAuditLogCreatedDocument, Pr as OverviewSummaryDocument, Fr as PinNoteDocument, Ir as PinnedNotesDocument, Lr as ProbeAgentConnectionDocument, Rr as ProbeAgentTunnelDocument, zr as PromoteDeploymentDocument, Br as ProxySandboxRequestDocument, Vr as PublishComponentAsTemplateDocument, Hr as PushAgentGatewayAuthDocument, Ur as RecentAiToolEventsStreamDocument, Wr as RegisterCustomTunnelDomainDocument, Gr as RegisterDeploymentDocument, Kr as RegisterDocsBuildImageDocument, qr as RegisterInstalledAgentDocument, Jr as ReleaseSessionControlDocument, Yr as RemoveAgentPluginDocument, Xr as RemoveComponentFromCatalogDocument, Zr as RemoveScorecardMetricDocument, Qr as RemoveVibeFromCatalogDocument, $r as RenderAiPromptDocument, ei as ReorderVibeDeckButtonsDocument, ti as ReplaceNoteTagsDocument, ni as ReportAiTokenUsageDocument, ri as RequestSessionControlDocument, ii as ReserveTunnelSubdomainDocument, ai as ResetSettingsDocument, oi as ResetWebhookFailuresDocument, si as RestartSessionDocument, ci as RestartSessionTerminalDocument, li as RestoreVibeDocument, ui as RevokeAgentMeshLinkDocument, di as RevokeAllMyVibeLlmContextTokensDocument, fi as RevokeSessionShareDocument, pi as RevokeSessionShareLinkDocument, mi as RevokeTunnelPublicAccessDocument, hi as RevokeTunnelSessionDocument, gi as RevokeVibeDeckShareLinkDocument, _i as RevokeVibeLlmContextTokenDocument, vi as RollbackDocsRevisionDocument, yi as RotateScorecardPushTokenDocument, bi as RotateTunnelCredentialsDocument, xi as RotateVibeLlmContextUrlDocument, Si as RunAgentCommandDocument, Ci as SaveUiSessionDocument, wi as ScanSshConfigDocument, Ti as ScorecardFieldsFragmentDoc, Ei as ScorecardMetricFieldsFragmentDoc, Di as ScorecardTemplateFieldsFragmentDoc, Oi as SearchNotesDocument, ki as SendSessionInputDocument, Ai as SessionCollaboratorFieldsFragmentDoc, ji as SessionControlChangedDocument, Mi as SessionFieldsFragmentDoc, Ni as SessionHistoryRecordingEnabledDocument, Pi as SessionOutputReceivedDocument, Fi as SessionShareFieldsFragmentDoc, Ii as SessionShareLinkFieldsFragmentDoc, Li as SessionSharedWithMeDocument, Ri as SessionStatusChangedDocument, zi as SetAgentApiKeyDocument, Bi as SetAgentAutoUpdateDocument, Vi as SetAgentPlaygroundConfigDocument, Hi as SetConfigurationDocument, Ui as SetDefaultVibeDeckDocument, Wi as SetMyVibeLlmContextSettingsDocument, Gi as SetSettingsSecretDocument, Ki as SetTunnelPublicAccessDocument, qi as SetVibeEnvVarDocument, Ji as SetVibeFeatureFlagDocument, Yi as SettingsPageDataDocument, Xi as SetupAgentGatewayAuthDocument, Zi as ShareLinkValidationFieldsFragmentDoc, Qi as ShareNoteDocument, $i as ShareSessionDocument, ea as SharedSessionOutputDocument, ta as SharedVibeDeckButtonFieldsFragmentDoc, na as SharedVibeDeckFieldsFragmentDoc, ra as StartMeshAgentSessionDocument, ia as StartSessionDocument, aa as StartSessionTerminalDocument, oa as StartTerminalDocument, sa as StartTunnelDocument, ca as StartVibecontrolsAgentDocument, la as StopSessionDocument, ua as StopSessionTerminalDocument, da as StopTerminalDocument, fa as StopTunnelDocument, pa as StopVibecontrolsAgentDocument, ma as TagNoteDocument, ha as TargetFieldsFragmentDoc, ga as TemplateFieldsFragmentDoc, _a as TerminateSessionDocument, va as TestTargetDocument, ya as TestWebhookDocument, ba as TransferSessionControlDocument, xa as TriggerVibeCalendarTaskNowDocument, Sa as TriggerWebhookDocument, Ca as TunnelDomainFieldsFragmentDoc, wa as TunnelFieldsFragmentDoc, Ta as TunnelProviderFieldsFragmentDoc, Ea as TunnelSessionFieldsFragmentDoc, Da as UninstallAgentFromTargetDocument, Oa as UnlinkEntityFromVibeDocument, ka as UnpinNoteDocument, Aa as UntagNoteDocument, ja as UpdateActionDocument, Ma as UpdateAgentDocument, Na as UpdateAgentInstructionFileDocument, Pa as UpdateAgentMessageBookmarkDocument, Fa as UpdateAgentOwnershipDocument, Ia as UpdateAgentPluginDocument, La as UpdateAgentTunnelUrlDocument, Ra as UpdateAgentVersionDocument, za as UpdateAiContextDocument, Ba as UpdateCatalogDocument, Va as UpdateComponentDocument, Ha as UpdateConnectionPermissionsDocument, Ua as UpdateDocsPageDocument, Wa as UpdateDocsSiteDocument, Ga as UpdateDocsSiteRuntimeDocument, Ka as UpdateDocsSiteVisibilityDocument, qa as UpdateEntityVisibilityDocument, Ja as UpdateMeshLinkPermissionsDocument, Ya as UpdateNoteDocument, Xa as UpdateNotificationPreferencesDocument, Za as UpdatePreferencesDocument, Qa as UpdateProfileDocument, $a as UpdateScorecardMetricDocument, eo as UpdateSessionDocument, to as UpdateSessionShareDocument, no as UpdateTargetDocument, ro as UpdateTemplateDocument, io as UpdateTunnelDocument, ao as UpdateVibeCalendarTaskDocument, oo as UpdateVibeDeckButtonDocument, so as UpdateVibeDeckDocument, co as UpdateVibeDeckShareLinkDocument, lo as UpdateVibeDocument, uo as UpdateVibeGitDocument, fo as UpdateVibeStatusDocument, po as UpdateWebhookDocument, mo as UpdateWorkspaceDefaultsDocument, ho as UpsertScorecardDocument, go as ValidateDocsBuildImageDocument, _o as ValidateShareLinkDocument, vo as ValidateVibeDeckShareLinkDocument, yo as VerifyTunnelDomainDocument, bo as VibeAgentsSummaryFragmentDoc, xo as VibeAuditDashboardDocument, So as VibeAuditLogDetailFragmentDoc, Co as VibeAuditLogFieldsFragmentDoc, wo as VibeCalendarExecutionFieldsFragmentDoc, To as VibeCalendarTaskFieldsFragmentDoc, Eo as VibeControlsInitialDataDocument, Wv as VibeControlsRoot, Do as VibeDeckButtonFieldsFragmentDoc, Oo as VibeDeckFieldsFragmentDoc, ko as VibeDeckShareLinkFieldsFragmentDoc, Ao as VibeDeckWithButtonsFragmentDoc, jo as VibeEnvVarFieldsFragmentDoc, Mo as VibeFieldsFragmentDoc, No as VibeLinkageResultFragmentDoc, Po as VibeListItemFragmentDoc, Fo as VibeLlmContextTokenAuditsDocument, Io as VibeStatusChangedDocument, Lo as VibeUpdatedDocument, Ro as VibecontrolsAgentHealthProbeStreamDocument, zo as VibecontrolsAgentHealthProbesDocument, Bo as VibecontrolsAgentLogStreamDocument, Vo as VibecontrolsAgentPluginStreamDocument, Ho as VibecontrolsAnalyticsDocument, Uo as WakeMeshAgentDocument, Wo as WebhookFieldsFragmentDoc, Go as WebhooksByEventDocument, Ko as WorkspaceTunnelAuditDocument, Gv as config, Zv as enTranslations, Kv as resetVibeControlsConfig, qv as setVibeControlsConfig, qo as useAddAgentFromTunnelMutation, Jo as useAddComponentToCatalogMutation, Yo as useAddScorecardMetricMutation, Xo as useAddVibeToCatalogMutation, Zo as useAdminRevokeVibeLlmContextTokenMutation, Qo as useAdoptAgentSessionMutation, $o as useAgentBackupRequestMutation, es as useAgentCodeServerStartMutation, ts as useAgentCodeServerStatusLazyQuery, ns as useAgentCodeServerStatusQuery, rs as useAgentCodeServerStatusSuspenseQuery, is as useAgentCodeServerStopMutation, as as useAgentCommandsLazyQuery, os as useAgentCommandsQuery, ss as useAgentCommandsSuspenseQuery, cs as useAgentConnectionConfigLazyQuery, ls as useAgentConnectionConfigQuery, us as useAgentConnectionConfigSuspenseQuery, ds as useAgentEditorOpenMutation, fs as useAgentHeartbeatMutation, ps as useAgentHeartbeatSubscriptionSubscription, ms as useAgentPlaygroundConfigLazyQuery, hs as useAgentPlaygroundConfigQuery, gs as useAgentPlaygroundConfigSuspenseQuery, _s as useAgentPluginsLazyQuery, vs as useAgentPluginsQuery, ys as useAgentPluginsSuspenseQuery, bs as useAgentSecretRevealLazyQuery, xs as useAgentSecretRevealQuery, Ss as useAgentSecretRevealSuspenseQuery, Cs as useAgentSecurityScanMutateMutation, ws as useAgentSecurityScanProxyLazyQuery, Ts as useAgentSecurityScanProxyQuery, Es as useAgentSecurityScanProxySuspenseQuery, Ds as useAgentSelfUpdateMutation, Os as useAgentSessionOrphansLazyQuery, ks as useAgentSessionOrphansQuery, As as useAgentSessionOrphansSuspenseQuery, js as useAgentStatusChangedSubscription, Ms as useAgentUpdateCheckLazyQuery, Ns as useAgentUpdateCheckNowMutation, Ps as useAgentUpdateCheckQuery, Fs as useAgentUpdateCheckSuspenseQuery, Is as useAgentUpdateStatusLazyQuery, Ls as useAgentUpdateStatusQuery, Rs as useAgentUpdateStatusSuspenseQuery, zs as useAllVibeLlmContextTokensLazyQuery, Bs as useAllVibeLlmContextTokensQuery, Vs as useAllVibeLlmContextTokensSuspenseQuery, Hs as useApplyScorecardTemplateMutation, Us as useArchiveVibeMutation, Jv as useAssistantStore, Ws as useAttachAgentToVibeMutation, Gs as useAttachTunnelDomainMutation, Ks as useAvailableNoteTagsLazyQuery, qs as useAvailableNoteTagsQuery, Js as useAvailableNoteTagsSuspenseQuery, Ys as useBulkDeleteVibeAuditLogsMutation, Xs as useBulkRestartSessionsMutation, Zs as useBulkSetConfigurationsMutation, Qs as useBulkStopSessionsMutation, $s as useBulkTerminateSessionsMutation, ec as useCatalogUpdatedSubscription, tc as useCheckAiCreditsMutation, nc as useCheckSessionHealthMutation, rc as useCollaboratorJoinedSubscription, ic as useCollaboratorLeftSubscription, ac as useCompileDocsSiteMutation, oc as useConfigurationChangedSubscription, sc as useConnectAgentToTargetMutation, cc as useCreateActionMutation, lc as useCreateAgentInstructionFileMutation, uc as useCreateAgentMessageBookmarkMutation, dc as useCreateAgentMutation, fc as useCreateAiContextMutation, pc as useCreateCatalogMutation, mc as useCreateComponentMutation, hc as useCreateDocsPageMutation, gc as useCreateDocsSiteMutation, _c as useCreateNoteMutation, vc as useCreateNoteTagMutation, yc as useCreateSandboxMutation, bc as useCreateSessionMutation, xc as useCreateSessionShareLinkMutation, Sc as useCreateTargetMutation, Cc as useCreateTunnelMutation, wc as useCreateVibeCalendarTaskMutation, Tc as useCreateVibeDeckButtonMutation, Ec as useCreateVibeDeckMutation, Dc as useCreateVibeDeckShareLinkMutation, Oc as useCreateVibeMutation, kc as useCreateWebhookMutation, Ac as useDeactivateAgentMutation, jc as useDeleteActionMutation, Mc as useDeleteAgentInstructionFileMutation, Nc as useDeleteAgentMessageBookmarkMutation, Pc as useDeleteAgentMutation, Fc as useDeleteAiContextMutation, Ic as useDeleteCatalogMutation, Lc as useDeleteComponentMutation, Rc as useDeleteConfigurationMutation, zc as useDeleteDeploymentMutation, Bc as useDeleteDocsPageMutation, Vc as useDeleteDocsSiteMutation, Hc as useDeleteNoteMutation, Uc as useDeleteSettingsSecretMutation, Wc as useDeleteTargetMutation, Gc as useDeleteTemplateMutation, Kc as useDeleteTunnelDomainMutation, qc as useDeleteTunnelMutation, Jc as useDeleteVibeAuditLogMutation, Yc as useDeleteVibeCalendarTaskMutation, Xc as useDeleteVibeDeckButtonMutation, Zc as useDeleteVibeDeckMutation, Qc as useDeleteVibeEnvVarMutation, $c as useDeleteVibeMutation, el as useDeleteWebhookMutation, tl as useDeployAgentViaMeshMutation, nl as useDetachAgentFromVibeMutation, rl as useDetachTunnelDomainMutation, il as useDisableDocsBuildImageMutation, al as useDisconnectAgentFromTargetMutation, ol as useDocsContentLazyQuery, sl as useDocsContentQuery, cl as useDocsContentSuspenseQuery, ll as useDuplicateActionMutation, ul as useDuplicateVibeDeckMutation, dl as useEntityTagPickerAvailableTagsLazyQuery, fl as useEntityTagPickerAvailableTagsQuery, pl as useEntityTagPickerAvailableTagsSuspenseQuery, ml as useEntityTagPickerCreateTagMutation, hl as useEntityTagPickerGetEntityTagsLazyQuery, gl as useEntityTagPickerGetEntityTagsQuery, _l as useEntityTagPickerGetEntityTagsSuspenseQuery, vl as useEntityTagPickerSearchTagsLazyQuery, yl as useEntityTagPickerSearchTagsQuery, bl as useEntityTagPickerSearchTagsSuspenseQuery, xl as useEntityTagPickerTagEntityMutation, Sl as useEntityTagPickerUntagEntityMutation, Cl as useExecuteActionMutation, wl as useExecuteAgentMeshRequestMutation, Tl as useExecuteScheduledJobNowMutation, El as useExecuteSharedVibeDeckButtonMutation, Dl as useExecuteVibeDeckButtonMutation, Ol as useExportSessionsMutation, kl as useExportVibeAuditLogsMutation, Al as useExtendSandboxTtlMutation, jl as useForkGitHubRepoMutation, Ml as useGenerateAgentGraphContextUrlMutation, Nl as useGenerateDocsSignedUrlMutation, Pl as useGenerateVibeLlmContextUrlMutation, Fl as useGetActionLazyQuery, Il as useGetActionQuery, Ll as useGetActionSuspenseQuery, Rl as useGetActiveSandboxesLazyQuery, zl as useGetActiveSandboxesQuery, Bl as useGetActiveSandboxesSuspenseQuery, Vl as useGetAgentConnectionEventsLazyQuery, Hl as useGetAgentConnectionEventsQuery, Ul as useGetAgentConnectionEventsSuspenseQuery, Wl as useGetAgentGraphLazyQuery, Gl as useGetAgentGraphQuery, Kl as useGetAgentGraphSuspenseQuery, ql as useGetAgentInstructionFileLazyQuery, Jl as useGetAgentInstructionFileQuery, Yl as useGetAgentInstructionFileSuspenseQuery, Xl as useGetAgentLazyQuery, Zl as useGetAgentMeshGraphLazyQuery, Ql as useGetAgentMeshGraphQuery, $l as useGetAgentMeshGraphSuspenseQuery, eu as useGetAgentQuery, tu as useGetAgentSuspenseQuery, nu as useGetAiContextLazyQuery, ru as useGetAiContextQuery, iu as useGetAiContextSuspenseQuery, au as useGetCatalogDependencyGraphLazyQuery, ou as useGetCatalogDependencyGraphQuery, su as useGetCatalogDependencyGraphSuspenseQuery, cu as useGetCatalogLazyQuery, lu as useGetCatalogQuery, uu as useGetCatalogSbomLazyQuery, du as useGetCatalogSbomQuery, fu as useGetCatalogSbomSuspenseQuery, pu as useGetCatalogSuspenseQuery, mu as useGetComponentDeploymentsLazyQuery, hu as useGetComponentDeploymentsQuery, gu as useGetComponentDeploymentsSuspenseQuery, _u as useGetComponentLazyQuery, vu as useGetComponentQuery, yu as useGetComponentSuspenseQuery, bu as useGetConfigurationLazyQuery, xu as useGetConfigurationQuery, Su as useGetConfigurationSuspenseQuery, Cu as useGetConfigurationValueLazyQuery, wu as useGetConfigurationValueQuery, Tu as useGetConfigurationValueSuspenseQuery, Eu as useGetDefaultVibeDeckLazyQuery, Du as useGetDefaultVibeDeckQuery, Ou as useGetDefaultVibeDeckSuspenseQuery, ku as useGetDocsRevisionLazyQuery, Au as useGetDocsRevisionQuery, ju as useGetDocsRevisionSuspenseQuery, Mu as useGetDocsSiteLazyQuery, Nu as useGetDocsSiteQuery, Pu as useGetDocsSiteSuspenseQuery, Fu as useGetEnvTopologyLazyQuery, Iu as useGetEnvTopologyQuery, Lu as useGetEnvTopologySuspenseQuery, Ru as useGetFileDownloadUrlLazyQuery, zu as useGetFileDownloadUrlQuery, Bu as useGetFileDownloadUrlSuspenseQuery, Vu as useGetInstallAgentJobStatusLazyQuery, Hu as useGetInstallAgentJobStatusQuery, Uu as useGetInstallAgentJobStatusSuspenseQuery, Wu as useGetNoteLazyQuery, Gu as useGetNoteQuery, Ku as useGetNoteSuspenseQuery, qu as useGetNoteTagsLazyQuery, Ju as useGetNoteTagsQuery, Yu as useGetNoteTagsSuspenseQuery, Xu as useGetRecentSandboxActivityLazyQuery, Zu as useGetRecentSandboxActivityQuery, Qu as useGetRecentSandboxActivitySuspenseQuery, $u as useGetSandboxLazyQuery, ed as useGetSandboxQuery, td as useGetSandboxStatsLazyQuery, nd as useGetSandboxStatsQuery, rd as useGetSandboxStatsSuspenseQuery, id as useGetSandboxSuspenseQuery, ad as useGetScheduledJobDetailLazyQuery, od as useGetScheduledJobDetailQuery, sd as useGetScheduledJobDetailSuspenseQuery, cd as useGetScheduledJobsForCalendarLazyQuery, ld as useGetScheduledJobsForCalendarQuery, ud as useGetScheduledJobsForCalendarSuspenseQuery, dd as useGetSchedulerMetricsForAnalyticsLazyQuery, fd as useGetSchedulerMetricsForAnalyticsQuery, pd as useGetSchedulerMetricsForAnalyticsSuspenseQuery, md as useGetScorecardLazyQuery, hd as useGetScorecardMetricHistoryLazyQuery, gd as useGetScorecardMetricHistoryQuery, _d as useGetScorecardMetricHistorySuspenseQuery, vd as useGetScorecardPushTokenInfoLazyQuery, yd as useGetScorecardPushTokenInfoQuery, bd as useGetScorecardPushTokenInfoSuspenseQuery, xd as useGetScorecardQuery, Sd as useGetScorecardSuspenseQuery, Cd as useGetScorecardTemplatesLazyQuery, wd as useGetScorecardTemplatesQuery, Td as useGetScorecardTemplatesSuspenseQuery, Ed as useGetScorecardsLazyQuery, Dd as useGetScorecardsQuery, Od as useGetScorecardsSuspenseQuery, kd as useGetSessionCollaboratorsLazyQuery, Ad as useGetSessionCollaboratorsQuery, jd as useGetSessionCollaboratorsSuspenseQuery, Md as useGetSessionConnectionEventsLazyQuery, Nd as useGetSessionConnectionEventsQuery, Pd as useGetSessionConnectionEventsSuspenseQuery, Fd as useGetSessionLazyQuery, Id as useGetSessionQuery, Ld as useGetSessionShareLinksLazyQuery, Rd as useGetSessionShareLinksQuery, zd as useGetSessionShareLinksSuspenseQuery, Bd as useGetSessionSharesLazyQuery, Vd as useGetSessionSharesQuery, Hd as useGetSessionSharesSuspenseQuery, Ud as useGetSessionSuspenseQuery, Wd as useGetSessionsSharedWithMeLazyQuery, Gd as useGetSessionsSharedWithMeQuery, Kd as useGetSessionsSharedWithMeSuspenseQuery, qd as useGetSharedVibeDeckLazyQuery, Jd as useGetSharedVibeDeckQuery, Yd as useGetSharedVibeDeckSuspenseQuery, Xd as useGetTargetLazyQuery, Zd as useGetTargetQuery, Qd as useGetTargetSuspenseQuery, $d as useGetTemplateLazyQuery, ef as useGetTemplateQuery, tf as useGetTemplateSuspenseQuery, nf as useGetTunnelAuditLazyQuery, rf as useGetTunnelAuditQuery, af as useGetTunnelAuditSuspenseQuery, of as useGetTunnelBySlugLazyQuery, sf as useGetTunnelBySlugQuery, cf as useGetTunnelBySlugSuspenseQuery, lf as useGetTunnelLazyQuery, uf as useGetTunnelQuery, df as useGetTunnelSuspenseQuery, ff as useGetTunnelUsageLazyQuery, pf as useGetTunnelUsageQuery, mf as useGetTunnelUsageSuspenseQuery, hf as useGetUiSessionLazyQuery, gf as useGetUiSessionQuery, _f as useGetUiSessionSuspenseQuery, vf as useGetVibeAuditLogLazyQuery, yf as useGetVibeAuditLogQuery, bf as useGetVibeAuditLogStatsLazyQuery, xf as useGetVibeAuditLogStatsQuery, Sf as useGetVibeAuditLogStatsSuspenseQuery, Cf as useGetVibeAuditLogSuspenseQuery, wf as useGetVibeCalendarTaskLazyQuery, Tf as useGetVibeCalendarTaskQuery, Ef as useGetVibeCalendarTaskSuspenseQuery, Df as useGetVibeCatalogsLazyQuery, Of as useGetVibeCatalogsQuery, kf as useGetVibeCatalogsSuspenseQuery, Af as useGetVibeDeckLazyQuery, jf as useGetVibeDeckQuery, Mf as useGetVibeDeckSuspenseQuery, Nf as useGetVibeDocsSiteLazyQuery, Pf as useGetVibeDocsSiteQuery, Ff as useGetVibeDocsSiteSuspenseQuery, If as useGetVibeEnvVarsLazyQuery, Lf as useGetVibeEnvVarsQuery, Rf as useGetVibeEnvVarsSuspenseQuery, zf as useGetVibeFeatureCatalogLazyQuery, Bf as useGetVibeFeatureCatalogQuery, Vf as useGetVibeFeatureCatalogSuspenseQuery, Hf as useGetVibeFeatureFlagsLazyQuery, Uf as useGetVibeFeatureFlagsQuery, Wf as useGetVibeFeatureFlagsSuspenseQuery, Gf as useGetVibeLazyQuery, Kf as useGetVibeLinkedEntitiesLazyQuery, qf as useGetVibeLinkedEntitiesQuery, Jf as useGetVibeLinkedEntitiesSuspenseQuery, Yf as useGetVibeLinkedSandboxesLazyQuery, Xf as useGetVibeLinkedSandboxesQuery, Zf as useGetVibeLinkedSandboxesSuspenseQuery, Qf as useGetVibeLinkedScheduledJobsLazyQuery, $f as useGetVibeLinkedScheduledJobsQuery, ep as useGetVibeLinkedScheduledJobsSuspenseQuery, tp as useGetVibeQuery, np as useGetVibeSuspenseQuery, rp as useGetWebhookLazyQuery, ip as useGetWebhookQuery, ap as useGetWebhookSuspenseQuery, op as useGetWorkspaceFilesLazyQuery, sp as useGetWorkspaceFilesQuery, cp as useGetWorkspaceFilesSuspenseQuery, lp as useImportTargetsFromConfigMutation, up as useInstallAgentOnTargetMutation, dp as useInstallAgentPluginMutation, fp as useInstantiateTemplateMutation, pp as useIssueTunnelSessionMutation, mp as useJoinSharedSessionMutation, hp as useLeaveSharedSessionMutation, gp as useLinkEntityToVibeMutation, _p as useListActionExecutionsLazyQuery, vp as useListActionExecutionsQuery, yp as useListActionExecutionsSuspenseQuery, bp as useListActionsLazyQuery, xp as useListActionsQuery, Sp as useListActionsSuspenseQuery, Cp as useListActiveConnectionsLazyQuery, wp as useListActiveConnectionsQuery, Tp as useListActiveConnectionsSuspenseQuery, Ep as useListActiveTunnelsWithSessionsLazyQuery, Dp as useListActiveTunnelsWithSessionsQuery, Op as useListActiveTunnelsWithSessionsSuspenseQuery, kp as useListAgentInstructionFilesLazyQuery, Ap as useListAgentInstructionFilesQuery, jp as useListAgentInstructionFilesSuspenseQuery, Mp as useListAgentProfilesLazyQuery, Np as useListAgentProfilesQuery, Pp as useListAgentProfilesSuspenseQuery, Fp as useListAgentsLazyQuery, Ip as useListAgentsQuery, Lp as useListAgentsSuspenseQuery, Rp as useListAiContextsLazyQuery, zp as useListAiContextsQuery, Bp as useListAiContextsSuspenseQuery, Vp as useListAiPromptsLazyQuery, Hp as useListAiPromptsQuery, Up as useListAiPromptsSuspenseQuery, Wp as useListAllComponentsForCatalogLazyQuery, Gp as useListAllComponentsForCatalogQuery, Kp as useListAllComponentsForCatalogSuspenseQuery, qp as useListCatalogsLazyQuery, Jp as useListCatalogsQuery, Yp as useListCatalogsSuspenseQuery, Xp as useListComponentsLazyQuery, Zp as useListComponentsQuery, Qp as useListComponentsSuspenseQuery, $p as useListConfigurationsLazyQuery, em as useListConfigurationsQuery, tm as useListConfigurationsSuspenseQuery, nm as useListDocsBuildImagesLazyQuery, rm as useListDocsBuildImagesQuery, im as useListDocsBuildImagesSuspenseQuery, am as useListNotesLazyQuery, om as useListNotesQuery, sm as useListNotesSuspenseQuery, cm as useListSessionsLazyQuery, lm as useListSessionsQuery, um as useListSessionsSuspenseQuery, dm as useListTargetsLazyQuery, fm as useListTargetsQuery, pm as useListTargetsSuspenseQuery, mm as useListTemplatesLazyQuery, hm as useListTemplatesQuery, gm as useListTemplatesSuspenseQuery, _m as useListTunnelDomainsLazyQuery, vm as useListTunnelDomainsQuery, ym as useListTunnelDomainsSuspenseQuery, bm as useListTunnelProvidersLazyQuery, xm as useListTunnelProvidersQuery, Sm as useListTunnelProvidersSuspenseQuery, Cm as useListTunnelSessionsLazyQuery, wm as useListTunnelSessionsQuery, Tm as useListTunnelSessionsSuspenseQuery, Em as useListTunnelsLazyQuery, Dm as useListTunnelsQuery, Om as useListTunnelsSuspenseQuery, km as useListVibeAuditLogsLazyQuery, Am as useListVibeAuditLogsQuery, jm as useListVibeAuditLogsSuspenseQuery, Mm as useListVibeCalendarExecutionsLazyQuery, Nm as useListVibeCalendarExecutionsQuery, Pm as useListVibeCalendarExecutionsSuspenseQuery, Fm as useListVibeCalendarTasksLazyQuery, Im as useListVibeCalendarTasksQuery, Lm as useListVibeCalendarTasksSuspenseQuery, Rm as useListVibeDeckButtonsLazyQuery, zm as useListVibeDeckButtonsQuery, Bm as useListVibeDeckButtonsSuspenseQuery, Vm as useListVibeDeckShareLinksLazyQuery, Hm as useListVibeDeckShareLinksQuery, Um as useListVibeDeckShareLinksSuspenseQuery, Wm as useListVibeDecksLazyQuery, Gm as useListVibeDecksQuery, Km as useListVibeDecksSuspenseQuery, qm as useListVibesLazyQuery, Jm as useListVibesQuery, Ym as useListVibesSuspenseQuery, Xm as useListWebhooksLazyQuery, Zm as useListWebhooksQuery, Qm as useListWebhooksSuspenseQuery, $m as useMeshDeployJobStatusLazyQuery, eh as useMeshDeployJobStatusQuery, th as useMeshDeployJobStatusSuspenseQuery, nh as useMintAgentCapabilityMutation, rh as useMoveVibeDeckButtonMutation, ih as useMoveVibeMutation, ah as useMyAgentMessageBookmarksLazyQuery, oh as useMyAgentMessageBookmarksQuery, sh as useMyAgentMessageBookmarksSuspenseQuery, ch as useMySettingsByCategoryLazyQuery, lh as useMySettingsByCategoryQuery, uh as useMySettingsByCategorySuspenseQuery, dh as useMySettingsLazyQuery, fh as useMySettingsQuery, ph as useMySettingsSuspenseQuery, mh as useMyVibeLlmContextPreviewLazyQuery, hh as useMyVibeLlmContextPreviewQuery, gh as useMyVibeLlmContextPreviewSuspenseQuery, _h as useMyVibeLlmContextSettingsLazyQuery, vh as useMyVibeLlmContextSettingsQuery, yh as useMyVibeLlmContextSettingsSuspenseQuery, bh as useMyVibeLlmContextTokenAuditsLazyQuery, xh as useMyVibeLlmContextTokenAuditsQuery, Sh as useMyVibeLlmContextTokenAuditsSuspenseQuery, Ch as useMyVibeLlmContextTokensLazyQuery, wh as useMyVibeLlmContextTokensQuery, Th as useMyVibeLlmContextTokensSuspenseQuery, Eh as useNukeVibecontrolsAgentMutation, Dh as useOnVibeAuditLogCreatedSubscription, Oh as useOverviewSummaryLazyQuery, kh as useOverviewSummaryQuery, Ah as useOverviewSummarySuspenseQuery, jh as usePinNoteMutation, Mh as usePinnedNotesLazyQuery, Nh as usePinnedNotesQuery, Ph as usePinnedNotesSuspenseQuery, Fh as useProbeAgentConnectionLazyQuery, Ih as useProbeAgentConnectionQuery, Lh as useProbeAgentConnectionSuspenseQuery, Rh as useProbeAgentTunnelLazyQuery, zh as useProbeAgentTunnelQuery, Bh as useProbeAgentTunnelSuspenseQuery, Vh as usePromoteDeploymentMutation, Hh as useProxySandboxRequestMutation, Uh as usePublishComponentAsTemplateMutation, Wh as usePushAgentGatewayAuthMutation, Gh as useRecentAiToolEventsStreamSubscription, Kh as useRegisterCustomTunnelDomainMutation, qh as useRegisterDeploymentMutation, Jh as useRegisterDocsBuildImageMutation, Yh as useRegisterInstalledAgentMutation, Xh as useReleaseSessionControlMutation, Zh as useRemoveAgentPluginMutation, Qh as useRemoveComponentFromCatalogMutation, $h as useRemoveScorecardMetricMutation, eg as useRemoveVibeFromCatalogMutation, tg as useRenderAiPromptMutation, ng as useReorderVibeDeckButtonsMutation, rg as useReplaceNoteTagsMutation, ig as useReportAiTokenUsageMutation, ag as useRequestSessionControlMutation, og as useReserveTunnelSubdomainMutation, sg as useResetSettingsMutation, cg as useResetWebhookFailuresMutation, lg as useRestartSessionMutation, ug as useRestartSessionTerminalMutation, dg as useRestoreVibeMutation, fg as useRevokeAgentMeshLinkMutation, pg as useRevokeAllMyVibeLlmContextTokensMutation, mg as useRevokeSessionShareLinkMutation, hg as useRevokeSessionShareMutation, gg as useRevokeTunnelPublicAccessMutation, _g as useRevokeTunnelSessionMutation, vg as useRevokeVibeDeckShareLinkMutation, yg as useRevokeVibeLlmContextTokenMutation, bg as useRollbackDocsRevisionMutation, xg as useRotateScorecardPushTokenMutation, Sg as useRotateTunnelCredentialsMutation, Cg as useRotateVibeLlmContextUrlMutation, wg as useRunAgentCommandMutation, Tg as useSaveUiSessionMutation, Eg as useScanSshConfigMutation, Dg as useSearchNotesLazyQuery, Og as useSearchNotesQuery, kg as useSearchNotesSuspenseQuery, Ag as useSendSessionInputMutation, jg as useSessionControlChangedSubscription, Mg as useSessionHistoryRecordingEnabledLazyQuery, Ng as useSessionHistoryRecordingEnabledQuery, Pg as useSessionHistoryRecordingEnabledSuspenseQuery, Fg as useSessionOutputReceivedSubscription, Ig as useSessionSharedWithMeSubscription, Lg as useSessionStatusChangedSubscription, Rg as useSetAgentApiKeyMutation, zg as useSetAgentAutoUpdateMutation, Bg as useSetAgentPlaygroundConfigMutation, Vg as useSetConfigurationMutation, Hg as useSetDefaultVibeDeckMutation, Ug as useSetMyVibeLlmContextSettingsMutation, Wg as useSetSettingsSecretMutation, Gg as useSetTunnelPublicAccessMutation, Kg as useSetVibeEnvVarMutation, qg as useSetVibeFeatureFlagMutation, Jg as useSettingsPageDataLazyQuery, Yg as useSettingsPageDataQuery, Xg as useSettingsPageDataSuspenseQuery, Zg as useSetupAgentGatewayAuthMutation, Qg as useShareNoteMutation, $g as useShareSessionMutation, e_ as useSharedSessionOutputSubscription, t_ as useStartMeshAgentSessionMutation, n_ as useStartSessionMutation, r_ as useStartSessionTerminalMutation, i_ as useStartTerminalMutation, a_ as useStartTunnelMutation, o_ as useStartVibecontrolsAgentMutation, s_ as useStopSessionMutation, c_ as useStopSessionTerminalMutation, l_ as useStopTerminalMutation, u_ as useStopTunnelMutation, d_ as useStopVibecontrolsAgentMutation, f_ as useTagNoteMutation, p_ as useTerminateSessionMutation, m_ as useTestTargetMutation, h_ as useTestWebhookMutation, g_ as useTransferSessionControlMutation, __ as useTriggerVibeCalendarTaskNowMutation, v_ as useTriggerWebhookMutation, y_ as useUninstallAgentFromTargetMutation, b_ as useUnlinkEntityFromVibeMutation, x_ as useUnpinNoteMutation, S_ as useUntagNoteMutation, C_ as useUpdateActionMutation, w_ as useUpdateAgentInstructionFileMutation, T_ as useUpdateAgentMessageBookmarkMutation, E_ as useUpdateAgentMutation, D_ as useUpdateAgentOwnershipMutation, O_ as useUpdateAgentPluginMutation, k_ as useUpdateAgentTunnelUrlMutation, A_ as useUpdateAgentVersionMutation, j_ as useUpdateAiContextMutation, M_ as useUpdateCatalogMutation, N_ as useUpdateComponentMutation, P_ as useUpdateConnectionPermissionsMutation, F_ as useUpdateDocsPageMutation, I_ as useUpdateDocsSiteMutation, L_ as useUpdateDocsSiteRuntimeMutation, R_ as useUpdateDocsSiteVisibilityMutation, z_ as useUpdateEntityVisibilityMutation, B_ as useUpdateMeshLinkPermissionsMutation, V_ as useUpdateNoteMutation, H_ as useUpdateNotificationPreferencesMutation, U_ as useUpdatePreferencesMutation, W_ as useUpdateProfileMutation, G_ as useUpdateScorecardMetricMutation, K_ as useUpdateSessionMutation, q_ as useUpdateSessionShareMutation, J_ as useUpdateTargetMutation, Y_ as useUpdateTemplateMutation, X_ as useUpdateTunnelMutation, Z_ as useUpdateVibeCalendarTaskMutation, Q_ as useUpdateVibeDeckButtonMutation, $_ as useUpdateVibeDeckMutation, ev as useUpdateVibeDeckShareLinkMutation, tv as useUpdateVibeGitMutation, nv as useUpdateVibeMutation, rv as useUpdateVibeStatusMutation, iv as useUpdateWebhookMutation, av as useUpdateWorkspaceDefaultsMutation, ov as useUpsertScorecardMutation, sv as useValidateDocsBuildImageMutation, cv as useValidateShareLinkLazyQuery, lv as useValidateShareLinkQuery, uv as useValidateShareLinkSuspenseQuery, dv as useValidateVibeDeckShareLinkLazyQuery, fv as useValidateVibeDeckShareLinkQuery, pv as useValidateVibeDeckShareLinkSuspenseQuery, mv as useVerifyTunnelDomainMutation, hv as useVibeAuditDashboardLazyQuery, gv as useVibeAuditDashboardQuery, _v as useVibeAuditDashboardSuspenseQuery, Hv as useVibeControls, vv as useVibeControlsInitialDataLazyQuery, yv as useVibeControlsInitialDataQuery, bv as useVibeControlsInitialDataSuspenseQuery, Uv as useVibeControlsStore, xv as useVibeLlmContextTokenAuditsLazyQuery, Sv as useVibeLlmContextTokenAuditsQuery, Cv as useVibeLlmContextTokenAuditsSuspenseQuery, wv as useVibeStatusChangedSubscription, Tv as useVibeUpdatedSubscription, Ev as useVibecontrolsAgentHealthProbeStreamSubscription, Dv as useVibecontrolsAgentHealthProbesLazyQuery, Ov as useVibecontrolsAgentHealthProbesQuery, kv as useVibecontrolsAgentHealthProbesSuspenseQuery, Av as useVibecontrolsAgentLogStreamSubscription, jv as useVibecontrolsAgentPluginStreamSubscription, Mv as useVibecontrolsAnalyticsLazyQuery, Nv as useVibecontrolsAnalyticsQuery, Pv as useVibecontrolsAnalyticsSuspenseQuery, Fv as useWakeMeshAgentMutation, Iv as useWebhooksByEventLazyQuery, Lv as useWebhooksByEventQuery, Rv as useWebhooksByEventSuspenseQuery, zv as useWorkspaceTunnelAuditLazyQuery, Bv as useWorkspaceTunnelAuditQuery, Vv as useWorkspaceTunnelAuditSuspenseQuery, Xv as vibeControlsPlugin };
|
|
9
|
+
import { useSandboxAssistantTransport as Xv } from "./services/createSandboxAssistantTransport.js";
|
|
10
|
+
import { vibeControlsPlugin as Zv } from "./plugin.js";
|
|
11
|
+
import { enTranslations as Qv } from "./translations/en.js";
|
|
12
|
+
export { Yv as AIAssistantPanel, e as ActionExecutionFieldsFragmentDoc, t as ActionFieldsFragmentDoc, n as AddAgentFromTunnelDocument, r as AddComponentToCatalogDocument, i as AddScorecardMetricDocument, a as AddVibeToCatalogDocument, o as AdminRevokeVibeLlmContextTokenDocument, s as AdoptAgentSessionDocument, c as AgentBackupRequestDocument, l as AgentCodeServerStartDocument, u as AgentCodeServerStatusDocument, d as AgentCodeServerStopDocument, f as AgentCommandsDocument, p as AgentConnectionConfigDocument, m as AgentConnectionFieldsFragmentDoc, h as AgentEditorOpenDocument, g as AgentFieldsFragmentDoc, _ as AgentHeartbeatDocument, v as AgentHeartbeatSubscriptionDocument, y as AgentMeshLinkFieldsFragmentDoc, b as AgentMessageBookmarkFieldsFragmentDoc, x as AgentPlaygroundConfigDocument, S as AgentPluginsDocument, C as AgentSecretRevealDocument, w as AgentSecurityScanMutateDocument, T as AgentSecurityScanProxyDocument, E as AgentSelfUpdateDocument, D as AgentSessionOrphansDocument, O as AgentStatusChangedDocument, k as AgentUpdateCheckDocument, A as AgentUpdateCheckNowDocument, j as AgentUpdateStatusDocument, M as AiContextFieldsFragmentDoc, N as AiPromptPickerFieldsFragmentDoc, P as AllVibeLlmContextTokensDocument, F as ApplyScorecardTemplateDocument, I as ArchiveVibeDocument, L as AttachAgentToVibeDocument, R as AttachTunnelDomainDocument, z as AvailableNoteTagsDocument, B as BulkDeleteVibeAuditLogsDocument, V as BulkRestartSessionsDocument, H as BulkSetConfigurationsDocument, U as BulkStopSessionsDocument, W as BulkTerminateSessionsDocument, G as CatalogFieldsFragmentDoc, K as CatalogUpdatedDocument, q as CheckAiCreditsDocument, J as CheckSessionHealthDocument, Y as CollaboratorJoinedDocument, X as CollaboratorLeftDocument, Z as CompileDocsSiteDocument, Q as ComponentFieldsFragmentDoc, $ as ConfigurationChangedDocument, ee as ConfigurationFieldsFragmentDoc, te as ConnectAgentToTargetDocument, ne as CreateActionDocument, re as CreateAgentDocument, ie as CreateAgentInstructionFileDocument, ae as CreateAgentMessageBookmarkDocument, oe as CreateAiContextDocument, se as CreateCatalogDocument, ce as CreateComponentDocument, le as CreateDocsPageDocument, ue as CreateDocsSiteDocument, de as CreateNoteDocument, fe as CreateNoteTagDocument, pe as CreateSandboxDocument, me as CreateSessionDocument, he as CreateSessionShareLinkDocument, ge as CreateTargetDocument, _e as CreateTunnelDocument, ve as CreateVibeCalendarTaskDocument, ye as CreateVibeDeckButtonDocument, be as CreateVibeDeckDocument, xe as CreateVibeDeckShareLinkDocument, Se as CreateVibeDocument, Ce as CreateWebhookDocument, we as DeactivateAgentDocument, Te as DeleteActionDocument, Ee as DeleteAgentDocument, De as DeleteAgentInstructionFileDocument, Oe as DeleteAgentMessageBookmarkDocument, ke as DeleteAiContextDocument, Ae as DeleteCatalogDocument, je as DeleteComponentDocument, Me as DeleteConfigurationDocument, Ne as DeleteDeploymentDocument, Pe as DeleteDocsPageDocument, Fe as DeleteDocsSiteDocument, Ie as DeleteNoteDocument, Le as DeleteSettingsSecretDocument, Re as DeleteTargetDocument, ze as DeleteTemplateDocument, Be as DeleteTunnelDocument, Ve as DeleteTunnelDomainDocument, He as DeleteVibeAuditLogDocument, Ue as DeleteVibeCalendarTaskDocument, We as DeleteVibeDeckButtonDocument, Ge as DeleteVibeDeckDocument, Ke as DeleteVibeDocument, qe as DeleteVibeEnvVarDocument, Je as DeleteWebhookDocument, Ye as DeployAgentViaMeshDocument, Xe as DetachAgentFromVibeDocument, Ze as DetachTunnelDomainDocument, Qe as DisableDocsBuildImageDocument, $e as DisconnectAgentFromTargetDocument, et as DocsContentDocument, tt as DuplicateActionDocument, nt as DuplicateVibeDeckDocument, rt as EntityTagPickerAssignmentFieldsFragmentDoc, it as EntityTagPickerAvailableTagFieldsFragmentDoc, at as EntityTagPickerAvailableTagsDocument, ot as EntityTagPickerCreateTagDocument, st as EntityTagPickerGetEntityTagsDocument, ct as EntityTagPickerSearchTagsDocument, lt as EntityTagPickerTagEntityDocument, ut as EntityTagPickerUntagEntityDocument, dt as ExecuteActionDocument, ft as ExecuteAgentMeshRequestDocument, pt as ExecuteScheduledJobNowDocument, mt as ExecuteSharedVibeDeckButtonDocument, ht as ExecuteVibeDeckButtonDocument, gt as ExportSessionsDocument, _t as ExportVibeAuditLogsDocument, vt as ExtendSandboxTtlDocument, yt as ForkGitHubRepoDocument, bt as GenerateAgentGraphContextUrlDocument, xt as GenerateDocsSignedUrlDocument, St as GenerateVibeLlmContextUrlDocument, Ct as GetActionDocument, wt as GetActiveSandboxesDocument, Tt as GetAgentConnectionEventsDocument, Et as GetAgentDocument, Dt as GetAgentGraphDocument, Ot as GetAgentInstructionFileDocument, kt as GetAgentMeshGraphDocument, At as GetAiContextDocument, jt as GetCatalogDependencyGraphDocument, Mt as GetCatalogDocument, Nt as GetCatalogSbomDocument, Pt as GetComponentDeploymentsDocument, Ft as GetComponentDocument, It as GetConfigurationDocument, Lt as GetConfigurationValueDocument, Rt as GetDefaultVibeDeckDocument, zt as GetDocsRevisionDocument, Bt as GetDocsSiteDocument, Vt as GetEnvTopologyDocument, Ht as GetFileDownloadUrlDocument, Ut as GetInstallAgentJobStatusDocument, Wt as GetNoteDocument, Gt as GetNoteTagsDocument, Kt as GetRecentSandboxActivityDocument, qt as GetSandboxDocument, Jt as GetSandboxStatsDocument, Yt as GetScheduledJobDetailDocument, Xt as GetScheduledJobsForCalendarDocument, Zt as GetSchedulerMetricsForAnalyticsDocument, Qt as GetScorecardDocument, $t as GetScorecardMetricHistoryDocument, en as GetScorecardPushTokenInfoDocument, tn as GetScorecardTemplatesDocument, nn as GetScorecardsDocument, rn as GetSessionCollaboratorsDocument, an as GetSessionConnectionEventsDocument, on as GetSessionDocument, sn as GetSessionShareLinksDocument, cn as GetSessionSharesDocument, ln as GetSessionsSharedWithMeDocument, un as GetSharedVibeDeckDocument, dn as GetTargetDocument, fn as GetTemplateDocument, pn as GetTunnelAuditDocument, mn as GetTunnelBySlugDocument, hn as GetTunnelDocument, gn as GetTunnelUsageDocument, _n as GetUiSessionDocument, vn as GetVibeAuditLogDocument, yn as GetVibeAuditLogStatsDocument, bn as GetVibeCalendarTaskDocument, xn as GetVibeCatalogsDocument, Sn as GetVibeDeckDocument, Cn as GetVibeDocsSiteDocument, wn as GetVibeDocument, Tn as GetVibeEnvVarsDocument, En as GetVibeFeatureCatalogDocument, Dn as GetVibeFeatureFlagsDocument, On as GetVibeLinkedEntitiesDocument, kn as GetVibeLinkedSandboxesDocument, An as GetVibeLinkedScheduledJobsDocument, jn as GetWebhookDocument, Mn as GetWorkspaceFilesDocument, Nn as ImportTargetsFromConfigDocument, Pn as InstallAgentOnTargetDocument, Fn as InstallAgentPluginDocument, In as InstantiateTemplateDocument, Ln as InstructionFileFieldsFragmentDoc, Rn as IssueTunnelSessionDocument, zn as JoinSharedSessionDocument, Bn as LeaveSharedSessionDocument, Vn as LinkEntityToVibeDocument, Hn as ListActionExecutionsDocument, Un as ListActionsDocument, Wn as ListActiveConnectionsDocument, Gn as ListActiveTunnelsWithSessionsDocument, Kn as ListAgentInstructionFilesDocument, qn as ListAgentProfilesDocument, Jn as ListAgentsDocument, Yn as ListAiContextsDocument, Xn as ListAiPromptsDocument, Zn as ListAllComponentsForCatalogDocument, Qn as ListCatalogsDocument, $n as ListComponentsDocument, er as ListConfigurationsDocument, tr as ListDocsBuildImagesDocument, nr as ListNotesDocument, rr as ListSessionsDocument, ir as ListTargetsDocument, ar as ListTemplatesDocument, or as ListTunnelDomainsDocument, sr as ListTunnelProvidersDocument, cr as ListTunnelSessionsDocument, lr as ListTunnelsDocument, ur as ListVibeAuditLogsDocument, dr as ListVibeCalendarExecutionsDocument, fr as ListVibeCalendarTasksDocument, pr as ListVibeDeckButtonsDocument, mr as ListVibeDeckShareLinksDocument, hr as ListVibeDecksDocument, gr as ListVibesDocument, _r as ListWebhooksDocument, vr as MeshAgentFieldsFragmentDoc, yr as MeshDeployJobStatusDocument, br as MintAgentCapabilityDocument, xr as MoveVibeDeckButtonDocument, Sr as MoveVibeDocument, Cr as MyAgentMessageBookmarksDocument, wr as MySettingsByCategoryDocument, Tr as MySettingsDocument, Er as MyVibeLlmContextPreviewDocument, Dr as MyVibeLlmContextSettingsDocument, Or as MyVibeLlmContextTokenAuditsDocument, kr as MyVibeLlmContextTokensDocument, Ar as NoteFieldsFragmentDoc, jr as NoteTagAssignmentFieldsFragmentDoc, Mr as NukeVibecontrolsAgentDocument, Nr as OnVibeAuditLogCreatedDocument, Pr as OverviewSummaryDocument, Fr as PinNoteDocument, Ir as PinnedNotesDocument, Lr as ProbeAgentConnectionDocument, Rr as ProbeAgentTunnelDocument, zr as PromoteDeploymentDocument, Br as ProxySandboxRequestDocument, Vr as PublishComponentAsTemplateDocument, Hr as PushAgentGatewayAuthDocument, Ur as RecentAiToolEventsStreamDocument, Wr as RegisterCustomTunnelDomainDocument, Gr as RegisterDeploymentDocument, Kr as RegisterDocsBuildImageDocument, qr as RegisterInstalledAgentDocument, Jr as ReleaseSessionControlDocument, Yr as RemoveAgentPluginDocument, Xr as RemoveComponentFromCatalogDocument, Zr as RemoveScorecardMetricDocument, Qr as RemoveVibeFromCatalogDocument, $r as RenderAiPromptDocument, ei as ReorderVibeDeckButtonsDocument, ti as ReplaceNoteTagsDocument, ni as ReportAiTokenUsageDocument, ri as RequestSessionControlDocument, ii as ReserveTunnelSubdomainDocument, ai as ResetSettingsDocument, oi as ResetWebhookFailuresDocument, si as RestartSessionDocument, ci as RestartSessionTerminalDocument, li as RestoreVibeDocument, ui as RevokeAgentMeshLinkDocument, di as RevokeAllMyVibeLlmContextTokensDocument, fi as RevokeSessionShareDocument, pi as RevokeSessionShareLinkDocument, mi as RevokeTunnelPublicAccessDocument, hi as RevokeTunnelSessionDocument, gi as RevokeVibeDeckShareLinkDocument, _i as RevokeVibeLlmContextTokenDocument, vi as RollbackDocsRevisionDocument, yi as RotateScorecardPushTokenDocument, bi as RotateTunnelCredentialsDocument, xi as RotateVibeLlmContextUrlDocument, Si as RunAgentCommandDocument, Ci as SaveUiSessionDocument, wi as ScanSshConfigDocument, Ti as ScorecardFieldsFragmentDoc, Ei as ScorecardMetricFieldsFragmentDoc, Di as ScorecardTemplateFieldsFragmentDoc, Oi as SearchNotesDocument, ki as SendSessionInputDocument, Ai as SessionCollaboratorFieldsFragmentDoc, ji as SessionControlChangedDocument, Mi as SessionFieldsFragmentDoc, Ni as SessionHistoryRecordingEnabledDocument, Pi as SessionOutputReceivedDocument, Fi as SessionShareFieldsFragmentDoc, Ii as SessionShareLinkFieldsFragmentDoc, Li as SessionSharedWithMeDocument, Ri as SessionStatusChangedDocument, zi as SetAgentApiKeyDocument, Bi as SetAgentAutoUpdateDocument, Vi as SetAgentPlaygroundConfigDocument, Hi as SetConfigurationDocument, Ui as SetDefaultVibeDeckDocument, Wi as SetMyVibeLlmContextSettingsDocument, Gi as SetSettingsSecretDocument, Ki as SetTunnelPublicAccessDocument, qi as SetVibeEnvVarDocument, Ji as SetVibeFeatureFlagDocument, Yi as SettingsPageDataDocument, Xi as SetupAgentGatewayAuthDocument, Zi as ShareLinkValidationFieldsFragmentDoc, Qi as ShareNoteDocument, $i as ShareSessionDocument, ea as SharedSessionOutputDocument, ta as SharedVibeDeckButtonFieldsFragmentDoc, na as SharedVibeDeckFieldsFragmentDoc, ra as StartMeshAgentSessionDocument, ia as StartSessionDocument, aa as StartSessionTerminalDocument, oa as StartTerminalDocument, sa as StartTunnelDocument, ca as StartVibecontrolsAgentDocument, la as StopSessionDocument, ua as StopSessionTerminalDocument, da as StopTerminalDocument, fa as StopTunnelDocument, pa as StopVibecontrolsAgentDocument, ma as TagNoteDocument, ha as TargetFieldsFragmentDoc, ga as TemplateFieldsFragmentDoc, _a as TerminateSessionDocument, va as TestTargetDocument, ya as TestWebhookDocument, ba as TransferSessionControlDocument, xa as TriggerVibeCalendarTaskNowDocument, Sa as TriggerWebhookDocument, Ca as TunnelDomainFieldsFragmentDoc, wa as TunnelFieldsFragmentDoc, Ta as TunnelProviderFieldsFragmentDoc, Ea as TunnelSessionFieldsFragmentDoc, Da as UninstallAgentFromTargetDocument, Oa as UnlinkEntityFromVibeDocument, ka as UnpinNoteDocument, Aa as UntagNoteDocument, ja as UpdateActionDocument, Ma as UpdateAgentDocument, Na as UpdateAgentInstructionFileDocument, Pa as UpdateAgentMessageBookmarkDocument, Fa as UpdateAgentOwnershipDocument, Ia as UpdateAgentPluginDocument, La as UpdateAgentTunnelUrlDocument, Ra as UpdateAgentVersionDocument, za as UpdateAiContextDocument, Ba as UpdateCatalogDocument, Va as UpdateComponentDocument, Ha as UpdateConnectionPermissionsDocument, Ua as UpdateDocsPageDocument, Wa as UpdateDocsSiteDocument, Ga as UpdateDocsSiteRuntimeDocument, Ka as UpdateDocsSiteVisibilityDocument, qa as UpdateEntityVisibilityDocument, Ja as UpdateMeshLinkPermissionsDocument, Ya as UpdateNoteDocument, Xa as UpdateNotificationPreferencesDocument, Za as UpdatePreferencesDocument, Qa as UpdateProfileDocument, $a as UpdateScorecardMetricDocument, eo as UpdateSessionDocument, to as UpdateSessionShareDocument, no as UpdateTargetDocument, ro as UpdateTemplateDocument, io as UpdateTunnelDocument, ao as UpdateVibeCalendarTaskDocument, oo as UpdateVibeDeckButtonDocument, so as UpdateVibeDeckDocument, co as UpdateVibeDeckShareLinkDocument, lo as UpdateVibeDocument, uo as UpdateVibeGitDocument, fo as UpdateVibeStatusDocument, po as UpdateWebhookDocument, mo as UpdateWorkspaceDefaultsDocument, ho as UpsertScorecardDocument, go as ValidateDocsBuildImageDocument, _o as ValidateShareLinkDocument, vo as ValidateVibeDeckShareLinkDocument, yo as VerifyTunnelDomainDocument, bo as VibeAgentsSummaryFragmentDoc, xo as VibeAuditDashboardDocument, So as VibeAuditLogDetailFragmentDoc, Co as VibeAuditLogFieldsFragmentDoc, wo as VibeCalendarExecutionFieldsFragmentDoc, To as VibeCalendarTaskFieldsFragmentDoc, Eo as VibeControlsInitialDataDocument, Wv as VibeControlsRoot, Do as VibeDeckButtonFieldsFragmentDoc, Oo as VibeDeckFieldsFragmentDoc, ko as VibeDeckShareLinkFieldsFragmentDoc, Ao as VibeDeckWithButtonsFragmentDoc, jo as VibeEnvVarFieldsFragmentDoc, Mo as VibeFieldsFragmentDoc, No as VibeLinkageResultFragmentDoc, Po as VibeListItemFragmentDoc, Fo as VibeLlmContextTokenAuditsDocument, Io as VibeStatusChangedDocument, Lo as VibeUpdatedDocument, Ro as VibecontrolsAgentHealthProbeStreamDocument, zo as VibecontrolsAgentHealthProbesDocument, Bo as VibecontrolsAgentLogStreamDocument, Vo as VibecontrolsAgentPluginStreamDocument, Ho as VibecontrolsAnalyticsDocument, Uo as WakeMeshAgentDocument, Wo as WebhookFieldsFragmentDoc, Go as WebhooksByEventDocument, Ko as WorkspaceTunnelAuditDocument, Gv as config, Qv as enTranslations, Kv as resetVibeControlsConfig, qv as setVibeControlsConfig, qo as useAddAgentFromTunnelMutation, Jo as useAddComponentToCatalogMutation, Yo as useAddScorecardMetricMutation, Xo as useAddVibeToCatalogMutation, Zo as useAdminRevokeVibeLlmContextTokenMutation, Qo as useAdoptAgentSessionMutation, $o as useAgentBackupRequestMutation, es as useAgentCodeServerStartMutation, ts as useAgentCodeServerStatusLazyQuery, ns as useAgentCodeServerStatusQuery, rs as useAgentCodeServerStatusSuspenseQuery, is as useAgentCodeServerStopMutation, as as useAgentCommandsLazyQuery, os as useAgentCommandsQuery, ss as useAgentCommandsSuspenseQuery, cs as useAgentConnectionConfigLazyQuery, ls as useAgentConnectionConfigQuery, us as useAgentConnectionConfigSuspenseQuery, ds as useAgentEditorOpenMutation, fs as useAgentHeartbeatMutation, ps as useAgentHeartbeatSubscriptionSubscription, ms as useAgentPlaygroundConfigLazyQuery, hs as useAgentPlaygroundConfigQuery, gs as useAgentPlaygroundConfigSuspenseQuery, _s as useAgentPluginsLazyQuery, vs as useAgentPluginsQuery, ys as useAgentPluginsSuspenseQuery, bs as useAgentSecretRevealLazyQuery, xs as useAgentSecretRevealQuery, Ss as useAgentSecretRevealSuspenseQuery, Cs as useAgentSecurityScanMutateMutation, ws as useAgentSecurityScanProxyLazyQuery, Ts as useAgentSecurityScanProxyQuery, Es as useAgentSecurityScanProxySuspenseQuery, Ds as useAgentSelfUpdateMutation, Os as useAgentSessionOrphansLazyQuery, ks as useAgentSessionOrphansQuery, As as useAgentSessionOrphansSuspenseQuery, js as useAgentStatusChangedSubscription, Ms as useAgentUpdateCheckLazyQuery, Ns as useAgentUpdateCheckNowMutation, Ps as useAgentUpdateCheckQuery, Fs as useAgentUpdateCheckSuspenseQuery, Is as useAgentUpdateStatusLazyQuery, Ls as useAgentUpdateStatusQuery, Rs as useAgentUpdateStatusSuspenseQuery, zs as useAllVibeLlmContextTokensLazyQuery, Bs as useAllVibeLlmContextTokensQuery, Vs as useAllVibeLlmContextTokensSuspenseQuery, Hs as useApplyScorecardTemplateMutation, Us as useArchiveVibeMutation, Jv as useAssistantStore, Ws as useAttachAgentToVibeMutation, Gs as useAttachTunnelDomainMutation, Ks as useAvailableNoteTagsLazyQuery, qs as useAvailableNoteTagsQuery, Js as useAvailableNoteTagsSuspenseQuery, Ys as useBulkDeleteVibeAuditLogsMutation, Xs as useBulkRestartSessionsMutation, Zs as useBulkSetConfigurationsMutation, Qs as useBulkStopSessionsMutation, $s as useBulkTerminateSessionsMutation, ec as useCatalogUpdatedSubscription, tc as useCheckAiCreditsMutation, nc as useCheckSessionHealthMutation, rc as useCollaboratorJoinedSubscription, ic as useCollaboratorLeftSubscription, ac as useCompileDocsSiteMutation, oc as useConfigurationChangedSubscription, sc as useConnectAgentToTargetMutation, cc as useCreateActionMutation, lc as useCreateAgentInstructionFileMutation, uc as useCreateAgentMessageBookmarkMutation, dc as useCreateAgentMutation, fc as useCreateAiContextMutation, pc as useCreateCatalogMutation, mc as useCreateComponentMutation, hc as useCreateDocsPageMutation, gc as useCreateDocsSiteMutation, _c as useCreateNoteMutation, vc as useCreateNoteTagMutation, yc as useCreateSandboxMutation, bc as useCreateSessionMutation, xc as useCreateSessionShareLinkMutation, Sc as useCreateTargetMutation, Cc as useCreateTunnelMutation, wc as useCreateVibeCalendarTaskMutation, Tc as useCreateVibeDeckButtonMutation, Ec as useCreateVibeDeckMutation, Dc as useCreateVibeDeckShareLinkMutation, Oc as useCreateVibeMutation, kc as useCreateWebhookMutation, Ac as useDeactivateAgentMutation, jc as useDeleteActionMutation, Mc as useDeleteAgentInstructionFileMutation, Nc as useDeleteAgentMessageBookmarkMutation, Pc as useDeleteAgentMutation, Fc as useDeleteAiContextMutation, Ic as useDeleteCatalogMutation, Lc as useDeleteComponentMutation, Rc as useDeleteConfigurationMutation, zc as useDeleteDeploymentMutation, Bc as useDeleteDocsPageMutation, Vc as useDeleteDocsSiteMutation, Hc as useDeleteNoteMutation, Uc as useDeleteSettingsSecretMutation, Wc as useDeleteTargetMutation, Gc as useDeleteTemplateMutation, Kc as useDeleteTunnelDomainMutation, qc as useDeleteTunnelMutation, Jc as useDeleteVibeAuditLogMutation, Yc as useDeleteVibeCalendarTaskMutation, Xc as useDeleteVibeDeckButtonMutation, Zc as useDeleteVibeDeckMutation, Qc as useDeleteVibeEnvVarMutation, $c as useDeleteVibeMutation, el as useDeleteWebhookMutation, tl as useDeployAgentViaMeshMutation, nl as useDetachAgentFromVibeMutation, rl as useDetachTunnelDomainMutation, il as useDisableDocsBuildImageMutation, al as useDisconnectAgentFromTargetMutation, ol as useDocsContentLazyQuery, sl as useDocsContentQuery, cl as useDocsContentSuspenseQuery, ll as useDuplicateActionMutation, ul as useDuplicateVibeDeckMutation, dl as useEntityTagPickerAvailableTagsLazyQuery, fl as useEntityTagPickerAvailableTagsQuery, pl as useEntityTagPickerAvailableTagsSuspenseQuery, ml as useEntityTagPickerCreateTagMutation, hl as useEntityTagPickerGetEntityTagsLazyQuery, gl as useEntityTagPickerGetEntityTagsQuery, _l as useEntityTagPickerGetEntityTagsSuspenseQuery, vl as useEntityTagPickerSearchTagsLazyQuery, yl as useEntityTagPickerSearchTagsQuery, bl as useEntityTagPickerSearchTagsSuspenseQuery, xl as useEntityTagPickerTagEntityMutation, Sl as useEntityTagPickerUntagEntityMutation, Cl as useExecuteActionMutation, wl as useExecuteAgentMeshRequestMutation, Tl as useExecuteScheduledJobNowMutation, El as useExecuteSharedVibeDeckButtonMutation, Dl as useExecuteVibeDeckButtonMutation, Ol as useExportSessionsMutation, kl as useExportVibeAuditLogsMutation, Al as useExtendSandboxTtlMutation, jl as useForkGitHubRepoMutation, Ml as useGenerateAgentGraphContextUrlMutation, Nl as useGenerateDocsSignedUrlMutation, Pl as useGenerateVibeLlmContextUrlMutation, Fl as useGetActionLazyQuery, Il as useGetActionQuery, Ll as useGetActionSuspenseQuery, Rl as useGetActiveSandboxesLazyQuery, zl as useGetActiveSandboxesQuery, Bl as useGetActiveSandboxesSuspenseQuery, Vl as useGetAgentConnectionEventsLazyQuery, Hl as useGetAgentConnectionEventsQuery, Ul as useGetAgentConnectionEventsSuspenseQuery, Wl as useGetAgentGraphLazyQuery, Gl as useGetAgentGraphQuery, Kl as useGetAgentGraphSuspenseQuery, ql as useGetAgentInstructionFileLazyQuery, Jl as useGetAgentInstructionFileQuery, Yl as useGetAgentInstructionFileSuspenseQuery, Xl as useGetAgentLazyQuery, Zl as useGetAgentMeshGraphLazyQuery, Ql as useGetAgentMeshGraphQuery, $l as useGetAgentMeshGraphSuspenseQuery, eu as useGetAgentQuery, tu as useGetAgentSuspenseQuery, nu as useGetAiContextLazyQuery, ru as useGetAiContextQuery, iu as useGetAiContextSuspenseQuery, au as useGetCatalogDependencyGraphLazyQuery, ou as useGetCatalogDependencyGraphQuery, su as useGetCatalogDependencyGraphSuspenseQuery, cu as useGetCatalogLazyQuery, lu as useGetCatalogQuery, uu as useGetCatalogSbomLazyQuery, du as useGetCatalogSbomQuery, fu as useGetCatalogSbomSuspenseQuery, pu as useGetCatalogSuspenseQuery, mu as useGetComponentDeploymentsLazyQuery, hu as useGetComponentDeploymentsQuery, gu as useGetComponentDeploymentsSuspenseQuery, _u as useGetComponentLazyQuery, vu as useGetComponentQuery, yu as useGetComponentSuspenseQuery, bu as useGetConfigurationLazyQuery, xu as useGetConfigurationQuery, Su as useGetConfigurationSuspenseQuery, Cu as useGetConfigurationValueLazyQuery, wu as useGetConfigurationValueQuery, Tu as useGetConfigurationValueSuspenseQuery, Eu as useGetDefaultVibeDeckLazyQuery, Du as useGetDefaultVibeDeckQuery, Ou as useGetDefaultVibeDeckSuspenseQuery, ku as useGetDocsRevisionLazyQuery, Au as useGetDocsRevisionQuery, ju as useGetDocsRevisionSuspenseQuery, Mu as useGetDocsSiteLazyQuery, Nu as useGetDocsSiteQuery, Pu as useGetDocsSiteSuspenseQuery, Fu as useGetEnvTopologyLazyQuery, Iu as useGetEnvTopologyQuery, Lu as useGetEnvTopologySuspenseQuery, Ru as useGetFileDownloadUrlLazyQuery, zu as useGetFileDownloadUrlQuery, Bu as useGetFileDownloadUrlSuspenseQuery, Vu as useGetInstallAgentJobStatusLazyQuery, Hu as useGetInstallAgentJobStatusQuery, Uu as useGetInstallAgentJobStatusSuspenseQuery, Wu as useGetNoteLazyQuery, Gu as useGetNoteQuery, Ku as useGetNoteSuspenseQuery, qu as useGetNoteTagsLazyQuery, Ju as useGetNoteTagsQuery, Yu as useGetNoteTagsSuspenseQuery, Xu as useGetRecentSandboxActivityLazyQuery, Zu as useGetRecentSandboxActivityQuery, Qu as useGetRecentSandboxActivitySuspenseQuery, $u as useGetSandboxLazyQuery, ed as useGetSandboxQuery, td as useGetSandboxStatsLazyQuery, nd as useGetSandboxStatsQuery, rd as useGetSandboxStatsSuspenseQuery, id as useGetSandboxSuspenseQuery, ad as useGetScheduledJobDetailLazyQuery, od as useGetScheduledJobDetailQuery, sd as useGetScheduledJobDetailSuspenseQuery, cd as useGetScheduledJobsForCalendarLazyQuery, ld as useGetScheduledJobsForCalendarQuery, ud as useGetScheduledJobsForCalendarSuspenseQuery, dd as useGetSchedulerMetricsForAnalyticsLazyQuery, fd as useGetSchedulerMetricsForAnalyticsQuery, pd as useGetSchedulerMetricsForAnalyticsSuspenseQuery, md as useGetScorecardLazyQuery, hd as useGetScorecardMetricHistoryLazyQuery, gd as useGetScorecardMetricHistoryQuery, _d as useGetScorecardMetricHistorySuspenseQuery, vd as useGetScorecardPushTokenInfoLazyQuery, yd as useGetScorecardPushTokenInfoQuery, bd as useGetScorecardPushTokenInfoSuspenseQuery, xd as useGetScorecardQuery, Sd as useGetScorecardSuspenseQuery, Cd as useGetScorecardTemplatesLazyQuery, wd as useGetScorecardTemplatesQuery, Td as useGetScorecardTemplatesSuspenseQuery, Ed as useGetScorecardsLazyQuery, Dd as useGetScorecardsQuery, Od as useGetScorecardsSuspenseQuery, kd as useGetSessionCollaboratorsLazyQuery, Ad as useGetSessionCollaboratorsQuery, jd as useGetSessionCollaboratorsSuspenseQuery, Md as useGetSessionConnectionEventsLazyQuery, Nd as useGetSessionConnectionEventsQuery, Pd as useGetSessionConnectionEventsSuspenseQuery, Fd as useGetSessionLazyQuery, Id as useGetSessionQuery, Ld as useGetSessionShareLinksLazyQuery, Rd as useGetSessionShareLinksQuery, zd as useGetSessionShareLinksSuspenseQuery, Bd as useGetSessionSharesLazyQuery, Vd as useGetSessionSharesQuery, Hd as useGetSessionSharesSuspenseQuery, Ud as useGetSessionSuspenseQuery, Wd as useGetSessionsSharedWithMeLazyQuery, Gd as useGetSessionsSharedWithMeQuery, Kd as useGetSessionsSharedWithMeSuspenseQuery, qd as useGetSharedVibeDeckLazyQuery, Jd as useGetSharedVibeDeckQuery, Yd as useGetSharedVibeDeckSuspenseQuery, Xd as useGetTargetLazyQuery, Zd as useGetTargetQuery, Qd as useGetTargetSuspenseQuery, $d as useGetTemplateLazyQuery, ef as useGetTemplateQuery, tf as useGetTemplateSuspenseQuery, nf as useGetTunnelAuditLazyQuery, rf as useGetTunnelAuditQuery, af as useGetTunnelAuditSuspenseQuery, of as useGetTunnelBySlugLazyQuery, sf as useGetTunnelBySlugQuery, cf as useGetTunnelBySlugSuspenseQuery, lf as useGetTunnelLazyQuery, uf as useGetTunnelQuery, df as useGetTunnelSuspenseQuery, ff as useGetTunnelUsageLazyQuery, pf as useGetTunnelUsageQuery, mf as useGetTunnelUsageSuspenseQuery, hf as useGetUiSessionLazyQuery, gf as useGetUiSessionQuery, _f as useGetUiSessionSuspenseQuery, vf as useGetVibeAuditLogLazyQuery, yf as useGetVibeAuditLogQuery, bf as useGetVibeAuditLogStatsLazyQuery, xf as useGetVibeAuditLogStatsQuery, Sf as useGetVibeAuditLogStatsSuspenseQuery, Cf as useGetVibeAuditLogSuspenseQuery, wf as useGetVibeCalendarTaskLazyQuery, Tf as useGetVibeCalendarTaskQuery, Ef as useGetVibeCalendarTaskSuspenseQuery, Df as useGetVibeCatalogsLazyQuery, Of as useGetVibeCatalogsQuery, kf as useGetVibeCatalogsSuspenseQuery, Af as useGetVibeDeckLazyQuery, jf as useGetVibeDeckQuery, Mf as useGetVibeDeckSuspenseQuery, Nf as useGetVibeDocsSiteLazyQuery, Pf as useGetVibeDocsSiteQuery, Ff as useGetVibeDocsSiteSuspenseQuery, If as useGetVibeEnvVarsLazyQuery, Lf as useGetVibeEnvVarsQuery, Rf as useGetVibeEnvVarsSuspenseQuery, zf as useGetVibeFeatureCatalogLazyQuery, Bf as useGetVibeFeatureCatalogQuery, Vf as useGetVibeFeatureCatalogSuspenseQuery, Hf as useGetVibeFeatureFlagsLazyQuery, Uf as useGetVibeFeatureFlagsQuery, Wf as useGetVibeFeatureFlagsSuspenseQuery, Gf as useGetVibeLazyQuery, Kf as useGetVibeLinkedEntitiesLazyQuery, qf as useGetVibeLinkedEntitiesQuery, Jf as useGetVibeLinkedEntitiesSuspenseQuery, Yf as useGetVibeLinkedSandboxesLazyQuery, Xf as useGetVibeLinkedSandboxesQuery, Zf as useGetVibeLinkedSandboxesSuspenseQuery, Qf as useGetVibeLinkedScheduledJobsLazyQuery, $f as useGetVibeLinkedScheduledJobsQuery, ep as useGetVibeLinkedScheduledJobsSuspenseQuery, tp as useGetVibeQuery, np as useGetVibeSuspenseQuery, rp as useGetWebhookLazyQuery, ip as useGetWebhookQuery, ap as useGetWebhookSuspenseQuery, op as useGetWorkspaceFilesLazyQuery, sp as useGetWorkspaceFilesQuery, cp as useGetWorkspaceFilesSuspenseQuery, lp as useImportTargetsFromConfigMutation, up as useInstallAgentOnTargetMutation, dp as useInstallAgentPluginMutation, fp as useInstantiateTemplateMutation, pp as useIssueTunnelSessionMutation, mp as useJoinSharedSessionMutation, hp as useLeaveSharedSessionMutation, gp as useLinkEntityToVibeMutation, _p as useListActionExecutionsLazyQuery, vp as useListActionExecutionsQuery, yp as useListActionExecutionsSuspenseQuery, bp as useListActionsLazyQuery, xp as useListActionsQuery, Sp as useListActionsSuspenseQuery, Cp as useListActiveConnectionsLazyQuery, wp as useListActiveConnectionsQuery, Tp as useListActiveConnectionsSuspenseQuery, Ep as useListActiveTunnelsWithSessionsLazyQuery, Dp as useListActiveTunnelsWithSessionsQuery, Op as useListActiveTunnelsWithSessionsSuspenseQuery, kp as useListAgentInstructionFilesLazyQuery, Ap as useListAgentInstructionFilesQuery, jp as useListAgentInstructionFilesSuspenseQuery, Mp as useListAgentProfilesLazyQuery, Np as useListAgentProfilesQuery, Pp as useListAgentProfilesSuspenseQuery, Fp as useListAgentsLazyQuery, Ip as useListAgentsQuery, Lp as useListAgentsSuspenseQuery, Rp as useListAiContextsLazyQuery, zp as useListAiContextsQuery, Bp as useListAiContextsSuspenseQuery, Vp as useListAiPromptsLazyQuery, Hp as useListAiPromptsQuery, Up as useListAiPromptsSuspenseQuery, Wp as useListAllComponentsForCatalogLazyQuery, Gp as useListAllComponentsForCatalogQuery, Kp as useListAllComponentsForCatalogSuspenseQuery, qp as useListCatalogsLazyQuery, Jp as useListCatalogsQuery, Yp as useListCatalogsSuspenseQuery, Xp as useListComponentsLazyQuery, Zp as useListComponentsQuery, Qp as useListComponentsSuspenseQuery, $p as useListConfigurationsLazyQuery, em as useListConfigurationsQuery, tm as useListConfigurationsSuspenseQuery, nm as useListDocsBuildImagesLazyQuery, rm as useListDocsBuildImagesQuery, im as useListDocsBuildImagesSuspenseQuery, am as useListNotesLazyQuery, om as useListNotesQuery, sm as useListNotesSuspenseQuery, cm as useListSessionsLazyQuery, lm as useListSessionsQuery, um as useListSessionsSuspenseQuery, dm as useListTargetsLazyQuery, fm as useListTargetsQuery, pm as useListTargetsSuspenseQuery, mm as useListTemplatesLazyQuery, hm as useListTemplatesQuery, gm as useListTemplatesSuspenseQuery, _m as useListTunnelDomainsLazyQuery, vm as useListTunnelDomainsQuery, ym as useListTunnelDomainsSuspenseQuery, bm as useListTunnelProvidersLazyQuery, xm as useListTunnelProvidersQuery, Sm as useListTunnelProvidersSuspenseQuery, Cm as useListTunnelSessionsLazyQuery, wm as useListTunnelSessionsQuery, Tm as useListTunnelSessionsSuspenseQuery, Em as useListTunnelsLazyQuery, Dm as useListTunnelsQuery, Om as useListTunnelsSuspenseQuery, km as useListVibeAuditLogsLazyQuery, Am as useListVibeAuditLogsQuery, jm as useListVibeAuditLogsSuspenseQuery, Mm as useListVibeCalendarExecutionsLazyQuery, Nm as useListVibeCalendarExecutionsQuery, Pm as useListVibeCalendarExecutionsSuspenseQuery, Fm as useListVibeCalendarTasksLazyQuery, Im as useListVibeCalendarTasksQuery, Lm as useListVibeCalendarTasksSuspenseQuery, Rm as useListVibeDeckButtonsLazyQuery, zm as useListVibeDeckButtonsQuery, Bm as useListVibeDeckButtonsSuspenseQuery, Vm as useListVibeDeckShareLinksLazyQuery, Hm as useListVibeDeckShareLinksQuery, Um as useListVibeDeckShareLinksSuspenseQuery, Wm as useListVibeDecksLazyQuery, Gm as useListVibeDecksQuery, Km as useListVibeDecksSuspenseQuery, qm as useListVibesLazyQuery, Jm as useListVibesQuery, Ym as useListVibesSuspenseQuery, Xm as useListWebhooksLazyQuery, Zm as useListWebhooksQuery, Qm as useListWebhooksSuspenseQuery, $m as useMeshDeployJobStatusLazyQuery, eh as useMeshDeployJobStatusQuery, th as useMeshDeployJobStatusSuspenseQuery, nh as useMintAgentCapabilityMutation, rh as useMoveVibeDeckButtonMutation, ih as useMoveVibeMutation, ah as useMyAgentMessageBookmarksLazyQuery, oh as useMyAgentMessageBookmarksQuery, sh as useMyAgentMessageBookmarksSuspenseQuery, ch as useMySettingsByCategoryLazyQuery, lh as useMySettingsByCategoryQuery, uh as useMySettingsByCategorySuspenseQuery, dh as useMySettingsLazyQuery, fh as useMySettingsQuery, ph as useMySettingsSuspenseQuery, mh as useMyVibeLlmContextPreviewLazyQuery, hh as useMyVibeLlmContextPreviewQuery, gh as useMyVibeLlmContextPreviewSuspenseQuery, _h as useMyVibeLlmContextSettingsLazyQuery, vh as useMyVibeLlmContextSettingsQuery, yh as useMyVibeLlmContextSettingsSuspenseQuery, bh as useMyVibeLlmContextTokenAuditsLazyQuery, xh as useMyVibeLlmContextTokenAuditsQuery, Sh as useMyVibeLlmContextTokenAuditsSuspenseQuery, Ch as useMyVibeLlmContextTokensLazyQuery, wh as useMyVibeLlmContextTokensQuery, Th as useMyVibeLlmContextTokensSuspenseQuery, Eh as useNukeVibecontrolsAgentMutation, Dh as useOnVibeAuditLogCreatedSubscription, Oh as useOverviewSummaryLazyQuery, kh as useOverviewSummaryQuery, Ah as useOverviewSummarySuspenseQuery, jh as usePinNoteMutation, Mh as usePinnedNotesLazyQuery, Nh as usePinnedNotesQuery, Ph as usePinnedNotesSuspenseQuery, Fh as useProbeAgentConnectionLazyQuery, Ih as useProbeAgentConnectionQuery, Lh as useProbeAgentConnectionSuspenseQuery, Rh as useProbeAgentTunnelLazyQuery, zh as useProbeAgentTunnelQuery, Bh as useProbeAgentTunnelSuspenseQuery, Vh as usePromoteDeploymentMutation, Hh as useProxySandboxRequestMutation, Uh as usePublishComponentAsTemplateMutation, Wh as usePushAgentGatewayAuthMutation, Gh as useRecentAiToolEventsStreamSubscription, Kh as useRegisterCustomTunnelDomainMutation, qh as useRegisterDeploymentMutation, Jh as useRegisterDocsBuildImageMutation, Yh as useRegisterInstalledAgentMutation, Xh as useReleaseSessionControlMutation, Zh as useRemoveAgentPluginMutation, Qh as useRemoveComponentFromCatalogMutation, $h as useRemoveScorecardMetricMutation, eg as useRemoveVibeFromCatalogMutation, tg as useRenderAiPromptMutation, ng as useReorderVibeDeckButtonsMutation, rg as useReplaceNoteTagsMutation, ig as useReportAiTokenUsageMutation, ag as useRequestSessionControlMutation, og as useReserveTunnelSubdomainMutation, sg as useResetSettingsMutation, cg as useResetWebhookFailuresMutation, lg as useRestartSessionMutation, ug as useRestartSessionTerminalMutation, dg as useRestoreVibeMutation, fg as useRevokeAgentMeshLinkMutation, pg as useRevokeAllMyVibeLlmContextTokensMutation, mg as useRevokeSessionShareLinkMutation, hg as useRevokeSessionShareMutation, gg as useRevokeTunnelPublicAccessMutation, _g as useRevokeTunnelSessionMutation, vg as useRevokeVibeDeckShareLinkMutation, yg as useRevokeVibeLlmContextTokenMutation, bg as useRollbackDocsRevisionMutation, xg as useRotateScorecardPushTokenMutation, Sg as useRotateTunnelCredentialsMutation, Cg as useRotateVibeLlmContextUrlMutation, wg as useRunAgentCommandMutation, Xv as useSandboxAssistantTransport, Tg as useSaveUiSessionMutation, Eg as useScanSshConfigMutation, Dg as useSearchNotesLazyQuery, Og as useSearchNotesQuery, kg as useSearchNotesSuspenseQuery, Ag as useSendSessionInputMutation, jg as useSessionControlChangedSubscription, Mg as useSessionHistoryRecordingEnabledLazyQuery, Ng as useSessionHistoryRecordingEnabledQuery, Pg as useSessionHistoryRecordingEnabledSuspenseQuery, Fg as useSessionOutputReceivedSubscription, Ig as useSessionSharedWithMeSubscription, Lg as useSessionStatusChangedSubscription, Rg as useSetAgentApiKeyMutation, zg as useSetAgentAutoUpdateMutation, Bg as useSetAgentPlaygroundConfigMutation, Vg as useSetConfigurationMutation, Hg as useSetDefaultVibeDeckMutation, Ug as useSetMyVibeLlmContextSettingsMutation, Wg as useSetSettingsSecretMutation, Gg as useSetTunnelPublicAccessMutation, Kg as useSetVibeEnvVarMutation, qg as useSetVibeFeatureFlagMutation, Jg as useSettingsPageDataLazyQuery, Yg as useSettingsPageDataQuery, Xg as useSettingsPageDataSuspenseQuery, Zg as useSetupAgentGatewayAuthMutation, Qg as useShareNoteMutation, $g as useShareSessionMutation, e_ as useSharedSessionOutputSubscription, t_ as useStartMeshAgentSessionMutation, n_ as useStartSessionMutation, r_ as useStartSessionTerminalMutation, i_ as useStartTerminalMutation, a_ as useStartTunnelMutation, o_ as useStartVibecontrolsAgentMutation, s_ as useStopSessionMutation, c_ as useStopSessionTerminalMutation, l_ as useStopTerminalMutation, u_ as useStopTunnelMutation, d_ as useStopVibecontrolsAgentMutation, f_ as useTagNoteMutation, p_ as useTerminateSessionMutation, m_ as useTestTargetMutation, h_ as useTestWebhookMutation, g_ as useTransferSessionControlMutation, __ as useTriggerVibeCalendarTaskNowMutation, v_ as useTriggerWebhookMutation, y_ as useUninstallAgentFromTargetMutation, b_ as useUnlinkEntityFromVibeMutation, x_ as useUnpinNoteMutation, S_ as useUntagNoteMutation, C_ as useUpdateActionMutation, w_ as useUpdateAgentInstructionFileMutation, T_ as useUpdateAgentMessageBookmarkMutation, E_ as useUpdateAgentMutation, D_ as useUpdateAgentOwnershipMutation, O_ as useUpdateAgentPluginMutation, k_ as useUpdateAgentTunnelUrlMutation, A_ as useUpdateAgentVersionMutation, j_ as useUpdateAiContextMutation, M_ as useUpdateCatalogMutation, N_ as useUpdateComponentMutation, P_ as useUpdateConnectionPermissionsMutation, F_ as useUpdateDocsPageMutation, I_ as useUpdateDocsSiteMutation, L_ as useUpdateDocsSiteRuntimeMutation, R_ as useUpdateDocsSiteVisibilityMutation, z_ as useUpdateEntityVisibilityMutation, B_ as useUpdateMeshLinkPermissionsMutation, V_ as useUpdateNoteMutation, H_ as useUpdateNotificationPreferencesMutation, U_ as useUpdatePreferencesMutation, W_ as useUpdateProfileMutation, G_ as useUpdateScorecardMetricMutation, K_ as useUpdateSessionMutation, q_ as useUpdateSessionShareMutation, J_ as useUpdateTargetMutation, Y_ as useUpdateTemplateMutation, X_ as useUpdateTunnelMutation, Z_ as useUpdateVibeCalendarTaskMutation, Q_ as useUpdateVibeDeckButtonMutation, $_ as useUpdateVibeDeckMutation, ev as useUpdateVibeDeckShareLinkMutation, tv as useUpdateVibeGitMutation, nv as useUpdateVibeMutation, rv as useUpdateVibeStatusMutation, iv as useUpdateWebhookMutation, av as useUpdateWorkspaceDefaultsMutation, ov as useUpsertScorecardMutation, sv as useValidateDocsBuildImageMutation, cv as useValidateShareLinkLazyQuery, lv as useValidateShareLinkQuery, uv as useValidateShareLinkSuspenseQuery, dv as useValidateVibeDeckShareLinkLazyQuery, fv as useValidateVibeDeckShareLinkQuery, pv as useValidateVibeDeckShareLinkSuspenseQuery, mv as useVerifyTunnelDomainMutation, hv as useVibeAuditDashboardLazyQuery, gv as useVibeAuditDashboardQuery, _v as useVibeAuditDashboardSuspenseQuery, Hv as useVibeControls, vv as useVibeControlsInitialDataLazyQuery, yv as useVibeControlsInitialDataQuery, bv as useVibeControlsInitialDataSuspenseQuery, Uv as useVibeControlsStore, xv as useVibeLlmContextTokenAuditsLazyQuery, Sv as useVibeLlmContextTokenAuditsQuery, Cv as useVibeLlmContextTokenAuditsSuspenseQuery, wv as useVibeStatusChangedSubscription, Tv as useVibeUpdatedSubscription, Ev as useVibecontrolsAgentHealthProbeStreamSubscription, Dv as useVibecontrolsAgentHealthProbesLazyQuery, Ov as useVibecontrolsAgentHealthProbesQuery, kv as useVibecontrolsAgentHealthProbesSuspenseQuery, Av as useVibecontrolsAgentLogStreamSubscription, jv as useVibecontrolsAgentPluginStreamSubscription, Mv as useVibecontrolsAnalyticsLazyQuery, Nv as useVibecontrolsAnalyticsQuery, Pv as useVibecontrolsAnalyticsSuspenseQuery, Fv as useWakeMeshAgentMutation, Iv as useWebhooksByEventLazyQuery, Lv as useWebhooksByEventQuery, Rv as useWebhooksByEventSuspenseQuery, zv as useWorkspaceTunnelAuditLazyQuery, Bv as useWorkspaceTunnelAuditQuery, Vv as useWorkspaceTunnelAuditSuspenseQuery, Zv as vibeControlsPlugin };
|
|
@@ -6,11 +6,12 @@ function p(e) {
|
|
|
6
6
|
switch (e) {
|
|
7
7
|
case "general": return l;
|
|
8
8
|
case "vibe-plugins": return u;
|
|
9
|
+
case "assistant":
|
|
9
10
|
case "api-calls": return d;
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
function m(e) {
|
|
13
|
-
return `${c}/wspace/ai-assistant-${e
|
|
14
|
+
return `${c}/wspace/ai-assistant-${e === "assistant" ? "api-calls" : e}:${p(e)}`;
|
|
14
15
|
}
|
|
15
16
|
function h(e) {
|
|
16
17
|
switch (e) {
|
|
@@ -26,6 +27,7 @@ function h(e) {
|
|
|
26
27
|
memoryRequest: "384Mi",
|
|
27
28
|
memoryLimit: "1536Mi"
|
|
28
29
|
};
|
|
30
|
+
case "assistant":
|
|
29
31
|
case "api-calls": return {
|
|
30
32
|
cpuRequest: "150m",
|
|
31
33
|
cpuLimit: "750m",
|
|
@@ -36,9 +38,9 @@ function h(e) {
|
|
|
36
38
|
}
|
|
37
39
|
function g(e) {
|
|
38
40
|
let t = e.metadata?.assistantMode;
|
|
39
|
-
if (t === "general" || t === "api-calls" || t === "vibe-plugins") return t;
|
|
41
|
+
if (t === "assistant" || t === "general" || t === "api-calls" || t === "vibe-plugins") return t;
|
|
40
42
|
let n = e.name ?? "";
|
|
41
|
-
return n.startsWith("ai-assistant-vibe-plugins-") ? "vibe-plugins" : n.startsWith("ai-assistant-api-calls-") ? "api-calls" : n.startsWith("ai-assistant-general-") ? "general" : null;
|
|
43
|
+
return n.startsWith("ai-assistant-vibe-plugins-") ? "vibe-plugins" : n.startsWith("ai-assistant-api-calls-") ? "api-calls" : n.startsWith("ai-assistant-general-") ? "general" : n.startsWith("ai-assistant-assistant-") ? "assistant" : null;
|
|
42
44
|
}
|
|
43
45
|
function _(e, t) {
|
|
44
46
|
let n = {};
|
|
@@ -92,6 +94,10 @@ async function x(e, n, r, i) {
|
|
|
92
94
|
{
|
|
93
95
|
name: "WORKSPACE_ID",
|
|
94
96
|
value: r
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "AI_ASSISTANT_PRODUCT",
|
|
100
|
+
value: "vibecontrols"
|
|
95
101
|
}
|
|
96
102
|
], s = await y({
|
|
97
103
|
document: t,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistantApi.js","names":[],"sources":["../../src/services/assistantApi.ts"],"sourcesContent":["/**\n * AI Assistant API service.\n *\n * All requests go through the wspace-public-gateway (GraphQL Federation):\n * Frontend → wspace-public-gateway → wspace-sandbox-svc → ai-assistant (K8s pod)\n *\n * Uses the host app's Apollo Client which already points to the gateway.\n */\n\nimport { type ApolloClient } from '@apollo/client';\nimport { print, type DocumentNode } from 'graphql';\nimport type { AssistantArtifact, AssistantMode } from '@/types/assistant';\nimport type { PageContext } from '@/utils/pageContext';\nimport {\n CreateSandboxDocument,\n GetSandboxDocument,\n GetActiveSandboxesDocument,\n ProxySandboxRequestDocument,\n ExtendSandboxTtlDocument,\n CheckAiCreditsDocument,\n ReportAiTokenUsageDocument,\n} from '@/generated/wspace-operations';\n\n// ── Image registry ─────────────────────────────────────────────────\n\nconst HARBOR_REGISTRY = 'burdenoffregistry.azurecr.io';\nconst DEFAULT_IMAGE_TAG = import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha';\nconst GENERAL_IMAGE_TAG = import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha-proxy-auth-v1';\nconst VIBE_PLUGINS_IMAGE_TAG =\n import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha-proxy-auth-v1';\nconst API_CALLS_IMAGE_TAG =\n import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha-delegated-auth-v11';\nconst ASSISTANT_API_AUTH_STRATEGY = 'sandbox-app-client-headers-v1';\n\nfunction getImageTagForMode(mode: AssistantMode): string {\n switch (mode) {\n case 'general':\n return GENERAL_IMAGE_TAG;\n case 'vibe-plugins':\n return VIBE_PLUGINS_IMAGE_TAG;\n case 'api-calls':\n return API_CALLS_IMAGE_TAG;\n }\n}\n\nfunction getImageForMode(mode: AssistantMode): string {\n const imageTag =\n mode === 'api-calls'\n ? API_CALLS_IMAGE_TAG\n : mode === 'general'\n ? GENERAL_IMAGE_TAG\n : VIBE_PLUGINS_IMAGE_TAG;\n return `${HARBOR_REGISTRY}/wspace/ai-assistant-${mode}:${imageTag}`;\n}\n\nfunction getResourcesForMode(mode: AssistantMode): {\n cpuRequest: string;\n cpuLimit: string;\n memoryRequest: string;\n memoryLimit: string;\n} {\n switch (mode) {\n case 'general':\n return {\n cpuRequest: '100m',\n cpuLimit: '500m',\n memoryRequest: '256Mi',\n memoryLimit: '1Gi',\n };\n case 'vibe-plugins':\n return {\n cpuRequest: '150m',\n cpuLimit: '750m',\n memoryRequest: '384Mi',\n memoryLimit: '1536Mi',\n };\n case 'api-calls':\n return {\n cpuRequest: '150m',\n cpuLimit: '750m',\n memoryRequest: '384Mi',\n memoryLimit: '1536Mi',\n };\n }\n}\n\nfunction resolveSandboxAssistantMode(sandbox: {\n metadata: Record<string, unknown> | null;\n name?: string | null;\n}): AssistantMode | null {\n const metadataMode = sandbox.metadata?.assistantMode;\n if (\n metadataMode === 'general' ||\n metadataMode === 'api-calls' ||\n metadataMode === 'vibe-plugins'\n ) {\n return metadataMode;\n }\n\n const name = sandbox.name ?? '';\n if (name.startsWith('ai-assistant-vibe-plugins-')) return 'vibe-plugins';\n if (name.startsWith('ai-assistant-api-calls-')) return 'api-calls';\n if (name.startsWith('ai-assistant-general-')) return 'general';\n return null;\n}\n\n// ── GraphQL operations (colocated .graphql → generated DocumentNodes) ──\n\n// ── Types ───────────────────────────────────────────────────────────\n\nexport interface AssistantPromptResult {\n response: string;\n tokens?: { input: number; output: number };\n artifacts?: AssistantArtifact[];\n}\n\nexport interface AssistantRawMessagePart {\n type?: string;\n text?: string;\n tool?: string;\n state?: {\n status?: string;\n input?: unknown;\n output?: unknown;\n raw?: unknown;\n };\n}\n\nexport interface AssistantRawMessage {\n info?: {\n id?: string;\n role?: string;\n providerID?: string;\n modelID?: string;\n tokens?: { input: number; output: number };\n time?: {\n created?: number;\n completed?: number;\n };\n };\n parts?: AssistantRawMessagePart[];\n}\n\nexport interface AssistantSandboxAuthContext {\n accessToken?: string | null;\n workspaceToken?: string | null;\n userId?: string | null;\n organizationId?: string | null;\n}\n\nexport interface AssistantSessionInfo {\n id: string;\n mode: string;\n}\n\ninterface GraphQLResponse<TData> {\n data?: TData;\n errors?: Array<{ message: string }>;\n}\n\nexport interface DownloadedAssistantArtifact {\n filename: string;\n mimeType: string;\n contentBase64: string;\n}\n\ninterface ProxyResponse {\n proxySandboxRequest: {\n status: number;\n body: Record<string, unknown>;\n };\n}\n\nfunction getGatewayRequestContext(\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): { headers?: Record<string, string> } | undefined {\n const headers: Record<string, string> = {};\n\n if (authContext?.accessToken) {\n headers.authorization = `Bearer ${authContext.accessToken}`;\n }\n\n if (authContext?.workspaceToken) {\n headers['x-workspace-authorization'] = `Bearer ${authContext.workspaceToken}`;\n }\n\n if (workspaceId) {\n headers['x-workspace-id'] = workspaceId;\n }\n\n if (authContext?.userId) {\n headers['x-actor-id'] = authContext.userId;\n headers['x-actor-type'] = 'user';\n }\n\n if (authContext?.organizationId) {\n headers['x-org-id'] = authContext.organizationId;\n }\n\n return Object.keys(headers).length > 0 ? { headers } : undefined;\n}\n\nfunction buildSandboxContextInput(\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): Record<string, unknown> {\n return {\n workspaceId,\n ...(authContext?.organizationId\n ? {\n custom: {\n organizationId: authContext.organizationId,\n },\n }\n : {}),\n };\n}\n\nasync function executeSandboxGraphQL<TData>(params: {\n document: DocumentNode;\n variables: Record<string, unknown>;\n workspaceId: string;\n authContext?: AssistantSandboxAuthContext;\n}): Promise<TData> {\n const response = await fetch('/workspaces/graphql', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(getGatewayRequestContext(params.workspaceId, params.authContext)?.headers ?? {}),\n },\n body: JSON.stringify({\n query: print(params.document),\n variables: params.variables,\n }),\n });\n\n const result = (await response.json().catch(() => null)) as GraphQLResponse<TData> | null;\n\n if (!response.ok) {\n // Preserve the HTTP status and parsed body so quota detection works.\n // The wspace public gateway returns 429 + errors[].extensions.code =\n // QUOTA_EXHAUSTED for @usage limits (createSandbox, checkAiCredits, …);\n // a bare `HTTP 429` Error would be invisible to isQuotaExhaustedError.\n const messages = result?.errors?.map((error: { message: string }) => error.message).join(', ');\n const httpError = new Error(messages || `Sandbox GraphQL HTTP ${response.status}`) as Error & {\n statusCode?: number;\n result?: unknown;\n };\n httpError.statusCode = response.status;\n httpError.result = result ?? undefined;\n throw httpError;\n }\n\n if (!result) {\n throw new Error('Sandbox GraphQL returned empty response');\n }\n\n if (result.errors?.length) {\n throw new Error(result.errors.map((error: { message: string }) => error.message).join(', '));\n }\n\n if (!result.data) {\n throw new Error('Sandbox GraphQL returned no data');\n }\n\n return result.data;\n}\n\n// ── Find existing sandbox for a mode ───────────────────────────────\n\nexport async function findExistingSandbox(\n _apollo: ApolloClient,\n workspaceId: string,\n mode: AssistantMode,\n authContext?: AssistantSandboxAuthContext\n): Promise<string | null> {\n const data = await executeSandboxGraphQL<{\n getActiveSandboxes: Array<{\n id: string;\n name: string;\n status: string;\n metadata: Record<string, unknown> | null;\n template: string;\n createdBy: string;\n }>;\n }>({\n document: GetActiveSandboxesDocument,\n variables: { context: buildSandboxContextInput(workspaceId, authContext) },\n workspaceId,\n authContext,\n });\n const sandboxes = data.getActiveSandboxes ?? [];\n\n return (\n sandboxes.find(\n (s) =>\n (s.status === 'RUNNING' || s.status === 'PROVISIONING' || s.status === 'PENDING') &&\n s.template === 'AI_BUILDER' &&\n resolveSandboxAssistantMode(s) === mode &&\n (!authContext?.userId || s.createdBy === authContext.userId) &&\n s.metadata?.authStrategy === ASSISTANT_API_AUTH_STRATEGY &&\n s.metadata?.imageTag === getImageTagForMode(mode)\n )?.id ?? null\n );\n}\n\n// ── Sandbox lifecycle ──────────────────────────────────────────────\n\nexport async function createAssistantSandbox(\n _apollo: ApolloClient,\n mode: AssistantMode,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<string> {\n const resources = getResourcesForMode(mode);\n const env = [\n { name: 'AI_ASSISTANT_MODE', value: mode },\n { name: 'HOSTNAME', value: '0.0.0.0' },\n { name: 'WORKSPACE_ID', value: workspaceId },\n ];\n\n const data = await executeSandboxGraphQL<{ createSandbox: { id: string } }>({\n document: CreateSandboxDocument,\n variables: {\n input: {\n name: `ai-assistant-${mode}-${Date.now()}`,\n description: `AI Assistant sandbox (${mode} mode)`,\n template: 'AI_BUILDER',\n mode: 'DEPLOYMENT',\n containers: [\n {\n name: 'ai-assistant',\n image: getImageForMode(mode),\n ports: [{ containerPort: 80, name: 'http' }],\n env,\n },\n ],\n resources: {\n cpuRequest: resources.cpuRequest,\n cpuLimit: resources.cpuLimit,\n memoryRequest: resources.memoryRequest,\n memoryLimit: resources.memoryLimit,\n },\n ttlSeconds: 600,\n metadata: {\n assistantMode: mode,\n assistantOwnerUserId: authContext?.userId ?? null,\n assistantOrganizationId: authContext?.organizationId ?? null,\n authStrategy: ASSISTANT_API_AUTH_STRATEGY,\n imageTag: getImageTagForMode(mode),\n },\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n },\n workspaceId,\n authContext,\n });\n\n if (!data?.createSandbox?.id) {\n throw new Error('createSandbox returned empty response');\n }\n return data.createSandbox.id;\n}\n\nexport async function waitForSandboxReady(\n _apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext,\n maxWaitMs = 300_000,\n onProgress?: (message: string) => void\n): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < maxWaitMs) {\n const data = await executeSandboxGraphQL<{\n getSandbox: { status?: string; errorMessage?: string } | null;\n }>({\n document: GetSandboxDocument,\n variables: { id: sandboxId, context: buildSandboxContextInput(workspaceId, authContext) },\n workspaceId,\n authContext,\n });\n const status = data?.getSandbox?.status;\n const errorMessage = data?.getSandbox?.errorMessage as string | undefined;\n if (status === 'RUNNING') return;\n if (status === 'FAILED' || status === 'STOPPED' || status === 'EXPIRED') {\n throw new Error(\n errorMessage\n ? `Sandbox ${status.toLowerCase()}: ${errorMessage}`\n : `Sandbox ${status.toLowerCase()}`\n );\n }\n const elapsedSeconds = Math.max(1, Math.round((Date.now() - start) / 1000));\n onProgress?.(`Starting assistant environment... (${elapsedSeconds}s)`);\n await new Promise((r) => setTimeout(r, 2000));\n }\n throw new Error('Sandbox startup timed out');\n}\n\n// ── Proxy calls to ai-assistant (via gateway → sandbox-svc) ───────\n\nasync function proxyToSandbox(\n _apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n path: string,\n method: string,\n body?: unknown,\n authContext?: AssistantSandboxAuthContext\n): Promise<Record<string, unknown>> {\n const result = await executeSandboxGraphQL<ProxyResponse>({\n document: ProxySandboxRequestDocument,\n variables: {\n input: {\n sandboxId,\n path,\n method,\n body,\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n },\n workspaceId,\n authContext,\n });\n\n const proxyResult = result.proxySandboxRequest;\n if (!proxyResult || proxyResult.status >= 400) {\n const errBody = proxyResult?.body as Record<string, unknown> | undefined;\n throw new Error(\n (errBody?.error as string) ?? `Proxy error: ${proxyResult?.status ?? 'unknown'}`\n );\n }\n\n return proxyResult.body;\n}\n\nexport async function waitForAssistantServiceReady(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext,\n maxWaitMs = 90_000,\n onProgress?: (message: string) => void\n): Promise<void> {\n const startedAt = Date.now();\n\n while (Date.now() - startedAt < maxWaitMs) {\n try {\n await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n '/health',\n 'GET',\n undefined,\n authContext\n );\n return;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n !/proxy error: 502|proxy error: 503|proxy error: 404|service not available/i.test(message)\n ) {\n throw error;\n }\n }\n\n const elapsedSeconds = Math.max(1, Math.round((Date.now() - startedAt) / 1000));\n onProgress?.(`Connecting to assistant... (${elapsedSeconds}s)`);\n\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n throw new Error('Assistant service did not become healthy before timeout');\n}\n\n// ── Session management ─────────────────────────────────────────────\n\nexport async function createAssistantSession(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n mode: AssistantMode,\n authContext?: AssistantSandboxAuthContext\n): Promise<{ sessionId: string }> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n '/sessions',\n 'POST',\n { mode },\n authContext\n );\n const session = body.session as Record<string, unknown>;\n return { sessionId: session.id as string };\n}\n\nexport async function getAssistantSession(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<AssistantSessionInfo> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}`,\n 'GET',\n undefined,\n authContext\n );\n const session = body.session as Record<string, unknown> | undefined;\n\n return {\n id: (session?.id as string | undefined) ?? sessionId,\n mode: (body.mode as string | undefined) ?? 'unknown',\n };\n}\n\n// ── Send prompt ────────────────────────────────────────────────────\n\nexport async function sendAssistantPrompt(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n prompt: string,\n mode: AssistantMode,\n pageContext?: PageContext,\n authContext?: AssistantSandboxAuthContext\n): Promise<AssistantPromptResult> {\n const requestBody = {\n mode,\n prompt,\n pageContext: pageContext\n ? {\n activeUrl: pageContext.activeUrl,\n currentPage: pageContext.currentPage,\n platform: pageContext.platform,\n version: pageContext.version,\n viewportSize: pageContext.viewportSize,\n }\n : undefined,\n };\n\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/prompt`,\n 'POST',\n requestBody,\n authContext\n );\n\n const message = body.message as Record<string, unknown> | undefined;\n const tokens = message?.tokens as { input: number; output: number } | undefined;\n\n return { response: body.text as string, tokens };\n}\n\nexport async function sendAssistantPromptAsync(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n prompt: string,\n mode: AssistantMode,\n pageContext?: PageContext,\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n const requestBody = {\n mode,\n prompt,\n pageContext: pageContext ?? undefined,\n };\n\n await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/prompt-async`,\n 'POST',\n requestBody,\n authContext\n );\n}\n\nexport async function getAssistantMessages(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext,\n limit = 50\n): Promise<AssistantRawMessage[]> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/messages?limit=${limit}`,\n 'GET',\n undefined,\n authContext\n );\n\n return (body.messages as AssistantRawMessage[] | undefined) ?? [];\n}\n\n// ── AI credits (per-token metering) ────────────────────────────────\n\n/**\n * Pre-flight AI-credit gate. Resolves to `true` when the caller still has\n * AI-credit budget; throws a quota error (HTTP 429 / QUOTA_EXHAUSTED, from\n * the wspace gateway's @usage check) when the monthly token budget is\n * depleted. Detect the rejection with `isQuotaExhaustedError()`.\n */\nexport async function checkAssistantAiCredits(\n _apollo: ApolloClient,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<boolean> {\n const data = await executeSandboxGraphQL<{ checkAiCredits: boolean }>({\n document: CheckAiCreditsDocument,\n variables: {},\n workspaceId,\n authContext,\n });\n return data.checkAiCredits;\n}\n\n/**\n * Post-turn charge. Reports the turn's raw input/output token counts + the\n * model so the svc computes COST-WEIGHTED credits server-side and charges them\n * against `vibecontrols.ai.credits` (the amount is never sent from the client).\n * `messageId` makes the charge idempotent (retries don't double-charge).\n * No-ops when there are no tokens, or when the model is unknown (the charge\n * requires it). Best-effort — callers must not block the displayed answer on it.\n */\nexport async function reportAssistantAiTokenUsage(\n _apollo: ApolloClient,\n workspaceId: string,\n sessionId: string,\n messageId: string,\n model: string | undefined,\n tokens: { input: number; output: number },\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n const inputTokens = Math.max(0, Math.round(tokens.input ?? 0));\n const outputTokens = Math.max(0, Math.round(tokens.output ?? 0));\n if (inputTokens + outputTokens === 0) return;\n // The svc requires a model to price the charge; skip rather than send a turn\n // that can't be priced (the meter under-counts that turn — acceptable).\n if (!model) return;\n\n await executeSandboxGraphQL<{ reportAiTokenUsage: boolean }>({\n document: ReportAiTokenUsageDocument,\n variables: {\n input: { sessionId, messageId, model, inputTokens, outputTokens },\n },\n workspaceId,\n authContext,\n });\n}\n\nexport async function getAssistantArtifacts(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<AssistantArtifact[]> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/artifacts`,\n 'GET',\n undefined,\n authContext\n );\n\n return ((body.artifacts as AssistantArtifact[] | undefined) ?? []).filter(\n (artifact) => !artifact.name.startsWith('.')\n );\n}\n\nexport async function downloadAssistantArtifact(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n artifactPath: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<DownloadedAssistantArtifact> {\n const encodedPath = encodeURIComponent(artifactPath);\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/artifacts/download?path=${encodedPath}`,\n 'GET',\n undefined,\n authContext\n );\n\n const artifact = body.artifact as Record<string, unknown> | undefined;\n if (!artifact) {\n throw new Error('Artifact download returned an empty response');\n }\n\n return {\n filename: artifact.filename as string,\n mimeType: artifact.mimeType as string,\n contentBase64: artifact.contentBase64 as string,\n };\n}\n\n// ── Heartbeat ───────────────────────────────────────────────────────\n\nexport async function sendHeartbeat(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/heartbeat`,\n 'POST',\n undefined,\n authContext\n );\n}\n\nexport async function extendAssistantSandboxTTL(\n _apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n additionalSeconds = 600,\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n await executeSandboxGraphQL<{ extendSandboxTTL: { id: string } }>({\n document: ExtendSandboxTtlDocument,\n variables: {\n id: sandboxId,\n additionalSeconds,\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n workspaceId,\n authContext,\n });\n}\n"],"mappings":";;;AAyBA,IAAM,IAAkB,gCAElB,IAAuE,uBACvE,IAC+C,uBAC/C,IAC+C,4BAC/C,IAA8B;AAEpC,SAAS,EAAmB,GAA6B;AACvD,SAAQ,GAAR;EACE,KAAK,UACH,QAAO;EACT,KAAK,eACH,QAAO;EACT,KAAK,YACH,QAAO;;;AAIb,SAAS,EAAgB,GAA6B;AAOpD,QAAO,GAAG,EAAgB,uBAAuB,EAAK,GALpD,MAAS,cACL,IACA,MAAS,YACP,IACA;;AAIV,SAAS,EAAoB,GAK3B;AACA,SAAQ,GAAR;EACE,KAAK,UACH,QAAO;GACL,YAAY;GACZ,UAAU;GACV,eAAe;GACf,aAAa;GACd;EACH,KAAK,eACH,QAAO;GACL,YAAY;GACZ,UAAU;GACV,eAAe;GACf,aAAa;GACd;EACH,KAAK,YACH,QAAO;GACL,YAAY;GACZ,UAAU;GACV,eAAe;GACf,aAAa;GACd;;;AAIP,SAAS,EAA4B,GAGZ;CACvB,IAAM,IAAe,EAAQ,UAAU;AACvC,KACE,MAAiB,aACjB,MAAiB,eACjB,MAAiB,eAEjB,QAAO;CAGT,IAAM,IAAO,EAAQ,QAAQ;AAI7B,QAHI,EAAK,WAAW,6BAA6B,GAAS,iBACtD,EAAK,WAAW,0BAA0B,GAAS,cACnD,EAAK,WAAW,wBAAwB,GAAS,YAC9C;;AAsET,SAAS,EACP,GACA,GACkD;CAClD,IAAM,IAAkC,EAAE;AAuB1C,QArBI,GAAa,gBACf,EAAQ,gBAAgB,UAAU,EAAY,gBAG5C,GAAa,mBACf,EAAQ,+BAA+B,UAAU,EAAY,mBAG3D,MACF,EAAQ,oBAAoB,IAG1B,GAAa,WACf,EAAQ,gBAAgB,EAAY,QACpC,EAAQ,kBAAkB,SAGxB,GAAa,mBACf,EAAQ,cAAc,EAAY,iBAG7B,OAAO,KAAK,EAAQ,CAAC,SAAS,IAAI,EAAE,YAAS,GAAG,KAAA;;AAGzD,SAAS,EACP,GACA,GACyB;AACzB,QAAO;EACL;EACA,GAAI,GAAa,iBACb,EACE,QAAQ,EACN,gBAAgB,EAAY,gBAC7B,EACF,GACD,EAAE;EACP;;AAGH,eAAe,EAA6B,GAKzB;CACjB,IAAM,IAAW,MAAM,MAAM,uBAAuB;EAClD,QAAQ;EACR,SAAS;GACP,gBAAgB;GAChB,GAAI,EAAyB,EAAO,aAAa,EAAO,YAAY,EAAE,WAAW,EAAE;GACpF;EACD,MAAM,KAAK,UAAU;GACnB,OAAO,EAAM,EAAO,SAAS;GAC7B,WAAW,EAAO;GACnB,CAAC;EACH,CAAC,EAEI,IAAU,MAAM,EAAS,MAAM,CAAC,YAAY,KAAK;AAEvD,KAAI,CAAC,EAAS,IAAI;EAKhB,IAAM,IAAW,GAAQ,QAAQ,KAAK,MAA+B,EAAM,QAAQ,CAAC,KAAK,KAAK,EACxF,IAAgB,MAAM,KAAY,wBAAwB,EAAS,SAAS;AAMlF,QAFA,EAAU,aAAa,EAAS,QAChC,EAAU,SAAS,KAAU,KAAA,GACvB;;AAGR,KAAI,CAAC,EACH,OAAU,MAAM,0CAA0C;AAG5D,KAAI,EAAO,QAAQ,OACjB,OAAU,MAAM,EAAO,OAAO,KAAK,MAA+B,EAAM,QAAQ,CAAC,KAAK,KAAK,CAAC;AAG9F,KAAI,CAAC,EAAO,KACV,OAAU,MAAM,mCAAmC;AAGrD,QAAO,EAAO;;AAKhB,eAAsB,EACpB,GACA,GACA,GACA,GACwB;AAkBxB,UAjBa,MAAM,EAShB;EACD,UAAU;EACV,WAAW,EAAE,SAAS,EAAyB,GAAa,EAAY,EAAE;EAC1E;EACA;EACD,CAAC,EACqB,sBAAsB,EAAE,EAGnC,MACP,OACE,EAAE,WAAW,aAAa,EAAE,WAAW,kBAAkB,EAAE,WAAW,cACvE,EAAE,aAAa,gBACf,EAA4B,EAAE,KAAK,MAClC,CAAC,GAAa,UAAU,EAAE,cAAc,EAAY,WACrD,EAAE,UAAU,iBAAiB,KAC7B,EAAE,UAAU,aAAa,EAAmB,EAAK,CACpD,EAAE,MAAM;;AAMb,eAAsB,EACpB,GACA,GACA,GACA,GACiB;CACjB,IAAM,IAAY,EAAoB,EAAK,EACrC,IAAM;EACV;GAAE,MAAM;GAAqB,OAAO;GAAM;EAC1C;GAAE,MAAM;GAAY,OAAO;GAAW;EACtC;GAAE,MAAM;GAAgB,OAAO;GAAa;EAC7C,EAEK,IAAO,MAAM,EAAyD;EAC1E,UAAU;EACV,WAAW,EACT,OAAO;GACL,MAAM,gBAAgB,EAAK,GAAG,KAAK,KAAK;GACxC,aAAa,yBAAyB,EAAK;GAC3C,UAAU;GACV,MAAM;GACN,YAAY,CACV;IACE,MAAM;IACN,OAAO,EAAgB,EAAK;IAC5B,OAAO,CAAC;KAAE,eAAe;KAAI,MAAM;KAAQ,CAAC;IAC5C;IACD,CACF;GACD,WAAW;IACT,YAAY,EAAU;IACtB,UAAU,EAAU;IACpB,eAAe,EAAU;IACzB,aAAa,EAAU;IACxB;GACD,YAAY;GACZ,UAAU;IACR,eAAe;IACf,sBAAsB,GAAa,UAAU;IAC7C,yBAAyB,GAAa,kBAAkB;IACxD,cAAc;IACd,UAAU,EAAmB,EAAK;IACnC;GACD,SAAS,EAAyB,GAAa,EAAY;GAC5D,EACF;EACD;EACA;EACD,CAAC;AAEF,KAAI,CAAC,GAAM,eAAe,GACxB,OAAU,MAAM,wCAAwC;AAE1D,QAAO,EAAK,cAAc;;AAG5B,eAAsB,EACpB,GACA,GACA,GACA,GACA,IAAY,KACZ,GACe;CACf,IAAM,IAAQ,KAAK,KAAK;AACxB,QAAO,KAAK,KAAK,GAAG,IAAQ,IAAW;EACrC,IAAM,IAAO,MAAM,EAEhB;GACD,UAAU;GACV,WAAW;IAAE,IAAI;IAAW,SAAS,EAAyB,GAAa,EAAY;IAAE;GACzF;GACA;GACD,CAAC,EACI,IAAS,GAAM,YAAY,QAC3B,IAAe,GAAM,YAAY;AACvC,MAAI,MAAW,UAAW;AAC1B,MAAI,MAAW,YAAY,MAAW,aAAa,MAAW,UAC5D,OAAU,MACR,IACI,WAAW,EAAO,aAAa,CAAC,IAAI,MACpC,WAAW,EAAO,aAAa,GACpC;EAEH,IAAM,IAAiB,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,KAAK,GAAG,KAAS,IAAK,CAAC;AAE3E,EADA,IAAa,sCAAsC,EAAe,IAAI,EACtE,MAAM,IAAI,SAAS,MAAM,WAAW,GAAG,IAAK,CAAC;;AAE/C,OAAU,MAAM,4BAA4B;;AAK9C,eAAe,EACb,GACA,GACA,GACA,GACA,GACA,GACA,GACkC;CAgBlC,IAAM,KAfS,MAAM,EAAqC;EACxD,UAAU;EACV,WAAW,EACT,OAAO;GACL;GACA;GACA;GACA;GACA,SAAS,EAAyB,GAAa,EAAY;GAC5D,EACF;EACD;EACA;EACD,CAAC,EAEyB;AAC3B,KAAI,CAAC,KAAe,EAAY,UAAU,KAAK;EAC7C,IAAM,IAAU,GAAa;AAC7B,QAAU,MACP,GAAS,SAAoB,gBAAgB,GAAa,UAAU,YACtE;;AAGH,QAAO,EAAY;;AAGrB,eAAsB,EACpB,GACA,GACA,GACA,GACA,IAAY,KACZ,GACe;CACf,IAAM,IAAY,KAAK,KAAK;AAE5B,QAAO,KAAK,KAAK,GAAG,IAAY,IAAW;AACzC,MAAI;AACF,SAAM,EACJ,GACA,GACA,GACA,WACA,OACA,KAAA,GACA,EACD;AACD;WACO,GAAO;GACd,IAAM,IAAU,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM;AACtE,OACE,CAAC,4EAA4E,KAAK,EAAQ,CAE1F,OAAM;;EAIV,IAAM,IAAiB,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,KAAK,GAAG,KAAa,IAAK,CAAC;AAG/E,EAFA,IAAa,+BAA+B,EAAe,IAAI,EAE/D,MAAM,IAAI,SAAS,MAAY,WAAW,GAAS,IAAK,CAAC;;AAG3D,OAAU,MAAM,0DAA0D;;AAK5E,eAAsB,EACpB,GACA,GACA,GACA,GACA,GACgC;AAWhC,QAAO,EAAE,YAVI,MAAM,EACjB,GACA,GACA,GACA,aACA,QACA,EAAE,SAAM,EACR,EACD,EACoB,QACO,IAAc;;AAG5C,eAAsB,EACpB,GACA,GACA,GACA,GACA,GAC+B;CAC/B,IAAM,IAAO,MAAM,EACjB,GACA,GACA,GACA,aAAa,KACb,OACA,KAAA,GACA,EACD;AAGD,QAAO;EACL,IAHc,EAAK,SAGL,MAA6B;EAC3C,MAAO,EAAK,QAA+B;EAC5C;;AA6CH,eAAsB,EACpB,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACe;CACf,IAAM,IAAc;EAClB;EACA;EACA,aAAa,KAAe,KAAA;EAC7B;AAED,OAAM,EACJ,GACA,GACA,GACA,aAAa,EAAU,gBACvB,QACA,GACA,EACD;;AAGH,eAAsB,EACpB,GACA,GACA,GACA,GACA,GACA,IAAQ,IACwB;AAWhC,SAVa,MAAM,EACjB,GACA,GACA,GACA,aAAa,EAAU,kBAAkB,KACzC,OACA,KAAA,GACA,EACD,EAEY,YAAkD,EAAE;;AAWnE,eAAsB,EACpB,GACA,GACA,GACkB;AAOlB,SANa,MAAM,EAAmD;EACpE,UAAU;EACV,WAAW,EAAE;EACb;EACA;EACD,CAAC,EACU;;AAWd,eAAsB,EACpB,GACA,GACA,GACA,GACA,GACA,GACA,GACe;CACf,IAAM,IAAc,KAAK,IAAI,GAAG,KAAK,MAAM,EAAO,SAAS,EAAE,CAAC,EACxD,IAAe,KAAK,IAAI,GAAG,KAAK,MAAM,EAAO,UAAU,EAAE,CAAC;AAC5D,KAAc,MAAiB,KAG9B,KAEL,MAAM,EAAuD;EAC3D,UAAU;EACV,WAAW,EACT,OAAO;GAAE;GAAW;GAAW;GAAO;GAAa;GAAc,EAClE;EACD;EACA;EACD,CAAC;;AAGJ,eAAsB,EACpB,GACA,GACA,GACA,GACA,GAC8B;AAW9B,UAVa,MAAM,EACjB,GACA,GACA,GACA,aAAa,EAAU,aACvB,OACA,KAAA,GACA,EACD,EAEa,aAAiD,EAAE,EAAE,QAChE,MAAa,CAAC,EAAS,KAAK,WAAW,IAAI,CAC7C;;AAGH,eAAsB,EACpB,GACA,GACA,GACA,GACA,GACA,GACsC;CAYtC,IAAM,KAVO,MAAM,EACjB,GACA,GACA,GACA,aAAa,EAAU,2BALL,mBAAmB,EAAa,IAMlD,OACA,KAAA,GACA,EACD,EAEqB;AACtB,KAAI,CAAC,EACH,OAAU,MAAM,+CAA+C;AAGjE,QAAO;EACL,UAAU,EAAS;EACnB,UAAU,EAAS;EACnB,eAAe,EAAS;EACzB;;AAKH,eAAsB,EACpB,GACA,GACA,GACA,GACA,GACe;AACf,OAAM,EACJ,GACA,GACA,GACA,aAAa,EAAU,aACvB,QACA,KAAA,GACA,EACD;;AAGH,eAAsB,EACpB,GACA,GACA,GACA,IAAoB,KACpB,GACe;AACf,OAAM,EAA4D;EAChE,UAAU;EACV,WAAW;GACT,IAAI;GACJ;GACA,SAAS,EAAyB,GAAa,EAAY;GAC5D;EACD;EACA;EACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"assistantApi.js","names":[],"sources":["../../src/services/assistantApi.ts"],"sourcesContent":["/**\n * AI Assistant API service.\n *\n * All requests go through the wspace-public-gateway (GraphQL Federation):\n * Frontend → wspace-public-gateway → wspace-sandbox-svc → ai-assistant (K8s pod)\n *\n * Uses the host app's Apollo Client which already points to the gateway.\n */\n\nimport { type ApolloClient } from '@apollo/client';\nimport { print, type DocumentNode } from 'graphql';\nimport type { AssistantArtifact, AssistantMode } from '@/types/assistant';\nimport type { PageContext } from '@/utils/pageContext';\nimport {\n CreateSandboxDocument,\n GetSandboxDocument,\n GetActiveSandboxesDocument,\n ProxySandboxRequestDocument,\n ExtendSandboxTtlDocument,\n CheckAiCreditsDocument,\n ReportAiTokenUsageDocument,\n} from '@/generated/wspace-operations';\n\n// ── Image registry ─────────────────────────────────────────────────\n\nconst HARBOR_REGISTRY = 'burdenoffregistry.azurecr.io';\nconst DEFAULT_IMAGE_TAG = import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha';\nconst GENERAL_IMAGE_TAG = import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha-proxy-auth-v1';\nconst VIBE_PLUGINS_IMAGE_TAG =\n import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha-proxy-auth-v1';\nconst API_CALLS_IMAGE_TAG =\n import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha-delegated-auth-v11';\nconst ASSISTANT_API_AUTH_STRATEGY = 'sandbox-app-client-headers-v1';\n\nfunction getImageTagForMode(mode: AssistantMode): string {\n switch (mode) {\n case 'general':\n return GENERAL_IMAGE_TAG;\n case 'vibe-plugins':\n return VIBE_PLUGINS_IMAGE_TAG;\n // The combined default mode runs in the api-calls image (it can make calls).\n case 'assistant':\n case 'api-calls':\n return API_CALLS_IMAGE_TAG;\n }\n}\n\nfunction getImageForMode(mode: AssistantMode): string {\n // `assistant` reuses the api-calls image — one image, mode selected at runtime\n // via AI_ASSISTANT_MODE. So the image segment is api-calls for both.\n const imageMode = mode === 'assistant' ? 'api-calls' : mode;\n return `${HARBOR_REGISTRY}/wspace/ai-assistant-${imageMode}:${getImageTagForMode(mode)}`;\n}\n\nfunction getResourcesForMode(mode: AssistantMode): {\n cpuRequest: string;\n cpuLimit: string;\n memoryRequest: string;\n memoryLimit: string;\n} {\n switch (mode) {\n case 'general':\n return {\n cpuRequest: '100m',\n cpuLimit: '500m',\n memoryRequest: '256Mi',\n memoryLimit: '1Gi',\n };\n case 'vibe-plugins':\n return {\n cpuRequest: '150m',\n cpuLimit: '750m',\n memoryRequest: '384Mi',\n memoryLimit: '1536Mi',\n };\n case 'assistant':\n case 'api-calls':\n return {\n cpuRequest: '150m',\n cpuLimit: '750m',\n memoryRequest: '384Mi',\n memoryLimit: '1536Mi',\n };\n }\n}\n\nfunction resolveSandboxAssistantMode(sandbox: {\n metadata: Record<string, unknown> | null;\n name?: string | null;\n}): AssistantMode | null {\n const metadataMode = sandbox.metadata?.assistantMode;\n if (\n metadataMode === 'assistant' ||\n metadataMode === 'general' ||\n metadataMode === 'api-calls' ||\n metadataMode === 'vibe-plugins'\n ) {\n return metadataMode;\n }\n\n const name = sandbox.name ?? '';\n if (name.startsWith('ai-assistant-vibe-plugins-')) return 'vibe-plugins';\n if (name.startsWith('ai-assistant-api-calls-')) return 'api-calls';\n if (name.startsWith('ai-assistant-general-')) return 'general';\n if (name.startsWith('ai-assistant-assistant-')) return 'assistant';\n return null;\n}\n\n// ── GraphQL operations (colocated .graphql → generated DocumentNodes) ──\n\n// ── Types ───────────────────────────────────────────────────────────\n\nexport interface AssistantPromptResult {\n response: string;\n tokens?: { input: number; output: number };\n artifacts?: AssistantArtifact[];\n}\n\nexport interface AssistantRawMessagePart {\n type?: string;\n text?: string;\n tool?: string;\n state?: {\n status?: string;\n input?: unknown;\n output?: unknown;\n raw?: unknown;\n };\n}\n\nexport interface AssistantRawMessage {\n info?: {\n id?: string;\n role?: string;\n providerID?: string;\n modelID?: string;\n tokens?: { input: number; output: number };\n time?: {\n created?: number;\n completed?: number;\n };\n };\n parts?: AssistantRawMessagePart[];\n}\n\nexport interface AssistantSandboxAuthContext {\n accessToken?: string | null;\n workspaceToken?: string | null;\n userId?: string | null;\n organizationId?: string | null;\n}\n\nexport interface AssistantSessionInfo {\n id: string;\n mode: string;\n}\n\ninterface GraphQLResponse<TData> {\n data?: TData;\n errors?: Array<{ message: string }>;\n}\n\nexport interface DownloadedAssistantArtifact {\n filename: string;\n mimeType: string;\n contentBase64: string;\n}\n\ninterface ProxyResponse {\n proxySandboxRequest: {\n status: number;\n body: Record<string, unknown>;\n };\n}\n\nfunction getGatewayRequestContext(\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): { headers?: Record<string, string> } | undefined {\n const headers: Record<string, string> = {};\n\n if (authContext?.accessToken) {\n headers.authorization = `Bearer ${authContext.accessToken}`;\n }\n\n if (authContext?.workspaceToken) {\n headers['x-workspace-authorization'] = `Bearer ${authContext.workspaceToken}`;\n }\n\n if (workspaceId) {\n headers['x-workspace-id'] = workspaceId;\n }\n\n if (authContext?.userId) {\n headers['x-actor-id'] = authContext.userId;\n headers['x-actor-type'] = 'user';\n }\n\n if (authContext?.organizationId) {\n headers['x-org-id'] = authContext.organizationId;\n }\n\n return Object.keys(headers).length > 0 ? { headers } : undefined;\n}\n\nfunction buildSandboxContextInput(\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): Record<string, unknown> {\n return {\n workspaceId,\n ...(authContext?.organizationId\n ? {\n custom: {\n organizationId: authContext.organizationId,\n },\n }\n : {}),\n };\n}\n\nasync function executeSandboxGraphQL<TData>(params: {\n document: DocumentNode;\n variables: Record<string, unknown>;\n workspaceId: string;\n authContext?: AssistantSandboxAuthContext;\n}): Promise<TData> {\n const response = await fetch('/workspaces/graphql', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(getGatewayRequestContext(params.workspaceId, params.authContext)?.headers ?? {}),\n },\n body: JSON.stringify({\n query: print(params.document),\n variables: params.variables,\n }),\n });\n\n const result = (await response.json().catch(() => null)) as GraphQLResponse<TData> | null;\n\n if (!response.ok) {\n // Preserve the HTTP status and parsed body so quota detection works.\n // The wspace public gateway returns 429 + errors[].extensions.code =\n // QUOTA_EXHAUSTED for @usage limits (createSandbox, checkAiCredits, …);\n // a bare `HTTP 429` Error would be invisible to isQuotaExhaustedError.\n const messages = result?.errors?.map((error: { message: string }) => error.message).join(', ');\n const httpError = new Error(messages || `Sandbox GraphQL HTTP ${response.status}`) as Error & {\n statusCode?: number;\n result?: unknown;\n };\n httpError.statusCode = response.status;\n httpError.result = result ?? undefined;\n throw httpError;\n }\n\n if (!result) {\n throw new Error('Sandbox GraphQL returned empty response');\n }\n\n if (result.errors?.length) {\n throw new Error(result.errors.map((error: { message: string }) => error.message).join(', '));\n }\n\n if (!result.data) {\n throw new Error('Sandbox GraphQL returned no data');\n }\n\n return result.data;\n}\n\n// ── Find existing sandbox for a mode ───────────────────────────────\n\nexport async function findExistingSandbox(\n _apollo: ApolloClient,\n workspaceId: string,\n mode: AssistantMode,\n authContext?: AssistantSandboxAuthContext\n): Promise<string | null> {\n const data = await executeSandboxGraphQL<{\n getActiveSandboxes: Array<{\n id: string;\n name: string;\n status: string;\n metadata: Record<string, unknown> | null;\n template: string;\n createdBy: string;\n }>;\n }>({\n document: GetActiveSandboxesDocument,\n variables: { context: buildSandboxContextInput(workspaceId, authContext) },\n workspaceId,\n authContext,\n });\n const sandboxes = data.getActiveSandboxes ?? [];\n\n return (\n sandboxes.find(\n (s) =>\n (s.status === 'RUNNING' || s.status === 'PROVISIONING' || s.status === 'PENDING') &&\n s.template === 'AI_BUILDER' &&\n resolveSandboxAssistantMode(s) === mode &&\n (!authContext?.userId || s.createdBy === authContext.userId) &&\n s.metadata?.authStrategy === ASSISTANT_API_AUTH_STRATEGY &&\n s.metadata?.imageTag === getImageTagForMode(mode)\n )?.id ?? null\n );\n}\n\n// ── Sandbox lifecycle ──────────────────────────────────────────────\n\nexport async function createAssistantSandbox(\n _apollo: ApolloClient,\n mode: AssistantMode,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<string> {\n const resources = getResourcesForMode(mode);\n const env = [\n { name: 'AI_ASSISTANT_MODE', value: mode },\n { name: 'HOSTNAME', value: '0.0.0.0' },\n { name: 'WORKSPACE_ID', value: workspaceId },\n // Product the user is in — drives the agent's dynamic per-product docs fetch\n // (the docs repo is `<product>-docs`). Not a secret. This package is the\n // VibeControls MFE, so the product is vibecontrols; other products' MFEs\n // pass their own id.\n { name: 'AI_ASSISTANT_PRODUCT', value: 'vibecontrols' },\n ];\n\n const data = await executeSandboxGraphQL<{ createSandbox: { id: string } }>({\n document: CreateSandboxDocument,\n variables: {\n input: {\n name: `ai-assistant-${mode}-${Date.now()}`,\n description: `AI Assistant sandbox (${mode} mode)`,\n template: 'AI_BUILDER',\n mode: 'DEPLOYMENT',\n containers: [\n {\n name: 'ai-assistant',\n image: getImageForMode(mode),\n ports: [{ containerPort: 80, name: 'http' }],\n env,\n },\n ],\n resources: {\n cpuRequest: resources.cpuRequest,\n cpuLimit: resources.cpuLimit,\n memoryRequest: resources.memoryRequest,\n memoryLimit: resources.memoryLimit,\n },\n ttlSeconds: 600,\n metadata: {\n assistantMode: mode,\n assistantOwnerUserId: authContext?.userId ?? null,\n assistantOrganizationId: authContext?.organizationId ?? null,\n authStrategy: ASSISTANT_API_AUTH_STRATEGY,\n imageTag: getImageTagForMode(mode),\n },\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n },\n workspaceId,\n authContext,\n });\n\n if (!data?.createSandbox?.id) {\n throw new Error('createSandbox returned empty response');\n }\n return data.createSandbox.id;\n}\n\nexport async function waitForSandboxReady(\n _apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext,\n maxWaitMs = 300_000,\n onProgress?: (message: string) => void\n): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < maxWaitMs) {\n const data = await executeSandboxGraphQL<{\n getSandbox: { status?: string; errorMessage?: string } | null;\n }>({\n document: GetSandboxDocument,\n variables: { id: sandboxId, context: buildSandboxContextInput(workspaceId, authContext) },\n workspaceId,\n authContext,\n });\n const status = data?.getSandbox?.status;\n const errorMessage = data?.getSandbox?.errorMessage as string | undefined;\n if (status === 'RUNNING') return;\n if (status === 'FAILED' || status === 'STOPPED' || status === 'EXPIRED') {\n throw new Error(\n errorMessage\n ? `Sandbox ${status.toLowerCase()}: ${errorMessage}`\n : `Sandbox ${status.toLowerCase()}`\n );\n }\n const elapsedSeconds = Math.max(1, Math.round((Date.now() - start) / 1000));\n onProgress?.(`Starting assistant environment... (${elapsedSeconds}s)`);\n await new Promise((r) => setTimeout(r, 2000));\n }\n throw new Error('Sandbox startup timed out');\n}\n\n// ── Proxy calls to ai-assistant (via gateway → sandbox-svc) ───────\n\nasync function proxyToSandbox(\n _apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n path: string,\n method: string,\n body?: unknown,\n authContext?: AssistantSandboxAuthContext\n): Promise<Record<string, unknown>> {\n const result = await executeSandboxGraphQL<ProxyResponse>({\n document: ProxySandboxRequestDocument,\n variables: {\n input: {\n sandboxId,\n path,\n method,\n body,\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n },\n workspaceId,\n authContext,\n });\n\n const proxyResult = result.proxySandboxRequest;\n if (!proxyResult || proxyResult.status >= 400) {\n const errBody = proxyResult?.body as Record<string, unknown> | undefined;\n throw new Error(\n (errBody?.error as string) ?? `Proxy error: ${proxyResult?.status ?? 'unknown'}`\n );\n }\n\n return proxyResult.body;\n}\n\nexport async function waitForAssistantServiceReady(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext,\n maxWaitMs = 90_000,\n onProgress?: (message: string) => void\n): Promise<void> {\n const startedAt = Date.now();\n\n while (Date.now() - startedAt < maxWaitMs) {\n try {\n await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n '/health',\n 'GET',\n undefined,\n authContext\n );\n return;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n !/proxy error: 502|proxy error: 503|proxy error: 404|service not available/i.test(message)\n ) {\n throw error;\n }\n }\n\n const elapsedSeconds = Math.max(1, Math.round((Date.now() - startedAt) / 1000));\n onProgress?.(`Connecting to assistant... (${elapsedSeconds}s)`);\n\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n throw new Error('Assistant service did not become healthy before timeout');\n}\n\n// ── Session management ─────────────────────────────────────────────\n\nexport async function createAssistantSession(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n mode: AssistantMode,\n authContext?: AssistantSandboxAuthContext\n): Promise<{ sessionId: string }> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n '/sessions',\n 'POST',\n { mode },\n authContext\n );\n const session = body.session as Record<string, unknown>;\n return { sessionId: session.id as string };\n}\n\nexport async function getAssistantSession(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<AssistantSessionInfo> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}`,\n 'GET',\n undefined,\n authContext\n );\n const session = body.session as Record<string, unknown> | undefined;\n\n return {\n id: (session?.id as string | undefined) ?? sessionId,\n mode: (body.mode as string | undefined) ?? 'unknown',\n };\n}\n\n// ── Send prompt ────────────────────────────────────────────────────\n\nexport async function sendAssistantPrompt(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n prompt: string,\n mode: AssistantMode,\n pageContext?: PageContext,\n authContext?: AssistantSandboxAuthContext\n): Promise<AssistantPromptResult> {\n const requestBody = {\n mode,\n prompt,\n pageContext: pageContext\n ? {\n activeUrl: pageContext.activeUrl,\n currentPage: pageContext.currentPage,\n platform: pageContext.platform,\n version: pageContext.version,\n viewportSize: pageContext.viewportSize,\n }\n : undefined,\n };\n\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/prompt`,\n 'POST',\n requestBody,\n authContext\n );\n\n const message = body.message as Record<string, unknown> | undefined;\n const tokens = message?.tokens as { input: number; output: number } | undefined;\n\n return { response: body.text as string, tokens };\n}\n\nexport async function sendAssistantPromptAsync(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n prompt: string,\n mode: AssistantMode,\n pageContext?: PageContext,\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n const requestBody = {\n mode,\n prompt,\n pageContext: pageContext ?? undefined,\n };\n\n await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/prompt-async`,\n 'POST',\n requestBody,\n authContext\n );\n}\n\nexport async function getAssistantMessages(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext,\n limit = 50\n): Promise<AssistantRawMessage[]> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/messages?limit=${limit}`,\n 'GET',\n undefined,\n authContext\n );\n\n return (body.messages as AssistantRawMessage[] | undefined) ?? [];\n}\n\n// ── AI credits (per-token metering) ────────────────────────────────\n\n/**\n * Pre-flight AI-credit gate. Resolves to `true` when the caller still has\n * AI-credit budget; throws a quota error (HTTP 429 / QUOTA_EXHAUSTED, from\n * the wspace gateway's @usage check) when the monthly token budget is\n * depleted. Detect the rejection with `isQuotaExhaustedError()`.\n */\nexport async function checkAssistantAiCredits(\n _apollo: ApolloClient,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<boolean> {\n const data = await executeSandboxGraphQL<{ checkAiCredits: boolean }>({\n document: CheckAiCreditsDocument,\n variables: {},\n workspaceId,\n authContext,\n });\n return data.checkAiCredits;\n}\n\n/**\n * Post-turn charge. Reports the turn's raw input/output token counts + the\n * model so the svc computes COST-WEIGHTED credits server-side and charges them\n * against `vibecontrols.ai.credits` (the amount is never sent from the client).\n * `messageId` makes the charge idempotent (retries don't double-charge).\n * No-ops when there are no tokens, or when the model is unknown (the charge\n * requires it). Best-effort — callers must not block the displayed answer on it.\n */\nexport async function reportAssistantAiTokenUsage(\n _apollo: ApolloClient,\n workspaceId: string,\n sessionId: string,\n messageId: string,\n model: string | undefined,\n tokens: { input: number; output: number },\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n const inputTokens = Math.max(0, Math.round(tokens.input ?? 0));\n const outputTokens = Math.max(0, Math.round(tokens.output ?? 0));\n if (inputTokens + outputTokens === 0) return;\n // The svc requires a model to price the charge; skip rather than send a turn\n // that can't be priced (the meter under-counts that turn — acceptable).\n if (!model) return;\n\n await executeSandboxGraphQL<{ reportAiTokenUsage: boolean }>({\n document: ReportAiTokenUsageDocument,\n variables: {\n input: { sessionId, messageId, model, inputTokens, outputTokens },\n },\n workspaceId,\n authContext,\n });\n}\n\nexport async function getAssistantArtifacts(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<AssistantArtifact[]> {\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/artifacts`,\n 'GET',\n undefined,\n authContext\n );\n\n return ((body.artifacts as AssistantArtifact[] | undefined) ?? []).filter(\n (artifact) => !artifact.name.startsWith('.')\n );\n}\n\nexport async function downloadAssistantArtifact(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n artifactPath: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<DownloadedAssistantArtifact> {\n const encodedPath = encodeURIComponent(artifactPath);\n const body = await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/artifacts/download?path=${encodedPath}`,\n 'GET',\n undefined,\n authContext\n );\n\n const artifact = body.artifact as Record<string, unknown> | undefined;\n if (!artifact) {\n throw new Error('Artifact download returned an empty response');\n }\n\n return {\n filename: artifact.filename as string,\n mimeType: artifact.mimeType as string,\n contentBase64: artifact.contentBase64 as string,\n };\n}\n\n// ── Heartbeat ───────────────────────────────────────────────────────\n\nexport async function sendHeartbeat(\n apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n await proxyToSandbox(\n apollo,\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/heartbeat`,\n 'POST',\n undefined,\n authContext\n );\n}\n\nexport async function extendAssistantSandboxTTL(\n _apollo: ApolloClient,\n sandboxId: string,\n workspaceId: string,\n additionalSeconds = 600,\n authContext?: AssistantSandboxAuthContext\n): Promise<void> {\n await executeSandboxGraphQL<{ extendSandboxTTL: { id: string } }>({\n document: ExtendSandboxTtlDocument,\n variables: {\n id: sandboxId,\n additionalSeconds,\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n workspaceId,\n authContext,\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
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 "../utils/pageContext.js";
|
|
3
|
+
import { useCallback as l, useMemo as u, useRef as d } from "react";
|
|
4
|
+
import { useGatewayClient as f } from "@burdenoff/fe-libs/shared/graphql";
|
|
5
|
+
import { useAuthToken as p } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
6
|
+
//#region src/services/createSandboxAssistantTransport.ts
|
|
7
|
+
var m = "assistant", h = 18e4, g = 1500, _ = 3e4;
|
|
8
|
+
function v(e) {
|
|
9
|
+
try {
|
|
10
|
+
let t = e === "workspaceId" ? "burdenoff-active-context-workspace" : "burdenoff-active-context-organization", n = localStorage.getItem(t);
|
|
11
|
+
if (n) return n;
|
|
12
|
+
let r = sessionStorage.getItem("bf-active-profile");
|
|
13
|
+
if (!r) return "";
|
|
14
|
+
let i = localStorage.getItem(`bf-p-${r}-context`);
|
|
15
|
+
return i ? JSON.parse(i)[e] ?? "" : "";
|
|
16
|
+
} catch {
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function y() {
|
|
21
|
+
return new URLSearchParams(window.location.search).get("workspace") ?? v("workspaceId");
|
|
22
|
+
}
|
|
23
|
+
function b() {
|
|
24
|
+
return new URLSearchParams(window.location.search).get("org") ?? v("organizationId");
|
|
25
|
+
}
|
|
26
|
+
function x(e) {
|
|
27
|
+
return e.info?.time?.created ?? 0;
|
|
28
|
+
}
|
|
29
|
+
function S(e) {
|
|
30
|
+
return (e ?? []).filter((e) => e.type === "text" && typeof e.text == "string").map((e) => e.text?.trim() ?? "").filter(Boolean).join("\n");
|
|
31
|
+
}
|
|
32
|
+
function C(e) {
|
|
33
|
+
return (e ?? []).filter((e) => e.type === "tool" && e.tool).map((e) => {
|
|
34
|
+
let t = e.state?.status ?? "running", n = e.tool ?? "tool";
|
|
35
|
+
return t === "completed" ? `Completed: ${n}` : t === "failed" ? `Failed: ${n}` : `Running: ${n}`;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function w(e, t) {
|
|
39
|
+
let n = e.filter((e) => e.info?.role === "assistant" && x(e) >= t).sort((e, t) => x(e) - x(t));
|
|
40
|
+
if (n.length === 0) return {
|
|
41
|
+
content: "Thinking…",
|
|
42
|
+
done: !1
|
|
43
|
+
};
|
|
44
|
+
let r = n[n.length - 1], i = S(r.parts), a = C(r.parts);
|
|
45
|
+
return {
|
|
46
|
+
content: [i, ...a].filter(Boolean).join("\n\n") || "Thinking…",
|
|
47
|
+
done: !!r.info?.time?.completed && (!!i || a.length > 0)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function T(e) {
|
|
51
|
+
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]");
|
|
52
|
+
}
|
|
53
|
+
function E(e) {
|
|
54
|
+
let t = e instanceof Error ? e.message.toLowerCase() : String(e).toLowerCase();
|
|
55
|
+
return t.includes("rate limit exceeded") || t.includes("unauthorized") || t.includes("k8s api error 401") ? !1 : [
|
|
56
|
+
"sandbox not found",
|
|
57
|
+
"sandbox is not running",
|
|
58
|
+
"sandbox service not available yet",
|
|
59
|
+
"sandbox failed",
|
|
60
|
+
"sandbox startup timed out",
|
|
61
|
+
"assistant service did not become healthy",
|
|
62
|
+
"proxy error: 404",
|
|
63
|
+
"proxy error: 502",
|
|
64
|
+
"proxy error: 503"
|
|
65
|
+
].some((e) => t.includes(e));
|
|
66
|
+
}
|
|
67
|
+
function D() {
|
|
68
|
+
let v = f("workspace"), { getAccessToken: x, getWorkspaceToken: S, userId: C } = p(), D = d(null), O = d(null), k = l(async (n, i) => {
|
|
69
|
+
let a = D.current;
|
|
70
|
+
if (!a) {
|
|
71
|
+
if (a = await r(v, n, m, i), !a) {
|
|
72
|
+
if (!x()) throw Error("API Calls mode requires an authenticated session. Please sign in again.");
|
|
73
|
+
a = await e(v, m, n, i);
|
|
74
|
+
}
|
|
75
|
+
await s(v, a, n, i), await o(v, a, n, i), D.current = a;
|
|
76
|
+
}
|
|
77
|
+
let c = O.current;
|
|
78
|
+
return c || (c = (await t(v, a, n, m, i)).sessionId, O.current = c), {
|
|
79
|
+
sandboxId: a,
|
|
80
|
+
sessionId: c
|
|
81
|
+
};
|
|
82
|
+
}, [v, x]), A = l(async ({ prompt: e, onProgress: t, signal: r }) => {
|
|
83
|
+
let o = y();
|
|
84
|
+
if (!o) throw Error("The assistant needs an active workspace. Open a workspace and try again.");
|
|
85
|
+
let s = {
|
|
86
|
+
accessToken: x(),
|
|
87
|
+
workspaceToken: S(),
|
|
88
|
+
userId: C,
|
|
89
|
+
organizationId: b()
|
|
90
|
+
}, l = async (u) => {
|
|
91
|
+
try {
|
|
92
|
+
let { sandboxId: l, sessionId: u } = await k(o, s), d = Date.now();
|
|
93
|
+
await a(v, l, o, u, e, m, c(), s);
|
|
94
|
+
let f = Date.now() + h, p = Date.now(), y = w([], d);
|
|
95
|
+
for (; Date.now() < f;) {
|
|
96
|
+
if (r.aborted) throw Error("Cancelled");
|
|
97
|
+
if (y = w(await i(v, l, o, u, s, 50), d), t(T(y.content)), y.done) break;
|
|
98
|
+
Date.now() - p > _ && (await n(v, l, o, 600, s).catch(() => void 0), p = Date.now()), await new Promise((e) => setTimeout(e, g));
|
|
99
|
+
}
|
|
100
|
+
if (!y.done) throw Error("The assistant timed out while responding. Please try again.");
|
|
101
|
+
return { text: T(y.content) };
|
|
102
|
+
} catch (e) {
|
|
103
|
+
if (u === 1 && E(e)) return D.current = null, O.current = null, l(2);
|
|
104
|
+
throw e;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
return l(1);
|
|
108
|
+
}, [
|
|
109
|
+
v,
|
|
110
|
+
k,
|
|
111
|
+
x,
|
|
112
|
+
S,
|
|
113
|
+
C
|
|
114
|
+
]);
|
|
115
|
+
return u(() => ({ sendPrompt: A }), [A]);
|
|
116
|
+
}
|
|
117
|
+
//#endregion
|
|
118
|
+
export { D as useSandboxAssistantTransport };
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=createSandboxAssistantTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../src/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * VibeControls 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 reuses the\n * existing sandbox `api-calls` agent (the same backend the Ctrl+Shift+A panel\n * uses): it provisions/reuses a sandbox, opens a session, dispatches the prompt\n * async, then polls for the streamed answer. The agent introspects the GraphQL\n * schema and performs API calls on the user's behalf using their workspace\n * token, contextual to the current screen (via `gatherPageContext`).\n *\n * This is a thin orchestration over the unchanged functions in `assistantApi`.\n */\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\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 type AssistantRawMessage,\n type AssistantSandboxAuthContext,\n} from './assistantApi';\nimport { gatherPageContext } from '@/utils/pageContext';\nimport type { AssistantMode } from '@/types/assistant';\n\n/**\n * Locally-defined mirror of the fe-libs `AssistantTransport` contract.\n *\n * We intentionally do NOT import the type from `@burdenoff/fe-libs` here:\n * microfe's tsconfig maps `@burdenoff/fe-libs/*` to fe-libs *source*, so\n * vite-plugin-dts would rewrite a cross-package type used in this hook's\n * public signature to a broken source-relative path in the emitted `.d.ts`.\n * Structural typing makes this shape assignable to fe-libs' `AssistantTransport`\n * at the call site (vibecontrols-app's AppShell), which is where compatibility\n * is enforced — drift there fails the app type-check.\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 AssistantChatArea's resolution) ──────────\n\nfunction getProfileContextValue(key: 'workspaceId' | 'organizationId'): string {\n try {\n const activeContextKey =\n key === 'workspaceId'\n ? 'burdenoff-active-context-workspace'\n : '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(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('workspace') ?? getProfileContextValue('workspaceId');\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 AssistantChatArea) ────────\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(\n messages: AssistantRawMessage[],\n sinceMs: number\n): { content: string; done: boolean } {\n const relevant = messages\n .filter(\n (message) => message.info?.role === 'assistant' && getRawMessageCreatedAt(message) >= sinceMs\n )\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 =\n 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 VibeControls sandbox\n * `api-calls` agent. The sandbox + session are cached in refs so follow-up\n * turns reuse the warm environment for the lifetime of the host shell.\n */\nexport function useSandboxAssistantTransport(): AssistantTransport {\n const apollo = useGatewayClient('workspace');\n const { getAccessToken, getWorkspaceToken, userId } = 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(apollo, workspaceId, MODE, authContext);\n if (!sandboxId) {\n if (!getAccessToken()) {\n throw new Error(\n 'API Calls mode requires an authenticated session. Please sign in again.'\n );\n }\n sandboxId = await createAssistantSandbox(apollo, MODE, workspaceId, authContext);\n }\n await waitForSandboxReady(apollo, sandboxId, workspaceId, authContext);\n await waitForAssistantServiceReady(apollo, sandboxId, workspaceId, authContext);\n sandboxIdRef.current = sandboxId;\n }\n\n let sessionId = sessionIdRef.current;\n if (!sessionId) {\n const result = await createAssistantSession(\n apollo,\n sandboxId,\n workspaceId,\n MODE,\n authContext\n );\n sessionId = result.sessionId;\n sessionIdRef.current = sessionId;\n }\n\n return { sandboxId, sessionId };\n },\n [apollo, getAccessToken]\n );\n\n const sendPrompt = useCallback(\n async ({ prompt, onProgress, signal }: AssistantSendArgs): Promise<{ text: string }> => {\n const workspaceId = getWorkspaceId();\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 apollo,\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(\n apollo,\n sandboxId,\n workspaceId,\n sessionId,\n authContext,\n 50\n );\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(\n apollo,\n sandboxId,\n workspaceId,\n 600,\n authContext\n ).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 [apollo, ensureRuntime, getAccessToken, getWorkspaceToken, userId]\n );\n\n return useMemo<AssistantTransport>(() => ({ sendPrompt }), [sendPrompt]);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistantStore.js","names":[],"sources":["../../src/store/assistantStore.ts"],"sourcesContent":["/**\n * AI Assistant state management.\n *\n * Zustand store with profile-scoped persistence for conversations,\n * active mode, and streaming state. Follows the same pattern as\n * vibeControlsStore.ts.\n */\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\nimport type {\n AssistantConversationProcessing,\n AssistantConversationStatus,\n AssistantMode,\n AssistantSandboxRuntime,\n AssistantSandboxStatus,\n Conversation,\n Message,\n} from '@/types/assistant';\n\ninterface AssistantState {\n conversations: Conversation[];\n activeConversationId: string | null;\n mode: AssistantMode;\n processingByConversationId: Record<string, AssistantConversationProcessing>;\n conversationListOpen: boolean;\n /** Active sandboxes keyed by assistant mode */\n sandboxesByMode: Partial<Record<AssistantMode, AssistantSandboxRuntime>>;\n /**\n * A prompt queued up for auto-submit by the chat area. Used by the\n * `GetHelpButton` / `useOpenAssistantHelp` hook so pages can prompt the\n * assistant contextually from an empty state button without coupling to\n * the chat area internals.\n */\n pendingPrompt: string | null;\n\n // Actions\n createConversation: (title?: string, mode?: AssistantMode) => string;\n deleteConversation: (id: string) => void;\n renameConversation: (id: string, title: string) => void;\n setActiveConversation: (id: string | null) => void;\n setMode: (mode: AssistantMode) => void;\n setConversationMode: (conversationId: string, mode: AssistantMode) => void;\n addMessage: (conversationId: string, message: Message) => void;\n updateMessage: (conversationId: string, messageId: string, content: string) => void;\n patchMessage: (conversationId: string, messageId: string, patch: Partial<Message>) => void;\n setConversationProcessing: (\n conversationId: string,\n status: AssistantConversationStatus,\n messageId?: string | null,\n error?: string | null\n ) => void;\n clearConversationProcessing: (conversationId: string) => void;\n toggleConversationList: () => void;\n setConversationListOpen: (open: boolean) => void;\n clearConversation: (id: string) => void;\n setBackendSessionId: (conversationId: string, sessionId: string) => void;\n clearBackendSessionId: (conversationId: string) => void;\n setSandbox: (\n mode: AssistantMode,\n sandboxId: string | null,\n status: AssistantSandboxStatus\n ) => void;\n clearSandbox: (mode: AssistantMode) => void;\n resetStore: () => void;\n /** Queue a prompt for the chat area to auto-send on next render. */\n submitPrompt: (text: string) => void;\n /** Returns and clears any queued prompt. */\n consumePendingPrompt: () => string | null;\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nexport const useAssistantStore = create<AssistantState>()(\n persist(\n (set, get) => ({\n conversations: [],\n activeConversationId: null,\n mode: 'general',\n processingByConversationId: {},\n conversationListOpen: false,\n sandboxesByMode: {},\n pendingPrompt: null,\n\n createConversation: (title?: string, mode?: AssistantMode) => {\n const id = generateId();\n const now = new Date().toISOString();\n const conversationMode = mode ?? get().mode;\n const conversation: Conversation = {\n id,\n title: title || 'New conversation',\n mode: conversationMode,\n messages: [],\n backendSessionId: null,\n createdAt: now,\n updatedAt: now,\n };\n set((state) => ({\n conversations: [conversation, ...state.conversations],\n activeConversationId: id,\n conversationListOpen: false,\n }));\n return id;\n },\n\n deleteConversation: (id) =>\n set((state) => {\n const filtered = state.conversations.filter((c) => c.id !== id);\n const nextProcessing = { ...state.processingByConversationId };\n delete nextProcessing[id];\n return {\n conversations: filtered,\n processingByConversationId: nextProcessing,\n activeConversationId:\n state.activeConversationId === id\n ? (filtered[0]?.id ?? null)\n : state.activeConversationId,\n };\n }),\n\n renameConversation: (id, title) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === id ? { ...c, title, updatedAt: new Date().toISOString() } : c\n ),\n })),\n\n setActiveConversation: (id) =>\n set((state) => {\n const selectedConversation = state.conversations.find(\n (conversation) => conversation.id === id\n );\n return {\n activeConversationId: id,\n mode: selectedConversation?.mode ?? state.mode,\n conversationListOpen: false,\n };\n }),\n\n setMode: (mode) => set({ mode }),\n\n setConversationMode: (conversationId, mode) =>\n set((state) => ({\n conversations: state.conversations.map((conversation) =>\n conversation.id === conversationId\n ? {\n ...conversation,\n mode,\n updatedAt: new Date().toISOString(),\n }\n : conversation\n ),\n mode: state.activeConversationId === conversationId ? mode : state.mode,\n })),\n\n addMessage: (conversationId, message) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n messages: [...c.messages, message],\n updatedAt: new Date().toISOString(),\n // Auto-title from first user message\n title:\n c.messages.length === 0 && message.role === 'user'\n ? message.content.slice(0, 50) + (message.content.length > 50 ? '...' : '')\n : c.title,\n }\n : c\n ),\n })),\n\n updateMessage: (conversationId, messageId, content) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n messages: c.messages.map((m) => (m.id === messageId ? { ...m, content } : m)),\n updatedAt: new Date().toISOString(),\n }\n : c\n ),\n })),\n\n patchMessage: (conversationId, messageId, patch) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n messages: c.messages.map((m) => (m.id === messageId ? { ...m, ...patch } : m)),\n updatedAt: new Date().toISOString(),\n }\n : c\n ),\n })),\n\n setConversationProcessing: (conversationId, status, messageId = null, error = null) =>\n set((state) => ({\n processingByConversationId: {\n ...state.processingByConversationId,\n [conversationId]: {\n status,\n messageId,\n error,\n updatedAt: new Date().toISOString(),\n },\n },\n })),\n\n clearConversationProcessing: (conversationId) =>\n set((state) => {\n const next = { ...state.processingByConversationId };\n delete next[conversationId];\n return { processingByConversationId: next };\n }),\n\n toggleConversationList: () =>\n set((state) => ({ conversationListOpen: !state.conversationListOpen })),\n\n setConversationListOpen: (open) => set({ conversationListOpen: open }),\n\n clearConversation: (id) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === id\n ? {\n ...c,\n messages: [],\n backendSessionId: null,\n updatedAt: new Date().toISOString(),\n }\n : c\n ),\n processingByConversationId: {\n ...state.processingByConversationId,\n [id]: {\n status: 'idle',\n messageId: null,\n error: null,\n updatedAt: new Date().toISOString(),\n },\n },\n })),\n\n setBackendSessionId: (conversationId, sessionId) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n backendSessionId: sessionId,\n }\n : c\n ),\n })),\n\n clearBackendSessionId: (conversationId) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId ? { ...c, backendSessionId: null } : c\n ),\n })),\n\n setSandbox: (mode, sandboxId, status) =>\n set((state) => {\n if (!sandboxId) {\n const nextSandboxesByMode = { ...state.sandboxesByMode };\n delete nextSandboxesByMode[mode];\n return { sandboxesByMode: nextSandboxesByMode };\n }\n\n return {\n sandboxesByMode: {\n ...state.sandboxesByMode,\n [mode]: {\n sandboxId,\n status,\n },\n },\n };\n }),\n\n clearSandbox: (mode) =>\n set((state) => {\n const nextSandboxesByMode = { ...state.sandboxesByMode };\n delete nextSandboxesByMode[mode];\n return { sandboxesByMode: nextSandboxesByMode };\n }),\n\n resetStore: () =>\n set({\n conversations: [],\n activeConversationId: null,\n mode: 'general',\n processingByConversationId: {},\n conversationListOpen: false,\n sandboxesByMode: {},\n pendingPrompt: null,\n }),\n\n submitPrompt: (text: string) => set({ pendingPrompt: text }),\n\n consumePendingPrompt: () => {\n const current = get().pendingPrompt;\n if (current !== null) set({ pendingPrompt: null });\n return current;\n },\n }),\n {\n name: 'vc-ai-assistant',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n conversations: state.conversations.map(({ ...conversation }) => conversation),\n activeConversationId: state.activeConversationId,\n mode: state.mode,\n conversationListOpen: state.conversationListOpen,\n }),\n }\n )\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assistantStore.js","names":[],"sources":["../../src/store/assistantStore.ts"],"sourcesContent":["/**\n * AI Assistant state management.\n *\n * Zustand store with profile-scoped persistence for conversations,\n * active mode, and streaming state. Follows the same pattern as\n * vibeControlsStore.ts.\n */\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\nimport type {\n AssistantConversationProcessing,\n AssistantConversationStatus,\n AssistantMode,\n AssistantSandboxRuntime,\n AssistantSandboxStatus,\n Conversation,\n Message,\n} from '@/types/assistant';\n\ninterface AssistantState {\n conversations: Conversation[];\n activeConversationId: string | null;\n mode: AssistantMode;\n processingByConversationId: Record<string, AssistantConversationProcessing>;\n conversationListOpen: boolean;\n /** Active sandboxes keyed by assistant mode */\n sandboxesByMode: Partial<Record<AssistantMode, AssistantSandboxRuntime>>;\n /**\n * A prompt queued up for auto-submit by the chat area. Used by the\n * `GetHelpButton` / `useOpenAssistantHelp` hook so pages can prompt the\n * assistant contextually from an empty state button without coupling to\n * the chat area internals.\n */\n pendingPrompt: string | null;\n\n // Actions\n createConversation: (title?: string, mode?: AssistantMode) => string;\n deleteConversation: (id: string) => void;\n renameConversation: (id: string, title: string) => void;\n setActiveConversation: (id: string | null) => void;\n setMode: (mode: AssistantMode) => void;\n setConversationMode: (conversationId: string, mode: AssistantMode) => void;\n addMessage: (conversationId: string, message: Message) => void;\n updateMessage: (conversationId: string, messageId: string, content: string) => void;\n patchMessage: (conversationId: string, messageId: string, patch: Partial<Message>) => void;\n setConversationProcessing: (\n conversationId: string,\n status: AssistantConversationStatus,\n messageId?: string | null,\n error?: string | null\n ) => void;\n clearConversationProcessing: (conversationId: string) => void;\n toggleConversationList: () => void;\n setConversationListOpen: (open: boolean) => void;\n clearConversation: (id: string) => void;\n setBackendSessionId: (conversationId: string, sessionId: string) => void;\n clearBackendSessionId: (conversationId: string) => void;\n setSandbox: (\n mode: AssistantMode,\n sandboxId: string | null,\n status: AssistantSandboxStatus\n ) => void;\n clearSandbox: (mode: AssistantMode) => void;\n resetStore: () => void;\n /** Queue a prompt for the chat area to auto-send on next render. */\n submitPrompt: (text: string) => void;\n /** Returns and clears any queued prompt. */\n consumePendingPrompt: () => string | null;\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nexport const useAssistantStore = create<AssistantState>()(\n persist(\n (set, get) => ({\n conversations: [],\n activeConversationId: null,\n mode: 'assistant',\n processingByConversationId: {},\n conversationListOpen: false,\n sandboxesByMode: {},\n pendingPrompt: null,\n\n createConversation: (title?: string, mode?: AssistantMode) => {\n const id = generateId();\n const now = new Date().toISOString();\n const conversationMode = mode ?? get().mode;\n const conversation: Conversation = {\n id,\n title: title || 'New conversation',\n mode: conversationMode,\n messages: [],\n backendSessionId: null,\n createdAt: now,\n updatedAt: now,\n };\n set((state) => ({\n conversations: [conversation, ...state.conversations],\n activeConversationId: id,\n conversationListOpen: false,\n }));\n return id;\n },\n\n deleteConversation: (id) =>\n set((state) => {\n const filtered = state.conversations.filter((c) => c.id !== id);\n const nextProcessing = { ...state.processingByConversationId };\n delete nextProcessing[id];\n return {\n conversations: filtered,\n processingByConversationId: nextProcessing,\n activeConversationId:\n state.activeConversationId === id\n ? (filtered[0]?.id ?? null)\n : state.activeConversationId,\n };\n }),\n\n renameConversation: (id, title) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === id ? { ...c, title, updatedAt: new Date().toISOString() } : c\n ),\n })),\n\n setActiveConversation: (id) =>\n set((state) => {\n const selectedConversation = state.conversations.find(\n (conversation) => conversation.id === id\n );\n return {\n activeConversationId: id,\n mode: selectedConversation?.mode ?? state.mode,\n conversationListOpen: false,\n };\n }),\n\n setMode: (mode) => set({ mode }),\n\n setConversationMode: (conversationId, mode) =>\n set((state) => ({\n conversations: state.conversations.map((conversation) =>\n conversation.id === conversationId\n ? {\n ...conversation,\n mode,\n updatedAt: new Date().toISOString(),\n }\n : conversation\n ),\n mode: state.activeConversationId === conversationId ? mode : state.mode,\n })),\n\n addMessage: (conversationId, message) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n messages: [...c.messages, message],\n updatedAt: new Date().toISOString(),\n // Auto-title from first user message\n title:\n c.messages.length === 0 && message.role === 'user'\n ? message.content.slice(0, 50) + (message.content.length > 50 ? '...' : '')\n : c.title,\n }\n : c\n ),\n })),\n\n updateMessage: (conversationId, messageId, content) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n messages: c.messages.map((m) => (m.id === messageId ? { ...m, content } : m)),\n updatedAt: new Date().toISOString(),\n }\n : c\n ),\n })),\n\n patchMessage: (conversationId, messageId, patch) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n messages: c.messages.map((m) => (m.id === messageId ? { ...m, ...patch } : m)),\n updatedAt: new Date().toISOString(),\n }\n : c\n ),\n })),\n\n setConversationProcessing: (conversationId, status, messageId = null, error = null) =>\n set((state) => ({\n processingByConversationId: {\n ...state.processingByConversationId,\n [conversationId]: {\n status,\n messageId,\n error,\n updatedAt: new Date().toISOString(),\n },\n },\n })),\n\n clearConversationProcessing: (conversationId) =>\n set((state) => {\n const next = { ...state.processingByConversationId };\n delete next[conversationId];\n return { processingByConversationId: next };\n }),\n\n toggleConversationList: () =>\n set((state) => ({ conversationListOpen: !state.conversationListOpen })),\n\n setConversationListOpen: (open) => set({ conversationListOpen: open }),\n\n clearConversation: (id) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === id\n ? {\n ...c,\n messages: [],\n backendSessionId: null,\n updatedAt: new Date().toISOString(),\n }\n : c\n ),\n processingByConversationId: {\n ...state.processingByConversationId,\n [id]: {\n status: 'idle',\n messageId: null,\n error: null,\n updatedAt: new Date().toISOString(),\n },\n },\n })),\n\n setBackendSessionId: (conversationId, sessionId) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId\n ? {\n ...c,\n backendSessionId: sessionId,\n }\n : c\n ),\n })),\n\n clearBackendSessionId: (conversationId) =>\n set((state) => ({\n conversations: state.conversations.map((c) =>\n c.id === conversationId ? { ...c, backendSessionId: null } : c\n ),\n })),\n\n setSandbox: (mode, sandboxId, status) =>\n set((state) => {\n if (!sandboxId) {\n const nextSandboxesByMode = { ...state.sandboxesByMode };\n delete nextSandboxesByMode[mode];\n return { sandboxesByMode: nextSandboxesByMode };\n }\n\n return {\n sandboxesByMode: {\n ...state.sandboxesByMode,\n [mode]: {\n sandboxId,\n status,\n },\n },\n };\n }),\n\n clearSandbox: (mode) =>\n set((state) => {\n const nextSandboxesByMode = { ...state.sandboxesByMode };\n delete nextSandboxesByMode[mode];\n return { sandboxesByMode: nextSandboxesByMode };\n }),\n\n resetStore: () =>\n set({\n conversations: [],\n activeConversationId: null,\n mode: 'general',\n processingByConversationId: {},\n conversationListOpen: false,\n sandboxesByMode: {},\n pendingPrompt: null,\n }),\n\n submitPrompt: (text: string) => set({ pendingPrompt: text }),\n\n consumePendingPrompt: () => {\n const current = get().pendingPrompt;\n if (current !== null) set({ pendingPrompt: null });\n return current;\n },\n }),\n {\n name: 'vc-ai-assistant',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n conversations: state.conversations.map(({ ...conversation }) => conversation),\n activeConversationId: state.activeConversationId,\n mode: state.mode,\n conversationListOpen: state.conversationListOpen,\n }),\n }\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.618.1",
|
|
4
4
|
"description": "VibeControls microfrontend for Burdenoff products",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
"./plugin": {
|
|
21
21
|
"types": "./dist/plugin.d.ts",
|
|
22
22
|
"import": "./dist/plugin.js"
|
|
23
|
+
},
|
|
24
|
+
"./services/createSandboxAssistantTransport": {
|
|
25
|
+
"types": "./dist/microfe/microfe-vibecontrols/src/services/createSandboxAssistantTransport.d.ts",
|
|
26
|
+
"import": "./dist/services/createSandboxAssistantTransport.js"
|
|
23
27
|
}
|
|
24
28
|
},
|
|
25
29
|
"main": "./dist/index.js",
|