@databricks/appkit-ui 0.10.0 → 0.11.0

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 (205) hide show
  1. package/CLAUDE.md +7 -0
  2. package/dist/cli/commands/plugin/sync/sync.js +6 -3
  3. package/dist/cli/commands/plugin/sync/sync.js.map +1 -1
  4. package/dist/cli/index.d.ts +1 -1
  5. package/dist/cli/index.js +1 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/react/charts/area/index.d.ts +2 -2
  8. package/dist/react/charts/bar/index.d.ts +2 -2
  9. package/dist/react/charts/base.d.ts +2 -2
  10. package/dist/react/charts/create-chart.d.ts +2 -2
  11. package/dist/react/charts/heatmap/index.d.ts +2 -2
  12. package/dist/react/charts/line/index.d.ts +2 -2
  13. package/dist/react/charts/pie/index.d.ts +3 -3
  14. package/dist/react/charts/radar/index.d.ts +2 -2
  15. package/dist/react/charts/scatter/index.d.ts +2 -2
  16. package/dist/react/charts/wrapper.d.ts +2 -2
  17. package/dist/react/table/data-table.d.ts +2 -2
  18. package/dist/react/table/data-table.d.ts.map +1 -1
  19. package/dist/react/ui/calendar.d.ts +3 -3
  20. package/dist/react/ui/card.d.ts +8 -8
  21. package/dist/react/ui/carousel.d.ts +6 -6
  22. package/dist/react/ui/chart.d.ts +5 -5
  23. package/dist/react/ui/checkbox.d.ts +2 -2
  24. package/dist/react/ui/collapsible.d.ts +4 -4
  25. package/dist/react/ui/command.d.ts +10 -10
  26. package/dist/react/ui/context-menu.d.ts +16 -16
  27. package/dist/react/ui/dialog.d.ts +11 -11
  28. package/dist/react/ui/drawer.d.ts +11 -11
  29. package/dist/react/ui/dropdown-menu.d.ts +16 -16
  30. package/dist/react/ui/empty.d.ts +7 -7
  31. package/dist/react/ui/field.d.ts +11 -11
  32. package/dist/react/ui/form.d.ts +7 -7
  33. package/dist/react/ui/hover-card.d.ts +4 -4
  34. package/dist/react/ui/input-group.d.ts +7 -7
  35. package/dist/react/ui/input-otp.d.ts +5 -5
  36. package/dist/react/ui/input.d.ts +2 -2
  37. package/dist/react/ui/item.d.ts +11 -11
  38. package/dist/react/ui/kbd.d.ts +3 -3
  39. package/dist/react/ui/label.d.ts +2 -2
  40. package/dist/react/ui/menubar.d.ts +17 -17
  41. package/dist/react/ui/navigation-menu.d.ts +9 -9
  42. package/dist/react/ui/pagination.d.ts +8 -8
  43. package/dist/react/ui/popover.d.ts +5 -5
  44. package/dist/react/ui/progress.d.ts +2 -2
  45. package/dist/react/ui/radio-group.d.ts +3 -3
  46. package/dist/react/ui/resizable.d.ts +4 -4
  47. package/dist/react/ui/scroll-area.d.ts +3 -3
  48. package/dist/react/ui/select.d.ts +11 -11
  49. package/dist/react/ui/separator.d.ts +2 -2
  50. package/dist/react/ui/sheet.d.ts +9 -9
  51. package/dist/react/ui/sidebar.d.ts +24 -24
  52. package/dist/react/ui/skeleton.d.ts +2 -2
  53. package/dist/react/ui/slider.d.ts +2 -2
  54. package/dist/react/ui/sonner.d.ts +2 -2
  55. package/dist/react/ui/spinner.d.ts +2 -2
  56. package/dist/react/ui/switch.d.ts +2 -2
  57. package/dist/react/ui/table.d.ts +9 -9
  58. package/dist/react/ui/tabs.d.ts +5 -5
  59. package/dist/react/ui/textarea.d.ts +2 -2
  60. package/dist/react/ui/toggle-group.d.ts +3 -3
  61. package/dist/react/ui/toggle.d.ts +2 -2
  62. package/dist/schemas/plugin-manifest.schema.json +4 -0
  63. package/dist/schemas/template-plugins.schema.json +4 -0
  64. package/docs/docs/api/appkit/Class.AppKitError/index.html +3 -3
  65. package/docs/docs/api/appkit/Class.AuthenticationError/index.html +3 -3
  66. package/docs/docs/api/appkit/Class.ConfigurationError/index.html +3 -3
  67. package/docs/docs/api/appkit/Class.ConnectionError/index.html +3 -3
  68. package/docs/docs/api/appkit/Class.ExecutionError/index.html +3 -3
  69. package/docs/docs/api/appkit/Class.InitializationError/index.html +3 -3
  70. package/docs/docs/api/appkit/Class.Plugin/index.html +3 -3
  71. package/docs/docs/api/appkit/Class.ResourceRegistry/index.html +3 -3
  72. package/docs/docs/api/appkit/Class.ServerError/index.html +3 -3
  73. package/docs/docs/api/appkit/Class.TunnelError/index.html +3 -3
  74. package/docs/docs/api/appkit/Class.ValidationError/index.html +3 -3
  75. package/docs/docs/api/appkit/Enumeration.RequestedClaimsPermissionSet/index.html +3 -3
  76. package/docs/docs/api/appkit/Enumeration.ResourceType/index.html +3 -3
  77. package/docs/docs/api/appkit/Function.appKitTypesPlugin/index.html +3 -3
  78. package/docs/docs/api/appkit/Function.createApp/index.html +3 -3
  79. package/docs/docs/api/appkit/Function.createLakebasePool/index.html +3 -3
  80. package/docs/docs/api/appkit/Function.generateDatabaseCredential/index.html +3 -3
  81. package/docs/docs/api/appkit/Function.getExecutionContext/index.html +3 -3
  82. package/docs/docs/api/appkit/Function.getLakebaseOrmConfig/index.html +3 -3
  83. package/docs/docs/api/appkit/Function.getLakebasePgConfig/index.html +3 -3
  84. package/docs/docs/api/appkit/Function.getPluginManifest/index.html +3 -3
  85. package/docs/docs/api/appkit/Function.getResourceRequirements/index.html +3 -3
  86. package/docs/docs/api/appkit/Function.getUsernameWithApiLookup/index.html +3 -3
  87. package/docs/docs/api/appkit/Function.getWorkspaceClient/index.html +3 -3
  88. package/docs/docs/api/appkit/Function.isSQLTypeMarker/index.html +3 -3
  89. package/docs/docs/api/appkit/Interface.BasePluginConfig/index.html +3 -3
  90. package/docs/docs/api/appkit/Interface.CacheConfig/index.html +3 -3
  91. package/docs/docs/api/appkit/Interface.DatabaseCredential/index.html +3 -3
  92. package/docs/docs/api/appkit/Interface.GenerateDatabaseCredentialRequest/index.html +3 -3
  93. package/docs/docs/api/appkit/Interface.ITelemetry/index.html +3 -3
  94. package/docs/docs/api/appkit/Interface.LakebasePoolConfig/index.html +3 -3
  95. package/docs/docs/api/appkit/Interface.PluginManifest/index.html +3 -3
  96. package/docs/docs/api/appkit/Interface.RequestedClaims/index.html +3 -3
  97. package/docs/docs/api/appkit/Interface.RequestedResource/index.html +3 -3
  98. package/docs/docs/api/appkit/Interface.ResourceEntry/index.html +3 -3
  99. package/docs/docs/api/appkit/Interface.ResourceFieldEntry/index.html +3 -3
  100. package/docs/docs/api/appkit/Interface.ResourceRequirement/index.html +3 -3
  101. package/docs/docs/api/appkit/Interface.StreamExecutionSettings/index.html +3 -3
  102. package/docs/docs/api/appkit/Interface.TelemetryConfig/index.html +3 -3
  103. package/docs/docs/api/appkit/Interface.ValidationResult/index.html +3 -3
  104. package/docs/docs/api/appkit/TypeAlias.ConfigSchema/index.html +3 -3
  105. package/docs/docs/api/appkit/TypeAlias.IAppRouter/index.html +3 -3
  106. package/docs/docs/api/appkit/TypeAlias.ResourcePermission/index.html +3 -3
  107. package/docs/docs/api/appkit/TypeAlias.ToPlugin/index.html +3 -3
  108. package/docs/docs/api/appkit/Variable.sql/index.html +3 -3
  109. package/docs/docs/api/appkit/index.html +3 -3
  110. package/docs/docs/api/appkit-ui/data/AreaChart/index.html +3 -3
  111. package/docs/docs/api/appkit-ui/data/BarChart/index.html +3 -3
  112. package/docs/docs/api/appkit-ui/data/DataTable/index.html +3 -3
  113. package/docs/docs/api/appkit-ui/data/DonutChart/index.html +3 -3
  114. package/docs/docs/api/appkit-ui/data/HeatmapChart/index.html +3 -3
  115. package/docs/docs/api/appkit-ui/data/LineChart/index.html +3 -3
  116. package/docs/docs/api/appkit-ui/data/PieChart/index.html +3 -3
  117. package/docs/docs/api/appkit-ui/data/RadarChart/index.html +3 -3
  118. package/docs/docs/api/appkit-ui/data/ScatterChart/index.html +3 -3
  119. package/docs/docs/api/appkit-ui/index.html +3 -3
  120. package/docs/docs/api/appkit-ui/styling/index.html +3 -3
  121. package/docs/docs/api/appkit-ui/ui/Accordion/index.html +3 -3
  122. package/docs/docs/api/appkit-ui/ui/Alert/index.html +3 -3
  123. package/docs/docs/api/appkit-ui/ui/AlertDialog/index.html +3 -3
  124. package/docs/docs/api/appkit-ui/ui/AspectRatio/index.html +3 -3
  125. package/docs/docs/api/appkit-ui/ui/Avatar/index.html +3 -3
  126. package/docs/docs/api/appkit-ui/ui/Badge/index.html +3 -3
  127. package/docs/docs/api/appkit-ui/ui/Breadcrumb/index.html +3 -3
  128. package/docs/docs/api/appkit-ui/ui/Button/index.html +3 -3
  129. package/docs/docs/api/appkit-ui/ui/ButtonGroup/index.html +3 -3
  130. package/docs/docs/api/appkit-ui/ui/Calendar/index.html +3 -3
  131. package/docs/docs/api/appkit-ui/ui/Card/index.html +3 -3
  132. package/docs/docs/api/appkit-ui/ui/Carousel/index.html +3 -3
  133. package/docs/docs/api/appkit-ui/ui/ChartContainer/index.html +3 -3
  134. package/docs/docs/api/appkit-ui/ui/Checkbox/index.html +3 -3
  135. package/docs/docs/api/appkit-ui/ui/Collapsible/index.html +3 -3
  136. package/docs/docs/api/appkit-ui/ui/Command/index.html +3 -3
  137. package/docs/docs/api/appkit-ui/ui/ContextMenu/index.html +3 -3
  138. package/docs/docs/api/appkit-ui/ui/Dialog/index.html +3 -3
  139. package/docs/docs/api/appkit-ui/ui/Drawer/index.html +3 -3
  140. package/docs/docs/api/appkit-ui/ui/DropdownMenu/index.html +3 -3
  141. package/docs/docs/api/appkit-ui/ui/Empty/index.html +3 -3
  142. package/docs/docs/api/appkit-ui/ui/Field/index.html +3 -3
  143. package/docs/docs/api/appkit-ui/ui/FormControl/index.html +3 -3
  144. package/docs/docs/api/appkit-ui/ui/HoverCard/index.html +3 -3
  145. package/docs/docs/api/appkit-ui/ui/Input/index.html +3 -3
  146. package/docs/docs/api/appkit-ui/ui/InputGroup/index.html +3 -3
  147. package/docs/docs/api/appkit-ui/ui/InputOTP/index.html +3 -3
  148. package/docs/docs/api/appkit-ui/ui/Item/index.html +3 -3
  149. package/docs/docs/api/appkit-ui/ui/Kbd/index.html +3 -3
  150. package/docs/docs/api/appkit-ui/ui/Label/index.html +3 -3
  151. package/docs/docs/api/appkit-ui/ui/Menubar/index.html +3 -3
  152. package/docs/docs/api/appkit-ui/ui/NavigationMenu/index.html +3 -3
  153. package/docs/docs/api/appkit-ui/ui/Pagination/index.html +3 -3
  154. package/docs/docs/api/appkit-ui/ui/Popover/index.html +3 -3
  155. package/docs/docs/api/appkit-ui/ui/Progress/index.html +3 -3
  156. package/docs/docs/api/appkit-ui/ui/RadioGroup/index.html +3 -3
  157. package/docs/docs/api/appkit-ui/ui/ResizableHandle/index.html +3 -3
  158. package/docs/docs/api/appkit-ui/ui/ScrollArea/index.html +3 -3
  159. package/docs/docs/api/appkit-ui/ui/Select/index.html +3 -3
  160. package/docs/docs/api/appkit-ui/ui/Separator/index.html +3 -3
  161. package/docs/docs/api/appkit-ui/ui/Sheet/index.html +3 -3
  162. package/docs/docs/api/appkit-ui/ui/Sidebar/index.html +3 -3
  163. package/docs/docs/api/appkit-ui/ui/Skeleton/index.html +3 -3
  164. package/docs/docs/api/appkit-ui/ui/Slider/index.html +3 -3
  165. package/docs/docs/api/appkit-ui/ui/Spinner/index.html +3 -3
  166. package/docs/docs/api/appkit-ui/ui/Switch/index.html +3 -3
  167. package/docs/docs/api/appkit-ui/ui/Table/index.html +3 -3
  168. package/docs/docs/api/appkit-ui/ui/Tabs/index.html +3 -3
  169. package/docs/docs/api/appkit-ui/ui/Textarea/index.html +3 -3
  170. package/docs/docs/api/appkit-ui/ui/Toaster/index.html +3 -3
  171. package/docs/docs/api/appkit-ui/ui/Toggle/index.html +3 -3
  172. package/docs/docs/api/appkit-ui/ui/ToggleGroup/index.html +3 -3
  173. package/docs/docs/api/appkit-ui/ui/Tooltip/index.html +3 -3
  174. package/docs/docs/api/index.html +3 -3
  175. package/docs/docs/app-management/index.html +4 -4
  176. package/docs/docs/architecture/index.html +6 -6
  177. package/docs/docs/category/development/index.html +3 -3
  178. package/docs/docs/configuration/index.html +4 -4
  179. package/docs/docs/core-principles/index.html +3 -3
  180. package/docs/docs/development/ai-assisted-development/index.html +3 -3
  181. package/docs/docs/development/index.html +3 -3
  182. package/docs/docs/development/llm-guide/index.html +3 -3
  183. package/docs/docs/development/local-development/index.html +3 -3
  184. package/docs/docs/development/project-setup/index.html +4 -4
  185. package/docs/docs/development/remote-bridge/index.html +3 -3
  186. package/docs/docs/development/type-generation/index.html +4 -4
  187. package/docs/docs/index.html +3 -3
  188. package/docs/docs/plugins/analytics/index.html +53 -0
  189. package/docs/docs/plugins/analytics.md +66 -0
  190. package/docs/docs/plugins/caching/index.html +23 -0
  191. package/docs/docs/plugins/caching.md +33 -0
  192. package/docs/docs/plugins/custom-plugins/index.html +49 -0
  193. package/docs/docs/plugins/custom-plugins.md +161 -0
  194. package/docs/docs/plugins/execution-context/index.html +40 -0
  195. package/docs/docs/plugins/execution-context.md +45 -0
  196. package/docs/docs/plugins/index.html +6 -173
  197. package/docs/docs/plugins/lakebase/index.html +62 -0
  198. package/docs/docs/plugins/lakebase.md +179 -0
  199. package/docs/docs/plugins/plugin-management/index.html +44 -0
  200. package/docs/docs/plugins/plugin-management.md +88 -0
  201. package/docs/docs/plugins/server/index.html +45 -0
  202. package/docs/docs/plugins/server.md +78 -0
  203. package/docs/docs/plugins.md +0 -481
  204. package/llms.txt +7 -0
  205. package/package.json +1 -1
@@ -1,196 +1,29 @@
1
1
  <!doctype html>
2
- <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-plugins" data-has-hydrated="false">
2
+ <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-plugins/index" data-has-hydrated="false">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.9.2">
6
- <title data-rh="true">Plugins | AppKit</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://databricks.github.io/appkit/docs/plugins"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="keywords" content="Databricks Apps, Node.js, React.js, SDK, TypeScript, SQL, Databricks, AI, full-stack, development"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Plugins | AppKit"><meta data-rh="true" name="description" content="Plugins are modular extensions that add capabilities to your AppKit application. They follow a defined lifecycle and have access to shared services like caching, telemetry, and streaming."><meta data-rh="true" property="og:description" content="Plugins are modular extensions that add capabilities to your AppKit application. They follow a defined lifecycle and have access to shared services like caching, telemetry, and streaming."><link data-rh="true" rel="icon" href="/appkit/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://databricks.github.io/appkit/docs/plugins"><link data-rh="true" rel="alternate" href="https://databricks.github.io/appkit/docs/plugins" hreflang="en"><link data-rh="true" rel="alternate" href="https://databricks.github.io/appkit/docs/plugins" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Plugins","item":"https://databricks.github.io/appkit/docs/plugins"}]}</script><link rel="stylesheet" href="/appkit/assets/css/styles.36a38b99.css">
7
- <script src="/appkit/assets/js/runtime~main.4233c61d.js" defer="defer"></script>
8
- <script src="/appkit/assets/js/main.cdc7378d.js" defer="defer"></script>
6
+ <title data-rh="true">Plugins | AppKit</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://databricks.github.io/appkit/docs/plugins/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="keywords" content="Databricks Apps, Node.js, React.js, SDK, TypeScript, SQL, Databricks, AI, full-stack, development"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Plugins | AppKit"><meta data-rh="true" name="description" content="Plugins are modular extensions that add capabilities to your AppKit application. They follow a defined lifecycle and have access to shared services like caching, telemetry, and streaming."><meta data-rh="true" property="og:description" content="Plugins are modular extensions that add capabilities to your AppKit application. They follow a defined lifecycle and have access to shared services like caching, telemetry, and streaming."><link data-rh="true" rel="icon" href="/appkit/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://databricks.github.io/appkit/docs/plugins/"><link data-rh="true" rel="alternate" href="https://databricks.github.io/appkit/docs/plugins/" hreflang="en"><link data-rh="true" rel="alternate" href="https://databricks.github.io/appkit/docs/plugins/" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Plugins","item":"https://databricks.github.io/appkit/docs/plugins/"}]}</script><link rel="stylesheet" href="/appkit/assets/css/styles.36a38b99.css">
7
+ <script src="/appkit/assets/js/runtime~main.d646887d.js" defer="defer"></script>
8
+ <script src="/appkit/assets/js/main.83fa168f.js" defer="defer"></script>
9
9
  </head>
10
10
  <body class="navigation-with-keyboard">
11
11
  <svg style="display: none;"><defs>
12
12
  <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
13
13
  </defs></svg>
14
- <script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><link rel="preload" as="image" href="/appkit/img/logo.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_R3I2" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="theme-announcement-bar announcementBar_Upl7" style="background-color:#f0f0f0;color:#000000" role="banner"><div class="announcementBarPlaceholder_Lvio"></div><div class="content_vq0X announcementBarContent_FIMQ">⚠️ AppKit is in an early development phase and is subject to change without notice. <strong>DO NOT</strong> use in production environments.</div><button type="button" aria-label="Close" class="clean-btn close closeButton_J8WU announcementBarClose_jD94"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/appkit/"><div class="navbar__logo"><img src="/appkit/img/logo.png" alt="AppKit" class="themedComponent_hkXO themedComponent--light_BgK8"><img src="/appkit/img/logo.png" alt="AppKit" class="themedComponent_hkXO themedComponent--dark_RKPt"></div><b class="navbar__title text--truncate">AppKit</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/appkit/docs/">Documentation</a><a class="navbar__item navbar__link" href="/appkit/contributing">Contributing</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/databricks/appkit" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_eFYw colorModeToggle_EPbi"><button class="clean-btn toggleButton_HRKp toggleButtonDisabled_bICu" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_brDO lightToggleIcon_vxPA"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_brDO darkToggleIcon_PZNO"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_brDO systemToggleIcon_A7x6"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_cVhq"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper__Y_W"><div class="docsWrapper_cIfN"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_xQFv" type="button"></button><div class="docRoot_FHtD"><aside class="theme-doc-sidebar-container docSidebarContainer_dvCd"><div class="sidebarViewport_GeRf"><div class="sidebar_T8N1"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_uyE9 menuWithAnnouncementBar_Bucd"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/"><span title="Getting started" class="linkLabel_hZzm">Getting started</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/app-management"><span title="App management" class="linkLabel_hZzm">App management</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/appkit/docs/plugins"><span title="Plugins" class="linkLabel_hZzm">Plugins</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/architecture"><span title="Architecture" class="linkLabel_hZzm">Architecture</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/configuration"><span title="Configuration" class="linkLabel_hZzm">Configuration</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_P6CU menu__link menu__link--sublist" href="/appkit/docs/category/development"><span title="Development" class="categoryLinkLabel_ShmP">Development</span></a><button aria-label="Collapse sidebar category &#x27;Development&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/local-development"><span title="Local development" class="linkLabel_hZzm">Local development</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/ai-assisted-development"><span title="AI-Assisted development" class="linkLabel_hZzm">AI-Assisted development</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/"><span title="Development" class="linkLabel_hZzm">Development</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/remote-bridge"><span title="Remote Bridge" class="linkLabel_hZzm">Remote Bridge</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/project-setup"><span title="Project setup" class="linkLabel_hZzm">Project setup</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/type-generation"><span title="Type generation" class="linkLabel_hZzm">Type generation</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/llm-guide"><span title="LLM Guide" class="linkLabel_hZzm">LLM Guide</span></a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/core-principles"><span title="Core principles" class="linkLabel_hZzm">Core principles</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_P6CU menu__link menu__link--sublist" href="/appkit/docs/api/"><span title="API reference" class="categoryLinkLabel_ShmP">API reference</span></a><button aria-label="Expand sidebar category &#x27;API reference&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></nav></div></div></aside><main class="docMainContainer_P5br"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_poBZ"><div class="docItemContainer_TdBg"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_bEIa" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/appkit/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_sma7"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Plugins</span></li></ul></nav><div class="tocCollapsible_gJxE theme-doc-toc-mobile tocMobile_ZHYV"><button type="button" class="clean-btn tocCollapsibleButton_uxuR">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Plugins</h1></header>
14
+ <script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><link rel="preload" as="image" href="/appkit/img/logo.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_R3I2" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="theme-announcement-bar announcementBar_Upl7" style="background-color:#f0f0f0;color:#000000" role="banner"><div class="announcementBarPlaceholder_Lvio"></div><div class="content_vq0X announcementBarContent_FIMQ">⚠️ AppKit is in an early development phase and is subject to change without notice. <strong>DO NOT</strong> use in production environments.</div><button type="button" aria-label="Close" class="clean-btn close closeButton_J8WU announcementBarClose_jD94"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/appkit/"><div class="navbar__logo"><img src="/appkit/img/logo.png" alt="AppKit" class="themedComponent_hkXO themedComponent--light_BgK8"><img src="/appkit/img/logo.png" alt="AppKit" class="themedComponent_hkXO themedComponent--dark_RKPt"></div><b class="navbar__title text--truncate">AppKit</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/appkit/docs/">Documentation</a><a class="navbar__item navbar__link" href="/appkit/contributing">Contributing</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/databricks/appkit" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_eFYw colorModeToggle_EPbi"><button class="clean-btn toggleButton_HRKp toggleButtonDisabled_bICu" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_brDO lightToggleIcon_vxPA"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_brDO darkToggleIcon_PZNO"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_brDO systemToggleIcon_A7x6"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_cVhq"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper__Y_W"><div class="docsWrapper_cIfN"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_xQFv" type="button"></button><div class="docRoot_FHtD"><aside class="theme-doc-sidebar-container docSidebarContainer_dvCd"><div class="sidebarViewport_GeRf"><div class="sidebar_T8N1"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_uyE9 menuWithAnnouncementBar_Bucd"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/"><span title="Getting started" class="linkLabel_hZzm">Getting started</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/app-management"><span title="App management" class="linkLabel_hZzm">App management</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="categoryLink_P6CU menu__link menu__link--sublist menu__link--active" aria-current="page" href="/appkit/docs/plugins/"><span title="Plugins" class="categoryLinkLabel_ShmP">Plugins</span></a><button aria-label="Collapse sidebar category &#x27;Plugins&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/plugins/server"><span title="Server plugin" class="linkLabel_hZzm">Server plugin</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/plugins/analytics"><span title="Analytics plugin" class="linkLabel_hZzm">Analytics plugin</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/plugins/lakebase"><span title="Lakebase plugin" class="linkLabel_hZzm">Lakebase plugin</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/plugins/execution-context"><span title="Execution context" class="linkLabel_hZzm">Execution context</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/plugins/plugin-management"><span title="Plugin management" class="linkLabel_hZzm">Plugin management</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/plugins/custom-plugins"><span title="Creating custom plugins" class="linkLabel_hZzm">Creating custom plugins</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/plugins/caching"><span title="Caching" class="linkLabel_hZzm">Caching</span></a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/architecture"><span title="Architecture" class="linkLabel_hZzm">Architecture</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/configuration"><span title="Configuration" class="linkLabel_hZzm">Configuration</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_P6CU menu__link menu__link--sublist" href="/appkit/docs/category/development"><span title="Development" class="categoryLinkLabel_ShmP">Development</span></a><button aria-label="Collapse sidebar category &#x27;Development&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/local-development"><span title="Local development" class="linkLabel_hZzm">Local development</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/ai-assisted-development"><span title="AI-Assisted development" class="linkLabel_hZzm">AI-Assisted development</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/"><span title="Development" class="linkLabel_hZzm">Development</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/remote-bridge"><span title="Remote Bridge" class="linkLabel_hZzm">Remote Bridge</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/project-setup"><span title="Project setup" class="linkLabel_hZzm">Project setup</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/type-generation"><span title="Type generation" class="linkLabel_hZzm">Type generation</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/appkit/docs/development/llm-guide"><span title="LLM Guide" class="linkLabel_hZzm">LLM Guide</span></a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appkit/docs/core-principles"><span title="Core principles" class="linkLabel_hZzm">Core principles</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_P6CU menu__link menu__link--sublist" href="/appkit/docs/api/"><span title="API reference" class="categoryLinkLabel_ShmP">API reference</span></a><button aria-label="Expand sidebar category &#x27;API reference&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></nav></div></div></aside><main class="docMainContainer_P5br"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_poBZ"><div class="docItemContainer_TdBg"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_bEIa" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/appkit/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_sma7"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Plugins</span></li></ul></nav><div class="tocCollapsible_gJxE theme-doc-toc-mobile tocMobile_ZHYV"><button type="button" class="clean-btn tocCollapsibleButton_uxuR">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Plugins</h1></header>
15
15
  <p>Plugins are modular extensions that add capabilities to your AppKit application. They follow a defined lifecycle and have access to shared services like caching, telemetry, and streaming.</p>
16
16
  <p>For complete API documentation, see the <a class="" href="/appkit/docs/api/appkit/Class.Plugin"><code>Plugin</code></a> class reference.</p>
17
- <h2 class="anchor anchorTargetStickyNavbar_scV4" id="built-in-plugins">Built-in plugins<a href="#built-in-plugins" class="hash-link" aria-label="Direct link to Built-in plugins" title="Direct link to Built-in plugins" translate="no">​</a></h2>
18
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="server-plugin">Server plugin<a href="#server-plugin" class="hash-link" aria-label="Direct link to Server plugin" title="Direct link to Server plugin" translate="no">​</a></h3>
19
- <p>Provides HTTP server capabilities with development and production modes.</p>
20
- <p><strong>Key features:</strong></p>
21
- <ul>
22
- <li class="">Express server for REST APIs</li>
23
- <li class="">Vite dev server with hot module reload</li>
24
- <li class="">Static file serving for production</li>
25
- <li class="">Remote tunneling to deployed backends</li>
26
- </ul>
27
- <p>The Server plugin uses the deferred initialization phase to access routes from other plugins.</p>
28
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="what-it-does">What it does<a href="#what-it-does" class="hash-link" aria-label="Direct link to What it does" title="Direct link to What it does" translate="no">​</a></h4>
29
- <ul>
30
- <li class="">Starts an Express server (default <code>host=0.0.0.0</code>, <code>port=8000</code>)</li>
31
- <li class="">Mounts plugin routes under <code>/api/&lt;pluginName&gt;/...</code></li>
32
- <li class="">Adds <code>/health</code> endpoint (returns <code>{ status: &quot;ok&quot; }</code>)</li>
33
- <li class="">Serves frontend:<!-- -->
34
- <ul>
35
- <li class=""><strong>Development</strong> (<code>NODE_ENV=development</code>): runs a Vite dev server in middleware mode</li>
36
- <li class=""><strong>Production</strong>: auto-detects static frontend directory (checks <code>dist</code>, <code>client/dist</code>, <code>build</code>, <code>public</code>, <code>out</code>)</li>
37
- </ul>
38
- </li>
39
- </ul>
40
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="minimal-server-example">Minimal server example<a href="#minimal-server-example" class="hash-link" aria-label="Direct link to Minimal server example" title="Direct link to Minimal server example" translate="no">​</a></h4>
41
- <p>The smallest valid AppKit server:</p>
42
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token comment" style="color:rgb(0, 128, 0)">// server/index.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> server </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;@databricks/appkit&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token function" style="color:rgb(0, 0, 255)">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
43
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="manual-server-start-example">Manual server start example<a href="#manual-server-start-example" class="hash-link" aria-label="Direct link to Manual server start example" title="Direct link to Manual server start example" translate="no">​</a></h4>
44
- <p>When you need to extend Express with custom routes:</p>
45
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> server </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;@databricks/appkit&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> appkit </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token function" style="color:rgb(0, 0, 255)">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> autoStart</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">appkit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">extend</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">app</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> app</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;/custom&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">_req</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> ok</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> appkit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">start</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
46
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="configuration-options">Configuration options<a href="#configuration-options" class="hash-link" aria-label="Direct link to Configuration options" title="Direct link to Configuration options" translate="no">​</a></h4>
47
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> server </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;@databricks/appkit&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> port</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">8000</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// default: Number(process.env.DATABRICKS_APP_PORT) || 8000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> host</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;0.0.0.0&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// default: process.env.FLASK_RUN_HOST || &quot;0.0.0.0&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> autoStart</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// default: true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> staticPath</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;dist&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// optional: force a specific static directory</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
48
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="analytics-plugin">Analytics plugin<a href="#analytics-plugin" class="hash-link" aria-label="Direct link to Analytics plugin" title="Direct link to Analytics plugin" translate="no">​</a></h3>
49
- <p>Enables SQL query execution against Databricks SQL Warehouses.</p>
50
- <p><strong>Key features:</strong></p>
51
- <ul>
52
- <li class="">File-based SQL queries with automatic type generation</li>
53
- <li class="">Parameterized queries with type-safe <a class="" href="/appkit/docs/api/appkit/Variable.sql">SQL helpers</a></li>
54
- <li class="">JSON and Arrow format support</li>
55
- <li class="">Built-in caching and retry logic</li>
56
- <li class="">Server-Sent Events (SSE) streaming</li>
57
- </ul>
58
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="basic-usage">Basic usage<a href="#basic-usage" class="hash-link" aria-label="Direct link to Basic usage" title="Direct link to Basic usage" translate="no">​</a></h4>
59
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> analytics</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> server </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;@databricks/appkit&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token function" style="color:rgb(0, 0, 255)">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">analytics</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
60
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="where-queries-live">Where queries live<a href="#where-queries-live" class="hash-link" aria-label="Direct link to Where queries live" title="Direct link to Where queries live" translate="no">​</a></h4>
61
- <ul>
62
- <li class="">Put <code>.sql</code> files in <code>config/queries/</code></li>
63
- <li class="">Query key is the filename without <code>.sql</code> (e.g. <code>spend_summary.sql</code> → <code>&quot;spend_summary&quot;</code>)</li>
64
- </ul>
65
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="sql-parameters">SQL parameters<a href="#sql-parameters" class="hash-link" aria-label="Direct link to SQL parameters" title="Direct link to SQL parameters" translate="no">​</a></h4>
66
- <p>Use <code>:paramName</code> placeholders and optionally annotate parameter types using SQL comments:</p>
67
- <div class="language-sql codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-sql codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token comment" style="color:rgb(0, 128, 0)">-- @param startDate DATE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">-- @param endDate DATE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">-- @param limit NUMERIC</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">SELECT</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">WHERE</span><span class="token plain"> usage_date </span><span class="token operator" style="color:rgb(0, 0, 0)">BETWEEN</span><span class="token plain"> :startDate </span><span class="token operator" style="color:rgb(0, 0, 0)">AND</span><span class="token plain"> :endDate</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">LIMIT</span><span class="token plain"> :</span><span class="token keyword" style="color:rgb(0, 0, 255)">limit</span><br></span></code></pre></div></div>
68
- <p><strong>Supported <code>-- @param</code> types</strong> (case-insensitive):</p>
69
- <ul>
70
- <li class=""><code>STRING</code>, <code>NUMERIC</code>, <code>BOOLEAN</code>, <code>DATE</code>, <code>TIMESTAMP</code>, <code>BINARY</code></li>
71
- </ul>
72
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="server-injected-parameters">Server-injected parameters<a href="#server-injected-parameters" class="hash-link" aria-label="Direct link to Server-injected parameters" title="Direct link to Server-injected parameters" translate="no">​</a></h4>
73
- <p><code>:workspaceId</code> is <strong>injected by the server</strong> and <strong>must not</strong> be annotated:</p>
74
- <div class="language-sql codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-sql codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">WHERE</span><span class="token plain"> workspace_id </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> :workspaceId</span><br></span></code></pre></div></div>
75
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="http-endpoints">HTTP endpoints<a href="#http-endpoints" class="hash-link" aria-label="Direct link to HTTP endpoints" title="Direct link to HTTP endpoints" translate="no">​</a></h4>
76
- <p>The analytics plugin exposes these endpoints (mounted under <code>/api/analytics</code>):</p>
77
- <ul>
78
- <li class=""><code>POST /api/analytics/query/:query_key</code></li>
79
- <li class=""><code>POST /api/analytics/users/me/query/:query_key</code></li>
80
- <li class=""><code>GET /api/analytics/arrow-result/:jobId</code></li>
81
- <li class=""><code>GET /api/analytics/users/me/arrow-result/:jobId</code></li>
82
- </ul>
83
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="format-options">Format options<a href="#format-options" class="hash-link" aria-label="Direct link to Format options" title="Direct link to Format options" translate="no">​</a></h4>
84
- <ul>
85
- <li class=""><code>format: &quot;JSON&quot;</code> (default) returns JSON rows</li>
86
- <li class=""><code>format: &quot;ARROW&quot;</code> returns an Arrow &quot;statement_id&quot; payload over SSE, then the client fetches binary Arrow from <code>/api/analytics/arrow-result/:jobId</code></li>
87
- </ul>
88
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="execution-context-and-asuserreq">Execution context and <code>asUser(req)</code><a href="#execution-context-and-asuserreq" class="hash-link" aria-label="Direct link to execution-context-and-asuserreq" title="Direct link to execution-context-and-asuserreq" translate="no">​</a></h3>
89
- <p>AppKit manages Databricks authentication via two contexts:</p>
90
- <ul>
91
- <li class=""><strong>ServiceContext</strong> (singleton): Initialized at app startup with service principal credentials</li>
92
- <li class=""><strong>ExecutionContext</strong>: Determined at runtime - either service principal or user context</li>
93
- </ul>
94
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="headers-for-user-context">Headers for user context<a href="#headers-for-user-context" class="hash-link" aria-label="Direct link to Headers for user context" title="Direct link to Headers for user context" translate="no">​</a></h4>
95
- <ul>
96
- <li class=""><code>x-forwarded-user</code>: required in production; identifies the user</li>
97
- <li class=""><code>x-forwarded-access-token</code>: required for user token passthrough</li>
98
- </ul>
99
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="using-asuserreq-for-user-scoped-operations">Using <code>asUser(req)</code> for user-scoped operations<a href="#using-asuserreq-for-user-scoped-operations" class="hash-link" aria-label="Direct link to using-asuserreq-for-user-scoped-operations" title="Direct link to using-asuserreq-for-user-scoped-operations" translate="no">​</a></h4>
100
- <p>The <code>asUser(req)</code> pattern allows plugins to execute operations using the requesting user&#x27;s credentials:</p>
101
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token comment" style="color:rgb(0, 128, 0)">// In a custom plugin route handler</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">router</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">post</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;/users/me/data&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">req</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Execute as the user (uses their Databricks permissions)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> result </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">this</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">asUser</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">req</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;SELECT ...&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// Service principal execution (default)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">router</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">post</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;/system/data&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">req</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> result </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">this</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;SELECT ...&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
102
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="context-helper-functions">Context helper functions<a href="#context-helper-functions" class="hash-link" aria-label="Direct link to Context helper functions" title="Direct link to Context helper functions" translate="no">​</a></h4>
103
- <p>Exported from <code>@databricks/appkit</code>:</p>
104
- <ul>
105
- <li class=""><code>getCurrentUserId()</code>: Returns user ID in user context, service user ID otherwise</li>
106
- <li class=""><code>getWorkspaceClient()</code>: Returns the appropriate WorkspaceClient for current context</li>
107
- <li class=""><code>getWarehouseId()</code>: <code>Promise&lt;string&gt;</code> (from <code>DATABRICKS_WAREHOUSE_ID</code> or auto-selected in dev)</li>
108
- <li class=""><code>getWorkspaceId()</code>: <code>Promise&lt;string&gt;</code> (from <code>DATABRICKS_WORKSPACE_ID</code> or fetched)</li>
109
- <li class=""><code>isInUserContext()</code>: Returns <code>true</code> if currently executing in user context</li>
110
- </ul>
111
- <h4 class="anchor anchorTargetStickyNavbar_scV4" id="development-mode-behavior">Development mode behavior<a href="#development-mode-behavior" class="hash-link" aria-label="Direct link to Development mode behavior" title="Direct link to Development mode behavior" translate="no">​</a></h4>
112
- <p>In local development (<code>NODE_ENV=development</code>), if <code>asUser(req)</code> is called without a user token, it logs a warning and falls back to the service principal.</p>
113
17
  <h2 class="anchor anchorTargetStickyNavbar_scV4" id="using-plugins">Using plugins<a href="#using-plugins" class="hash-link" aria-label="Direct link to Using plugins" title="Direct link to Using plugins" translate="no">​</a></h2>
114
18
  <p>Configure plugins when creating your AppKit instance:</p>
115
19
  <div class="language-typescript codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-typescript codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> analytics </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;@databricks/appkit&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> AppKit </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> port</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">8000</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">analytics</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
116
20
  <p>For complete configuration options, see <a class="" href="/appkit/docs/api/appkit/Function.createApp"><code>createApp</code></a>.</p>
117
- <h2 class="anchor anchorTargetStickyNavbar_scV4" id="plugin-management">Plugin management<a href="#plugin-management" class="hash-link" aria-label="Direct link to Plugin management" title="Direct link to Plugin management" translate="no">​</a></h2>
118
- <p>AppKit includes a CLI for managing plugins. All commands are available under <code>npx @databricks/appkit plugin</code>.</p>
119
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="create-a-plugin">Create a plugin<a href="#create-a-plugin" class="hash-link" aria-label="Direct link to Create a plugin" title="Direct link to Create a plugin" translate="no">​</a></h3>
120
- <p>Scaffold a new plugin interactively:</p>
121
- <div class="language-bash codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-bash codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin create</span><br></span></code></pre></div></div>
122
- <p>The wizard walks you through:</p>
123
- <ul>
124
- <li class=""><strong>Placement</strong>: In your repository (e.g. <code>plugins/my-plugin</code>) or as a standalone package</li>
125
- <li class=""><strong>Metadata</strong>: Name, display name, description</li>
126
- <li class=""><strong>Resources</strong>: Which Databricks resources the plugin needs (SQL Warehouse, Secret, etc.) and whether each is required or optional</li>
127
- <li class=""><strong>Optional fields</strong>: Author, version, license</li>
128
- </ul>
129
- <p>The command generates a complete plugin scaffold with <code>manifest.json</code>, TypeScript class, and barrel exports — ready to register in your app.</p>
130
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="sync-plugin-manifests">Sync plugin manifests<a href="#sync-plugin-manifests" class="hash-link" aria-label="Direct link to Sync plugin manifests" title="Direct link to Sync plugin manifests" translate="no">​</a></h3>
131
- <p>Scan your project for plugins and generate <code>appkit.plugins.json</code>:</p>
132
- <div class="language-bash codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-bash codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin sync --write</span><br></span></code></pre></div></div>
133
- <p>This discovers plugin manifests from installed packages and local imports, then writes a consolidated manifest used by deployment tooling. Plugins referenced in your <code>createApp({ plugins: [...] })</code> call are automatically marked as required.</p>
134
- <p>Use the <code>--silent</code> flag in build hooks to suppress output:</p>
135
- <div class="language-json codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-json codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token property">&quot;scripts&quot;</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token property">&quot;sync&quot;</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;appkit plugin sync --write --silent&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token property">&quot;predev&quot;</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;npm run sync&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token property">&quot;prebuild&quot;</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;npm run sync&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre></div></div>
136
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="validate-manifests">Validate manifests<a href="#validate-manifests" class="hash-link" aria-label="Direct link to Validate manifests" title="Direct link to Validate manifests" translate="no">​</a></h3>
137
- <p>Check plugin manifests against the JSON schema:</p>
138
- <div class="language-bash codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-bash codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token plain"># Validate manifest.json in the current directory</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin validate</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"># Validate specific files or directories</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin validate plugins/my-plugin appkit.plugins.json</span><br></span></code></pre></div></div>
139
- <p>The validator auto-detects whether a file is a plugin manifest or a template manifest (from <code>$schema</code>) and reports errors with humanized paths and expected values.</p>
140
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="list-plugins">List plugins<a href="#list-plugins" class="hash-link" aria-label="Direct link to List plugins" title="Direct link to List plugins" translate="no">​</a></h3>
141
- <p>View registered plugins from <code>appkit.plugins.json</code> or scan a directory:</p>
142
- <div class="language-bash codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-bash codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token plain"># From appkit.plugins.json (default)</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin list</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"># Scan a directory for plugin folders</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin list --dir plugins/</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"># JSON output for scripting</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin list --json</span><br></span></code></pre></div></div>
143
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="add-a-resource-to-a-plugin">Add a resource to a plugin<a href="#add-a-resource-to-a-plugin" class="hash-link" aria-label="Direct link to Add a resource to a plugin" title="Direct link to Add a resource to a plugin" translate="no">​</a></h3>
144
- <p>Interactively add a new resource requirement to an existing plugin manifest:</p>
145
- <div class="language-bash codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-bash codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin add-resource</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"># Or specify the plugin directory</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin add-resource --path plugins/my-plugin</span><br></span></code></pre></div></div>
146
- <h2 class="anchor anchorTargetStickyNavbar_scV4" id="creating-custom-plugins">Creating custom plugins<a href="#creating-custom-plugins" class="hash-link" aria-label="Direct link to Creating custom plugins" title="Direct link to Creating custom plugins" translate="no">​</a></h2>
147
- <p>If you need custom API routes or background logic, implement an AppKit plugin. The fastest way is to use the CLI:</p>
148
- <div class="language-bash codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-bash codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token plain">npx @databricks/appkit plugin create</span><br></span></code></pre></div></div>
149
- <p>For a deeper understanding of the plugin structure, read on.</p>
150
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="basic-plugin-example">Basic plugin example<a href="#basic-plugin-example" class="hash-link" aria-label="Direct link to Basic plugin example" title="Direct link to Basic plugin example" translate="no">​</a></h3>
151
- <p>Extend the <a class="" href="/appkit/docs/api/appkit/Class.Plugin"><code>Plugin</code></a> class and export with <code>toPlugin()</code>:</p>
152
- <div class="language-typescript codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-typescript codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> Plugin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> toPlugin </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;@databricks/appkit&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">type</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">express</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;express&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">MyPlugin</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Plugin</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> name </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;myPlugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Define resource requirements in the static manifest</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">static</span><span class="token plain"> manifest </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> name</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;myPlugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> displayName</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;My Plugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;A custom plugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> resources</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> required</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> type</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;secret&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> alias</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;apiKey&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> resourceKey</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;apiKey&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;API key for external service&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> permission</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;READ&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> fields</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> scope</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> env</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;MY_SECRET_SCOPE&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Secret scope&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> key</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> env</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;MY_API_KEY&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Secret key name&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> optional</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">setup</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Initialize your plugin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">myCustomMethod</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Some implementation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">shutdown</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Clean up resources</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">exports</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// an object with the methods from this plugin to expose</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> myCustomMethod</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">this</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">myCustomMethod</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> myPlugin </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:rgb(0, 0, 255)">toPlugin</span><span class="token generic-function generic class-name operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token generic-function generic class-name keyword" style="color:rgb(0, 0, 255)">typeof</span><span class="token generic-function generic class-name" style="color:rgb(38, 127, 153)"> MyPlugin</span><span class="token generic-function generic class-name punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token generic-function generic class-name" style="color:rgb(38, 127, 153)"> Record</span><span class="token generic-function generic class-name operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token generic-function generic class-name builtin" style="color:rgb(0, 112, 193)">string</span><span class="token generic-function generic class-name punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token generic-function generic class-name" style="color:rgb(38, 127, 153)"> </span><span class="token generic-function generic class-name builtin" style="color:rgb(0, 112, 193)">never</span><span class="token generic-function generic class-name operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token generic-function generic class-name punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token generic-function generic class-name" style="color:rgb(38, 127, 153)"> </span><span class="token generic-function generic class-name string" style="color:rgb(163, 21, 21)">&quot;myPlugin&quot;</span><span class="token generic-function generic class-name operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> MyPlugin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;myPlugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
153
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="config-dependent-resources">Config-dependent resources<a href="#config-dependent-resources" class="hash-link" aria-label="Direct link to Config-dependent resources" title="Direct link to Config-dependent resources" translate="no">​</a></h3>
154
- <p>The manifest defines resources as either <code>required</code> (always needed) or <code>optional</code> (may be needed).
155
- For resources that become required based on plugin configuration, implement a static
156
- <code>getResourceRequirements(config)</code> method:</p>
157
- <div class="language-typescript codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-typescript codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">interface</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">MyPluginConfig</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">BasePluginConfig</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> enableCaching</span><span class="token operator" style="color:rgb(0, 0, 0)">?</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">boolean</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">MyPlugin</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Plugin</span><span class="token class-name operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">MyPluginConfig</span><span class="token class-name operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> name </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;myPlugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">static</span><span class="token plain"> manifest </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> name</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;myPlugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> displayName</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;My Plugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;A plugin with optional caching&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> resources</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> required</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> type</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;sql_warehouse&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> alias</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;warehouse&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> resourceKey</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;sqlWarehouse&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Query execution&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> permission</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;CAN_USE&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> fields</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> id</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> env</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;DATABRICKS_WAREHOUSE_ID&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> optional</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Listed as optional in manifest for static analysis</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> type</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;database&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> alias</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;cache&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> resourceKey</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;cache&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Query result caching (if enabled)&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> permission</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;CAN_CONNECT_AND_CREATE&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> fields</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> instance_name</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> env</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;DATABRICKS_CACHE_INSTANCE&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> database_name</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> env</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;DATABRICKS_CACHE_DB&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Runtime: Convert optional resources to required based on config</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">static</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">getResourceRequirements</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">config</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> MyPluginConfig</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> resources </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">config</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">enableCaching</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// When caching is enabled, Database becomes required</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> resources</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">push</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> type</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;database&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> alias</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;cache&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> resourceKey</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;cache&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> description</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Query result caching&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> permission</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;CAN_CONNECT_AND_CREATE&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> fields</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> instance_name</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> env</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;DATABRICKS_CACHE_INSTANCE&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> database_name</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> env</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;DATABRICKS_CACHE_DB&quot;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> required</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// Mark as required at runtime</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> resources</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre></div></div>
158
- <p>This pattern allows:</p>
159
- <ul>
160
- <li class=""><strong>Static tools</strong> (CLI, docs) to show all possible resources</li>
161
- <li class=""><strong>Runtime validation</strong> to enforce resources based on actual configuration</li>
162
- </ul>
163
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="key-extension-points">Key extension points<a href="#key-extension-points" class="hash-link" aria-label="Direct link to Key extension points" title="Direct link to Key extension points" translate="no">​</a></h3>
164
- <ul>
165
- <li class=""><strong>Route injection</strong>: Implement <code>injectRoutes()</code> to add custom endpoints using <a class="" href="/appkit/docs/api/appkit/TypeAlias.IAppRouter"><code>IAppRouter</code></a></li>
166
- <li class=""><strong>Lifecycle hooks</strong>: Override <code>setup()</code>, and <code>shutdown()</code> methods</li>
167
- <li class=""><strong>Shared services</strong>:<!-- -->
168
- <ul>
169
- <li class=""><strong>Cache management</strong>: Access the cache service via <code>this.cache</code>. See <a class="" href="/appkit/docs/api/appkit/Interface.CacheConfig"><code>CacheConfig</code></a> for configuration.</li>
170
- <li class=""><strong>Telemetry</strong>: Instrument your plugin with traces and metrics via <code>this.telemetry</code>. See <a class="" href="/appkit/docs/api/appkit/Interface.ITelemetry"><code>ITelemetry</code></a>.</li>
171
- </ul>
172
- </li>
173
- <li class=""><strong>Execution interceptors</strong>: Use <code>execute()</code> and <code>executeStream()</code> with <a class="" href="/appkit/docs/api/appkit/Interface.StreamExecutionSettings"><code>StreamExecutionSettings</code></a></li>
174
- </ul>
175
- <p><strong>Consuming your plugin programmatically</strong></p>
176
- <p>Optionally, you may want to provide a way to consume your plugin programmatically using the AppKit object.
177
- To do that, your plugin needs to implement the <code>exports</code> method, returning an object with the methods you want to expose. From the previous example, the plugin could be consumed as follows:</p>
178
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> AppKit </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> port</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">8000</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">analytics</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">myPlugin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">AppKit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">myPlugin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">myCustomMethod</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
179
- <p>See the <a class="" href="/appkit/docs/api/appkit/Class.Plugin"><code>Plugin</code></a> API reference for complete documentation.</p>
180
- <h2 class="anchor anchorTargetStickyNavbar_scV4" id="caching">Caching<a href="#caching" class="hash-link" aria-label="Direct link to Caching" title="Direct link to Caching" translate="no">​</a></h2>
181
- <p>AppKit provides both global and plugin-level caching capabilities.</p>
182
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="global-cache-configuration">Global cache configuration<a href="#global-cache-configuration" class="hash-link" aria-label="Direct link to Global cache configuration" title="Direct link to Global cache configuration" translate="no">​</a></h3>
183
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">createApp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token function" style="color:rgb(0, 0, 255)">server</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">analytics</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> cache</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> enabled</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> ttl</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">3600</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// seconds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> strictPersistence</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
184
- <p>Storage auto-selects <strong>Lakebase V1 (Provisioned) persistent cache when healthy</strong>, otherwise falls back to in-memory. Support for Lakebase Autoscaling coming soon.</p>
185
- <h3 class="anchor anchorTargetStickyNavbar_scV4" id="plugin-level-caching">Plugin-level caching<a href="#plugin-level-caching" class="hash-link" aria-label="Direct link to Plugin-level caching" title="Direct link to Plugin-level caching" translate="no">​</a></h3>
186
- <p>Inside a Plugin subclass:</p>
187
- <div class="language-ts codeBlockContainer_crgn theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent__42J"><pre tabindex="0" class="prism-code language-ts codeBlock_CnLD thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_sJEA"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">this</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">cache</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">getOrExecute</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;myPlugin&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;data&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> userId</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">expensiveWork</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> userKey</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> ttl</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">300</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre></div></div>
188
21
  <h2 class="anchor anchorTargetStickyNavbar_scV4" id="plugin-phases">Plugin phases<a href="#plugin-phases" class="hash-link" aria-label="Direct link to Plugin phases" title="Direct link to Plugin phases" translate="no">​</a></h2>
189
22
  <p>Plugins initialize in three phases:</p>
190
23
  <ul>
191
24
  <li class=""><strong>Core</strong>: Reserved for framework-level plugins. Initializes first.</li>
192
25
  <li class=""><strong>Normal</strong>: Default phase for application plugins. Initializes after core.</li>
193
26
  <li class=""><strong>Deferred</strong>: Initializes last with access to other plugin instances via <code>config.plugins</code>. Use when your plugin depends on other plugins (e.g., Server Plugin).</li>
194
- </ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_Z6Q_"><a href="https://github.com/databricks/appkit/edit/main/docs/docs/plugins.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_kMm5" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_mnLK"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/appkit/docs/app-management"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">App management</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/appkit/docs/architecture"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Architecture</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_xfIk thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#built-in-plugins" class="table-of-contents__link toc-highlight">Built-in plugins</a><ul><li><a href="#server-plugin" class="table-of-contents__link toc-highlight">Server plugin</a></li><li><a href="#analytics-plugin" class="table-of-contents__link toc-highlight">Analytics plugin</a></li><li><a href="#execution-context-and-asuserreq" class="table-of-contents__link toc-highlight">Execution context and <code>asUser(req)</code></a></li></ul></li><li><a href="#using-plugins" class="table-of-contents__link toc-highlight">Using plugins</a></li><li><a href="#plugin-management" class="table-of-contents__link toc-highlight">Plugin management</a><ul><li><a href="#create-a-plugin" class="table-of-contents__link toc-highlight">Create a plugin</a></li><li><a href="#sync-plugin-manifests" class="table-of-contents__link toc-highlight">Sync plugin manifests</a></li><li><a href="#validate-manifests" class="table-of-contents__link toc-highlight">Validate manifests</a></li><li><a href="#list-plugins" class="table-of-contents__link toc-highlight">List plugins</a></li><li><a href="#add-a-resource-to-a-plugin" class="table-of-contents__link toc-highlight">Add a resource to a plugin</a></li></ul></li><li><a href="#creating-custom-plugins" class="table-of-contents__link toc-highlight">Creating custom plugins</a><ul><li><a href="#basic-plugin-example" class="table-of-contents__link toc-highlight">Basic plugin example</a></li><li><a href="#config-dependent-resources" class="table-of-contents__link toc-highlight">Config-dependent resources</a></li><li><a href="#key-extension-points" class="table-of-contents__link toc-highlight">Key extension points</a></li></ul></li><li><a href="#caching" class="table-of-contents__link toc-highlight">Caching</a><ul><li><a href="#global-cache-configuration" class="table-of-contents__link toc-highlight">Global cache configuration</a></li><li><a href="#plugin-level-caching" class="table-of-contents__link toc-highlight">Plugin-level caching</a></li></ul></li><li><a href="#plugin-phases" class="table-of-contents__link toc-highlight">Plugin phases</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/appkit/docs/">Getting started</a></li><li class="footer__item"><a class="footer__link-item" href="/appkit/docs/api/">API reference</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/appkit/contributing">Contributing</a></li><li class="footer__item"><a href="https://github.com/databricks/appkit" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://docs.databricks.com/aws/en/dev-tools/databricks-apps/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Databricks Apps docs<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/databricks/cli" target="_blank" rel="noopener noreferrer" class="footer__link-item">Databricks CLI<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Databricks, Inc.</div></div></div></footer></div>
27
+ </ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_Z6Q_"><a href="https://github.com/databricks/appkit/edit/main/docs/docs/plugins/index.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_kMm5" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_mnLK"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/appkit/docs/app-management"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">App management</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/appkit/docs/plugins/server"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Server plugin</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_xfIk thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#using-plugins" class="table-of-contents__link toc-highlight">Using plugins</a></li><li><a href="#plugin-phases" class="table-of-contents__link toc-highlight">Plugin phases</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/appkit/docs/">Getting started</a></li><li class="footer__item"><a class="footer__link-item" href="/appkit/docs/api/">API reference</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/appkit/contributing">Contributing</a></li><li class="footer__item"><a href="https://github.com/databricks/appkit" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://docs.databricks.com/aws/en/dev-tools/databricks-apps/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Databricks Apps docs<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/databricks/cli" target="_blank" rel="noopener noreferrer" class="footer__link-item">Databricks CLI<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_miaU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Databricks, Inc.</div></div></div></footer></div>
195
28
  </body>
196
29
  </html>