2026-02-24 23:41:54 +01:00
|
|
|
import { useMemo } from 'react'
|
2026-04-14 11:55:48 +02:00
|
|
|
import type { AiAgentId, AiAgentsStatus } from '../lib/aiAgents'
|
2026-04-14 14:16:55 +02:00
|
|
|
import type { VaultAiGuidanceStatus } from '../lib/vaultAiGuidance'
|
2026-04-26 04:41:18 +02:00
|
|
|
import type { NoteLayout, SidebarSelection, VaultEntry } from '../types'
|
2026-03-18 03:43:23 +01:00
|
|
|
import type { NoteListFilter } from '../utils/noteListHelpers'
|
2026-02-24 23:41:54 +01:00
|
|
|
import type { ViewMode } from './useViewMode'
|
2026-03-29 22:59:54 +02:00
|
|
|
import { buildNavigationCommands } from './commands/navigationCommands'
|
|
|
|
|
import { buildNoteCommands } from './commands/noteCommands'
|
|
|
|
|
import { buildGitCommands } from './commands/gitCommands'
|
|
|
|
|
import { buildViewCommands } from './commands/viewCommands'
|
|
|
|
|
import { buildSettingsCommands } from './commands/settingsCommands'
|
2026-04-13 19:37:59 +02:00
|
|
|
import { buildAiAgentCommands } from './commands/aiAgentCommands'
|
2026-04-13 22:21:42 +02:00
|
|
|
import { buildTypeCommands } from './commands/typeCommands'
|
2026-03-29 22:59:54 +02:00
|
|
|
import { buildFilterCommands } from './commands/filterCommands'
|
2026-04-13 22:21:42 +02:00
|
|
|
import { extractVaultTypes } from '../utils/vaultTypes'
|
2026-03-29 22:59:54 +02:00
|
|
|
|
|
|
|
|
// Re-export types and helpers for backward compatibility
|
|
|
|
|
export type { CommandAction, CommandGroup } from './commands/types'
|
|
|
|
|
export { groupSortKey } from './commands/types'
|
2026-04-13 22:21:42 +02:00
|
|
|
export { pluralizeType, buildTypeCommands } from './commands/typeCommands'
|
|
|
|
|
export { extractVaultTypes } from '../utils/vaultTypes'
|
2026-03-29 22:59:54 +02:00
|
|
|
export { buildViewCommands } from './commands/viewCommands'
|
2026-02-24 23:41:54 +01:00
|
|
|
|
|
|
|
|
interface CommandRegistryConfig {
|
|
|
|
|
activeTabPath: string | null
|
|
|
|
|
entries: VaultEntry[]
|
|
|
|
|
modifiedCount: number
|
2026-03-17 22:42:55 +01:00
|
|
|
activeNoteHasIcon?: boolean
|
2026-03-04 13:11:58 +01:00
|
|
|
mcpStatus?: string
|
|
|
|
|
onInstallMcp?: () => void
|
2026-04-14 11:55:48 +02:00
|
|
|
aiAgentsStatus?: AiAgentsStatus
|
2026-04-14 14:16:55 +02:00
|
|
|
vaultAiGuidanceStatus?: VaultAiGuidanceStatus
|
2026-04-13 19:37:59 +02:00
|
|
|
onOpenAiAgents?: () => void
|
2026-04-14 14:16:55 +02:00
|
|
|
onRestoreVaultAiGuidance?: () => void
|
2026-04-14 11:55:48 +02:00
|
|
|
onSetDefaultAiAgent?: (agent: AiAgentId) => void
|
|
|
|
|
selectedAiAgent?: AiAgentId
|
2026-04-13 19:37:59 +02:00
|
|
|
onCycleDefaultAiAgent?: () => void
|
|
|
|
|
selectedAiAgentLabel?: string
|
2026-03-09 00:35:21 +01:00
|
|
|
onReloadVault?: () => void
|
2026-03-07 12:39:55 +01:00
|
|
|
onRepairVault?: () => void
|
2026-03-17 22:42:55 +01:00
|
|
|
onSetNoteIcon?: () => void
|
|
|
|
|
onRemoveNoteIcon?: () => void
|
2026-04-22 23:56:00 +02:00
|
|
|
onChangeNoteType?: () => void
|
|
|
|
|
onMoveNoteToFolder?: () => void
|
|
|
|
|
canMoveNoteToFolder?: boolean
|
2026-03-19 08:47:25 +01:00
|
|
|
onOpenInNewWindow?: () => void
|
2026-04-03 17:20:33 +02:00
|
|
|
onToggleFavorite?: (path: string) => void
|
2026-04-04 20:54:16 +02:00
|
|
|
onToggleOrganized?: (path: string) => void
|
2026-04-16 02:18:43 +02:00
|
|
|
onCustomizeNoteListColumns?: () => void
|
|
|
|
|
canCustomizeNoteListColumns?: boolean
|
2026-04-18 20:31:25 +02:00
|
|
|
noteListColumnsLabel?: string
|
2026-04-07 20:09:04 +02:00
|
|
|
onRestoreDeletedNote?: () => void
|
|
|
|
|
canRestoreDeletedNote?: boolean
|
2026-02-24 23:41:54 +01:00
|
|
|
onQuickOpen: () => void
|
|
|
|
|
onCreateNote: () => void
|
2026-02-28 19:13:29 +01:00
|
|
|
onCreateNoteOfType: (type: string) => void
|
2026-02-24 23:41:54 +01:00
|
|
|
onSave: () => void
|
|
|
|
|
onOpenSettings: () => void
|
2026-04-10 12:45:37 +02:00
|
|
|
onOpenFeedback?: () => void
|
2026-03-01 16:04:51 +01:00
|
|
|
onOpenVault?: () => void
|
2026-04-19 01:06:40 +02:00
|
|
|
onCreateEmptyVault?: () => void
|
2026-04-19 16:18:35 +02:00
|
|
|
onAddRemote?: () => void
|
|
|
|
|
canAddRemote?: boolean
|
2026-03-03 00:31:10 +01:00
|
|
|
onCreateType?: () => void
|
2026-04-06 12:21:56 +02:00
|
|
|
onDeleteNote: (path: string) => void
|
2026-02-24 23:41:54 +01:00
|
|
|
onArchiveNote: (path: string) => void
|
|
|
|
|
onUnarchiveNote: (path: string) => void
|
|
|
|
|
onCommitPush: () => void
|
2026-03-19 09:51:06 +01:00
|
|
|
onPull?: () => void
|
2026-03-03 02:27:42 +01:00
|
|
|
onResolveConflicts?: () => void
|
2026-02-24 23:41:54 +01:00
|
|
|
onSetViewMode: (mode: ViewMode) => void
|
|
|
|
|
onToggleInspector: () => void
|
2026-03-03 02:00:48 +01:00
|
|
|
onToggleDiff?: () => void
|
2026-03-02 18:38:25 +01:00
|
|
|
onToggleRawEditor?: () => void
|
2026-04-26 04:41:18 +02:00
|
|
|
noteLayout?: NoteLayout
|
|
|
|
|
onToggleNoteLayout?: () => void
|
2026-03-02 05:00:29 +01:00
|
|
|
onToggleAIChat?: () => void
|
2026-03-03 02:00:48 +01:00
|
|
|
activeNoteModified: boolean
|
2026-03-02 23:48:01 +01:00
|
|
|
onCheckForUpdates?: () => void
|
2026-02-28 12:41:57 +01:00
|
|
|
onZoomIn: () => void
|
|
|
|
|
onZoomOut: () => void
|
|
|
|
|
onZoomReset: () => void
|
|
|
|
|
zoomLevel: number
|
2026-02-24 23:41:54 +01:00
|
|
|
onSelect: (sel: SidebarSelection) => void
|
2026-04-22 17:16:56 +02:00
|
|
|
onRenameFolder?: () => void
|
|
|
|
|
onDeleteFolder?: () => void
|
2026-04-10 13:52:39 +02:00
|
|
|
showInbox?: boolean
|
2026-02-25 19:39:12 +01:00
|
|
|
onGoBack?: () => void
|
|
|
|
|
onGoForward?: () => void
|
|
|
|
|
canGoBack?: boolean
|
|
|
|
|
canGoForward?: boolean
|
2026-03-03 02:26:41 +01:00
|
|
|
onRemoveActiveVault?: () => void
|
|
|
|
|
onRestoreGettingStarted?: () => void
|
|
|
|
|
isGettingStartedHidden?: boolean
|
|
|
|
|
vaultCount?: number
|
2026-03-18 03:43:23 +01:00
|
|
|
selection?: SidebarSelection
|
|
|
|
|
noteListFilter?: NoteListFilter
|
|
|
|
|
onSetNoteListFilter?: (filter: NoteListFilter) => void
|
2026-02-24 23:41:54 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-29 22:59:54 +02:00
|
|
|
export function useCommandRegistry(config: CommandRegistryConfig): import('./commands/types').CommandAction[] {
|
2026-02-24 23:41:54 +01:00
|
|
|
const {
|
2026-03-05 18:18:52 +01:00
|
|
|
activeTabPath, entries, modifiedCount,
|
2026-04-10 12:45:37 +02:00
|
|
|
onQuickOpen, onCreateNote, onCreateNoteOfType, onSave, onOpenSettings, onOpenFeedback,
|
2026-04-06 12:21:56 +02:00
|
|
|
onDeleteNote, onArchiveNote, onUnarchiveNote,
|
2026-04-26 04:41:18 +02:00
|
|
|
onCommitPush, onPull, onResolveConflicts, onSetViewMode, onToggleInspector, onToggleDiff, onToggleRawEditor, noteLayout, onToggleNoteLayout, onToggleAIChat, onOpenVault, onCreateEmptyVault,
|
2026-03-03 02:00:48 +01:00
|
|
|
activeNoteModified,
|
2026-02-28 12:41:57 +01:00
|
|
|
onZoomIn, onZoomOut, onZoomReset, zoomLevel,
|
2026-04-22 17:16:56 +02:00
|
|
|
onSelect, onRenameFolder, onDeleteFolder,
|
2026-04-10 13:52:39 +02:00
|
|
|
showInbox,
|
2026-02-25 19:39:12 +01:00
|
|
|
onGoBack, onGoForward, canGoBack, canGoForward,
|
2026-03-29 22:59:54 +02:00
|
|
|
onCheckForUpdates, onCreateType,
|
refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.
Editor styling via theme.json/EditorTheme.css is preserved (not user theming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
|
|
|
onRemoveActiveVault, onRestoreGettingStarted, isGettingStartedHidden, vaultCount,
|
2026-04-14 14:16:55 +02:00
|
|
|
mcpStatus, onInstallMcp, aiAgentsStatus, vaultAiGuidanceStatus,
|
|
|
|
|
onOpenAiAgents, onRestoreVaultAiGuidance, onSetDefaultAiAgent, selectedAiAgent, onCycleDefaultAiAgent, selectedAiAgentLabel,
|
2026-03-29 22:59:54 +02:00
|
|
|
onReloadVault, onRepairVault,
|
2026-04-22 23:56:00 +02:00
|
|
|
onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon, onChangeNoteType, onMoveNoteToFolder, canMoveNoteToFolder,
|
2026-04-04 20:54:16 +02:00
|
|
|
onOpenInNewWindow, onToggleFavorite, onToggleOrganized,
|
2026-04-16 02:18:43 +02:00
|
|
|
onCustomizeNoteListColumns, canCustomizeNoteListColumns,
|
2026-04-07 20:09:04 +02:00
|
|
|
onRestoreDeletedNote, canRestoreDeletedNote,
|
2026-03-18 03:43:23 +01:00
|
|
|
selection, noteListFilter, onSetNoteListFilter,
|
2026-02-24 23:41:54 +01:00
|
|
|
} = config
|
|
|
|
|
|
|
|
|
|
const hasActiveNote = activeTabPath !== null
|
|
|
|
|
|
|
|
|
|
const activeEntry = useMemo(
|
|
|
|
|
() => (hasActiveNote ? entries.find(e => e.path === activeTabPath) : undefined),
|
|
|
|
|
[entries, activeTabPath, hasActiveNote],
|
|
|
|
|
)
|
|
|
|
|
const isArchived = activeEntry?.archived ?? false
|
2026-04-03 17:20:33 +02:00
|
|
|
const isFavorite = activeEntry?.favorite ?? false
|
2026-03-29 22:59:54 +02:00
|
|
|
const isSectionGroup = selection?.kind === 'sectionGroup'
|
2026-04-18 20:31:25 +02:00
|
|
|
const noteListColumnsLabel = config.noteListColumnsLabel ?? (
|
|
|
|
|
selection?.kind === 'filter' && selection.filter === 'all'
|
|
|
|
|
? 'Customize All Notes columns'
|
|
|
|
|
: 'Customize Inbox columns'
|
|
|
|
|
)
|
2026-02-24 23:41:54 +01:00
|
|
|
|
2026-02-28 19:13:29 +01:00
|
|
|
const vaultTypes = useMemo(() => extractVaultTypes(entries), [entries])
|
|
|
|
|
|
2026-03-29 22:59:54 +02:00
|
|
|
return useMemo(() => [
|
2026-04-22 17:16:56 +02:00
|
|
|
...buildNavigationCommands({
|
|
|
|
|
onQuickOpen,
|
|
|
|
|
onSelect,
|
|
|
|
|
selection,
|
|
|
|
|
onRenameFolder,
|
|
|
|
|
onDeleteFolder,
|
|
|
|
|
showInbox,
|
|
|
|
|
onGoBack,
|
|
|
|
|
onGoForward,
|
|
|
|
|
canGoBack,
|
|
|
|
|
canGoForward,
|
|
|
|
|
}),
|
2026-03-29 22:59:54 +02:00
|
|
|
...buildNoteCommands({
|
2026-04-06 12:21:56 +02:00
|
|
|
hasActiveNote, activeTabPath, isArchived,
|
2026-04-12 23:14:03 +02:00
|
|
|
onCreateNote, onCreateType, onSave,
|
2026-04-06 12:21:56 +02:00
|
|
|
onDeleteNote, onArchiveNote, onUnarchiveNote,
|
2026-04-22 23:56:00 +02:00
|
|
|
onChangeNoteType, onMoveNoteToFolder, canMoveNoteToFolder,
|
2026-04-06 12:21:56 +02:00
|
|
|
onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon, onOpenInNewWindow, onToggleFavorite, isFavorite,
|
2026-04-04 20:54:16 +02:00
|
|
|
onToggleOrganized, isOrganized: activeEntry?.organized ?? false,
|
2026-04-07 20:09:04 +02:00
|
|
|
onRestoreDeletedNote, canRestoreDeletedNote,
|
2026-03-29 22:59:54 +02:00
|
|
|
}),
|
2026-04-19 16:18:35 +02:00
|
|
|
...buildGitCommands({
|
|
|
|
|
modifiedCount,
|
|
|
|
|
canAddRemote: config.canAddRemote ?? false,
|
|
|
|
|
onAddRemote: config.onAddRemote,
|
|
|
|
|
onCommitPush,
|
|
|
|
|
onPull,
|
|
|
|
|
onResolveConflicts,
|
|
|
|
|
onSelect,
|
|
|
|
|
}),
|
2026-03-29 22:59:54 +02:00
|
|
|
...buildViewCommands({
|
|
|
|
|
hasActiveNote, activeNoteModified, onSetViewMode, onToggleInspector,
|
2026-04-26 04:41:18 +02:00
|
|
|
onToggleDiff, onToggleRawEditor, noteLayout, onToggleNoteLayout, onToggleAIChat, zoomLevel, onZoomIn, onZoomOut, onZoomReset,
|
2026-04-16 02:18:43 +02:00
|
|
|
onCustomizeNoteListColumns, canCustomizeNoteListColumns, noteListColumnsLabel,
|
2026-03-29 22:59:54 +02:00
|
|
|
}),
|
|
|
|
|
...buildSettingsCommands({
|
|
|
|
|
mcpStatus, vaultCount, isGettingStartedHidden,
|
2026-04-19 01:06:40 +02:00
|
|
|
onOpenSettings, onOpenFeedback, onOpenVault, onCreateEmptyVault, onRemoveActiveVault, onRestoreGettingStarted,
|
2026-03-29 22:59:54 +02:00
|
|
|
onCheckForUpdates, onInstallMcp, onReloadVault, onRepairVault,
|
|
|
|
|
}),
|
2026-04-13 19:37:59 +02:00
|
|
|
...buildAiAgentCommands({
|
2026-04-14 11:55:48 +02:00
|
|
|
aiAgentsStatus,
|
2026-04-14 14:16:55 +02:00
|
|
|
vaultAiGuidanceStatus,
|
2026-04-14 11:55:48 +02:00
|
|
|
selectedAiAgent,
|
2026-04-13 19:37:59 +02:00
|
|
|
selectedAiAgentLabel,
|
|
|
|
|
onOpenAiAgents,
|
2026-04-14 14:16:55 +02:00
|
|
|
onRestoreVaultAiGuidance,
|
2026-04-14 11:55:48 +02:00
|
|
|
onSetDefaultAiAgent,
|
2026-04-13 19:37:59 +02:00
|
|
|
onCycleDefaultAiAgent,
|
|
|
|
|
}),
|
2026-03-29 22:59:54 +02:00
|
|
|
...buildTypeCommands(vaultTypes, onCreateNoteOfType, onSelect),
|
|
|
|
|
...buildFilterCommands({ isSectionGroup, noteListFilter, onSetNoteListFilter }),
|
|
|
|
|
], [
|
2026-04-06 12:21:56 +02:00
|
|
|
hasActiveNote, activeTabPath, isArchived, modifiedCount, activeNoteModified,
|
2026-04-10 12:45:37 +02:00
|
|
|
onQuickOpen, onCreateNote, onCreateNoteOfType, onCreateType, onSave, onOpenSettings, onOpenFeedback,
|
2026-04-06 12:21:56 +02:00
|
|
|
onDeleteNote, onArchiveNote, onUnarchiveNote,
|
2026-04-26 04:41:18 +02:00
|
|
|
onCommitPush, onPull, onResolveConflicts, onSetViewMode, onToggleInspector, onToggleDiff, onToggleRawEditor, noteLayout, onToggleNoteLayout, onToggleAIChat, onOpenVault, onCreateEmptyVault, config.canAddRemote, config.onAddRemote,
|
2026-03-03 16:46:47 +01:00
|
|
|
onCheckForUpdates,
|
2026-02-28 12:41:57 +01:00
|
|
|
onZoomIn, onZoomOut, onZoomReset, zoomLevel,
|
2026-04-22 17:16:56 +02:00
|
|
|
onSelect, onRenameFolder, onDeleteFolder,
|
2026-04-10 13:52:39 +02:00
|
|
|
showInbox,
|
2026-02-25 19:39:12 +01:00
|
|
|
onGoBack, onGoForward, canGoBack, canGoForward,
|
refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.
Editor styling via theme.json/EditorTheme.css is preserved (not user theming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
|
|
|
vaultTypes,
|
2026-03-03 02:48:10 +01:00
|
|
|
onRemoveActiveVault, onRestoreGettingStarted, isGettingStartedHidden, vaultCount,
|
2026-04-14 14:16:55 +02:00
|
|
|
mcpStatus, onInstallMcp, aiAgentsStatus, vaultAiGuidanceStatus,
|
|
|
|
|
onOpenAiAgents, onRestoreVaultAiGuidance, onSetDefaultAiAgent, selectedAiAgent, onCycleDefaultAiAgent, selectedAiAgentLabel,
|
refactor: remove QMD semantic indexing — keep keyword search only
Remove the entire QMD search engine (semantic indexing, hybrid search,
vector embeddings) and replace with a simple walkdir-based keyword
search. QMD never worked reliably in production, added bundle bloat,
and showed "Index failed" in the status bar.
What changed:
- Rust: deleted indexing.rs, rewrote search.rs as pure keyword search
- Frontend: removed useIndexing hook, IndexingBadge, hybrid search
- Menu: removed "Reindex Vault" command from palette and menu bar
- Config: removed qmd from bundle resources and build script
- Deleted tools/qmd/ (QMD CLI tool, MCP server, tests)
- Updated docs (ARCHITECTURE, ABSTRACTIONS, GETTING-STARTED)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 16:18:05 +01:00
|
|
|
onReloadVault, onRepairVault,
|
2026-04-22 23:56:00 +02:00
|
|
|
onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon, onChangeNoteType, onMoveNoteToFolder, canMoveNoteToFolder,
|
2026-03-18 03:43:23 +01:00
|
|
|
isSectionGroup, noteListFilter, onSetNoteListFilter,
|
2026-04-22 17:16:56 +02:00
|
|
|
selection,
|
2026-04-03 17:20:33 +02:00
|
|
|
onOpenInNewWindow, onToggleFavorite, isFavorite,
|
2026-04-16 02:18:43 +02:00
|
|
|
onToggleOrganized, onCustomizeNoteListColumns, canCustomizeNoteListColumns, noteListColumnsLabel,
|
2026-04-07 20:31:08 +02:00
|
|
|
onRestoreDeletedNote, canRestoreDeletedNote, activeEntry,
|
2026-02-24 23:41:54 +01:00
|
|
|
])
|
|
|
|
|
}
|