Commit Graph
372 Commits
Author SHA1 Message Date
digua 8ae3e42e4f chore(workspace): refine editor and formatting setup 2026-07-15 23:23:52 +08:00
digua 8360cd182f fix(parser): validate QCE private chat type
Treat more than two real senders as stronger evidence than a conflicting private marker while preserving genuine private chats with system placeholders.
2026-07-15 10:22:28 +08:00
Shuakami 748613adb7 fix(parser): QCE private chats misdetected as group and phantom "0" member 2026-07-15 09:52:34 +08:00
digua 710b21f2ae fix(records): order backfilled messages by timestamp
Use timestamp and message ID as the stable viewer cursor so historical messages imported later remain in chronological order. Resolve timeline anchors by message time and cover out-of-order IDs with SQLite regressions.
2026-07-14 11:56:09 +08:00
digua 82710e2d5a fix(import): keep dry-run database access read-only
Use non-migrating session enumeration during import analysis so previews cannot mutate legacy schemas or raise data-directory compatibility gates.
2026-07-14 11:32:22 +08:00
digua 53406f4c6d feat(import): add dry-run preview
Share auto-import planning between preview and write paths, expose a machine-readable CLI result envelope, and preserve explicit parser options during analysis.
2026-07-14 11:32:22 +08:00
digua 16ee4d8348 refactor(ai): unify desktop tool adapters 2026-07-13 20:42:27 +08:00
digua 9123bd8476 refactor(import): simplify shared push import analysis 2026-07-13 18:33:23 +08:00
digua 859b4a79ed fix(import): align JSON dry-run with push semantics
Route Desktop JSON dry-runs through a shared read-only push analyzer so validation, deduplication, and member inference match actual writes. Keep JSONL on the file analyzer path and cover new and incremental predictions without database mutations.
2026-07-13 17:56:47 +08:00
digua db26950d4b fix(import): harden desktop shared imports
Use the long-running worker timeout and refresh Desktop caches after successful push imports.

Align auto-created member metadata and counts across initial and incremental imports, exclude SYSTEM from member updates, and keep existing-session writes validated and atomic.
2026-07-13 17:56:47 +08:00
digua 5b35cb1d71 feat(api): honor idempotency keys on shared imports 2026-07-13 17:56:47 +08:00
digua e8f7ed9e4e refactor(import): route desktop imports through shared services 2026-07-13 17:56:47 +08:00
digua 8f8a19f96e fix(import): align shared push import semantics 2026-07-13 17:56:47 +08:00
digua 5be001fea5 fix(sync): preserve pull cursor on lock conflict
Propagate retryable import lock conflicts through CLI and Desktop pull adapters so scheduled pulls defer without advancing past unimported messages.
2026-07-13 01:01:42 +08:00
digua 8bee0fab4a fix(api): align new import dry runs
Reuse create-path validation and deduplication during new-session analysis so dry-run counts match the subsequent import.
2026-07-13 01:01:42 +08:00
digua ec822cb1b0 fix(import): deduplicate mixed message identities
Track unmatched fallback-only keys separately so messages with and without platform IDs bridge safely without collapsing distinct stable IDs.
2026-07-13 01:01:42 +08:00
digua 61d42b2500 fix(import): harden automatic incremental imports 2026-07-13 01:01:42 +08:00
digua 6dc35722c0 fix(import): disambiguate ChatLab reimports 2026-07-13 01:01:42 +08:00
digua 0606d5f5f7 feat(cli): enable automatic incremental imports 2026-07-13 01:01:42 +08:00
digua 6cf4c063fc feat(import): orchestrate automatic imports 2026-07-13 01:01:42 +08:00
digua 27f46dfcb6 feat(import): add automatic session matcher 2026-07-13 01:01:42 +08:00
digua a9a1557867 fix(import): preserve ChatLab owner and aliases
Thread ownerId and member aliases through the TS and native parsers. Persist aliases across full and incremental imports so exported ChatLab JSON retains user identity metadata.
2026-07-12 21:27:39 +08:00
digua 37c446c751 fix(parser): preserve ChatLab members in TS fallback
Stream members and messages in one pass so nested member metadata is parsed structurally. Cover exports whose complete member list exceeds the filtered messages.
2026-07-12 21:27:39 +08:00
digua 96235915b8 fix(export): generate importable ChatLab JSON 2026-07-12 21:27:39 +08:00
digua e1288c3cc7 fix(insight): invalidate snapshots on session deletion
Remove persisted annual summary snapshots whenever a session is deleted through shared or desktop cleanup paths. Drop cached in-memory snapshots when their backing files disappear so stale responses cannot expose deleted session data.
2026-07-12 15:29:09 +08:00
digua b15f38c4a5 fix(insight): address annual summary review findings 2026-07-12 15:29:09 +08:00
digua 1713e0d577 fix(insight): remove session facts on deletion 2026-07-12 15:29:09 +08:00
digua f198b41bdb feat(settings): manage session owner identities 2026-07-12 15:29:09 +08:00
digua 618af4b5b9 feat(api): expose global insight endpoint 2026-07-12 15:29:09 +08:00
digua d7692b5bfc feat(runtime): add global insight service and worker 2026-07-12 15:29:09 +08:00
digua 81be26b68e feat(runtime): add global insight cache pipeline 2026-07-12 15:29:09 +08:00
digua a85e9897a9 feat(core): add global insight queries and contracts 2026-07-12 15:29:09 +08:00
digua 740c410d7b refactor(core): centralize contact identity resolution 2026-07-12 15:29:09 +08:00
digua 2aeb912dec test(ai): type legacy auth profile fixtures 2026-07-12 01:22:43 +08:00
digua f6a861c128 fix(parser): parse dotted WhatsApp AM/PM markers 2026-07-11 11:09:29 +08:00
hh7418695 1dabcf4dfd fix(parser): support bracketed WhatsApp TXT timestamps 2026-07-11 10:51:30 +08:00
diguaandCursor 74971c624a fix(semantic-index): only clamp sender names when over shared budget
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-10 15:11:51 +08:00
digua b2f20a15bd fix(semantic-index): harden embedding input guards 2026-07-10 15:11:51 +08:00
digua dd40fc6502 feat(semantic-index): add local model download sources 2026-07-10 15:11:51 +08:00
digua ba2f09f56e fix(semantic-index): clamp oversized embedding inputs 2026-07-10 15:11:51 +08:00
digua 2b214b75df fix(storage): clarify managed data directory scope (resolve #241) 2026-07-07 17:08:51 +08:00
digua 5f1a9bb34e fix(desktop): isolate better-sqlite3 electron binding 2026-07-06 15:01:50 +08:00
digua ac662d319d feat(contacts): relax relationship entry threshold 2026-07-05 22:51:39 +08:00
digua 312a0306cb fix(parser-native): harden native parser test edge cases 2026-07-05 22:49:38 +08:00
digua c0548f63c8 feat(import): prepare native parser rollout 2026-07-05 22:49:38 +08:00
diguaandCursor c265925e3e fix(import): report accurate post-parse progress stages in real time
The UI stayed on "parsing messages" during the whole post-parse phase:
the importer emitted an 'importing' stage the frontend had no text for,
and on CLI Web the synchronous DB writes / index / FTS build starved the
event loop so buffered SSE progress events only arrived after the import
finished.

- Replace 'importing' with 'saving' (message writes) and a new 'indexing'
  stage (indexes / FTS / session index) in ParseProgress, with UI texts
  for all four locales.
- Yield a macrotask between native parser batches and before heavy
  synchronous steps so SSE progress events flush while importing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 22:49:38 +08:00
diguaandCursor f7150e2cff fix(nlp): stop rebuilding jieba instance on every call without custom dict
getJieba() invalidated its cache whenever no dict file existed on disk,
so users without a custom dict rebuilt a Jieba instance per tokenize call.
FTS indexing tokenizes every message, making imports seconds slower
(43MB sample: 9.2s -> 3.5s after the fix). Cache now only invalidates
when the on-disk dict state actually changes (added or removed).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 22:49:38 +08:00
diguaandCursor 1e7aefe08b feat(import): add Rust native parsing kernels for WeFlow and ChatLab JSON
Add @openchatlab/parser-native (napi-rs v3) with a shared byte-level JSON
scanner and two format kernels. Parsing large exports is 4-10x faster in
real-data benchmarks. The native module is an optional local build; the
pure-TS parsers remain as automatic fallback when it is unavailable,
disabled via CHATLAB_DISABLE_NATIVE_PERF=1, or rejects off-spec files.

The ChatLab kernel also parses the members array structurally, fixing the
TS head-regex heuristic that silently dropped avatars/roles for files with
nested arrays or long member lists.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 22:49:38 +08:00
digua 801e7fc66a fix(cli): harden agent query safeguards
Tighten agent-facing query validation, privacy guards, SQL result handling, config writes, and LIKE search semantics for the CLI query workflow.
2026-07-04 15:12:50 +08:00
digua fd97c55681 feat(query): extend shared chat query capabilities 2026-07-04 15:12:50 +08:00