Commit Graph
100 Commits
Author SHA1 Message Date
mirivlad f4e911c14a build: add Windows desktop test bundle 2026-07-13 21:46:48 +08:00
mirivlad 47a8d565e8 build: publish desktop releases to GitHub 2026-07-13 05:01:34 +08:00
mirivlad 581e6b27d8 docs: document public alpha setup 2026-07-13 03:57:58 +08:00
mirivlad ca5290015a build: guard desktop release prerequisites 2026-07-12 21:38:24 +08:00
mirivlad ad0c00bade docs: prepare desktop alpha release 2026-07-12 21:21:45 +08:00
mirivlad 4db5a7a132 feat: show plugin diagnostics only in debug mode 2026-07-12 21:18:09 +08:00
mirivlad c567b229cc feat: scope overview to durable activity data 2026-07-12 21:11:53 +08:00
mirivlad 5a249dcf24 feat: persist handled activity session watermarks 2026-07-12 20:48:57 +08:00
mirivlad 6b556c59d9 feat: scope activity and browser links by durable workspace 2026-07-12 20:39:03 +08:00
mirivlad fca9fff4b4 feat: retain archived browser inbox captures 2026-07-12 17:43:12 +08:00
mirivlad bcf49ed32c feat: persist passive browser activity batches 2026-07-12 17:29:07 +08:00
mirivlad 39052ffe39 feat: add canonical hostname normalization 2026-07-12 17:16:53 +08:00
mirivlad e1a6b2af64 feat: publish workspace trash lifecycle 2026-07-12 17:11:00 +08:00
mirivlad 5280d245ee feat: add durable workspace identities 2026-07-12 17:06:34 +08:00
mirivlad 477b372110 fix: persist browser captures atomically 2026-07-11 23:30:38 +08:00
mirivlad c129c1a2ac fix: preserve plugin contribution label contract 2026-07-11 12:56:17 +08:00
mirivlad 7f0cc308c2 feat: add Russian desktop localization 2026-07-11 12:50:00 +08:00
mirivlad 8b1151e03a feat: load declared plugin locale catalogs 2026-07-11 02:02:47 +08:00
mirivlad 15f1f413d0 feat: persist desktop language preference 2026-07-11 02:00:10 +08:00
mirivlad e412cfc45a feat: add workspace templates and tab visibility 2026-07-10 21:32:48 +08:00
mirivlad 2007b909d1 feat: integrate todo plugin into desktop workspace 2026-07-10 21:09:02 +08:00
mirivlad 8dafde4519 feat: scope overview browser captures by workspace 2026-07-10 20:27:58 +08:00
mirivlad 1d1eaa6bc7 feat: cover global trash workflow in desktop 2026-07-10 09:00:14 +08:00
mirivlad 3f27ba79a4 feat: bridge permanent trash deletion to plugins 2026-07-10 08:35:46 +08:00
mirivlad 8445ea11db feat: support permanent vault trash deletion 2026-07-10 08:31:20 +08:00
mirivlad e5f5d4d33f feat: route work session candidates to journal 2026-07-10 08:21:11 +08:00
mirivlad b056016929 feat: refine workspace overview 2026-07-10 07:46:18 +08:00
mirivlad a323710a6f fix: resolve plugin lifecycle dependencies deterministically 2026-07-10 04:03:08 +08:00
mirivlad 0f293640f9 feat: require paired browser receiver 2026-07-10 03:37:12 +08:00
mirivlad 89c261824f fix: bound browser capture ingress 2026-07-10 03:29:51 +08:00
mirivlad 18da09e06b fix: bind sync state to active vault 2026-07-10 03:13:04 +08:00
mirivlad b845e8b5e2 feat: replace Today workspace surface with Overview 2026-07-10 02:36:00 +08:00
mirivlad 5b4c792de5 Polish desktop workbench UI 2026-07-02 00:49:29 +08:00
mirivlad 12b1e5a496 Cover Files action icon states 2026-07-01 19:20:41 +08:00
mirivlad a540da707d Cover Files no-match filter feedback 2026-07-01 19:07:06 +08:00
mirivlad 74c627f706 Cover Files rename conflict feedback 2026-07-01 18:58:31 +08:00
mirivlad 029bb7a1a8 Cover Files empty folder actions 2026-07-01 18:49:51 +08:00
mirivlad d2a07baf82 Cover Files rich file icons 2026-07-01 18:34:51 +08:00
mirivlad 3c54ef55c9 Cover Files inline create validation 2026-07-01 18:24:55 +08:00
mirivlad 3b0cd2e429 Cover Files trash restore flow 2026-07-01 08:47:19 +08:00
mirivlad 501d7a76d0 Use in-app Files trash confirmation in mock 2026-07-01 08:25:57 +08:00
mirivlad 05bfe1d993 Cover Files breadcrumb segment navigation 2026-07-01 08:17:45 +08:00
mirivlad 03dbede414 Cover Files duplicate context action 2026-07-01 08:09:28 +08:00
mirivlad 5c47ca2480 Cover Files inline rename validation 2026-07-01 07:59:36 +08:00
mirivlad 167d593245 Revert "fix: P1 shell tooltip fixes + Today routing + workspaces API"
This reverts commit 9d06b164d3.
2026-07-01 07:44:28 +08:00
mirivlad 9d06b164d3 fix: P1 shell tooltip fixes + Today routing + workspaces API
Shell:
- WorkspaceHost: change tooltip from pluginId to human-readable title
- StatusBar: replace pluginId tooltips with label or id (3 occurrences)
- App: startup routing to Today view, sidebar Today nav item
- Sidebar: add Today button in Overview section
- TodaySurface: separate global vs workspace data (no fallthrough)

Plugin API:
- Add workspaces.list() method wrapping App.ListWorkspaces()
  (needed by browser-inbox workspace picker)
2026-07-01 04:15:35 +08:00
mirivlad b0d80e230f Cover Files keyboard row selection 2026-07-01 03:18:27 +08:00
mirivlad d3dfa2d652 Add plugin manager scan summary 2026-07-01 03:08:18 +08:00
mirivlad 67468e92f7 Improve Today workspace resume surface 2026-07-01 02:56:50 +08:00
mirivlad 80e53ff252 Improve workspace search and responsive shell 2026-07-01 02:46:40 +08:00
mirivlad 578ce2f2a5 Fix global search result navigation 2026-06-30 22:43:09 +08:00
mirivlad b28039cf0d Fix global search folder navigation 2026-06-30 20:57:58 +08:00
mirivlad 46f754cc2d feat: workspace routing, GlobalSearch, and shell refinements
- Add workspace-aware startup routing (openDefaultWorkspaceRoute)
- Add GlobalSearch component and workspace-empty state
- Refactor Sidebar, StatusBar, WorkspaceTree, VaultSelection
- Update PluginCard/PluginManager UI
- Extend e2e coverage (ux-p0, ux-followup, helpers)
- Add ListWorkspaces/SetCurrentWorkspace backend bindings
2026-06-30 12:32:04 +08:00
mirivlad 4bb9e84c35 feat: harden secret unlock and deletion 2026-06-29 21:42:10 +08:00
mirivlad 63c2c1314f test: cover secret workbench resources 2026-06-29 20:45:03 +08:00
mirivlad 56c685212b feat: expose scoped secret store API 2026-06-29 20:36:45 +08:00
mirivlad 7a7b3c7a3e feat: add encrypted local secret store 2026-06-29 20:12:59 +08:00
mirivlad 2cbf542b13 feat: require token for paired browser receiver 2026-06-29 04:52:19 +08:00
mirivlad 7363313f1e feat: expose plugin data storage bridge 2026-06-29 04:27:22 +08:00
mirivlad 874b7c7ffb feat: add workspace header search slot 2026-06-29 04:24:15 +08:00
mirivlad 8f6559cdb6 docs: define sync conflict contract 2026-06-29 03:38:03 +08:00
mirivlad 9f3448c1ea feat: retry transient sync requests 2026-06-29 03:30:10 +08:00
mirivlad 04ce8c5bf3 fix: preserve sync error status 2026-06-29 03:23:45 +08:00
mirivlad 57677d1b1b feat: add bounded file byte reads 2026-06-29 03:16:16 +08:00
mirivlad aa4905a097 docs: document live file watcher 2026-06-28 23:00:32 +08:00
mirivlad 1d521251a2 feat: watch vault file changes 2026-06-28 22:53:27 +08:00
mirivlad 5a74809ab7 docs: document file trash restore API 2026-06-28 22:23:42 +08:00
mirivlad cc0c050985 feat: restore files from trash 2026-06-28 22:18:44 +08:00
mirivlad e5bdaec0aa feat: expose file trash metadata 2026-06-28 17:03:12 +08:00
mirivlad ed4b117a94 docs: update runtime contribution APIs 2026-06-28 16:42:02 +08:00
mirivlad d46bc9436d feat: publish workspace lifecycle events 2026-06-28 16:34:03 +08:00
mirivlad 1f1001108b feat: expose action contributions to plugins 2026-06-28 16:28:33 +08:00
mirivlad 9729b432d6 feat: host activity providers 2026-06-28 16:14:59 +08:00
mirivlad 93597a2c45 Tag browser captures with current workspace 2026-06-28 04:00:50 +08:00
mirivlad 6d30015a1d Move global plugin navigation into shell 2026-06-28 03:22:54 +08:00
mirivlad 0c788bed80 Expose search provider contributions 2026-06-28 01:03:36 +08:00
mirivlad 35012025b6 Add sync reset key bridge 2026-06-27 18:46:05 +08:00
mirivlad a2791c494f Add browser inbox receiver 2026-06-27 18:39:01 +08:00
mirivlad fb68c54409 Route open providers by request mode 2026-06-27 13:49:09 +08:00
mirivlad f87f8235bd Expand real sync smoke for folders 2026-06-27 13:39:48 +08:00
mirivlad 173cc93258 Add public external file open API 2026-06-27 13:30:31 +08:00
mirivlad 6cc37972d1 Add status bar contribution host 2026-06-27 13:21:22 +08:00
mirivlad 7630a31286 Add command palette host 2026-06-27 13:13:15 +08:00
mirivlad 1fb9db73ec Update completed files milestone docs 2026-06-27 12:51:08 +08:00
mirivlad 28a4e10e79 Remove core notes service 2026-06-27 12:44:02 +08:00
mirivlad 24444a8588 Refine v2 plugin API and sync flow 2026-06-27 12:36:31 +08:00
mirivlad 03175aa46d feat: Notes core service + Notes API + router auto-detect notes context
- Add internal/core/notes/ service (Service, Layout, Normalize, tests)
- Register verstak/core/notes/v1 capability
- Inject NotesService into App, expose 8 Notes API endpoints
  (CreateNote, RenameNote, ReadNote, SaveNote, EnsureOverview,
   ListNotes, SearchNotes, NormalizeNoteTitle)
- Router: auto-detect Notes context via path (IsInsideNotes)
- PluginCard: show workspaceItems contribution count
- Regenerate Wails bindings (App.d.ts, App.js, models.ts with notes.NoteInfo)
- Fix .gitignore pattern for e2e-results/
2026-06-21 23:22:36 +08:00
mirivlad 0b6b0d0926 fix: workbench 'back' blocked, workspace breadcrumb-up only when btn active
- onNavigateBack/Forward now skip entirely when currentView === 'workbench'
  (user relies on close button, not mouse back)
- onNavigateBack inside workspace checks upBtn.disabled before clicking —
  in root folder (no currentPath) button exists but disabled, so navigateBack
  falls through to navigationStack for cross-view navigation
- mouseHistoryDirection and keyHistoryDirection also block 'workbench' to
  prevent bypass via pointerdown/mousedown listeners
2026-06-21 16:25:45 +08:00
mirivlad b4e66c9779 fix: mouse navigation — redirect workspace back/forward to Files buttons, remove xinput monitor
- onNavigateBack/Forward now check for currentView === 'workspace' first
  and delegate to Files plugin's up/forward buttons (breadcrumb/Fwd nav)
- Fall back to navigationStack for cross-view navigation
- Removed mouse_monitor.go (xinput test-xi2) — causes phantom X windows,
  superseded by GTK-level vendor patch
- Removed startMouseMonitor call from App.Startup
2026-06-21 16:18:45 +08:00
mirivlad d644c5bb79 feat: mouse back/forward navigation + history stack
- C patch (vendor/.../window.c): intercept GDK button 8/9 → dispatch
  CustomEvent('verstak:navigate-back'/'verstak:navigate-forward')
- App.svelte: navigation stack (snapshot-based history), alt+arrows,
  mouse button back/forward handlers, onNavigateBack/Forward
- WorkbenchHost: close via navigate-back event
- WorkspaceHost: workspace tab bar + tool panels
- wails-mock: full navigation, sidebar, vau...
2026-06-21 16:01:21 +08:00
mirivlad 8e5690e8f7 feat: intercept GDK button 8/9 for mouse back/forward navigation
WebKitGTK does not propagate XButton1/XButton2 (buttons 8 and 9) into
DOM events — event.button and event.buttons are always 0 for these
clicks. This prevents the frontend from detecting hardware back/forward
mouse buttons for history navigation.

Solution: patch Wails' window.c on Linux to intercept button-press-event
at the GTK signal level (before WebKit processes it). For button 8/9 we
call webkit_web_view_run_javascript() to dispatch a native CustomEvent
('verstak:navigate-back' / 'verstak:navigate-forward') into the page,
allowing the frontend to navigate history without any workaround on the
JS side.

The patch is applied automatically during build via scripts/build.sh:
  go mod vendor → patch -p0 < patches/window.c.button-press.patch
Vendor directory is gitignored.
2026-06-21 13:49:13 +08:00
mirivlad 0ac473d720 core: Milestone 7b — Files explorer and Default Editor improvements
- Files plugin: richer explorer with breadcrumbs, selection, toolbar actions,
  rename/trash, filter, sorting, hidden/reserved entries filtered
- Default Editor: line numbers, Ctrl+S, markdown toolbar, Edit/Preview/Split,
  markdown preview, Reload/Revert
- E2E tests: 39 passed for files + editor
- Workspace model: correction, naming alignment, compatibility wrappers
- Updated docs: NOTES_FILES_PLUGIN_PLAN.md, PLUGIN_RUNTIME.md
2026-06-20 19:20:13 +08:00
mirivlad 4de5a74a55 fix: sanitize sync error messages, detect non-sync servers, add health check in TestAuth 2026-06-20 03:20:25 +08:00
mirivlad db67c370ab fix: add backend.call() API and fix [object Object] in workspace sidebar
- Add api.backend.call(method, ...args) to VerstakPluginAPI for direct Wails method invocation
- Add wsName() helper in WorkspaceTree.svelte with String() coercion to prevent [object Object] display
- Use correct Wails path window['go']['api']['App'] in backend.call()
2026-06-20 03:02:33 +08:00
mirivlad ed69746332 feat: add sync backend methods 2026-06-20 02:25:25 +08:00
mirivlad 5c979174f1 fix: polish workspace files and editor shell 2026-06-19 23:37:10 +08:00
mirivlad 6ed6df311a Implement milestone 6b workbench routing skeleton 2026-06-19 07:51:57 +08:00
mirivlad a100f5a441 fix(plugin-manager): sync UI state with plugin lifecycle + sidebar click fix
Root cause fixes:
- Sidebar: handleSidebarItem used item.id instead of item.view for viewId.
  Platform Test sidebar item has id=verstak.platform-test.sidebar but
  view=verstak.platform-test.diagnostics. Click now dispatches correct viewId.
- PluginManager: EnablePlugin/DisablePlugin only wrote to plugins.json but
  never re-discovered plugins. UI showed stale state (no Enable button after
  Disable, no Disable after Enable). Now calls ReloadPlugins() + loadAll()
  after each toggle.
- PluginManager: loadAll() fired async loads (GetCapabilities etc) without
  awaiting — loading spinner disappeared before data was ready. Now awaits
  all via Promise.all.
- PluginCard: no loading feedback on Enable/Disable buttons. Added
  actionFeedback prop — buttons show '⟳ Enabling...' / '⟳ Disabling...'
  and are disabled during operation.
- PluginManager: no visible result after Reload/Enable/Disable. Added
  toast notifications (success/error/info) with auto-dismiss.
- Settings: openSettingsFromProps didn't handle missing panel — now shows
  visible error in modal.
2026-06-17 19:40:05 +08:00
mirivlad 6d2f7858eb fix: replace emoji icons with inline SVG (Icon.svelte + icons.js)
All emoji characters replaced with inline SVG icons:
- Plugin Manager sidebar: puzzle SVG icon
- Verstak logo: stack/tray SVG icon
- Plugin icons: flask SVG (from plugin manifest)
- Warning/error indicators: warning triangle SVG
- Settings button: gear SVG
- Vault recent: vault/shield SVG
- Fallback: dot SVG

New components:
- frontend/src/lib/ui/icons.js — SVG path map
- frontend/src/lib/ui/Icon.svelte — reusable SVG icon component

Icon policy: NO emoji or unicode pictographic symbols in the app.
Only SVG icons registered in icons.js are allowed.
Wails WebKitGTK does not render colour emoji.
2026-06-17 19:02:51 +08:00
mirivlad c2e14cae69 feat: add bundle-host-test.cjs + smoke integration
- bundle-host-test.cjs: JS smoke-test for PluginBundleHost contract
  - 4 error boundary scenarios (missing frontend, JS throw, missing component, mount throw)
  - 5 real mount scenarios (bundle exec, DiagnosticsPanel mount, Settings mount, unmount, mount-throw catch)
  - Runs real platform-test bundle in vm.Sandbox with mock window/document
- smoke-platform.sh: add bundle-host-test step
- Fix: platform-test badgeRow div call (3rd arg was ignored)
2026-06-17 18:51:14 +08:00