Skip to content

feat(listings): documents and meetings listings for the Desktop pages - #2932

Merged
leemour merged 3 commits into
mainfrom
feat/documents-meetings-catalog
Nov 13, 2026
Merged

leemour merged 3 commits into
mainfrom
feat/documents-meetings-catalog

Conversation

@leemour

@leemour leemour commented Nov 13, 2026

Copy link
Copy Markdown
Member

Task

WireCat Desktop gets two pages: "Документы" (every document of every account) and "Встречи" (meetings and calls, as a table and a week/month calendar). memo's documents list|show|sources and meetings list|show will read them through this code.

What

  • store.listings: the SQL (src/store/sqlite/document-listing.ts, meeting-listing.ts).
    • Documents: every listed document with its preferred file, kind, folder and text flag, paged with a separate count; the folder tree per account with counts; one document with a slice of its text, tags, people, meetings and events.
    • Meetings: one row per real meeting. A calendar event and its Zoom/Meet meeting are one row when the store linked them, or when their join_key is the same and their times overlap. A recurring room's other occurrences never match. Phone calls are rows of kind call. Rows give sources, participants with person refs, recording/transcript/summary flags, documents and the pending findings count.
  • Services (./services): listDocuments, listDocumentSources, showDocument, listMeetingEntries, showMeetingEntry.
  • ./cli: the query registries (document_entry, meeting_entry) and the request builders. The entities are exported as LISTING_ENTITIES, not added to ENTITIES: the inferred type of ENTITIES then breaks TS7056.
  • eventWindow is shared with listEvents. subtreeOf is shared with files.list. localDate, plusDays and eventIdOf are exported from ./calendar for reuse.
  • No migration.
  • The store.ts line cap goes from 471 to 479 for the new area.

Design notes: docs/dev/LISTINGS.md.

Testing

  • src/services/listings.test.ts has 10 tests:

    • join, order, window and filters;
    • an owner's link beating a room match;
    • a meeting that runs into the window;
    • pending findings after a partial review;
    • paging;
    • folder:;
    • show.
  • The calendar, store, services, entities, errors, meetings and cli suites pass locally. Nine migration tests timed out under load and passed when rerun alone.

  • Benchmark on a synthetic store: 20k documents, 9k events, 4k meetings, 2k findings batches.

    Read p95
    documents, first page 55 ms
    documents, text search 74 ms
    meetings, a month (412 rows) 134 ms
    meetings, a week 29 ms
    meetings, the default page 50 ms
    meetings, a year about 600 ms

    The script and the README go to cli-testing (performance/desktop/documents-meetings).

🤖 Generated with Claude Code

leemour and others added 3 commits November 13, 2026 18:29
One read for the "Документы" page and one for the "Встречи" page, shared
by memo's documents and meetings commands.

- store.listings: every listed document of every account with its
  preferred file, kind, folder and text flag, paged with a separate
  count; the folder tree per account with counts; one document with a
  slice of its text, tags, people, meetings and events.
- One row per real meeting: a calendar event and its Zoom or Meet
  meeting are one row when the store linked them, or when they share
  the exact join key and their times overlap. Phone calls are rows of
  kind call. Rows carry sources, participants with person refs,
  recording/transcript/summary flags, documents and pending findings.
- Services, query registries (document_entry, meeting_entry) and
  request builders under ./cli; the event window is shared with
  listEvents.
- store.ts line cap raised to 479 for the new area.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- pending_findings leaves out findings the owner already decided; each
  findings batch on a row gives findings and pending, and only the row's
  meeting accounts' batches are read.
- A meeting linked to an event the owner made stays on it over a room
  match; show reads an event's meetings by link or room, with no window.
- An event is listed when one of its meetings overlaps the window.
- kind:call holds a phone meeting joined to an event; deleted copies no
  longer count for kind, sources or the person filter.
- show meeting:<account>/<id> checks that very meeting.
- folder: matches the folder's subtree over the tree's own path, with
  the files' index range (subtreeOf); the preferred file reuses
  PREFERRED_FILE.
- participants[].person and transcript lines' person are {ref, name};
  a document's text says has_more; the error reasons are registered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… by UNION so the time index holds

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@leemour
leemour merged commit e69158f into main Nov 13, 2026
43 checks passed
@leemour
leemour deleted the feat/documents-meetings-catalog branch November 13, 2026 17:39
leemour added a commit to WireCatLabs/cli-memo that referenced this pull request Nov 13, 2026
…|show for the Desktop pages (#833)

## Task

WireCat Desktop gets two pages. "Документы" lists every document.
"Встречи" shows meetings and calls as a table and as a week or month
calendar. This PR adds the memo commands those pages read. They are thin
over cli-core 0.658.0's listings (WireCatLabs/cli-core#2932).

## What

- `memo documents list [query]`: every document of every account, with
paging and a total.
- Filters: `source:`, `kind:`, `folder:`, `source_modified_at:`,
`has_text:`, `tag:`, `person:`. A bare word searches the text with the
notes search.
  - `local_path` is filled from memo's notes-folder config.
- `memo documents tree`: each account's folder tree, with counts.
- `memo documents show <document:id>`: part of a document's text, read
with `--cursor` and `--max-chars`, plus its tags, people, meetings and
events.
- `memo meetings list [query]`: one row per real meeting. A calendar
event and its Zoom or Meet meeting share one row, and phone calls are
included.
- A row is listed when it overlaps the `started_at:` window. The window
takes days or instants with their offset. `started_at:[* TO *]` reads
every row.
  - Order: `--order recent|start`.
- Each row has sources, participants with person refs, join links,
recording, transcript and summary flags, documents, and the number of
pending findings.
- `memo meetings show <event:id|meeting:acc/id>`: transcript lines with
their times, read with `--cursor` and `--limit`, plus summaries,
findings batches, the calendar's text and documents.
- The meetings shell keeps Core's `list` and `show` names. Its reviewed
overrides are in `src/contract-overrides/meetings.ts`.
`lint/overrides.json` gets one override for `--order start`, the
oldest-first order the Desktop calendar needs.
- Pins cli-core 0.658.0. Its changelog since 0.656 has nothing else that
touches memo.

## Testing

- The full suite passes: 148 files.
- `docs/dev/test-matrix.md`: 0 commands or options without a test.
- `lint:commands`, `docs:check` and `lint` pass. `docs/commands.md` is
regenerated.
- A fresh reviewer agent checked the change. Its findings are fixed:
  - the `local_path` join;
  - `has_more` when the total is capped;
  - the examples;
  - the window docs;
  - the shared `between` helper;
  - the override reason.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
leemour added a commit to WireCatLabs/cli-testing that referenced this pull request Nov 13, 2026
…tore (#370)

Why: WireCat Desktop's new Documents and Meetings pages read cli-core's
listings (WireCatLabs/cli-core#2932). The question was whether a month
window and a 50-row page stay under about 150 ms p95 on a heavy user's
store, and so whether the listings need a migration with new indexes.
They do not.

Headline (p95): documents first page 55 ms, text search 74 ms; meetings
month 134 ms (412 rows), week 29 ms, default page 50 ms; a year in one
read about 600 ms.

The script seeds a synthetic store (20k documents, 9k events, 4k
meetings, 2k findings batches); no real data.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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