Commit Graph

205 Commits

Author SHA1 Message Date
Youzini-afk
74d661e433 Harden local store cache invalidation for storage mode switching 2026-04-13 23:03:43 +08:00
Youzini-afk
e4ab3ac41d perf: optimize persist-delta snapshot reuse and diagnostics 2026-04-13 18:21:32 +08:00
Youzini-afk
67cf5fe7fa perf: add hash compact persist-delta bridge mode 2026-04-13 16:37:59 +08:00
Youzini-afk
b16785e56f perf: optimize persist delta gating and diagnostics 2026-04-13 16:11:43 +08:00
Youzini-afk
5bd29c99d5 fix: orphan accepted commit marker self-healing — auto-clear stale marker when no recoverable graph source exists
- Add maybeResolveOrphanAcceptedCommitMarker() for conservative orphan detection:
  - Chat-state sidecar rescue first (preserves marker, keeps mismatch diagnostic)
  - Only clears marker when ALL local sources confirmed absent
  - Guards: shadow-available, migration-failed, chat-switched all block clearing
- Enhance clearCurrentChatCommitMarker() with resetAcceptedRevision option
  - Resets lastAcceptedRevision and acceptedStorageTier when marker is orphan
- Integrate orphan resolution into loadGraphFromIndexedDb() empty+mismatch branch
- Update onDeleteCurrentIdbController/onDeleteAllIdbController to resetAcceptedRevision
- Update graph-persistence regressions:
  - Orphan marker scenario now auto-heals to EMPTY_CONFIRMED (was: permanently BLOCKED)
  - Add chat-state rescue guard test: sidecar data prevents marker clearing
2026-04-12 20:36:03 +08:00
Youzini-afk
05083ef5f0 fix: clear stale accepted commit marker after deleting local IndexedDB caches
When users delete local BME IndexedDB via UI actions (delete current/all
IDB), the chat metadata's st_bme_commit_marker was not cleared. This left
an accepted high-revision promise with no local DB backing, causing
persist-mismatch:indexeddb-behind-commit-marker and blocking graph load
indefinitely.

- index.js: add clearCurrentChatCommitMarker() helper and expose via runtime
- ui-actions-controller.js: call clearCurrentChatCommitMarker before
  syncGraphLoadFromLiveContext after IDB deletion
- p0-regressions.mjs: regression test asserting marker is cleared before
  reload after current-IDB deletion
2026-04-12 20:07:05 +08:00
Youzini-afk
913a102b39 fix: backend vector state marked dirty on sync/restore import and query failure
- sync/bme-sync.js: conservatively clear backend hash mappings and mark
  vectorIndexState dirty before importing remote snapshots via download,
  merge, and cloud backup restore, preventing stale clean-looking state
  after cross-device sync or restore
- vector/vector-index.js: mark backend vector state dirty on real backend
  query failures (HTTP/network) instead of silently returning empty results
- regression: indexeddb-sync.mjs covers download/restore/merge import
  dirty marking; p0-regressions.mjs covers backend query failure dirtying
2026-04-12 19:42:45 +08:00
Youzini-afk
de7e598490 fix: graph load stuck in LOADING after IndexedDB cache deletion or commit-marker mismatch
- reconcileIndexedDbProbeFailureState now handles persist-mismatch:indexeddb-* reasons, ensuring bounded retries and transition to BLOCKED instead of hanging forever in LOADING
- expose clearCachedIndexedDbSnapshot, clearAllCachedIndexedDbSnapshots, closeBmeDb, closeAllBmeDbs, syncGraphLoadFromLiveContext in runtime context for UI actions
- onDeleteCurrentIdbController / onDeleteAllIdbController now clear in-memory caches, close DB handles, and force a fresh graph load sync after deletion
- humanize persist-mismatch:indexeddb-behind-commit-marker panel messages into user-friendly Chinese text
- add regression test for empty IndexedDB + accepted commit marker mismatch fallback-to-blocked scenario
2026-04-12 19:00:30 +08:00
Youzini-afk
47ffd5413d refactor(terminology): 层级总结为主路径,synopsis 标记为旧式全局概要
- README: 明确 summaryState 为主总结体系,legacy synopsis 为兼容兜底
- prompt-profiles: synopsis 任务标签改为「小总结」
- schema/task-graph-stats/panel: synopsis 节点显示为「全局概要(旧)」
- index.js: fallback 状态文案改为「旧式全局概要生成/更新中」
- p0-regressions: 同步更新断言字符串
2026-04-12 17:58:05 +08:00
Youzini-afk
b31088cc35 fix: IndexedDB probe 失败后不再永久卡在 loading,重试耗尽后回退到 blocked
- index.js: 新增 reconcileIndexedDbProbeFailureState,后台 probe 失败时先有限重试,耗尽后切到 blocked
- index.js: scheduleIndexedDbGraphProbe 的 .then/.catch 均接入 reconcile 逻辑
- index.js: createGraphLoadUiStatus blocked 文案更新
- ui/panel.js: _getGraphLoadLabel blocked 文案更新,不再误导为元数据未就绪
- tests/graph-persistence.mjs: 新增 manager-unavailable / read-failed 回归
- tests/graph-persistence.mjs: harness 支持 __indexedDbExportSnapshotShouldThrow / __indexedDbGetCurrentDbShouldThrow
2026-04-12 16:50:02 +08:00
Youzini-afk
5a53d010af fix: reconcile stale manualBackupBatchJournalCoverage when contiguous earlier journal coverage is rebuilt
- Add hasContiguousJournalCoverageThroughFloor to check if current
  batchJournal contiguously covers back through the old retained floor
- Add reconcileManualBackupBatchJournalCoverage that clears stale
  coverage when actual journals have bridged the gap
- Self-clean during normalizeGraphRuntimeState (load-time) and
  appendBatchJournal (write-time)
- findJournalRecoveryPoint now uses reconciled coverage so stale
  manual backup floors no longer block valid reverse-journal recovery
- Add regression tests for gap-not-yet-bridged and bridged scenarios
2026-04-12 16:35:04 +08:00
youzini
a4a11bb6d2 Merge pull request #31 from Hao19911125/main
手动存储的大小修剪
2026-04-12 16:16:35 +08:00
Youzini-afk
22f75e9660 tests: stub recall prompt headers in retrieval-config harness 2026-04-12 16:16:02 +08:00
Youzini-afk
64dec0df2b recall: sectioned recentMessages with context/target split for LLM prompt
- prompt-builder.js: add RECALL_TARGET_CONTENT_HEADER, update splitSectionedTranscriptPayloadMessage to recognize recall-specific target header
- retriever.js: add buildRecallSectionedTranscript helper, format recentMessages as sectioned transcript with context-review and recall-target headers for prompt building while keeping flat string[] for ranking
- p0-regressions.mjs: add testRecallUsesSectionedPromptMessagesForContextAndTarget regression asserting two system messages with correct transcriptSection and headers
2026-04-12 16:07:38 +08:00
Youzini-afk
96b43c7860 feat: migrate compress/consolidation/reflection graphStats to shared ranking core + prompt node refs
- New maintenance/task-graph-stats.js: shared helper wrapping rankNodesForTaskContext + createPromptNodeReferenceMap
- extractor.js: extract and reflection graphStats now use buildTaskGraphStats
- compressor.js: compression graphStats uses shared helper, excludes current batch from relevant ranking
- consolidator.js: consolidation graphStats uses shared helper, excludes new nodes from relevant ranking
- index.js: passes schema + embeddingConfig into generateReflection
- p0-regressions.mjs: added graphStats assertions for compress/consolidation/reflection (prompt-facing refs, no raw UUIDs)
2026-04-12 15:27:22 +08:00
Hao19911125
4b9668fdc5 Clear restored backup dirty history markers 2026-04-12 15:09:11 +08:00
Youzini-afk
dc5051f2ef feat: shared ranking core + prompt node references; recall reuses shared core for base query/vector/diffusion; remove retriever-local duplicate helpers; add regression tests 2026-04-12 14:59:37 +08:00
Youzini-afk
f40b03c306 feat: hide assistant card names in extraction transcript, split sectioned recentMessages into 2 system messages 2026-04-12 13:33:41 +08:00
Youzini-afk
559312c1b6 fix: preserve isContextOnly context/target dividers in final prompt transcript rendering
Root cause: formatPromptMessageTranscript in prompt-builder.js ignored
isContextOnly, so context review and extraction target sections were
flattened into plain transcript even though the flag was correctly set
in intermediate layers. Additionally, userPromptSections (which
contained the dividers) was only a fallback that never reached the
final prompt when block-based profiles had user blocks.

Fix:
- getPromptMessageLikeDescriptor now preserves isContextOnly flag
- formatPromptMessageTranscript now inserts context/target section
  dividers when messages carry isContextOnly, ensuring the final
  LLM prompt always shows the distinction regardless of which
  rendering path (recentMessages, chatMessages, dialogueText) is used

Regression tests:
- prompt-builder-mixed-transcript: verify recentMessages block content
  includes context review and extraction target dividers
- extractor-phase3-layered-context: end-to-end test proving default
  extract profile + default structured mode produces final promptMessages
  with context/target section dividers
2026-04-12 13:04:04 +08:00
Youzini-afk
3f7dd0d727 feat: persist extract action mode selection across panel sessions
- Add extractActionMode setting (default: pending) to settings-defaults.js
- Panel refresh restores dropdown from settings.extractActionMode
- Dropdown change event persists selection via _patchSettings
- Extract button reads settings as fallback when DOM value missing
- Add default value assertion in tests/default-settings.mjs
2026-04-12 12:53:08 +08:00
Youzini-afk
a8e3169002 feat: add isContextOnly flag to extraction messages to prevent repeated extraction
- buildExtractionMessages marks messages with isContextOnly (seq < startIdx)
- formatExtractionTranscript inserts section dividers for mixed context/target
- extractor.js Layer 1 prompt splits context review vs extraction target with guidance
- Add tests/extraction-context-only-flag.mjs (7 test cases)
2026-04-12 12:46:05 +08:00
Hao19911125
288c33f3c3 Rebind restored backup history hashes locally 2026-04-12 11:49:34 +08:00
Hao19911125
580a049442 Slim manual cloud backups and guard truncated journal rollback 2026-04-12 10:43:38 +08:00
Youzini-afk
fdfc15303b fix: stabilize mobile graph dragging and resize 2026-04-11 23:20:26 +08:00
Youzini-afk
898698364e perf: reduce graph panel refresh churn during streaming 2026-04-11 23:07:06 +08:00
Youzini-afk
b06f49f7f9 merge: sync main into dev after PR #29 2026-04-11 22:30:46 +08:00
Youzini-afk
1a2e9ac33d feat: auto-detect dedicated memory llm providers 2026-04-11 22:23:18 +08:00
Youzini-afk
7d23552ff3 fix(ci): support node 20 module hook fallback 2026-04-11 20:43:18 +08:00
Youzini-afk
9becc23526 fix(ux): quiet expected history recovery toasts 2026-04-11 20:36:26 +08:00
Youzini-afk
42bd85b0aa fix(recall): reuse persisted recall on history rerolls 2026-04-11 20:02:52 +08:00
Youzini-afk
30046dd66b feat(regex): move contamination cleanup to default global preset 2026-04-11 19:38:17 +08:00
Youzini-afk
0cb95c4f2b phase2-4 recall prompt-flow hardening 2026-04-11 18:51:59 +08:00
Youzini-afk
3e37600399 feat: integrate phase3/4 settings UI and add phase4/5 regressions 2026-04-11 16:39:38 +08:00
Youzini-afk
322752bb43 feat: improve shujuku-compatible extraction and recall input 2026-04-11 16:05:34 +08:00
Youzini-afk
1834bc1d24 refactor: stabilize persistence delta commit flow 2026-04-11 13:57:03 +08:00
Youzini-afk
418679541a Restore cognition references during history rollback 2026-04-11 03:07:18 +08:00
Youzini-afk
59668decda Stop role card names from populating cognition owners 2026-04-11 02:50:54 +08:00
Youzini-afk
628652309a Deduplicate character cognition owners by alias 2026-04-11 02:40:43 +08:00
Youzini-afk
b2d8fcc7a1 Fix processed history hash rebuild after recovery 2026-04-11 01:45:47 +08:00
Youzini-afk
f37c5de761 Fix persistence pending gating and add repair actions 2026-04-11 00:21:16 +08:00
Youzini-afk
5eaf8aaeb9 Enable candidate text regex stage by default 2026-04-10 20:13:34 +08:00
Youzini-afk
53672fa751 Fix manual backup manifest filename handling 2026-04-10 19:49:10 +08:00
Hao19911125
965e5dff0a Merge branch 'main' into main 2026-04-10 18:43:42 +08:00
Hao19911125
4423034007 Fix stale pending persistence gate 2026-04-10 18:42:15 +08:00
Youzini-afk
517abc6a30 Refactor rerun and summary rebuild ranges 2026-04-10 18:38:54 +08:00
Hao19911125
f7aef9776b Merge branch 'main' into main 2026-04-10 18:09:40 +08:00
Hao19911125
09b6e1e566 Add manual cloud backup controls and manager modal 2026-04-10 17:26:57 +08:00
Youzini-afk
5a77506ab1 Add Luker chat state persistence compatibility 2026-04-10 17:00:51 +08:00
Youzini-afk
6882087c67 Refactor recall LLM selection protocol 2026-04-10 16:24:53 +08:00
Youzini-afk
eaac52473e Fix CI test compatibility on Node 20 2026-04-10 15:14:19 +08:00