Skip to content

Add subfolders and entry links. - #10

Merged
ostefani merged 42 commits into
mainfrom
feature/subfolders
Nov 7, 2026
Merged

ostefani merged 42 commits into
mainfrom
feature/subfolders

Conversation

@ostefani

@ostefani ostefani commented Nov 7, 2026

Copy link
Copy Markdown
Owner
  • add vault folders and entry-link retrieval
  • split editor responsibilities and guard link refresh during lock.
  • add vault folders and entry-link retrieval
  • expose folder and entry-link operations
  • add folder navigation and links between diary entries
  • metadata-first candidates with budgeted fetch and verify cache
  • content-hash candidates with sliced ordered verification
  • hash the fetched body, cache verdicts not rows
  • validate JSON entry IDs as canonical UUIDs
  • share one rename move and update core
  • share scoped-read SQL fragments
  • serialize entry commits through one sequence
  • stop attachment finish after a failed save
  • reuse shared checkboxes and normalize acknowledgement changes
  • obsolete reads and guard pagination
  • stabilize EntryList pagination after failed resets

- Store logical folders and permanent entry locations in the encrypted database.
- Add folder lifecycle operations and revision-checked entry updates.
- Support folder-scoped entry lists, search, calendar counts, and tags.
- Extend sync records and import/export formats to preserve folder relationships.
- Add title suggestions and FTS candidates for backlink verification.
- Cover Unicode imports, nested attachments, complete backlink bodies, and atomic folder updates.
- Update CLI callers and regression fixtures for the new core APIs.
- Replace entry_save with separate creation and revision-checked update commands.
- Expose folder lifecycle operations, scoped reads, and link candidate queries.
- Require an expected entry revision when committing attachments.
- Return the post-commit entry revision with attachment results.
- Register commands across capabilities, isolation, and generated permissions.
- Update IPC contract snapshots and test stale attachment rejection.
- Add folder navigation, folder management, and scoped diary views.
- Create entries in the selected destination and display their permanent locations.
- Add internal Markdown links, a vault-wide entry picker, and link actions.
- Show outgoing links and verify incoming FTS candidates with the existing parser.
- Flush pending edits before entry navigation and retain navigation context.
- Pass revision checks through attachment completion and surface conflicts.
- Keep cyclic folder relationships visible in the navigation tree.
- Expand the existing test command to include shared frontend helpers.
- Add a readable not_a_vault message to the unlock flow.
- Explain the empty-folder and existing-vault choices during onboarding.
- Keep the repository-local AGENTS.md file outside version control.
…rify cache

- return body size and source revision with every candidate, inlining bodies only up to 64 KiB and sending larger ones as metadata instead of truncating them
- fetch oversized bodies whole one at a time through the existing entry reader, showing a large-entry state while keeping the scan stoppable
- verify fetched bodies through the same cached path as inline ones, dropping sources that vanish mid-scan without failing the scan
- cache verified rows by source revision in a bounded store cleared on lock and vault switch
- keep the worker option open by importing the parser from its DOM-free module
…tion

- key the verify cache on a server-provided body hash instead of the revision, so sync content replaces can never serve stale rows
- enforce the inline budget in bytes and carry the hash with every candidate, letting metadata-only rows resolve from cache without refetching
- verify candidates one by one in page order with an 8ms yield slice, keeping newer large sources ahead of older small ones and stop responsive
- fetch oversized bodies whole one at a time behind a visible large-entry state, skipping only confirmed-missing sources and aborting the scan incomplete on any other failure
    - return body_hash on EntryDto so the scan can name the content it holds
    - select lightweight candidate keys first, then hash each chosen body alone
    - cache only the verification boolean and build rows from current metadata
    - re-verify fetched large bodies under their own fetched hash
    - cover title-only metadata staleness with a focused cache test
    - gate uploadFile on the flush result and abort the staged upload when the draft is unsaved through failure
    - let fresh mid-flush edits proceed since the sequence still bases the finish on the newest commit
    - pin the gate truth table with a regression test
    - render the diary scope and list descendant toggles with the shared Checkbox
    - adapt the onboarding acknowledgement event to a boolean before setSaved
    - drop the replaced raw-checkbox wrapper styles
    - add a per-purpose request owner with deferred-promise tests
    - guard diary search, folder, day, list, tag and calendar reads with input capture
    - start session reads from the vault lifecycle so the initial folder load survives mount
    - serialize list resets against pagination and clear the busy flag only for the current token
    - reissue an active search on scope movement even before its first results arrive
…hanges

    - merge each settings patch against the latest acknowledged snapshot with retryable failures
    - adopt folder picker results as merge bases and expose pending state to preference controls
    - move rotation subscription into api.js and document the import-tick epoch
    - surface folder counts in sync/import reports and notify on folder-only changes
    - reload tree, list, calendar, search and visible link panels on workspace ticks
…anels.

Route folder picker and clear results through the settings queue as
narrow patches instead of adopting potentially stale snapshots.

Require reconciliation before subsequent writes when a confirming
settings read fails, preserving successfully applied preferences.

Refresh backlinks lazily after workspace changes while collapsed.
Add regression coverage for overlapping settings changes and failed
reconciliation recovery.
Move entry draft ownership, autosave, uploads, deletion, and link
workflows into a container-owned editing session.

Extract UI text and repeated control descriptors into data.js.
Render toolbar, mood, and link actions from descriptors, and compose
link panels and the picker through container-provided snippets.

Expose the editor methods required by the session, drain queued
uploads before navigation, and preserve edits when deletion fails.

Add session, UI-data, and editor-interface regression tests.

Validation: 119 tests passed; frontend check and production build passed.
Desktop interaction verification remains outstanding.
Add “Copy link to this note” and support pasting internal links
as clickable references with safely escaped title labels.

Extend the Link dialog with custom link text and pasted note
destinations, preserving the original selection during editing.

Move “Linked from” into a metadata popup beside Mood and Tags,
and remove the outgoing Links footer.

Preserve bracket linking, stable entry IDs, clipboard safeguards,
and verified backlink pagination.

Validation: 136 tests, production build, hygiene and diff checks pass.
- allow use to delete any folders after confirmation.
- show modal window to confirm choice.
…h during lock.

- Split the editor surface, metadata, and footer into focused components. Extract draft state, link actions, and uploads from the session while preserving the Diary’s navigation contracts and editor styles.
- Invalidate pending link-title lookups when locking starts. Apply results only to the active editor, using the live link range.
@ostefani
ostefani merged commit 70e36a5 into main Nov 7, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant