🐛 Add Private Network Access CORS header for localhost#3
Conversation
Add event-based sync so navbar widget updates when settings are saved: - Add SETTINGS_CHANGED_EVENT custom event - Listen for settings changes in useTokenUsage hook - Dispatch event when updateSettings is called Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Andrew Anderson <[email protected]>
Change placement from 'left' to 'right' so tooltip appears correctly for sidebar elements. Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Andrew Anderson <[email protected]>
Browsers block requests from public HTTPS sites to localhost unless the server sends the Access-Control-Allow-Private-Network header. This allows the cluster-deployed console to connect to the local agent. Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Andrew Anderson <[email protected]>
|
Welcome to KubeStellar! 🚀 Thank you for submitting this Pull Request. Before your PR can be merged, please ensure: ✅ DCO Sign-off - All commits must be signed off with ✅ PR Title - Must start with an emoji: ✨ (feature), 🐛 (bug fix), 📖 (docs), 🌱 (infra/tests), Getting Started with KubeStellar: Contributor Resources:
🌟 Help KubeStellar Grow - We Need Adopters! Our roadmap is driven entirely by adopter feedback. Whether you're using KubeStellar yourself or know someone who could benefit from multi-cluster Kubernetes: 📋 Take our Multi-Cluster Survey - Share your use cases and help shape our direction! A maintainer will review your PR soon. Feel free to ask questions in the comments or on Slack! |
|
/lgtm |
|
/approve |
|
@clubanderson: you cannot LGTM your own PR. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: clubanderson The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
🎉 Thank you for your contribution! Your PR has been successfully merged. 🌟 Help KubeStellar Grow - We Need Adopters! Our roadmap is driven entirely by adopter feedback - nothing else. Whether you're using KubeStellar yourself or know organizations that could benefit from multi-cluster Kubernetes, we need your help: 📋 Take our Multi-Cluster Survey - Share your use cases and help shape our direction! 🗣️ Spread the word - Tell colleagues, write blog posts, present at meetups 💬 Share feedback on Slack #kubestellar-dev Every adopter story helps us prioritize what matters most. Thank you for being part of the KubeStellar community! |
…dentation - Revert package-lock.json peer flag pollution (Critical kubestellar#2) - Revert AddCardModal.tsx re-indentation, keep only catalog entries (Critical kubestellar#3) - Revert cardRegistry.ts formatting noise (restore original comment) (kubestellar#6) - Revert unrelated BuildpacksStatus.tsx i18n changes (kubestellar#8) - Add backend proxy handler for Artifact Hub API to fix CORS (kubestellar#5) - Wire isDemoFallback through useCardLoadingState for proper demo badge (kubestellar#4) - Convert all artifact-hub_status files to 2-space indentation (kubestellar#7) - Add i18n keys for relative time strings (justNow, minutesAgo, etc.) (kubestellar#9) - Remove unrelated buildpacksStatus i18n keys from en/cards.json (kubestellar#8) Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Aaradhy Chinche <[email protected]>
- Use Set instead of arrays for word-overlap scoring to prevent duplicate word inflation (Copilot #2) - Use >= instead of > for threshold comparison so missions scoring exactly 0.6 are accepted (Copilot #1) - Restrict cncfProject shortcut to installer missions only — solutions use slug/title matching as before (Copilot #3) Signed-off-by: Andrew Anderson <[email protected]>
- Use Set instead of arrays for word-overlap scoring to prevent duplicate word inflation (Copilot #2) - Use >= instead of > for threshold comparison so missions scoring exactly 0.6 are accepted (Copilot #1) - Restrict cncfProject shortcut to installer missions only — solutions use slug/title matching as before (Copilot #3) Signed-off-by: Andrew Anderson <[email protected]>
- MissionDetailView.tsx: (mission.tags ?? []).filter(...) prevents crash when tags is undefined
- RecommendationCard.tsx: (mission.tags ?? []).slice(0, 2) prevents crash
- ShareMissionDialog.tsx: (mission.tags ?? []).join(', ') prevents crash
Fixes #3 TypeError: undefined is not an object (evaluating 'mission.tags.filter')
Signed-off-by: copilot <[email protected]>
Co-authored-by: clubanderson <[email protected]>
Agent-Logs-Url: https://github.com/kubestellar/console/sessions/cbd9b7fa-9172-4e90-bef5-805c9f91ca2a
- generateFromBehavior now shows proposed changes before applying:
lists each move ("↕ Moved X from #1 to #3") and addition ("+ Added Y")
- User must click "Apply Changes" to commit, or "Cancel" to reject
- Added previewGenerateFromBehavior() and applyGeneratedConfig() to
useSidebarConfig hook
- "No changes needed" shown when sidebar already matches usage
- Auto-dismiss result messages after 3-5 seconds
Signed-off-by: Andrew Anderson <[email protected]>
Call cancelFn() inside the mutex lock so that the map read and the cancel invocation are atomic. Previously the lock was released before cancelFn() was called, allowing another goroutine to delete or overwrite the entry for the same session ID between the Unlock and the call. Fixes #3 (race condition in activeChatCtxs) Signed-off-by: copilot <[email protected]> Agent-Logs-Url: https://github.com/kubestellar/console/sessions/8bfe87aa-6d38-455f-ba1c-b6b0cb66a101 Co-authored-by: clubanderson <[email protected]>
- generateFromBehavior now shows proposed changes before applying:
lists each move ("↕ Moved X from #1 to #3") and addition ("+ Added Y")
- User must click "Apply Changes" to commit, or "Cancel" to reject
- Added previewGenerateFromBehavior() and applyGeneratedConfig() to
useSidebarConfig hook
- "No changes needed" shown when sidebar already matches usage
- Auto-dismiss result messages after 3-5 seconds
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Dashboard Studio: unified customization panel (WIP)
Introduces a new DashboardCustomizer ("Dashboard Studio") that unifies
the AddCardModal, SidebarCustomizer, and TemplatesModal into a single
full-screen panel with persistent left sidebar navigation.
Phase 1-3 complete:
- Extract shared card catalog data (CARD_CATALOG, types, helpers) into
shared/cardCatalog.ts and shared/CardPreview.tsx
- Refactor AddCardModal to import from shared modules (1692→670 lines)
- Create DashboardCustomizer shell with sidebar nav, section routing,
and preview panel
- Create section components: CardCatalogSection, AISuggestionsSection,
NavigationSection, TemplateGallerySection, DashboardSettingsSection
Design patterns: Grafana edit mode, Notion/Linear settings sidebar,
VS Code global search, Figma contextual preview, Material Design FAB.
Remaining work:
- Phase 4: Wire into DashboardPage, simplify FAB to single button
- Phase 5: Refactor tests
- Phase 6: Clean up old code, add i18n keys
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Wire DashboardCustomizer into DashboardPage + simplify FAB
- DashboardPage now renders DashboardCustomizer instead of separate
AddCardModal + TemplatesModal
- FAB shows single Palette button (Dashboard Studio) + inline undo/redo
in unified mode; legacy mode preserved for Dashboard.tsx/CustomDashboard
- Cmd+K / Ctrl+K keyboard shortcut opens Dashboard Studio
- URL params ?addCard=true and ?customizeSidebar=true route to correct
DashboardCustomizer sections
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Add tests for Dashboard Studio + i18n keys
- 14 new tests covering DashboardCustomizer, sidebar, preview panel,
all 5 section components, shared cardCatalog data, and CardPreview
- Add i18n keys under dashboard.studio.* for all section labels
- All existing tests still pass (8/8 affected tests green)
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix AI antipattern regressions
- Replace magic number 2000 with APPLIED_CONFIRMATION_MS constant
- Replace toBeDefined() no-op assertions with meaningful type checks
(typeof === 'function', .length checks, string type checks)
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Wire DashboardCustomizer into Dashboard.tsx (main route)
The root / route uses Dashboard.tsx, not DashboardPage.tsx.
Replace AddCardModal + TemplatesModal + old FAB menu with
DashboardCustomizer in Dashboard.tsx so the new UI is visible
on the main dashboard.
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 UX fixes from preview feedback
- Navigation renders inline (embedded SidebarCustomizer) instead of
requiring a separate dialog
- "Sidebar Items" + "Add Pages" → single "Dashboards" nav item
- Remove Dashboard Settings section (confusing, actions in sidebar footer)
- AI presets auto-generate on click instead of just filling input
- Add context text to AI section explaining what cards are and where
they'll be added
- Add template explanation banner ("replaces all cards on dashboard")
- Show dashboard name in header subtitle for context
- Reduce modal size to 75vw/75vh for less overwhelming feel
- Fixed height/width to prevent layout shifts between sections
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Rename to Console Studio + Card Collections
- "Dashboard Studio" → "Console Studio"
- "Templates" / "Template Gallery" → "Card Collections"
- Add subtitle: "Add cards, apply card collections, and manage your dashboards"
- Update search placeholder and i18n keys
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix i18n fallbacks, AI hover preview, try-asking persistence
- Add hardcoded fallbacks to all nav labels so they render even if
i18n keys aren't loaded yet
- AI suggestion cards now emit hover events to preview panel
- "Try asking" pills stay visible after generating suggestions
- Console Studio naming applied to all surfaces
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Simplify nav: flat items, unified Cards section, fewer recommendations
- Combine Browse Catalog + AI Suggestions into single "Cards" section
with AI query bar at top and catalog below (no tabs)
- Flatten nav: 3 items (Cards, Dashboards, Card Collections) — no
group headers
- Sidebar narrowed to w-48
- Limit recommended dashboards to 6 (was showing all ~20)
- Match purple color scheme for dashboard recommendations (was blue)
- "Add N to <dashboard>" button shows target dashboard name
- AI suggestion cards show hover preview
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Hide footer bar when no cards selected
Footer with "Add N cards" only appears when cards are actually
selected. Removes the dark bar that was always visible at the
bottom of the Cards section.
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Embed Card Factory + Stat Factory in Console Studio
- Add Create Custom Card and Create Stats Card as sidebar nav items
- Both render inline (embedded mode) instead of separate modals
- Remove search bar and undo/redo from sidebar (unnecessary with 5 items)
- Pass dashboard name to DashboardCustomizer for context
- Fix footer bar only showing when cards are selected
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ UX consistency pass across all Console Studio sections
- Remove static recommendations from both Cards and Dashboards
(AI suggestions and Generate from Behavior are smarter)
- Remove Create Custom/Stats buttons from Cards section (now in sidebar)
- Uniform purple-themed button styling in Dashboards section
- "New Dashboard" → "Create Dashboard"
- "Reset" → "Reset Sidebar" with tooltip explaining what it does
- "Generate from Behavior" gets tooltip: "Analyzes your navigation
history to suggest dashboards you actually use"
- Card Collections: offer "Add" or "Replace" choice instead of
always replacing all cards
- Update explanation banner for Add/Replace choice
- Reorder nav: Cards → Collections → Dashboards → Create Custom →
Create Stats (most common first, advanced last)
- Show actual dashboard name in Cards and Collections context text
- Clean up unused imports
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix modal height + add explainer subtitle
- Force fixed height (h-[75vh]) so modal doesn't shrink when
switching to sections with less content
- Update subtitle to explain the console's mental model: dashboards
contain cards that show real-time cluster data
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Unified search bar, collection naming, card list in collections
- Merge AI query + catalog search into single unified search bar
(type to filter catalog, click AI Suggest or press Enter for AI)
- Show card names in each collection tile so users know what's included
- Append "Collection" to each collection title
- Update subtitle to mention stat blocks
- Fix unused variable build errors
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Batch UX fixes from review feedback
- Remove factory nav items (Create Custom Card, Create Stats Card) —
keep as modal-based until they can be redesigned for consistency
- Remove health warnings from Create Dashboard modal (irrelevant)
- "Start with Template" → "Start with Card Collection" in Create Dashboard
- "Available Templates (42 templates)" → "Card Collections (42 collections)"
- "template" → "collection" throughout CreateDashboardModal
- Constrain Dashboards section to max-w-3xl to fix horizontal spacing
- Add footer bar with Undo/Redo/Reset Dashboard to Console Studio
- Fix "current dashboard" → "Main Dashboard" as fallback name
- Unified search bar (merged AI + catalog search into one input)
- Remove unused factory imports
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Redesign Dashboards section — search-to-add, flat list, no jargon
Major restructure of the Dashboards section (SidebarCustomizer embedded):
- Replace toggle "Add Dashboard" button with always-visible search bar
(type to find, click to add — like VS Code command palette)
- Remove confusing collapsible sections: "Primary Navigation",
"Secondary Navigation", "Dashboard Cards", "Available Templates"
- Replace with single "Your Dashboards" flat list (always visible,
drag to reorder, click trash to remove)
- "Generate from Behavior" → "Suggest from History" (clearer label)
- Remove "Dashboard Cards" section (managed via Cards tab)
- Remove "Available Templates" section (now Card Collections tab)
- Clean up ~200 lines of unused code, imports, and state
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix dashboard name + label AI suggestion pills
- Pass dashboardName from DashboardPage (uses page title)
- "current dashboard" fallback → "your dashboard" (less confusing)
- Add "Try:" label before AI suggestion pills so new users understand
they're clickable prompts
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix dashboard list layout — route shown inline after name
Route path shown as subtle suffix right after dashboard name instead
of pushed to far right edge. Removes the huge horizontal gap.
Also pass dashboardName from DashboardPage title prop.
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Rename "Suggest from History" → "Auto-organize"
More honest label — it reorders dashboards by visit frequency and
adds frequently visited ones, not just "suggests". Updated tooltip
to explain the actual behavior.
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 'Create Dashboard' → 'Create Custom Dashboard'
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix collection banner: "to the Multi-Tenancy dashboard"
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix "added to the X dashboard" wording in Cards + Collections
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Batch UX fixes: nav labels, factories, AI flow, bold removal
- Nav labels: "Add Cards", "Add Card Collections", "Manage Dashboards"
- Add factory nav items back (Create Custom Card, Create Stats Card)
opening as modals from a launcher screen
- AI suggestions: clear search after generate so full catalog shows
below; add "Clear & show all cards" button to dismiss AI results
- Collections: add search/filter bar matching Cards section layout
- Remove bold highlighting from dashboard name and add/replace text
- Dashboards section fills full width (removed max-w constraint)
- Pass dashboardName from DashboardPage title prop
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Create Dashboard modal: taller, no keyboard hints, buttons right-aligned
- Size md → lg for more breathing room
- Hide Esc/Space keyboard hints from footer
- Buttons right-aligned for consistency
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Embed factories inline — no separate modals
Card Factory and Stats Factory now render directly inside Console
Studio via embedded mode instead of opening separate modals.
Clicking the nav item shows the builder content inline.
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix Escape closing both modals + embed factories inline
- stopImmediatePropagation on Escape in useModalNavigation so nested
modals don't bubble Escape to parent (CreateDashboardModal no
longer closes Console Studio)
- Factory sections render inline via embedded mode (no launcher buttons)
- Remove bold highlights from dashboard name text
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Show available dashboards by default in Manage Dashboards
Available dashboards now always visible below search bar (not just
when typing). Users can discover what dashboards exist and click +
to add them. Search filters the list. Shows count and descriptions.
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Normalize font sizes across Console Studio sections
- Replace all text-2xs with text-xs for consistency
- All descriptions, pills, labels now use same size scale
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Batch: Create Dashboard in nav, auto-dismiss, font sizes, cleanup
- Add "Create Custom Dashboard" as Studio nav item (embedded inline)
- Remove "Create Custom Dashboard" button from Manage Dashboards section
- Auto-dismiss generation result after 5 seconds
- Normalize all text-2xs to text-xs for consistent font sizes
- Fix CreateDashboardModal embedded prop passthrough
- Wire CreateDashboardModal into DashboardCustomizer content area
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Add subtle divider before factory items in sidebar nav
Separates the create/factory items (Create Custom Dashboard,
Create Custom Card, Create Stats Card) from the main items
(Add Cards, Add Card Collections, Manage Dashboards) with a
thin border line.
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Add shared AIAssistBar component (not yet wired in)
Creates a reusable AI assist input bar for consistent AI experience
across Console Studio sections. Will be wired into Cards, Collections,
and Dashboards in follow-up.
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Factory styling: consistent tab sizes, rename Stats Card → Stats Row
- StatBlockFactory embedded tabs: text-xs → text-sm (matches Cards)
- "Create Stats Card" → "Create Stats Row" (honest about what it creates
— a row of stat blocks, not a single stat card)
- CardFactory tabs already text-sm (confirmed consistent)
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Rename "Create Stats Row" → "Create Stat Blocks"
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Consistent search bars and input styling across all sections
- Dashboards search: remove extra border, match padding (pl-10) with
Cards and Collections inputs
- Collections: add text search that filters by name/description
(in addition to category pills)
- All three sections now have identical input styling:
bg-secondary rounded-lg, pl-10, purple focus ring, no border
- Description text consistently uses text-xs text-muted-foreground mb-2
- Filter pills consistently use px-2 py-0.5 text-xs rounded-full
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Factory input styling: match Console Studio design system
- Remove explicit borders from factory input fields (both Card and
Stat factories): bg-secondary/50 border border-border → bg-secondary
- Matches the borderless input style used in Cards, Collections, and
Dashboards sections
- 15+ input fields updated across CardFactoryModal (1400 lines) and
StatBlockFactoryModal (800 lines)
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Auto-organize: preview/confirm flow instead of auto-apply
- generateFromBehavior now shows proposed changes before applying:
lists each move ("↕ Moved X from #1 to #3") and addition ("+ Added Y")
- User must click "Apply Changes" to commit, or "Cancel" to reject
- Added previewGenerateFromBehavior() and applyGeneratedConfig() to
useSidebarConfig hook
- "No changes needed" shown when sidebar already matches usage
- Auto-dismiss result messages after 3-5 seconds
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Collection Add vs Replace: separate logic
- "Add" button appends collection cards to existing dashboard cards
using onAddCards (same as card catalog add)
- "Replace" button clears all cards and sets collection's card set
using onApplyTemplate (existing behavior)
- TemplateGallerySection now receives separate onAddTemplate and
onReplaceWithTemplate callbacks
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Sidebar "Add more" opens Console Studio at Dashboards section
Instead of opening the old SidebarCustomizer modal, "Add more..."
in the left sidebar now navigates with ?customizeSidebar=true which
triggers Console Studio to open at the Manage Dashboards section.
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Replace emoji icons with Lucide icons in template categories
- TEMPLATE_CATEGORIES: emoji strings → Lucide icon names
(Globe, FolderOpen, Box, Bell, Shield, Cpu, etc.)
- TemplateGallerySection: render icons via getIcon()
- CreateDashboardModal: render category icons via getIcon()
- Consistent with sidebar dashboard icons
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Factory UI restyling: remove tab icons, rounded-md → rounded-lg
- Remove distracting icons from CardFactory tab buttons
- Normalize all rounded-md to rounded-lg across both factory
components (40 instances) matching Console Studio's design
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Add shared SectionLayout wrapper component
Provides consistent structure across Console Studio sections:
description text → scrollable content → optional sticky footer.
Sections can adopt incrementally.
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Comprehensive test coverage for Console Studio
39 tests covering:
- Shared card catalog data (categories, AI suggestions, icons, locale keys)
- CardPreview component
- Navigation data structure (core sections, labels, icons)
- All 6 section components (exports verified)
- DashboardCustomizer, Sidebar, PreviewPanel, AIAssistBar, SectionLayout
- Template data (Lucide icons, required fields)
- AI suggestion engine (7 query types + fallback)
All 47 tests pass (39 new + 8 existing affected tests).
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Fix Add more button, font sizes, factory consistency
- "Add more" in sidebar now opens Console Studio via
useDashboardContext.openAddCardModal() (navigate approach didn't work)
- Eliminate ALL remaining text-2xs across factories, sidebar, preview
(22 instances → text-xs)
- Factory tab labels unified: "Build", "Code", "AI Assist", "Manage"
(was: Declarative/Custom Code/AI Create/AI Generate)
- Both factories now use identical terminology
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Fix factory tab alignment, collection picker UX, card names
- Factory tabs: both Card and Stat factories now render tabs inside
scrollable content area (consistent positioning)
- Collection picker: clicking a collection no longer collapses the
category — stays open for browsing more options
- Collection picker: shows card names (not just count) so users
know what's in each collection
- Collection picker: uses Lucide icons (not emoji) for template icons
- All 39 tests still pass
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Fix all template icons, sidebar width, tab font weight, collection UX
- Replace ALL emoji icons in 58 templates with Lucide icon names
matching the sidebar's canonical icon set
- Widen Studio sidebar from w-48 to w-56 to fit nav labels
- Card Factory tab font: add font-medium to match Stat Factory
- Collection picker: categories stay open after selection
- Collection picker: shows card names (not just count)
- Collection picker: uses Lucide icons for template items
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix 6 code review issues
1. Memory leak: setTimeout cleanup in SidebarCustomizer — store timer
in useRef, clear on unmount. Extract AUTO_DISMISS_MS constants to
module level (was declared 3x inline).
2. Memory leak: setTimeout cleanup in TemplateGallerySection — same
pattern with appliedTimerRef.
3. (i18n hardcoded strings deferred — low risk, follow-up)
4. "Add more" fallback: falls back to SidebarCustomizer when
dashboardContext is unavailable (non-dashboard pages).
5. Export: DashboardPage doesn't have export — removed undefined prop.
Dashboard.tsx already passes the real export handler.
6. Reset activeSection on reopen: useEffect resets to initialSection
or DEFAULT_SECTION when isOpen transitions to true.
7. Cmd+K guard: verified openAddCardModal(true) is already a no-op
when modal is open — React setState with same value skips rerender.
Signed-off-by: Andrew Anderson <[email protected]>
* fix: resolve build errors and address Console Studio known issues
- Fix TS build errors in SidebarCustomizer (missing closeCreateDashboard,
unused openCreateDashboard) that were breaking Netlify deploy preview
- Wire sidebar "Add more" button to open Console Studio with Dashboards
section pre-selected via new studioInitialSection in DashboardContext
- Show current dashboard name in NavigationSection for context
- Fix modal height shifts by always rendering footer (opacity toggle
instead of conditional mount) in DashboardCustomizer and UnifiedCardsSection
- Wrap TemplateGallerySection in flex layout for consistent section structure
- Fix lint error: replace useEffect setState with controlled section state
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Close Studio after adding cards/collections/dashboards
- handleAddCards now calls onClose() after adding
- handleApplyTemplate now calls onClose() after replacing
- Create Dashboard onCreate calls onClose() after creation
- Fix code review issues: setTimeout cleanup, activeSection reset,
Add more fallback
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Add Export Widgets to Console Studio
- Add "Export Widgets" nav item in Console Studio sidebar
- WidgetExportModal gains embedded mode (renders inline without BaseModal)
- Widget export section shows Templates, Cards, and Stats tabs inline
- Gives widgets discoverability — no longer hidden in card context menus
- Card menu "Export as Widget" can open Studio at widgets section (future)
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Card menu "Export as Widget" opens Console Studio
- Card context menu "Export as Widget" now opens Console Studio at
the Widgets section with that card pre-selected
- Added studioWidgetCardType to useDashboardContext for passing
card type from CardWrapper → Dashboard → DashboardCustomizer →
WidgetExportModal
- Falls back to standalone WidgetExportModal when Studio context
is unavailable (e.g., widget page, non-dashboard routes)
- Added 'widgets' to StudioInitialSection type
Signed-off-by: Andrew Anderson <[email protected]>
* ✨ Add reset button to inline FAB actions
The undo/redo bar next to the FAB palette button now also shows a
reset button (red on hover) when the dashboard has been customized.
Users can reset to defaults without opening Console Studio.
Bar shows when any of: canUndo, canRedo, or isCustomized.
Signed-off-by: Andrew Anderson <[email protected]>
* 🐛 Fix drag-to-create-dashboard: make drop target droppable
The "Create New Dashboard" button in the drag drop zone was a plain
button with only onClick — cards could not be dropped on it.
Fix:
- Add DroppableCreateDashboard component with useDroppable() hook
(id: 'create-new-dashboard', data.type: 'create-new-dashboard')
- Add handleDragEnd handler for create-new-dashboard: creates a new
dashboard via createDashboard() and moves the dropped card to it
- Update collision detection to recognize the new droppable target
- Update handleDragOver for visual feedback on hover
- Green highlight when hovering over "Create New Dashboard" with a card
Signed-off-by: Andrew Anderson <[email protected]>
---------
Signed-off-by: Andrew Anderson <[email protected]>
…DME (#8207) Fixes #8207 Addresses all 6 Copilot review comments from PR #8203 (security docs bundle). Verified each claim against source before applying: - Verified InitializeProviders (pkg/agent/registry.go:283) registers only CLI-based tool agents and explicitly excludes API-key HTTP providers (claude/openai/gemini/groq/openrouter/open-webui). - Verified update_checker.go lives in pkg/agent/ (local kc-agent), not in the Go backend server pod. - Verified DEV_MODE is read in cmd/kc-agent/main.go:18 while KC_DEV_MODE=1 is only used in pkg/agent/server_http.go:2202 for the backend-driven agent restart path. Changes: 1. README.md (finding #1): The "security model" paragraph no longer claims users can point an OpenAI-compatible local LLM at kc-agent via GROQ_BASE_URL / OPENROUTER_BASE_URL / OPEN_WEBUI_URL today. Reframed as a planned follow-up; currently supported path is the CLI-based agents. 2. SECURITY-MODEL.md §1 data flow (finding #2): Replaced the single-sentence "Key consequence" block with the two-path distinction (CLI tool agents vs direct HTTP providers). Notes that CLI agents can exfiltrate cluster data indirectly via kubectl/helm tool output; direct HTTP providers are not registered at runtime today. 3. SECURITY-MODEL.md §2 Posture B (finding #3): Rewrote the restricted-egress section to match runtime reality. AI gating is by registered CLI agent availability, not by API-key env vars. Setting *_API_KEY does not by itself enable AI. Settings → API Keys modal documented as non-operative. 4. SECURITY-MODEL.md §1 "leaves the cluster" (finding #5): Corrected the update_checker.go reference. The local kc-agent (not the backend pod) performs any GitHub update polling. In-cluster backend deployments do not poll GitHub from the server pod. 5. SECURITY-MODEL.md §3 Local/Self-hosted LLMs (finding #4): Added a prominent "current registration status" subsection stating that Groq/OpenRouter/Open WebUI provider implementations exist but are NOT registered by InitializeProviders. Relabeled the Ollama / vLLM / LM Studio / internal-gateway recipes as "planned follow-up" (not operative today). Base-URL env vars noted as "parsed, not wired". Retained the mermaid diagrams from PR #8206 and framed them as the intended direction. 6. SECURITY-MODEL.md §4 env var cheat sheet (finding #6): Split the KC_DEV_MODE row into two entries — DEV_MODE (general kc-agent dev/logging toggle, read in cmd/kc-agent/main.go) and KC_DEV_MODE (backend-driven restart/dev path in pkg/agent/server_http.go) — so operators don't set the wrong variable. Docs-only change. web build + lint pass. Signed-off-by: Andy Anderson <[email protected]>
…DME (#8207) (#8223) Fixes #8207 Addresses all 6 Copilot review comments from PR #8203 (security docs bundle). Verified each claim against source before applying: - Verified InitializeProviders (pkg/agent/registry.go:283) registers only CLI-based tool agents and explicitly excludes API-key HTTP providers (claude/openai/gemini/groq/openrouter/open-webui). - Verified update_checker.go lives in pkg/agent/ (local kc-agent), not in the Go backend server pod. - Verified DEV_MODE is read in cmd/kc-agent/main.go:18 while KC_DEV_MODE=1 is only used in pkg/agent/server_http.go:2202 for the backend-driven agent restart path. Changes: 1. README.md (finding #1): The "security model" paragraph no longer claims users can point an OpenAI-compatible local LLM at kc-agent via GROQ_BASE_URL / OPENROUTER_BASE_URL / OPEN_WEBUI_URL today. Reframed as a planned follow-up; currently supported path is the CLI-based agents. 2. SECURITY-MODEL.md §1 data flow (finding #2): Replaced the single-sentence "Key consequence" block with the two-path distinction (CLI tool agents vs direct HTTP providers). Notes that CLI agents can exfiltrate cluster data indirectly via kubectl/helm tool output; direct HTTP providers are not registered at runtime today. 3. SECURITY-MODEL.md §2 Posture B (finding #3): Rewrote the restricted-egress section to match runtime reality. AI gating is by registered CLI agent availability, not by API-key env vars. Setting *_API_KEY does not by itself enable AI. Settings → API Keys modal documented as non-operative. 4. SECURITY-MODEL.md §1 "leaves the cluster" (finding #5): Corrected the update_checker.go reference. The local kc-agent (not the backend pod) performs any GitHub update polling. In-cluster backend deployments do not poll GitHub from the server pod. 5. SECURITY-MODEL.md §3 Local/Self-hosted LLMs (finding #4): Added a prominent "current registration status" subsection stating that Groq/OpenRouter/Open WebUI provider implementations exist but are NOT registered by InitializeProviders. Relabeled the Ollama / vLLM / LM Studio / internal-gateway recipes as "planned follow-up" (not operative today). Base-URL env vars noted as "parsed, not wired". Retained the mermaid diagrams from PR #8206 and framed them as the intended direction. 6. SECURITY-MODEL.md §4 env var cheat sheet (finding #6): Split the KC_DEV_MODE row into two entries — DEV_MODE (general kc-agent dev/logging toggle, read in cmd/kc-agent/main.go) and KC_DEV_MODE (backend-driven restart/dev path in pkg/agent/server_http.go) — so operators don't set the wrong variable. Docs-only change. web build + lint pass. Signed-off-by: Andy Anderson <[email protected]>
PR #8368 hid the misleading Esc/Space hints from the footer, but Copilot review comment #3 on #8360 also pointed out that `BaseModal`'s `enableBackspace` defaults to true — so Space/Backspace would actually still close the modal. That undermines the "sticky on first visit" intent of the intro modal, which wants users to read it before dismissing. Set `enableBackspace={false}` alongside the existing `closeOnEscape={false}` / `closeOnBackdrop={false}` so the modal can only be closed via its explicit Close button or the "Got it — let's go" CTA. Signed-off-by: Andy Anderson <[email protected]>
… (#8382) PR #8368 hid the misleading Esc/Space hints from the footer, but Copilot review comment #3 on #8360 also pointed out that `BaseModal`'s `enableBackspace` defaults to true — so Space/Backspace would actually still close the modal. That undermines the "sticky on first visit" intent of the intro modal, which wants users to read it before dismissing. Set `enableBackspace={false}` alongside the existing `closeOnEscape={false}` / `closeOnBackdrop={false}` so the modal can only be closed via its explicit Close button or the "Got it — let's go" CTA. Signed-off-by: Andy Anderson <[email protected]>
- Issue #1 (FIXED): Cluster name strict-mode violation — added .first() to lines 91-93 - Issue #2 (INVESTIGATING): Filter tabs not rendering in webkit/firefox tests - Issue #3 (INVESTIGATING): Multiple dashboard-page testid elements cause strict-mode - Triggered targeted Clusters.spec.ts run to validate fix - PR #10782 enabled spec_filter workflow capability Co-authored-by: Copilot <[email protected]> Signed-off-by: Copilot <[email protected]>
- Issue kubestellar#1 (FIXED): Cluster name strict-mode violation — added .first() to lines 91-93 - Issue kubestellar#2 (INVESTIGATING): Filter tabs not rendering in webkit/firefox tests - Issue kubestellar#3 (INVESTIGATING): Multiple dashboard-page testid elements cause strict-mode - Triggered targeted Clusters.spec.ts run to validate fix - PR kubestellar#10782 enabled spec_filter workflow capability Co-authored-by: Copilot <[email protected]> Signed-off-by: Copilot <[email protected]> Signed-off-by: lightyagami2109 <[email protected]>
Summary
Access-Control-Allow-Private-Network: trueheader to local agentTest plan
🤖 Generated with Claude Code