@burdenoff/microfe-vibecontrols 2026.915.1 → 2026.915.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/components/assistant/AIAssistantPanel.js +19 -29
  2. package/dist/components/assistant/AIAssistantPanel.js.map +1 -1
  3. package/dist/components/assistant/assistantProduct.js +20 -0
  4. package/dist/components/assistant/assistantProduct.js.map +1 -0
  5. package/dist/components/assistant/index.js +0 -8
  6. package/dist/config/assistantUsecases.js +24 -27
  7. package/dist/config/assistantUsecases.js.map +1 -1
  8. package/dist/hooks/useOfferedAssistantMode.js +17 -0
  9. package/dist/hooks/useOfferedAssistantMode.js.map +1 -0
  10. package/dist/hooks/useOpenAssistantHelp.js.map +1 -1
  11. package/dist/index.js +4 -5
  12. package/dist/pages/SessionsPage.js +14 -14
  13. package/dist/services/assistantApi.js +16 -17
  14. package/dist/services/assistantApi.js.map +1 -1
  15. package/dist/services/createSandboxAssistantTransport.js +5 -5
  16. package/dist/types/assistant.js.map +1 -1
  17. package/dist/utils/assistantPrompt.js.map +1 -1
  18. package/dist/utils/pageContext.js +10 -10
  19. package/dist/utils/pageContext.js.map +1 -1
  20. package/package.json +1 -1
  21. package/dist/components/assistant/AssistantChatArea.js +0 -11
  22. package/dist/components/assistant/AssistantChatInput.js +0 -4
  23. package/dist/components/assistant/AssistantConversationList.js +0 -6
  24. package/dist/components/assistant/AssistantExportMenu.js +0 -5
  25. package/dist/components/assistant/AssistantMessageItem.js +0 -9
  26. package/dist/components/assistant/AssistantMessageList.js +0 -4
  27. package/dist/components/assistant/AssistantModeSelector.js +0 -5
  28. package/dist/components/assistant/AssistantWelcome.js +0 -4
  29. package/dist/store/assistantStore.js +0 -165
  30. package/dist/store/assistantStore.js.map +0 -1
@@ -1,40 +1,30 @@
1
- import { ASSISTANT_MODES as e } from "../../types/assistant.js";
2
- import { PRODUCT as t, reportAssistantTokenUsage as n } from "../../services/assistantApi.js";
3
- import { useWorkspaceWriteAccess as r } from "../../hooks/useWorkspaceWriteAccess.js";
4
- import { describeCurrentPage as i, gatherPageContext as a } from "../../utils/pageContext.js";
5
- import { buildPromptForMode as o } from "../../utils/assistantPrompt.js";
6
- import { AiCreditsMeter as s } from "./AiCreditsMeter.js";
7
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
- import { AIAssistantPanel as u } from "@burdenoff/fe-libs/shared/assistant/ui/AIAssistantPanel";
9
- import { AssistantProductProvider as d } from "@burdenoff/fe-libs/shared/assistant/product";
10
- import { getActorId as f, getWorkspaceId as p } from "@burdenoff/fe-libs/shared/assistant/context";
1
+ import { useWorkspaceWriteAccess as e } from "../../hooks/useWorkspaceWriteAccess.js";
2
+ import { useOfferedAssistantMode as t } from "../../hooks/useOfferedAssistantMode.js";
3
+ import { AiCreditsMeter as n } from "./AiCreditsMeter.js";
4
+ import { VIBECONTROLS_ASSISTANT_PRODUCT as r } from "./assistantProduct.js";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import { AIAssistantPanel as o } from "@burdenoff/fe-libs/shared/assistant/ui/AIAssistantPanel";
7
+ import { AssistantProductProvider as s } from "@burdenoff/fe-libs/shared/assistant/product";
8
+ import { getActorId as c, getWorkspaceId as l } from "@burdenoff/fe-libs/shared/assistant/context";
11
9
  //#region src/components/assistant/AIAssistantPanel.tsx
12
- var m = {
13
- attachments: "/VibeControls/AI Assistant/Attachments",
14
- artifacts: "/VibeControls/AI Assistant/Artifacts"
15
- }, h = (h) => {
16
- let g = r(f(), p() || null);
17
- return /* @__PURE__ */ c(d, {
18
- product: t,
19
- modes: e,
20
- describeCurrentPage: i,
21
- gatherPageContext: a,
22
- buildPrompt: o,
23
- reportTokenUsage: n,
24
- storageFolders: m,
25
- children: /* @__PURE__ */ l("div", {
10
+ var u = (u) => {
11
+ t();
12
+ let d = e(c(), l() || null);
13
+ return /* @__PURE__ */ i(s, {
14
+ ...r,
15
+ children: /* @__PURE__ */ a("div", {
26
16
  className: "flex flex-col h-full w-full min-h-0",
27
- children: [/* @__PURE__ */ c(s, {}), /* @__PURE__ */ c("div", {
17
+ children: [/* @__PURE__ */ i(n, {}), /* @__PURE__ */ i("div", {
28
18
  className: "flex-1 min-h-0",
29
- children: /* @__PURE__ */ c(u, {
30
- ...h,
31
- writeAccess: g
19
+ children: /* @__PURE__ */ i(o, {
20
+ ...u,
21
+ writeAccess: d
32
22
  })
33
23
  })]
34
24
  })
35
25
  });
36
26
  };
37
27
  //#endregion
38
- export { h as AIAssistantPanel };
28
+ export { u as AIAssistantPanel };
39
29
 
40
30
  //# sourceMappingURL=AIAssistantPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AIAssistantPanel.js","names":[],"sources":["../../../src/components/assistant/AIAssistantPanel.tsx"],"sourcesContent":["/**\n * VibeControls' AI assistant.\n *\n * ★★ Everything below this file is now shared. The panel, the orchestrator, the\n * transport, the voice session, the composer and every component in them live in\n * `fe-libs/shared/assistant` and answer to any product that mounts them. What is\n * left here is the things that are genuinely VibeControls', and nothing else:\n *\n * modes which use cases this product offers.\n * describeCurrentPage what to CALL the page the user is on.\n * gatherPageContext the same page, as structured context for the agent.\n * buildPrompt the confirm-before-mutate guardrail, the language\n * directive and the dictation instructions.\n * reportTokenUsage the charge, against VibeControls' OWN reporter.\n * storageFolders where this product's attachments and artifacts live.\n *\n * Plus `writeAccess`, which is a PROP rather than a seventh seam field: which\n * resource types prove \"this user can write here\" is a product answer, but the\n * product can simply compute it and hand it down. A capability a product can\n * work out for itself does not belong in an interface every product must\n * satisfy.\n *\n * ★ The provider wraps from OUTSIDE the shared panel rather than sitting inside\n * its tree: the panel calls `useAssistantProduct()` and `useAssistantTr()` in its\n * own body, so a provider nested in its JSX would be below the consumer and read\n * as null — which does not throw, it silently renders English with no modes.\n *\n * ★ `AiCreditsMeter` is composed AROUND the shared panel, not inside it. The\n * shared panel has no slot for it and should not grow one: a credits strip is a\n * VibeControls billing decision, not something every product wants above its\n * assistant. It listens to the `notifyAiCreditsUpdated` event the shared chat\n * area already dispatches, so it keeps working untouched.\n */\n\nimport type { FC } from 'react';\nimport {\n AIAssistantPanel as SharedAIAssistantPanel,\n type AIAssistantPanelProps as SharedProps,\n} from '@burdenoff/fe-libs/shared/assistant/ui/AIAssistantPanel';\nimport { AssistantProductProvider } from '@burdenoff/fe-libs/shared/assistant/product';\nimport { getActorId, getWorkspaceId } from '@burdenoff/fe-libs/shared/assistant/context';\nimport { ASSISTANT_MODES } from '@/types/assistant';\nimport { PRODUCT, reportAssistantTokenUsage } from '@/services/assistantApi';\nimport { useWorkspaceWriteAccess } from '@/hooks/useWorkspaceWriteAccess';\nimport { describeCurrentPage, gatherPageContext } from '@/utils/pageContext';\nimport { buildPromptForMode } from '@/utils/assistantPrompt';\nimport { AiCreditsMeter } from './AiCreditsMeter';\n\n/**\n * Where this product's assistant files live.\n *\n * ★★ These strings are LOAD-BEARING once users have saved anything. They are the\n * real folders in the workspace file library holding every attachment and\n * artifact. Changing them does not fail — it starts a second folder beside the\n * first and orphans everything in the original.\n *\n * Note the capitalisation: `/VibeControls/…`, while the product id is\n * `vibecontrols`. That mismatch is exactly why fe-libs cannot derive this and\n * why it is supplied here.\n */\nconst STORAGE_FOLDERS = {\n attachments: '/VibeControls/AI Assistant/Attachments',\n artifacts: '/VibeControls/AI Assistant/Artifacts',\n} as const;\n\nexport type AIAssistantPanelProps = Omit<SharedProps, 'writeAccess'>;\n\nexport const AIAssistantPanel: FC<AIAssistantPanelProps> = (props) => {\n /**\n * ★ Advisory, never a gate — see `useWorkspaceWriteAccess`. Gating on it\n * would remove api-calls from the product entirely until RBAC rows are\n * seeded. It warns before the effort instead of after it, and self-corrects\n * with no code change the moment those rows exist.\n */\n const writeAccess = useWorkspaceWriteAccess(getActorId(), getWorkspaceId() || null);\n\n return (\n <AssistantProductProvider\n product={PRODUCT}\n modes={ASSISTANT_MODES}\n describeCurrentPage={describeCurrentPage}\n gatherPageContext={gatherPageContext}\n buildPrompt={buildPromptForMode}\n reportTokenUsage={reportAssistantTokenUsage}\n storageFolders={STORAGE_FOLDERS}\n >\n <div className=\"flex flex-col h-full w-full min-h-0\">\n <AiCreditsMeter />\n <div className=\"flex-1 min-h-0\">\n <SharedAIAssistantPanel {...props} writeAccess={writeAccess} />\n </div>\n </div>\n </AssistantProductProvider>\n );\n};\n"],"mappings":";;;;;;;;;;;AA4DA,IAAM,IAAkB;CACtB,aAAa;CACb,WAAW;CACZ,EAIY,KAA+C,MAAU;CAOpE,IAAM,IAAc,EAAwB,GAAY,EAAE,GAAgB,IAAI,KAAK;AAEnF,QACE,kBAAC,GAAD;EACE,SAAS;EACT,OAAO;EACc;EACF;EACnB,aAAa;EACb,kBAAkB;EAClB,gBAAgB;YAEhB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAkB,CAAA,EAClB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAwB,GAAI;KAAoB;KAAe,CAAA;IAC3D,CAAA,CACF;;EACmB,CAAA"}
1
+ {"version":3,"file":"AIAssistantPanel.js","names":[],"sources":["../../../src/components/assistant/AIAssistantPanel.tsx"],"sourcesContent":["/**\n * VibeControls' AI assistant.\n *\n * ★★ Everything below this file is now shared. The panel, the orchestrator, the\n * transport, the voice session, the composer and every component in them live in\n * `fe-libs/shared/assistant` and answer to any product that mounts them. What is\n * left here is the things that are genuinely VibeControls', and nothing else:\n *\n * modes which use cases this product offers.\n * describeCurrentPage what to CALL the page the user is on.\n * gatherPageContext the same page, as structured context for the agent.\n * buildPrompt the confirm-before-mutate guardrail, the language\n * directive and the dictation instructions.\n * reportTokenUsage the charge, against VibeControls' OWN reporter.\n * storageFolders where this product's attachments and artifacts live.\n *\n * All six, plus the product id, are one `Required` value in `assistantProduct.ts`,\n * spread into the provider here, so a missing answer is a type error.\n *\n * Plus `writeAccess`, which is a PROP rather than a seventh seam field: which\n * resource types prove \"this user can write here\" is a product answer, but the\n * product can simply compute it and hand it down. A capability a product can\n * work out for itself does not belong in an interface every product must\n * satisfy.\n *\n * ★ The provider wraps from OUTSIDE the shared panel rather than sitting inside\n * its tree: the panel calls `useAssistantProduct()` and `useAssistantTr()` in its\n * own body, so a provider nested in its JSX would be below the consumer and read\n * as null — which does not throw, it silently renders English with no modes.\n *\n * ★ `AiCreditsMeter` is composed AROUND the shared panel, not inside it. The\n * shared panel has no slot for it and should not grow one: a credits strip is a\n * VibeControls billing decision, not something every product wants above its\n * assistant. It listens to the `notifyAiCreditsUpdated` event the shared chat\n * area already dispatches, so it keeps working untouched.\n */\n\nimport type { FC } from 'react';\nimport {\n AIAssistantPanel as SharedAIAssistantPanel,\n type AIAssistantPanelProps as SharedProps,\n} from '@burdenoff/fe-libs/shared/assistant/ui/AIAssistantPanel';\nimport { AssistantProductProvider } from '@burdenoff/fe-libs/shared/assistant/product';\nimport { getActorId, getWorkspaceId } from '@burdenoff/fe-libs/shared/assistant/context';\nimport { useWorkspaceWriteAccess } from '@/hooks/useWorkspaceWriteAccess';\nimport { useOfferedAssistantMode } from '@/hooks/useOfferedAssistantMode';\nimport { AiCreditsMeter } from './AiCreditsMeter';\nimport { VIBECONTROLS_ASSISTANT_PRODUCT } from './assistantProduct';\n\nexport type AIAssistantPanelProps = Omit<SharedProps, 'writeAccess'>;\n\nexport const AIAssistantPanel: FC<AIAssistantPanelProps> = (props) => {\n /**\n * ★★ A stored mode VibeControls no longer offers (the retired `general`) lands\n * on Ask BEFORE the shared panel's mount effects read it; see the hook. Called\n * here, above the panel, because that ordering is what makes it work.\n */\n useOfferedAssistantMode();\n\n /**\n * ★ Advisory, never a gate — see `useWorkspaceWriteAccess`. Gating on it\n * would remove api-calls from the product entirely until RBAC rows are\n * seeded. It warns before the effort instead of after it, and self-corrects\n * with no code change the moment those rows exist.\n */\n const writeAccess = useWorkspaceWriteAccess(getActorId(), getWorkspaceId() || null);\n\n return (\n <AssistantProductProvider {...VIBECONTROLS_ASSISTANT_PRODUCT}>\n <div className=\"flex flex-col h-full w-full min-h-0\">\n <AiCreditsMeter />\n <div className=\"flex-1 min-h-0\">\n <SharedAIAssistantPanel {...props} writeAccess={writeAccess} />\n </div>\n </div>\n </AssistantProductProvider>\n );\n};\n"],"mappings":";;;;;;;;;AAmDA,IAAa,KAA+C,MAAU;AAMpE,IAAyB;CAQzB,IAAM,IAAc,EAAwB,GAAY,EAAE,GAAgB,IAAI,KAAK;AAEnF,QACE,kBAAC,GAAD;EAA0B,GAAI;YAC5B,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAkB,CAAA,EAClB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAwB,GAAI;KAAoB;KAAe,CAAA;IAC3D,CAAA,CACF;;EACmB,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { ASSISTANT_MODES as e } from "../../types/assistant.js";
2
+ import { PRODUCT as t, reportAssistantTokenUsage as n } from "../../services/assistantApi.js";
3
+ import { describeCurrentPage as r, gatherPageContext as i } from "../../utils/pageContext.js";
4
+ import { buildPromptForMode as a } from "../../utils/assistantPrompt.js";
5
+ var o = {
6
+ product: t,
7
+ modes: e,
8
+ describeCurrentPage: r,
9
+ gatherPageContext: i,
10
+ buildPrompt: a,
11
+ reportTokenUsage: n,
12
+ storageFolders: {
13
+ attachments: "/VibeControls/AI Assistant/Attachments",
14
+ artifacts: "/VibeControls/AI Assistant/Artifacts"
15
+ }
16
+ };
17
+ //#endregion
18
+ export { o as VIBECONTROLS_ASSISTANT_PRODUCT };
19
+
20
+ //# sourceMappingURL=assistantProduct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistantProduct.js","names":[],"sources":["../../../src/components/assistant/assistantProduct.ts"],"sourcesContent":["/**\n * VibeControls' answers to the shared assistant's product seam, as one value.\n *\n * ★★ Every field of fe-libs' `AssistantProductProvider` is OPTIONAL, and a\n * missing one does not throw — it silently degrades. No `gatherPageContext`\n * sends every turn with no page context; no `buildPrompt` drops the\n * confirm-before-mutate guardrail and the language directive; no\n * `reportTokenUsage` meters nothing; no `storageFolders` starts a second folder\n * beside the one holding every saved attachment.\n *\n * So the value is typed `Required<…>` over the provider's own props: forgetting\n * a field, or fe-libs adding one, is a type error in this file rather than a\n * quiet regression in production. The wrapper spreads it into the provider, and\n * `assistantProduct.test.tsx` reads it back through fe-libs' real context.\n */\n\nimport type { AssistantProductProviderProps } from '@burdenoff/fe-libs/shared/assistant/product';\nimport { ASSISTANT_MODES } from '@/types/assistant';\nimport { PRODUCT, reportAssistantTokenUsage } from '@/services/assistantApi';\nimport { describeCurrentPage, gatherPageContext } from '@/utils/pageContext';\nimport { buildPromptForMode } from '@/utils/assistantPrompt';\n\n/**\n * Where this product's assistant files live.\n *\n * ★★ These strings are LOAD-BEARING once users have saved anything. They are the\n * real folders in the workspace file library holding every attachment and\n * artifact. Changing them does not fail — it starts a second folder beside the\n * first and orphans everything in the original.\n *\n * ★ Note the capitalisation: `/VibeControls/…`, while the product id is\n * `vibecontrols`. That mismatch is exactly why fe-libs cannot derive this and\n * why it is supplied here.\n */\nexport const STORAGE_FOLDERS = {\n attachments: '/VibeControls/AI Assistant/Attachments',\n artifacts: '/VibeControls/AI Assistant/Artifacts',\n} as const;\n\n/** Every seam field, required: the provider's props minus its children. */\nexport type VibeControlsAssistantProduct = Required<\n Omit<AssistantProductProviderProps, 'children'>\n>;\n\nexport const VIBECONTROLS_ASSISTANT_PRODUCT: VibeControlsAssistantProduct = {\n product: PRODUCT,\n modes: ASSISTANT_MODES,\n describeCurrentPage,\n gatherPageContext,\n buildPrompt: buildPromptForMode,\n reportTokenUsage: reportAssistantTokenUsage,\n storageFolders: STORAGE_FOLDERS,\n};\n"],"mappings":";;;;AA4CA,IAAa,IAA+D;CAC1E,SAAS;CACT,OAAO;CACP;CACA;CACA,aAAa;CACb,kBAAkB;CAClB,gBAjB6B;EAC7B,aAAa;EACb,WAAW;EACZ;CAeA"}
@@ -1,10 +1,2 @@
1
1
  import "./AIAssistantPanel.js";
2
- import "./AssistantChatInput.js";
3
2
  import "./ProductMarkdown.js";
4
- import "./AssistantMessageItem.js";
5
- import "./AssistantMessageList.js";
6
- import "./AssistantModeSelector.js";
7
- import "./AssistantWelcome.js";
8
- import "./AssistantChatArea.js";
9
- import "./AssistantConversationList.js";
10
- import "./AssistantExportMenu.js";
@@ -1,51 +1,48 @@
1
- //#region src/config/assistantUsecases.ts
2
1
  var e = [
3
2
  {
4
3
  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",
4
+ label: "Ask",
5
+ description: "Ask about VibeControls and your workspace. It reads your vibes, sessions and agents, explains what you are looking at and points you to the right page. Read-only.",
7
6
  suggestions: [
8
7
  "What can I do on this screen?",
9
- "Create a new vibe called demo",
10
8
  "List my recent sessions",
9
+ "Where do I manage my agents?",
11
10
  "How do tunnels work?"
12
11
  ]
13
12
  },
14
13
  {
15
14
  id: "api-calls",
16
- label: "API Calls",
17
- description: "Make API calls in context with the active product and your credentials",
15
+ label: "Take action",
16
+ description: "Let the assistant make changes for you: create vibes, rename them, stop sessions. It shows you each change and waits for your approval before anything is saved.",
18
17
  suggestions: [
19
- "Show me all API endpoints for sessions",
20
- "How do I create an agent via the API?",
21
- "List vibes using the REST API",
22
- "What headers are needed for authentication?"
23
- ]
18
+ "Create a new vibe called demo",
19
+ "Rename one of my vibes",
20
+ "Stop a session I no longer need",
21
+ "List my recent sessions"
22
+ ],
23
+ requiresAdmin: !0,
24
+ writeCapable: !0
24
25
  },
25
26
  {
26
27
  id: "vibe-plugins",
27
- label: "Vibe Plugins",
28
- description: "Build and learn about Vibe Plugins for extending VibeControls",
28
+ label: "Build",
29
+ description: "Build a Vibe Plugin that extends VibeControls. The assistant scaffolds and compiles it from the platform guides and gives you the files to download.",
29
30
  suggestions: [
30
31
  "How do I create a new Vibe Plugin?",
31
32
  "What is the plugin manifest structure?",
32
33
  "Explain the plugin lifecycle hooks",
33
34
  "Show me a plugin example with frontend UI"
34
- ]
35
- },
36
- {
37
- id: "general",
38
- label: "General",
39
- description: "General help with VibeControls concepts and features",
40
- suggestions: [
41
- "What is a Vibe in VibeControls?",
42
- "How do agents connect to the platform?",
43
- "Explain the session lifecycle",
44
- "What are tunnels used for?"
45
- ]
35
+ ],
36
+ requiresAdmin: !0
46
37
  }
47
- ];
38
+ ], t = "assistant";
39
+ function n(t) {
40
+ return e.some((e) => e.id === t);
41
+ }
42
+ function r(e) {
43
+ return n(e) ? e : t;
44
+ }
48
45
  //#endregion
49
- export { e as ASSISTANT_USECASE_CONFIG };
46
+ export { e as ASSISTANT_USECASE_CONFIG, r as resolveOfferedMode };
50
47
 
51
48
  //# sourceMappingURL=assistantUsecases.js.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"assistantUsecases.js","names":[],"sources":["../../src/config/assistantUsecases.ts"],"sourcesContent":["/**\n * VibeControls AI assistant modes.\n *\n * ★ These are the modes the shared fe-libs panel OFFERS. The panel filters them\n * again at runtime: a `requiresAdmin` mode is shown only to a confirmed org\n * Owner/Admin (`myRoles`), and the first switch into a `writeCapable` mode opens\n * the one-time consent dialog. Both are enforced in fe-libs\n * (`shared/assistant/ui/AssistantChatArea`); what is decided HERE is which modes\n * carry the flags. Same mechanism as HealthyBowl's `assistantUsecases.ts`.\n *\n * assistant \"Ask\". Every member. The sandbox runs with\n * AI_ASSISTANT_READONLY, so its GraphQL helper refuses mutations.\n * api-calls \"Take action\". Admins only. Writes through the gateway, and\n * the sandbox runs with AI_ASSISTANT_CONFIRM_WRITES, so each\n * write waits for the user's approval.\n * vibe-plugins \"Build\". Admins only. Builds plugin artifacts, but its sandbox\n * is NOT read-only; see the note on BUILD below. Not flagged\n * `writeCapable` (yet), for the reason given there.\n *\n * ★★ `general` is gone. A stored `general`, or any mode not listed here, lands\n * on Ask; see `resolveOfferedMode` and `useOfferedAssistantMode`.\n *\n * ★ The mode IDs are transport values and must not be renamed: they choose the\n * sandbox image, its environment and the agent's persona. Only labels change.\n */\n\nexport interface AssistantUsecase {\n id: string;\n label: string;\n description: string;\n suggestions: readonly string[];\n /** Only offered to a global Owner/Admin (see fe-libs `useAssistantApiAccess`). */\n requiresAdmin?: boolean;\n /** Can change live data, so the consent dialog and the composer's write-access warning apply. */\n writeCapable?: boolean;\n}\n\n/**\n * \"Ask\": read-only, for everyone.\n *\n * ★★ The copy must not promise a write. This mode's sandbox refuses every\n * mutation, so \"Create a new vibe called demo\", the suggestion it used to carry,\n * could only ever end in a refusal after the user had waited for a sandbox.\n * `assistantUsecases.test.ts` fails on write verbs anywhere in this copy.\n */\nconst ASK = {\n id: 'assistant',\n label: 'Ask',\n description:\n 'Ask about VibeControls and your workspace. It reads your vibes, sessions and agents, explains what you are looking at and points you to the right page. Read-only.',\n suggestions: [\n 'What can I do on this screen?',\n 'List my recent sessions',\n 'Where do I manage my agents?',\n 'How do tunnels work?',\n ],\n} as const satisfies AssistantUsecase;\n\n/** \"Take action\": the write mode. Admin-only, consent on first switch, approval per write. */\nconst TAKE_ACTION = {\n // Display label only; the mode ID stays 'api-calls'.\n id: 'api-calls',\n label: 'Take action',\n description:\n 'Let the assistant make changes for you: create vibes, rename them, stop sessions. It shows you each change and waits for your approval before anything is saved.',\n suggestions: [\n 'Create a new vibe called demo',\n 'Rename one of my vibes',\n 'Stop a session I no longer need',\n 'List my recent sessions',\n ],\n requiresAdmin: true,\n writeCapable: true,\n} as const satisfies AssistantUsecase;\n\n/**\n * \"Build\": Vibe Plugin authoring. Admin-only.\n *\n * ★★ Why admin-only, when its job is producing plugin files: the sandbox is\n * not confined to that job, and can write.\n * - fe-libs forwards the user's own access and workspace tokens on EVERY proxy\n * request, whatever the mode (`shared/assistant/api.ts`, `proxyToSandbox`).\n * - wspace-sandbox-svc passes them into the sandbox for every assistant mode\n * (`ensureAssistantProxyAccess`, `X-AI-Assistant-Auth-Token`).\n * - ai-assistant keeps them whenever the sandbox holds no delegated app\n * credentials, which `vibe-plugins` never does (proxy-token auth), and its\n * GraphQL helper then authenticates as the user (`api-auth.ts`).\n * - The mode has `bash`, the gateway URLs are in its environment, and it gets\n * NEITHER brake: AI_ASSISTANT_READONLY is set only for `assistant`,\n * AI_ASSISTANT_CONFIRM_WRITES only for `api-calls`.\n * So it can change workspace data within the user's own permissions, and\n * decision D4 makes every such mode admin-only.\n *\n * ★★ Why NOT `writeCapable`, although it can write: in fe-libs (2026.914.3 and\n * earlier) that flag routes the first switch into the mode through\n * `AssistantApiCallsConsentDialog`, whose copy is written for Take action only.\n * It is titled \"Switch to Take action mode?\", its button reads \"Enable Take\n * action\", and it promises the assistant will ask before making a change. For\n * Build all three are false: no AI_ASSISTANT_CONFIRM_WRITES, no confirm\n * preamble. Its one `apiCallsAcknowledged` flag also covers every\n * `writeCapable` mode, so accepting it from Build would skip Take action's real\n * consent. Showing no dialog is more honest than showing that one. The cost:\n * the composer's write-access warning (`writeAccessDenied`) no longer shows in\n * Build. Restore the flag once fe-libs words the dialog, and keeps the\n * acknowledgment, per mode; `assistantUsecases.test.ts` fails when the dialog\n * stops naming Take action, as a reminder.\n *\n * ★ The flags gate the UI; they add no sandbox brake. That is why this copy\n * claims no approval step for the mode: the sandbox does not enforce one.\n */\nconst BUILD = {\n id: 'vibe-plugins',\n label: 'Build',\n description:\n 'Build a Vibe Plugin that extends VibeControls. The assistant scaffolds and compiles it from the platform guides and gives you the files to download.',\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 requiresAdmin: true,\n} as const satisfies AssistantUsecase;\n\nexport const ASSISTANT_USECASE_CONFIG = [ASK, TAKE_ACTION, BUILD] as const;\n\nexport type AssistantUsecaseId = (typeof ASSISTANT_USECASE_CONFIG)[number]['id'];\n\n/**\n * Where a user lands when their mode is not offered.\n *\n * ★ The same literal fe-libs falls back to (`AssistantChatArea` resets to\n * `\"assistant\"` once the role check settles). Typed as a mode ID, so removing\n * Ask from the list above fails the typecheck here.\n */\nexport const DEFAULT_ASSISTANT_MODE: AssistantUsecaseId = 'assistant';\n\nfunction isOfferedMode(mode: unknown): mode is AssistantUsecaseId {\n return ASSISTANT_USECASE_CONFIG.some((config) => config.id === mode);\n}\n\n/**\n * The mode to use for a stored one: itself when this product offers it, Ask\n * when it does not (a retired `general`, another product's mode, a corrupt\n * value).\n *\n * ★ It answers only \"does this mode EXIST here\". Whether the user may use an\n * admin-only mode is the role check's question and stays with fe-libs: resetting\n * an admin's stored Take action here, before `myRoles` answers, would throw them\n * out of that mode on every reload.\n */\nexport function resolveOfferedMode(mode: unknown): AssistantUsecaseId {\n return isOfferedMode(mode) ? mode : DEFAULT_ASSISTANT_MODE;\n}\n"],"mappings":"AA4HA,IAAa,IAA2B;CA/E5B;EACV,IAAI;EACJ,OAAO;EACP,aACE;EACF,aAAa;GACX;GACA;GACA;GACA;GACD;EACF;CAGmB;EAElB,IAAI;EACJ,OAAO;EACP,aACE;EACF,aAAa;GACX;GACA;GACA;GACA;GACD;EACD,eAAe;EACf,cAAc;EACf;CAqCa;EACZ,IAAI;EACJ,OAAO;EACP,aACE;EACF,aAAa;GACX;GACA;GACA;GACA;GACD;EACD,eAAe;EAChB;CAEgE,EAWpD,IAA6C;AAE1D,SAAS,EAAc,GAA2C;AAChE,QAAO,EAAyB,MAAM,MAAW,EAAO,OAAO,EAAK;;AAatE,SAAgB,EAAmB,GAAmC;AACpE,QAAO,EAAc,EAAK,GAAG,IAAO"}
@@ -0,0 +1,17 @@
1
+ import { resolveOfferedMode as e } from "../config/assistantUsecases.js";
2
+ import { useLayoutEffect as t } from "react";
3
+ import { useAssistantStore as n } from "@burdenoff/fe-libs/shared/assistant/store";
4
+ //#region src/hooks/useOfferedAssistantMode.ts
5
+ function r(t) {
6
+ let r = e(t);
7
+ r !== t && n.getState().setMode(r);
8
+ }
9
+ function i() {
10
+ t(() => (r(n.getState().mode), n.subscribe((e, t) => {
11
+ e.mode !== t.mode && r(e.mode);
12
+ })), []);
13
+ }
14
+ //#endregion
15
+ export { i as useOfferedAssistantMode };
16
+
17
+ //# sourceMappingURL=useOfferedAssistantMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOfferedAssistantMode.js","names":[],"sources":["../../src/hooks/useOfferedAssistantMode.ts"],"sourcesContent":["/**\n * useOfferedAssistantMode\n *\n * Keeps the SHARED assistant store's mode on one VibeControls offers. A stored\n * mode that no longer exists (the retired `general`, from before Ask / Take\n * action / Build) is moved to Ask the moment it is seen: at mount, after a\n * profile rehydrates the store, and when an old conversation is reopened\n * (`setActiveConversation` copies that conversation's mode into the store).\n *\n * ★★ Why the product does this when fe-libs already resets unknown modes.\n * fe-libs' reset in `AssistantChatArea` runs only AFTER the `myRoles` check\n * settles, because the same effect also resets admin-only modes and must not\n * throw an admin out of Take action while the check is in flight. Until then\n * the store still holds `general`, and a send in that window starts a turn in\n * it. Get help makes the window real: it queues a prompt that the chat area\n * sends from its MOUNT effect, before any role response can arrive. This hook\n * closes the window for modes that do not exist, and leaves the admin question\n * to fe-libs.\n *\n * ★ A LAYOUT effect, deliberately. The shared panel is a child of the component\n * calling this, and React runs every layout effect before any passive effect,\n * so the store is corrected before the chat area's mount effect reads it. A\n * plain `useEffect` here runs AFTER the child's, which is the bug.\n * `useOfferedAssistantMode.test.tsx` pins that order.\n *\n * ★ It subscribes to the store rather than selecting from it, so the wrapper\n * does not re-render the whole panel on every mode change just to check it.\n */\nimport { useLayoutEffect } from 'react';\n/**\n * ★ The SHARED store, from the DEEP subpath. The panel VibeControls mounts reads\n * its mode from here, and it is the only assistant store there is. The barrel\n * would pull react-markdown in too.\n */\nimport { useAssistantStore } from '@burdenoff/fe-libs/shared/assistant/store';\nimport { resolveOfferedMode } from '@/config/assistantUsecases';\n\nfunction landOnOfferedMode(mode: string): void {\n const offered = resolveOfferedMode(mode);\n if (offered !== mode) useAssistantStore.getState().setMode(offered);\n}\n\nexport function useOfferedAssistantMode(): void {\n useLayoutEffect(() => {\n landOnOfferedMode(useAssistantStore.getState().mode);\n return useAssistantStore.subscribe((state, previous) => {\n if (state.mode !== previous.mode) landOnOfferedMode(state.mode);\n });\n }, []);\n}\n"],"mappings":";;;;AAqCA,SAAS,EAAkB,GAAoB;CAC7C,IAAM,IAAU,EAAmB,EAAK;AACxC,CAAI,MAAY,KAAM,EAAkB,UAAU,CAAC,QAAQ,EAAQ;;AAGrE,SAAgB,IAAgC;AAC9C,UACE,EAAkB,EAAkB,UAAU,CAAC,KAAK,EAC7C,EAAkB,WAAW,GAAO,MAAa;AACtD,EAAI,EAAM,SAAS,EAAS,QAAM,EAAkB,EAAM,KAAK;GAC/D,GACD,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useOpenAssistantHelp.js","names":[],"sources":["../../src/hooks/useOpenAssistantHelp.ts"],"sourcesContent":["/**\n * useOpenAssistantHelp\n *\n * Returns a callback that opens the AI assistant panel (via the shell's\n * global `vc:toggle-ai-assistant` event) and queues a prompt that the chat\n * area will auto-send on next render. It deliberately leaves the MODE alone —\n * see the note in the callback.\n *\n * Used by the shared `GetHelpButton` that appears next to \"Add X\" buttons\n * in empty states so users can ask the assistant to explain concepts like\n * \"What is a Target?\" without any typing.\n */\nimport { useCallback } from 'react';\n/**\n * ★★ The SHARED store, not `@/store/assistantStore`.\n *\n * The panel this product mounts is fe-libs' `AIAssistantPanel`, and its chat\n * area consumes `pendingPrompt` from `fe-libs/shared/assistant/store`. The local\n * store is the pre-migration fork's: a prompt queued there was persisted under\n * `vc-ai-assistant` and read by nobody, so every Get Help button opened an\n * empty panel.\n *\n * ★ Imported from the DEEP subpath, not the barrel. The barrel star-exports the\n * panel components and pulls react-markdown in with them.\n */\nimport { useAssistantStore } from '@burdenoff/fe-libs/shared/assistant/store';\n\nexport function useOpenAssistantHelp() {\n return useCallback((prompt: string) => {\n // ★ Do NOT change the mode.\n //\n // This used to force `general`. That call went to the fork's store, so it\n // never reached the shared panel; moved across with the queue it would take\n // effect for the first time. The shared store PERSISTS `mode`, so one press\n // of a Get Help button would silently move the user out of the mode they\n // chose — Assistant, API Calls, Vibe Plugins — for every later turn too.\n //\n // Whatever mode the user is in already answers \"what is this page for\".\n //\n // Open FIRST, queue on the next macrotask. This is a contract, pinned by the\n // test \"the prompt is not queued until after the open event\", not a race\n // guard. The chat area picks the prompt up in either order: its\n // `pendingPrompt` subscriber if it is mounted, its mount-time\n // `consumePendingPrompt()` if it mounts later. `pendingPrompt` is not\n // persisted, so rehydration cannot clear it.\n //\n // The ordering matters only for a shell that toggles and ignores `open`.\n // Pressed with the panel open, that shell closes it; a prompt queued in the\n // same tick would reach the still-mounted chat area and start a turn in a\n // panel about to unmount. Queued a macrotask later, it waits in the store\n // and is sent on the next open.\n //\n // `open: true` OPENS; it does not toggle. vibecontrols-app's overlay honours\n // it from BOFF-7292, so pressed with the panel already open it stays open.\n window.dispatchEvent(\n new CustomEvent('vc:toggle-ai-assistant', {\n detail: { open: true },\n })\n );\n setTimeout(() => {\n useAssistantStore.getState().submitPrompt(prompt);\n }, 0);\n }, []);\n}\n"],"mappings":";;;AA2BA,SAAgB,IAAuB;AACrC,QAAO,GAAa,MAAmB;AA+BrC,EALA,OAAO,cACL,IAAI,YAAY,0BAA0B,EACxC,QAAQ,EAAE,MAAM,IAAM,EACvB,CAAC,CACH,EACD,iBAAiB;AACf,KAAkB,UAAU,CAAC,aAAa,EAAO;KAChD,EAAE;IACJ,EAAE,CAAC"}
1
+ {"version":3,"file":"useOpenAssistantHelp.js","names":[],"sources":["../../src/hooks/useOpenAssistantHelp.ts"],"sourcesContent":["/**\n * useOpenAssistantHelp\n *\n * Returns a callback that opens the AI assistant panel (via the shell's\n * global `vc:toggle-ai-assistant` event) and queues a prompt that the chat\n * area will auto-send on next render. It deliberately leaves the MODE alone —\n * see the note in the callback.\n *\n * Used by the shared `GetHelpButton` that appears next to \"Add X\" buttons\n * in empty states so users can ask the assistant to explain concepts like\n * \"What is a Target?\" without any typing.\n */\nimport { useCallback } from 'react';\n/**\n * ★★ The SHARED store, the only assistant store there is.\n *\n * The panel this product mounts is fe-libs' `AIAssistantPanel`, and its chat\n * area consumes `pendingPrompt` from `fe-libs/shared/assistant/store`. This hook\n * used to queue into the pre-migration fork's own store, persisted and read by\n * nobody, so every Get Help button opened an empty panel. That store is deleted.\n *\n * ★ Imported from the DEEP subpath, not the barrel. The barrel star-exports the\n * panel components and pulls react-markdown in with them.\n */\nimport { useAssistantStore } from '@burdenoff/fe-libs/shared/assistant/store';\n\nexport function useOpenAssistantHelp() {\n return useCallback((prompt: string) => {\n // ★ Do NOT change the mode.\n //\n // This used to force `general`. That call went to the fork's store, so it\n // never reached the shared panel; moved across with the queue it would take\n // effect for the first time. The shared store PERSISTS `mode`, so one press\n // of a Get Help button would silently move the user out of the mode they\n // chose — Ask, Take action, Build — for every later turn too.\n //\n // Whatever mode the user is in already answers \"what is this page for\".\n //\n // Open FIRST, queue on the next macrotask. This is a contract, pinned by the\n // test \"the prompt is not queued until after the open event\", not a race\n // guard. The chat area picks the prompt up in either order: its\n // `pendingPrompt` subscriber if it is mounted, its mount-time\n // `consumePendingPrompt()` if it mounts later. `pendingPrompt` is not\n // persisted, so rehydration cannot clear it.\n //\n // The ordering matters only for a shell that toggles and ignores `open`.\n // Pressed with the panel open, that shell closes it; a prompt queued in the\n // same tick would reach the still-mounted chat area and start a turn in a\n // panel about to unmount. Queued a macrotask later, it waits in the store\n // and is sent on the next open.\n //\n // `open: true` OPENS; it does not toggle. vibecontrols-app's overlay honours\n // it from BOFF-7292, so pressed with the panel already open it stays open.\n window.dispatchEvent(\n new CustomEvent('vc:toggle-ai-assistant', {\n detail: { open: true },\n })\n );\n setTimeout(() => {\n useAssistantStore.getState().submitPrompt(prompt);\n }, 0);\n }, []);\n}\n"],"mappings":";;;AA0BA,SAAgB,IAAuB;AACrC,QAAO,GAAa,MAAmB;AA+BrC,EALA,OAAO,cACL,IAAI,YAAY,0BAA0B,EACxC,QAAQ,EAAE,MAAM,IAAM,EACvB,CAAC,CACH,EACD,iBAAiB;AACf,KAAkB,UAAU,CAAC,aAAa,EAAO;KAChD,EAAE;IACJ,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -4,9 +4,8 @@ import { useVibeControlsStore as Uv } from "./store/vibeControlsStore.js";
4
4
  import { VibeControlsRoot as Wv } from "./VibeControlsRoot.js";
5
5
  import { config as Gv, resetVibeControlsConfig as Kv, setVibeControlsConfig as qv } from "./config/index.js";
6
6
  import { AIAssistantPanel as Jv } from "./components/assistant/AIAssistantPanel.js";
7
- import { useAssistantStore as Yv } from "./store/assistantStore.js";
8
7
  import "./components/assistant/index.js";
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 { Jv 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 BulkRestartSessionsDocument, V as BulkSetConfigurationsDocument, H as BulkStopSessionsDocument, U as BulkTerminateSessionsDocument, W as CatalogFieldsFragmentDoc, G as CatalogUpdatedDocument, K as CheckAiCreditsDocument, q as CheckSessionHealthDocument, J as CollaboratorJoinedDocument, Y as CollaboratorLeftDocument, X as CompileDocsSiteDocument, Z as ComponentFieldsFragmentDoc, Q as ConfigurationChangedDocument, $ as ConfigurationFieldsFragmentDoc, ee as ConnectAgentToTargetDocument, te as CreateActionDocument, ne as CreateAgentDocument, re as CreateAgentInstructionFileDocument, ie as CreateAgentMessageBookmarkDocument, ae as CreateAiContextDocument, oe as CreateCatalogDocument, se as CreateComponentDocument, ce as CreateDocsPageDocument, le as CreateDocsSiteDocument, ue as CreateNoteDocument, de as CreateNoteTagDocument, fe as CreateSandboxDocument, pe as CreateSessionDocument, me as CreateSessionShareLinkDocument, he as CreateTargetDocument, ge as CreateTunnelDocument, _e as CreateVibeCalendarTaskDocument, ve as CreateVibeDeckButtonDocument, ye as CreateVibeDeckDocument, be as CreateVibeDeckShareLinkDocument, xe as CreateVibeDocument, Se as CreateWebhookDocument, Ce as DeactivateAgentDocument, we as DeleteActionDocument, Te as DeleteAgentDocument, Ee as DeleteAgentInstructionFileDocument, De as DeleteAgentMessageBookmarkDocument, Oe as DeleteAiContextDocument, ke as DeleteCatalogDocument, Ae as DeleteComponentDocument, je as DeleteConfigurationDocument, Me as DeleteDeploymentDocument, Ne as DeleteDocsPageDocument, Pe as DeleteDocsSiteDocument, Fe as DeleteNoteDocument, Ie as DeleteSettingsSecretDocument, Le as DeleteTargetDocument, Re as DeleteTemplateDocument, ze as DeleteTunnelDocument, Be as DeleteTunnelDomainDocument, Ve as DeleteVibeCalendarTaskDocument, He as DeleteVibeDeckButtonDocument, Ue as DeleteVibeDeckDocument, We as DeleteVibeDocument, Ge as DeleteVibeEnvVarDocument, Ke as DeleteWebhookDocument, qe as DeployAgentViaMeshDocument, Je as DetachAgentFromVibeDocument, Ye as DetachTunnelDomainDocument, Xe as DisableDocsBuildImageDocument, Ze as DisconnectAgentFromTargetDocument, Qe as DocsContentDocument, $e as DuplicateActionDocument, et as DuplicateVibeDeckDocument, tt as EntityTagPickerAssignmentFieldsFragmentDoc, nt as EntityTagPickerAvailableTagFieldsFragmentDoc, rt as EntityTagPickerAvailableTagsDocument, it as EntityTagPickerCreateTagDocument, at as EntityTagPickerGetEntityTagsDocument, ot as EntityTagPickerSearchTagsDocument, st as EntityTagPickerTagEntityDocument, ct as EntityTagPickerUntagEntityDocument, lt as ExecuteActionDocument, ut as ExecuteAgentMeshRequestDocument, dt as ExecuteScheduledJobNowDocument, ft as ExecuteSharedVibeDeckButtonDocument, pt as ExecuteVibeDeckButtonDocument, mt as ExportSessionsDocument, ht as ExportVibeAuditLogsDocument, gt as ExtendSandboxTtlDocument, _t as ForkGitHubRepoDocument, vt as GenerateAgentGraphContextUrlDocument, yt as GenerateDocsSignedUrlDocument, bt as GenerateVibeLlmContextUrlDocument, xt as GetActionDocument, St as GetActiveSandboxesDocument, Ct as GetAgentConnectionEventsDocument, wt as GetAgentDocument, Tt as GetAgentGraphDocument, Et as GetAgentInstructionFileDocument, Dt as GetAgentMeshGraphDocument, Ot as GetAiContextDocument, kt as GetCatalogDependencyGraphDocument, At as GetCatalogDocument, jt as GetCatalogSbomDocument, Mt as GetComponentDeploymentsDocument, Nt as GetComponentDocument, Pt as GetConfigurationDocument, Ft as GetConfigurationValueDocument, It as GetDefaultVibeDeckDocument, Lt as GetDocsRevisionDocument, Rt as GetDocsSiteDocument, zt as GetEnvTopologyDocument, Bt as GetFileDownloadUrlDocument, Vt as GetInstallAgentJobStatusDocument, Ht as GetNoteDocument, Ut as GetNoteTagsDocument, Wt as GetRecentSandboxActivityDocument, Gt as GetSandboxDocument, Kt as GetSandboxStatsDocument, qt as GetScheduledJobDetailDocument, Jt as GetScheduledJobsForCalendarDocument, Yt as GetSchedulerMetricsForAnalyticsDocument, Xt as GetScorecardDocument, Zt as GetScorecardMetricHistoryDocument, Qt as GetScorecardPushTokenInfoDocument, $t as GetScorecardTemplatesDocument, en as GetScorecardsDocument, tn as GetSessionCollaboratorsDocument, nn as GetSessionConnectionEventsDocument, rn as GetSessionDocument, an as GetSessionShareLinksDocument, on as GetSessionSharesDocument, sn as GetSessionsSharedWithMeDocument, cn as GetSharedVibeDeckDocument, ln as GetTargetDocument, un as GetTemplateDocument, dn as GetTunnelAuditDocument, fn as GetTunnelBySlugDocument, pn as GetTunnelDocument, mn as GetTunnelUsageDocument, hn as GetUiSessionDocument, gn as GetVibeAuditLogDocument, _n as GetVibeAuditLogStatsDocument, vn as GetVibeCalendarTaskDocument, yn as GetVibeCatalogsDocument, bn as GetVibeDeckDocument, xn as GetVibeDocsSiteDocument, Sn as GetVibeDocument, Cn as GetVibeEnvVarsDocument, wn as GetVibeFeatureCatalogDocument, Tn as GetVibeFeatureFlagsDocument, En as GetVibeLinkedEntitiesDocument, Dn as GetVibeLinkedSandboxesDocument, On as GetVibeLinkedScheduledJobsDocument, kn as GetWebhookDocument, An as GetWorkspaceFilesDocument, jn as ImportTargetsFromConfigDocument, Mn as InstallAgentOnTargetDocument, Nn as InstallAgentPluginDocument, Pn as InstantiateTemplateDocument, Fn as InstructionFileFieldsFragmentDoc, In as IssueTunnelSessionDocument, Ln as JoinSharedSessionDocument, Rn as LeaveSharedSessionDocument, zn as LinkEntityToVibeDocument, Bn as ListActionExecutionsDocument, Vn as ListActionsDocument, Hn as ListActiveConnectionsDocument, Un as ListActiveTunnelsWithSessionsDocument, Wn as ListAgentInstructionFilesDocument, Gn as ListAgentProfilesDocument, Kn as ListAgentsDocument, qn as ListAiContextsDocument, Jn as ListAiPromptsDocument, Yn as ListAllComponentsForCatalogDocument, Xn as ListCatalogsDocument, Zn as ListComponentsDocument, Qn as ListConfigurationsDocument, $n as ListDocsBuildImagesDocument, er as ListNotesDocument, tr as ListSessionsDocument, nr as ListTargetsDocument, rr as ListTemplatesDocument, ir as ListTunnelDomainsDocument, ar as ListTunnelProvidersDocument, or as ListTunnelSessionsDocument, sr as ListTunnelsDocument, cr as ListVibeAuditLogsDocument, lr as ListVibeCalendarExecutionsDocument, ur as ListVibeCalendarTasksDocument, dr as ListVibeDeckButtonsDocument, fr as ListVibeDeckShareLinksDocument, pr as ListVibeDecksDocument, mr as ListVibesDocument, hr as ListWebhooksDocument, gr as MeshAgentFieldsFragmentDoc, _r as MeshDeployJobStatusDocument, vr as MintAgentCapabilityDocument, yr as MoveVibeDeckButtonDocument, br as MoveVibeDocument, xr as MyAgentMessageBookmarksDocument, Sr as MySettingsByCategoryDocument, Cr as MySettingsDocument, wr as MyVibeLlmContextPreviewDocument, Tr as MyVibeLlmContextSettingsDocument, Er as MyVibeLlmContextTokenAuditsDocument, Dr as MyVibeLlmContextTokensDocument, Or as NoteFieldsFragmentDoc, kr as NoteTagAssignmentFieldsFragmentDoc, Ar as NukeVibecontrolsAgentDocument, jr as OnVibeAuditLogCreatedDocument, Mr as OverviewSummaryDocument, Nr as PinNoteDocument, Pr as PinnedNotesDocument, Fr as ProbeAgentConnectionDocument, Ir as ProbeAgentTunnelDocument, Lr as PromoteDeploymentDocument, Rr as ProxySandboxRequestDocument, zr as PublishComponentAsTemplateDocument, Br as PushAgentGatewayAuthDocument, Vr as RecentAiToolEventsStreamDocument, Hr as RegisterCustomTunnelDomainDocument, Ur as RegisterDeploymentDocument, Wr as RegisterDocsBuildImageDocument, Gr as RegisterInstalledAgentDocument, Kr as ReleaseSessionControlDocument, qr as RemoveAgentPluginDocument, Jr as RemoveComponentFromCatalogDocument, Yr as RemoveScorecardMetricDocument, Xr as RemoveVibeFromCatalogDocument, Zr as RenderAiPromptDocument, Qr as ReorderVibeDeckButtonsDocument, $r as ReplaceNoteTagsDocument, ei as ReportAiTokenUsageDocument, ti as RequestSessionControlDocument, ni as ReserveTunnelSubdomainDocument, ri as ResetSettingsDocument, ii as ResetWebhookFailuresDocument, ai as RestartSessionDocument, oi as RestartSessionTerminalDocument, si as RestoreVibeDocument, ci as RevokeAgentMeshLinkDocument, li as RevokeAllMyVibeLlmContextTokensDocument, ui as RevokeSessionShareDocument, di as RevokeSessionShareLinkDocument, fi as RevokeTunnelPublicAccessDocument, pi as RevokeTunnelSessionDocument, mi as RevokeVibeDeckShareLinkDocument, hi as RevokeVibeLlmContextTokenDocument, gi as RollbackDocsRevisionDocument, _i as RotateAgentApiKeyDocument, vi as RotateScorecardPushTokenDocument, yi as RotateTunnelCredentialsDocument, bi as RotateVibeLlmContextUrlDocument, xi as RunAgentCommandDocument, Si as SaveUiSessionDocument, Ci as ScanSshConfigDocument, wi as ScorecardFieldsFragmentDoc, Ti as ScorecardMetricFieldsFragmentDoc, Ei as ScorecardTemplateFieldsFragmentDoc, Di as SearchNotesDocument, Oi as SendSessionInputDocument, ki as SessionCollaboratorFieldsFragmentDoc, Ai as SessionControlChangedDocument, ji as SessionFieldsFragmentDoc, Mi as SessionHistoryRecordingEnabledDocument, Ni as SessionOutputReceivedDocument, Pi as SessionShareFieldsFragmentDoc, Fi as SessionShareLinkFieldsFragmentDoc, Ii as SessionSharedWithMeDocument, Li as SessionStatusChangedDocument, Ri as SetAgentApiKeyDocument, zi as SetAgentAutoUpdateDocument, Bi as SetAgentPlaygroundConfigDocument, Vi as SetAgentVisibilityDocument, 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, Yv as useAssistantStore, Ws as useAttachAgentToVibeMutation, Gs as useAttachTunnelDomainMutation, Ks as useAvailableNoteTagsLazyQuery, qs as useAvailableNoteTagsQuery, Js as useAvailableNoteTagsSuspenseQuery, Ys as useBulkRestartSessionsMutation, Xs as useBulkSetConfigurationsMutation, Zs as useBulkStopSessionsMutation, Qs as useBulkTerminateSessionsMutation, $s as useCatalogUpdatedSubscription, ec as useCheckAiCreditsMutation, tc as useCheckSessionHealthMutation, nc as useCollaboratorJoinedSubscription, rc as useCollaboratorLeftSubscription, ic as useCompileDocsSiteMutation, ac as useConfigurationChangedSubscription, oc as useConnectAgentToTargetMutation, sc as useCreateActionMutation, cc as useCreateAgentInstructionFileMutation, lc as useCreateAgentMessageBookmarkMutation, uc as useCreateAgentMutation, dc as useCreateAiContextMutation, fc as useCreateCatalogMutation, pc as useCreateComponentMutation, mc as useCreateDocsPageMutation, hc as useCreateDocsSiteMutation, gc as useCreateNoteMutation, _c as useCreateNoteTagMutation, vc as useCreateSandboxMutation, yc as useCreateSessionMutation, bc as useCreateSessionShareLinkMutation, xc as useCreateTargetMutation, Sc as useCreateTunnelMutation, Cc as useCreateVibeCalendarTaskMutation, wc as useCreateVibeDeckButtonMutation, Tc as useCreateVibeDeckMutation, Ec as useCreateVibeDeckShareLinkMutation, Dc as useCreateVibeMutation, Oc as useCreateWebhookMutation, kc as useDeactivateAgentMutation, Ac as useDeleteActionMutation, jc as useDeleteAgentInstructionFileMutation, Mc as useDeleteAgentMessageBookmarkMutation, Nc as useDeleteAgentMutation, Pc as useDeleteAiContextMutation, Fc as useDeleteCatalogMutation, Ic as useDeleteComponentMutation, Lc as useDeleteConfigurationMutation, Rc as useDeleteDeploymentMutation, zc as useDeleteDocsPageMutation, Bc as useDeleteDocsSiteMutation, Vc as useDeleteNoteMutation, Hc as useDeleteSettingsSecretMutation, Uc as useDeleteTargetMutation, Wc as useDeleteTemplateMutation, Gc as useDeleteTunnelDomainMutation, Kc as useDeleteTunnelMutation, qc as useDeleteVibeCalendarTaskMutation, Jc as useDeleteVibeDeckButtonMutation, Yc as useDeleteVibeDeckMutation, Xc as useDeleteVibeEnvVarMutation, Zc as useDeleteVibeMutation, Qc as useDeleteWebhookMutation, $c as useDeployAgentViaMeshMutation, el as useDetachAgentFromVibeMutation, tl as useDetachTunnelDomainMutation, nl as useDisableDocsBuildImageMutation, rl as useDisconnectAgentFromTargetMutation, il as useDocsContentLazyQuery, al as useDocsContentQuery, ol as useDocsContentSuspenseQuery, sl as useDuplicateActionMutation, cl as useDuplicateVibeDeckMutation, ll as useEntityTagPickerAvailableTagsLazyQuery, ul as useEntityTagPickerAvailableTagsQuery, dl as useEntityTagPickerAvailableTagsSuspenseQuery, fl as useEntityTagPickerCreateTagMutation, pl as useEntityTagPickerGetEntityTagsLazyQuery, ml as useEntityTagPickerGetEntityTagsQuery, hl as useEntityTagPickerGetEntityTagsSuspenseQuery, gl as useEntityTagPickerSearchTagsLazyQuery, _l as useEntityTagPickerSearchTagsQuery, vl as useEntityTagPickerSearchTagsSuspenseQuery, yl as useEntityTagPickerTagEntityMutation, bl as useEntityTagPickerUntagEntityMutation, xl as useExecuteActionMutation, Sl as useExecuteAgentMeshRequestMutation, Cl as useExecuteScheduledJobNowMutation, wl as useExecuteSharedVibeDeckButtonMutation, Tl as useExecuteVibeDeckButtonMutation, El as useExportSessionsMutation, Dl as useExportVibeAuditLogsMutation, Ol as useExtendSandboxTtlMutation, kl as useForkGitHubRepoMutation, Al as useGenerateAgentGraphContextUrlMutation, jl as useGenerateDocsSignedUrlMutation, Ml as useGenerateVibeLlmContextUrlMutation, Nl as useGetActionLazyQuery, Pl as useGetActionQuery, Fl as useGetActionSuspenseQuery, Il as useGetActiveSandboxesLazyQuery, Ll as useGetActiveSandboxesQuery, Rl as useGetActiveSandboxesSuspenseQuery, zl as useGetAgentConnectionEventsLazyQuery, Bl as useGetAgentConnectionEventsQuery, Vl as useGetAgentConnectionEventsSuspenseQuery, Hl as useGetAgentGraphLazyQuery, Ul as useGetAgentGraphQuery, Wl as useGetAgentGraphSuspenseQuery, Gl as useGetAgentInstructionFileLazyQuery, Kl as useGetAgentInstructionFileQuery, ql as useGetAgentInstructionFileSuspenseQuery, Jl as useGetAgentLazyQuery, Yl as useGetAgentMeshGraphLazyQuery, Xl as useGetAgentMeshGraphQuery, Zl as useGetAgentMeshGraphSuspenseQuery, Ql as useGetAgentQuery, $l as useGetAgentSuspenseQuery, eu as useGetAiContextLazyQuery, tu as useGetAiContextQuery, nu as useGetAiContextSuspenseQuery, ru as useGetCatalogDependencyGraphLazyQuery, iu as useGetCatalogDependencyGraphQuery, au as useGetCatalogDependencyGraphSuspenseQuery, ou as useGetCatalogLazyQuery, su as useGetCatalogQuery, cu as useGetCatalogSbomLazyQuery, lu as useGetCatalogSbomQuery, uu as useGetCatalogSbomSuspenseQuery, du as useGetCatalogSuspenseQuery, fu as useGetComponentDeploymentsLazyQuery, pu as useGetComponentDeploymentsQuery, mu as useGetComponentDeploymentsSuspenseQuery, hu as useGetComponentLazyQuery, gu as useGetComponentQuery, _u as useGetComponentSuspenseQuery, vu as useGetConfigurationLazyQuery, yu as useGetConfigurationQuery, bu as useGetConfigurationSuspenseQuery, xu as useGetConfigurationValueLazyQuery, Su as useGetConfigurationValueQuery, Cu as useGetConfigurationValueSuspenseQuery, wu as useGetDefaultVibeDeckLazyQuery, Tu as useGetDefaultVibeDeckQuery, Eu as useGetDefaultVibeDeckSuspenseQuery, Du as useGetDocsRevisionLazyQuery, Ou as useGetDocsRevisionQuery, ku as useGetDocsRevisionSuspenseQuery, Au as useGetDocsSiteLazyQuery, ju as useGetDocsSiteQuery, Mu as useGetDocsSiteSuspenseQuery, Nu as useGetEnvTopologyLazyQuery, Pu as useGetEnvTopologyQuery, Fu as useGetEnvTopologySuspenseQuery, Iu as useGetFileDownloadUrlLazyQuery, Lu as useGetFileDownloadUrlQuery, Ru as useGetFileDownloadUrlSuspenseQuery, zu as useGetInstallAgentJobStatusLazyQuery, Bu as useGetInstallAgentJobStatusQuery, Vu as useGetInstallAgentJobStatusSuspenseQuery, Hu as useGetNoteLazyQuery, Uu as useGetNoteQuery, Wu as useGetNoteSuspenseQuery, Gu as useGetNoteTagsLazyQuery, Ku as useGetNoteTagsQuery, qu as useGetNoteTagsSuspenseQuery, Ju as useGetRecentSandboxActivityLazyQuery, Yu as useGetRecentSandboxActivityQuery, Xu as useGetRecentSandboxActivitySuspenseQuery, Zu as useGetSandboxLazyQuery, Qu as useGetSandboxQuery, $u as useGetSandboxStatsLazyQuery, ed as useGetSandboxStatsQuery, td as useGetSandboxStatsSuspenseQuery, nd as useGetSandboxSuspenseQuery, rd as useGetScheduledJobDetailLazyQuery, id as useGetScheduledJobDetailQuery, ad as useGetScheduledJobDetailSuspenseQuery, od as useGetScheduledJobsForCalendarLazyQuery, sd as useGetScheduledJobsForCalendarQuery, cd as useGetScheduledJobsForCalendarSuspenseQuery, ld as useGetSchedulerMetricsForAnalyticsLazyQuery, ud as useGetSchedulerMetricsForAnalyticsQuery, dd as useGetSchedulerMetricsForAnalyticsSuspenseQuery, fd as useGetScorecardLazyQuery, pd as useGetScorecardMetricHistoryLazyQuery, md as useGetScorecardMetricHistoryQuery, hd as useGetScorecardMetricHistorySuspenseQuery, gd as useGetScorecardPushTokenInfoLazyQuery, _d as useGetScorecardPushTokenInfoQuery, vd as useGetScorecardPushTokenInfoSuspenseQuery, yd as useGetScorecardQuery, bd as useGetScorecardSuspenseQuery, xd as useGetScorecardTemplatesLazyQuery, Sd as useGetScorecardTemplatesQuery, Cd as useGetScorecardTemplatesSuspenseQuery, wd as useGetScorecardsLazyQuery, Td as useGetScorecardsQuery, Ed as useGetScorecardsSuspenseQuery, Dd as useGetSessionCollaboratorsLazyQuery, Od as useGetSessionCollaboratorsQuery, kd as useGetSessionCollaboratorsSuspenseQuery, Ad as useGetSessionConnectionEventsLazyQuery, jd as useGetSessionConnectionEventsQuery, Md as useGetSessionConnectionEventsSuspenseQuery, Nd as useGetSessionLazyQuery, Pd as useGetSessionQuery, Fd as useGetSessionShareLinksLazyQuery, Id as useGetSessionShareLinksQuery, Ld as useGetSessionShareLinksSuspenseQuery, Rd as useGetSessionSharesLazyQuery, zd as useGetSessionSharesQuery, Bd as useGetSessionSharesSuspenseQuery, Vd as useGetSessionSuspenseQuery, Hd as useGetSessionsSharedWithMeLazyQuery, Ud as useGetSessionsSharedWithMeQuery, Wd as useGetSessionsSharedWithMeSuspenseQuery, Gd as useGetSharedVibeDeckLazyQuery, Kd as useGetSharedVibeDeckQuery, qd as useGetSharedVibeDeckSuspenseQuery, Jd as useGetTargetLazyQuery, Yd as useGetTargetQuery, Xd as useGetTargetSuspenseQuery, Zd as useGetTemplateLazyQuery, Qd as useGetTemplateQuery, $d as useGetTemplateSuspenseQuery, ef as useGetTunnelAuditLazyQuery, tf as useGetTunnelAuditQuery, nf as useGetTunnelAuditSuspenseQuery, rf as useGetTunnelBySlugLazyQuery, af as useGetTunnelBySlugQuery, of as useGetTunnelBySlugSuspenseQuery, sf as useGetTunnelLazyQuery, cf as useGetTunnelQuery, lf as useGetTunnelSuspenseQuery, uf as useGetTunnelUsageLazyQuery, df as useGetTunnelUsageQuery, ff as useGetTunnelUsageSuspenseQuery, pf as useGetUiSessionLazyQuery, mf as useGetUiSessionQuery, hf as useGetUiSessionSuspenseQuery, gf as useGetVibeAuditLogLazyQuery, _f as useGetVibeAuditLogQuery, vf as useGetVibeAuditLogStatsLazyQuery, yf as useGetVibeAuditLogStatsQuery, bf as useGetVibeAuditLogStatsSuspenseQuery, xf as useGetVibeAuditLogSuspenseQuery, Sf as useGetVibeCalendarTaskLazyQuery, Cf as useGetVibeCalendarTaskQuery, wf as useGetVibeCalendarTaskSuspenseQuery, Tf as useGetVibeCatalogsLazyQuery, Ef as useGetVibeCatalogsQuery, Df as useGetVibeCatalogsSuspenseQuery, Of as useGetVibeDeckLazyQuery, kf as useGetVibeDeckQuery, Af as useGetVibeDeckSuspenseQuery, jf as useGetVibeDocsSiteLazyQuery, Mf as useGetVibeDocsSiteQuery, Nf as useGetVibeDocsSiteSuspenseQuery, Pf as useGetVibeEnvVarsLazyQuery, Ff as useGetVibeEnvVarsQuery, If as useGetVibeEnvVarsSuspenseQuery, Lf as useGetVibeFeatureCatalogLazyQuery, Rf as useGetVibeFeatureCatalogQuery, zf as useGetVibeFeatureCatalogSuspenseQuery, Bf as useGetVibeFeatureFlagsLazyQuery, Vf as useGetVibeFeatureFlagsQuery, Hf as useGetVibeFeatureFlagsSuspenseQuery, Uf as useGetVibeLazyQuery, Wf as useGetVibeLinkedEntitiesLazyQuery, Gf as useGetVibeLinkedEntitiesQuery, Kf as useGetVibeLinkedEntitiesSuspenseQuery, qf as useGetVibeLinkedSandboxesLazyQuery, Jf as useGetVibeLinkedSandboxesQuery, Yf as useGetVibeLinkedSandboxesSuspenseQuery, Xf as useGetVibeLinkedScheduledJobsLazyQuery, Zf as useGetVibeLinkedScheduledJobsQuery, Qf as useGetVibeLinkedScheduledJobsSuspenseQuery, $f as useGetVibeQuery, ep as useGetVibeSuspenseQuery, tp as useGetWebhookLazyQuery, np as useGetWebhookQuery, rp as useGetWebhookSuspenseQuery, ip as useGetWorkspaceFilesLazyQuery, ap as useGetWorkspaceFilesQuery, op as useGetWorkspaceFilesSuspenseQuery, sp as useImportTargetsFromConfigMutation, cp as useInstallAgentOnTargetMutation, lp as useInstallAgentPluginMutation, up as useInstantiateTemplateMutation, dp as useIssueTunnelSessionMutation, fp as useJoinSharedSessionMutation, pp as useLeaveSharedSessionMutation, mp as useLinkEntityToVibeMutation, hp as useListActionExecutionsLazyQuery, gp as useListActionExecutionsQuery, _p as useListActionExecutionsSuspenseQuery, vp as useListActionsLazyQuery, yp as useListActionsQuery, bp as useListActionsSuspenseQuery, xp as useListActiveConnectionsLazyQuery, Sp as useListActiveConnectionsQuery, Cp as useListActiveConnectionsSuspenseQuery, wp as useListActiveTunnelsWithSessionsLazyQuery, Tp as useListActiveTunnelsWithSessionsQuery, Ep as useListActiveTunnelsWithSessionsSuspenseQuery, Dp as useListAgentInstructionFilesLazyQuery, Op as useListAgentInstructionFilesQuery, kp as useListAgentInstructionFilesSuspenseQuery, Ap as useListAgentProfilesLazyQuery, jp as useListAgentProfilesQuery, Mp as useListAgentProfilesSuspenseQuery, Np as useListAgentsLazyQuery, Pp as useListAgentsQuery, Fp as useListAgentsSuspenseQuery, Ip as useListAiContextsLazyQuery, Lp as useListAiContextsQuery, Rp as useListAiContextsSuspenseQuery, zp as useListAiPromptsLazyQuery, Bp as useListAiPromptsQuery, Vp as useListAiPromptsSuspenseQuery, Hp as useListAllComponentsForCatalogLazyQuery, Up as useListAllComponentsForCatalogQuery, Wp as useListAllComponentsForCatalogSuspenseQuery, Gp as useListCatalogsLazyQuery, Kp as useListCatalogsQuery, qp as useListCatalogsSuspenseQuery, Jp as useListComponentsLazyQuery, Yp as useListComponentsQuery, Xp as useListComponentsSuspenseQuery, Zp as useListConfigurationsLazyQuery, Qp as useListConfigurationsQuery, $p as useListConfigurationsSuspenseQuery, em as useListDocsBuildImagesLazyQuery, tm as useListDocsBuildImagesQuery, nm as useListDocsBuildImagesSuspenseQuery, rm as useListNotesLazyQuery, im as useListNotesQuery, am as useListNotesSuspenseQuery, om as useListSessionsLazyQuery, sm as useListSessionsQuery, cm as useListSessionsSuspenseQuery, lm as useListTargetsLazyQuery, um as useListTargetsQuery, dm as useListTargetsSuspenseQuery, fm as useListTemplatesLazyQuery, pm as useListTemplatesQuery, mm as useListTemplatesSuspenseQuery, hm as useListTunnelDomainsLazyQuery, gm as useListTunnelDomainsQuery, _m as useListTunnelDomainsSuspenseQuery, vm as useListTunnelProvidersLazyQuery, ym as useListTunnelProvidersQuery, bm as useListTunnelProvidersSuspenseQuery, xm as useListTunnelSessionsLazyQuery, Sm as useListTunnelSessionsQuery, Cm as useListTunnelSessionsSuspenseQuery, wm as useListTunnelsLazyQuery, Tm as useListTunnelsQuery, Em as useListTunnelsSuspenseQuery, Dm as useListVibeAuditLogsLazyQuery, Om as useListVibeAuditLogsQuery, km as useListVibeAuditLogsSuspenseQuery, Am as useListVibeCalendarExecutionsLazyQuery, jm as useListVibeCalendarExecutionsQuery, Mm as useListVibeCalendarExecutionsSuspenseQuery, Nm as useListVibeCalendarTasksLazyQuery, Pm as useListVibeCalendarTasksQuery, Fm as useListVibeCalendarTasksSuspenseQuery, Im as useListVibeDeckButtonsLazyQuery, Lm as useListVibeDeckButtonsQuery, Rm as useListVibeDeckButtonsSuspenseQuery, zm as useListVibeDeckShareLinksLazyQuery, Bm as useListVibeDeckShareLinksQuery, Vm as useListVibeDeckShareLinksSuspenseQuery, Hm as useListVibeDecksLazyQuery, Um as useListVibeDecksQuery, Wm as useListVibeDecksSuspenseQuery, Gm as useListVibesLazyQuery, Km as useListVibesQuery, qm as useListVibesSuspenseQuery, Jm as useListWebhooksLazyQuery, Ym as useListWebhooksQuery, Xm as useListWebhooksSuspenseQuery, Zm as useMeshDeployJobStatusLazyQuery, Qm as useMeshDeployJobStatusQuery, $m as useMeshDeployJobStatusSuspenseQuery, eh as useMintAgentCapabilityMutation, th as useMoveVibeDeckButtonMutation, nh as useMoveVibeMutation, rh as useMyAgentMessageBookmarksLazyQuery, ih as useMyAgentMessageBookmarksQuery, ah as useMyAgentMessageBookmarksSuspenseQuery, oh as useMySettingsByCategoryLazyQuery, sh as useMySettingsByCategoryQuery, ch as useMySettingsByCategorySuspenseQuery, lh as useMySettingsLazyQuery, uh as useMySettingsQuery, dh as useMySettingsSuspenseQuery, fh as useMyVibeLlmContextPreviewLazyQuery, ph as useMyVibeLlmContextPreviewQuery, mh as useMyVibeLlmContextPreviewSuspenseQuery, hh as useMyVibeLlmContextSettingsLazyQuery, gh as useMyVibeLlmContextSettingsQuery, _h as useMyVibeLlmContextSettingsSuspenseQuery, vh as useMyVibeLlmContextTokenAuditsLazyQuery, yh as useMyVibeLlmContextTokenAuditsQuery, bh as useMyVibeLlmContextTokenAuditsSuspenseQuery, xh as useMyVibeLlmContextTokensLazyQuery, Sh as useMyVibeLlmContextTokensQuery, Ch as useMyVibeLlmContextTokensSuspenseQuery, wh as useNukeVibecontrolsAgentMutation, Th as useOnVibeAuditLogCreatedSubscription, Eh as useOverviewSummaryLazyQuery, Dh as useOverviewSummaryQuery, Oh as useOverviewSummarySuspenseQuery, kh as usePinNoteMutation, Ah as usePinnedNotesLazyQuery, jh as usePinnedNotesQuery, Mh as usePinnedNotesSuspenseQuery, Nh as useProbeAgentConnectionLazyQuery, Ph as useProbeAgentConnectionQuery, Fh as useProbeAgentConnectionSuspenseQuery, Ih as useProbeAgentTunnelLazyQuery, Lh as useProbeAgentTunnelQuery, Rh as useProbeAgentTunnelSuspenseQuery, zh as usePromoteDeploymentMutation, Bh as useProxySandboxRequestMutation, Vh as usePublishComponentAsTemplateMutation, Hh as usePushAgentGatewayAuthMutation, Uh as useRecentAiToolEventsStreamSubscription, Wh as useRegisterCustomTunnelDomainMutation, Gh as useRegisterDeploymentMutation, Kh as useRegisterDocsBuildImageMutation, qh as useRegisterInstalledAgentMutation, Jh as useReleaseSessionControlMutation, Yh as useRemoveAgentPluginMutation, Xh as useRemoveComponentFromCatalogMutation, Zh as useRemoveScorecardMetricMutation, Qh as useRemoveVibeFromCatalogMutation, $h as useRenderAiPromptMutation, eg as useReorderVibeDeckButtonsMutation, tg as useReplaceNoteTagsMutation, ng as useReportAiTokenUsageMutation, rg as useRequestSessionControlMutation, ig as useReserveTunnelSubdomainMutation, ag as useResetSettingsMutation, og as useResetWebhookFailuresMutation, sg as useRestartSessionMutation, cg as useRestartSessionTerminalMutation, lg as useRestoreVibeMutation, ug as useRevokeAgentMeshLinkMutation, dg as useRevokeAllMyVibeLlmContextTokensMutation, fg as useRevokeSessionShareLinkMutation, pg as useRevokeSessionShareMutation, mg as useRevokeTunnelPublicAccessMutation, hg as useRevokeTunnelSessionMutation, gg as useRevokeVibeDeckShareLinkMutation, _g as useRevokeVibeLlmContextTokenMutation, vg as useRollbackDocsRevisionMutation, yg as useRotateAgentApiKeyMutation, bg as useRotateScorecardPushTokenMutation, xg as useRotateTunnelCredentialsMutation, Sg as useRotateVibeLlmContextUrlMutation, Cg as useRunAgentCommandMutation, Xv as useSandboxAssistantTransport, wg as useSaveUiSessionMutation, Tg as useScanSshConfigMutation, Eg as useSearchNotesLazyQuery, Dg as useSearchNotesQuery, Og as useSearchNotesSuspenseQuery, kg as useSendSessionInputMutation, Ag as useSessionControlChangedSubscription, jg as useSessionHistoryRecordingEnabledLazyQuery, Mg as useSessionHistoryRecordingEnabledQuery, Ng as useSessionHistoryRecordingEnabledSuspenseQuery, Pg as useSessionOutputReceivedSubscription, Fg as useSessionSharedWithMeSubscription, Ig as useSessionStatusChangedSubscription, Lg as useSetAgentApiKeyMutation, Rg as useSetAgentAutoUpdateMutation, zg as useSetAgentPlaygroundConfigMutation, Bg as useSetAgentVisibilityMutation, 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 };
8
+ import { useSandboxAssistantTransport as Yv } from "./services/createSandboxAssistantTransport.js";
9
+ import { vibeControlsPlugin as Xv } from "./plugin.js";
10
+ import { enTranslations as Zv } from "./translations/en.js";
11
+ export { Jv 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 BulkRestartSessionsDocument, V as BulkSetConfigurationsDocument, H as BulkStopSessionsDocument, U as BulkTerminateSessionsDocument, W as CatalogFieldsFragmentDoc, G as CatalogUpdatedDocument, K as CheckAiCreditsDocument, q as CheckSessionHealthDocument, J as CollaboratorJoinedDocument, Y as CollaboratorLeftDocument, X as CompileDocsSiteDocument, Z as ComponentFieldsFragmentDoc, Q as ConfigurationChangedDocument, $ as ConfigurationFieldsFragmentDoc, ee as ConnectAgentToTargetDocument, te as CreateActionDocument, ne as CreateAgentDocument, re as CreateAgentInstructionFileDocument, ie as CreateAgentMessageBookmarkDocument, ae as CreateAiContextDocument, oe as CreateCatalogDocument, se as CreateComponentDocument, ce as CreateDocsPageDocument, le as CreateDocsSiteDocument, ue as CreateNoteDocument, de as CreateNoteTagDocument, fe as CreateSandboxDocument, pe as CreateSessionDocument, me as CreateSessionShareLinkDocument, he as CreateTargetDocument, ge as CreateTunnelDocument, _e as CreateVibeCalendarTaskDocument, ve as CreateVibeDeckButtonDocument, ye as CreateVibeDeckDocument, be as CreateVibeDeckShareLinkDocument, xe as CreateVibeDocument, Se as CreateWebhookDocument, Ce as DeactivateAgentDocument, we as DeleteActionDocument, Te as DeleteAgentDocument, Ee as DeleteAgentInstructionFileDocument, De as DeleteAgentMessageBookmarkDocument, Oe as DeleteAiContextDocument, ke as DeleteCatalogDocument, Ae as DeleteComponentDocument, je as DeleteConfigurationDocument, Me as DeleteDeploymentDocument, Ne as DeleteDocsPageDocument, Pe as DeleteDocsSiteDocument, Fe as DeleteNoteDocument, Ie as DeleteSettingsSecretDocument, Le as DeleteTargetDocument, Re as DeleteTemplateDocument, ze as DeleteTunnelDocument, Be as DeleteTunnelDomainDocument, Ve as DeleteVibeCalendarTaskDocument, He as DeleteVibeDeckButtonDocument, Ue as DeleteVibeDeckDocument, We as DeleteVibeDocument, Ge as DeleteVibeEnvVarDocument, Ke as DeleteWebhookDocument, qe as DeployAgentViaMeshDocument, Je as DetachAgentFromVibeDocument, Ye as DetachTunnelDomainDocument, Xe as DisableDocsBuildImageDocument, Ze as DisconnectAgentFromTargetDocument, Qe as DocsContentDocument, $e as DuplicateActionDocument, et as DuplicateVibeDeckDocument, tt as EntityTagPickerAssignmentFieldsFragmentDoc, nt as EntityTagPickerAvailableTagFieldsFragmentDoc, rt as EntityTagPickerAvailableTagsDocument, it as EntityTagPickerCreateTagDocument, at as EntityTagPickerGetEntityTagsDocument, ot as EntityTagPickerSearchTagsDocument, st as EntityTagPickerTagEntityDocument, ct as EntityTagPickerUntagEntityDocument, lt as ExecuteActionDocument, ut as ExecuteAgentMeshRequestDocument, dt as ExecuteScheduledJobNowDocument, ft as ExecuteSharedVibeDeckButtonDocument, pt as ExecuteVibeDeckButtonDocument, mt as ExportSessionsDocument, ht as ExportVibeAuditLogsDocument, gt as ExtendSandboxTtlDocument, _t as ForkGitHubRepoDocument, vt as GenerateAgentGraphContextUrlDocument, yt as GenerateDocsSignedUrlDocument, bt as GenerateVibeLlmContextUrlDocument, xt as GetActionDocument, St as GetActiveSandboxesDocument, Ct as GetAgentConnectionEventsDocument, wt as GetAgentDocument, Tt as GetAgentGraphDocument, Et as GetAgentInstructionFileDocument, Dt as GetAgentMeshGraphDocument, Ot as GetAiContextDocument, kt as GetCatalogDependencyGraphDocument, At as GetCatalogDocument, jt as GetCatalogSbomDocument, Mt as GetComponentDeploymentsDocument, Nt as GetComponentDocument, Pt as GetConfigurationDocument, Ft as GetConfigurationValueDocument, It as GetDefaultVibeDeckDocument, Lt as GetDocsRevisionDocument, Rt as GetDocsSiteDocument, zt as GetEnvTopologyDocument, Bt as GetFileDownloadUrlDocument, Vt as GetInstallAgentJobStatusDocument, Ht as GetNoteDocument, Ut as GetNoteTagsDocument, Wt as GetRecentSandboxActivityDocument, Gt as GetSandboxDocument, Kt as GetSandboxStatsDocument, qt as GetScheduledJobDetailDocument, Jt as GetScheduledJobsForCalendarDocument, Yt as GetSchedulerMetricsForAnalyticsDocument, Xt as GetScorecardDocument, Zt as GetScorecardMetricHistoryDocument, Qt as GetScorecardPushTokenInfoDocument, $t as GetScorecardTemplatesDocument, en as GetScorecardsDocument, tn as GetSessionCollaboratorsDocument, nn as GetSessionConnectionEventsDocument, rn as GetSessionDocument, an as GetSessionShareLinksDocument, on as GetSessionSharesDocument, sn as GetSessionsSharedWithMeDocument, cn as GetSharedVibeDeckDocument, ln as GetTargetDocument, un as GetTemplateDocument, dn as GetTunnelAuditDocument, fn as GetTunnelBySlugDocument, pn as GetTunnelDocument, mn as GetTunnelUsageDocument, hn as GetUiSessionDocument, gn as GetVibeAuditLogDocument, _n as GetVibeAuditLogStatsDocument, vn as GetVibeCalendarTaskDocument, yn as GetVibeCatalogsDocument, bn as GetVibeDeckDocument, xn as GetVibeDocsSiteDocument, Sn as GetVibeDocument, Cn as GetVibeEnvVarsDocument, wn as GetVibeFeatureCatalogDocument, Tn as GetVibeFeatureFlagsDocument, En as GetVibeLinkedEntitiesDocument, Dn as GetVibeLinkedSandboxesDocument, On as GetVibeLinkedScheduledJobsDocument, kn as GetWebhookDocument, An as GetWorkspaceFilesDocument, jn as ImportTargetsFromConfigDocument, Mn as InstallAgentOnTargetDocument, Nn as InstallAgentPluginDocument, Pn as InstantiateTemplateDocument, Fn as InstructionFileFieldsFragmentDoc, In as IssueTunnelSessionDocument, Ln as JoinSharedSessionDocument, Rn as LeaveSharedSessionDocument, zn as LinkEntityToVibeDocument, Bn as ListActionExecutionsDocument, Vn as ListActionsDocument, Hn as ListActiveConnectionsDocument, Un as ListActiveTunnelsWithSessionsDocument, Wn as ListAgentInstructionFilesDocument, Gn as ListAgentProfilesDocument, Kn as ListAgentsDocument, qn as ListAiContextsDocument, Jn as ListAiPromptsDocument, Yn as ListAllComponentsForCatalogDocument, Xn as ListCatalogsDocument, Zn as ListComponentsDocument, Qn as ListConfigurationsDocument, $n as ListDocsBuildImagesDocument, er as ListNotesDocument, tr as ListSessionsDocument, nr as ListTargetsDocument, rr as ListTemplatesDocument, ir as ListTunnelDomainsDocument, ar as ListTunnelProvidersDocument, or as ListTunnelSessionsDocument, sr as ListTunnelsDocument, cr as ListVibeAuditLogsDocument, lr as ListVibeCalendarExecutionsDocument, ur as ListVibeCalendarTasksDocument, dr as ListVibeDeckButtonsDocument, fr as ListVibeDeckShareLinksDocument, pr as ListVibeDecksDocument, mr as ListVibesDocument, hr as ListWebhooksDocument, gr as MeshAgentFieldsFragmentDoc, _r as MeshDeployJobStatusDocument, vr as MintAgentCapabilityDocument, yr as MoveVibeDeckButtonDocument, br as MoveVibeDocument, xr as MyAgentMessageBookmarksDocument, Sr as MySettingsByCategoryDocument, Cr as MySettingsDocument, wr as MyVibeLlmContextPreviewDocument, Tr as MyVibeLlmContextSettingsDocument, Er as MyVibeLlmContextTokenAuditsDocument, Dr as MyVibeLlmContextTokensDocument, Or as NoteFieldsFragmentDoc, kr as NoteTagAssignmentFieldsFragmentDoc, Ar as NukeVibecontrolsAgentDocument, jr as OnVibeAuditLogCreatedDocument, Mr as OverviewSummaryDocument, Nr as PinNoteDocument, Pr as PinnedNotesDocument, Fr as ProbeAgentConnectionDocument, Ir as ProbeAgentTunnelDocument, Lr as PromoteDeploymentDocument, Rr as ProxySandboxRequestDocument, zr as PublishComponentAsTemplateDocument, Br as PushAgentGatewayAuthDocument, Vr as RecentAiToolEventsStreamDocument, Hr as RegisterCustomTunnelDomainDocument, Ur as RegisterDeploymentDocument, Wr as RegisterDocsBuildImageDocument, Gr as RegisterInstalledAgentDocument, Kr as ReleaseSessionControlDocument, qr as RemoveAgentPluginDocument, Jr as RemoveComponentFromCatalogDocument, Yr as RemoveScorecardMetricDocument, Xr as RemoveVibeFromCatalogDocument, Zr as RenderAiPromptDocument, Qr as ReorderVibeDeckButtonsDocument, $r as ReplaceNoteTagsDocument, ei as ReportAiTokenUsageDocument, ti as RequestSessionControlDocument, ni as ReserveTunnelSubdomainDocument, ri as ResetSettingsDocument, ii as ResetWebhookFailuresDocument, ai as RestartSessionDocument, oi as RestartSessionTerminalDocument, si as RestoreVibeDocument, ci as RevokeAgentMeshLinkDocument, li as RevokeAllMyVibeLlmContextTokensDocument, ui as RevokeSessionShareDocument, di as RevokeSessionShareLinkDocument, fi as RevokeTunnelPublicAccessDocument, pi as RevokeTunnelSessionDocument, mi as RevokeVibeDeckShareLinkDocument, hi as RevokeVibeLlmContextTokenDocument, gi as RollbackDocsRevisionDocument, _i as RotateAgentApiKeyDocument, vi as RotateScorecardPushTokenDocument, yi as RotateTunnelCredentialsDocument, bi as RotateVibeLlmContextUrlDocument, xi as RunAgentCommandDocument, Si as SaveUiSessionDocument, Ci as ScanSshConfigDocument, wi as ScorecardFieldsFragmentDoc, Ti as ScorecardMetricFieldsFragmentDoc, Ei as ScorecardTemplateFieldsFragmentDoc, Di as SearchNotesDocument, Oi as SendSessionInputDocument, ki as SessionCollaboratorFieldsFragmentDoc, Ai as SessionControlChangedDocument, ji as SessionFieldsFragmentDoc, Mi as SessionHistoryRecordingEnabledDocument, Ni as SessionOutputReceivedDocument, Pi as SessionShareFieldsFragmentDoc, Fi as SessionShareLinkFieldsFragmentDoc, Ii as SessionSharedWithMeDocument, Li as SessionStatusChangedDocument, Ri as SetAgentApiKeyDocument, zi as SetAgentAutoUpdateDocument, Bi as SetAgentPlaygroundConfigDocument, Vi as SetAgentVisibilityDocument, 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, Ws as useAttachAgentToVibeMutation, Gs as useAttachTunnelDomainMutation, Ks as useAvailableNoteTagsLazyQuery, qs as useAvailableNoteTagsQuery, Js as useAvailableNoteTagsSuspenseQuery, Ys as useBulkRestartSessionsMutation, Xs as useBulkSetConfigurationsMutation, Zs as useBulkStopSessionsMutation, Qs as useBulkTerminateSessionsMutation, $s as useCatalogUpdatedSubscription, ec as useCheckAiCreditsMutation, tc as useCheckSessionHealthMutation, nc as useCollaboratorJoinedSubscription, rc as useCollaboratorLeftSubscription, ic as useCompileDocsSiteMutation, ac as useConfigurationChangedSubscription, oc as useConnectAgentToTargetMutation, sc as useCreateActionMutation, cc as useCreateAgentInstructionFileMutation, lc as useCreateAgentMessageBookmarkMutation, uc as useCreateAgentMutation, dc as useCreateAiContextMutation, fc as useCreateCatalogMutation, pc as useCreateComponentMutation, mc as useCreateDocsPageMutation, hc as useCreateDocsSiteMutation, gc as useCreateNoteMutation, _c as useCreateNoteTagMutation, vc as useCreateSandboxMutation, yc as useCreateSessionMutation, bc as useCreateSessionShareLinkMutation, xc as useCreateTargetMutation, Sc as useCreateTunnelMutation, Cc as useCreateVibeCalendarTaskMutation, wc as useCreateVibeDeckButtonMutation, Tc as useCreateVibeDeckMutation, Ec as useCreateVibeDeckShareLinkMutation, Dc as useCreateVibeMutation, Oc as useCreateWebhookMutation, kc as useDeactivateAgentMutation, Ac as useDeleteActionMutation, jc as useDeleteAgentInstructionFileMutation, Mc as useDeleteAgentMessageBookmarkMutation, Nc as useDeleteAgentMutation, Pc as useDeleteAiContextMutation, Fc as useDeleteCatalogMutation, Ic as useDeleteComponentMutation, Lc as useDeleteConfigurationMutation, Rc as useDeleteDeploymentMutation, zc as useDeleteDocsPageMutation, Bc as useDeleteDocsSiteMutation, Vc as useDeleteNoteMutation, Hc as useDeleteSettingsSecretMutation, Uc as useDeleteTargetMutation, Wc as useDeleteTemplateMutation, Gc as useDeleteTunnelDomainMutation, Kc as useDeleteTunnelMutation, qc as useDeleteVibeCalendarTaskMutation, Jc as useDeleteVibeDeckButtonMutation, Yc as useDeleteVibeDeckMutation, Xc as useDeleteVibeEnvVarMutation, Zc as useDeleteVibeMutation, Qc as useDeleteWebhookMutation, $c as useDeployAgentViaMeshMutation, el as useDetachAgentFromVibeMutation, tl as useDetachTunnelDomainMutation, nl as useDisableDocsBuildImageMutation, rl as useDisconnectAgentFromTargetMutation, il as useDocsContentLazyQuery, al as useDocsContentQuery, ol as useDocsContentSuspenseQuery, sl as useDuplicateActionMutation, cl as useDuplicateVibeDeckMutation, ll as useEntityTagPickerAvailableTagsLazyQuery, ul as useEntityTagPickerAvailableTagsQuery, dl as useEntityTagPickerAvailableTagsSuspenseQuery, fl as useEntityTagPickerCreateTagMutation, pl as useEntityTagPickerGetEntityTagsLazyQuery, ml as useEntityTagPickerGetEntityTagsQuery, hl as useEntityTagPickerGetEntityTagsSuspenseQuery, gl as useEntityTagPickerSearchTagsLazyQuery, _l as useEntityTagPickerSearchTagsQuery, vl as useEntityTagPickerSearchTagsSuspenseQuery, yl as useEntityTagPickerTagEntityMutation, bl as useEntityTagPickerUntagEntityMutation, xl as useExecuteActionMutation, Sl as useExecuteAgentMeshRequestMutation, Cl as useExecuteScheduledJobNowMutation, wl as useExecuteSharedVibeDeckButtonMutation, Tl as useExecuteVibeDeckButtonMutation, El as useExportSessionsMutation, Dl as useExportVibeAuditLogsMutation, Ol as useExtendSandboxTtlMutation, kl as useForkGitHubRepoMutation, Al as useGenerateAgentGraphContextUrlMutation, jl as useGenerateDocsSignedUrlMutation, Ml as useGenerateVibeLlmContextUrlMutation, Nl as useGetActionLazyQuery, Pl as useGetActionQuery, Fl as useGetActionSuspenseQuery, Il as useGetActiveSandboxesLazyQuery, Ll as useGetActiveSandboxesQuery, Rl as useGetActiveSandboxesSuspenseQuery, zl as useGetAgentConnectionEventsLazyQuery, Bl as useGetAgentConnectionEventsQuery, Vl as useGetAgentConnectionEventsSuspenseQuery, Hl as useGetAgentGraphLazyQuery, Ul as useGetAgentGraphQuery, Wl as useGetAgentGraphSuspenseQuery, Gl as useGetAgentInstructionFileLazyQuery, Kl as useGetAgentInstructionFileQuery, ql as useGetAgentInstructionFileSuspenseQuery, Jl as useGetAgentLazyQuery, Yl as useGetAgentMeshGraphLazyQuery, Xl as useGetAgentMeshGraphQuery, Zl as useGetAgentMeshGraphSuspenseQuery, Ql as useGetAgentQuery, $l as useGetAgentSuspenseQuery, eu as useGetAiContextLazyQuery, tu as useGetAiContextQuery, nu as useGetAiContextSuspenseQuery, ru as useGetCatalogDependencyGraphLazyQuery, iu as useGetCatalogDependencyGraphQuery, au as useGetCatalogDependencyGraphSuspenseQuery, ou as useGetCatalogLazyQuery, su as useGetCatalogQuery, cu as useGetCatalogSbomLazyQuery, lu as useGetCatalogSbomQuery, uu as useGetCatalogSbomSuspenseQuery, du as useGetCatalogSuspenseQuery, fu as useGetComponentDeploymentsLazyQuery, pu as useGetComponentDeploymentsQuery, mu as useGetComponentDeploymentsSuspenseQuery, hu as useGetComponentLazyQuery, gu as useGetComponentQuery, _u as useGetComponentSuspenseQuery, vu as useGetConfigurationLazyQuery, yu as useGetConfigurationQuery, bu as useGetConfigurationSuspenseQuery, xu as useGetConfigurationValueLazyQuery, Su as useGetConfigurationValueQuery, Cu as useGetConfigurationValueSuspenseQuery, wu as useGetDefaultVibeDeckLazyQuery, Tu as useGetDefaultVibeDeckQuery, Eu as useGetDefaultVibeDeckSuspenseQuery, Du as useGetDocsRevisionLazyQuery, Ou as useGetDocsRevisionQuery, ku as useGetDocsRevisionSuspenseQuery, Au as useGetDocsSiteLazyQuery, ju as useGetDocsSiteQuery, Mu as useGetDocsSiteSuspenseQuery, Nu as useGetEnvTopologyLazyQuery, Pu as useGetEnvTopologyQuery, Fu as useGetEnvTopologySuspenseQuery, Iu as useGetFileDownloadUrlLazyQuery, Lu as useGetFileDownloadUrlQuery, Ru as useGetFileDownloadUrlSuspenseQuery, zu as useGetInstallAgentJobStatusLazyQuery, Bu as useGetInstallAgentJobStatusQuery, Vu as useGetInstallAgentJobStatusSuspenseQuery, Hu as useGetNoteLazyQuery, Uu as useGetNoteQuery, Wu as useGetNoteSuspenseQuery, Gu as useGetNoteTagsLazyQuery, Ku as useGetNoteTagsQuery, qu as useGetNoteTagsSuspenseQuery, Ju as useGetRecentSandboxActivityLazyQuery, Yu as useGetRecentSandboxActivityQuery, Xu as useGetRecentSandboxActivitySuspenseQuery, Zu as useGetSandboxLazyQuery, Qu as useGetSandboxQuery, $u as useGetSandboxStatsLazyQuery, ed as useGetSandboxStatsQuery, td as useGetSandboxStatsSuspenseQuery, nd as useGetSandboxSuspenseQuery, rd as useGetScheduledJobDetailLazyQuery, id as useGetScheduledJobDetailQuery, ad as useGetScheduledJobDetailSuspenseQuery, od as useGetScheduledJobsForCalendarLazyQuery, sd as useGetScheduledJobsForCalendarQuery, cd as useGetScheduledJobsForCalendarSuspenseQuery, ld as useGetSchedulerMetricsForAnalyticsLazyQuery, ud as useGetSchedulerMetricsForAnalyticsQuery, dd as useGetSchedulerMetricsForAnalyticsSuspenseQuery, fd as useGetScorecardLazyQuery, pd as useGetScorecardMetricHistoryLazyQuery, md as useGetScorecardMetricHistoryQuery, hd as useGetScorecardMetricHistorySuspenseQuery, gd as useGetScorecardPushTokenInfoLazyQuery, _d as useGetScorecardPushTokenInfoQuery, vd as useGetScorecardPushTokenInfoSuspenseQuery, yd as useGetScorecardQuery, bd as useGetScorecardSuspenseQuery, xd as useGetScorecardTemplatesLazyQuery, Sd as useGetScorecardTemplatesQuery, Cd as useGetScorecardTemplatesSuspenseQuery, wd as useGetScorecardsLazyQuery, Td as useGetScorecardsQuery, Ed as useGetScorecardsSuspenseQuery, Dd as useGetSessionCollaboratorsLazyQuery, Od as useGetSessionCollaboratorsQuery, kd as useGetSessionCollaboratorsSuspenseQuery, Ad as useGetSessionConnectionEventsLazyQuery, jd as useGetSessionConnectionEventsQuery, Md as useGetSessionConnectionEventsSuspenseQuery, Nd as useGetSessionLazyQuery, Pd as useGetSessionQuery, Fd as useGetSessionShareLinksLazyQuery, Id as useGetSessionShareLinksQuery, Ld as useGetSessionShareLinksSuspenseQuery, Rd as useGetSessionSharesLazyQuery, zd as useGetSessionSharesQuery, Bd as useGetSessionSharesSuspenseQuery, Vd as useGetSessionSuspenseQuery, Hd as useGetSessionsSharedWithMeLazyQuery, Ud as useGetSessionsSharedWithMeQuery, Wd as useGetSessionsSharedWithMeSuspenseQuery, Gd as useGetSharedVibeDeckLazyQuery, Kd as useGetSharedVibeDeckQuery, qd as useGetSharedVibeDeckSuspenseQuery, Jd as useGetTargetLazyQuery, Yd as useGetTargetQuery, Xd as useGetTargetSuspenseQuery, Zd as useGetTemplateLazyQuery, Qd as useGetTemplateQuery, $d as useGetTemplateSuspenseQuery, ef as useGetTunnelAuditLazyQuery, tf as useGetTunnelAuditQuery, nf as useGetTunnelAuditSuspenseQuery, rf as useGetTunnelBySlugLazyQuery, af as useGetTunnelBySlugQuery, of as useGetTunnelBySlugSuspenseQuery, sf as useGetTunnelLazyQuery, cf as useGetTunnelQuery, lf as useGetTunnelSuspenseQuery, uf as useGetTunnelUsageLazyQuery, df as useGetTunnelUsageQuery, ff as useGetTunnelUsageSuspenseQuery, pf as useGetUiSessionLazyQuery, mf as useGetUiSessionQuery, hf as useGetUiSessionSuspenseQuery, gf as useGetVibeAuditLogLazyQuery, _f as useGetVibeAuditLogQuery, vf as useGetVibeAuditLogStatsLazyQuery, yf as useGetVibeAuditLogStatsQuery, bf as useGetVibeAuditLogStatsSuspenseQuery, xf as useGetVibeAuditLogSuspenseQuery, Sf as useGetVibeCalendarTaskLazyQuery, Cf as useGetVibeCalendarTaskQuery, wf as useGetVibeCalendarTaskSuspenseQuery, Tf as useGetVibeCatalogsLazyQuery, Ef as useGetVibeCatalogsQuery, Df as useGetVibeCatalogsSuspenseQuery, Of as useGetVibeDeckLazyQuery, kf as useGetVibeDeckQuery, Af as useGetVibeDeckSuspenseQuery, jf as useGetVibeDocsSiteLazyQuery, Mf as useGetVibeDocsSiteQuery, Nf as useGetVibeDocsSiteSuspenseQuery, Pf as useGetVibeEnvVarsLazyQuery, Ff as useGetVibeEnvVarsQuery, If as useGetVibeEnvVarsSuspenseQuery, Lf as useGetVibeFeatureCatalogLazyQuery, Rf as useGetVibeFeatureCatalogQuery, zf as useGetVibeFeatureCatalogSuspenseQuery, Bf as useGetVibeFeatureFlagsLazyQuery, Vf as useGetVibeFeatureFlagsQuery, Hf as useGetVibeFeatureFlagsSuspenseQuery, Uf as useGetVibeLazyQuery, Wf as useGetVibeLinkedEntitiesLazyQuery, Gf as useGetVibeLinkedEntitiesQuery, Kf as useGetVibeLinkedEntitiesSuspenseQuery, qf as useGetVibeLinkedSandboxesLazyQuery, Jf as useGetVibeLinkedSandboxesQuery, Yf as useGetVibeLinkedSandboxesSuspenseQuery, Xf as useGetVibeLinkedScheduledJobsLazyQuery, Zf as useGetVibeLinkedScheduledJobsQuery, Qf as useGetVibeLinkedScheduledJobsSuspenseQuery, $f as useGetVibeQuery, ep as useGetVibeSuspenseQuery, tp as useGetWebhookLazyQuery, np as useGetWebhookQuery, rp as useGetWebhookSuspenseQuery, ip as useGetWorkspaceFilesLazyQuery, ap as useGetWorkspaceFilesQuery, op as useGetWorkspaceFilesSuspenseQuery, sp as useImportTargetsFromConfigMutation, cp as useInstallAgentOnTargetMutation, lp as useInstallAgentPluginMutation, up as useInstantiateTemplateMutation, dp as useIssueTunnelSessionMutation, fp as useJoinSharedSessionMutation, pp as useLeaveSharedSessionMutation, mp as useLinkEntityToVibeMutation, hp as useListActionExecutionsLazyQuery, gp as useListActionExecutionsQuery, _p as useListActionExecutionsSuspenseQuery, vp as useListActionsLazyQuery, yp as useListActionsQuery, bp as useListActionsSuspenseQuery, xp as useListActiveConnectionsLazyQuery, Sp as useListActiveConnectionsQuery, Cp as useListActiveConnectionsSuspenseQuery, wp as useListActiveTunnelsWithSessionsLazyQuery, Tp as useListActiveTunnelsWithSessionsQuery, Ep as useListActiveTunnelsWithSessionsSuspenseQuery, Dp as useListAgentInstructionFilesLazyQuery, Op as useListAgentInstructionFilesQuery, kp as useListAgentInstructionFilesSuspenseQuery, Ap as useListAgentProfilesLazyQuery, jp as useListAgentProfilesQuery, Mp as useListAgentProfilesSuspenseQuery, Np as useListAgentsLazyQuery, Pp as useListAgentsQuery, Fp as useListAgentsSuspenseQuery, Ip as useListAiContextsLazyQuery, Lp as useListAiContextsQuery, Rp as useListAiContextsSuspenseQuery, zp as useListAiPromptsLazyQuery, Bp as useListAiPromptsQuery, Vp as useListAiPromptsSuspenseQuery, Hp as useListAllComponentsForCatalogLazyQuery, Up as useListAllComponentsForCatalogQuery, Wp as useListAllComponentsForCatalogSuspenseQuery, Gp as useListCatalogsLazyQuery, Kp as useListCatalogsQuery, qp as useListCatalogsSuspenseQuery, Jp as useListComponentsLazyQuery, Yp as useListComponentsQuery, Xp as useListComponentsSuspenseQuery, Zp as useListConfigurationsLazyQuery, Qp as useListConfigurationsQuery, $p as useListConfigurationsSuspenseQuery, em as useListDocsBuildImagesLazyQuery, tm as useListDocsBuildImagesQuery, nm as useListDocsBuildImagesSuspenseQuery, rm as useListNotesLazyQuery, im as useListNotesQuery, am as useListNotesSuspenseQuery, om as useListSessionsLazyQuery, sm as useListSessionsQuery, cm as useListSessionsSuspenseQuery, lm as useListTargetsLazyQuery, um as useListTargetsQuery, dm as useListTargetsSuspenseQuery, fm as useListTemplatesLazyQuery, pm as useListTemplatesQuery, mm as useListTemplatesSuspenseQuery, hm as useListTunnelDomainsLazyQuery, gm as useListTunnelDomainsQuery, _m as useListTunnelDomainsSuspenseQuery, vm as useListTunnelProvidersLazyQuery, ym as useListTunnelProvidersQuery, bm as useListTunnelProvidersSuspenseQuery, xm as useListTunnelSessionsLazyQuery, Sm as useListTunnelSessionsQuery, Cm as useListTunnelSessionsSuspenseQuery, wm as useListTunnelsLazyQuery, Tm as useListTunnelsQuery, Em as useListTunnelsSuspenseQuery, Dm as useListVibeAuditLogsLazyQuery, Om as useListVibeAuditLogsQuery, km as useListVibeAuditLogsSuspenseQuery, Am as useListVibeCalendarExecutionsLazyQuery, jm as useListVibeCalendarExecutionsQuery, Mm as useListVibeCalendarExecutionsSuspenseQuery, Nm as useListVibeCalendarTasksLazyQuery, Pm as useListVibeCalendarTasksQuery, Fm as useListVibeCalendarTasksSuspenseQuery, Im as useListVibeDeckButtonsLazyQuery, Lm as useListVibeDeckButtonsQuery, Rm as useListVibeDeckButtonsSuspenseQuery, zm as useListVibeDeckShareLinksLazyQuery, Bm as useListVibeDeckShareLinksQuery, Vm as useListVibeDeckShareLinksSuspenseQuery, Hm as useListVibeDecksLazyQuery, Um as useListVibeDecksQuery, Wm as useListVibeDecksSuspenseQuery, Gm as useListVibesLazyQuery, Km as useListVibesQuery, qm as useListVibesSuspenseQuery, Jm as useListWebhooksLazyQuery, Ym as useListWebhooksQuery, Xm as useListWebhooksSuspenseQuery, Zm as useMeshDeployJobStatusLazyQuery, Qm as useMeshDeployJobStatusQuery, $m as useMeshDeployJobStatusSuspenseQuery, eh as useMintAgentCapabilityMutation, th as useMoveVibeDeckButtonMutation, nh as useMoveVibeMutation, rh as useMyAgentMessageBookmarksLazyQuery, ih as useMyAgentMessageBookmarksQuery, ah as useMyAgentMessageBookmarksSuspenseQuery, oh as useMySettingsByCategoryLazyQuery, sh as useMySettingsByCategoryQuery, ch as useMySettingsByCategorySuspenseQuery, lh as useMySettingsLazyQuery, uh as useMySettingsQuery, dh as useMySettingsSuspenseQuery, fh as useMyVibeLlmContextPreviewLazyQuery, ph as useMyVibeLlmContextPreviewQuery, mh as useMyVibeLlmContextPreviewSuspenseQuery, hh as useMyVibeLlmContextSettingsLazyQuery, gh as useMyVibeLlmContextSettingsQuery, _h as useMyVibeLlmContextSettingsSuspenseQuery, vh as useMyVibeLlmContextTokenAuditsLazyQuery, yh as useMyVibeLlmContextTokenAuditsQuery, bh as useMyVibeLlmContextTokenAuditsSuspenseQuery, xh as useMyVibeLlmContextTokensLazyQuery, Sh as useMyVibeLlmContextTokensQuery, Ch as useMyVibeLlmContextTokensSuspenseQuery, wh as useNukeVibecontrolsAgentMutation, Th as useOnVibeAuditLogCreatedSubscription, Eh as useOverviewSummaryLazyQuery, Dh as useOverviewSummaryQuery, Oh as useOverviewSummarySuspenseQuery, kh as usePinNoteMutation, Ah as usePinnedNotesLazyQuery, jh as usePinnedNotesQuery, Mh as usePinnedNotesSuspenseQuery, Nh as useProbeAgentConnectionLazyQuery, Ph as useProbeAgentConnectionQuery, Fh as useProbeAgentConnectionSuspenseQuery, Ih as useProbeAgentTunnelLazyQuery, Lh as useProbeAgentTunnelQuery, Rh as useProbeAgentTunnelSuspenseQuery, zh as usePromoteDeploymentMutation, Bh as useProxySandboxRequestMutation, Vh as usePublishComponentAsTemplateMutation, Hh as usePushAgentGatewayAuthMutation, Uh as useRecentAiToolEventsStreamSubscription, Wh as useRegisterCustomTunnelDomainMutation, Gh as useRegisterDeploymentMutation, Kh as useRegisterDocsBuildImageMutation, qh as useRegisterInstalledAgentMutation, Jh as useReleaseSessionControlMutation, Yh as useRemoveAgentPluginMutation, Xh as useRemoveComponentFromCatalogMutation, Zh as useRemoveScorecardMetricMutation, Qh as useRemoveVibeFromCatalogMutation, $h as useRenderAiPromptMutation, eg as useReorderVibeDeckButtonsMutation, tg as useReplaceNoteTagsMutation, ng as useReportAiTokenUsageMutation, rg as useRequestSessionControlMutation, ig as useReserveTunnelSubdomainMutation, ag as useResetSettingsMutation, og as useResetWebhookFailuresMutation, sg as useRestartSessionMutation, cg as useRestartSessionTerminalMutation, lg as useRestoreVibeMutation, ug as useRevokeAgentMeshLinkMutation, dg as useRevokeAllMyVibeLlmContextTokensMutation, fg as useRevokeSessionShareLinkMutation, pg as useRevokeSessionShareMutation, mg as useRevokeTunnelPublicAccessMutation, hg as useRevokeTunnelSessionMutation, gg as useRevokeVibeDeckShareLinkMutation, _g as useRevokeVibeLlmContextTokenMutation, vg as useRollbackDocsRevisionMutation, yg as useRotateAgentApiKeyMutation, bg as useRotateScorecardPushTokenMutation, xg as useRotateTunnelCredentialsMutation, Sg as useRotateVibeLlmContextUrlMutation, Cg as useRunAgentCommandMutation, Yv as useSandboxAssistantTransport, wg as useSaveUiSessionMutation, Tg as useScanSshConfigMutation, Eg as useSearchNotesLazyQuery, Dg as useSearchNotesQuery, Og as useSearchNotesSuspenseQuery, kg as useSendSessionInputMutation, Ag as useSessionControlChangedSubscription, jg as useSessionHistoryRecordingEnabledLazyQuery, Mg as useSessionHistoryRecordingEnabledQuery, Ng as useSessionHistoryRecordingEnabledSuspenseQuery, Pg as useSessionOutputReceivedSubscription, Fg as useSessionSharedWithMeSubscription, Ig as useSessionStatusChangedSubscription, Lg as useSetAgentApiKeyMutation, Rg as useSetAgentAutoUpdateMutation, zg as useSetAgentPlaygroundConfigMutation, Bg as useSetAgentVisibilityMutation, 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 };
@@ -44,9 +44,9 @@ import { Fragment as bt, jsx as m, jsxs as h } from "react/jsx-runtime";
44
44
  import { PagePurpose as xt } from "@burdenoff/fe-libs/ui";
45
45
  import { useEventBus as St } from "@burdenoff/fe-libs/shared/events";
46
46
  import { AccessDenied as Ct, PermissionButton as wt } from "@burdenoff/fe-libs/shared/components";
47
- import { SaveToFilesButton as Tt } from "@burdenoff/fe-libs/storage";
48
- import { MotionItem as Et, MotionList as Dt, MotionPage as Ot } from "@burdenoff/fe-libs/shared/motion";
49
- import { useSafeShellUi as kt } from "@burdenoff/fe-libs/shared/providers/shell/ShellUiProvider";
47
+ import { MotionItem as Tt, MotionList as Et, MotionPage as Dt } from "@burdenoff/fe-libs/shared/motion";
48
+ import { useSafeShellUi as Ot } from "@burdenoff/fe-libs/shared/providers/shell/ShellUiProvider";
49
+ import { SaveToFilesButton as kt } from "@burdenoff/fe-libs/storage";
50
50
  //#region src/pages/SessionsPage.tsx
51
51
  var At = 3e5;
52
52
  function jt(e, t) {
@@ -133,7 +133,7 @@ function Nt() {
133
133
  };
134
134
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
135
135
  }, [en]);
136
- let [yn, bn] = p(""), [xn, Sn] = p(""), [Cn, wn] = p("default"), [I, Tn] = p("TMUX"), [En, Dn] = p(!1), { terminalTabs: On, activeTerminalTabId: kn, sessionsViewMode: An, sessionsGroupBy: jn, sessionsTargetFilter: Mn, setTerminalTabs: Nn, setActiveTerminalTabId: Pn, setSessionsViewMode: Fn, setSessionsGroupBy: In, setSessionsTargetFilter: Ln, sessionInfoPanelOpen: Rn, setSessionInfoPanelOpen: zn, activeSessionId: L, lastUsedAgentId: Bn, lastUsedVibeId: Vn, lastUsedSessionType: Hn, lastUsedProfile: Un, setLastUsedSessionDefaults: Wn } = ve(), Gn = kt(), Kn = f(Gn);
136
+ let [yn, bn] = p(""), [xn, Sn] = p(""), [Cn, wn] = p("default"), [I, Tn] = p("TMUX"), [En, Dn] = p(!1), { terminalTabs: On, activeTerminalTabId: kn, sessionsViewMode: An, sessionsGroupBy: jn, sessionsTargetFilter: Mn, setTerminalTabs: Nn, setActiveTerminalTabId: Pn, setSessionsViewMode: Fn, setSessionsGroupBy: In, setSessionsTargetFilter: Ln, sessionInfoPanelOpen: Rn, setSessionInfoPanelOpen: zn, activeSessionId: L, lastUsedAgentId: Bn, lastUsedVibeId: Vn, lastUsedSessionType: Hn, lastUsedProfile: Un, setLastUsedSessionDefaults: Wn } = ve(), Gn = Ot(), Kn = f(Gn);
137
137
  Kn.current = Gn, u(() => {
138
138
  let e = Kn.current;
139
139
  if (!e || O !== "terminal") return;
@@ -1327,11 +1327,11 @@ function Nt() {
1327
1327
  running: J.filter((e) => e.status === "RUNNING").length,
1328
1328
  stopped: J.filter((e) => e.status === "STOPPED").length
1329
1329
  };
1330
- if (It) return /* @__PURE__ */ m(Ot, {
1330
+ if (It) return /* @__PURE__ */ m(Dt, {
1331
1331
  className: "space-y-6 px-6 lg:px-8 py-6 bg-bg-canvas min-h-screen",
1332
1332
  children: /* @__PURE__ */ m(xe, { message: y("sessions.loadingPermissions", "Loading permissions...") })
1333
1333
  });
1334
- if (Lt && Lt.permissionStrings?.length > 0 && !Ht) return /* @__PURE__ */ m(Ot, {
1334
+ if (Lt && Lt.permissionStrings?.length > 0 && !Ht) return /* @__PURE__ */ m(Dt, {
1335
1335
  className: "space-y-6 px-6 lg:px-8 py-6 bg-bg-canvas min-h-screen",
1336
1336
  children: /* @__PURE__ */ m(Ct, {
1337
1337
  title: y("common.accessDeniedTitle", "Access Denied"),
@@ -1339,11 +1339,11 @@ function Nt() {
1339
1339
  details: y("sessions.requiredPermission", "Required permission: session:list")
1340
1340
  })
1341
1341
  });
1342
- if (Br && !zr && J.length === 0) return /* @__PURE__ */ m(Ot, {
1342
+ if (Br && !zr && J.length === 0) return /* @__PURE__ */ m(Dt, {
1343
1343
  className: "space-y-6 px-6 lg:px-8 py-6 bg-bg-canvas min-h-screen",
1344
1344
  children: /* @__PURE__ */ m(xe, { message: y("sessions.loading", "Loading sessions...") })
1345
1345
  });
1346
- if (Vr && J.length === 0) return /* @__PURE__ */ m(Ot, {
1346
+ if (Vr && J.length === 0) return /* @__PURE__ */ m(Dt, {
1347
1347
  className: "space-y-6 px-6 lg:px-8 py-6 bg-bg-canvas min-h-screen",
1348
1348
  children: /* @__PURE__ */ m(Se, {
1349
1349
  title: y("sessions.failedLoad", "Failed to load sessions"),
@@ -1468,7 +1468,7 @@ function Nt() {
1468
1468
  session: Q
1469
1469
  })
1470
1470
  ] });
1471
- if (O === "terminal") return /* @__PURE__ */ h(Ot, {
1471
+ if (O === "terminal") return /* @__PURE__ */ h(Dt, {
1472
1472
  className: "flex flex-col bg-bg-surface min-h-0 flex-1",
1473
1473
  children: [
1474
1474
  /* @__PURE__ */ h("div", {
@@ -1636,10 +1636,10 @@ function Nt() {
1636
1636
  ta
1637
1637
  ]
1638
1638
  });
1639
- let na = (e) => /* @__PURE__ */ m(Dt, {
1639
+ let na = (e) => /* @__PURE__ */ m(Et, {
1640
1640
  stagger: .04,
1641
1641
  className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4",
1642
- children: e.map((e) => /* @__PURE__ */ m(Et, { children: /* @__PURE__ */ m(Re, {
1642
+ children: e.map((e) => /* @__PURE__ */ m(Tt, { children: /* @__PURE__ */ m(Re, {
1643
1643
  session: e,
1644
1644
  onOpen: mi,
1645
1645
  onStart: yi,
@@ -1665,7 +1665,7 @@ function Nt() {
1665
1665
  onDeselectAll: ai,
1666
1666
  hideHeaderSelectAll: t
1667
1667
  });
1668
- return /* @__PURE__ */ h(Ot, {
1668
+ return /* @__PURE__ */ h(Dt, {
1669
1669
  className: "flex flex-col bg-bg-surface min-h-0 flex-1",
1670
1670
  children: [
1671
1671
  /* @__PURE__ */ h("div", {
@@ -1700,7 +1700,7 @@ function Nt() {
1700
1700
  title: y("sessions.refreshTitle", "Refresh sessions"),
1701
1701
  children: /* @__PURE__ */ m(ct, { className: `size-4 ${Br ? "animate-spin" : ""}` })
1702
1702
  }),
1703
- /* @__PURE__ */ m(Tt, {
1703
+ /* @__PURE__ */ m(kt, {
1704
1704
  label: y("sessions.export", "Export"),
1705
1705
  disabled: dn,
1706
1706
  testId: "sessions-export",
@@ -1930,7 +1930,7 @@ function Nt() {
1930
1930
  }) : null,
1931
1931
  /* @__PURE__ */ m(yt, {
1932
1932
  mode: "wait",
1933
- children: Y.length > 0 ? E === "none" ? O === "grid" ? /* @__PURE__ */ m("div", { children: na(Y) }, "grid-view") : /* @__PURE__ */ m(Et, { children: ra(Y, !1) }, "list-view") : /* @__PURE__ */ m("div", {
1933
+ children: Y.length > 0 ? E === "none" ? O === "grid" ? /* @__PURE__ */ m("div", { children: na(Y) }, "grid-view") : /* @__PURE__ */ m(Tt, { children: ra(Y, !1) }, "list-view") : /* @__PURE__ */ m("div", {
1934
1934
  className: "space-y-3",
1935
1935
  "data-testid": "sessions-grouped",
1936
1936
  children: ni.map((e) => {
@@ -1,22 +1,21 @@
1
- import { reportAssistantAiTokenUsage as e } from "@burdenoff/fe-libs/shared/assistant";
1
+ import { reportAssistantAiTokenUsage as e } from "@burdenoff/fe-libs/shared/assistant/api";
2
2
  //#region src/services/assistantApi.ts
3
- var t = "vibecontrols", n = (e) => e ?? {};
4
- function r(t, r, i, a, o, s, c) {
5
- return e(r, i, a, o, s, n(c));
6
- }
7
- async function i(e) {
8
- let { workspaceId: t, sessionId: n, messageId: i, model: a, tokens: o } = e;
9
- if (!i || !a) {
10
- console.warn("[assistant] skipping AI-credit charge — turn is missing messageId or model", {
11
- sessionId: n,
12
- hasMessageId: !!i,
13
- hasModel: !!a
14
- });
15
- return;
16
- }
17
- await r(null, t, n, i, a, o);
3
+ var t = "vibecontrols";
4
+ function n(e) {
5
+ return async ({ workspaceId: t, sessionId: n, messageId: r, model: i, tokens: a }) => {
6
+ if (!r || !i) {
7
+ console.warn("[assistant] skipping AI-credit charge — turn is missing messageId or model", {
8
+ sessionId: n,
9
+ hasMessageId: !!r,
10
+ hasModel: !!i
11
+ });
12
+ return;
13
+ }
14
+ await e(t, n, r, i, a, {});
15
+ };
18
16
  }
17
+ var r = n(e);
19
18
  //#endregion
20
- export { t as PRODUCT, i as reportAssistantTokenUsage };
19
+ export { t as PRODUCT, r as reportAssistantTokenUsage };
21
20
 
22
21
  //# sourceMappingURL=assistantApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assistantApi.js","names":[],"sources":["../../src/services/assistantApi.ts"],"sourcesContent":["/**\n * AI Assistant API thin adapter over @burdenoff/fe-libs/shared/assistant.\n *\n * The legacy slide-in panel (AssistantChatArea / AssistantMessageItem /\n * useAssistantHeartbeat) calls these with the historical (apollo-first)\n * signatures. The real implementation now lives once in fe-libs; this file only\n * maps the old signatures onto it, retiring ~775 lines of duplicated logic. The\n * `apollo` argument is vestigial (the shared layer uses graphqlFetch) and is\n * ignored; the product id + prod-runtime + TTL the shared functions need are\n * supplied here.\n */\n\nimport {\n findExistingSandbox as sharedFindExisting,\n createAssistantSandbox as sharedCreate,\n waitForSandboxRunning as sharedWaitRunning,\n waitForAssistantServiceReady as sharedWaitService,\n createAssistantSession as sharedCreateSession,\n getAssistantSession as sharedGetSession,\n sendAssistantPromptAsync as sharedSendAsync,\n getAssistantMessages as sharedGetMessages,\n extendAssistantSandboxTTL as sharedExtendTtl,\n sendHeartbeat as sharedHeartbeat,\n getAssistantArtifacts as sharedGetArtifacts,\n downloadAssistantArtifact as sharedDownloadArtifact,\n checkAssistantAiCredits as sharedCheckCredits,\n reportAssistantAiTokenUsage as sharedReportUsage,\n} from '@burdenoff/fe-libs/shared/assistant';\nimport type {\n AssistantRawMessage as SharedRawMessage,\n AssistantSandboxAuthContext as SharedAuthContext,\n AssistantSessionInfo as SharedSessionInfo,\n DownloadedAssistantArtifact,\n} from '@burdenoff/fe-libs/shared/assistant';\nimport type { AssistantArtifact as LocalAssistantArtifact, AssistantMode } from '@/types/assistant';\nimport type { PageContext } from '@/utils/pageContext';\n\n// Re-export the shared types under the names the panel already imports.\nexport type AssistantRawMessage = SharedRawMessage;\nexport type AssistantSandboxAuthContext = SharedAuthContext;\nexport type AssistantSessionInfo = SharedSessionInfo;\n\n// Vestigial Apollo arg — accepted for signature compatibility, ignored.\ntype ApolloClientLike = unknown;\n\nexport const PRODUCT = 'vibecontrols';\n// Matches the original panel behavior: create at 600s, kept warm while open by\n// useAssistantHeartbeat's +600s extend. (The floating widget keeps its own\n// longer-TTL keep-warm via the shared transport.)\nconst DEFAULT_TTL_SECONDS = 600;\n\n// Build-time env parity with the original `assistantApi.ts` image-tag selection\n// (VITE_APP_ENV === 'prod' → prod image tag). Drives getImageTagForMode.\nfunction isProdRuntime(): boolean {\n return import.meta.env.VITE_APP_ENV === 'prod';\n}\n\nconst ctx = (a?: SharedAuthContext): SharedAuthContext => a ?? {};\n\nexport function findExistingSandbox(\n _apollo: ApolloClientLike,\n workspaceId: string,\n mode: AssistantMode,\n authContext?: SharedAuthContext\n): Promise<string | null> {\n // ★ fe-libs added `product` as the SECOND argument when sandbox reuse became\n // product-isolated — without it this shim would ask for any product's sandbox.\n // `createAssistantSandbox` below already passed PRODUCT; this one had not been\n // updated, and the stale fe-libs pin hid the mismatch.\n return sharedFindExisting(workspaceId, PRODUCT, mode, isProdRuntime(), ctx(authContext));\n}\n\nexport function createAssistantSandbox(\n _apollo: ApolloClientLike,\n mode: AssistantMode,\n workspaceId: string,\n authContext?: SharedAuthContext\n): Promise<string> {\n return sharedCreate(\n PRODUCT,\n mode,\n workspaceId,\n isProdRuntime(),\n DEFAULT_TTL_SECONDS,\n ctx(authContext)\n );\n}\n\nexport function waitForSandboxReady(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n authContext?: SharedAuthContext,\n maxWaitMs = 300_000,\n _onProgress?: (message: string) => void\n): Promise<void> {\n return sharedWaitRunning(sandboxId, workspaceId, ctx(authContext), maxWaitMs);\n}\n\nexport function waitForAssistantServiceReady(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n authContext?: SharedAuthContext,\n maxWaitMs = 90_000,\n _onProgress?: (message: string) => void\n): Promise<void> {\n return sharedWaitService(sandboxId, workspaceId, ctx(authContext), maxWaitMs);\n}\n\nexport function createAssistantSession(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n mode: AssistantMode,\n authContext?: SharedAuthContext\n): Promise<{ sessionId: string }> {\n return sharedCreateSession(sandboxId, workspaceId, mode, ctx(authContext));\n}\n\nexport function getAssistantSession(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: SharedAuthContext\n): Promise<SharedSessionInfo> {\n return sharedGetSession(sandboxId, workspaceId, sessionId, ctx(authContext));\n}\n\nexport function sendAssistantPromptAsync(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n prompt: string,\n mode: AssistantMode,\n pageContext?: PageContext,\n authContext?: SharedAuthContext\n): Promise<{ messageID?: string }> {\n return sharedSendAsync(\n sandboxId,\n workspaceId,\n sessionId,\n prompt,\n mode,\n pageContext as Record<string, unknown> | undefined,\n ctx(authContext)\n );\n}\n\nexport function getAssistantMessages(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: SharedAuthContext,\n limit = 50\n): Promise<SharedRawMessage[]> {\n return sharedGetMessages(sandboxId, workspaceId, sessionId, ctx(authContext), { limit });\n}\n\nexport function checkAssistantAiCredits(\n _apollo: ApolloClientLike,\n workspaceId: string,\n authContext?: SharedAuthContext\n): Promise<boolean> {\n return sharedCheckCredits(workspaceId, ctx(authContext));\n}\n\nexport function reportAssistantAiTokenUsage(\n _apollo: ApolloClientLike,\n workspaceId: string,\n sessionId: string,\n messageId: string,\n model: string | undefined,\n tokens: { input: number; output: number },\n authContext?: SharedAuthContext\n): Promise<void> {\n return sharedReportUsage(workspaceId, sessionId, messageId, model, tokens, ctx(authContext));\n}\n\n/**\n * Object-shaped adapter for the shared product seam.\n *\n * ★ The seam's `reportTokenUsage` takes ONE object; VibeControls' own reporter\n * is positional and leads with an unused Apollo client. Rather than change a\n * signature the existing chat area still calls, adapt here the seam gets the\n * shape it declares and nothing else moves.\n *\n * ★★ A missing `messageId` or `model` is logged, not swallowed. This meter\n * exists because assistant spend was invisible; a silently skipped charge would\n * recreate exactly that blind spot, one turn at a time. Metering must never\n * break a turn, so this resolves either way.\n */\nexport async function reportAssistantTokenUsage(usage: {\n workspaceId: string;\n sessionId: string;\n messageId?: string;\n model?: string;\n tokens: { input: number; output: number };\n}): Promise<void> {\n const { workspaceId, sessionId, messageId, model, tokens } = usage;\n if (!messageId || !model) {\n console.warn('[assistant] skipping AI-credit charge — turn is missing messageId or model', {\n sessionId,\n hasMessageId: Boolean(messageId),\n hasModel: Boolean(model),\n });\n return;\n }\n await reportAssistantAiTokenUsage(\n null as never, // the positional Apollo client is unused (`_apollo`)\n workspaceId,\n sessionId,\n messageId,\n model,\n tokens\n );\n}\n\nexport function getAssistantArtifacts(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: SharedAuthContext\n): Promise<LocalAssistantArtifact[]> {\n // The shared surface widens `type` to `string`; at runtime the agent only ever\n // returns 'file' | 'directory', so the array is structurally the local type.\n return sharedGetArtifacts(sandboxId, workspaceId, sessionId, ctx(authContext)).then(\n (artifacts) => artifacts as unknown as LocalAssistantArtifact[]\n );\n}\n\nexport function downloadAssistantArtifact(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n artifactPath: string,\n authContext?: SharedAuthContext\n): Promise<DownloadedAssistantArtifact> {\n return sharedDownloadArtifact(sandboxId, workspaceId, sessionId, artifactPath, ctx(authContext));\n}\n\nexport function sendHeartbeat(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: SharedAuthContext\n): Promise<void> {\n return sharedHeartbeat(sandboxId, workspaceId, sessionId, ctx(authContext));\n}\n\nexport function extendAssistantSandboxTTL(\n _apollo: ApolloClientLike,\n sandboxId: string,\n workspaceId: string,\n additionalSeconds = 600,\n authContext?: SharedAuthContext\n): Promise<void> {\n return sharedExtendTtl(sandboxId, workspaceId, additionalSeconds, ctx(authContext));\n}\n"],"mappings":";;AA6CA,IAAa,IAAU,gBAYjB,KAAO,MAA6C,KAAK,EAAE;AAiHjE,SAAgB,EACd,GACA,GACA,GACA,GACA,GACA,GACA,GACe;AACf,QAAO,EAAkB,GAAa,GAAW,GAAW,GAAO,GAAQ,EAAI,EAAY,CAAC;;AAgB9F,eAAsB,EAA0B,GAM9B;CAChB,IAAM,EAAE,gBAAa,cAAW,cAAW,UAAO,cAAW;AAC7D,KAAI,CAAC,KAAa,CAAC,GAAO;AACxB,UAAQ,KAAK,8EAA8E;GACzF;GACA,cAAc,EAAQ;GACtB,UAAU,EAAQ;GACnB,CAAC;AACF;;AAEF,OAAM,EACJ,MACA,GACA,GACA,GACA,GACA,EACD"}
1
+ {"version":3,"file":"assistantApi.js","names":[],"sources":["../../src/services/assistantApi.ts"],"sourcesContent":["/**\n * What VibeControls' assistant needs from the shared assistant API, and nothing more.\n *\n * This file used to be a ~265-line adapter mapping the pre-migration panel's\n * apollo-first signatures onto `@burdenoff/fe-libs/shared/assistant`. That panel\n * (the pre-migration fork, with its own persisted store) is deleted; the mounted\n * panel is fe-libs' own and calls the shared API directly. What remains is the\n * two answers only this product can give: its id, and how a turn's cost is\n * charged.\n */\n\nimport { reportAssistantAiTokenUsage } from '@burdenoff/fe-libs/shared/assistant/api';\n\n/**\n * The product id. The SAME value fe-libs sends as `AI_ASSISTANT_PRODUCT` and the\n * prefix of every `vibecontrols.assistant.*` translation key, so it has exactly\n * one source.\n */\nexport const PRODUCT = 'vibecontrols';\n\n/** The usage the shared panel reports once per completed turn (the seam's `reportTokenUsage`). */\nexport interface AssistantTokenUsage {\n workspaceId: string;\n sessionId: string;\n messageId?: string;\n model?: string;\n tokens: { input: number; output: number };\n}\n\n/** The shared charge, positional, as `@burdenoff/fe-libs/shared/assistant/api` declares it. */\nexport type ChargeAssistantTokenUsage = typeof reportAssistantAiTokenUsage;\n\n/**\n * Build the seam's `reportTokenUsage` over a positional charge.\n *\n * ★ The charge is a parameter so the adapter's decisions what it forwards and\n * when it refuses can be tested without a gateway. Production passes the\n * shared function and nothing else.\n *\n * ★★ A missing `messageId` or `model` is logged, not swallowed. This meter\n * exists because assistant spend was invisible; a silently skipped charge would\n * recreate exactly that blind spot, one turn at a time. The shared panel catches\n * a rejected charge, so a metering failure never breaks a turn.\n */\nexport function createAssistantTokenUsageReporter(\n charge: ChargeAssistantTokenUsage\n): (usage: AssistantTokenUsage) => Promise<void> {\n return async ({ workspaceId, sessionId, messageId, model, tokens }) => {\n if (!messageId || !model) {\n console.warn('[assistant] skipping AI-credit charge — turn is missing messageId or model', {\n sessionId,\n hasMessageId: Boolean(messageId),\n hasModel: Boolean(model),\n });\n return;\n }\n await charge(workspaceId, sessionId, messageId, model, tokens, {});\n };\n}\n\n/** VibeControls' `reportTokenUsage`: the shared `ReportAiTokenUsage` charge. */\nexport const reportAssistantTokenUsage = createAssistantTokenUsageReporter(\n reportAssistantAiTokenUsage\n);\n"],"mappings":";;AAkBA,IAAa,IAAU;AA0BvB,SAAgB,EACd,GAC+C;AAC/C,QAAO,OAAO,EAAE,gBAAa,cAAW,cAAW,UAAO,gBAAa;AACrE,MAAI,CAAC,KAAa,CAAC,GAAO;AACxB,WAAQ,KAAK,8EAA8E;IACzF;IACA,cAAc,EAAQ;IACtB,UAAU,EAAQ;IACnB,CAAC;AACF;;AAEF,QAAM,EAAO,GAAa,GAAW,GAAW,GAAO,GAAQ,EAAE,CAAC;;;AAKtE,IAAa,IAA4B,EACvC,EACD"}
@@ -1,15 +1,15 @@
1
- import { gatherPageContext as e } from "../utils/pageContext.js";
2
- import { dispatchAssistantQuotaExhausted as t, notifyAiCreditsUpdated as n } from "../utils/aiCredits.js";
1
+ import { dispatchAssistantQuotaExhausted as e, notifyAiCreditsUpdated as t } from "../utils/aiCredits.js";
2
+ import { gatherPageContext as n } from "../utils/pageContext.js";
3
3
  import { useSandboxAssistantTransport as r } from "@burdenoff/fe-libs/shared/assistant";
4
4
  //#region src/services/createSandboxAssistantTransport.ts
5
5
  function i(i = "assistant") {
6
6
  return r({
7
7
  product: "vibecontrols",
8
8
  mode: i,
9
- gatherPageContext: e,
9
+ gatherPageContext: n,
10
10
  enableCredits: !0,
11
- onQuotaExhausted: () => t("ai-credits"),
12
- onCreditsUpdated: () => n()
11
+ onQuotaExhausted: () => e("ai-credits"),
12
+ onCreditsUpdated: () => t()
13
13
  });
14
14
  }
15
15
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.js","names":[],"sources":["../../src/types/assistant.ts"],"sourcesContent":["/**\n * AI Assistant types.\n *\n * Defines the data model for the right-pane AI assistant panel.\n * Interface shapes align with aiApi.ts (AISession, AISessionLog), which is\n * the real workspace gateway backed assistant contract.\n */\n\nimport { ASSISTANT_USECASE_CONFIG, type AssistantUsecaseId } from '@/config/assistantUsecases';\n\nexport type AssistantMode = AssistantUsecaseId;\n\nexport type AssistantSandboxStatus = 'none' | 'provisioning' | 'running' | 'stopping' | 'error';\n\nexport type AssistantConversationStatus =\n 'idle' | 'provisioning' | 'connecting' | 'streaming' | 'complete' | 'error';\n\nexport interface AssistantArtifact {\n name: string;\n path: string;\n type: 'file' | 'directory';\n size: number;\n downloadPath?: string;\n}\n\nexport interface AssistantMessageMetadata {\n artifacts?: AssistantArtifact[];\n mode?: AssistantMode;\n sandboxId?: string;\n sessionId?: string;\n [key: string]: unknown;\n}\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: string;\n tokens?: { input: number; output: number };\n metadata?: AssistantMessageMetadata;\n}\n\nexport interface Conversation {\n id: string;\n title: string;\n mode: AssistantMode;\n messages: Message[];\n createdAt: string;\n updatedAt: string;\n /** Backend session ID for this conversation */\n backendSessionId?: string | null;\n}\n\nexport interface AssistantSandboxRuntime {\n sandboxId: string;\n status: AssistantSandboxStatus;\n}\n\nexport interface AssistantConversationProcessing {\n status: AssistantConversationStatus;\n messageId: string | null;\n error?: string | null;\n updatedAt: string;\n}\n\nexport interface AssistantModeConfig {\n id: AssistantMode;\n label: string;\n description: string;\n suggestions: readonly string[];\n}\n\nexport const ASSISTANT_MODES: AssistantModeConfig[] = [...ASSISTANT_USECASE_CONFIG];\n"],"mappings":";;AAwEA,IAAa,IAAyC,CAAC,GAAG,EAAyB"}
1
+ {"version":3,"file":"assistant.js","names":[],"sources":["../../src/types/assistant.ts"],"sourcesContent":["/**\n * AI Assistant types.\n *\n * What the shared fe-libs panel reads from VibeControls: the mode ids this\n * product offers and their configs. The message, conversation, sandbox and\n * artifact shapes the pre-migration fork declared here are gone with it; the\n * mounted panel uses fe-libs' own.\n */\n\nimport type { AssistantModeConfig as SharedAssistantModeConfig } from '@burdenoff/fe-libs/shared/assistant/conversation';\nimport { ASSISTANT_USECASE_CONFIG, type AssistantUsecaseId } from '@/config/assistantUsecases';\n\nexport type AssistantMode = AssistantUsecaseId;\n\n/**\n * One mode as the shared panel reads it, narrowed to the IDs this product offers.\n *\n * EXTENDS the fe-libs shape rather than restating it. The copy this replaced\n * listed four fields and not `requiresAdmin` / `writeCapable`, so nothing typed\n * against it could read the two flags the admin gate and the consent dialog run\n * on. Extending means a field fe-libs adds is here too, with its meaning.\n */\nexport interface AssistantModeConfig extends SharedAssistantModeConfig {\n id: AssistantMode;\n}\n\n/** The modes VibeControls offers, flags included. The product's answer, not the library's. */\nexport const ASSISTANT_MODES: AssistantModeConfig[] = [...ASSISTANT_USECASE_CONFIG];\n"],"mappings":";;AA2BA,IAAa,IAAyC,CAAC,GAAG,EAAyB"}
@@ -1 +1 @@
1
- {"version":3,"file":"assistantPrompt.js","names":[],"sources":["../../src/utils/assistantPrompt.ts"],"sourcesContent":["/**\n * Soft confirm-before-mutate guardrail for the assistant's api-calls (write)\n * mode, plus the language and dictation instructions.\n *\n * The in-sandbox agent executes mutations autonomously — there is no hard\n * server-side confirmation — so we prepend a describe-and-confirm instruction to\n * the user's TURN, not to the session system prompt. Sending it as `system`\n * would REPLACE the whole mode prompt and silently delete the agent's api-calls\n * behaviour along with it.\n *\n * This is ADVISORY. The dependable guard is the host-side consent dialog plus\n * the admin gate.\n */\n\nimport type { AssistantMode } from '@/types/assistant';\n\n/**\n * Marks where our instructions stop and the user's words begin. Exactly one may\n * exist in a prompt, and it must be last — see `buildPromptForMode`.\n */\nexport const USER_REQUEST_DELIMITER = '--- User request ---';\n\nexport const API_CALLS_CONFIRM_PREAMBLE = [\n \"You are in api-calls mode for VibeControls and can run GraphQL queries and mutations on the user's behalf.\",\n 'Before performing ANY write (create, update, delete — any mutation):',\n '1. State exactly what you are about to change (entity, fields, and values).',\n '2. Ask the user to confirm, and WAIT for an explicit \"yes\"/\"confirm\" before executing it.',\n 'Read-only queries may run without confirmation. Confirm each write separately; never batch mutations behind a single confirmation.',\n '',\n USER_REQUEST_DELIMITER,\n].join('\\n');\n\n/**\n * Ask for the reply in the user's language.\n *\n * ★ Nothing else does. The sandbox system prompt carries no language\n * instruction and the grounding documentation is entirely in English, so every\n * force in the session pushes the answer towards English regardless of what the\n * user wrote. The model's tendency to mirror its input is the only thing\n * resisting that, and it loses.\n *\n * The second clause is the one that matters: **translate the docs, do not\n * switch to their language.** Without it a grounded answer drifts back to\n * English mid-reply simply because the source material is English.\n */\nfunction buildLanguagePreamble(languageName: string, isExplicitChoice: boolean): string {\n return [\n isExplicitChoice\n ? `Reply in ${languageName}. The user has explicitly chosen this language, so use it even if they write to you in another one.`\n : `Reply in ${languageName}, matching the language the user wrote in.`,\n `Translate any English documentation you ground your answer in into ${languageName} rather than switching to English to quote it.`,\n 'Keep identifiers, code, CLI flags, API field names and product nouns in their original form — translating them would make them wrong.',\n ].join('\\n');\n}\n\n/**\n * Told to the model when the turn was SPOKEN rather than typed.\n *\n * ★ Speech recognition does not fail uniformly — it fails on specific words,\n * and in VibeControls the ones it fails on are predictable: identifiers, CLI\n * flags, and the product's own nouns. A recogniser has no model for \"vibe\",\n * \"tunnel\", or a session id read aloud, so a sentence comes back mostly right\n * with the load-bearing words wrong.\n *\n * The model is far better placed to repair that than the recogniser is, because\n * it has the product context — but only if it is TOLD the text was dictated.\n * Otherwise it answers the garbled token literally, which is what makes the\n * assistant look like it misunderstood.\n *\n * ★ The refusal to guess is the important half. Charitable interpretation is\n * right for a mangled verb and wrong for a mangled IDENTIFIER: acting on a\n * misheard session or agent id operates on someone else's resource. One extra\n * question costs a few seconds.\n */\nconst DICTATION_PREAMBLE = [\n 'This turn was DICTATED, so treat unusual words as probable speech-recognition errors rather than as what the user meant.',\n 'Repair obvious mis-hearings of technical terms, product nouns, CLI flags and command names using the surrounding context.',\n 'Do NOT guess at a mis-heard identifier, id, quantity, or destination — ask which one the user meant before acting on it.',\n].join('\\n');\n\n/** A dictated turn is a SPOKEN conversation, so the reply is spoken too. */\nconst VOICE_REPLY_PREAMBLE = [\n 'Your reply will be read aloud. Write it to be heard, not scanned:',\n 'short sentences, no markdown syntax, no tables, and no code blocks unless the user asked for code.',\n].join('\\n');\n\n/**\n * Compose the turn actually sent to the agent.\n *\n * Ordering is deliberate. Dictation goes AFTER the language lines and before the\n * delimiter: it is an instruction about the user's text, so it belongs with the\n * instructions rather than inside them.\n *\n * ★ `USER_REQUEST_DELIMITER` is emitted exactly once, here. The api-calls\n * preamble ends with its own copy, so it must not be added again — a second one\n * mid-prompt leaves the safety instructions sitting *after* a \"User request\"\n * marker, i.e. presented to the model as though the user had written them.\n */\nexport function buildPromptForMode(\n mode: AssistantMode,\n content: string,\n languageName?: string,\n isExplicitChoice = false,\n dictated = false\n): string {\n const preamble = [\n languageName ? buildLanguagePreamble(languageName, isExplicitChoice) : '',\n dictated ? DICTATION_PREAMBLE : '',\n dictated ? VOICE_REPLY_PREAMBLE : '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n const language = preamble ? `${preamble}\\n\\n` : '';\n if (mode === 'api-calls') return `${language}${API_CALLS_CONFIRM_PREAMBLE}\\n${content}`;\n return language ? `${language}${USER_REQUEST_DELIMITER}\\n${content}` : content;\n}\n"],"mappings":";AAoBA,IAAa,IAAyB,wBAEzB,IAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,KAAK,KAAK;AAeZ,SAAS,EAAsB,GAAsB,GAAmC;AACtF,QAAO;EACL,IACI,YAAY,EAAa,uGACzB,YAAY,EAAa;EAC7B,sEAAsE,EAAa;EACnF;EACD,CAAC,KAAK,KAAK;;AAsBd,IAAM,IAAqB;CACzB;CACA;CACA;CACD,CAAC,KAAK,KAAK,EAGN,IAAuB,CAC3B,qEACA,qGACD,CAAC,KAAK,KAAK;AAcZ,SAAgB,EACd,GACA,GACA,GACA,IAAmB,IACnB,IAAW,IACH;CACR,IAAM,IAAW;EACf,IAAe,EAAsB,GAAc,EAAiB,GAAG;EACvE,IAAW,IAAqB;EAChC,IAAW,IAAuB;EACnC,CACE,OAAO,QAAQ,CACf,KAAK,OAAO,EACT,IAAW,IAAW,GAAG,EAAS,QAAQ;AAEhD,QADI,MAAS,cAAoB,GAAG,IAAW,EAA2B,IAAI,MACvE,IAAW,GAAG,IAAW,EAAuB,IAAI,MAAY"}
1
+ {"version":3,"file":"assistantPrompt.js","names":[],"sources":["../../src/utils/assistantPrompt.ts"],"sourcesContent":["/**\n * Soft confirm-before-mutate guardrail for the assistant's api-calls (write)\n * mode, plus the language and dictation instructions.\n *\n * The in-sandbox agent executes mutations autonomously — there is no hard\n * server-side confirmation — so we prepend a describe-and-confirm instruction to\n * the user's TURN, not to the session system prompt. Sending it as `system`\n * would REPLACE the whole mode prompt and silently delete the agent's api-calls\n * behaviour along with it.\n *\n * This is ADVISORY. The dependable guard is the host-side consent dialog plus\n * the admin gate.\n */\n\n/**\n * ★ The TRANSPORT's mode type, not this product's narrower list. The shared panel\n * calls `buildPrompt` with whatever mode its store holds, which can be one this\n * product no longer offers (a stored `general`) until the panel resets it, so\n * the parameter has to accept every mode the panel can send.\n */\nimport type { AssistantMode } from '@burdenoff/fe-libs/shared/assistant/types';\n\n/**\n * Marks where our instructions stop and the user's words begin. Exactly one may\n * exist in a prompt, and it must be last — see `buildPromptForMode`.\n */\nexport const USER_REQUEST_DELIMITER = '--- User request ---';\n\nexport const API_CALLS_CONFIRM_PREAMBLE = [\n \"You are in api-calls mode for VibeControls and can run GraphQL queries and mutations on the user's behalf.\",\n 'Before performing ANY write (create, update, delete — any mutation):',\n '1. State exactly what you are about to change (entity, fields, and values).',\n '2. Ask the user to confirm, and WAIT for an explicit \"yes\"/\"confirm\" before executing it.',\n 'Read-only queries may run without confirmation. Confirm each write separately; never batch mutations behind a single confirmation.',\n '',\n USER_REQUEST_DELIMITER,\n].join('\\n');\n\n/**\n * Ask for the reply in the user's language.\n *\n * ★ Nothing else does. The sandbox system prompt carries no language\n * instruction and the grounding documentation is entirely in English, so every\n * force in the session pushes the answer towards English regardless of what the\n * user wrote. The model's tendency to mirror its input is the only thing\n * resisting that, and it loses.\n *\n * The second clause is the one that matters: **translate the docs, do not\n * switch to their language.** Without it a grounded answer drifts back to\n * English mid-reply simply because the source material is English.\n */\nfunction buildLanguagePreamble(languageName: string, isExplicitChoice: boolean): string {\n return [\n isExplicitChoice\n ? `Reply in ${languageName}. The user has explicitly chosen this language, so use it even if they write to you in another one.`\n : `Reply in ${languageName}, matching the language the user wrote in.`,\n `Translate any English documentation you ground your answer in into ${languageName} rather than switching to English to quote it.`,\n 'Keep identifiers, code, CLI flags, API field names and product nouns in their original form — translating them would make them wrong.',\n ].join('\\n');\n}\n\n/**\n * Told to the model when the turn was SPOKEN rather than typed.\n *\n * ★ Speech recognition does not fail uniformly — it fails on specific words,\n * and in VibeControls the ones it fails on are predictable: identifiers, CLI\n * flags, and the product's own nouns. A recogniser has no model for \"vibe\",\n * \"tunnel\", or a session id read aloud, so a sentence comes back mostly right\n * with the load-bearing words wrong.\n *\n * The model is far better placed to repair that than the recogniser is, because\n * it has the product context — but only if it is TOLD the text was dictated.\n * Otherwise it answers the garbled token literally, which is what makes the\n * assistant look like it misunderstood.\n *\n * ★ The refusal to guess is the important half. Charitable interpretation is\n * right for a mangled verb and wrong for a mangled IDENTIFIER: acting on a\n * misheard session or agent id operates on someone else's resource. One extra\n * question costs a few seconds.\n */\nconst DICTATION_PREAMBLE = [\n 'This turn was DICTATED, so treat unusual words as probable speech-recognition errors rather than as what the user meant.',\n 'Repair obvious mis-hearings of technical terms, product nouns, CLI flags and command names using the surrounding context.',\n 'Do NOT guess at a mis-heard identifier, id, quantity, or destination — ask which one the user meant before acting on it.',\n].join('\\n');\n\n/** A dictated turn is a SPOKEN conversation, so the reply is spoken too. */\nconst VOICE_REPLY_PREAMBLE = [\n 'Your reply will be read aloud. Write it to be heard, not scanned:',\n 'short sentences, no markdown syntax, no tables, and no code blocks unless the user asked for code.',\n].join('\\n');\n\n/**\n * Compose the turn actually sent to the agent.\n *\n * Ordering is deliberate. Dictation goes AFTER the language lines and before the\n * delimiter: it is an instruction about the user's text, so it belongs with the\n * instructions rather than inside them.\n *\n * ★ `USER_REQUEST_DELIMITER` is emitted exactly once, here. The api-calls\n * preamble ends with its own copy, so it must not be added again — a second one\n * mid-prompt leaves the safety instructions sitting *after* a \"User request\"\n * marker, i.e. presented to the model as though the user had written them.\n */\nexport function buildPromptForMode(\n mode: AssistantMode,\n content: string,\n languageName?: string,\n isExplicitChoice = false,\n dictated = false\n): string {\n const preamble = [\n languageName ? buildLanguagePreamble(languageName, isExplicitChoice) : '',\n dictated ? DICTATION_PREAMBLE : '',\n dictated ? VOICE_REPLY_PREAMBLE : '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n const language = preamble ? `${preamble}\\n\\n` : '';\n if (mode === 'api-calls') return `${language}${API_CALLS_CONFIRM_PREAMBLE}\\n${content}`;\n return language ? `${language}${USER_REQUEST_DELIMITER}\\n${content}` : content;\n}\n"],"mappings":";AA0BA,IAAa,IAAyB,wBAEzB,IAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,KAAK,KAAK;AAeZ,SAAS,EAAsB,GAAsB,GAAmC;AACtF,QAAO;EACL,IACI,YAAY,EAAa,uGACzB,YAAY,EAAa;EAC7B,sEAAsE,EAAa;EACnF;EACD,CAAC,KAAK,KAAK;;AAsBd,IAAM,IAAqB;CACzB;CACA;CACA;CACD,CAAC,KAAK,KAAK,EAGN,IAAuB,CAC3B,qEACA,qGACD,CAAC,KAAK,KAAK;AAcZ,SAAgB,EACd,GACA,GACA,GACA,IAAmB,IACnB,IAAW,IACH;CACR,IAAM,IAAW;EACf,IAAe,EAAsB,GAAc,EAAiB,GAAG;EACvE,IAAW,IAAqB;EAChC,IAAW,IAAuB;EACnC,CACE,OAAO,QAAQ,CACf,KAAK,OAAO,EACT,IAAW,IAAW,GAAG,EAAS,QAAQ;AAEhD,QADI,MAAS,cAAoB,GAAG,IAAW,EAA2B,IAAI,MACvE,IAAW,GAAG,IAAW,EAAuB,IAAI,MAAY"}
@@ -38,16 +38,16 @@ function r(e, t) {
38
38
  function i(e, t) {
39
39
  let n = new URLSearchParams(t);
40
40
  for (let [t, n] of [
41
- [/^\/vibecontrols\/agents\/([^/]+)$/, "VIBECONTROLS_AGENT"],
42
- [/^\/vibecontrols\/sessions\/([^/]+)$/, "VIBECONTROLS_SESSION"],
43
- [/^\/vibecontrols\/vibes\/([^/]+)$/, "VIBECONTROLS_VIBE"],
44
- [/^\/vibecontrols\/notes\/([^/]+)$/, "VIBECONTROLS_NOTE"],
45
- [/^\/vibecontrols\/catalogs\/([^/]+)$/, "VIBECONTROLS_CATALOG"],
46
- [/^\/vibecontrols\/components\/([^/]+)$/, "VIBECONTROLS_COMPONENT"],
47
- [/^\/vibecontrols\/templates\/([^/]+)$/, "VIBECONTROLS_TEMPLATE"],
48
- [/^\/vibecontrols\/tunnels\/([^/]+)$/, "VIBECONTROLS_TUNNEL"],
49
- [/^\/vibecontrols\/calendar\/task\/([^/]+)$/, "VIBECONTROLS_TASK"],
50
- [/^\/vibecontrols\/ai\/sessions\/([^/]+)$/, "VIBECONTROLS_AI_SESSION"]
41
+ [/^\/vibecontrols\/agents\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_AGENT"],
42
+ [/^\/vibecontrols\/sessions\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_SESSION"],
43
+ [/^\/vibecontrols\/vibes\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_VIBE"],
44
+ [/^\/vibecontrols\/notes\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_NOTE"],
45
+ [/^\/vibecontrols\/catalogs\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_CATALOG"],
46
+ [/^\/vibecontrols\/components\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_COMPONENT"],
47
+ [/^\/vibecontrols\/templates\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_TEMPLATE"],
48
+ [/^\/vibecontrols\/tunnels\/(?!new\/?$)([^/]+)\/?$/, "VIBECONTROLS_TUNNEL"],
49
+ [/^\/vibecontrols\/calendar\/task\/([^/]+)\/?$/, "VIBECONTROLS_TASK"],
50
+ [/^\/vibecontrols\/ai\/sessions\/([^/]+)\/?$/, "VIBECONTROLS_AI_SESSION"]
51
51
  ]) {
52
52
  let i = r(t, e);
53
53
  if (i) return {
@@ -1 +1 @@
1
- {"version":3,"file":"pageContext.js","names":[],"sources":["../../src/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering — captures the user's current browser context\n * to be sent alongside every assistant prompt for better AI awareness.\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * ★ A `type` alias, deliberately, not an `interface`.\n *\n * fe-libs' `PageContext` carries an index signature (`[key: string]: unknown`)\n * so products can add their own keys. TypeScript grants a type alias an\n * IMPLICIT index signature and an interface none, so declaring this as an\n * interface makes it un-assignable to the seam's `gatherPageContext` — with an\n * error that talks about index signatures rather than about the seam.\n * HealthyBowl's equivalent is a type alias for exactly this reason.\n */\nexport type PageContext = {\n // `currentUrl` (NOT `activeUrl`) — must match the agent's allowed-context-key\n // contract, otherwise the agent filters it out.\n currentUrl: string;\n currentPage: string;\n // The entity the user is currently looking at, resolved from the route. Lets\n // the assistant act on \"this / current / here\" without asking for an id.\n entityType?: string;\n entityId?: string;\n platform: string;\n version: string;\n viewportSize: string;\n userAgent: string;\n timestamp: string;\n};\n\n/**\n * Human-readable names for VibeControls' top-level routes.\n *\n * ★ This is the label a USER would use for the page, not the route segment. It\n * reaches the model as \"the user is on the Sessions page\", so `sessions` →\n * `Sessions` is fine but `ai` → `AI` matters: the fallback title-caser would\n * produce \"Ai\", and an assistant that calls it that sounds like it has never\n * seen the product.\n *\n * Unlisted segments fall through to the title-caser, so a new route degrades to\n * something reasonable rather than to nothing.\n */\nconst PAGE_LABELS: Record<string, string> = {\n home: 'Home',\n agents: 'Agents',\n sessions: 'Sessions',\n vibes: 'Vibes',\n notes: 'Notes',\n catalogs: 'Catalogs',\n components: 'Components',\n templates: 'Templates',\n tunnels: 'Tunnels',\n calendar: 'Calendar',\n ai: 'AI',\n settings: 'Settings',\n plugins: 'Plugins',\n};\n\n/**\n * What to CALL the page the user is on.\n *\n * Feeds the assistant's empty state (\"Ask about Sessions…\") and the shared\n * panel's live page label. Distinct from `gatherPageContext`, which produces\n * machine-readable context: this one is read by a human.\n */\nexport function describeCurrentPage(): string {\n const { currentPage } = gatherPageContext();\n // `currentPage` is up to three path segments; the product mount segment is\n // first when present, so skip it rather than labelling every page \"Vibecontrols\".\n const segments = currentPage.split('/').filter(Boolean);\n const first = (segments[0] === 'vibecontrols' ? segments[1] : segments[0]) ?? '';\n if (!first || first === 'home') return PAGE_LABELS.home;\n return (\n PAGE_LABELS[first] ??\n first\n .split('-')\n .map((word) => (word ? word.charAt(0).toUpperCase() + word.slice(1) : word))\n .join(' ')\n );\n}\n\nexport function gatherPageContext(): PageContext {\n const url = window.location.href;\n const pathSegments = window.location.pathname.split('/').filter(Boolean);\n const currentPage = pathSegments.slice(0, 3).join('/') || 'home';\n const entity = resolveVibeControlsConversationContext(\n window.location.pathname,\n window.location.search\n );\n\n return {\n currentUrl: url,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n platform: 'vibecontrols',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.402.1',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction matchPath(pattern: RegExp, pathname: string): RegExpMatchArray | null {\n return pathname.match(pattern);\n}\n\nexport function resolveVibeControlsConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n const directMatches: Array<[RegExp, string]> = [\n [/^\\/vibecontrols\\/agents\\/([^/]+)$/, 'VIBECONTROLS_AGENT'],\n [/^\\/vibecontrols\\/sessions\\/([^/]+)$/, 'VIBECONTROLS_SESSION'],\n [/^\\/vibecontrols\\/vibes\\/([^/]+)$/, 'VIBECONTROLS_VIBE'],\n [/^\\/vibecontrols\\/notes\\/([^/]+)$/, 'VIBECONTROLS_NOTE'],\n [/^\\/vibecontrols\\/catalogs\\/([^/]+)$/, 'VIBECONTROLS_CATALOG'],\n [/^\\/vibecontrols\\/components\\/([^/]+)$/, 'VIBECONTROLS_COMPONENT'],\n [/^\\/vibecontrols\\/templates\\/([^/]+)$/, 'VIBECONTROLS_TEMPLATE'],\n [/^\\/vibecontrols\\/tunnels\\/([^/]+)$/, 'VIBECONTROLS_TUNNEL'],\n [/^\\/vibecontrols\\/calendar\\/task\\/([^/]+)$/, 'VIBECONTROLS_TASK'],\n [/^\\/vibecontrols\\/ai\\/sessions\\/([^/]+)$/, 'VIBECONTROLS_AI_SESSION'],\n ];\n\n for (const [pattern, entityType] of directMatches) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n if (/^\\/vibecontrols\\/vibes\\/[^/]+\\/docs\\//.test(pathname)) {\n const match = pathname.match(/^\\/vibecontrols\\/vibes\\/([^/]+)\\/docs\\//);\n return {\n entityType: 'VIBECONTROLS_DOCSSITE',\n entityId: match?.[1],\n };\n }\n\n if (/^\\/vibecontrols\\/catalogs\\/[^/]+\\/docs\\//.test(pathname)) {\n const match = pathname.match(/^\\/vibecontrols\\/catalogs\\/([^/]+)\\/docs\\//);\n return {\n entityType: 'VIBECONTROLS_DOCSPAGE',\n entityId: match?.[1],\n };\n }\n\n if (/^\\/vibecontrols\\/components\\/[^/]+\\/docs\\//.test(pathname)) {\n const match = pathname.match(/^\\/vibecontrols\\/components\\/([^/]+)\\/docs\\//);\n return {\n entityType: 'VIBECONTROLS_DOCSPAGE',\n entityId: match?.[1],\n };\n }\n\n const activeTab =\n params.get('tab') ??\n (() => {\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 2 ? segments[segments.length - 1] : undefined;\n })();\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n ...(params.get('selectedTargetId')\n ? { selectedTargetId: params.get('selectedTargetId') }\n : {}),\n ...(params.get('actionId') ? { actionId: params.get('actionId') } : {}),\n },\n };\n}\n"],"mappings":";AAkDA,IAAM,IAAsC;CAC1C,MAAM;CACN,QAAQ;CACR,UAAU;CACV,OAAO;CACP,OAAO;CACP,UAAU;CACV,YAAY;CACZ,WAAW;CACX,SAAS;CACT,UAAU;CACV,IAAI;CACJ,UAAU;CACV,SAAS;CACV;AASD,SAAgB,IAA8B;CAC5C,IAAM,EAAE,mBAAgB,GAAmB,EAGrC,IAAW,EAAY,MAAM,IAAI,CAAC,OAAO,QAAQ,EACjD,KAAS,EAAS,OAAO,iBAAiB,EAAS,KAAK,EAAS,OAAO;AAE9E,QADI,CAAC,KAAS,MAAU,SAAe,EAAY,OAEjD,EAAY,MACZ,EACG,MAAM,IAAI,CACV,KAAK,MAAU,KAAO,EAAK,OAAO,EAAE,CAAC,aAAa,GAAG,EAAK,MAAM,EAAE,CAAS,CAC3E,KAAK,IAAI;;AAIhB,SAAgB,IAAiC;CAC/C,IAAM,IAAM,OAAO,SAAS,MAEtB,IADe,OAAO,SAAS,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACvC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,QACpD,IAAS,EACb,OAAO,SAAS,UAChB,OAAO,SAAS,OACjB;AAED,QAAO;EACL,YAAY;EACZ;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,UAAU;EACV,SAA6C;EAC7C,cAAc,GAAG,OAAO,WAAW,GAAG,OAAO;EAC7C,WAAW,UAAU;EACrB,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC;;AAGH,SAAS,EAAU,GAAiB,GAA2C;AAC7E,QAAO,EAAS,MAAM,EAAQ;;AAGhC,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO;AAc1C,MAAK,IAAM,CAAC,GAAS,MAb0B;EAC7C,CAAC,qCAAqC,qBAAqB;EAC3D,CAAC,uCAAuC,uBAAuB;EAC/D,CAAC,oCAAoC,oBAAoB;EACzD,CAAC,oCAAoC,oBAAoB;EACzD,CAAC,uCAAuC,uBAAuB;EAC/D,CAAC,yCAAyC,yBAAyB;EACnE,CAAC,wCAAwC,wBAAwB;EACjE,CAAC,sCAAsC,sBAAsB;EAC7D,CAAC,6CAA6C,oBAAoB;EAClE,CAAC,2CAA2C,0BAA0B;EACvE,EAEkD;EACjD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,EACF,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;AAIL,KAAI,wCAAwC,KAAK,EAAS,CAExD,QAAO;EACL,YAAY;EACZ,UAHY,EAAS,MAAM,0CAA0C,GAGnD;EACnB;AAGH,KAAI,2CAA2C,KAAK,EAAS,CAE3D,QAAO;EACL,YAAY;EACZ,UAHY,EAAS,MAAM,6CAA6C,GAGtD;EACnB;AAGH,KAAI,6CAA6C,KAAK,EAAS,CAE7D,QAAO;EACL,YAAY;EACZ,UAHY,EAAS,MAAM,+CAA+C,GAGxD;EACnB;CAGH,IAAM,IACJ,EAAO,IAAI,MAAM,WACV;EACL,IAAM,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AACpD,SAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;KAC3D;AAEN,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU;GACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE;GAClC,GAAI,EAAO,IAAI,mBAAmB,GAC9B,EAAE,kBAAkB,EAAO,IAAI,mBAAmB,EAAE,GACpD,EAAE;GACN,GAAI,EAAO,IAAI,WAAW,GAAG,EAAE,UAAU,EAAO,IAAI,WAAW,EAAE,GAAG,EAAE;GACvE;EACF"}
1
+ {"version":3,"file":"pageContext.js","names":[],"sources":["../../src/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering — captures the user's current browser context\n * to be sent alongside every assistant prompt for better AI awareness.\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * ★ A `type` alias, deliberately, not an `interface`.\n *\n * fe-libs' `PageContext` carries an index signature (`[key: string]: unknown`)\n * so products can add their own keys. TypeScript grants a type alias an\n * IMPLICIT index signature and an interface none, so declaring this as an\n * interface makes it un-assignable to the seam's `gatherPageContext` — with an\n * error that talks about index signatures rather than about the seam.\n * HealthyBowl's equivalent is a type alias for exactly this reason.\n */\nexport type PageContext = {\n // `currentUrl` (NOT `activeUrl`) — must match the agent's allowed-context-key\n // contract, otherwise the agent filters it out.\n currentUrl: string;\n currentPage: string;\n // The entity the user is currently looking at, resolved from the route. Lets\n // the assistant act on \"this / current / here\" without asking for an id.\n entityType?: string;\n entityId?: string;\n platform: string;\n version: string;\n viewportSize: string;\n userAgent: string;\n timestamp: string;\n};\n\n/**\n * Human-readable names for VibeControls' top-level routes.\n *\n * ★ This is the label a USER would use for the page, not the route segment. It\n * reaches the model as \"the user is on the Sessions page\", so `sessions` →\n * `Sessions` is fine but `ai` → `AI` matters: the fallback title-caser would\n * produce \"Ai\", and an assistant that calls it that sounds like it has never\n * seen the product.\n *\n * Unlisted segments fall through to the title-caser, so a new route degrades to\n * something reasonable rather than to nothing.\n */\nconst PAGE_LABELS: Record<string, string> = {\n home: 'Home',\n agents: 'Agents',\n sessions: 'Sessions',\n vibes: 'Vibes',\n notes: 'Notes',\n catalogs: 'Catalogs',\n components: 'Components',\n templates: 'Templates',\n tunnels: 'Tunnels',\n calendar: 'Calendar',\n ai: 'AI',\n settings: 'Settings',\n plugins: 'Plugins',\n};\n\n/**\n * What to CALL the page the user is on.\n *\n * Feeds the assistant's empty state (\"Ask about Sessions…\") and the shared\n * panel's live page label. Distinct from `gatherPageContext`, which produces\n * machine-readable context: this one is read by a human.\n */\nexport function describeCurrentPage(): string {\n const { currentPage } = gatherPageContext();\n // `currentPage` is up to three path segments; the product mount segment is\n // first when present, so skip it rather than labelling every page \"Vibecontrols\".\n const segments = currentPage.split('/').filter(Boolean);\n const first = (segments[0] === 'vibecontrols' ? segments[1] : segments[0]) ?? '';\n if (!first || first === 'home') return PAGE_LABELS.home;\n return (\n PAGE_LABELS[first] ??\n first\n .split('-')\n .map((word) => (word ? word.charAt(0).toUpperCase() + word.slice(1) : word))\n .join(' ')\n );\n}\n\nexport function gatherPageContext(): PageContext {\n const url = window.location.href;\n const pathSegments = window.location.pathname.split('/').filter(Boolean);\n const currentPage = pathSegments.slice(0, 3).join('/') || 'home';\n const entity = resolveVibeControlsConversationContext(\n window.location.pathname,\n window.location.search\n );\n\n return {\n currentUrl: url,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n platform: 'vibecontrols',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.402.1',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction matchPath(pattern: RegExp, pathname: string): RegExpMatchArray | null {\n return pathname.match(pattern);\n}\n\nexport function resolveVibeControlsConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n /**\n * ★ `(?!new/?$)`: a create page is not an entity. `/vibecontrols/tunnels/new`\n * is the tunnel wizard, and without the lookahead it resolved to a tunnel whose\n * id is the literal string \"new\" — handing the agent a fabricated entity, which\n * is worse than none, because it answers confidently about something that does\n * not exist. `vibes/new` and `agents/new` redirect, but a turn sent mid-redirect\n * would read the same lie. A trailing slash is the same page.\n */\n const directMatches: Array<[RegExp, string]> = [\n [/^\\/vibecontrols\\/agents\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_AGENT'],\n [/^\\/vibecontrols\\/sessions\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_SESSION'],\n [/^\\/vibecontrols\\/vibes\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_VIBE'],\n [/^\\/vibecontrols\\/notes\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_NOTE'],\n [/^\\/vibecontrols\\/catalogs\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_CATALOG'],\n [/^\\/vibecontrols\\/components\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_COMPONENT'],\n [/^\\/vibecontrols\\/templates\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_TEMPLATE'],\n [/^\\/vibecontrols\\/tunnels\\/(?!new\\/?$)([^/]+)\\/?$/, 'VIBECONTROLS_TUNNEL'],\n [/^\\/vibecontrols\\/calendar\\/task\\/([^/]+)\\/?$/, 'VIBECONTROLS_TASK'],\n [/^\\/vibecontrols\\/ai\\/sessions\\/([^/]+)\\/?$/, 'VIBECONTROLS_AI_SESSION'],\n ];\n\n for (const [pattern, entityType] of directMatches) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n if (/^\\/vibecontrols\\/vibes\\/[^/]+\\/docs\\//.test(pathname)) {\n const match = pathname.match(/^\\/vibecontrols\\/vibes\\/([^/]+)\\/docs\\//);\n return {\n entityType: 'VIBECONTROLS_DOCSSITE',\n entityId: match?.[1],\n };\n }\n\n if (/^\\/vibecontrols\\/catalogs\\/[^/]+\\/docs\\//.test(pathname)) {\n const match = pathname.match(/^\\/vibecontrols\\/catalogs\\/([^/]+)\\/docs\\//);\n return {\n entityType: 'VIBECONTROLS_DOCSPAGE',\n entityId: match?.[1],\n };\n }\n\n if (/^\\/vibecontrols\\/components\\/[^/]+\\/docs\\//.test(pathname)) {\n const match = pathname.match(/^\\/vibecontrols\\/components\\/([^/]+)\\/docs\\//);\n return {\n entityType: 'VIBECONTROLS_DOCSPAGE',\n entityId: match?.[1],\n };\n }\n\n const activeTab =\n params.get('tab') ??\n (() => {\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 2 ? segments[segments.length - 1] : undefined;\n })();\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n ...(params.get('selectedTargetId')\n ? { selectedTargetId: params.get('selectedTargetId') }\n : {}),\n ...(params.get('actionId') ? { actionId: params.get('actionId') } : {}),\n },\n };\n}\n"],"mappings":";AAkDA,IAAM,IAAsC;CAC1C,MAAM;CACN,QAAQ;CACR,UAAU;CACV,OAAO;CACP,OAAO;CACP,UAAU;CACV,YAAY;CACZ,WAAW;CACX,SAAS;CACT,UAAU;CACV,IAAI;CACJ,UAAU;CACV,SAAS;CACV;AASD,SAAgB,IAA8B;CAC5C,IAAM,EAAE,mBAAgB,GAAmB,EAGrC,IAAW,EAAY,MAAM,IAAI,CAAC,OAAO,QAAQ,EACjD,KAAS,EAAS,OAAO,iBAAiB,EAAS,KAAK,EAAS,OAAO;AAE9E,QADI,CAAC,KAAS,MAAU,SAAe,EAAY,OAEjD,EAAY,MACZ,EACG,MAAM,IAAI,CACV,KAAK,MAAU,KAAO,EAAK,OAAO,EAAE,CAAC,aAAa,GAAG,EAAK,MAAM,EAAE,CAAS,CAC3E,KAAK,IAAI;;AAIhB,SAAgB,IAAiC;CAC/C,IAAM,IAAM,OAAO,SAAS,MAEtB,IADe,OAAO,SAAS,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACvC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,QACpD,IAAS,EACb,OAAO,SAAS,UAChB,OAAO,SAAS,OACjB;AAED,QAAO;EACL,YAAY;EACZ;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,UAAU;EACV,SAA6C;EAC7C,cAAc,GAAG,OAAO,WAAW,GAAG,OAAO;EAC7C,WAAW,UAAU;EACrB,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC;;AAGH,SAAS,EAAU,GAAiB,GAA2C;AAC7E,QAAO,EAAS,MAAM,EAAQ;;AAGhC,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO;AAsB1C,MAAK,IAAM,CAAC,GAAS,MAb0B;EAC7C,CAAC,mDAAmD,qBAAqB;EACzE,CAAC,qDAAqD,uBAAuB;EAC7E,CAAC,kDAAkD,oBAAoB;EACvE,CAAC,kDAAkD,oBAAoB;EACvE,CAAC,qDAAqD,uBAAuB;EAC7E,CAAC,uDAAuD,yBAAyB;EACjF,CAAC,sDAAsD,wBAAwB;EAC/E,CAAC,oDAAoD,sBAAsB;EAC3E,CAAC,gDAAgD,oBAAoB;EACrE,CAAC,8CAA8C,0BAA0B;EAC1E,EAEkD;EACjD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,EACF,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;AAIL,KAAI,wCAAwC,KAAK,EAAS,CAExD,QAAO;EACL,YAAY;EACZ,UAHY,EAAS,MAAM,0CAA0C,GAGnD;EACnB;AAGH,KAAI,2CAA2C,KAAK,EAAS,CAE3D,QAAO;EACL,YAAY;EACZ,UAHY,EAAS,MAAM,6CAA6C,GAGtD;EACnB;AAGH,KAAI,6CAA6C,KAAK,EAAS,CAE7D,QAAO;EACL,YAAY;EACZ,UAHY,EAAS,MAAM,+CAA+C,GAGxD;EACnB;CAGH,IAAM,IACJ,EAAO,IAAI,MAAM,WACV;EACL,IAAM,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AACpD,SAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;KAC3D;AAEN,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU;GACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE;GAClC,GAAI,EAAO,IAAI,mBAAmB,GAC9B,EAAE,kBAAkB,EAAO,IAAI,mBAAmB,EAAE,GACpD,EAAE;GACN,GAAI,EAAO,IAAI,WAAW,GAAG,EAAE,UAAU,EAAO,IAAI,WAAW,EAAE,GAAG,EAAE;GACvE;EACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-vibecontrols",
3
- "version": "2026.915.1",
3
+ "version": "2026.915.2",
4
4
  "description": "VibeControls microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,11 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "../../services/assistantApi.js";
3
- import "./AssistantChatInput.js";
4
- import "./AssistantMessageList.js";
5
- import "./AssistantModeSelector.js";
6
- import "./AssistantWelcome.js";
7
- import "../../store/assistantStore.js";
8
- import "react";
9
- import "@burdenoff/fe-libs/shared/graphql";
10
- import "@burdenoff/fe-libs/shared/providers/shell";
11
- import "react/jsx-runtime";
@@ -1,4 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "react";
3
- import "lucide-react";
4
- import "react/jsx-runtime";
@@ -1,6 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "../../types/assistant.js";
3
- import "../../store/assistantStore.js";
4
- import "react";
5
- import "lucide-react";
6
- import "react/jsx-runtime";
@@ -1,5 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "../../store/assistantStore.js";
3
- import "react";
4
- import "lucide-react";
5
- import "react/jsx-runtime";
@@ -1,9 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "../../services/assistantApi.js";
3
- import "./ProductMarkdown.js";
4
- import "react";
5
- import "lucide-react";
6
- import "@burdenoff/fe-libs/shared/graphql";
7
- import "@burdenoff/fe-libs/shared/providers/shell";
8
- import "react/jsx-runtime";
9
- import "@burdenoff/fe-libs/storage";
@@ -1,4 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "./AssistantMessageItem.js";
3
- import "react";
4
- import "react/jsx-runtime";
@@ -1,5 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "../../types/assistant.js";
3
- import "react";
4
- import "lucide-react";
5
- import "react/jsx-runtime";
@@ -1,4 +0,0 @@
1
- import "../../shared/hooks/useTr.js";
2
- import "../../types/assistant.js";
3
- import "lucide-react";
4
- import "react/jsx-runtime";
@@ -1,165 +0,0 @@
1
- import { createProfileScopedStorage as e } from "@burdenoff/fe-libs/shared/utils";
2
- import { create as t } from "zustand";
3
- import { persist as n } from "zustand/middleware";
4
- //#region src/store/assistantStore.ts
5
- function r() {
6
- return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
7
- }
8
- var i = t()(n((e, t) => ({
9
- conversations: [],
10
- activeConversationId: null,
11
- mode: "assistant",
12
- processingByConversationId: {},
13
- conversationListOpen: !1,
14
- sandboxesByMode: {},
15
- pendingPrompt: null,
16
- createConversation: (n, i) => {
17
- let a = r(), o = (/* @__PURE__ */ new Date()).toISOString(), s = i ?? t().mode, c = {
18
- id: a,
19
- title: n || "New conversation",
20
- mode: s,
21
- messages: [],
22
- backendSessionId: null,
23
- createdAt: o,
24
- updatedAt: o
25
- };
26
- return e((e) => ({
27
- conversations: [c, ...e.conversations],
28
- activeConversationId: a,
29
- conversationListOpen: !1
30
- })), a;
31
- },
32
- deleteConversation: (t) => e((e) => {
33
- let n = e.conversations.filter((e) => e.id !== t), r = { ...e.processingByConversationId };
34
- return delete r[t], {
35
- conversations: n,
36
- processingByConversationId: r,
37
- activeConversationId: e.activeConversationId === t ? n[0]?.id ?? null : e.activeConversationId
38
- };
39
- }),
40
- renameConversation: (t, n) => e((e) => ({ conversations: e.conversations.map((e) => e.id === t ? {
41
- ...e,
42
- title: n,
43
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
44
- } : e) })),
45
- setActiveConversation: (t) => e((e) => ({
46
- activeConversationId: t,
47
- mode: e.conversations.find((e) => e.id === t)?.mode ?? e.mode,
48
- conversationListOpen: !1
49
- })),
50
- setMode: (t) => e({ mode: t }),
51
- setConversationMode: (t, n) => e((e) => ({
52
- conversations: e.conversations.map((e) => e.id === t ? {
53
- ...e,
54
- mode: n,
55
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
56
- } : e),
57
- mode: e.activeConversationId === t ? n : e.mode
58
- })),
59
- addMessage: (t, n) => e((e) => ({ conversations: e.conversations.map((e) => e.id === t ? {
60
- ...e,
61
- messages: [...e.messages, n],
62
- updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
63
- title: e.messages.length === 0 && n.role === "user" ? n.content.slice(0, 50) + (n.content.length > 50 ? "..." : "") : e.title
64
- } : e) })),
65
- updateMessage: (t, n, r) => e((e) => ({ conversations: e.conversations.map((e) => e.id === t ? {
66
- ...e,
67
- messages: e.messages.map((e) => e.id === n ? {
68
- ...e,
69
- content: r
70
- } : e),
71
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
72
- } : e) })),
73
- patchMessage: (t, n, r) => e((e) => ({ conversations: e.conversations.map((e) => e.id === t ? {
74
- ...e,
75
- messages: e.messages.map((e) => e.id === n ? {
76
- ...e,
77
- ...r
78
- } : e),
79
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
80
- } : e) })),
81
- setConversationProcessing: (t, n, r = null, i = null) => e((e) => ({ processingByConversationId: {
82
- ...e.processingByConversationId,
83
- [t]: {
84
- status: n,
85
- messageId: r,
86
- error: i,
87
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
88
- }
89
- } })),
90
- clearConversationProcessing: (t) => e((e) => {
91
- let n = { ...e.processingByConversationId };
92
- return delete n[t], { processingByConversationId: n };
93
- }),
94
- toggleConversationList: () => e((e) => ({ conversationListOpen: !e.conversationListOpen })),
95
- setConversationListOpen: (t) => e({ conversationListOpen: t }),
96
- clearConversation: (t) => e((e) => ({
97
- conversations: e.conversations.map((e) => e.id === t ? {
98
- ...e,
99
- messages: [],
100
- backendSessionId: null,
101
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
102
- } : e),
103
- processingByConversationId: {
104
- ...e.processingByConversationId,
105
- [t]: {
106
- status: "idle",
107
- messageId: null,
108
- error: null,
109
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
110
- }
111
- }
112
- })),
113
- setBackendSessionId: (t, n) => e((e) => ({ conversations: e.conversations.map((e) => e.id === t ? {
114
- ...e,
115
- backendSessionId: n
116
- } : e) })),
117
- clearBackendSessionId: (t) => e((e) => ({ conversations: e.conversations.map((e) => e.id === t ? {
118
- ...e,
119
- backendSessionId: null
120
- } : e) })),
121
- setSandbox: (t, n, r) => e((e) => {
122
- if (!n) {
123
- let n = { ...e.sandboxesByMode };
124
- return delete n[t], { sandboxesByMode: n };
125
- }
126
- return { sandboxesByMode: {
127
- ...e.sandboxesByMode,
128
- [t]: {
129
- sandboxId: n,
130
- status: r
131
- }
132
- } };
133
- }),
134
- clearSandbox: (t) => e((e) => {
135
- let n = { ...e.sandboxesByMode };
136
- return delete n[t], { sandboxesByMode: n };
137
- }),
138
- resetStore: () => e({
139
- conversations: [],
140
- activeConversationId: null,
141
- mode: "general",
142
- processingByConversationId: {},
143
- conversationListOpen: !1,
144
- sandboxesByMode: {},
145
- pendingPrompt: null
146
- }),
147
- submitPrompt: (t) => e({ pendingPrompt: t }),
148
- consumePendingPrompt: () => {
149
- let n = t().pendingPrompt;
150
- return n !== null && e({ pendingPrompt: null }), n;
151
- }
152
- }), {
153
- name: "vc-ai-assistant",
154
- storage: e(),
155
- partialize: (e) => ({
156
- conversations: e.conversations.map(({ ...e }) => e),
157
- activeConversationId: e.activeConversationId,
158
- mode: e.mode,
159
- conversationListOpen: e.conversationListOpen
160
- })
161
- }));
162
- //#endregion
163
- export { i as useAssistantStore };
164
-
165
- //# sourceMappingURL=assistantStore.js.map
@@ -1 +0,0 @@
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 this fork's chat area.\n *\n * ★ NOT what `GetHelpButton` / `useOpenAssistantHelp` write to: the mounted\n * panel is fe-libs' shared one, which reads `pendingPrompt` from\n * `@burdenoff/fe-libs/shared/assistant/store`. A prompt queued here reaches\n * no mounted component.\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":";;;;AA0EA,SAAS,IAAqB;AAC5B,QAAO,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE;;AAGhE,IAAa,IAAoB,GAAwB,CACvD,GACG,GAAK,OAAS;CACb,eAAe,EAAE;CACjB,sBAAsB;CACtB,MAAM;CACN,4BAA4B,EAAE;CAC9B,sBAAsB;CACtB,iBAAiB,EAAE;CACnB,eAAe;CAEf,qBAAqB,GAAgB,MAAyB;EAC5D,IAAM,IAAK,GAAY,EACjB,qBAAM,IAAI,MAAM,EAAC,aAAa,EAC9B,IAAmB,KAAQ,GAAK,CAAC,MACjC,IAA6B;GACjC;GACA,OAAO,KAAS;GAChB,MAAM;GACN,UAAU,EAAE;GACZ,kBAAkB;GAClB,WAAW;GACX,WAAW;GACZ;AAMD,SALA,GAAK,OAAW;GACd,eAAe,CAAC,GAAc,GAAG,EAAM,cAAc;GACrD,sBAAsB;GACtB,sBAAsB;GACvB,EAAE,EACI;;CAGT,qBAAqB,MACnB,GAAK,MAAU;EACb,IAAM,IAAW,EAAM,cAAc,QAAQ,MAAM,EAAE,OAAO,EAAG,EACzD,IAAiB,EAAE,GAAG,EAAM,4BAA4B;AAE9D,SADA,OAAO,EAAe,IACf;GACL,eAAe;GACf,4BAA4B;GAC5B,sBACE,EAAM,yBAAyB,IAC1B,EAAS,IAAI,MAAM,OACpB,EAAM;GACb;GACD;CAEJ,qBAAqB,GAAI,MACvB,GAAK,OAAW,EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAE,OAAO,IAAK;EAAE,GAAG;EAAG;EAAO,4BAAW,IAAI,MAAM,EAAC,aAAa;EAAE,GAAG,EACtE,EACF,EAAE;CAEL,wBAAwB,MACtB,GAAK,OAII;EACL,sBAAsB;EACtB,MAL2B,EAAM,cAAc,MAC9C,MAAiB,EAAa,OAAO,EACvC,EAG6B,QAAQ,EAAM;EAC1C,sBAAsB;EACvB,EACD;CAEJ,UAAU,MAAS,EAAI,EAAE,SAAM,CAAC;CAEhC,sBAAsB,GAAgB,MACpC,GAAK,OAAW;EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAa,OAAO,IAChB;GACE,GAAG;GACH;GACA,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC,GACD,EACL;EACD,MAAM,EAAM,yBAAyB,IAAiB,IAAO,EAAM;EACpE,EAAE;CAEL,aAAa,GAAgB,MAC3B,GAAK,OAAW,EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAE,OAAO,IACL;EACE,GAAG;EACH,UAAU,CAAC,GAAG,EAAE,UAAU,EAAQ;EAClC,4BAAW,IAAI,MAAM,EAAC,aAAa;EAEnC,OACE,EAAE,SAAS,WAAW,KAAK,EAAQ,SAAS,SACxC,EAAQ,QAAQ,MAAM,GAAG,GAAG,IAAI,EAAQ,QAAQ,SAAS,KAAK,QAAQ,MACtE,EAAE;EACT,GACD,EACL,EACF,EAAE;CAEL,gBAAgB,GAAgB,GAAW,MACzC,GAAK,OAAW,EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAE,OAAO,IACL;EACE,GAAG;EACH,UAAU,EAAE,SAAS,KAAK,MAAO,EAAE,OAAO,IAAY;GAAE,GAAG;GAAG;GAAS,GAAG,EAAG;EAC7E,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC,GACD,EACL,EACF,EAAE;CAEL,eAAe,GAAgB,GAAW,MACxC,GAAK,OAAW,EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAE,OAAO,IACL;EACE,GAAG;EACH,UAAU,EAAE,SAAS,KAAK,MAAO,EAAE,OAAO,IAAY;GAAE,GAAG;GAAG,GAAG;GAAO,GAAG,EAAG;EAC9E,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC,GACD,EACL,EACF,EAAE;CAEL,4BAA4B,GAAgB,GAAQ,IAAY,MAAM,IAAQ,SAC5E,GAAK,OAAW,EACd,4BAA4B;EAC1B,GAAG,EAAM;GACR,IAAiB;GAChB;GACA;GACA;GACA,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC;EACF,EACF,EAAE;CAEL,8BAA8B,MAC5B,GAAK,MAAU;EACb,IAAM,IAAO,EAAE,GAAG,EAAM,4BAA4B;AAEpD,SADA,OAAO,EAAK,IACL,EAAE,4BAA4B,GAAM;GAC3C;CAEJ,8BACE,GAAK,OAAW,EAAE,sBAAsB,CAAC,EAAM,sBAAsB,EAAE;CAEzE,0BAA0B,MAAS,EAAI,EAAE,sBAAsB,GAAM,CAAC;CAEtE,oBAAoB,MAClB,GAAK,OAAW;EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAE,OAAO,IACL;GACE,GAAG;GACH,UAAU,EAAE;GACZ,kBAAkB;GAClB,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC,GACD,EACL;EACD,4BAA4B;GAC1B,GAAG,EAAM;IACR,IAAK;IACJ,QAAQ;IACR,WAAW;IACX,OAAO;IACP,4BAAW,IAAI,MAAM,EAAC,aAAa;IACpC;GACF;EACF,EAAE;CAEL,sBAAsB,GAAgB,MACpC,GAAK,OAAW,EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAE,OAAO,IACL;EACE,GAAG;EACH,kBAAkB;EACnB,GACD,EACL,EACF,EAAE;CAEL,wBAAwB,MACtB,GAAK,OAAW,EACd,eAAe,EAAM,cAAc,KAAK,MACtC,EAAE,OAAO,IAAiB;EAAE,GAAG;EAAG,kBAAkB;EAAM,GAAG,EAC9D,EACF,EAAE;CAEL,aAAa,GAAM,GAAW,MAC5B,GAAK,MAAU;AACb,MAAI,CAAC,GAAW;GACd,IAAM,IAAsB,EAAE,GAAG,EAAM,iBAAiB;AAExD,UADA,OAAO,EAAoB,IACpB,EAAE,iBAAiB,GAAqB;;AAGjD,SAAO,EACL,iBAAiB;GACf,GAAG,EAAM;IACR,IAAO;IACN;IACA;IACD;GACF,EACF;GACD;CAEJ,eAAe,MACb,GAAK,MAAU;EACb,IAAM,IAAsB,EAAE,GAAG,EAAM,iBAAiB;AAExD,SADA,OAAO,EAAoB,IACpB,EAAE,iBAAiB,GAAqB;GAC/C;CAEJ,kBACE,EAAI;EACF,eAAe,EAAE;EACjB,sBAAsB;EACtB,MAAM;EACN,4BAA4B,EAAE;EAC9B,sBAAsB;EACtB,iBAAiB,EAAE;EACnB,eAAe;EAChB,CAAC;CAEJ,eAAe,MAAiB,EAAI,EAAE,eAAe,GAAM,CAAC;CAE5D,4BAA4B;EAC1B,IAAM,IAAU,GAAK,CAAC;AAEtB,SADI,MAAY,QAAM,EAAI,EAAE,eAAe,MAAM,CAAC,EAC3C;;CAEV,GACD;CACE,MAAM;CACN,SAAS,GAA4B;CACrC,aAAa,OAAW;EACtB,eAAe,EAAM,cAAc,KAAK,EAAE,GAAG,QAAmB,EAAa;EAC7E,sBAAsB,EAAM;EAC5B,MAAM,EAAM;EACZ,sBAAsB,EAAM;EAC7B;CACF,CACF,CACF"}