Skip to content

🐛 Add Private Network Access CORS header for localhost#3

Merged
clubanderson merged 3 commits intomainfrom
playwright-test-fixes
Jan 16, 2026
Merged

🐛 Add Private Network Access CORS header for localhost#3
clubanderson merged 3 commits intomainfrom
playwright-test-fixes

Conversation

@clubanderson
Copy link
Copy Markdown
Collaborator

Summary

  • Adds Access-Control-Allow-Private-Network: true header to local agent
  • Allows cluster-deployed console (HTTPS) to connect to local agent (HTTP localhost)
  • Required for Chrome's Private Network Access security feature

Test plan

  • Deploy console to cluster
  • Run local kkc-agent
  • Verify cluster console can connect to local agent

🤖 Generated with Claude Code

clubanderson and others added 3 commits January 16, 2026 04:17
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]>
@kubestellar-prow kubestellar-prow Bot added the dco-signoff: yes Indicates the PR's author has signed the DCO. label Jan 16, 2026
@github-actions
Copy link
Copy Markdown
Contributor

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 git commit -s to certify the Developer Certificate of Origin

PR Title - Must start with an emoji: ✨ (feature), 🐛 (bug fix), 📖 (docs), 🌱 (infra/tests), ⚠️ (breaking change)

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!

@clubanderson
Copy link
Copy Markdown
Collaborator Author

/lgtm

@clubanderson
Copy link
Copy Markdown
Collaborator Author

/approve

@kubestellar-prow
Copy link
Copy Markdown
Contributor

@clubanderson: you cannot LGTM your own PR.

Details

In response to this:

/lgtm

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.

@clubanderson clubanderson merged commit afdef81 into main Jan 16, 2026
8 checks passed
@kubestellar-prow
Copy link
Copy Markdown
Contributor

[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

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@kubestellar-prow kubestellar-prow Bot deleted the playwright-test-fixes branch January 16, 2026 09:23
@kubestellar-prow kubestellar-prow Bot added approved Indicates a PR has been approved by an approver from all required OWNERS files. size/M Denotes a PR that changes 30-99 lines, ignoring generated files. labels Jan 16, 2026
@github-actions
Copy link
Copy Markdown
Contributor

🎉 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!

aaradhychinche-alt added a commit to aaradhychinche-alt/console that referenced this pull request Feb 20, 2026
…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]>
clubanderson added a commit that referenced this pull request Mar 6, 2026
- 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]>
clubanderson added a commit that referenced this pull request Mar 6, 2026
- 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]>
Copilot AI added a commit that referenced this pull request Mar 25, 2026
- 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
clubanderson added a commit that referenced this pull request Apr 3, 2026
- 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]>
Copilot AI added a commit that referenced this pull request Apr 5, 2026
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]>
clubanderson added a commit that referenced this pull request Apr 6, 2026
- 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]>
clubanderson added a commit that referenced this pull request Apr 7, 2026
* ✨ 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]>
clubanderson added a commit that referenced this pull request Apr 15, 2026
…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]>
clubanderson added a commit that referenced this pull request Apr 15, 2026
…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]>
clubanderson added a commit that referenced this pull request Apr 16, 2026
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]>
clubanderson added a commit that referenced this pull request Apr 16, 2026
… (#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]>
clubanderson pushed a commit that referenced this pull request Apr 28, 2026
- 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]>
lightyagami2109 pushed a commit to lightyagami2109/kubestellar_console_OJT that referenced this pull request May 3, 2026
- 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]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. dco-signoff: yes Indicates the PR's author has signed the DCO. size/M Denotes a PR that changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant