Instead of immediately returning empty results for Unknown-state servers
and refreshing in the background, wait up to 5 seconds for the server to
become live on the first list call. Subsequent calls find the already-
resolved promise in _startupGrace and return immediately, so only the
first message pays the startup cost.
- _waitForStartup: races _ensureServerReady against the configurable
grace period (default 5 000 ms); result is cached per server
- _shouldUseCachedData: awaits the grace period for Unknown servers,
falls back to background-refresh for Outdated servers
- _listTools: refactored to Promise.all to parallelise per-server waits
- Tests: updated 'starts server when cache state is unknown' to assert
tools are returned after the grace period; added new test for the
timeout path using createNeverStartingServer
* add hook for sessions selfhosting
* Fix section selection, list refresh, commit guard, hooks display, count races
- selectSectionById: inline all state updates to avoid race with onDidChangeSelection
- goBackToList: refresh list to show newly created files
- goBackToList: only auto-commit if editor content was actually modified
- Hooks: parse individual hooks from files, show hook type labels and commands
- Hooks: show (unset) for empty hook commands
- Toolbar: use MODAL_GROUP when opening editor in sessions
- Overview: use MODAL_GROUP when opening editor in sessions
- Toolbar: add _updateCountsRequestId guard to prevent stale count renders
- SessionsViewPane: subscribe to activeProjectRoot for total count updates
- List widget: add IFileService + IPathService for hook file parsing
* Fix hook parsing: use JSONC parser and async userHome
- Replace JSON.parse with parseJSONC to handle comments/trailing commas
- Use await pathService.userHome() instead of preferLocal for remote compat
- Match the pattern used in promptsServiceImpl.ts getHooks()
* Refactor: unified IStorageSourceFilter replaces per-field filtering APIs
Replace visibleStorageSources, getVisibleStorageSources(type), and
excludedUserFileRoots with a single getStorageSourceFilter(type)
returning IStorageSourceFilter with sources and includedUserFileRoots.
- New IStorageSourceFilter interface with allowlist-based user root filtering
- Shared applyStorageSourceFilter helper for list widget and counts
- Sessions: hooks=workspace-only, prompts=all roots, others=CLI roots
- AgenticPromptsService.getSourceFolders override for creation targeting
- Remove chat.customizationsMenu.userStoragePath setting
- Simplify resolveUserTargetDirectory to pure getSourceFolders delegate
- Update all consumer call sites and tests
* Fix sidebar/editor count mismatch and rename preferManualCreation
Count functions now use the same data sources as loadItems():
- Agents: getCustomAgents() instead of listPromptFilesForStorage
- Skills: findAgentSkills()
- Prompts: getPromptSlashCommands() filtering out skills
- Instructions: listPromptFiles() + listAgentInstructions()
- Hooks: listPromptFiles()
Rename preferManualCreation to isSessionsWindow for clarity.
Add 50 tests for applyStorageSourceFilter and customizationCounts.
* Add Developer: Customizations Debug command and fix hooks.json
- Debug command opens untitled editor with full pipeline diagnostics
- Rename 'Open Chat Customizations (Preview)' to 'Open Customizations (Preview)'
- Fix hooks.json: add version field, use bash instead of command
- Derive hook events from COPILOT_CLI_HOOK_TYPE_MAP schema automatically
* Update AI_CUSTOMIZATIONS.md spec
- Document IStorageSourceFilter, AgenticPromptsService, count consistency
- Add debug panel section and updated file structure
- Reflect isSessionsWindow rename
* Remove verbose debug logs from list widget
The Developer: Customizations Debug command provides better diagnostics.
Remove noisy info-level logs that dump every item URI on every load.
* Code review fixes: cache copilotRoot, remove dead getter, fix JSDoc
* Add AI customizations manual test plan with 5 scenarios