GGitHubRelease 12.5.0 (#28336)
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
Add AI Chat sidebar ✨ (#26259) * Install vue split panel * Recreate private-view * Persist size * Setup headerbar * Add collapse expand * Add resize handle * Remove tw cruft * Hack in right sidebar * Fix right sidebar expand/collapse * Fix content spacing * Tweak scrolling containers, fix header shadow * Remove margins * Make nav responsive * Nav toggles, remove latency * Finish basic responsiveness * Bry/split panel tiny twak (#25967) * really missed the e in that branch name * all the small thi..buttons --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * Style expand button * Tweak sizing of icons * Reduce search input sizing * Remove margin from children * Tweak header bar layout * Remove page icons * Tweak responsive breakpoints * Add support for icons * Tweak spacing * they're back but as props this time (#25987) * Fix z-index * Header Bar to V Drawer Header Bar (#25988) * they're back but as props this time * rename to v-drawer header * refactor to match private-view-header-bar pattern * remove small header and header shadow props on private view * Drop small prop from v-drawer-header * Remove primary action item --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * Added `directus_comments` and `directus_extensions` to websocket subscriptions (#25464) * utilize system data for registering system module subscriptions * add changeset * update changeset wording --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> Co-authored-by: Nitwel <mail@nitwel.de> * Speed up dialogs a bit * Add top padding in collections * Re-add support for custom header border * Slow down tooltips * Responsiveness for header bar * Recreate lockfile * Add changeset * Run formatter * Fix linter warnings * Add encryption support to special flags (#26096) * Warn on secret values shorter than 32 bytes * Warn on byte instead of string length * Add encrypt/decrypt logic * Add encrypt special flag support * Rework encryption to use version envelope * Format * Pass accountability to payload service * Return decrypted value to system calls * Fix tampered test * Add basic AI settings (#26097) * Add ai settings * Run formatter * Add heading and notice * Feat/refactor mcp (#26098) * Refactor MCP into AI folder * Run formatter * Format translation * Add dirname definitions * Add ai/chat endpoint (#26104) * Setup AI SDK endpoint * Add tests * Fix test quirks * Implement tool support in chat endpoint (#26116) * Add ai chat tool usage * Gen in some tests * Add json schema validation * Update api/src/ai/chat/utils/chat-request-tool-to-ai-sdk-tool.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor DRY --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Regen pnpmlock * Update changeset to include themes pkg * Feat/ai system prompt (#26124) * Add system prompt setting * Load middleware setting * Add translatoins * Allow passing systemprompt to createuimessages * Pass system prompt from ai settings * AI -> Add base layer AI UI components (#26115) * components * add ai sidebar to item route * rough in ai model selector * rough - ai-input * mock message * add reka-ui * move to ai folder * ai sdk vue * model selector refactor * shrink padding * quick cleanup * shorten model list * install rest of ai sdk * ai message parts * refactor text area * ai store * update sidebar * fix deps mismatch * delete step * update models to long form (again) * refactor to pinia store * remove tools stuff for now * add openai reasoning detailed * Update app/src/ai/components/ai-sidebar-detail.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix whitespace * fix em up * make max width 600 px * fix sidebar scroll * fix packages * fix reka-ui * cleanup message list * cleanup message * cleanup margins and unused css vars * start reasoning open and then close when done * refactor message list animation * add reasoning translations * refactor out scss * remove progress bar * model selector * ai sidebar detail * fix styling of message text * refactor out variants in favor of simple role basis * fix extra space * remove unneeded variant * refactor side prop * replace spread with backwards loop * fixes 1 * Move reka to devDependencies * Logical properties * Run stylelint * convert to rem * back to pickles * Clean up multi-line tracking * Use transition variables * Use lodash throttle * Use v-bind for css var * Use $t instead of usei18n * computed * textarea magic * Only show models from configured providers * message tool translation * Use transition vars * Use vars for transition * fix dupe * remove opacity * refactor reasonign * add back empty tools array * Refactor AI model selector dropdown to use transitions instead of keyframe animations (#26122) * Initial plan * Refactor dropdown animation to use transitions instead of keyframes Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> * Update app/src/ai/components/ai-model-selector.vue * Update app/src/ai/components/ai-model-selector.vue --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * fix animation * refactor model selector to use vmenu * New Crowdin updates (#25908) * New translations en-us.yaml (Russian) * New translations en-us.yaml (Russian) * New translations en-us.yaml (Czech) * New translations en-us.yaml (Russian) * New translations en-us.yaml (Arabic) * New translations en-us.yaml (Lithuanian) * New translations en-us.yaml (Portuguese) * New translations en-us.yaml (Albanian) * Update source file en-US.yaml * New translations en-us.yaml (Persian) * New translations en-us.yaml (Persian) * New translations en-us.yaml (Korean) * New translations en-us.yaml (Turkish) * New translations en-us.yaml (French) * New translations en-us.yaml (Turkish) * New translations en-us.yaml (Turkish) * New translations en-us.yaml (French) * New translations en-us.yaml (French, Canada) * Update source file en-US.yaml * New translations en-us.yaml (Korean) * Update source file en-US.yaml * New translations en-us.yaml (Persian) * New translations en-us.yaml (Persian) * New translations en-us.yaml (Persian) * Update source file en-US.yaml * New translations en-us.yaml (Russian) * New translations en-us.yaml (Czech) * New translations en-us.yaml (Romanian) * New translations en-us.yaml (French) * New translations en-us.yaml (Spanish) * New translations en-us.yaml (Arabic) * New translations en-us.yaml (Bulgarian) * New translations en-us.yaml (Catalan) * New translations en-us.yaml (Danish) * New translations en-us.yaml (German) * New translations en-us.yaml (Greek) * New translations en-us.yaml (Finnish) * New translations en-us.yaml (Hebrew) * New translations en-us.yaml (Hungarian) * New translations en-us.yaml (Italian) * New translations en-us.yaml (Japanese) * New translations en-us.yaml (Georgian) * New translations en-us.yaml (Korean) * New translations en-us.yaml (Lithuanian) * New translations en-us.yaml (Mongolian) * New translations en-us.yaml (Dutch) * New translations en-us.yaml (Polish) * New translations en-us.yaml (Portuguese) * New translations en-us.yaml (Slovak) * New translations en-us.yaml (Slovenian) * New translations en-us.yaml (Albanian) * New translations en-us.yaml (Swedish) * New translations en-us.yaml (Turkish) * New translations en-us.yaml (Ukrainian) * New translations en-us.yaml (Chinese Simplified) * New translations en-us.yaml (Chinese Traditional) * New translations en-us.yaml (Vietnamese) * New translations en-us.yaml (Icelandic) * New translations en-us.yaml (Portuguese, Brazilian) * New translations en-us.yaml (Indonesian) * New translations en-us.yaml (Persian) * New translations en-us.yaml (Spanish, Chile) * New translations en-us.yaml (Spanish, Mexico) * New translations en-us.yaml (Marathi) * New translations en-us.yaml (Thai) * New translations en-us.yaml (Croatian) * New translations en-us.yaml (Estonian) * New translations en-us.yaml (Azerbaijani) * New translations en-us.yaml (English, Canada) * New translations en-us.yaml (English, United Kingdom) * New translations en-us.yaml (French, Canada) * New translations en-us.yaml (Esperanto) * New translations en-us.yaml (Bosnian) * New translations en-us.yaml (Nepali) * New translations en-us.yaml (Kurmanji (Kurdish)) * New translations en-us.yaml (Sorani (Kurdish)) * New translations en-us.yaml (Spanish, Latin America) * Update source file en-US.yaml * New translations en-us.yaml (Persian) * New translations en-us.yaml (Russian) * New translations en-us.yaml (Czech) * New translations en-us.yaml (Romanian) * New translations en-us.yaml (French) * New translations en-us.yaml (Spanish) * New translations en-us.yaml (Afrikaans) * New translations en-us.yaml (Arabic) * New translations en-us.yaml (Bulgarian) * New translations en-us.yaml (Catalan) * New translations en-us.yaml (Danish) * New translations en-us.yaml (German) * New translations en-us.yaml (Greek) * New translations en-us.yaml (Finnish) * New translations en-us.yaml (Hebrew) * New translations en-us.yaml (Hungarian) * New translations en-us.yaml (Italian) * New translations en-us.yaml (Japanese) * New translations en-us.yaml (Georgian) * New translations en-us.yaml (Korean) * New translations en-us.yaml (Lithuanian) * New translations en-us.yaml (Mongolian) * New translations en-us.yaml (Dutch) * New translations en-us.yaml (Norwegian) * New translations en-us.yaml (Polish) * New translations en-us.yaml (Portuguese) * New translations en-us.yaml (Slovak) * New translations en-us.yaml (Slovenian) * New translations en-us.yaml (Albanian) * New translations en-us.yaml (Serbian (Cyrillic)) * New translations en-us.yaml (Swedish) * New translations en-us.yaml (Turkish) * New translations en-us.yaml (Ukrainian) * New translations en-us.yaml (Chinese Simplified) * New translations en-us.yaml (Chinese Traditional) * New translations en-us.yaml (Vietnamese) * New translations en-us.yaml (Icelandic) * New translations en-us.yaml (Portuguese, Brazilian) * New translations en-us.yaml (Indonesian) * New translations en-us.yaml (Persian) * New translations en-us.yaml (Spanish, Chile) * New translations en-us.yaml (Spanish, Mexico) * New translations en-us.yaml (Marathi) * New translations en-us.yaml (Thai) * New translations en-us.yaml (Croatian) * New translations en-us.yaml (Estonian) * New translations en-us.yaml (Malay) * New translations en-us.yaml (English, Canada) * New translations en-us.yaml (English, United Kingdom) * New translations en-us.yaml (French, Canada) * New translations en-us.yaml (Esperanto) * New translations en-us.yaml (Breton) * New translations en-us.yaml (Bosnian) * New translations en-us.yaml (Serbian (Latin)) * New translations en-us.yaml (Nepali) * New translations en-us.yaml (Kurmanji (Kurdish)) * New translations en-us.yaml (Sorani (Kurdish)) * New translations en-us.yaml (Spanish, Latin America) * Update source file en-US.yaml * Fix broken tests --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Release 11.13.0 (#26114) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update changeset to include themes pkg * refactor message list scrolling * Rerender based on parts hash * Remove unused imports * Allow more models * cleanup tool markup * cleanup more * fix resizing * Remove unused import * Apply suggestion from @rijkvanzanten --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: ian <licitdev@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Delete .github/CODEOWNERS * Fix layout display dependant on item count request (#26045) * Fix itemCount dep for item display * add changeset * Update app/src/layouts/cards/cards.vue Co-authored-by: Alex Gaillard <alex@directus.io> * Update app/src/layouts/tabular/tabular.vue Co-authored-by: Alex Gaillard <alex@directus.io> * add pagination skeleton loader * only display skeleton if items are at least page limit * Prefer 3 skeletons over 1 * fix skeleton loader tests --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Add loading indicator when saving setup forms (#26130) * Add loading indicator when saving * Rename instance to project for consistency * Add loading indicator when launching * Rename remaining instances * Add changeset * Remove invalid label * Remove accepted terms (#26135) * Remove accepted_terms * Add changeset --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Add Error Handling (#26138) * error handling * retry vs regenerate * Update app/src/ai/components/ai-conversation.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/ai/components/ai-conversation.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add `defineTool` composable (#26140) * Don't send system prompt if it's empty * Remove unnecessary functions * Support dynamic tool registratoin * Create defineTool composable * Define form tools * Add tests * Update app/src/components/v-form/v-form.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/components/v-form/composables/use-input-schema.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/components/v-form/v-form.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add reset button (#26141) * Tweak sidebar min size * Move model selector out of chat input * Tweak spacing * Make it less button-y * Reduce hackiness * Add reset method * Add section subheader * Use reset * Reduce sidebar detail padding * Move ctx to bottom start * AI -> Reasoning message cleanup (#26145) * cleanup reasoning * fix fontsize * Only show reasoning summary once exists --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * AI -> Improve rendering of messages (#26144) * cleanup message structure * fix mounting / unmount using id instead of hash * Tweak loading state * Tweak delays * Remove needless hash --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * AI -> Add logos for model selector (#26142) * add logos to model selector * refactor * Update app/src/ai/components/logos/anthropic.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/ai/components/logos/openai.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * final answer * swap claude logo * Render divider in selector --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * Tweak spacing * AI -> Submit and Stop Button (#26150) * wip * refactor * handle reasoning errors on stop * hide messages without text * still show reasoning if streaming but no text * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Redo the sidebar (#26149) * [WIP] Remove info sidebar detail * [WIP] Style new accordion * Render ai sidebar detail at bottom * Add expand animation * Sidebar collapse/expand * Various tweaks and fixes * Fix transition states * Fix active state on navigate * Update app/src/modules/files/components/file-info-sidebar-detail.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * AI -> Submit and Stop Button (#26150) * wip * refactor * handle reasoning errors on stop * hide messages without text * still show reasoning if streaming but no text * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Re-add support for badge, fix other comments * Fix z-indexing * Persist ai chat active state * Move aiChat active state to ai store * Remove notes * Remove bak * fix revisions overflow * Resolve comment * Bump +1 boop * Add units to rotate 0 * Remove unused placement prop --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com> * Fix font size of layout options * Hack in empty state (#26151) * Add support for local tool display names * Fix server tools not being called * Add tooltip * Fix absolute positioned elements in scrolling container * AI -> Cleanup Tool Messages (#26163) * cleanup tool message part * match text message padding * drop content to 280px * Fix horizontal overflw * Update app/src/components/v-drawer.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/views/private/components/sidebar-detail.vue Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com> * Update app/src/components/v-drawer.vue Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com> * Remove old file * Update app/src/components/v-drawer.vue Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com> * Re-add activity link * Use hyphens for template ref * No small * Remove unused class * Only show sections when sidebar open * Only show notifications preview when bar is expanded * Expand sidebar on activity click * Please formatter, forgive my sins * Fix duplicate attributes * AI -> Chat Flow Improvements (#26185) * store chat open in local storage for refreshes * fix autoscrolling * move input to store and fix submission with enter * add meta j keyboard shortcut to open close ai chat * measure no longer needed * Fix button jumping on scroll * Replace watcher with event hook * Capture shortcut globally, add tooltip --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * fix items prompt for ai tools (#26183) * Tweak scrolling behavior (#26211) * AI -> Fix failed tool calls (#26179) * add helper to ensure input in failed tool calls * use helper -- don't validate the tools themselves * fix reasoning message issues * add test suite * update chat controller tests * thanks copilot * Fix merge conflict whoopsies (#26214) * AI → Limit context usage (#26202) * Use : instead of / for model ids * Refactor to use full model definition * Calculate usage * Remove pro * Show context usage progress indicator * Remove unused package * Don't show context usage * Limit messages we're sending * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Remove unused comment * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix schemas for dates --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: bryantgillespie <hey@bryantgillespie.com> * AI -> Message Styling (#26198) * store chat open in local storage for refreshes * fix autoscrolling * move input to store and fix submission with enter * add meta j keyboard shortcut to open close ai chat * measure no longer needed * increase message gap * cleanup message tool styling * fix padding and scrollbar on chat * refactor ai-message component to improve structure and styling; updated gap variable and added role prop to AiMessageText * message styling * add css animation on hover when not expanded * fix height transition * fix trailing space * add todo list focus * fix border radius for user messages * fix duped * remove unneeded watch * fix import order * animate text and icons only * Update app/src/ai/components/parts/ai-message-tool.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Tweak spacing for loading indicator * Resolve translation comment * Magic is magic * Enough magic * Remove unused stuff * Resolve hardcoded reused msg height * Run formatter --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * Re-add notifications * AI -> Persist session using local storage (#26199) * persist current session * Use sessionstorage instead --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * Run formatter * Tie AI access to app access (#26251) * Allow divider to overlap sticky headings in main (#26252) * Some Fixes for Split Panel (#26254) * use container queries for form * wip * back to percent * unwrap preview * fix type * unneeded setter * remove unneded function * cleaner compueted * its either 100 or 0 * Add changeset * Run formatter * Fix stylelint warning * Fix API typing of sanitizeQuery * AI → Refresh stores on system tool calls (#26253) * Refresh schema on system tool calls * Refactor relations store to setup * Add item refresh to all layouts * Add item refresh on detail view * Refresh fields on collection changes * AI → Re-enable notifications (#26250) * Render notifications outside of sidebar * Use absolute in split container * Fix animation * Render link to activity in notifications drawer * Add AI Chat sidebar ✨ (#26261) * Initial plan * Refactor test to use typed mockNext instead of inline vi.fn() for RequestHandler calls Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> * Happy now? * Resolve test issue * Make sure left/right panel close icons RTL * Resolve test issues * AI → Add soft-default for system prompt (#26268) * Add soft-default for system prompt * Update test to account for default value * update system prompt --------- Co-authored-by: bryantgillespie <hey@bryantgillespie.com> Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com> * AI -> Tool Approval Functionality (#26265) * Refactor to tool card for approvals and web search tool (later) * update to ai sdk beta for tool approvals * add settings menu * adust padding for settings menu * update store * add approvals to chat request * stronger types * update controller * update send automatically when * run formatter * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/ai/stores/use-ai.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * remove assets from translations for now * refactor approval options * tool card disabled * add icons to map as well * remove casting * fix double scroll bar * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix typing of stream call * Add enter key for translate shortcut * Translate keyboard shortcuts * Remove keyboard shortcuts * Use css vars * Use translated tool names --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * AI -> Hide when No Providers / Not Configured (#26269) * add beta * move header * add no provider empty states * translations --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * Nudge nudge * I'm sorry. * Update .changeset/small-doodles-join.md Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/settings/routes/flows/components/logs-sidebar-detail.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-resize-handle.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/components/layout-sidebar-detail.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/components/sidebar-detail.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/settings/routes/marketplace/routes/registry/registry.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/settings/routes/system-logs/logs.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/settings/routes/system-logs/logs.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/interfaces/_system/system-owner/system-owner.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/components/skip-menu.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-main.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/components/v-form/composables/use-input-schema.ts Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/components/v-form/composables/use-input-schema.ts Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/ai/components/parts/ai-message-text.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/visual/components/editing-layer.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/visual/components/editing-layer.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/components/v-drawer-header.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/components/v-drawer-header.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-main.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-header-bar.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/components/notifications-drawer.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/content/routes/item.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * search input: match header button height and refine styles with CSS variables (#26308) * add BREAKPOINTS constant and update private-view-root.vue to demonstrate example usage (#26310) * AI → Resolve review comments (#26290) * Add a smidge of padding * Add a pinch of flex * Stir in the drawing spacing * Re-add missing drawer close on mobile * Fix z-index of header bar * Tweak stacking order of search input * Resolve shadow showing up on nav on mobile * Only show tooltip when sidebar is closed * Drop shortcut * Nudge cancel button size and positioning * Make drawer buttons smaller * Fix input height in sidebar * Drop unused dependency * Change translation key * Add in type label tweaks * Tweak drawer title styling * Stick header bar at 0 * Tweak skeleton loader * Allow inline size to shrink * Fix missing import * Don't inherit attrs on private view * Collapse right sidebar when making window small * fix appearance * Tweak sizing of right rail * Don't deactivate on unmount * Fix right sidebar alignment * sidebar is closed and you try to open it by resizing while the preview split-panel is open * Re-add non-editable * Tweak revision styling * 💅 f l o r i a n * Refactor v-form ai usage to composable * Tweak spacing * Update import * Rename description to llmDescription * Use prop shorthands * Don't use flow sidebar detail in translations * Don't use unused prop * Move vars to top * Add comment * Remove unused ref * Drop navbar/sidebar from app store * Revert version menu * button type * Remove fullscreen * Use private view header bar actions * Fix custom icons not scaling * Remove unused css * Use class instead of id Don't you forget about the ˚₊‧꒰ა best practices ໒꒱ ‧₊˚ * Update input-hash component to conditionally set input type and autocomplete attributes based on masked state * revert fields user change * remove todos * Update app/src/components/v-drawer-header.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Pass direction to split panel * Update split panel * Revert "Rename description to llmDescription" This reverts commit 162a6d5fdc34f712d2ae8314bdf7a8511b317bc7. * Solve name confusion with just comments * Update app/src/components/v-form/composables/use-ai-tools.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/components/v-drawer-header.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Run formatter/linter --------- Co-authored-by: bryantgillespie <hey@bryantgillespie.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * AI ← Spacing & responsive refinements (#26309) * introduce --form-column-min-width var * move container-type: inline-size to the form-grid mixin * set inline-size container query to 556px * adjust sidebar content padding to match sidebar toggle buttons * refine the project name padding so it optically matches the contents of the navigation bar * set --content-padding and --content-padding-bottom vars globally * refine spacing of item form * add top padding to content components * remove top margin in favor of added top padding * Tweak spacing a bit more --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> * Prettier doesn't agree sadly * Add changeset for stores package * Update app/src/modules/content/routes/item.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/ai/components/ai-sidebar-detail.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/content/routes/item.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Remove unused file * Icon sizes * Align drawer header with other header * Fix descender overflow * Re-add tooltip * AI ← Drawer & Header (#26317) * add Esc hint to cancel tooltip for consistency with the cancel button outside the drawer * adjust alignment of drawer cancel button to match header bar icons * prevent extra padding-right of forms in the drawer * ensure that title styles are applied to the drawer header * prevent the title text from being cut off in the header bar and the drawer header * Update app/src/views/private/private-view/components/private-view-header-bar.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-main.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-main.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-main.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/views/private/private-view/components/private-view-main.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/content/routes/item.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/content/routes/item.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/modules/content/routes/item.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * fix private view main * update docs link and system prompt help text * formatter * fix stylelint comments * AI -> Add Back Scroll Shadows but Better (#26313) * add scroll shadows to scroll container in private view * Update app/src/styles/themes/_dark.scss Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/views/private/private-view/components/private-view.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * set to false instead of undefined --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/src/modules/content/routes/item.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * render only split panel * Fix calendar/map view * fix header border mismatch for color match theme * Fix button size in field detail * Fix more drawer button sizes * borders are back * Fix map / calendar not resizing on sidebar size change * Run formatter * fix layout bottom * fix calendar * fizx tests * update test snapshot * use internal BREAKPOINTS const and remove redundant use of useBreakpoints (#26329) * fix form type imports * Update app/src/views/private/private-view/components/private-view-header-bar.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Update app/src/components/v-drawer-header.vue Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * enforce map view shadows and fix initialization issue * remove unused line * fix border for color match themne * Tweak default * Revert input-hash changes, use new autocomplete prop * oops missed the import * AI ← Live Preview (#26330) * prevent iframe from loading when live preview is not active * add default live preview size as snap point so that we can easily resize to the default size * ensure that the live preview panel border only appears when not displayed at full width (mobile) * Run formatter * Add changeset * fix search input for mobile (#26331) * prevent submissions when pending tool call * AI ← Improve input focusing (#26334) * Focus on textarea when clicking within ai-input * Use text cursor * Fix cursor when disabled * fix max-width issue of search input on mobile (#26339) * AI ← A11y adjustments for Skip Menu and headline elements (#26337) * refactor SkipMenu usage so it appears next to its section * refactor SkipMenu keys to match section ID naming * ensure that sections accessed via the skip menu expand properly if they are collapsed * adjust the SkipMenu min-width to match the sidebar min-width * update tests * fix focus styles for headline elements * adjust positioning for mobile skip menu inside module navigation * add dynamic id binding to module navigation content for improved accessibility * Update app/src/views/private/components/skip-menu.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix line-height in type-title mixin (#26341) * AI <- Hot Last Minute Quick Fixes (#26332) * close inline nav on route change * fix activator warnings * Update app/src/views/private/private-view/stores/nav-bar.ts Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * pull in sidebar store --------- Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * AI Chat <- Clears Messages and Settings on Sign Out (#26342) * clear messages and settings on signout * Add test coverage for AI store dehydrate function (#26343) * Initial plan * Add test coverage for dehydrate function in AI store Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> * Update .changeset/short-lamps-hunt.md Co-authored-by: Florian C. Wachmann <dev@formfcw.com> * Add AI Telemetry (#26347) * Add AI-related fields to telemetry * Include AI-related fields in tests * Use AI suggestion --------- Co-authored-by: Bryant Gillespie <bryant@hireclockwork.com> Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: rijkvanzanten <9141017+rijkvanzanten@users.noreply.github.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: ian <licitdev@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Gerard Lamusse <gerardlamo@gmail.com> Co-authored-by: bryantgillespie <hey@bryantgillespie.com> Co-authored-by: Florian C. Wachmann <dev@formfcw.com> Co-authored-by: Connor Winston <connor@winston.guru> | 9 个月前 | |
Add licensing (#27417) * tests(mls): improve util typing * tests(mls): add new entry point * tests(mls): return back added license * improve license server * fix(cli): do not initialize license in bootstrap * refactor(manager): do not allow undefined entitlements * tests(mls): fix initialize tests * tests(mls): improve rest tests * fix(license): error on attempt to active with active key * fix cache refresh * clean logs * update test * add final rest test * add horrizontal tests * fix(manager): update has keys swapped * tests(mls): add initialization case B * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * fix transaction for creating first admin user in sqlite * include knex everywhere * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * improve pendingResolution * fix for ma best fiend juda * Fix preview endpoint missing name * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * cleanup * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * add missing set source for db data * enforce port for api * refactor initialize test structure * more port fixes * more cleanup * fix(get-license-*): incorrect source if not found * refactor(sandbox): utilize promise resolver fix(sandbox): early error on api close * update rest tests * fix(preview): pull non prod flag from entitlements * fix(mls): bring up to spec on preview * Update api/src/license/entitlements/lib/seats.ts * fix(license): use constant for inactive license exceeded status * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * refactor(licensing): remove deprecated getLicense imports * fix(license manager): entitlements out of sync with state change * tests(mls): add shared functions * add lifecycle tests * Refactor sdk error to use class over object (#27135) * fixed error handling in sdk * Update thick-readers-cheer.md * rework error and move to dedicated file --------- Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> * fix process killing in sandbox * complete rest resolve tests * License frontend parent branch (#27395) * feat: add licit jwt mock * fix: concurrency lock * refactor: add types and update usage * feat: add lazy addons hydration to license store * fix: re-apply concurrency lock fix on license manager * License management settings page (#27368) * feat: add license API types and route mocks * fix: remove cache * feat: add sdk part * refactor: update types according to notion feebacks * feat: add front-end foundation * feat: add scenario / error mock param from sdk * wip licensing settings * deactivate modal confirm * fix * fix: align license page with new entitlements format and store API * split license section * extract format time frame in its own util * feat: implement customLLM screen * Apply suggestion from @gaetansenn * refactor: update settings and store --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add license gating UI on Custom LLM settings (#27379) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * fix: use override before default * Add license gating on access policies custom rules (#27390) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * feat: add license gating on access policies custom rules * Revert "feat: implement customLLM screen" This reverts commit fa5c49fc8358bfae1e266895a7724df8cac01796. * fix: conflict * feat: skip license store hydration for non-admin users * Add revision and activity history license notice (#27399) * feat: add revision and activity history license notice * refactor: simplify formatTimeframe to use days only * fix: revision order license * fix: activity feed licesne margin * License mock (#27392) * add basic license mock server * start updating test suite * start working on license activation test * better error reporting * continue testing * continue on tests * remove invalid files * Fix license initialization * first working test 🥳 * rename entitlement setLicense to setEntitlements * cleanup endpoints * add license assertions * cleanup * account for provided key entitlements in pending resolution * add public_url change handling for refresh * account for deactivate state in pendingResolution * various fixes * License entitlement 2 (#27386) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * License entitlement 2_final (#27396) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * fix flows * implement resolvers * no mo try catch * cleanup after entitlement improvements * update license-mock * complete mock server * feat(e2e): add beforeApi hook * test(e2e): surface db connection * tests(e2e): correctly build knex connection * tests(e2e): add g and d cases * fix getschema on clean bootstrap * fix sandbox and e2e tests * update tests * do not restrict preview behind admin * no bypass for manage addons on init * adjust setup completed and license payloads * fix license token column type and unify the 2 migrations * add license and key generation * test(license-mock): rename to mock-license-server * fix sb * update test * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * refactor: use e2e logic * refactor: clean up code * refactor: clean up mocks * License Onboarding flow (#27334) * License onboarding (#27380) * align frontend with API schema and fix setupCompleted derivation --------- Co-authored-by: HZooly <torzuoli.hugo@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * refactor: merge conflicts * Include LICENSE_TOKEN in licenseInEnv check (#27416) * fix: include LICENSE_TOKEN in licenseInEnv check * update project owner banner rule --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * feat: show deactivated collections in data model (#27421) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * improve pendingResolution * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * fix for ma best fiend juda * cleanup * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * enforce port for api * add missing set source for db data * more port fixes * refactor initialize test structure * refactor: revert mock * lint: clean up * feat: add static license keys * Amend how seats are computed against entitlements (#27431) * Amend computation again (#27432) * Amend how seats are computed against entitlements * Fix error * Tighten license onboarding types and gate project owner info (#27433) * Add license limit modal and use for seat and collection gating (#27372) * collection limit modal * tests * share licens guard code via composable * refactor * rework user limit modal to appear on save * rework again based on latest spec * change status to deactivated * simplify save to deactivated status * revert more changes * change back to error code that will be added later * use named route instead of hard-coded path * placeholder for settings page * I lost the vote * refactor: add todo * Revert "refactor: add todo" This reverts commit 4fd3b267165c7f0b6f6f1a7596848e0c790dc329. * Collections remaining component and logic (#27383) * collections remaining component and logic * remove hard coded value used for testing --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * max capacity modal (#27393) * minor fixes * show collectionsRemaining when 10 or less left for team and enterprise * avoid using specific plan types in conditions * cleanup * adapt to api changes plus feedback * cleanup and minor fixes * change alert text color to match figma * Frontend gating for flows (#27430) * frontend gating for flows * change license-limit-modal name to entitlement-limit-modal * Update app/src/views/private/components/license/entitlement-remaining.vue --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Import inactive-license-expired string from constant --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * Merge with license branch * Move entitlement remaining to actions:prepend slot * drop dead onboarding code and fix breadcrumb import * restore owner_complete --------- Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Rob Luton <rob.luton@gmail.com> * rename user inactive exceeded state due to limits * Add AI translation gating (#27444) * feat: add licit jwt mock * fix: concurrency lock * refactor: add types and update usage * feat: add lazy addons hydration to license store * fix: re-apply concurrency lock fix on license manager * License management settings page (#27368) * feat: add license API types and route mocks * fix: remove cache * feat: add sdk part * refactor: update types according to notion feebacks * feat: add front-end foundation * feat: add scenario / error mock param from sdk * wip licensing settings * deactivate modal confirm * fix * fix: align license page with new entitlements format and store API * split license section * extract format time frame in its own util * feat: implement customLLM screen * Apply suggestion from @gaetansenn * refactor: update settings and store --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add license gating UI on Custom LLM settings (#27379) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * fix: use override before default * Add license gating on access policies custom rules (#27390) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * feat: add license gating on access policies custom rules * Revert "feat: implement customLLM screen" This reverts commit fa5c49fc8358bfae1e266895a7724df8cac01796. * fix: conflict * feat: skip license store hydration for non-admin users * Add revision and activity history license notice (#27399) * feat: add revision and activity history license notice * refactor: simplify formatTimeframe to use days only * fix: revision order license * fix: activity feed licesne margin * License mock (#27392) * add basic license mock server * start updating test suite * start working on license activation test * better error reporting * continue testing * continue on tests * remove invalid files * Fix license initialization * first working test 🥳 * rename entitlement setLicense to setEntitlements * cleanup endpoints * add license assertions * cleanup * account for provided key entitlements in pending resolution * add public_url change handling for refresh * account for deactivate state in pendingResolution * various fixes * License entitlement 2 (#27386) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * License entitlement 2_final (#27396) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * fix flows * implement resolvers * no mo try catch * cleanup after entitlement improvements * update license-mock * complete mock server * feat(e2e): add beforeApi hook * test(e2e): surface db connection * tests(e2e): correctly build knex connection * tests(e2e): add g and d cases * fix getschema on clean bootstrap * fix sandbox and e2e tests * update tests * do not restrict preview behind admin * no bypass for manage addons on init * adjust setup completed and license payloads * fix license token column type and unify the 2 migrations * add license and key generation * test(license-mock): rename to mock-license-server * fix sb * update test * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * refactor: use e2e logic * refactor: clean up code * refactor: clean up mocks * License Onboarding flow (#27334) * License onboarding (#27380) * align frontend with API schema and fix setupCompleted derivation --------- Co-authored-by: HZooly <torzuoli.hugo@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * refactor: merge conflicts * Include LICENSE_TOKEN in licenseInEnv check (#27416) * fix: include LICENSE_TOKEN in licenseInEnv check * update project owner banner rule --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * feat: show deactivated collections in data model (#27421) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * improve pendingResolution * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * fix for ma best fiend juda * cleanup * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * enforce port for api * add missing set source for db data * more port fixes * refactor initialize test structure * refactor: revert mock * lint: clean up * feat: add static license keys * Amend how seats are computed against entitlements (#27431) * Amend computation again (#27432) * Amend how seats are computed against entitlements * Fix error * Tighten license onboarding types and gate project owner info (#27433) * Add license limit modal and use for seat and collection gating (#27372) * collection limit modal * tests * share licens guard code via composable * refactor * rework user limit modal to appear on save * rework again based on latest spec * change status to deactivated * simplify save to deactivated status * revert more changes * change back to error code that will be added later * use named route instead of hard-coded path * placeholder for settings page * I lost the vote * refactor: add todo * Revert "refactor: add todo" This reverts commit 4fd3b267165c7f0b6f6f1a7596848e0c790dc329. * Collections remaining component and logic (#27383) * collections remaining component and logic * remove hard coded value used for testing --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * max capacity modal (#27393) * minor fixes * show collectionsRemaining when 10 or less left for team and enterprise * avoid using specific plan types in conditions * cleanup * adapt to api changes plus feedback * cleanup and minor fixes * change alert text color to match figma * Frontend gating for flows (#27430) * frontend gating for flows * change license-limit-modal name to entitlement-limit-modal * Update app/src/views/private/components/license/entitlement-remaining.vue --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Import inactive-license-expired string from constant --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * Merge with license branch * Move entitlement remaining to actions:prepend slot * drop dead onboarding code and fix breadcrumb import * restore owner_complete * Hide translations button on translation interface * Add readonly and notice to AI settings * Add helper function for license store boolean values * Update tests --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Rob Luton <rob.luton@gmail.com> * fix exiting sandbox * fix sandbox logging undefined for admin user&pw * add addons to mock server * Fix license settings (#27448) * remove deprecated breadcrumb * hide add-ons if not available * hide manage license button when no source * Hide danger zone for free tier * do not render infinite date * skip MaxCapacityAlert render when capacity not exceeded * remove breadcrumb import --------- Co-authored-by: Rob Luton <rob.luton@gmail.com> * Basic collection unit and e2e (#27438) * basi collection unit and e2e * Add collection e2e tests * basic flows e2e tests * fix collection leak * fix collection leak * very basic seats testing * fix user deactivation * move initialize to constructor * add downgrade/lock for invalid status * add addon tests * Handle unlimited case, refactor store, fixes due to recent merges (#27446) * use v-chip for styling (#27459) * License key modale (#27418) * handle license key submit * fix license drawer reset and isLicensed signal * wire manage license * fix model value * refactor: route license activate/update through licenseStore --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Update license wording (#27422) * update license wording * remove license notices from setup onboarding * Refresh license info on settings page mount (#27455) * refresh license info on settings page mount * do not fetch addons if not required * refactor: clarify Core tier check in license settings mount --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add public/private license badge (#27452) * Add new system interface to public view * Display badge within private view nav * Replace ::before line with hr * Move from system interface to component * Add test case for v-license-badge * Simplify displayPoweredBy computed * Move wrapper to private-view-nav-footer component * Move translation strings * Add non-production badge * Fix alignments * Replace icon and fix style adjustments * Fix padding issue on public view * Prevent stacked onboarding and project owner modals (#27460) * prevent stacked onboarding and project owner modals * License resolution modal (#27441) * feat: add licit jwt mock * fix: concurrency lock * refactor: add types and update usage * feat: add lazy addons hydration to license store * fix: re-apply concurrency lock fix on license manager * License management settings page (#27368) * feat: add license API types and route mocks * fix: remove cache * feat: add sdk part * refactor: update types according to notion feebacks * feat: add front-end foundation * feat: add scenario / error mock param from sdk * wip licensing settings * deactivate modal confirm * fix * fix: align license page with new entitlements format and store API * split license section * extract format time frame in its own util * feat: implement customLLM screen * Apply suggestion from @gaetansenn * refactor: update settings and store --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add license gating UI on Custom LLM settings (#27379) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * fix: use override before default * Add license gating on access policies custom rules (#27390) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * feat: add license gating on access policies custom rules * Revert "feat: implement customLLM screen" This reverts commit fa5c49fc8358bfae1e266895a7724df8cac01796. * fix: conflict * feat: skip license store hydration for non-admin users * Add revision and activity history license notice (#27399) * feat: add revision and activity history license notice * refactor: simplify formatTimeframe to use days only * fix: revision order license * fix: activity feed licesne margin * License mock (#27392) * add basic license mock server * start updating test suite * start working on license activation test * better error reporting * continue testing * continue on tests * remove invalid files * Fix license initialization * first working test 🥳 * rename entitlement setLicense to setEntitlements * cleanup endpoints * add license assertions * cleanup * account for provided key entitlements in pending resolution * add public_url change handling for refresh * account for deactivate state in pendingResolution * various fixes * License entitlement 2 (#27386) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * License entitlement 2_final (#27396) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * fix flows * implement resolvers * no mo try catch * cleanup after entitlement improvements * update license-mock * complete mock server * feat(e2e): add beforeApi hook * test(e2e): surface db connection * tests(e2e): correctly build knex connection * tests(e2e): add g and d cases * fix getschema on clean bootstrap * fix sandbox and e2e tests * update tests * do not restrict preview behind admin * no bypass for manage addons on init * adjust setup completed and license payloads * fix license token column type and unify the 2 migrations * add license and key generation * test(license-mock): rename to mock-license-server * fix sb * update test * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * refactor: use e2e logic * refactor: clean up code * refactor: clean up mocks * License Onboarding flow (#27334) * License onboarding (#27380) * align frontend with API schema and fix setupCompleted derivation --------- Co-authored-by: HZooly <torzuoli.hugo@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * refactor: merge conflicts * Include LICENSE_TOKEN in licenseInEnv check (#27416) * fix: include LICENSE_TOKEN in licenseInEnv check * update project owner banner rule --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * feat: show deactivated collections in data model (#27421) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * improve pendingResolution * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * fix for ma best fiend juda * cleanup * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * enforce port for api * add missing set source for db data * more port fixes * refactor initialize test structure * refactor: revert mock * lint: clean up * feat: add static license keys * wip resolution modal * Amend how seats are computed against entitlements (#27431) * Amend computation again (#27432) * Amend how seats are computed against entitlements * Fix error * Tighten license onboarding types and gate project owner info (#27433) * Add license limit modal and use for seat and collection gating (#27372) * collection limit modal * tests * share licens guard code via composable * refactor * rework user limit modal to appear on save * rework again based on latest spec * change status to deactivated * simplify save to deactivated status * revert more changes * change back to error code that will be added later * use named route instead of hard-coded path * placeholder for settings page * I lost the vote * refactor: add todo * Revert "refactor: add todo" This reverts commit 4fd3b267165c7f0b6f6f1a7596848e0c790dc329. * Collections remaining component and logic (#27383) * collections remaining component and logic * remove hard coded value used for testing --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * max capacity modal (#27393) * minor fixes * show collectionsRemaining when 10 or less left for team and enterprise * avoid using specific plan types in conditions * cleanup * adapt to api changes plus feedback * cleanup and minor fixes * change alert text color to match figma * Frontend gating for flows (#27430) * frontend gating for flows * change license-limit-modal name to entitlement-limit-modal * Update app/src/views/private/components/license/entitlement-remaining.vue --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Import inactive-license-expired string from constant --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * Merge with license branch * Move entitlement remaining to actions:prepend slot * drop dead onboarding code and fix breadcrumb import * refactor: udpdate store * restore owner_complete * refactor: clean up code * grace-period modal * feat: handle locked license logic * fix: rename collection deactivation and apply locked to app * resolution modal ui * modal footer * refactor: handle no resolution case * refactor: adapt according to severity * refactor: route license activate/update through licenseStore * add missing translation * sync lock allowed list between router an app * make grace warning dismiss work, clear on grace exit --------- Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Rob Luton <rob.luton@gmail.com> * License upgrade buttons (#27457) * handle license key submit * fix license drawer reset and isLicensed signal * wire manage license * fix model value * upgrade plan button link * wire upgrade plan button * refactor: simplify upgrade buttons block in license settings --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Surface entitlement limit modal on collection create errors (#27463) * feat: surface entitlement limit modal on collection create errors * refactor: use extractErrorCode for limit detection * Update license header badge (#27458) * update license header badge * feat: map license status to badge label and color * Revert "feat: map license status to badge label and color" This reverts commit 7b6ebd3779b82bfae10eac637f11d8b11f472ce8. --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Rob Luton <rob.luton@gmail.com> * blocked login should be resource restricted error * Show project locked warning for non-admin logins (#27466) * Fix flows max-capacity padding (#27467) * fix license server connection * Handle unlimited case and cleanup (#27468) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * fix(addons): add `unit_price` & `billing_interval` to response * fix license store reactivity issues (#27483) * hydrate license store during crud events * hydrate on collections batch delete * hydrate when seat count affected * remove unnecessary awaits when hydrating license store * handle collection-options case * remove redundant hydration call * show format-specific error for malformed license keys (#27480) * update license link utm params (#27485) * disable license management when key is set via env var (#27482) * use non production label instead of staging (#27489) * add password mistach warning (#27488) * License entitlements cache (#27484) * first run caching * add spork function * renamed clear cache func * clean up some AI code * Add missing entitlement check * fix entitlement mistakes * fix infinite loop and add assert removing logic * extra users seat checks * remove early exit * Split admins from users in seats resolution (#27477) * split admins from users in seats resolution * up * checkbox clickable * up * show password mismatch as inline field error (#27492) * show flow names in resolution dialog and submit proper IDs (#27491) * feat(licensing): support core license entitlement fork CMS-2401 * feat(licensing): add `scheduled_quantity` to addon output * Hide license badge on media width (#27494) * Hide license badge on media width * Use mixin * license settings responsive (#27506) * fix CMS-2410 * surface locked resources via resource restriction (#27495) * License Entitlements (#27502) * support invert value on entitlement display * ai translation entitlement * refactor entitlement into computed --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * hide SSO providers on signin when sso disabled (#27496) * add caching to core grace period query (#27497) * Amend SSO resolution message (#27510) * feat(license): harden license boot sequence (#27499) * feat(license): harden license boot sequence * prefer fatal for hard exits Co-Authored-By: Brainslug <br41nslug@users.noreply.github.com> --------- Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> * prevent license fields from being manually in settings (#27498) * improve seats enforcement (#27512) * improve seats enforcement * make seats cache refresh instead of clear * Adjust activity license notice margin and hide for unlimited (#27511) * refactor(licensing): consolidate state transitions (#27513) * refactor(licensing): replace getStatus with computeLicenseStatus * refactor(licensing): narrow isLocked to stored status * refactor(licensing): always re-compute status * feat(licensing): add downgrade_reason to license output * refactor(licensing): consolidate state transitions * fix(licensing): source not reliable * refactor(licensing): utilize promise all in license output * Align resolution dialog with new downgrade_reason contract (#27517) * refactor(license): align resolution dialog with new downgrade_reason contract * refactor: remove old i18n * refactor: use downgrade_reason of scope value * feat: unify grace + downgrade resolution prompt * refactor: remove unused needsResolution * Update app/src/lang/translations/en-US.yaml Co-authored-by: Alex Gaillard <alex@directus.io> * fix: type resolution dialog title --------- Co-authored-by: Alex Gaillard <alex@directus.io> * resolve SSO section interactivity and deactivation flow (#27519) * KYC Modal (#27521) * show project owner modal after license modale dismiss * guard nested property access in form * show project owner modal regardless of license source * Collection update incorrectly blocked by collection limit (#27522) * fix collection issue * nit * fix custom_llm flag filtering * fix(license): bypass any non-resolver type FF in checkAll * Addon purchase modals on License settings (#27504) * feat: add addons logic modal * refactor: optimize addon scheduled update * refactor: clean up code * fix: fix i18n wording * refactor: clean up date formater * Amend messaging for upgrade case * Amend no change case * Handle downgrade case * Cleanup * Divide unit price by 100 --------- Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * fix(licensing): custom permission rules should check fields independently * Make private view license reactive (#27527) * Resolution dialog fixes and improvements (#27523) * fix: show grace period modal on license expiry within limits * refactor: revert logic * fix: avoid loading null user * fix: resolution dialog issues and clarity improvements * Change badge from none to hidden (#27530) * Amend non prod badge to use license store (#27531) * Change badge from none to hidden * Amend non prod badge to use license store * Amend badge back to server store (#27533) * fix: deactivated state from collection (#27535) * fix collection update enforcement * Add license expiring warning notices (#27518) * create status-notice components and handle the grace period upgrade case * handle remaining cases * fix logic * cleanup * fix pinned grace text * prevent powered by badge visibility from affecting pinned status visibility * add locked status message * change verbiage to match what will actually happen * minor copy change * fix minor spacing issue * update copy * feedback updates * update get license link (#27537) * fix permissions cache on license change * fix(license): pass down knex for permission entitlements * Fix/modal user status (#27543) * fix: modal resolution card width * fix: update new status value * Resolution modale: LLM, custom rules, and user email (#27526) * fall back to email in seat candidates and reduce the number of displayed fields in drawer * show custom LLM and permission rules in resolution dialog * fix: sso spacing block * feat: refactor sso confirm * fix: email validation + wording --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * fix: refresh addons after license key change (#27542) * fix: refresh addons after license key change * refactor: remove comment * add flows entitlement (#27547) * Add license key modal and pop after login (#27539) * translation keys * license-key-modal * refactor * tests * update links and use utm tags * update oig onboarding link (#27552) * update plan limit message (#27550) * refresh addons after license deactivate (#27551) * restore open animation on user drawer (#27548) * update addons purchase modale text (#27556) * License seats fix (#27557) * remove refreshCache logic * fix stale seats cache counting issue * fix seats e2e test to not rely on cacheBypass * re-activate bus subscription * clear cache centrally * Amend enterprise addon button link (#27572) * Amend enterprise addon button link * Fix some things * refresh license usage after schema mutations affecting collections (#27549) * show only grace login modal when upgrading from v11 to v12 (#27579) * Disable manage license when env managed (#27581) * disable manage license when env managed * refactor isEnvManaged in store * Revert "Disable manage license when env managed (#27581)" (#27584) This reverts commit 721b24e18dc414d2e136b8ebb606b37fe27f8430. * close resolution dialog when managing license in no_resolution scope (#27586) * Fix custom permission rules entitlement key (#27587) * Do not clear sessions on admin credential change (#27588) * fix(license): mirror SSO escape hatch in login middleware (#27582) * fix(license): mirror SSO escape hatch in login middleware * refactor(license): simplify SSO escape hatch to entitled || locked * refactor: simplify * core within grace and within limits should be active * Replace hardcoded `https://directus.io` to `https://directus.com` with new constant (#27585) * create constant for directus.com and replace all instances of https://directus.io with the new constant * changeset * updates * update all package.json files to use the new home page url * update license files * update vue files * update constant * md and yml files * revert changes made to email addresses * Apply suggestion from @AlexGaillard --------- Co-authored-by: Alex Gaillard <alex@directus.io> * clear the caches explicitly on resolution (#27591) * redirect to settings after submit on license-recovery route (#27592) * disable Add License button when env managed (#27593) * Improve test coverage (#27590) * add custom llm coverage * add activity entitlement e2e * always select full activity for test * remove redundant count from activity tests * add revision entitlement e2e * fmt * add db helpers for date parsing * type api client * add custom permission rules e2e * rename createCustomPermission to buildCustomPermission * remove invalid permission assertion * update collection tests * add remaining tests to collections * assert resolve in cpr * update license flow entitlement e2e * improve rest tests * tests(licensing): get the green for rest * Skip hydrateAddons when license source is null (#27600) * skip hydrateAddons when license source is null * clear addons after deactivation * clear correct cache on collection remediation * allow sso during core grace (#27601) * register license check * License design update 1 (#27599) * refactor(app): use InterfacePresentationDivider for license section header Replace the bespoke section header (custom VDivider + VIcon + styled title) in license-section.vue with the shared InterfacePresentationDivider so headings match the rest of the admin app and drop the duplicated layout and typography CSS. Rename the section's variant prop to kind (neutral | danger) to align with the prop naming used elsewhere (VChip etc.) and update the caller in license.vue accordingly. * style(app): polish license module chips, buttons, and spacing Design tweaks across the license module to standardize on built-in component variants and drop ad-hoc CSS overrides. - Switch entitlement and plan-status chips to VChip standard variants (:label="false" plus kind="success" / "primary" / "neutral") and remove the custom .v-chip CSS that hand-styled background, padding, and border radius - Drop the small icon prop in entitlement labels and recolor via a scoped --v-icon-color token instead of a :deep selector - Use the theme border-radius token for the entitlement item background - Add small to addon-item action buttons so they sit better next to the entitlement rows - Apply the type-label mixin to the entitlements section title - Add a .status-chip class with font-weight 600 for the plan status chip - Stretch the env-managed VNotice to full width inside the danger zone * improve responsive design * adjust badge-divider size and add flex-shrink to project name container * add error handling (#27596) * add error handling * improvements * install license package * bump license package to 0.2.0 * only bypass sso if in grace and grace period * back new helper with unit tests * update missing setting fields in sdk * add license info to server info sdk type * update gql server info type * fix(license): expose Core grace deadline via expires_at + grace_period (#27583) * fix(license): expose Core grace deadline via expires_at + grace_period * refactor: clean up lint * refactor: clean up lint * refactor(license): rename to getCoreGraceExpiresAt and consolidate * refactor: return seconds from getCoreGraceExpiresAt and update tests * refactor(license): split getCoreGraceExpiresAt into its own file * Fix rpc sync (#27597) * hide addon pricing_summary when unit_price is null (#27608) * add license package to e2e * attempt bb fix * Fix e2e * fix offline * License design update 2 (#27610) * style: adjust spacing in v-radio-cards and setup components for improved layout * adjust non-production badge * Remove unused center prop from VDivider (#27618) * simplify activity e2e * simplify revision e2e * await registration in e2e * simplify permission rule e2e * simplify cllms e2e * attempt to fix blackbox 1 * remove requirement for requested port to be same as requested * attempt to fix blackbox 2 * show inline email format error on setup form (#27609) * show inline email format error on setup form * up * attempt to fix blackbox 3 * attempt to fix blackbox 4: mess up version tests * attempt to fix blackbox 5 * enable license for global * log actual error * update status messages for core tier expiry date (#27613) * update * update status notice message * simplify * remove hover style so it is consistent with other opened PRs * update keys for mock server * explicit set dev * License design update 3 (#27620) * remove todos * Improve setAddonQuantity error handling * fix(license): hide history timeframe notice when entitlement is -1 (#27623) Co-authored-by: Alex Gaillard <alex@directus.io> * Grace modal wording (#27615) * fix(license): refine Core grace modal wording * fix: use email from variable * refactor: use DIRECTUS_DOMAIN const * Update app/src/views/private/components/license/license-login-modal.vue * Update app/src/lang/translations/en-US.yaml * Update app/src/lang/translations/en-US.yaml --------- Co-authored-by: Alex Gaillard <alex@directus.io> * show AI translations resolution checkbox when losing the entitlement (#27594) * fix: do not hydrate addons when offline (#27624) * fix: update padding and background styles for public view and license badge (#27630) * Change license to MSCL-1.0-GPL (#27627) * Update translations to reflect MSCL 1.0 licensing across multiple languages * Update copilot instructions to reflect MSCL-1.0-GPL * Update license in openapi.yaml * Update license in directus README * Update licenses to MSCL-1.0-GPL across multiple package.json files * Update licenses files * add MIT license file to packages/ai * Update copyright year * Update license to reference the LICENSE file in multiple package.json files * Update licenses to reflect Monospace Sustainable Core License, Version 1.0 across multiple files * add changeset * Remove license update note from readme Removed note about upcoming Directus license update and feedback request. * Revise license details and user categories in readme Updated licensing information and usage terms for Directus. * Update readme.md * Fix pricing link in readme Updated the link for pricing details in the commercial license section. * add breaking change notice * Fix license change notice from BUSL-1.1 to BSL-1.1 * Fix typo in license change notice * Update license information in readme.md Added information about the license change from BSL to MSCL for sustainability. --------- Co-authored-by: David Stockton <7375241+dstockton@users.noreply.github.com> Co-authored-by: James White <jamesw1013@googlemail.com> * e2e fixes * e2e fixes 5 * e2e fix 6, remove dead test * e2e fixes 7: relax property match in initialize * fix e2e 8: bring lifecycle checks inline * fix(e2e): isolate env-gate sandbox resources in mcp-oauth-settings-gate Second sandbox in the file shared DB_FILENAME and port-allocation baseline with the beforeAll sandbox. The docker step would unlink the running DB file, and getPort(8055) could hand back the same fallback twice, surfacing as 'Api stopped with error code 1'. Use a per-test UUID for prefix/DB_FILENAME/docker.suffix and pin an explicit port. * fix e2e 9: attempt horizontal fix * fix e2e 10: horizontal attempt 2 * fix(system-owner): align with refactored SetupForm shape (#27631) * fix(system-owner): align with refactored SetupForm shape * fix: validate function with new contract * fix: fallback to initialValue * fix: handle feedbacks * fix e2e 11: horizontal fix * fix(sandbox): keep resolved port consistent across env and apis Three desync sites caused the port the API actually binds to drift away from what callers and the API itself observed: - getEnv set PORT/PUBLIC_URL early, then process.env clobbered them with the vitest per-project PORT baseline. So opts.port was silently ignored. Move PORT/PUBLIC_URL to after the process.env spread, and let process.env.PORT feed getPort as a fallback baseline. - startApi's getPort(preferredPort) can fall back to a free random port (TIME_WAIT after restart, collision with a sibling sandbox). The spawn env updated PORT but not PUBLIC_URL, so the API listened on one port and advertised iss/issuer on another. Override both. - sandbox() returned apis by value. restartApi reassigned the local variable but consumers still saw the old array, so apis[0].port was stale after restart. Expose apis via a getter. With these in place, drop the port:8056 workaround from the mcp-oauth env-gate test (DB filename / docker suffix uniqueness still needed). * fix e2e 12: remaining initialize * remove custom llm patch check for rc1 * bring mock license error format up to spec * fix(sandbox): keep resolved port consistent across env and apis api.ts re-resolved the port via getPort(preferredPort) before each spawn. With get-port@7.1.0's 15s lockedPorts cache, getPort(X) for a port X that getOptions just locked throws Locked(X) and falls back to a random port Y. Parent's env.PUBLIC_URL was constructed from X; the API child then bound Y and advertised iss/public_url=Y. The mock /update endpoint validates by matching the public_url stored from parent's activate call, so the lookup failed with 400 -> initialize() threw -> API exited. Stop re-resolving in api.ts: trust opts.port/env.PORT set by getOptions (initial boot) and by restartApi (restart). restartApi now re-resolves explicitly to handle TIME_WAIT on the just-killed port, and propagates the resolved value to opts.port + env.PORT + env.PUBLIC_URL so consumers of directus.apis/env stay in lockstep. Fixes initialize.sb.test.ts Case B "migrates to new env LICENSE_KEY", which was failing on any host where the vitest project's PORT baseline was taken (i.e., where getOptions had to fall back to an ephemeral port). * fix(e2e): use writeTimestamp for activity/revision INSERTs date.parse() returns an ISO string (YYYY-MM-DDTHH:mm:ss.sssZ) which is fine for WHERE comparisons (where core uses it -- retention.ts, operator.ts) but MySQL/MariaDB reject it in strict mode on DATETIME column bindings. Switch to date.writeTimestamp(iso), the INSERT-side helper. It returns a Date that mysql2/sqlstring formats as 'YYYY-MM-DD HH:mm:ss', which all dialects accept. Matches core's convention (payload.ts date-created / date-updated, versions.ts). Fixes activity-historical-timeframe.sb.test.ts and revision-historical-timeframe.sb.test.ts on mysql / maria sandboxes. * add writeTimestampString to helpers * bump outside * fix(licensing): improve license check lifecycle (#27622) * improve license check * simplify auto stop on re-schedule * fix e2e 13: cpr inserts * fix e2e 14: mssql cannot set id on insert --------- Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Rob Luton <rob.luton@gmail.com> Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> Co-authored-by: formfcw <dev@formfcw.com> Co-authored-by: ian <licitdev@gmail.com> Co-authored-by: Hannes Küttner <kuettner.hannes@gmail.com> Co-authored-by: David Stockton <7375241+dstockton@users.noreply.github.com> Co-authored-by: James White <jamesw1013@googlemail.com> | 4 个月前 | |
Release 12.5.0 (#28336) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 7 天前 | |
Add licensing (#27417) * tests(mls): improve util typing * tests(mls): add new entry point * tests(mls): return back added license * improve license server * fix(cli): do not initialize license in bootstrap * refactor(manager): do not allow undefined entitlements * tests(mls): fix initialize tests * tests(mls): improve rest tests * fix(license): error on attempt to active with active key * fix cache refresh * clean logs * update test * add final rest test * add horrizontal tests * fix(manager): update has keys swapped * tests(mls): add initialization case B * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * fix transaction for creating first admin user in sqlite * include knex everywhere * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * improve pendingResolution * fix for ma best fiend juda * Fix preview endpoint missing name * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * cleanup * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * add missing set source for db data * enforce port for api * refactor initialize test structure * more port fixes * more cleanup * fix(get-license-*): incorrect source if not found * refactor(sandbox): utilize promise resolver fix(sandbox): early error on api close * update rest tests * fix(preview): pull non prod flag from entitlements * fix(mls): bring up to spec on preview * Update api/src/license/entitlements/lib/seats.ts * fix(license): use constant for inactive license exceeded status * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * refactor(licensing): remove deprecated getLicense imports * fix(license manager): entitlements out of sync with state change * tests(mls): add shared functions * add lifecycle tests * Refactor sdk error to use class over object (#27135) * fixed error handling in sdk * Update thick-readers-cheer.md * rework error and move to dedicated file --------- Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> * fix process killing in sandbox * complete rest resolve tests * License frontend parent branch (#27395) * feat: add licit jwt mock * fix: concurrency lock * refactor: add types and update usage * feat: add lazy addons hydration to license store * fix: re-apply concurrency lock fix on license manager * License management settings page (#27368) * feat: add license API types and route mocks * fix: remove cache * feat: add sdk part * refactor: update types according to notion feebacks * feat: add front-end foundation * feat: add scenario / error mock param from sdk * wip licensing settings * deactivate modal confirm * fix * fix: align license page with new entitlements format and store API * split license section * extract format time frame in its own util * feat: implement customLLM screen * Apply suggestion from @gaetansenn * refactor: update settings and store --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add license gating UI on Custom LLM settings (#27379) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * fix: use override before default * Add license gating on access policies custom rules (#27390) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * feat: add license gating on access policies custom rules * Revert "feat: implement customLLM screen" This reverts commit fa5c49fc8358bfae1e266895a7724df8cac01796. * fix: conflict * feat: skip license store hydration for non-admin users * Add revision and activity history license notice (#27399) * feat: add revision and activity history license notice * refactor: simplify formatTimeframe to use days only * fix: revision order license * fix: activity feed licesne margin * License mock (#27392) * add basic license mock server * start updating test suite * start working on license activation test * better error reporting * continue testing * continue on tests * remove invalid files * Fix license initialization * first working test 🥳 * rename entitlement setLicense to setEntitlements * cleanup endpoints * add license assertions * cleanup * account for provided key entitlements in pending resolution * add public_url change handling for refresh * account for deactivate state in pendingResolution * various fixes * License entitlement 2 (#27386) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * License entitlement 2_final (#27396) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * fix flows * implement resolvers * no mo try catch * cleanup after entitlement improvements * update license-mock * complete mock server * feat(e2e): add beforeApi hook * test(e2e): surface db connection * tests(e2e): correctly build knex connection * tests(e2e): add g and d cases * fix getschema on clean bootstrap * fix sandbox and e2e tests * update tests * do not restrict preview behind admin * no bypass for manage addons on init * adjust setup completed and license payloads * fix license token column type and unify the 2 migrations * add license and key generation * test(license-mock): rename to mock-license-server * fix sb * update test * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * refactor: use e2e logic * refactor: clean up code * refactor: clean up mocks * License Onboarding flow (#27334) * License onboarding (#27380) * align frontend with API schema and fix setupCompleted derivation --------- Co-authored-by: HZooly <torzuoli.hugo@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * refactor: merge conflicts * Include LICENSE_TOKEN in licenseInEnv check (#27416) * fix: include LICENSE_TOKEN in licenseInEnv check * update project owner banner rule --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * feat: show deactivated collections in data model (#27421) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * improve pendingResolution * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * fix for ma best fiend juda * cleanup * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * enforce port for api * add missing set source for db data * more port fixes * refactor initialize test structure * refactor: revert mock * lint: clean up * feat: add static license keys * Amend how seats are computed against entitlements (#27431) * Amend computation again (#27432) * Amend how seats are computed against entitlements * Fix error * Tighten license onboarding types and gate project owner info (#27433) * Add license limit modal and use for seat and collection gating (#27372) * collection limit modal * tests * share licens guard code via composable * refactor * rework user limit modal to appear on save * rework again based on latest spec * change status to deactivated * simplify save to deactivated status * revert more changes * change back to error code that will be added later * use named route instead of hard-coded path * placeholder for settings page * I lost the vote * refactor: add todo * Revert "refactor: add todo" This reverts commit 4fd3b267165c7f0b6f6f1a7596848e0c790dc329. * Collections remaining component and logic (#27383) * collections remaining component and logic * remove hard coded value used for testing --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * max capacity modal (#27393) * minor fixes * show collectionsRemaining when 10 or less left for team and enterprise * avoid using specific plan types in conditions * cleanup * adapt to api changes plus feedback * cleanup and minor fixes * change alert text color to match figma * Frontend gating for flows (#27430) * frontend gating for flows * change license-limit-modal name to entitlement-limit-modal * Update app/src/views/private/components/license/entitlement-remaining.vue --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Import inactive-license-expired string from constant --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * Merge with license branch * Move entitlement remaining to actions:prepend slot * drop dead onboarding code and fix breadcrumb import * restore owner_complete --------- Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Rob Luton <rob.luton@gmail.com> * rename user inactive exceeded state due to limits * Add AI translation gating (#27444) * feat: add licit jwt mock * fix: concurrency lock * refactor: add types and update usage * feat: add lazy addons hydration to license store * fix: re-apply concurrency lock fix on license manager * License management settings page (#27368) * feat: add license API types and route mocks * fix: remove cache * feat: add sdk part * refactor: update types according to notion feebacks * feat: add front-end foundation * feat: add scenario / error mock param from sdk * wip licensing settings * deactivate modal confirm * fix * fix: align license page with new entitlements format and store API * split license section * extract format time frame in its own util * feat: implement customLLM screen * Apply suggestion from @gaetansenn * refactor: update settings and store --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add license gating UI on Custom LLM settings (#27379) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * fix: use override before default * Add license gating on access policies custom rules (#27390) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * feat: add license gating on access policies custom rules * Revert "feat: implement customLLM screen" This reverts commit fa5c49fc8358bfae1e266895a7724df8cac01796. * fix: conflict * feat: skip license store hydration for non-admin users * Add revision and activity history license notice (#27399) * feat: add revision and activity history license notice * refactor: simplify formatTimeframe to use days only * fix: revision order license * fix: activity feed licesne margin * License mock (#27392) * add basic license mock server * start updating test suite * start working on license activation test * better error reporting * continue testing * continue on tests * remove invalid files * Fix license initialization * first working test 🥳 * rename entitlement setLicense to setEntitlements * cleanup endpoints * add license assertions * cleanup * account for provided key entitlements in pending resolution * add public_url change handling for refresh * account for deactivate state in pendingResolution * various fixes * License entitlement 2 (#27386) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * License entitlement 2_final (#27396) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * fix flows * implement resolvers * no mo try catch * cleanup after entitlement improvements * update license-mock * complete mock server * feat(e2e): add beforeApi hook * test(e2e): surface db connection * tests(e2e): correctly build knex connection * tests(e2e): add g and d cases * fix getschema on clean bootstrap * fix sandbox and e2e tests * update tests * do not restrict preview behind admin * no bypass for manage addons on init * adjust setup completed and license payloads * fix license token column type and unify the 2 migrations * add license and key generation * test(license-mock): rename to mock-license-server * fix sb * update test * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * refactor: use e2e logic * refactor: clean up code * refactor: clean up mocks * License Onboarding flow (#27334) * License onboarding (#27380) * align frontend with API schema and fix setupCompleted derivation --------- Co-authored-by: HZooly <torzuoli.hugo@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * refactor: merge conflicts * Include LICENSE_TOKEN in licenseInEnv check (#27416) * fix: include LICENSE_TOKEN in licenseInEnv check * update project owner banner rule --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * feat: show deactivated collections in data model (#27421) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * improve pendingResolution * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * fix for ma best fiend juda * cleanup * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * enforce port for api * add missing set source for db data * more port fixes * refactor initialize test structure * refactor: revert mock * lint: clean up * feat: add static license keys * Amend how seats are computed against entitlements (#27431) * Amend computation again (#27432) * Amend how seats are computed against entitlements * Fix error * Tighten license onboarding types and gate project owner info (#27433) * Add license limit modal and use for seat and collection gating (#27372) * collection limit modal * tests * share licens guard code via composable * refactor * rework user limit modal to appear on save * rework again based on latest spec * change status to deactivated * simplify save to deactivated status * revert more changes * change back to error code that will be added later * use named route instead of hard-coded path * placeholder for settings page * I lost the vote * refactor: add todo * Revert "refactor: add todo" This reverts commit 4fd3b267165c7f0b6f6f1a7596848e0c790dc329. * Collections remaining component and logic (#27383) * collections remaining component and logic * remove hard coded value used for testing --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * max capacity modal (#27393) * minor fixes * show collectionsRemaining when 10 or less left for team and enterprise * avoid using specific plan types in conditions * cleanup * adapt to api changes plus feedback * cleanup and minor fixes * change alert text color to match figma * Frontend gating for flows (#27430) * frontend gating for flows * change license-limit-modal name to entitlement-limit-modal * Update app/src/views/private/components/license/entitlement-remaining.vue --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Import inactive-license-expired string from constant --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * Merge with license branch * Move entitlement remaining to actions:prepend slot * drop dead onboarding code and fix breadcrumb import * restore owner_complete * Hide translations button on translation interface * Add readonly and notice to AI settings * Add helper function for license store boolean values * Update tests --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Rob Luton <rob.luton@gmail.com> * fix exiting sandbox * fix sandbox logging undefined for admin user&pw * add addons to mock server * Fix license settings (#27448) * remove deprecated breadcrumb * hide add-ons if not available * hide manage license button when no source * Hide danger zone for free tier * do not render infinite date * skip MaxCapacityAlert render when capacity not exceeded * remove breadcrumb import --------- Co-authored-by: Rob Luton <rob.luton@gmail.com> * Basic collection unit and e2e (#27438) * basi collection unit and e2e * Add collection e2e tests * basic flows e2e tests * fix collection leak * fix collection leak * very basic seats testing * fix user deactivation * move initialize to constructor * add downgrade/lock for invalid status * add addon tests * Handle unlimited case, refactor store, fixes due to recent merges (#27446) * use v-chip for styling (#27459) * License key modale (#27418) * handle license key submit * fix license drawer reset and isLicensed signal * wire manage license * fix model value * refactor: route license activate/update through licenseStore --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Update license wording (#27422) * update license wording * remove license notices from setup onboarding * Refresh license info on settings page mount (#27455) * refresh license info on settings page mount * do not fetch addons if not required * refactor: clarify Core tier check in license settings mount --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add public/private license badge (#27452) * Add new system interface to public view * Display badge within private view nav * Replace ::before line with hr * Move from system interface to component * Add test case for v-license-badge * Simplify displayPoweredBy computed * Move wrapper to private-view-nav-footer component * Move translation strings * Add non-production badge * Fix alignments * Replace icon and fix style adjustments * Fix padding issue on public view * Prevent stacked onboarding and project owner modals (#27460) * prevent stacked onboarding and project owner modals * License resolution modal (#27441) * feat: add licit jwt mock * fix: concurrency lock * refactor: add types and update usage * feat: add lazy addons hydration to license store * fix: re-apply concurrency lock fix on license manager * License management settings page (#27368) * feat: add license API types and route mocks * fix: remove cache * feat: add sdk part * refactor: update types according to notion feebacks * feat: add front-end foundation * feat: add scenario / error mock param from sdk * wip licensing settings * deactivate modal confirm * fix * fix: align license page with new entitlements format and store API * split license section * extract format time frame in its own util * feat: implement customLLM screen * Apply suggestion from @gaetansenn * refactor: update settings and store --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Add license gating UI on Custom LLM settings (#27379) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * Apply suggestion from @gaetansenn * fix: use override before default * Add license gating on access policies custom rules (#27390) * feat: implement customLLM screen * Apply suggestion from @gaetansenn * feat: add license gating on access policies custom rules * Revert "feat: implement customLLM screen" This reverts commit fa5c49fc8358bfae1e266895a7724df8cac01796. * fix: conflict * feat: skip license store hydration for non-admin users * Add revision and activity history license notice (#27399) * feat: add revision and activity history license notice * refactor: simplify formatTimeframe to use days only * fix: revision order license * fix: activity feed licesne margin * License mock (#27392) * add basic license mock server * start updating test suite * start working on license activation test * better error reporting * continue testing * continue on tests * remove invalid files * Fix license initialization * first working test 🥳 * rename entitlement setLicense to setEntitlements * cleanup endpoints * add license assertions * cleanup * account for provided key entitlements in pending resolution * add public_url change handling for refresh * account for deactivate state in pendingResolution * various fixes * License entitlement 2 (#27386) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * License entitlement 2_final (#27396) * use directus errors * fix custom rule entitlement and enforce create/update * basic flows enforcement * add flows and update collections * add collection status for excluding * simple collection exclusion checks * fix flows * implement resolvers * no mo try catch * cleanup after entitlement improvements * update license-mock * complete mock server * feat(e2e): add beforeApi hook * test(e2e): surface db connection * tests(e2e): correctly build knex connection * tests(e2e): add g and d cases * fix getschema on clean bootstrap * fix sandbox and e2e tests * update tests * do not restrict preview behind admin * no bypass for manage addons on init * adjust setup completed and license payloads * fix license token column type and unify the 2 migrations * add license and key generation * test(license-mock): rename to mock-license-server * fix sb * update test * License entitlement 3 (#27408) * fixing entitlement initialization * move blocking modal that always triggers * manager tweaks * dont prevent user creation * fix history filter calculations * integrate seat enforcement with existing limit checks * remove debug code * mo verify * fix activity history filter and added basic query cache * fix circular import issue with services * add checkAll feature and fix feature flags * bring mock server up to spec * cleanup mock server * add grace period utility * change mock server version to date based * add overage billed to meta * bring core up to spec * bring tests up to spec * move lib to utils * utilize entitlement getActiveSeats for resolution * add required claim to mock server * refactor: use e2e logic * refactor: clean up code * refactor: clean up mocks * License Onboarding flow (#27334) * License onboarding (#27380) * align frontend with API schema and fix setupCompleted derivation --------- Co-authored-by: HZooly <torzuoli.hugo@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * refactor: merge conflicts * Include LICENSE_TOKEN in licenseInEnv check (#27416) * fix: include LICENSE_TOKEN in licenseInEnv check * update project owner banner rule --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * feat: show deactivated collections in data model (#27421) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * improve pendingResolution * fix folder counting * update `display_powered_by` value to spec * fix collection enforcement * fix for ma best fiend juda * cleanup * add todo for error handling for setup license activate * Support lock state and refactor state commit (#27419) * support lock state and refactor state commit * dont call getStatus on options.status * License entitlement 4 (#27420) * fix collections resolution * basic collection entitlements test * rename for consistency * oops, invert check functions for entitlements * make sure limits are set * fix assertAll * add excpetion back in * skip not registerd keys * update token on addon quantity change * tests(mls): add license version requirement enforcement * add knex for getSchema * moar knex issues * enforce port for api * add missing set source for db data * more port fixes * refactor initialize test structure * refactor: revert mock * lint: clean up * feat: add static license keys * wip resolution modal * Amend how seats are computed against entitlements (#27431) * Amend computation again (#27432) * Amend how seats are computed against entitlements * Fix error * Tighten license onboarding types and gate project owner info (#27433) * Add license limit modal and use for seat and collection gating (#27372) * collection limit modal * tests * share licens guard code via composable * refactor * rework user limit modal to appear on save * rework again based on latest spec * change status to deactivated * simplify save to deactivated status * revert more changes * change back to error code that will be added later * use named route instead of hard-coded path * placeholder for settings page * I lost the vote * refactor: add todo * Revert "refactor: add todo" This reverts commit 4fd3b267165c7f0b6f6f1a7596848e0c790dc329. * Collections remaining component and logic (#27383) * collections remaining component and logic * remove hard coded value used for testing --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * max capacity modal (#27393) * minor fixes * show collectionsRemaining when 10 or less left for team and enterprise * avoid using specific plan types in conditions * cleanup * adapt to api changes plus feedback * cleanup and minor fixes * change alert text color to match figma * Frontend gating for flows (#27430) * frontend gating for flows * change license-limit-modal name to entitlement-limit-modal * Update app/src/views/private/components/license/entitlement-remaining.vue --------- Co-authored-by: Alex Gaillard <alex@directus.io> * Import inactive-license-expired string from constant --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Alex Gaillard <alex@directus.io> * fix(license manager): pending resolution pushing no violation * add remaining initialize tests * move admin under its own route * move getLicense under manager * fix(license manager): explit check for license key * fix(mls): JWT exp should be 7 days from issue * Merge with license branch * Move entitlement remaining to actions:prepend slot * drop dead onboarding code and fix breadcrumb import * refactor: udpdate store * restore owner_complete * refactor: clean up code * grace-period modal * feat: handle locked license logic * fix: rename collection deactivation and apply locked to app * resolution modal ui * modal footer * refactor: handle no resolution case * refactor: adapt according to severity * refactor: route license activate/update through licenseStore * add missing translation * sync lock allowed list between router an app * make grace warning dismiss work, clear on grace exit --------- Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: daedalus <44623501+ComfortablyCoding@users.noreply.github.com> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Rob Luton <rob.luton@gmail.com> * License upgrade buttons (#27457) * handle license key submit * fix license drawer reset and isLicensed signal * wire manage license * fix model value * upgrade plan button link * wire upgrade plan button * refactor: simplify upgrade buttons block in license settings --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * Surface entitlement limit modal on collection create errors (#27463) * feat: surface entitlement limit modal on collection create errors * refactor: use extractErrorCode for limit detection * Update license header badge (#27458) * update license header badge * feat: map license status to badge label and color * Revert "feat: map license status to badge label and color" This reverts commit 7b6ebd3779b82bfae10eac637f11d8b11f472ce8. --------- Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Rob Luton <rob.luton@gmail.com> * blocked login should be resource restricted error * Show project locked warning for non-admin logins (#27466) * Fix flows max-capacity padding (#27467) * fix license server connection * Handle unlimited case and cleanup (#27468) Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * fix(addons): add `unit_price` & `billing_interval` to response * fix license store reactivity issues (#27483) * hydrate license store during crud events * hydrate on collections batch delete * hydrate when seat count affected * remove unnecessary awaits when hydrating license store * handle collection-options case * remove redundant hydration call * show format-specific error for malformed license keys (#27480) * update license link utm params (#27485) * disable license management when key is set via env var (#27482) * use non production label instead of staging (#27489) * add password mistach warning (#27488) * License entitlements cache (#27484) * first run caching * add spork function * renamed clear cache func * clean up some AI code * Add missing entitlement check * fix entitlement mistakes * fix infinite loop and add assert removing logic * extra users seat checks * remove early exit * Split admins from users in seats resolution (#27477) * split admins from users in seats resolution * up * checkbox clickable * up * show password mismatch as inline field error (#27492) * show flow names in resolution dialog and submit proper IDs (#27491) * feat(licensing): support core license entitlement fork CMS-2401 * feat(licensing): add `scheduled_quantity` to addon output * Hide license badge on media width (#27494) * Hide license badge on media width * Use mixin * license settings responsive (#27506) * fix CMS-2410 * surface locked resources via resource restriction (#27495) * License Entitlements (#27502) * support invert value on entitlement display * ai translation entitlement * refactor entitlement into computed --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * hide SSO providers on signin when sso disabled (#27496) * add caching to core grace period query (#27497) * Amend SSO resolution message (#27510) * feat(license): harden license boot sequence (#27499) * feat(license): harden license boot sequence * prefer fatal for hard exits Co-Authored-By: Brainslug <br41nslug@users.noreply.github.com> --------- Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> * prevent license fields from being manually in settings (#27498) * improve seats enforcement (#27512) * improve seats enforcement * make seats cache refresh instead of clear * Adjust activity license notice margin and hide for unlimited (#27511) * refactor(licensing): consolidate state transitions (#27513) * refactor(licensing): replace getStatus with computeLicenseStatus * refactor(licensing): narrow isLocked to stored status * refactor(licensing): always re-compute status * feat(licensing): add downgrade_reason to license output * refactor(licensing): consolidate state transitions * fix(licensing): source not reliable * refactor(licensing): utilize promise all in license output * Align resolution dialog with new downgrade_reason contract (#27517) * refactor(license): align resolution dialog with new downgrade_reason contract * refactor: remove old i18n * refactor: use downgrade_reason of scope value * feat: unify grace + downgrade resolution prompt * refactor: remove unused needsResolution * Update app/src/lang/translations/en-US.yaml Co-authored-by: Alex Gaillard <alex@directus.io> * fix: type resolution dialog title --------- Co-authored-by: Alex Gaillard <alex@directus.io> * resolve SSO section interactivity and deactivation flow (#27519) * KYC Modal (#27521) * show project owner modal after license modale dismiss * guard nested property access in form * show project owner modal regardless of license source * Collection update incorrectly blocked by collection limit (#27522) * fix collection issue * nit * fix custom_llm flag filtering * fix(license): bypass any non-resolver type FF in checkAll * Addon purchase modals on License settings (#27504) * feat: add addons logic modal * refactor: optimize addon scheduled update * refactor: clean up code * fix: fix i18n wording * refactor: clean up date formater * Amend messaging for upgrade case * Amend no change case * Handle downgrade case * Cleanup * Divide unit price by 100 --------- Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> * fix(licensing): custom permission rules should check fields independently * Make private view license reactive (#27527) * Resolution dialog fixes and improvements (#27523) * fix: show grace period modal on license expiry within limits * refactor: revert logic * fix: avoid loading null user * fix: resolution dialog issues and clarity improvements * Change badge from none to hidden (#27530) * Amend non prod badge to use license store (#27531) * Change badge from none to hidden * Amend non prod badge to use license store * Amend badge back to server store (#27533) * fix: deactivated state from collection (#27535) * fix collection update enforcement * Add license expiring warning notices (#27518) * create status-notice components and handle the grace period upgrade case * handle remaining cases * fix logic * cleanup * fix pinned grace text * prevent powered by badge visibility from affecting pinned status visibility * add locked status message * change verbiage to match what will actually happen * minor copy change * fix minor spacing issue * update copy * feedback updates * update get license link (#27537) * fix permissions cache on license change * fix(license): pass down knex for permission entitlements * Fix/modal user status (#27543) * fix: modal resolution card width * fix: update new status value * Resolution modale: LLM, custom rules, and user email (#27526) * fall back to email in seat candidates and reduce the number of displayed fields in drawer * show custom LLM and permission rules in resolution dialog * fix: sso spacing block * feat: refactor sso confirm * fix: email validation + wording --------- Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> * fix: refresh addons after license key change (#27542) * fix: refresh addons after license key change * refactor: remove comment * add flows entitlement (#27547) * Add license key modal and pop after login (#27539) * translation keys * license-key-modal * refactor * tests * update links and use utm tags * update oig onboarding link (#27552) * update plan limit message (#27550) * refresh addons after license deactivate (#27551) * restore open animation on user drawer (#27548) * update addons purchase modale text (#27556) * License seats fix (#27557) * remove refreshCache logic * fix stale seats cache counting issue * fix seats e2e test to not rely on cacheBypass * re-activate bus subscription * clear cache centrally * Amend enterprise addon button link (#27572) * Amend enterprise addon button link * Fix some things * refresh license usage after schema mutations affecting collections (#27549) * show only grace login modal when upgrading from v11 to v12 (#27579) * Disable manage license when env managed (#27581) * disable manage license when env managed * refactor isEnvManaged in store * Revert "Disable manage license when env managed (#27581)" (#27584) This reverts commit 721b24e18dc414d2e136b8ebb606b37fe27f8430. * close resolution dialog when managing license in no_resolution scope (#27586) * Fix custom permission rules entitlement key (#27587) * Do not clear sessions on admin credential change (#27588) * fix(license): mirror SSO escape hatch in login middleware (#27582) * fix(license): mirror SSO escape hatch in login middleware * refactor(license): simplify SSO escape hatch to entitled || locked * refactor: simplify * core within grace and within limits should be active * Replace hardcoded `https://directus.io` to `https://directus.com` with new constant (#27585) * create constant for directus.com and replace all instances of https://directus.io with the new constant * changeset * updates * update all package.json files to use the new home page url * update license files * update vue files * update constant * md and yml files * revert changes made to email addresses * Apply suggestion from @AlexGaillard --------- Co-authored-by: Alex Gaillard <alex@directus.io> * clear the caches explicitly on resolution (#27591) * redirect to settings after submit on license-recovery route (#27592) * disable Add License button when env managed (#27593) * Improve test coverage (#27590) * add custom llm coverage * add activity entitlement e2e * always select full activity for test * remove redundant count from activity tests * add revision entitlement e2e * fmt * add db helpers for date parsing * type api client * add custom permission rules e2e * rename createCustomPermission to buildCustomPermission * remove invalid permission assertion * update collection tests * add remaining tests to collections * assert resolve in cpr * update license flow entitlement e2e * improve rest tests * tests(licensing): get the green for rest * Skip hydrateAddons when license source is null (#27600) * skip hydrateAddons when license source is null * clear addons after deactivation * clear correct cache on collection remediation * allow sso during core grace (#27601) * register license check * License design update 1 (#27599) * refactor(app): use InterfacePresentationDivider for license section header Replace the bespoke section header (custom VDivider + VIcon + styled title) in license-section.vue with the shared InterfacePresentationDivider so headings match the rest of the admin app and drop the duplicated layout and typography CSS. Rename the section's variant prop to kind (neutral | danger) to align with the prop naming used elsewhere (VChip etc.) and update the caller in license.vue accordingly. * style(app): polish license module chips, buttons, and spacing Design tweaks across the license module to standardize on built-in component variants and drop ad-hoc CSS overrides. - Switch entitlement and plan-status chips to VChip standard variants (:label="false" plus kind="success" / "primary" / "neutral") and remove the custom .v-chip CSS that hand-styled background, padding, and border radius - Drop the small icon prop in entitlement labels and recolor via a scoped --v-icon-color token instead of a :deep selector - Use the theme border-radius token for the entitlement item background - Add small to addon-item action buttons so they sit better next to the entitlement rows - Apply the type-label mixin to the entitlements section title - Add a .status-chip class with font-weight 600 for the plan status chip - Stretch the env-managed VNotice to full width inside the danger zone * improve responsive design * adjust badge-divider size and add flex-shrink to project name container * add error handling (#27596) * add error handling * improvements * install license package * bump license package to 0.2.0 * only bypass sso if in grace and grace period * back new helper with unit tests * update missing setting fields in sdk * add license info to server info sdk type * update gql server info type * fix(license): expose Core grace deadline via expires_at + grace_period (#27583) * fix(license): expose Core grace deadline via expires_at + grace_period * refactor: clean up lint * refactor: clean up lint * refactor(license): rename to getCoreGraceExpiresAt and consolidate * refactor: return seconds from getCoreGraceExpiresAt and update tests * refactor(license): split getCoreGraceExpiresAt into its own file * Fix rpc sync (#27597) * hide addon pricing_summary when unit_price is null (#27608) * add license package to e2e * attempt bb fix * Fix e2e * fix offline * License design update 2 (#27610) * style: adjust spacing in v-radio-cards and setup components for improved layout * adjust non-production badge * Remove unused center prop from VDivider (#27618) * simplify activity e2e * simplify revision e2e * await registration in e2e * simplify permission rule e2e * simplify cllms e2e * attempt to fix blackbox 1 * remove requirement for requested port to be same as requested * attempt to fix blackbox 2 * show inline email format error on setup form (#27609) * show inline email format error on setup form * up * attempt to fix blackbox 3 * attempt to fix blackbox 4: mess up version tests * attempt to fix blackbox 5 * enable license for global * log actual error * update status messages for core tier expiry date (#27613) * update * update status notice message * simplify * remove hover style so it is consistent with other opened PRs * update keys for mock server * explicit set dev * License design update 3 (#27620) * remove todos * Improve setAddonQuantity error handling * fix(license): hide history timeframe notice when entitlement is -1 (#27623) Co-authored-by: Alex Gaillard <alex@directus.io> * Grace modal wording (#27615) * fix(license): refine Core grace modal wording * fix: use email from variable * refactor: use DIRECTUS_DOMAIN const * Update app/src/views/private/components/license/license-login-modal.vue * Update app/src/lang/translations/en-US.yaml * Update app/src/lang/translations/en-US.yaml --------- Co-authored-by: Alex Gaillard <alex@directus.io> * show AI translations resolution checkbox when losing the entitlement (#27594) * fix: do not hydrate addons when offline (#27624) * fix: update padding and background styles for public view and license badge (#27630) * Change license to MSCL-1.0-GPL (#27627) * Update translations to reflect MSCL 1.0 licensing across multiple languages * Update copilot instructions to reflect MSCL-1.0-GPL * Update license in openapi.yaml * Update license in directus README * Update licenses to MSCL-1.0-GPL across multiple package.json files * Update licenses files * add MIT license file to packages/ai * Update copyright year * Update license to reference the LICENSE file in multiple package.json files * Update licenses to reflect Monospace Sustainable Core License, Version 1.0 across multiple files * add changeset * Remove license update note from readme Removed note about upcoming Directus license update and feedback request. * Revise license details and user categories in readme Updated licensing information and usage terms for Directus. * Update readme.md * Fix pricing link in readme Updated the link for pricing details in the commercial license section. * add breaking change notice * Fix license change notice from BUSL-1.1 to BSL-1.1 * Fix typo in license change notice * Update license information in readme.md Added information about the license change from BSL to MSCL for sustainability. --------- Co-authored-by: David Stockton <7375241+dstockton@users.noreply.github.com> Co-authored-by: James White <jamesw1013@googlemail.com> * e2e fixes * e2e fixes 5 * e2e fix 6, remove dead test * e2e fixes 7: relax property match in initialize * fix e2e 8: bring lifecycle checks inline * fix(e2e): isolate env-gate sandbox resources in mcp-oauth-settings-gate Second sandbox in the file shared DB_FILENAME and port-allocation baseline with the beforeAll sandbox. The docker step would unlink the running DB file, and getPort(8055) could hand back the same fallback twice, surfacing as 'Api stopped with error code 1'. Use a per-test UUID for prefix/DB_FILENAME/docker.suffix and pin an explicit port. * fix e2e 9: attempt horizontal fix * fix e2e 10: horizontal attempt 2 * fix(system-owner): align with refactored SetupForm shape (#27631) * fix(system-owner): align with refactored SetupForm shape * fix: validate function with new contract * fix: fallback to initialValue * fix: handle feedbacks * fix e2e 11: horizontal fix * fix(sandbox): keep resolved port consistent across env and apis Three desync sites caused the port the API actually binds to drift away from what callers and the API itself observed: - getEnv set PORT/PUBLIC_URL early, then process.env clobbered them with the vitest per-project PORT baseline. So opts.port was silently ignored. Move PORT/PUBLIC_URL to after the process.env spread, and let process.env.PORT feed getPort as a fallback baseline. - startApi's getPort(preferredPort) can fall back to a free random port (TIME_WAIT after restart, collision with a sibling sandbox). The spawn env updated PORT but not PUBLIC_URL, so the API listened on one port and advertised iss/issuer on another. Override both. - sandbox() returned apis by value. restartApi reassigned the local variable but consumers still saw the old array, so apis[0].port was stale after restart. Expose apis via a getter. With these in place, drop the port:8056 workaround from the mcp-oauth env-gate test (DB filename / docker suffix uniqueness still needed). * fix e2e 12: remaining initialize * remove custom llm patch check for rc1 * bring mock license error format up to spec * fix(sandbox): keep resolved port consistent across env and apis api.ts re-resolved the port via getPort(preferredPort) before each spawn. With get-port@7.1.0's 15s lockedPorts cache, getPort(X) for a port X that getOptions just locked throws Locked(X) and falls back to a random port Y. Parent's env.PUBLIC_URL was constructed from X; the API child then bound Y and advertised iss/public_url=Y. The mock /update endpoint validates by matching the public_url stored from parent's activate call, so the lookup failed with 400 -> initialize() threw -> API exited. Stop re-resolving in api.ts: trust opts.port/env.PORT set by getOptions (initial boot) and by restartApi (restart). restartApi now re-resolves explicitly to handle TIME_WAIT on the just-killed port, and propagates the resolved value to opts.port + env.PORT + env.PUBLIC_URL so consumers of directus.apis/env stay in lockstep. Fixes initialize.sb.test.ts Case B "migrates to new env LICENSE_KEY", which was failing on any host where the vitest project's PORT baseline was taken (i.e., where getOptions had to fall back to an ephemeral port). * fix(e2e): use writeTimestamp for activity/revision INSERTs date.parse() returns an ISO string (YYYY-MM-DDTHH:mm:ss.sssZ) which is fine for WHERE comparisons (where core uses it -- retention.ts, operator.ts) but MySQL/MariaDB reject it in strict mode on DATETIME column bindings. Switch to date.writeTimestamp(iso), the INSERT-side helper. It returns a Date that mysql2/sqlstring formats as 'YYYY-MM-DD HH:mm:ss', which all dialects accept. Matches core's convention (payload.ts date-created / date-updated, versions.ts). Fixes activity-historical-timeframe.sb.test.ts and revision-historical-timeframe.sb.test.ts on mysql / maria sandboxes. * add writeTimestampString to helpers * bump outside * fix(licensing): improve license check lifecycle (#27622) * improve license check * simplify auto stop on re-schedule * fix e2e 13: cpr inserts * fix e2e 14: mssql cannot set id on insert --------- Co-authored-by: Nitwel <mail@nitwel.de> Co-authored-by: Brainslug <br41nslug@users.noreply.github.com> Co-authored-by: Brainslug <tim@brainslug.nl> Co-authored-by: Alex Gaillard <alex@directus.io> Co-authored-by: Gaetan SENN <gaetan.senn@gmail.com> Co-authored-by: Hugo Torzuoli <torzuoli.hugo@gmail.com> Co-authored-by: Rob Luton <rob.luton@gmail.com> Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com> Co-authored-by: formfcw <dev@formfcw.com> Co-authored-by: ian <licitdev@gmail.com> Co-authored-by: Hannes Küttner <kuettner.hannes@gmail.com> Co-authored-by: David Stockton <7375241+dstockton@users.noreply.github.com> Co-authored-by: James White <jamesw1013@googlemail.com> | 4 个月前 | |
Follow-up on new Vue / CJS tsconfigs (#19201) | 3 年前 |
@directus/stores
Shared Directus Studio state for use in components, extensions, and the @directus/app routes. Stores are
Pinia-based stores.
Installation
pnpm add @directus/stores
Usage
import { useAppStore } from '@directus/stores';
const appStore = useAppStore();
License
This package is licensed under the MIT License. See the LICENSE file for more information.