@agent-native/core 0.120.0 → 0.120.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 (207) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +16 -0
  3. package/corpus/core/docs/content/extensions.mdx +23 -4
  4. package/corpus/core/package.json +1 -1
  5. package/corpus/core/src/agent/production-agent.ts +4 -0
  6. package/corpus/core/src/agent/run-manager.ts +36 -10
  7. package/corpus/core/src/agent/types.ts +2 -0
  8. package/corpus/core/src/client/MultiTabAssistantChat.tsx +45 -0
  9. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +16 -3
  10. package/corpus/core/src/client/settings/ExtensionsSettingsContent.tsx +24 -0
  11. package/corpus/core/src/client/settings/SettingsPanel.tsx +10 -0
  12. package/corpus/core/src/client/use-chat-models.ts +45 -0
  13. package/corpus/core/src/deploy/build.ts +3 -0
  14. package/corpus/core/src/server/analytics.ts +164 -20
  15. package/corpus/core/src/server/auth.ts +17 -13
  16. package/corpus/core/src/server/better-auth-instance.ts +13 -1
  17. package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  18. package/corpus/core/src/templates/chat/app/routes/extensions._index.tsx +2 -2
  19. package/corpus/core/src/templates/chat/netlify.toml +1 -0
  20. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  21. package/corpus/core/src/vite/client.ts +6 -0
  22. package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +27 -43
  23. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +19 -8
  24. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +2 -2
  25. package/corpus/templates/analytics/AGENTS.md +20 -8
  26. package/corpus/templates/analytics/actions/get-explorer-dashboard.ts +3 -0
  27. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +140 -46
  28. package/corpus/templates/analytics/actions/migrate-analytics-artifacts.ts +48 -0
  29. package/corpus/templates/analytics/actions/save-analysis.ts +2 -3
  30. package/corpus/templates/analytics/actions/view-screen.ts +1 -1
  31. package/corpus/templates/analytics/app/components/dashboard/DashboardMetadata.tsx +77 -0
  32. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +7 -1
  33. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +1 -0
  34. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +103 -502
  35. package/corpus/templates/analytics/app/global.css +30 -0
  36. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +2 -2
  37. package/corpus/templates/analytics/app/i18n-data.ts +80 -0
  38. package/corpus/templates/analytics/app/pages/Agents.tsx +49 -2
  39. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +54 -11
  40. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +3 -53
  41. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +23 -25
  42. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  43. package/corpus/templates/analytics/app/routes/analyses._index.tsx +3 -2
  44. package/corpus/templates/analytics/app/routes/extensions._index.tsx +2 -2
  45. package/corpus/templates/analytics/changelog/2026-07-23-analytics-now-groups-saved-analyses-and-embedded-extensions-.md +6 -0
  46. package/corpus/templates/analytics/changelog/2026-07-23-dashboard-menus-show-who-created-and-last-updated-each-dashb.md +6 -0
  47. package/corpus/templates/analytics/changelog/2026-07-23-dashboard-usage-now-loads-reliably-for-organizations-with-ma.md +6 -0
  48. package/corpus/templates/analytics/changelog/2026-07-23-long-dashboard-building-requests-now-continue-without-stoppi.md +6 -0
  49. package/corpus/templates/analytics/netlify.toml +4 -0
  50. package/corpus/templates/analytics/server/db/schema.ts +4 -0
  51. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -1
  52. package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +1 -0
  53. package/corpus/templates/analytics/server/lib/migrate-analytics-artifacts.ts +1062 -0
  54. package/corpus/templates/analytics/server/plugins/agent-chat.ts +6 -52
  55. package/corpus/templates/analytics/server/plugins/core-routes.ts +1 -1
  56. package/corpus/templates/analytics/server/plugins/db.ts +10 -0
  57. package/corpus/templates/assets/actions/generate-image-batch.ts +36 -1
  58. package/corpus/templates/assets/actions/generate-image.ts +28 -1
  59. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +47 -9
  60. package/corpus/templates/assets/app/routes/extensions._index.tsx +2 -2
  61. package/corpus/templates/assets/changelog/2026-07-23-assets-image-generation-now-recovers-after-a-completed-tool-.md +6 -0
  62. package/corpus/templates/assets/changelog/2026-07-23-new-chat-aligns-with-sidebar-controls.md +6 -0
  63. package/corpus/templates/assets/netlify.toml +1 -0
  64. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +38 -8
  65. package/corpus/templates/brain/app/routes/extensions._index.tsx +2 -2
  66. package/corpus/templates/brain/netlify.toml +1 -0
  67. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +43 -5
  68. package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +2 -16
  69. package/corpus/templates/calendar/netlify.toml +1 -0
  70. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  71. package/corpus/templates/chat/app/routes/extensions._index.tsx +2 -2
  72. package/corpus/templates/chat/netlify.toml +1 -0
  73. package/corpus/templates/clips/app/components/library/library-layout.tsx +52 -6
  74. package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +2 -16
  75. package/corpus/templates/clips/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  76. package/corpus/templates/clips/changelog/2026-07-23-meeting-recording-meters-and-dismissed-prompts.md +6 -0
  77. package/corpus/templates/clips/desktop/src/hooks/useMicMeter.ts +1 -1
  78. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +2 -0
  79. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +1 -3
  80. package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +86 -0
  81. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +24 -0
  82. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +5 -69
  83. package/corpus/templates/clips/desktop/src/styles.css +35 -3
  84. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +13 -44
  85. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +119 -17
  86. package/corpus/templates/clips/netlify.toml +1 -0
  87. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -7
  88. package/corpus/templates/content/app/routes/_app.extensions._index.tsx +2 -2
  89. package/corpus/templates/content/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  90. package/corpus/templates/content/netlify.toml +1 -0
  91. package/corpus/templates/design/app/components/layout/Sidebar.tsx +55 -17
  92. package/corpus/templates/design/app/routes/extensions._index.tsx +2 -2
  93. package/corpus/templates/design/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  94. package/corpus/templates/design/netlify.toml +1 -0
  95. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +1 -1
  96. package/corpus/templates/dispatch/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  97. package/corpus/templates/dispatch/netlify.toml +1 -0
  98. package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +9 -3
  99. package/corpus/templates/forms/AGENTS.md +11 -1
  100. package/corpus/templates/forms/README.md +24 -1
  101. package/corpus/templates/forms/actions/update-form.ts +12 -5
  102. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +199 -1
  103. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +41 -45
  104. package/corpus/templates/forms/app/i18n/en-US.ts +13 -1
  105. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +35 -4
  106. package/corpus/templates/forms/app/pages/FormFillPage.tsx +7 -16
  107. package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +2 -2
  108. package/corpus/templates/forms/changelog/2026-07-23-agent-settings-are-clearly-labeled-manage-agent-in-the-sideb.md +6 -0
  109. package/corpus/templates/forms/changelog/2026-07-23-forms-can-branch-into-follow-up-questions-and-route-response.md +6 -0
  110. package/corpus/templates/forms/netlify.toml +1 -0
  111. package/corpus/templates/forms/server/handlers/submissions.ts +22 -31
  112. package/corpus/templates/forms/server/lib/integrations.ts +11 -2
  113. package/corpus/templates/forms/server/lib/public-form-ssr.ts +26 -5
  114. package/corpus/templates/forms/server/lib/validate-fields.ts +48 -11
  115. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
  116. package/corpus/templates/forms/shared/conditional.ts +67 -0
  117. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +36 -5
  118. package/corpus/templates/macros/app/routes/extensions._index.tsx +2 -2
  119. package/corpus/templates/macros/netlify.toml +1 -0
  120. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +0 -9
  121. package/corpus/templates/mail/app/routes/extensions._index.tsx +2 -2
  122. package/corpus/templates/mail/netlify.toml +1 -0
  123. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +38 -5
  124. package/corpus/templates/plan/app/routes/extensions._index.tsx +2 -2
  125. package/corpus/templates/plan/netlify.toml +1 -0
  126. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +47 -4
  127. package/corpus/templates/slides/app/routes/extensions._index.tsx +2 -2
  128. package/corpus/templates/slides/netlify.toml +1 -0
  129. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +37 -6
  130. package/corpus/templates/tasks/app/routes/extensions._index.tsx +2 -2
  131. package/corpus/templates/tasks/app/routes/settings.tsx +31 -0
  132. package/corpus/templates/tasks/netlify.toml +1 -0
  133. package/dist/agent/production-agent.d.ts.map +1 -1
  134. package/dist/agent/production-agent.js +4 -0
  135. package/dist/agent/production-agent.js.map +1 -1
  136. package/dist/agent/run-manager.d.ts +9 -0
  137. package/dist/agent/run-manager.d.ts.map +1 -1
  138. package/dist/agent/run-manager.js +25 -10
  139. package/dist/agent/run-manager.js.map +1 -1
  140. package/dist/agent/types.d.ts +2 -2
  141. package/dist/agent/types.d.ts.map +1 -1
  142. package/dist/agent/types.js.map +1 -1
  143. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  144. package/dist/client/MultiTabAssistantChat.js +35 -0
  145. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  146. package/dist/client/extensions/ExtensionsListPage.d.ts +5 -1
  147. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  148. package/dist/client/extensions/ExtensionsListPage.js +5 -3
  149. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  150. package/dist/client/settings/ExtensionsSettingsContent.d.ts +2 -0
  151. package/dist/client/settings/ExtensionsSettingsContent.d.ts.map +1 -0
  152. package/dist/client/settings/ExtensionsSettingsContent.js +10 -0
  153. package/dist/client/settings/ExtensionsSettingsContent.js.map +1 -0
  154. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  155. package/dist/client/settings/SettingsPanel.js +10 -1
  156. package/dist/client/settings/SettingsPanel.js.map +1 -1
  157. package/dist/client/use-chat-models.d.ts +1 -0
  158. package/dist/client/use-chat-models.d.ts.map +1 -1
  159. package/dist/client/use-chat-models.js +33 -0
  160. package/dist/client/use-chat-models.js.map +1 -1
  161. package/dist/collab/awareness.d.ts +2 -2
  162. package/dist/collab/awareness.d.ts.map +1 -1
  163. package/dist/deploy/build.js +1 -0
  164. package/dist/deploy/build.js.map +1 -1
  165. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  166. package/dist/observability/routes.d.ts +3 -3
  167. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  168. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  169. package/dist/server/analytics.d.ts +17 -4
  170. package/dist/server/analytics.d.ts.map +1 -1
  171. package/dist/server/analytics.js +122 -17
  172. package/dist/server/analytics.js.map +1 -1
  173. package/dist/server/auth.d.ts.map +1 -1
  174. package/dist/server/auth.js +5 -4
  175. package/dist/server/auth.js.map +1 -1
  176. package/dist/server/better-auth-instance.d.ts +8 -0
  177. package/dist/server/better-auth-instance.d.ts.map +1 -1
  178. package/dist/server/better-auth-instance.js +10 -1
  179. package/dist/server/better-auth-instance.js.map +1 -1
  180. package/dist/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  181. package/dist/templates/chat/app/routes/extensions._index.tsx +2 -2
  182. package/dist/templates/chat/netlify.toml +1 -0
  183. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  184. package/dist/vite/client.d.ts.map +1 -1
  185. package/dist/vite/client.js +2 -0
  186. package/dist/vite/client.js.map +1 -1
  187. package/docs/content/extensions.mdx +23 -4
  188. package/package.json +1 -1
  189. package/src/agent/production-agent.ts +4 -0
  190. package/src/agent/run-manager.ts +36 -10
  191. package/src/agent/types.ts +2 -0
  192. package/src/client/MultiTabAssistantChat.tsx +45 -0
  193. package/src/client/extensions/ExtensionsListPage.tsx +16 -3
  194. package/src/client/settings/ExtensionsSettingsContent.tsx +24 -0
  195. package/src/client/settings/SettingsPanel.tsx +10 -0
  196. package/src/client/use-chat-models.ts +45 -0
  197. package/src/deploy/build.ts +3 -0
  198. package/src/server/analytics.ts +164 -20
  199. package/src/server/auth.ts +17 -13
  200. package/src/server/better-auth-instance.ts +13 -1
  201. package/src/templates/chat/app/components/layout/Sidebar.tsx +35 -6
  202. package/src/templates/chat/app/routes/extensions._index.tsx +2 -2
  203. package/src/templates/chat/netlify.toml +1 -0
  204. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +16 -0
  205. package/src/vite/client.ts +6 -0
  206. package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +0 -165
  207. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +0 -175
@@ -1,2 +1,6 @@
1
- export declare function ExtensionsListPage(): import("react").JSX.Element;
1
+ export interface ExtensionsListPageProps {
2
+ /** Skip the standalone extensions navigation state when embedded in Settings. */
3
+ embedded?: boolean;
4
+ }
5
+ export declare function ExtensionsListPage({ embedded, }?: ExtensionsListPageProps): import("react").JSX.Element;
2
6
  //# sourceMappingURL=ExtensionsListPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionsListPage.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"AAqGA,wBAAgB,kBAAkB,gCA0UjC"}
1
+ {"version":3,"file":"ExtensionsListPage.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"AAqGA,MAAM,WAAW,uBAAuB;IACtC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAgB,GACjB,GAAE,uBAA4B,+BAgV9B"}
@@ -38,7 +38,7 @@ function CreateToolInput({ className }) {
38
38
  const t = useT();
39
39
  return (_jsxs("div", { className: cn("flex flex-col gap-2 text-left", className), children: [_jsx("p", { className: "px-1 text-sm font-medium text-foreground", children: t("extensions.whatShouldItDo") }), _jsx(PromptComposer, { autoFocus: true, className: "text-left", placeholder: t("extensions.createPlaceholder"), draftScope: "extensions:create", onSubmit: (text) => submitCreateTool(text, (prompt) => t("extensions.createPrompt", { prompt })) })] }));
40
40
  }
41
- export function ExtensionsListPage() {
41
+ export function ExtensionsListPage({ embedded = false, } = {}) {
42
42
  const t = useT();
43
43
  const [showCreate, setShowCreate] = useState(false);
44
44
  const [confirmDeleteId, setConfirmDeleteId] = useState(null);
@@ -47,12 +47,14 @@ export function ExtensionsListPage() {
47
47
  const queryClient = useQueryClient();
48
48
  const [toolOrderState, setToolOrderState] = useState(() => typeof window !== "undefined" ? getToolsOrder() : []);
49
49
  useEffect(() => {
50
+ if (embedded)
51
+ return;
50
52
  fetch(agentNativePath("/_agent-native/application-state/navigation"), {
51
53
  method: "PUT",
52
54
  headers: { "Content-Type": "application/json" },
53
55
  body: JSON.stringify({ view: "extensions" }),
54
56
  }).catch(() => { });
55
- }, []);
57
+ }, [embedded]);
56
58
  useEffect(() => {
57
59
  if (typeof window === "undefined")
58
60
  return;
@@ -111,7 +113,7 @@ export function ExtensionsListPage() {
111
113
  queryClient.invalidateQueries({ queryKey: ["extensions"] });
112
114
  }
113
115
  };
114
- return (_jsxs("div", { className: "flex h-full w-full flex-col", children: [_jsxs("header", { className: "flex h-12 items-center justify-between border-b px-4 shrink-0", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("h1", { className: "text-sm font-semibold", children: t("extensions.title") }) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: showCreate, onOpenChange: setShowCreate, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: [_jsx(IconPlus, { className: "h-4 w-4" }), t("extensions.newExtension")] }) }), _jsxs(PopoverContent, { align: "end", sideOffset: 6, className: "w-[420px] p-3", children: [_jsx("p", { className: "px-1 pb-2 text-sm font-semibold text-foreground", children: t("extensions.newExtensionTitle") }), _jsx(PromptComposer, { autoFocus: true, placeholder: t("extensions.buildPlaceholder"), draftScope: "extensions:create-popover", onSubmit: handleCreate })] })] }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "aria-label": t("extensions.optionsFor", {
116
+ return (_jsxs("div", { className: cn("flex w-full flex-col", embedded ? "min-h-[28rem]" : "h-full"), children: [_jsxs("header", { className: "flex h-12 items-center justify-between border-b px-4 shrink-0", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("h1", { className: "text-sm font-semibold", children: t("extensions.title") }) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: showCreate, onOpenChange: setShowCreate, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: [_jsx(IconPlus, { className: "h-4 w-4" }), t("extensions.newExtension")] }) }), _jsxs(PopoverContent, { align: "end", sideOffset: 6, className: "w-[420px] p-3", children: [_jsx("p", { className: "px-1 pb-2 text-sm font-semibold text-foreground", children: t("extensions.newExtensionTitle") }), _jsx(PromptComposer, { autoFocus: true, placeholder: t("extensions.buildPlaceholder"), draftScope: "extensions:create-popover", onSubmit: handleCreate })] })] }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "aria-label": t("extensions.optionsFor", {
115
117
  name: t("extensions.title"),
116
118
  }), children: _jsx(IconDotsVertical, { className: "h-4 w-4" }) }) }), _jsx(DropdownMenuContent, { align: "end", className: "w-44", children: _jsx(DropdownMenuCheckboxItem, { checked: showGloballyHidden, onCheckedChange: (checked) => setShowGloballyHidden(Boolean(checked)), children: t("extensions.showHidden") }) })] }), _jsx(AgentToggleButton, {})] })] }), _jsx("div", { className: "flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10", children: extensionsQuery.isLoading ? (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => (_jsxs("div", { className: "rounded-lg border border-border bg-card p-5", children: [_jsx("div", { className: "mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 h-4 w-2/3 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 w-4/5 rounded bg-muted animate-pulse" })] }, i))) })) : extensionsQuery.isError ? (_jsx(ExtensionQueryErrorState, { className: "min-h-[calc(100vh-9rem)]", message: t("extensions.loadError"), onRetry: () => void extensionsQuery.refetch(), retrying: extensionsQuery.isFetching })) : toolList.length === 0 ? (_jsx("div", { className: "flex min-h-[calc(100vh-9rem)] flex-col items-center justify-start px-2 pb-12 pt-[clamp(5rem,18vh,11rem)] sm:pb-16", children: _jsxs("div", { className: "mx-auto flex w-full max-w-[34rem] flex-col gap-7", children: [_jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [_jsx(IconTool, { className: "h-10 w-10 text-muted-foreground/40" }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-base font-semibold text-foreground", children: t("extensions.emptyTitle") }), _jsx("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: t("extensions.emptyDescription") })] })] }), _jsx(CreateToolInput, { className: "w-full" })] }) })) : (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: toolList.map((extension) => {
117
119
  const isLocalExtension = extension.source?.mode === "local-files";
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconDotsVertical,\n IconEye,\n IconEyeOff,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState, useEffect } from \"react\";\nimport { Link } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { PromptComposer } from \"../composer/index.js\";\nimport { useT } from \"../i18n.js\";\nimport { cn } from \"../utils.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\nimport { ExtensionQueryErrorState } from \"./ExtensionQueryErrorState.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n canDelete?: boolean;\n globallyHidden?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n entryPath?: string;\n };\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(\n prompt: string,\n messageForPrompt: (prompt: string) => string,\n) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: messageForPrompt(trimmed),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n const t = useT();\n return (\n <div className={cn(\"flex flex-col gap-2 text-left\", className)}>\n <p className=\"px-1 text-sm font-medium text-foreground\">\n {t(\"extensions.whatShouldItDo\")}\n </p>\n <PromptComposer\n autoFocus\n className=\"text-left\"\n placeholder={t(\"extensions.createPlaceholder\")}\n draftScope=\"extensions:create\"\n onSubmit={(text) =>\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n )\n }\n />\n </div>\n );\n}\n\nexport function ExtensionsListPage() {\n const t = useT();\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [showGloballyHidden, setShowGloballyHidden] = useState(false);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\n\n const extensionsQuery = useQuery<Extension[]>({\n queryKey: [\"extensions\", { includeGloballyHidden: showGloballyHidden }],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n showGloballyHidden\n ? \"/_agent-native/extensions?includeGloballyHidden=true\"\n : \"/_agent-native/extensions\",\n ),\n );\n if (!res.ok) throw new Error(`Failed to load extensions (${res.status})`);\n return res.json();\n },\n });\n const extensions = extensionsQuery.data;\n\n const toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n );\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n await deleteOrHideExtension(extension);\n invalidateExtensionRemoval(queryClient, extension.id);\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n const handleGlobalHideToggle = async (extension: Extension) => {\n setConfirmDeleteId(null);\n const action = extension.globallyHidden ? \"global-unhide\" : \"global-hide\";\n try {\n await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}/${action}`),\n { method: \"POST\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div className=\"flex h-full w-full flex-col\">\n <header className=\"flex h-12 items-center justify-between border-b px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-sm font-semibold\">{t(\"extensions.title\")}</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n {t(\"extensions.newExtension\")}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n {t(\"extensions.newExtensionTitle\")}\n </p>\n <PromptComposer\n autoFocus\n placeholder={t(\"extensions.buildPlaceholder\")}\n draftScope=\"extensions:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={t(\"extensions.optionsFor\", {\n name: t(\"extensions.title\"),\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuCheckboxItem\n checked={showGloballyHidden}\n onCheckedChange={(checked) =>\n setShowGloballyHidden(Boolean(checked))\n }\n >\n {t(\"extensions.showHidden\")}\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <AgentToggleButton />\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10\">\n {extensionsQuery.isLoading ? (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : extensionsQuery.isError ? (\n <ExtensionQueryErrorState\n className=\"min-h-[calc(100vh-9rem)]\"\n message={t(\"extensions.loadError\")}\n onRetry={() => void extensionsQuery.refetch()}\n retrying={extensionsQuery.isFetching}\n />\n ) : toolList.length === 0 ? (\n <div className=\"flex min-h-[calc(100vh-9rem)] flex-col items-center justify-start px-2 pb-12 pt-[clamp(5rem,18vh,11rem)] sm:pb-16\">\n <div className=\"mx-auto flex w-full max-w-[34rem] flex-col gap-7\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <IconTool className=\"h-10 w-10 text-muted-foreground/40\" />\n <div className=\"space-y-1.5\">\n <p className=\"text-base font-semibold text-foreground\">\n {t(\"extensions.emptyTitle\")}\n </p>\n <p className=\"mx-auto max-w-sm text-sm text-muted-foreground\">\n {t(\"extensions.emptyDescription\")}\n </p>\n </div>\n </div>\n <CreateToolInput className=\"w-full\" />\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => {\n const isLocalExtension = extension.source?.mode === \"local-files\";\n return (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n extension.globallyHidden && \"opacity-60\",\n )}\n >\n <Link\n to={extensionPath(extension.id, extension.name)}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n {extension.globallyHidden && (\n <IconEyeOff\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n aria-label={t(\"extensions.hiddenFromEveryone\")}\n />\n )}\n <span className=\"truncate\">{extension.name}</span>\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n {isLocalExtension && (\n <p className=\"mt-3 inline-flex rounded-md border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t(\"extensions.localFile\")}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={t(\"extensions.optionsFor\", {\n name: extension.name,\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n {!isLocalExtension && extension.canDelete !== false && (\n <div className=\"border-b p-1\">\n <button\n type=\"button\"\n onClick={() => handleGlobalHideToggle(extension)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-[12px] hover:bg-accent\"\n >\n {extension.globallyHidden ? (\n <>\n <IconEye className=\"h-3.5 w-3.5\" />\n {t(\"extensions.unhideEveryone\")}\n </>\n ) : (\n <>\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n {t(\"extensions.hideEveryone\")}\n </>\n )}\n </button>\n </div>\n )}\n {isLocalExtension ? (\n <div className=\"p-3 text-[12px] text-muted-foreground\">\n {t(\"extensions.localFileDescription\", {\n entryPath:\n extension.source?.entryPath ?? \"local files\",\n })}\n </div>\n ) : (\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n {extension.canDelete === false\n ? t(\"extensions.removeQuestion\", {\n name: extension.name,\n })\n : t(\"extensions.deleteQuestion\", {\n name: extension.name,\n })}{\" \"}\n {extension.canDelete === false\n ? t(\"extensions.hideForYouDescription\")\n : t(\"extensions.removeEverywhereDescription\")}\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? extension.canDelete === false\n ? t(\"extensions.removing\")\n : t(\"extensions.deleting\")\n : extension.canDelete === false\n ? t(\"extensions.remove\")\n : t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconDotsVertical,\n IconEye,\n IconEyeOff,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState, useEffect } from \"react\";\nimport { Link } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { PromptComposer } from \"../composer/index.js\";\nimport { useT } from \"../i18n.js\";\nimport { cn } from \"../utils.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\nimport { ExtensionQueryErrorState } from \"./ExtensionQueryErrorState.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n canDelete?: boolean;\n globallyHidden?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n entryPath?: string;\n };\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(\n prompt: string,\n messageForPrompt: (prompt: string) => string,\n) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: messageForPrompt(trimmed),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n const t = useT();\n return (\n <div className={cn(\"flex flex-col gap-2 text-left\", className)}>\n <p className=\"px-1 text-sm font-medium text-foreground\">\n {t(\"extensions.whatShouldItDo\")}\n </p>\n <PromptComposer\n autoFocus\n className=\"text-left\"\n placeholder={t(\"extensions.createPlaceholder\")}\n draftScope=\"extensions:create\"\n onSubmit={(text) =>\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n )\n }\n />\n </div>\n );\n}\n\nexport interface ExtensionsListPageProps {\n /** Skip the standalone extensions navigation state when embedded in Settings. */\n embedded?: boolean;\n}\n\nexport function ExtensionsListPage({\n embedded = false,\n}: ExtensionsListPageProps = {}) {\n const t = useT();\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [showGloballyHidden, setShowGloballyHidden] = useState(false);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n if (embedded) return;\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, [embedded]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\n\n const extensionsQuery = useQuery<Extension[]>({\n queryKey: [\"extensions\", { includeGloballyHidden: showGloballyHidden }],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n showGloballyHidden\n ? \"/_agent-native/extensions?includeGloballyHidden=true\"\n : \"/_agent-native/extensions\",\n ),\n );\n if (!res.ok) throw new Error(`Failed to load extensions (${res.status})`);\n return res.json();\n },\n });\n const extensions = extensionsQuery.data;\n\n const toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text, (prompt) =>\n t(\"extensions.createPrompt\", { prompt }),\n );\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n await deleteOrHideExtension(extension);\n invalidateExtensionRemoval(queryClient, extension.id);\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n const handleGlobalHideToggle = async (extension: Extension) => {\n setConfirmDeleteId(null);\n const action = extension.globallyHidden ? \"global-unhide\" : \"global-hide\";\n try {\n await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}/${action}`),\n { method: \"POST\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div\n className={cn(\n \"flex w-full flex-col\",\n embedded ? \"min-h-[28rem]\" : \"h-full\",\n )}\n >\n <header className=\"flex h-12 items-center justify-between border-b px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-sm font-semibold\">{t(\"extensions.title\")}</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n {t(\"extensions.newExtension\")}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n {t(\"extensions.newExtensionTitle\")}\n </p>\n <PromptComposer\n autoFocus\n placeholder={t(\"extensions.buildPlaceholder\")}\n draftScope=\"extensions:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={t(\"extensions.optionsFor\", {\n name: t(\"extensions.title\"),\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuCheckboxItem\n checked={showGloballyHidden}\n onCheckedChange={(checked) =>\n setShowGloballyHidden(Boolean(checked))\n }\n >\n {t(\"extensions.showHidden\")}\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <AgentToggleButton />\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10\">\n {extensionsQuery.isLoading ? (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : extensionsQuery.isError ? (\n <ExtensionQueryErrorState\n className=\"min-h-[calc(100vh-9rem)]\"\n message={t(\"extensions.loadError\")}\n onRetry={() => void extensionsQuery.refetch()}\n retrying={extensionsQuery.isFetching}\n />\n ) : toolList.length === 0 ? (\n <div className=\"flex min-h-[calc(100vh-9rem)] flex-col items-center justify-start px-2 pb-12 pt-[clamp(5rem,18vh,11rem)] sm:pb-16\">\n <div className=\"mx-auto flex w-full max-w-[34rem] flex-col gap-7\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <IconTool className=\"h-10 w-10 text-muted-foreground/40\" />\n <div className=\"space-y-1.5\">\n <p className=\"text-base font-semibold text-foreground\">\n {t(\"extensions.emptyTitle\")}\n </p>\n <p className=\"mx-auto max-w-sm text-sm text-muted-foreground\">\n {t(\"extensions.emptyDescription\")}\n </p>\n </div>\n </div>\n <CreateToolInput className=\"w-full\" />\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => {\n const isLocalExtension = extension.source?.mode === \"local-files\";\n return (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n extension.globallyHidden && \"opacity-60\",\n )}\n >\n <Link\n to={extensionPath(extension.id, extension.name)}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n {extension.globallyHidden && (\n <IconEyeOff\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n aria-label={t(\"extensions.hiddenFromEveryone\")}\n />\n )}\n <span className=\"truncate\">{extension.name}</span>\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n {isLocalExtension && (\n <p className=\"mt-3 inline-flex rounded-md border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t(\"extensions.localFile\")}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={t(\"extensions.optionsFor\", {\n name: extension.name,\n })}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n {!isLocalExtension && extension.canDelete !== false && (\n <div className=\"border-b p-1\">\n <button\n type=\"button\"\n onClick={() => handleGlobalHideToggle(extension)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-[12px] hover:bg-accent\"\n >\n {extension.globallyHidden ? (\n <>\n <IconEye className=\"h-3.5 w-3.5\" />\n {t(\"extensions.unhideEveryone\")}\n </>\n ) : (\n <>\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n {t(\"extensions.hideEveryone\")}\n </>\n )}\n </button>\n </div>\n )}\n {isLocalExtension ? (\n <div className=\"p-3 text-[12px] text-muted-foreground\">\n {t(\"extensions.localFileDescription\", {\n entryPath:\n extension.source?.entryPath ?? \"local files\",\n })}\n </div>\n ) : (\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n {extension.canDelete === false\n ? t(\"extensions.removeQuestion\", {\n name: extension.name,\n })\n : t(\"extensions.deleteQuestion\", {\n name: extension.name,\n })}{\" \"}\n {extension.canDelete === false\n ? t(\"extensions.hideForYouDescription\")\n : t(\"extensions.removeEverywhereDescription\")}\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? extension.canDelete === false\n ? t(\"extensions.removing\")\n : t(\"extensions.deleting\")\n : extension.canDelete === false\n ? t(\"extensions.remove\")\n : t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function ExtensionsSettingsContent(): import("react").JSX.Element;
2
+ //# sourceMappingURL=ExtensionsSettingsContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionsSettingsContent.d.ts","sourceRoot":"","sources":["../../../src/client/settings/ExtensionsSettingsContent.tsx"],"names":[],"mappings":"AASA,wBAAgB,yBAAyB,gCAcxC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { IconLoader2 } from "@tabler/icons-react";
3
+ import { lazy, Suspense } from "react";
4
+ const ExtensionsListPage = lazy(() => import("../extensions/ExtensionsListPage.js").then((module) => ({
5
+ default: module.ExtensionsListPage,
6
+ })));
7
+ export function ExtensionsSettingsContent() {
8
+ return (_jsx("div", { className: "mx-auto w-full max-w-5xl overflow-hidden rounded-lg border border-border bg-background", children: _jsx(Suspense, { fallback: _jsx("div", { className: "flex min-h-[28rem] items-center justify-center text-muted-foreground", children: _jsx(IconLoader2, { className: "size-5 animate-spin", "aria-label": "Loading" }) }), children: _jsx(ExtensionsListPage, { embedded: true }) }) }));
9
+ }
10
+ //# sourceMappingURL=ExtensionsSettingsContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionsSettingsContent.js","sourceRoot":"","sources":["../../../src/client/settings/ExtensionsSettingsContent.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CACnC,MAAM,CAAC,qCAAqC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC,kBAAkB;CACnC,CAAC,CAAC,CACJ,CAAC;AAEF,MAAM,UAAU,yBAAyB;IACvC,OAAO,CACL,cAAK,SAAS,EAAC,wFAAwF,YACrG,KAAC,QAAQ,IACP,QAAQ,EACN,cAAK,SAAS,EAAC,sEAAsE,YACnF,KAAC,WAAW,IAAC,SAAS,EAAC,qBAAqB,gBAAY,SAAS,GAAG,GAChE,YAGR,KAAC,kBAAkB,IAAC,QAAQ,SAAG,GACtB,GACP,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { IconLoader2 } from \"@tabler/icons-react\";\nimport { lazy, Suspense } from \"react\";\n\nconst ExtensionsListPage = lazy(() =>\n import(\"../extensions/ExtensionsListPage.js\").then((module) => ({\n default: module.ExtensionsListPage,\n })),\n);\n\nexport function ExtensionsSettingsContent() {\n return (\n <div className=\"mx-auto w-full max-w-5xl overflow-hidden rounded-lg border border-border bg-background\">\n <Suspense\n fallback={\n <div className=\"flex min-h-[28rem] items-center justify-center text-muted-foreground\">\n <IconLoader2 className=\"size-5 animate-spin\" aria-label=\"Loading\" />\n </div>\n }\n >\n <ExtensionsListPage embedded />\n </Suspense>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAQN,MAAM,OAAO,CAAC;AAoCf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA6nB7D,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,MAAM,EACN,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,OAAO,GACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,qBAuDA;AA8hDD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAwhBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,qBAEtD;AAgCD,wBAAgB,0BAA0B,CAAC,EACzC,kBAAkB,GACnB,EAAE;IACD,kBAAkB,EAAE,kBAAkB,CAAC;CACxC,qBAeA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,GACV,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,qBAsB7B;AAED,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CAmExD"}
1
+ {"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAQN,MAAM,OAAO,CAAC;AAqCf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA6nB7D,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,MAAM,EACN,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,OAAO,GACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,qBAuDA;AA8hDD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAwhBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,qBAEtD;AAgCD,wBAAgB,0BAA0B,CAAC,EACzC,kBAAkB,GACnB,EAAE;IACD,kBAAkB,EAAE,kBAAkB,CAAC;CACxC,qBAeA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,GACV,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,qBAsB7B;AAED,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CA2ExD"}
@@ -1,7 +1,7 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Checkbox, Picker, TextField, } from "@agent-native/toolkit/design-system";
3
3
  import { Button as ToolkitButton } from "@agent-native/toolkit/ui/button";
4
- import { IconChevronDown, IconChevronRight, IconCheck, IconExternalLink, IconBrain, IconHierarchy2, IconBrowser, IconGitBranch, IconCloud, IconDatabase, IconShield, IconPlugConnected, IconTopologyRing2, IconLoader2, IconUpload, IconCoin, IconMail, IconKey, IconMicrophone, IconEyeOff, IconBolt, IconGauge, IconApps, IconUsersGroup, } from "@tabler/icons-react";
4
+ import { IconChevronDown, IconChevronRight, IconCheck, IconExternalLink, IconBrain, IconHierarchy2, IconBrowser, IconGitBranch, IconCloud, IconDatabase, IconShield, IconPlugConnected, IconTopologyRing2, IconLoader2, IconUpload, IconCoin, IconMail, IconKey, IconMicrophone, IconEyeOff, IconBolt, IconGauge, IconApps, IconUsersGroup, IconTool, } from "@tabler/icons-react";
5
5
  import React, { Suspense, lazy, useState, useEffect, useCallback, useMemo, useRef, } from "react";
6
6
  import { Link, Navigate } from "react-router";
7
7
  import { PROVIDER_ENV_PLACEHOLDERS } from "../../agent/engine/provider-env-vars.js";
@@ -19,6 +19,7 @@ import { AGENT_SETTINGS_SECTIONS, ALL_SETTINGS_SECTIONS, CONNECTION_SETTINGS_SEC
19
19
  import { AgentsSection } from "./AgentsSection.js";
20
20
  import { AutomationsSection } from "./AutomationsSection.js";
21
21
  import { DemoModeSection } from "./DemoModeSection.js";
22
+ import { ExtensionsSettingsContent } from "./ExtensionsSettingsContent.js";
22
23
  import { SecretsSection } from "./SecretsSection.js";
23
24
  import { SettingsSection, SettingsSurfaceProvider, useSettingsSurface, } from "./SettingsSection.js";
24
25
  import { UsageSection } from "./UsageSection.js";
@@ -1040,6 +1041,14 @@ export function useAgentSettingsTabs() {
1040
1041
  group: "workspace",
1041
1042
  content: (_jsx(SettingsPanelContent, { ...baseProps, surface: "page", sections: WORKSPACE_SETTINGS_SECTIONS, showCapabilityStrip: false, className: "mx-auto w-full max-w-2xl" })),
1042
1043
  },
1044
+ {
1045
+ id: "extensions",
1046
+ label: "Extensions",
1047
+ icon: IconTool,
1048
+ group: "workspace",
1049
+ keywords: "extensions widgets mini apps tools sandboxed apps",
1050
+ content: _jsx(ExtensionsSettingsContent, {}),
1051
+ },
1043
1052
  ];
1044
1053
  }, [baseProps]);
1045
1054
  }