claude-code-workflow 7.2.10 → 7.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/cli-planning-agent.md +3 -0
- package/.claude/agents/debug-explore-agent.md +1 -0
- package/.claude/agents/tdd-developer.md +1 -0
- package/.claude/agents/team-worker.md +1 -1
- package/.claude/agents/test-action-planning-agent.md +3 -0
- package/.claude/agents/test-context-search-agent.md +1 -0
- package/.claude/agents/test-fix-agent.md +3 -0
- package/.claude/commands/workflow/analyze-with-file.md +108 -54
- package/.claude/commands/workflow-tune.md +811 -0
- package/.claude/skills/review-code/SKILL.md +2 -0
- package/.claude/skills/review-cycle/SKILL.md +4 -0
- package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
- package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
- package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
- package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
- package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
- package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
- package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
- package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
- package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
- package/.claude/skills/team-testing/roles/executor/role.md +2 -1
- package/.claude/skills/team-testing/roles/generator/role.md +2 -1
- package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
- package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
- package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
- package/.claude/skills/workflow-lite-execute/SKILL.md +106 -14
- package/.claude/skills/workflow-lite-plan/SKILL.md +34 -72
- package/.claude/skills/workflow-lite-test-review/SKILL.md +41 -26
- package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
- package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
- package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
- package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
- package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
- package/.codex/skills/analyze-with-file/SKILL.md +2 -0
- package/.codex/skills/debug-with-file/SKILL.md +4 -0
- package/.codex/skills/issue-discover/SKILL.md +1 -0
- package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
- package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
- package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
- package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
- package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
- package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
- package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
- package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
- package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
- package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
- package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
- package/ccw/dist/commands/spec.d.ts.map +1 -1
- package/ccw/dist/commands/spec.js +9 -4
- package/ccw/dist/commands/spec.js.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.js +3 -1
- package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
- package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
- package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
- package/ccw/dist/tools/spec-index-builder.js +8 -4
- package/ccw/dist/tools/spec-index-builder.js.map +1 -1
- package/ccw/dist/tools/spec-init.d.ts +1 -1
- package/ccw/dist/tools/spec-init.d.ts.map +1 -1
- package/ccw/dist/tools/spec-init.js +127 -0
- package/ccw/dist/tools/spec-init.js.map +1 -1
- package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
- package/ccw/dist/tools/spec-loader.js +2 -1
- package/ccw/dist/tools/spec-loader.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
- package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
- package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
- package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
- package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
- package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
- package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
- package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
- package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
- package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
- package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
- package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
- package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
- package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
- package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
- package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
- package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +1 -1
- package/.claude/commands/ddd/auto.md +0 -359
- package/.claude/commands/ddd/doc-generate.md +0 -222
- package/.claude/commands/ddd/doc-refresh.md +0 -218
- package/.claude/commands/ddd/execute.md +0 -416
- package/.claude/commands/ddd/index-build.md +0 -212
- package/.claude/commands/ddd/plan.md +0 -611
- package/.claude/commands/ddd/scan.md +0 -365
- package/.claude/commands/ddd/sync.md +0 -353
- package/.claude/commands/ddd/update.md +0 -160
- package/.claude/commands/idaw/add.md +0 -287
- package/.claude/commands/idaw/resume.md +0 -442
- package/.claude/commands/idaw/run-coordinate.md +0 -648
- package/.claude/commands/idaw/run.md +0 -539
- package/.claude/commands/idaw/status.md +0 -182
- package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
- package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
- package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
- package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
- package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
- package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
- package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
- package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
- package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
- package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
- package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
- package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
- package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
- package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
- package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
- package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
- package/.claude/skills/team-issue/role-specs/planner.md +0 -83
- package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
- package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
- package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
- package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
- package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
- package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
- package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
- package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
- package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
- package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
- package/.claude/skills/team-planex/role-specs/executor.md +0 -90
- package/.claude/skills/team-planex/role-specs/planner.md +0 -110
- package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
- package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
- package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
- package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
- package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
- package/.claude/skills/team-review/role-specs/fixer.md +0 -75
- package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
- package/.claude/skills/team-review/role-specs/scanner.md +0 -70
- package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
- package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
- package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
- package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
- package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
- package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
- package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
- package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
- package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
- package/.claude/skills/team-testing/role-specs/executor.md +0 -97
- package/.claude/skills/team-testing/role-specs/generator.md +0 -96
- package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
- package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
- package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
- package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
- package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
- package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
- package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
- package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
- package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
- package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
- package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
- package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
- package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryPage-CWKmXY5k.js","sources":["../../src/hooks/useMemory.ts","../../src/hooks/useUnifiedSearch.ts","../../src/hooks/useMemoryV2.ts","../../src/components/memory/SessionPreviewPanel.tsx","../../src/components/memory/V2PipelineTab.tsx","../../src/pages/MemoryPage.tsx"],"sourcesContent":["// ========================================\r\n// useMemory Hook\r\n// ========================================\r\n// TanStack Query hooks for core memory management\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n fetchMemories,\r\n createMemory,\r\n updateMemory,\r\n deleteMemory,\r\n archiveMemory as archiveMemoryApi,\r\n unarchiveMemory as unarchiveMemoryApi,\r\n type CoreMemory,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\nimport { parseMemoryMetadata } from '@/lib/utils';\r\n\r\n// Query key factory\r\nexport const memoryKeys = {\r\n all: ['memory'] as const,\r\n lists: () => [...memoryKeys.all, 'list'] as const,\r\n list: (filters?: MemoryFilter) => [...memoryKeys.lists(), filters] as const,\r\n details: () => [...memoryKeys.all, 'detail'] as const,\r\n detail: (id: string) => [...memoryKeys.details(), id] as const,\r\n};\r\n\r\n// Default stale time: 1 minute\r\nconst STALE_TIME = 60 * 1000;\r\n\r\nexport interface MemoryFilter {\r\n search?: string;\r\n tags?: string[];\r\n favorite?: boolean;\r\n archived?: boolean;\r\n}\r\n\r\nexport interface UseMemoryOptions {\r\n filter?: MemoryFilter;\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseMemoryReturn {\r\n memories: CoreMemory[];\r\n totalSize: number;\r\n claudeMdCount: number;\r\n allTags: string[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching and filtering memories\r\n */\r\nexport function useMemory(options: UseMemoryOptions = {}): UseMemoryReturn {\r\n const { filter, staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n // Only enable query when projectPath is available\r\n const queryEnabled = enabled && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.memoryList(projectPath),\r\n queryFn: () => fetchMemories(projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n });\r\n\r\n const allMemories = query.data?.memories ?? [];\r\n const totalSize = query.data?.totalSize ?? 0;\r\n const claudeMdCount = query.data?.claudeMdCount ?? 0;\r\n\r\n // Apply filters\r\n const filteredMemories = (() => {\r\n let memories = allMemories;\r\n\r\n if (filter?.search) {\r\n const searchLower = filter.search.toLowerCase();\r\n memories = memories.filter(\r\n (m) =>\r\n m.content.toLowerCase().includes(searchLower) ||\r\n m.source?.toLowerCase().includes(searchLower) ||\r\n m.tags?.some((t) => t.toLowerCase().includes(searchLower))\r\n );\r\n }\r\n\r\n if (filter?.tags && filter.tags.length > 0) {\r\n memories = memories.filter((m) =>\r\n filter.tags!.some((tag) => m.tags?.includes(tag))\r\n );\r\n }\r\n\r\n // Filter by favorite status (from metadata)\r\n if (filter?.favorite === true) {\r\n memories = memories.filter((m) => {\r\n const metadata = parseMemoryMetadata(m.metadata);\r\n return metadata.favorite === true;\r\n });\r\n }\r\n\r\n // Filter by archived status\r\n if (filter?.archived === true) {\r\n memories = memories.filter((m) => m.archived === true);\r\n } else if (filter?.archived === false) {\r\n memories = memories.filter((m) => m.archived !== true);\r\n }\r\n\r\n return memories;\r\n })();\r\n\r\n // Collect all unique tags\r\n const allTags = Array.from(\r\n new Set(allMemories.flatMap((m) => m.tags ?? []))\r\n ).sort();\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n if (projectPath) {\r\n await queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.memory(projectPath) });\r\n }\r\n };\r\n\r\n return {\r\n memories: filteredMemories,\r\n totalSize,\r\n claudeMdCount,\r\n allTags,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\n// ========== Mutations ==========\r\n\r\nexport interface UseCreateMemoryReturn {\r\n createMemory: (input: { content: string; tags?: string[]; metadata?: Record<string, any> }) => Promise<CoreMemory>;\r\n isCreating: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useCreateMemory(): UseCreateMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (input: { content: string; tags?: string[]; metadata?: Record<string, any> }) =>\r\n createMemory(input, projectPath),\r\n onSuccess: () => {\r\n // Invalidate memory cache to trigger refetch\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n createMemory: mutation.mutateAsync,\r\n isCreating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseUpdateMemoryReturn {\r\n updateMemory: (memoryId: string, input: Partial<CoreMemory>) => Promise<CoreMemory>;\r\n isUpdating: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useUpdateMemory(): UseUpdateMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ memoryId, input }: { memoryId: string; input: Partial<CoreMemory> }) =>\r\n updateMemory(memoryId, input, projectPath),\r\n onSuccess: () => {\r\n // Invalidate memory cache to trigger refetch\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n updateMemory: (memoryId, input) => mutation.mutateAsync({ memoryId, input }),\r\n isUpdating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseDeleteMemoryReturn {\r\n deleteMemory: (memoryId: string) => Promise<void>;\r\n isDeleting: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useDeleteMemory(): UseDeleteMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (memoryId: string) => deleteMemory(memoryId, projectPath),\r\n onSuccess: () => {\r\n // Invalidate to ensure sync with server\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n deleteMemory: mutation.mutateAsync,\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseArchiveMemoryReturn {\r\n archiveMemory: (memoryId: string) => Promise<void>;\r\n isArchiving: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useArchiveMemory(): UseArchiveMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (memoryId: string) => archiveMemoryApi(memoryId, projectPath),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n archiveMemory: mutation.mutateAsync,\r\n isArchiving: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseUnarchiveMemoryReturn {\r\n unarchiveMemory: (memoryId: string) => Promise<void>;\r\n isUnarchiving: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useUnarchiveMemory(): UseUnarchiveMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (memoryId: string) => unarchiveMemoryApi(memoryId, projectPath),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n unarchiveMemory: mutation.mutateAsync,\r\n isUnarchiving: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n/**\r\n * Combined hook for all memory mutations\r\n */\r\nexport function useMemoryMutations() {\r\n const create = useCreateMemory();\r\n const update = useUpdateMemory();\r\n const remove = useDeleteMemory();\r\n const archive = useArchiveMemory();\r\n const unarchive = useUnarchiveMemory();\r\n\r\n return {\r\n createMemory: create.createMemory,\r\n updateMemory: update.updateMemory,\r\n deleteMemory: remove.deleteMemory,\r\n archiveMemory: archive.archiveMemory,\r\n unarchiveMemory: unarchive.unarchiveMemory,\r\n isCreating: create.isCreating,\r\n isUpdating: update.isUpdating,\r\n isDeleting: remove.isDeleting,\r\n isArchiving: archive.isArchiving,\r\n isUnarchiving: unarchive.isUnarchiving,\r\n isMutating: create.isCreating || update.isUpdating || remove.isDeleting || archive.isArchiving || unarchive.isUnarchiving,\r\n };\r\n}\r\n","// ========================================\r\n// useUnifiedSearch Hook\r\n// ========================================\r\n// TanStack Query hooks for unified memory search, stats, and recommendations\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n fetchUnifiedSearch,\r\n fetchUnifiedStats,\r\n fetchRecommendations,\r\n triggerReindex,\r\n type UnifiedSearchResult,\r\n type UnifiedMemoryStats,\r\n type RecommendationResult,\r\n type ReindexResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// Default stale time: 1 minute\r\nconst STALE_TIME = 60 * 1000;\r\n\r\n// ========== Unified Search ==========\r\n\r\nexport interface UseUnifiedSearchOptions {\r\n query: string;\r\n categories?: string;\r\n topK?: number;\r\n minScore?: number;\r\n enabled?: boolean;\r\n staleTime?: number;\r\n}\r\n\r\nexport interface UseUnifiedSearchReturn {\r\n results: UnifiedSearchResult[];\r\n total: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for unified vector + FTS5 search across all memory categories\r\n */\r\nexport function useUnifiedSearch(options: UseUnifiedSearchOptions): UseUnifiedSearchReturn {\r\n const {\r\n query,\r\n categories,\r\n topK,\r\n minScore,\r\n enabled = true,\r\n staleTime = STALE_TIME,\r\n } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n // Only enable query when projectPath exists and query is non-empty\r\n const queryEnabled = enabled && !!projectPath && query.trim().length > 0;\r\n\r\n const result = useQuery({\r\n queryKey: workspaceQueryKeys.unifiedSearch(projectPath || '', query, categories),\r\n queryFn: () =>\r\n fetchUnifiedSearch(\r\n query,\r\n { topK, minScore, category: categories },\r\n projectPath || undefined\r\n ),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 1,\r\n });\r\n\r\n const refetch = async () => {\r\n await result.refetch();\r\n };\r\n\r\n return {\r\n results: result.data?.results ?? [],\r\n total: result.data?.total ?? 0,\r\n isLoading: result.isLoading,\r\n isFetching: result.isFetching,\r\n error: result.error,\r\n refetch,\r\n };\r\n}\r\n\r\n// ========== Unified Stats ==========\r\n\r\nexport interface UseUnifiedStatsReturn {\r\n stats: UnifiedMemoryStats | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching unified memory statistics\r\n */\r\nexport function useUnifiedStats(): UseUnifiedStatsReturn {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const queryEnabled = !!projectPath;\r\n\r\n const result = useQuery({\r\n queryKey: workspaceQueryKeys.unifiedStats(projectPath || ''),\r\n queryFn: () => fetchUnifiedStats(projectPath || undefined),\r\n staleTime: STALE_TIME,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n });\r\n\r\n const refetch = async () => {\r\n await result.refetch();\r\n };\r\n\r\n return {\r\n stats: result.data?.stats ?? null,\r\n isLoading: result.isLoading,\r\n isFetching: result.isFetching,\r\n error: result.error,\r\n refetch,\r\n };\r\n}\r\n\r\n// ========== Recommendations ==========\r\n\r\nexport interface UseRecommendationsOptions {\r\n memoryId: string;\r\n limit?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseRecommendationsReturn {\r\n recommendations: RecommendationResult[];\r\n total: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * Hook for KNN-based memory recommendations\r\n */\r\nexport function useRecommendations(options: UseRecommendationsOptions): UseRecommendationsReturn {\r\n const { memoryId, limit = 5, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const queryEnabled = enabled && !!projectPath && !!memoryId;\r\n\r\n const result = useQuery({\r\n queryKey: workspaceQueryKeys.unifiedRecommendations(projectPath || '', memoryId),\r\n queryFn: () => fetchRecommendations(memoryId, limit, projectPath || undefined),\r\n staleTime: STALE_TIME,\r\n enabled: queryEnabled,\r\n retry: 1,\r\n });\r\n\r\n return {\r\n recommendations: result.data?.recommendations ?? [],\r\n total: result.data?.total ?? 0,\r\n isLoading: result.isLoading,\r\n isFetching: result.isFetching,\r\n error: result.error,\r\n };\r\n}\r\n\r\n// ========== Reindex Mutation ==========\r\n\r\nexport interface UseReindexReturn {\r\n reindex: () => Promise<ReindexResponse>;\r\n isReindexing: boolean;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * Hook for triggering vector index rebuild\r\n */\r\nexport function useReindex(): UseReindexReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: () => triggerReindex(projectPath || undefined),\r\n onSuccess: () => {\r\n // Invalidate unified memory cache after reindex\r\n if (projectPath) {\r\n queryClient.invalidateQueries({\r\n queryKey: workspaceQueryKeys.unifiedMemory(projectPath),\r\n });\r\n }\r\n },\r\n });\r\n\r\n return {\r\n reindex: mutation.mutateAsync,\r\n isReindexing: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n","// ========================================\r\n// useMemoryV2 Hook\r\n// ========================================\r\n// TanStack Query hooks for Memory V2 pipeline\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n triggerExtraction,\r\n getExtractionStatus,\r\n triggerConsolidation,\r\n getConsolidationStatus,\r\n getV2Jobs,\r\n previewExtractionQueue,\r\n triggerSelectiveExtraction,\r\n type ExtractionStatus,\r\n type ConsolidationStatus,\r\n type V2JobsResponse,\r\n type ExtractionPreviewResponse,\r\n type SelectiveExtractionResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// Query keys\r\nexport const memoryV2Keys = {\r\n all: ['memoryV2'] as const,\r\n extractionStatus: (path?: string) => [...memoryV2Keys.all, 'extraction', path] as const,\r\n consolidationStatus: (path?: string) => [...memoryV2Keys.all, 'consolidation', path] as const,\r\n jobs: (path?: string, filters?: { kind?: string; status_filter?: string }) =>\r\n [...memoryV2Keys.all, 'jobs', path, filters] as const,\r\n preview: (path?: string, includeNative?: boolean) =>\r\n [...memoryV2Keys.all, 'preview', path, includeNative] as const,\r\n};\r\n\r\n// Default stale time: 30 seconds (V2 status changes frequently)\r\nconst STALE_TIME = 30 * 1000;\r\n\r\n// Hook: 提取状态\r\nexport function useExtractionStatus() {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.extractionStatus(projectPath),\r\n queryFn: () => getExtractionStatus(projectPath),\r\n enabled: !!projectPath,\r\n staleTime: STALE_TIME,\r\n refetchInterval: 5000, // 每 5 秒刷新\r\n });\r\n}\r\n\r\n// Hook: 合并状态\r\nexport function useConsolidationStatus() {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.consolidationStatus(projectPath),\r\n queryFn: () => getConsolidationStatus(projectPath),\r\n enabled: !!projectPath,\r\n staleTime: STALE_TIME,\r\n refetchInterval: 5000,\r\n });\r\n}\r\n\r\n// Hook: V2 作业列表\r\nexport function useV2Jobs(filters?: { kind?: string; status_filter?: string }) {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.jobs(projectPath, filters),\r\n queryFn: () => getV2Jobs(filters, projectPath),\r\n enabled: !!projectPath,\r\n staleTime: STALE_TIME,\r\n refetchInterval: 10000, // 每 10 秒刷新\r\n });\r\n}\r\n\r\n// Hook: 触发提取\r\nexport function useTriggerExtraction() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useMutation({\r\n mutationFn: (maxSessions?: number) => triggerExtraction(maxSessions, projectPath),\r\n onSuccess: () => {\r\n // Invalidate related queries\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.extractionStatus(projectPath) });\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.jobs(projectPath) });\r\n },\r\n });\r\n}\r\n\r\n// Hook: 触发合并\r\nexport function useTriggerConsolidation() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useMutation({\r\n mutationFn: () => triggerConsolidation(projectPath),\r\n onSuccess: () => {\r\n // Invalidate related queries\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.consolidationStatus(projectPath) });\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.jobs(projectPath) });\r\n },\r\n });\r\n}\r\n\r\n// Hook: Preview sessions for extraction\r\nexport function usePreviewSessions(includeNative: boolean = false) {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.preview(projectPath, includeNative),\r\n queryFn: () => previewExtractionQueue(includeNative, undefined, projectPath),\r\n enabled: !!projectPath,\r\n staleTime: 10 * 1000, // 10 seconds\r\n });\r\n}\r\n\r\n// Hook: Trigger selective extraction\r\nexport function useTriggerSelectiveExtraction() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useMutation({\r\n mutationFn: (params: { sessionIds: string[]; includeNative?: boolean }) =>\r\n triggerSelectiveExtraction({\r\n sessionIds: params.sessionIds,\r\n includeNative: params.includeNative,\r\n path: projectPath,\r\n }),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.all });\r\n },\r\n });\r\n}\r\n\r\n// Export types\r\nexport type { ExtractionStatus, ConsolidationStatus, V2JobsResponse, ExtractionPreviewResponse, SelectiveExtractionResponse };\r\n","// ========================================\r\n// SessionPreviewPanel Component\r\n// ========================================\r\n// Preview and select sessions for Memory V2 extraction\r\n\r\nimport { useState, useMemo } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { formatDistanceToNow } from 'date-fns';\r\nimport { Search, Eye, Loader2, CheckCircle2, XCircle, Clock } from 'lucide-react';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Checkbox } from '@/components/ui/Checkbox';\r\nimport {\r\n usePreviewSessions,\r\n useTriggerSelectiveExtraction,\r\n} from '@/hooks/useMemoryV2';\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface SessionPreviewPanelProps {\r\n onClose?: () => void;\r\n onExtractComplete?: () => void;\r\n}\r\n\r\n// Helper function to format bytes\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\r\n}\r\n\r\n// Helper function to format timestamp\r\nfunction formatTimestamp(timestamp: number): string {\r\n try {\r\n const date = new Date(timestamp);\r\n return formatDistanceToNow(date, { addSuffix: true });\r\n } catch {\r\n return '-';\r\n }\r\n}\r\n\r\nexport function SessionPreviewPanel({ onClose, onExtractComplete }: SessionPreviewPanelProps) {\r\n const intl = useIntl();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n const [includeNative, setIncludeNative] = useState(false);\r\n\r\n const { data, isLoading, refetch } = usePreviewSessions(includeNative);\r\n const triggerExtraction = useTriggerSelectiveExtraction();\r\n\r\n // Filter sessions based on search query\r\n const filteredSessions = useMemo(() => {\r\n if (!data?.sessions) return [];\r\n if (!searchQuery.trim()) return data.sessions;\r\n\r\n const query = searchQuery.toLowerCase();\r\n return data.sessions.filter(\r\n (session) =>\r\n session.sessionId.toLowerCase().includes(query) ||\r\n session.tool.toLowerCase().includes(query) ||\r\n session.source.toLowerCase().includes(query)\r\n );\r\n }, [data?.sessions, searchQuery]);\r\n\r\n // Get ready sessions (eligible and not extracted)\r\n const readySessions = useMemo(() => {\r\n return filteredSessions.filter((s) => s.eligible && !s.extracted);\r\n }, [filteredSessions]);\r\n\r\n // Toggle session selection\r\n const toggleSelection = (sessionId: string) => {\r\n setSelectedIds((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(sessionId)) {\r\n next.delete(sessionId);\r\n } else {\r\n next.add(sessionId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n // Select all ready sessions\r\n const selectAll = () => {\r\n setSelectedIds(new Set(readySessions.map((s) => s.sessionId)));\r\n };\r\n\r\n // Clear selection\r\n const selectNone = () => {\r\n setSelectedIds(new Set());\r\n };\r\n\r\n // Trigger extraction for selected sessions\r\n const handleExtract = async () => {\r\n if (selectedIds.size === 0) return;\r\n\r\n triggerExtraction.mutate(\r\n {\r\n sessionIds: Array.from(selectedIds),\r\n includeNative,\r\n },\r\n {\r\n onSuccess: () => {\r\n setSelectedIds(new Set());\r\n onExtractComplete?.();\r\n },\r\n }\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col h-full\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <Eye className=\"w-5 h-5\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.title', defaultMessage: 'Extraction Queue Preview' })}\r\n </h2>\r\n <div className=\"flex items-center gap-2\">\r\n <label className=\"flex items-center gap-2 text-sm cursor-pointer\">\r\n <Checkbox\r\n checked={includeNative}\r\n onCheckedChange={(checked) => setIncludeNative(checked === true)}\r\n />\r\n {intl.formatMessage({ id: 'memory.v2.preview.includeNative', defaultMessage: 'Include Native Sessions' })}\r\n </label>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {isLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n 'Refresh'\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Summary Bar */}\r\n {data?.summary && (\r\n <div className=\"grid grid-cols-4 gap-2 mb-4\">\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold\">{data.summary.total}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.total', defaultMessage: 'Total' })}\r\n </div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold text-blue-600\">{data.summary.eligible}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.eligible', defaultMessage: 'Eligible' })}\r\n </div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold text-green-600\">{data.summary.alreadyExtracted}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.extracted', defaultMessage: 'Already Extracted' })}\r\n </div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold text-amber-600\">{data.summary.readyForExtraction}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.ready', defaultMessage: 'Ready' })}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search and Actions */}\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={intl.formatMessage({\r\n id: 'memory.v2.preview.selectSessions',\r\n defaultMessage: 'Search sessions...',\r\n })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={selectAll}>\r\n {intl.formatMessage({ id: 'memory.v2.preview.selectAll', defaultMessage: 'Select All' })}\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={selectNone}>\r\n {intl.formatMessage({ id: 'memory.v2.preview.selectNone', defaultMessage: 'Select None' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Session Table */}\r\n <div className=\"flex-1 overflow-auto border rounded-lg\">\r\n {isLoading ? (\r\n <div className=\"flex items-center justify-center h-48\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n ) : filteredSessions.length === 0 ? (\r\n <div className=\"flex items-center justify-center h-48 text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.noSessions', defaultMessage: 'No sessions found' })}\r\n </div>\r\n ) : (\r\n <table className=\"w-full text-sm\">\r\n <thead className=\"bg-muted sticky top-0\">\r\n <tr>\r\n <th className=\"w-10 p-2\"></th>\r\n <th className=\"text-left p-2\">Source</th>\r\n <th className=\"text-left p-2\">Session ID</th>\r\n <th className=\"text-left p-2\">Tool</th>\r\n <th className=\"text-left p-2\">Timestamp</th>\r\n <th className=\"text-right p-2\">Size</th>\r\n <th className=\"text-right p-2\">Turns</th>\r\n <th className=\"text-center p-2\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {filteredSessions.map((session) => {\r\n const isReady = session.eligible && !session.extracted;\r\n const isSelected = selectedIds.has(session.sessionId);\r\n const isDisabled = !isReady;\r\n\r\n return (\r\n <tr\r\n key={session.sessionId}\r\n className={cn(\r\n 'border-b hover:bg-muted/50 transition-colors',\r\n isDisabled && 'opacity-60',\r\n isSelected && 'bg-blue-50 dark:bg-blue-950/20'\r\n )}\r\n >\r\n <td className=\"p-2\">\r\n <Checkbox\r\n checked={isSelected}\r\n disabled={isDisabled}\r\n onCheckedChange={() => toggleSelection(session.sessionId)}\r\n />\r\n </td>\r\n <td className=\"p-2\">\r\n <Badge\r\n variant=\"outline\"\r\n className={cn(\r\n session.source === 'ccw'\r\n ? 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300'\r\n : 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-300'\r\n )}\r\n >\r\n {session.source === 'ccw'\r\n ? intl.formatMessage({ id: 'memory.v2.preview.sourceCcw', defaultMessage: 'CCW' })\r\n : intl.formatMessage({ id: 'memory.v2.preview.sourceNative', defaultMessage: 'Native' })}\r\n </Badge>\r\n </td>\r\n <td className=\"p-2 font-mono text-xs truncate max-w-[150px]\" title={session.sessionId}>\r\n {session.sessionId}\r\n </td>\r\n <td className=\"p-2 truncate max-w-[100px]\" title={session.tool}>\r\n {session.tool || '-'}\r\n </td>\r\n <td className=\"p-2 text-muted-foreground\">\r\n {formatTimestamp(session.timestamp)}\r\n </td>\r\n <td className=\"p-2 text-right font-mono text-xs\">\r\n {formatBytes(session.bytes)}\r\n </td>\r\n <td className=\"p-2 text-right\">\r\n {session.turns}\r\n </td>\r\n <td className=\"p-2 text-center\">\r\n {session.extracted ? (\r\n <Badge className=\"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300\">\r\n <CheckCircle2 className=\"w-3 h-3 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.extracted', defaultMessage: 'Extracted' })}\r\n </Badge>\r\n ) : session.eligible ? (\r\n <Badge className=\"bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300\">\r\n <Clock className=\"w-3 h-3 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.ready', defaultMessage: 'Ready' })}\r\n </Badge>\r\n ) : (\r\n <Badge className=\"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300\">\r\n <XCircle className=\"w-3 h-3 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.ineligible', defaultMessage: 'Ineligible' })}\r\n </Badge>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n )}\r\n </div>\r\n\r\n {/* Footer Actions */}\r\n <div className=\"flex items-center justify-between mt-4 pt-4 border-t\">\r\n <div className=\"text-sm text-muted-foreground\">\r\n {selectedIds.size > 0 ? (\r\n intl.formatMessage(\r\n { id: 'memory.v2.preview.selected', defaultMessage: '{count} sessions selected' },\r\n { count: selectedIds.size }\r\n )\r\n ) : (\r\n intl.formatMessage({ id: 'memory.v2.preview.selectHint', defaultMessage: 'Select sessions to extract' })\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {onClose && (\r\n <Button variant=\"outline\" onClick={onClose}>\r\n {intl.formatMessage({ id: 'common.close', defaultMessage: 'Close' })}\r\n </Button>\r\n )}\r\n <Button\r\n onClick={handleExtract}\r\n disabled={selectedIds.size === 0 || triggerExtraction.isPending}\r\n >\r\n {triggerExtraction.isPending ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\r\n {intl.formatMessage({ id: 'memory.v2.extraction.extracting', defaultMessage: 'Extracting...' })}\r\n </>\r\n ) : (\r\n intl.formatMessage(\r\n { id: 'memory.v2.preview.extractSelected', defaultMessage: 'Extract Selected ({count})' },\r\n { count: selectedIds.size }\r\n )\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SessionPreviewPanel;\r\n","// ========================================\r\n// V2PipelineTab Component\r\n// ========================================\r\n// Memory V2 Pipeline management UI\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { formatDistanceToNow } from 'date-fns';\r\nimport {\r\n Zap,\r\n CheckCircle,\r\n Clock,\r\n AlertCircle,\r\n Play,\r\n Eye,\r\n Loader2,\r\n RefreshCw,\r\n FileText,\r\n Database,\r\n Activity,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeHighlight from 'rehype-highlight';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/Dialog';\r\nimport { SessionPreviewPanel } from '@/components/memory/SessionPreviewPanel';\r\nimport 'highlight.js/styles/github-dark.css';\r\nimport {\r\n useExtractionStatus,\r\n useConsolidationStatus,\r\n useV2Jobs,\r\n useTriggerExtraction,\r\n useTriggerConsolidation,\r\n} from '@/hooks/useMemoryV2';\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ========== Helper Functions ==========\r\n\r\n/**\r\n * Format a timestamp to relative time string\r\n */\r\nfunction formatRelativeTime(timestamp: number | string | undefined): string | null {\r\n if (!timestamp) return null;\r\n\r\n try {\r\n const date = typeof timestamp === 'string' ? new Date(timestamp) : new Date(timestamp);\r\n if (isNaN(date.getTime())) return null;\r\n\r\n return formatDistanceToNow(date, { addSuffix: true });\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// ========== Status Badge ==========\r\n\r\nconst STATUS_CONFIG: Record<string, { color: string; icon: React.ReactNode; label: string }> = {\r\n idle: { color: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300', icon: <Clock className=\"w-3 h-3\" />, label: 'Idle' },\r\n running: { color: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300', icon: <Loader2 className=\"w-3 h-3 animate-spin\" />, label: 'Running' },\r\n completed: { color: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300', icon: <CheckCircle className=\"w-3 h-3\" />, label: 'Completed' },\r\n done: { color: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300', icon: <CheckCircle className=\"w-3 h-3\" />, label: 'Done' },\r\n error: { color: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300', icon: <AlertCircle className=\"w-3 h-3\" />, label: 'Error' },\r\n pending: { color: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300', icon: <Clock className=\"w-3 h-3\" />, label: 'Pending' },\r\n};\r\n\r\nfunction StatusBadge({ status }: { status: string }) {\r\n const config = STATUS_CONFIG[status] || STATUS_CONFIG.idle;\r\n return (\r\n <Badge className={cn('flex items-center gap-1', config.color)}>\r\n {config.icon}\r\n {config.label}\r\n </Badge>\r\n );\r\n}\r\n\r\n// ========== Extraction Card ==========\r\n\r\nfunction ExtractionCard() {\r\n const intl = useIntl();\r\n const { data: status, isLoading, refetch } = useExtractionStatus();\r\n const trigger = useTriggerExtraction();\r\n const [maxSessions, setMaxSessions] = useState(10);\r\n const [showPreview, setShowPreview] = useState(false);\r\n\r\n const handleTrigger = () => {\r\n trigger.mutate(maxSessions);\r\n };\r\n\r\n // Check if any job is running\r\n const hasRunningJob = status?.jobs?.some(j => j.status === 'running');\r\n const lastRunText = formatRelativeTime(status?.lastRun);\r\n\r\n return (\r\n <>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div>\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Zap className=\"w-5 h-5 text-yellow-500\" />\r\n Phase 1: {intl.formatMessage({ id: 'memory.v2.extraction.title', defaultMessage: 'Extraction' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.description', defaultMessage: 'Extract structured memories from CLI sessions' })}\r\n </p>\r\n {lastRunText && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.lastRun', defaultMessage: 'Last run' })}: {lastRunText}\r\n </p>\r\n )}\r\n </div>\r\n {status && (\r\n <div className=\"text-right\">\r\n <div className=\"text-2xl font-bold\">{status.total_stage1}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.extracted', defaultMessage: 'Extracted' })}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <input\r\n type=\"number\"\r\n value={maxSessions}\r\n onChange={(e) => setMaxSessions(Math.max(1, parseInt(e.target.value) || 10))}\r\n className=\"w-20 px-2 py-1 text-sm border rounded bg-background\"\r\n min={1}\r\n max={64}\r\n />\r\n <span className=\"text-sm text-muted-foreground\">sessions max</span>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n onClick={handleTrigger}\r\n disabled={trigger.isPending || hasRunningJob}\r\n size=\"sm\"\r\n >\r\n {trigger.isPending || hasRunningJob ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\r\n {intl.formatMessage({ id: 'memory.v2.extraction.extracting', defaultMessage: 'Extracting...' })}\r\n </>\r\n ) : (\r\n <>\r\n <Play className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.extraction.trigger', defaultMessage: 'Trigger Extraction' })}\r\n </>\r\n )}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setShowPreview(true)}\r\n title={intl.formatMessage({ id: 'memory.v2.preview.previewQueue', defaultMessage: 'Preview Queue' })}\r\n >\r\n <Eye className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.previewQueue', defaultMessage: 'Preview Queue' })}\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n <RefreshCw className={cn('w-4 h-4', isLoading && 'animate-spin')} />\r\n </Button>\r\n </div>\r\n\r\n {status?.jobs && status.jobs.length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t\">\r\n <div className=\"text-xs text-muted-foreground mb-2\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.recentJobs', defaultMessage: 'Recent Jobs' })}\r\n </div>\r\n <div className=\"space-y-1 max-h-32 overflow-y-auto\">\r\n {status.jobs.slice(0, 5).map((job) => (\r\n <div key={job.job_key} className=\"flex items-center justify-between text-sm\">\r\n <span className=\"font-mono text-xs truncate max-w-[150px]\">{job.job_key}</span>\r\n <StatusBadge status={job.status} />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </Card>\r\n\r\n {/* Preview Queue Dialog */}\r\n <Dialog open={showPreview} onOpenChange={setShowPreview}>\r\n <DialogContent className=\"max-w-4xl max-h-[80vh]\">\r\n <SessionPreviewPanel\r\n onClose={() => setShowPreview(false)}\r\n onExtractComplete={() => {\r\n setShowPreview(false);\r\n refetch();\r\n }}\r\n />\r\n </DialogContent>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\n// ========== Consolidation Card ==========\r\n\r\nfunction ConsolidationCard() {\r\n const intl = useIntl();\r\n const { data: status, isLoading, refetch } = useConsolidationStatus();\r\n const trigger = useTriggerConsolidation();\r\n const [showPreview, setShowPreview] = useState(false);\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleTrigger = () => {\r\n trigger.mutate();\r\n };\r\n\r\n const handleCopy = async () => {\r\n try {\r\n await navigator.clipboard.writeText(status?.memoryMdPreview || '');\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const isRunning = status?.status === 'running';\r\n const lastRunText = formatRelativeTime(status?.lastRun);\r\n\r\n return (\r\n <>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div>\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Database className=\"w-5 h-5 text-blue-500\" />\r\n Phase 2: {intl.formatMessage({ id: 'memory.v2.consolidation.title', defaultMessage: 'Consolidation' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.description', defaultMessage: 'Merge extracted results into MEMORY.md' })}\r\n </p>\r\n {lastRunText && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.lastRun', defaultMessage: 'Last run' })}: {lastRunText}\r\n </p>\r\n )}\r\n </div>\r\n {status && <StatusBadge status={status.status} />}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold\">\r\n {status?.memoryMdAvailable ? '✅' : '❌'}\r\n </div>\r\n <div className=\"text-xs text-muted-foreground\">MEMORY.md</div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold\">{status?.inputCount ?? '-'}</div>\r\n <div className=\"text-xs text-muted-foreground\">Inputs</div>\r\n </div>\r\n </div>\r\n\r\n {status?.lastError && (\r\n <div className=\"mb-4 p-2 bg-red-100 dark:bg-red-900/30 rounded text-xs text-red-800 dark:text-red-300\">\r\n {status.lastError}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n onClick={handleTrigger}\r\n disabled={trigger.isPending || isRunning}\r\n size=\"sm\"\r\n >\r\n {trigger.isPending || isRunning ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.consolidating', defaultMessage: 'Consolidating...' })}\r\n </>\r\n ) : (\r\n <>\r\n <Play className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.trigger', defaultMessage: 'Trigger Consolidation' })}\r\n </>\r\n )}\r\n </Button>\r\n\r\n {status?.memoryMdAvailable && (\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowPreview(true)}>\r\n <Eye className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.preview', defaultMessage: 'Preview' })}\r\n </Button>\r\n )}\r\n\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n <RefreshCw className={cn('w-4 h-4', isLoading && 'animate-spin')} />\r\n </Button>\r\n </div>\r\n </Card>\r\n\r\n {/* MEMORY.md Preview Dialog */}\r\n <Dialog open={showPreview} onOpenChange={setShowPreview}>\r\n <DialogContent className=\"max-w-4xl max-h-[80vh] overflow-hidden flex flex-col\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center justify-between pr-8\">\r\n <span className=\"flex items-center gap-2\">\r\n <FileText className=\"w-5 h-5\" />\r\n MEMORY.md\r\n </span>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n className=\"h-8 px-2\"\r\n title={copied\r\n ? intl.formatMessage({ id: 'memory.v2.consolidation.copySuccess', defaultMessage: 'Copied' })\r\n : intl.formatMessage({ id: 'memory.actions.copy', defaultMessage: 'Copy' })\r\n }\r\n >\r\n {copied ? (\r\n <Check className=\"w-4 h-4 text-green-500\" />\r\n ) : (\r\n <Copy className=\"w-4 h-4\" />\r\n )}\r\n </Button>\r\n </DialogTitle>\r\n </DialogHeader>\r\n <div className=\"overflow-auto flex-1 markdown-preview\">\r\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeHighlight]}\r\n >\r\n {status?.memoryMdPreview || intl.formatMessage({\r\n id: 'memory.v2.consolidation.noContent',\r\n defaultMessage: 'No content available'\r\n })}\r\n </ReactMarkdown>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\n// ========== Jobs List ==========\r\n\r\ninterface V2Job {\r\n kind: string;\r\n job_key: string;\r\n status: 'pending' | 'running' | 'done' | 'error';\r\n last_error?: string;\r\n worker_id?: string;\r\n started_at?: number;\r\n finished_at?: number;\r\n retry_remaining?: number;\r\n}\r\n\r\nfunction JobsList() {\r\n const intl = useIntl();\r\n const [kindFilter, setKindFilter] = useState<string>('');\r\n const [statusFilter, setStatusFilter] = useState<string>('');\r\n const [selectedJob, setSelectedJob] = useState<V2Job | null>(null);\r\n const [copiedError, setCopiedError] = useState(false);\r\n\r\n // Build filters object\r\n const filters = {\r\n ...(kindFilter && { kind: kindFilter }),\r\n ...(statusFilter && { status_filter: statusFilter }),\r\n };\r\n\r\n const { data, isLoading, refetch } = useV2Jobs(Object.keys(filters).length > 0 ? filters : undefined);\r\n\r\n // Format timestamp to readable string\r\n const formatTimestamp = (timestamp: number | undefined): string => {\r\n if (!timestamp) return '-';\r\n try {\r\n const date = new Date(timestamp);\r\n return date.toLocaleString();\r\n } catch {\r\n return '-';\r\n }\r\n };\r\n\r\n // Copy error to clipboard\r\n const handleCopyError = async () => {\r\n if (selectedJob?.last_error) {\r\n try {\r\n await navigator.clipboard.writeText(selectedJob.last_error);\r\n setCopiedError(true);\r\n setTimeout(() => setCopiedError(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Activity className=\"w-5 h-5 text-purple-500\" />\r\n {intl.formatMessage({ id: 'memory.v2.jobs.title', defaultMessage: 'Jobs' })}\r\n </h3>\r\n <div className=\"flex items-center gap-2\">\r\n <select\r\n value={kindFilter}\r\n onChange={(e) => setKindFilter(e.target.value)}\r\n className=\"px-2 py-1 text-sm border rounded bg-background\"\r\n >\r\n <option value=\"\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.allKinds', defaultMessage: 'All Kinds' })}\r\n </option>\r\n <option value=\"phase1_extraction\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.extraction', defaultMessage: 'Extraction' })}\r\n </option>\r\n <option value=\"memory_consolidate_global\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.consolidation', defaultMessage: 'Consolidation' })}\r\n </option>\r\n </select>\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"px-2 py-1 text-sm border rounded bg-background\"\r\n >\r\n <option value=\"\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.all', defaultMessage: 'All Status' })}\r\n </option>\r\n <option value=\"pending\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.pending', defaultMessage: 'Pending' })}\r\n </option>\r\n <option value=\"running\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.running', defaultMessage: 'Running' })}\r\n </option>\r\n <option value=\"done\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.done', defaultMessage: 'Done' })}\r\n </option>\r\n <option value=\"error\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.error', defaultMessage: 'Error' })}\r\n </option>\r\n </select>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n <RefreshCw className={cn('w-4 h-4', isLoading && 'animate-spin')} />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {data?.jobs && data.jobs.length > 0 ? (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm\">\r\n <thead>\r\n <tr className=\"border-b\">\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.kind', defaultMessage: 'Kind' })}\r\n </th>\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.key', defaultMessage: 'Key' })}\r\n </th>\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.status', defaultMessage: 'Status' })}\r\n </th>\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.error', defaultMessage: 'Error' })}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {data.jobs.map((job) => (\r\n <tr\r\n key={`${job.kind}-${job.job_key}`}\r\n className=\"border-b cursor-pointer hover:bg-muted/50 transition-colors\"\r\n onClick={() => setSelectedJob(job)}\r\n >\r\n <td className=\"p-2\">\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {job.kind === 'phase1_extraction' ? 'Extraction' :\r\n job.kind === 'memory_consolidate_global' ? 'Consolidation' : job.kind}\r\n </Badge>\r\n </td>\r\n <td className=\"p-2 font-mono text-xs truncate max-w-[150px]\">{job.job_key}</td>\r\n <td className=\"p-2\"><StatusBadge status={job.status} /></td>\r\n <td className=\"p-2 text-red-500 text-xs truncate max-w-[200px]\">{job.last_error || '-'}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className=\"text-center text-muted-foreground py-8\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.noJobs', defaultMessage: 'No jobs found' })}\r\n </div>\r\n )}\r\n\r\n {/* 按状态统计 */}\r\n {data?.byStatus && Object.keys(data.byStatus).length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t flex items-center gap-4 text-sm flex-wrap\">\r\n {Object.entries(data.byStatus).map(([status, count]) => (\r\n <span key={status} className=\"flex items-center gap-1\">\r\n <StatusBadge status={status} />\r\n <span className=\"font-bold\">{count}</span>\r\n </span>\r\n ))}\r\n <span className=\"text-muted-foreground ml-auto\">\r\n Total: {data.total}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Job Detail Dialog */}\r\n <Dialog open={!!selectedJob} onOpenChange={() => setSelectedJob(null)}>\r\n <DialogContent className=\"max-w-2xl\">\r\n <DialogHeader>\r\n <DialogTitle>\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.title', defaultMessage: 'Job Details' })}\r\n </DialogTitle>\r\n </DialogHeader>\r\n <div className=\"space-y-4\">\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.kind', defaultMessage: 'Kind' })}\r\n </label>\r\n <p className=\"text-sm font-medium\">\r\n {selectedJob?.kind === 'phase1_extraction' ? 'Extraction' :\r\n selectedJob?.kind === 'memory_consolidate_global' ? 'Consolidation' : selectedJob?.kind}\r\n </p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.status', defaultMessage: 'Status' })}\r\n </label>\r\n <div className=\"mt-1\">\r\n {selectedJob && <StatusBadge status={selectedJob.status} />}\r\n </div>\r\n </div>\r\n <div className=\"col-span-2\">\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.jobKey', defaultMessage: 'Job ID' })}\r\n </label>\r\n <p className=\"text-sm font-mono break-all\">{selectedJob?.job_key}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.startedAt', defaultMessage: 'Started At' })}\r\n </label>\r\n <p className=\"text-sm\">{formatTimestamp(selectedJob?.started_at)}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.finishedAt', defaultMessage: 'Finished At' })}\r\n </label>\r\n <p className=\"text-sm\">{formatTimestamp(selectedJob?.finished_at)}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.workerId', defaultMessage: 'Worker ID' })}\r\n </label>\r\n <p className=\"text-sm font-mono truncate\">{selectedJob?.worker_id || '-'}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.retryRemaining', defaultMessage: 'Retry Remaining' })}\r\n </label>\r\n <p className=\"text-sm\">{selectedJob?.retry_remaining ?? '-'}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Error Section */}\r\n {selectedJob?.last_error && (\r\n <div>\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.error', defaultMessage: 'Error' })}\r\n </label>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopyError}\r\n className=\"h-6 px-2\"\r\n title={copiedError\r\n ? intl.formatMessage({ id: 'memory.actions.copySuccess', defaultMessage: 'Copied' })\r\n : intl.formatMessage({ id: 'memory.actions.copy', defaultMessage: 'Copy' })\r\n }\r\n >\r\n {copiedError ? (\r\n <Check className=\"w-3 h-3 text-green-500\" />\r\n ) : (\r\n <Copy className=\"w-3 h-3\" />\r\n )}\r\n </Button>\r\n </div>\r\n <pre className=\"text-xs bg-red-50 dark:bg-red-950/30 text-red-800 dark:text-red-300 p-3 rounded overflow-auto max-h-40 whitespace-pre-wrap break-all\">\r\n {selectedJob.last_error}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {!selectedJob?.last_error && (\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.error', defaultMessage: 'Error' })}\r\n </label>\r\n <p className=\"text-sm text-muted-foreground italic\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.noError', defaultMessage: 'No error' })}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Pipeline Status Banner ==========\r\n\r\nfunction PipelineStatusBanner() {\r\n const intl = useIntl();\r\n const { data } = useV2Jobs();\r\n\r\n // Detect running and error jobs\r\n const jobs = data?.jobs || [];\r\n const runningJobs = jobs.filter(j => j.status === 'running');\r\n const errorJobs = jobs.filter(j => j.status === 'error');\r\n const hasRunningJobs = runningJobs.length > 0;\r\n const errorCount = errorJobs.length;\r\n const runningCount = runningJobs.length;\r\n\r\n if (hasRunningJobs) {\r\n return (\r\n <div className=\"mb-4 p-3 bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 rounded-lg flex items-center gap-2\">\r\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\r\n <span className=\"text-sm text-blue-700 dark:text-blue-300\">\r\n {intl.formatMessage(\r\n { id: 'memory.v2.statusBanner.running', defaultMessage: 'Pipeline Running - {count} job(s) in progress' },\r\n { count: runningCount }\r\n )}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (errorCount > 0) {\r\n return (\r\n <div className=\"mb-4 p-3 bg-yellow-50 dark:bg-yellow-950/30 border border-yellow-200 dark:border-yellow-800 rounded-lg flex items-center gap-2\">\r\n <AlertCircle className=\"w-4 h-4 text-yellow-500\" />\r\n <span className=\"text-sm text-yellow-700 dark:text-yellow-300\">\r\n {intl.formatMessage(\r\n { id: 'memory.v2.statusBanner.hasErrors', defaultMessage: 'Pipeline Idle - {count} job(s) failed' },\r\n { count: errorCount }\r\n )}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\nexport function V2PipelineTab() {\r\n return (\r\n <div className=\"space-y-4\">\r\n <PipelineStatusBanner />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <ExtractionCard />\r\n <ConsolidationCard />\r\n </div>\r\n <JobsList />\r\n </div>\r\n );\r\n}\r\n\r\nexport default V2PipelineTab;\r\n","// ========================================\r\n// Memory Page\r\n// ========================================\r\n// View and manage core memory and context with CRUD operations\r\n// Includes unified vector search across all memory categories\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { toast } from 'sonner';\r\nimport {\r\n Brain,\r\n Search,\r\n Plus,\r\n Database,\r\n FileText,\r\n RefreshCw,\r\n Trash2,\r\n Edit,\r\n Tag,\r\n Loader2,\r\n Copy,\r\n Star,\r\n Archive,\r\n ArchiveRestore,\r\n AlertCircle,\r\n Layers,\r\n Zap,\r\n Terminal,\r\n GitBranch,\r\n Hash,\r\n Maximize2,\r\n Minimize2,\r\n} from 'lucide-react';\r\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/Dialog';\r\nimport { Checkbox } from '@/components/ui/Checkbox';\r\nimport { useMemory, useMemoryMutations, useUnifiedSearch, useUnifiedStats, useRecommendations, useReindex } from '@/hooks';\r\nimport type { CoreMemory, UnifiedSearchResult } from '@/lib/api';\r\nimport { cn, parseMemoryMetadata } from '@/lib/utils';\r\nimport { V2PipelineTab } from '@/components/memory/V2PipelineTab';\r\n\r\n// ========== Source Type Helpers ==========\r\n\r\nconst SOURCE_TYPE_COLORS: Record<string, string> = {\r\n core_memory: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300',\r\n cli_history: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300',\r\n workflow: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300',\r\n entity: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300',\r\n pattern: 'bg-pink-100 text-pink-800 dark:bg-pink-900/30 dark:text-pink-300',\r\n};\r\n\r\nconst SOURCE_TYPE_ICONS: Record<string, React.ReactNode> = {\r\n core_memory: <Brain className=\"w-3 h-3\" />,\r\n cli_history: <Terminal className=\"w-3 h-3\" />,\r\n workflow: <GitBranch className=\"w-3 h-3\" />,\r\n entity: <Hash className=\"w-3 h-3\" />,\r\n pattern: <Layers className=\"w-3 h-3\" />,\r\n};\r\n\r\nfunction SourceTypeBadge({ sourceType }: { sourceType: string }) {\r\n const colorClass = SOURCE_TYPE_COLORS[sourceType] || 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300';\r\n const icon = SOURCE_TYPE_ICONS[sourceType] || <Database className=\"w-3 h-3\" />;\r\n\r\n return (\r\n <span className={cn('inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium', colorClass)}>\r\n {icon}\r\n {sourceType}\r\n </span>\r\n );\r\n}\r\n\r\n// ========== Memory Card Component ==========\r\n\r\ninterface MemoryCardProps {\r\n memory: CoreMemory;\r\n onView: (memory: CoreMemory) => void;\r\n onEdit: (memory: CoreMemory) => void;\r\n onDelete: (memory: CoreMemory) => void;\r\n onCopy: (content: string) => void;\r\n onToggleFavorite: (memory: CoreMemory) => void;\r\n onArchive: (memory: CoreMemory) => void;\r\n onUnarchive: (memory: CoreMemory) => void;\r\n}\r\n\r\nfunction MemoryCard({ memory, onView, onEdit, onDelete, onCopy, onToggleFavorite, onArchive, onUnarchive }: MemoryCardProps) {\r\n const formattedDate = new Date(memory.createdAt).toLocaleDateString();\r\n\r\n // Parse metadata from memory\r\n const metadata = parseMemoryMetadata(memory.metadata);\r\n const isFavorite = metadata.favorite === true;\r\n const priority = metadata.priority || 'medium';\r\n const isArchived = memory.archived || false;\r\n const formattedSize = memory.size\r\n ? memory.size < 1024\r\n ? `${memory.size} B`\r\n : `${(memory.size / 1024).toFixed(1)} KB`\r\n : 'Unknown';\r\n\r\n return (\r\n <Card className=\"overflow-hidden\">\r\n <div\r\n className=\"p-4 cursor-pointer hover:bg-muted/50 transition-colors\"\r\n onClick={() => onView(memory)}\r\n >\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"p-2 rounded-lg bg-primary/10\">\r\n <Brain className=\"w-5 h-5 text-primary\" />\r\n </div>\r\n <div className=\"min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {memory.id}\r\n </span>\r\n {memory.source && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {memory.source}\r\n </Badge>\r\n )}\r\n {priority !== 'medium' && (\r\n <Badge variant={priority === 'high' ? 'destructive' : 'secondary'} className=\"text-xs\">\r\n {priority}\r\n </Badge>\r\n )}\r\n {isArchived && (\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n Archived\r\n </Badge>\r\n )}\r\n </div>\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {formattedDate} - {formattedSize}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\"h-8 w-8 p-0\", isFavorite && \"text-yellow-500\")}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onToggleFavorite(memory);\r\n }}\r\n >\r\n <Star className={cn(\"w-4 h-4\", isFavorite && \"fill-current\")} />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onCopy(memory.content);\r\n }}\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEdit(memory);\r\n }}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </Button>\r\n {!isArchived ? (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onArchive(memory);\r\n }}\r\n >\r\n <Archive className=\"w-4 h-4\" />\r\n </Button>\r\n ) : (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onUnarchive(memory);\r\n }}\r\n >\r\n <ArchiveRestore className=\"w-4 h-4\" />\r\n </Button>\r\n )}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0 text-destructive hover:text-destructive\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDelete(memory);\r\n }}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Preview */}\r\n <p className=\"text-sm text-muted-foreground mt-2 line-clamp-2\">\r\n {memory.content}\r\n </p>\r\n\r\n {/* Tags */}\r\n {memory.tags && memory.tags.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1 mt-2\">\r\n {memory.tags.slice(0, 5).map((tag) => (\r\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\r\n <Tag className=\"w-3 h-3 mr-1\" />\r\n {tag}\r\n </Badge>\r\n ))}\r\n {memory.tags.length > 5 && (\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n +{memory.tags.length - 5}\r\n </Badge>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Unified Search Result Card ==========\r\n\r\ninterface UnifiedResultCardProps {\r\n result: UnifiedSearchResult;\r\n onCopy: (content: string) => void;\r\n}\r\n\r\nfunction UnifiedResultCard({ result, onCopy }: UnifiedResultCardProps) {\r\n const { formatMessage } = useIntl();\r\n const scorePercent = (result.score * 100).toFixed(1);\r\n\r\n return (\r\n <Card className=\"overflow-hidden\">\r\n <div className=\"p-4\">\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <div className=\"flex items-start gap-3 min-w-0 flex-1\">\r\n <SourceTypeBadge sourceType={result.source_type} />\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <span className=\"text-sm font-medium text-foreground truncate\">\r\n {result.source_id}\r\n </span>\r\n <Badge variant=\"outline\" className=\"text-xs shrink-0\">\r\n {formatMessage({ id: 'memory.unified.score' })}: {scorePercent}%\r\n </Badge>\r\n </div>\r\n {/* Rank sources */}\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n {result.rank_sources.vector_rank != null && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.vectorRank' }, { rank: result.rank_sources.vector_rank })}\r\n </span>\r\n )}\r\n {result.rank_sources.fts_rank != null && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.ftsRank' }, { rank: result.rank_sources.fts_rank })}\r\n </span>\r\n )}\r\n {result.rank_sources.heat_score != null && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.heatScore' }, { score: result.rank_sources.heat_score.toFixed(2) })}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0 shrink-0\"\r\n onClick={() => onCopy(result.content)}\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n\r\n {/* Content preview */}\r\n <p className=\"text-sm text-muted-foreground mt-2 line-clamp-3\">\r\n {result.content}\r\n </p>\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Recommendations Panel ==========\r\n\r\ninterface RecommendationsPanelProps {\r\n memoryId: string;\r\n onCopy: (content: string) => void;\r\n}\r\n\r\nfunction RecommendationsPanel({ memoryId, onCopy }: RecommendationsPanelProps) {\r\n const { formatMessage } = useIntl();\r\n const { recommendations, isLoading } = useRecommendations({\r\n memoryId,\r\n limit: 5,\r\n enabled: !!memoryId,\r\n });\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center gap-2 text-muted-foreground py-2\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span className=\"text-sm\">{formatMessage({ id: 'memory.unified.searching' })}</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (recommendations.length === 0) {\r\n return (\r\n <p className=\"text-sm text-muted-foreground py-2\">\r\n {formatMessage({ id: 'memory.unified.noRecommendations' })}\r\n </p>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n {recommendations.map((rec) => (\r\n <div\r\n key={rec.source_id}\r\n className=\"flex items-start gap-2 p-2 rounded-md bg-muted/30 hover:bg-muted/50 transition-colors\"\r\n >\r\n <SourceTypeBadge sourceType={rec.source_type} />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-xs font-medium text-foreground truncate\">\r\n {rec.source_id}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground shrink-0\">\r\n {(rec.score * 100).toFixed(0)}%\r\n </span>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground line-clamp-2 mt-0.5\">\r\n {rec.content}\r\n </p>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-6 w-6 p-0 shrink-0\"\r\n onClick={() => onCopy(rec.content)}\r\n >\r\n <Copy className=\"w-3 h-3\" />\r\n </Button>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== View Memory Dialog ==========\r\n\r\ninterface ViewMemoryDialogProps {\r\n memory: CoreMemory | null;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onEdit: (memory: CoreMemory) => void;\r\n onCopy: (content: string) => void;\r\n}\r\n\r\nfunction ViewMemoryDialog({ memory, open, onOpenChange, onEdit, onCopy }: ViewMemoryDialogProps) {\r\n const { formatMessage } = useIntl();\r\n if (!memory) return null;\r\n\r\n const metadata = parseMemoryMetadata(memory.metadata);\r\n const priority = metadata.priority || 'medium';\r\n const formattedDate = new Date(memory.createdAt).toLocaleDateString();\r\n const formattedSize = memory.size\r\n ? memory.size < 1024\r\n ? `${memory.size} B`\r\n : `${(memory.size / 1024).toFixed(1)} KB`\r\n : 'Unknown';\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-3xl max-h-[80vh] flex flex-col\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <Brain className=\"w-5 h-5 text-primary\" />\r\n {memory.id}\r\n </DialogTitle>\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n {memory.source && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {memory.source}\r\n </Badge>\r\n )}\r\n {priority !== 'medium' && (\r\n <Badge variant={priority === 'high' ? 'destructive' : 'secondary'} className=\"text-xs\">\r\n {priority}\r\n </Badge>\r\n )}\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formattedDate} - {formattedSize}\r\n </span>\r\n </div>\r\n </DialogHeader>\r\n\r\n {/* Tags */}\r\n {memory.tags && memory.tags.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1\">\r\n {memory.tags.map((tag) => (\r\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\r\n <Tag className=\"w-3 h-3 mr-1\" />\r\n {tag}\r\n </Badge>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto mt-2\">\r\n <pre className=\"text-sm text-foreground whitespace-pre-wrap font-mono bg-muted/30 p-4 rounded-lg\">\r\n {memory.content}\r\n </pre>\r\n </div>\r\n\r\n {/* Recommendations */}\r\n <div className=\"pt-2 border-t border-border\">\r\n <h4 className=\"text-sm font-medium text-foreground flex items-center gap-1.5 mb-2\">\r\n <Zap className=\"w-4 h-4 text-primary\" />\r\n {formatMessage({ id: 'memory.unified.recommendations' })}\r\n </h4>\r\n <RecommendationsPanel memoryId={memory.id} onCopy={onCopy} />\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-2 pt-2 border-t border-border\">\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => onCopy(memory.content)}>\r\n <Copy className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.actions.copy' })}\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => { onOpenChange(false); onEdit(memory); }}>\r\n <Edit className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.actions.edit' })}\r\n </Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\n// ========== New Memory Dialog ==========\r\n\r\ninterface NewMemoryDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onSubmit: (data: { content: string; tags?: string[]; metadata?: Record<string, any> }) => void;\r\n isCreating: boolean;\r\n editingMemory?: CoreMemory | null;\r\n}\r\n\r\nfunction NewMemoryDialog({\r\n open,\r\n onOpenChange,\r\n onSubmit,\r\n isCreating,\r\n editingMemory,\r\n}: NewMemoryDialogProps) {\r\n const { formatMessage } = useIntl();\r\n const [content, setContent] = useState(editingMemory?.content || '');\r\n const [tagsInput, setTagsInput] = useState(editingMemory?.tags?.join(', ') || '');\r\n const [isFavorite, setIsFavorite] = useState(false);\r\n const [priority, setPriority] = useState<'low' | 'medium' | 'high'>('medium');\r\n\r\n // Initialize from editing memory metadata\r\n useEffect(() => {\r\n if (editingMemory) {\r\n // Sync content and tags\r\n setContent(editingMemory.content || '');\r\n setTagsInput(editingMemory.tags?.join(', ') || '');\r\n\r\n // Sync metadata\r\n const metadata = parseMemoryMetadata(editingMemory.metadata);\r\n setIsFavorite(metadata.favorite === true);\r\n setPriority(metadata.priority || 'medium');\r\n } else {\r\n // New mode: reset all state\r\n setContent('');\r\n setTagsInput('');\r\n setIsFavorite(false);\r\n setPriority('medium');\r\n }\r\n }, [editingMemory]);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (content.trim()) {\r\n const tags = tagsInput\r\n .split(',')\r\n .map((t) => t.trim())\r\n .filter(Boolean);\r\n\r\n // Build metadata object\r\n const metadata: Record<string, any> = {};\r\n if (isFavorite) metadata.favorite = true;\r\n if (priority !== 'medium') metadata.priority = priority;\r\n\r\n onSubmit({\r\n content: content.trim(),\r\n tags: tags.length > 0 ? tags : undefined,\r\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\r\n });\r\n setContent('');\r\n setTagsInput('');\r\n setIsFavorite(false);\r\n setPriority('medium');\r\n }\r\n };\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-2xl\">\r\n <DialogHeader>\r\n <DialogTitle>\r\n {editingMemory ? formatMessage({ id: 'memory.createDialog.editTitle' }) : formatMessage({ id: 'memory.createDialog.title' })}\r\n </DialogTitle>\r\n </DialogHeader>\r\n <form onSubmit={handleSubmit} className=\"space-y-4 mt-4\">\r\n <div>\r\n <label className=\"text-sm font-medium text-foreground\">{formatMessage({ id: 'memory.createDialog.labels.content' })}</label>\r\n <textarea\r\n value={content}\r\n onChange={(e) => setContent(e.target.value)}\r\n placeholder={formatMessage({ id: 'memory.createDialog.placeholders.content' })}\r\n className=\"mt-1 w-full min-h-[200px] p-3 bg-background border border-input rounded-md text-sm font-mono resize-none focus:outline-none focus:ring-2 focus:ring-primary\"\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"text-sm font-medium text-foreground\">{formatMessage({ id: 'memory.createDialog.labels.tags' })}</label>\r\n <Input\r\n value={tagsInput}\r\n onChange={(e) => setTagsInput(e.target.value)}\r\n placeholder={formatMessage({ id: 'memory.createDialog.placeholders.tags' })}\r\n className=\"mt-1\"\r\n />\r\n </div>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Checkbox\r\n id=\"favorite\"\r\n checked={isFavorite}\r\n onCheckedChange={(checked) => setIsFavorite(checked === true)}\r\n />\r\n <label htmlFor=\"favorite\" className=\"text-sm font-medium cursor-pointer\">\r\n {formatMessage({ id: 'memory.createDialog.labels.favorite' })}\r\n </label>\r\n </div>\r\n <div>\r\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'memory.createDialog.labels.priority' })}</label>\r\n <select\r\n value={priority}\r\n onChange={(e) => setPriority(e.target.value as 'low' | 'medium' | 'high')}\r\n className=\"mt-1 w-full p-2 bg-background border border-input rounded-md text-sm\"\r\n >\r\n <option value=\"low\">{formatMessage({ id: 'memory.priority.low' })}</option>\r\n <option value=\"medium\">{formatMessage({ id: 'memory.priority.medium' })}</option>\r\n <option value=\"high\">{formatMessage({ id: 'memory.priority.high' })}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\r\n {formatMessage({ id: 'memory.createDialog.buttons.cancel' })}\r\n </Button>\r\n <Button type=\"submit\" disabled={isCreating || !content.trim()}>\r\n {isCreating ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\r\n {editingMemory ? formatMessage({ id: 'memory.createDialog.buttons.updating' }) : formatMessage({ id: 'memory.createDialog.buttons.creating' })}\r\n </>\r\n ) : (\r\n <>\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {editingMemory ? formatMessage({ id: 'memory.createDialog.buttons.update' }) : formatMessage({ id: 'memory.createDialog.buttons.create' })}\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n </form>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\n// ========== Category Filter ==========\r\n\r\nconst CATEGORY_OPTIONS = [\r\n { value: '', labelId: 'memory.filters.categoryAll' },\r\n { value: 'core_memory', labelId: 'memory.filters.categoryCoreMemory' },\r\n { value: 'cli_history', labelId: 'memory.filters.categoryCliHistory' },\r\n { value: 'workflow', labelId: 'memory.filters.categoryWorkflow' },\r\n { value: 'entity', labelId: 'memory.filters.categoryEntity' },\r\n { value: 'pattern', labelId: 'memory.filters.categoryPattern' },\r\n];\r\n\r\n// ========== Main Page Component ==========\r\n\r\nexport function MemoryPage() {\r\n const { formatMessage } = useIntl();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedTags, setSelectedTags] = useState<string[]>([]);\r\n const [isNewMemoryOpen, setIsNewMemoryOpen] = useState(false);\r\n const [editingMemory, setEditingMemory] = useState<CoreMemory | null>(null);\r\n const [viewingMemory, setViewingMemory] = useState<CoreMemory | null>(null);\r\n const [currentTab, setCurrentTab] = useState<'memories' | 'favorites' | 'archived' | 'unifiedSearch' | 'v2pipeline'>('memories');\r\n const [unifiedQuery, setUnifiedQuery] = useState('');\r\n const [selectedCategory, setSelectedCategory] = useState('');\r\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\r\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\r\n\r\n const isUnifiedTab = currentTab === 'unifiedSearch';\r\n\r\n // Build filter based on current tab (for non-unified tabs)\r\n const favoriteFilter = currentTab === 'favorites' ? { favorite: true } : undefined;\r\n const archivedFilter = currentTab === 'archived' ? { archived: true } : { archived: false };\r\n\r\n const {\r\n memories,\r\n totalSize,\r\n claudeMdCount,\r\n allTags,\r\n isLoading,\r\n isFetching,\r\n error,\r\n refetch,\r\n } = useMemory({\r\n filter: {\r\n search: searchQuery || undefined,\r\n tags: selectedTags.length > 0 ? selectedTags : undefined,\r\n ...favoriteFilter,\r\n ...archivedFilter,\r\n },\r\n enabled: !isUnifiedTab,\r\n });\r\n\r\n // Unified search\r\n const {\r\n results: unifiedResults,\r\n total: unifiedTotal,\r\n isLoading: unifiedLoading,\r\n isFetching: unifiedFetching,\r\n error: unifiedError,\r\n refetch: refetchUnified,\r\n } = useUnifiedSearch({\r\n query: unifiedQuery,\r\n categories: selectedCategory || undefined,\r\n topK: 20,\r\n enabled: isUnifiedTab && unifiedQuery.trim().length > 0,\r\n });\r\n\r\n // Unified stats\r\n const {\r\n stats: unifiedStats,\r\n isLoading: statsLoading,\r\n refetch: refetchStats,\r\n } = useUnifiedStats();\r\n\r\n // Reindex mutation\r\n const { reindex, isReindexing } = useReindex();\r\n\r\n const { createMemory, updateMemory, deleteMemory, archiveMemory, unarchiveMemory, isCreating, isUpdating } =\r\n useMemoryMutations();\r\n\r\n const handleCreateMemory = async (data: { content: string; tags?: string[]; metadata?: Record<string, any> }) => {\r\n if (editingMemory) {\r\n await updateMemory(editingMemory.id, data);\r\n setEditingMemory(null);\r\n } else {\r\n await createMemory(data);\r\n }\r\n setIsNewMemoryOpen(false);\r\n };\r\n\r\n const handleEdit = (memory: CoreMemory) => {\r\n setEditingMemory(memory);\r\n setIsNewMemoryOpen(true);\r\n };\r\n\r\n const handleDelete = async (memory: CoreMemory) => {\r\n if (confirm(`Delete memory \"${memory.id}\"?`)) {\r\n await deleteMemory(memory.id);\r\n }\r\n };\r\n\r\n const handleToggleFavorite = async (memory: CoreMemory) => {\r\n try {\r\n const currentMetadata = parseMemoryMetadata(memory.metadata);\r\n const newFavorite = !(currentMetadata.favorite === true);\r\n await updateMemory(memory.id, {\r\n content: memory.content,\r\n metadata: { ...currentMetadata, favorite: newFavorite },\r\n });\r\n toast.success(\r\n formatMessage({\r\n id: newFavorite ? 'memory.actions.favoriteAdded' : 'memory.actions.favoriteRemoved',\r\n })\r\n );\r\n } catch (err) {\r\n console.error('Failed to toggle favorite:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.favoriteError' }));\r\n }\r\n };\r\n\r\n const handleArchive = async (memory: CoreMemory) => {\r\n try {\r\n await archiveMemory(memory.id);\r\n toast.success(formatMessage({ id: 'memory.actions.archiveSuccess' }));\r\n } catch (err) {\r\n console.error('Failed to archive:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.archiveError' }));\r\n }\r\n };\r\n\r\n const handleUnarchive = async (memory: CoreMemory) => {\r\n try {\r\n await unarchiveMemory(memory.id);\r\n toast.success(formatMessage({ id: 'memory.actions.unarchiveSuccess' }));\r\n } catch (err) {\r\n console.error('Failed to unarchive:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.unarchiveError' }));\r\n }\r\n };\r\n\r\n const copyToClipboard = async (content: string) => {\r\n try {\r\n await navigator.clipboard.writeText(content);\r\n toast.success(formatMessage({ id: 'memory.actions.copySuccess' }));\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.copyError' }));\r\n }\r\n };\r\n\r\n const handleReindex = async () => {\r\n try {\r\n await reindex();\r\n toast.success(formatMessage({ id: 'memory.unified.reindexSuccess' }));\r\n refetchStats();\r\n } catch (err) {\r\n console.error('Failed to reindex:', err);\r\n toast.error(formatMessage({ id: 'memory.unified.reindexError' }));\r\n }\r\n };\r\n\r\n const toggleTag = (tag: string) => {\r\n setSelectedTags((prev) =>\r\n prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag]\r\n );\r\n };\r\n\r\n const formattedTotalSize = totalSize < 1024\r\n ? `${totalSize} B`\r\n : totalSize < 1024 * 1024\r\n ? `${(totalSize / 1024).toFixed(1)} KB`\r\n : `${(totalSize / (1024 * 1024)).toFixed(1)} MB`;\r\n\r\n const handleRefresh = () => {\r\n if (isUnifiedTab) {\r\n refetchUnified();\r\n refetchStats();\r\n } else {\r\n refetch();\r\n }\r\n };\r\n\r\n const isRefreshing = isUnifiedTab ? unifiedFetching : isFetching;\r\n const activeError = isUnifiedTab ? unifiedError : error;\r\n\r\n return (\r\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\r\n {/* Page Header */}\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\r\n <Brain className=\"w-6 h-6 text-primary\" />\r\n {formatMessage({ id: 'memory.title' })}\r\n </h1>\r\n <p className=\"text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'memory.description' })}\r\n </p>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={toggleImmersiveMode}\r\n className={cn(\r\n 'p-2 rounded-md transition-colors',\r\n isImmersiveMode\r\n ? 'bg-primary/10 text-primary'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\r\n >\r\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\r\n </button>\r\n {isUnifiedTab && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleReindex}\r\n disabled={isReindexing}\r\n >\r\n {isReindexing ? (\r\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\r\n ) : (\r\n <Zap className=\"w-4 h-4 mr-2\" />\r\n )}\r\n {formatMessage({ id: isReindexing ? 'memory.unified.reindexing' : 'memory.unified.reindex' })}\r\n </Button>\r\n )}\r\n <Button variant=\"outline\" onClick={handleRefresh} disabled={isRefreshing}>\r\n <RefreshCw className={cn('w-4 h-4 mr-2', isRefreshing && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh' })}\r\n </Button>\r\n {!isUnifiedTab && (\r\n <Button onClick={() => { setEditingMemory(null); setIsNewMemoryOpen(true); }}>\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.actions.add' })}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <TabsNavigation\r\n value={currentTab}\r\n onValueChange={(v) => setCurrentTab(v as typeof currentTab)}\r\n tabs={[\r\n {\r\n value: 'memories',\r\n label: formatMessage({ id: 'memory.tabs.memories' }),\r\n icon: <Brain className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'favorites',\r\n label: formatMessage({ id: 'memory.tabs.favorites' }),\r\n icon: <Star className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'archived',\r\n label: formatMessage({ id: 'memory.tabs.archived' }),\r\n icon: <Archive className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'unifiedSearch',\r\n label: formatMessage({ id: 'memory.tabs.unifiedSearch' }),\r\n icon: <Search className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'v2pipeline',\r\n label: 'V2 Pipeline',\r\n icon: <Zap className=\"h-4 w-4\" />,\r\n },\r\n ]}\r\n />\r\n\r\n {/* Error alert */}\r\n {activeError && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{activeError.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleRefresh}>\r\n {formatMessage({ id: 'home.errors.retry' })}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Stats Cards */}\r\n {isUnifiedTab ? (\r\n /* Unified Stats Cards */\r\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-primary/10\">\r\n <Database className=\"w-5 h-5 text-primary\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.core_memories.total ?? 0)}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.count' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-orange-500/10\">\r\n <Hash className=\"w-5 h-5 text-orange-500\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.entities ?? 0)}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.entities' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-blue-500/10\">\r\n <Layers className=\"w-5 h-5 text-blue-500\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.vector_index.total_chunks ?? 0)}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.vectorChunks' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={cn(\r\n \"p-2 rounded-lg\",\r\n unifiedStats?.vector_index.hnsw_available ? \"bg-green-500/10\" : \"bg-muted\"\r\n )}>\r\n <Zap className={cn(\r\n \"w-5 h-5\",\r\n unifiedStats?.vector_index.hnsw_available ? \"text-green-500\" : \"text-muted-foreground\"\r\n )} />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.vector_index.hnsw_available ? unifiedStats.vector_index.hnsw_count : 'N/A')}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.hnswStatus' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n </div>\r\n ) : (\r\n /* Standard Stats Cards */\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-primary/10\">\r\n <Database className=\"w-5 h-5 text-primary\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">{memories.length}</div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.count' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-info/10\">\r\n <FileText className=\"w-5 h-5 text-info\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">{claudeMdCount}</div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.claudeMdCount' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-success/10\">\r\n <Brain className=\"w-5 h-5 text-success\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">{formattedTotalSize}</div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.totalSize' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n </div>\r\n )}\r\n\r\n {/* Search and Filters */}\r\n {isUnifiedTab ? (\r\n /* Unified Search Input + Category Filter */\r\n <div className=\"space-y-3\">\r\n <div className=\"flex gap-3\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'memory.filters.searchUnified' })}\r\n value={unifiedQuery}\r\n onChange={(e) => setUnifiedQuery(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n <select\r\n value={selectedCategory}\r\n onChange={(e) => setSelectedCategory(e.target.value)}\r\n className=\"px-3 py-2 bg-background border border-input rounded-md text-sm min-w-[160px]\"\r\n >\r\n {CATEGORY_OPTIONS.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {formatMessage({ id: opt.labelId })}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n {unifiedQuery.trim().length > 0 && !unifiedLoading && (\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.resultCount' }, { count: unifiedTotal })}\r\n </p>\r\n )}\r\n </div>\r\n ) : (\r\n /* Standard Search + Tag Filters */\r\n <div className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'memory.filters.search' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n\r\n {/* Tags Filter */}\r\n {allTags.length > 0 && (\r\n <div className=\"flex flex-wrap gap-2\">\r\n <span className=\"text-sm text-muted-foreground py-1\">{formatMessage({ id: 'memory.card.tags' })}:</span>\r\n {allTags.map((tag) => (\r\n <Button\r\n key={tag}\r\n variant={selectedTags.includes(tag) ? 'default' : 'outline'}\r\n size=\"sm\"\r\n className=\"h-7\"\r\n onClick={() => toggleTag(tag)}\r\n >\r\n <Tag className=\"w-3 h-3 mr-1\" />\r\n {tag}\r\n </Button>\r\n ))}\r\n {selectedTags.length > 0 && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-7\"\r\n onClick={() => setSelectedTags([])}\r\n >\r\n {formatMessage({ id: 'memory.filters.clear' })}\r\n </Button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content Area */}\r\n {currentTab === 'v2pipeline' ? (\r\n /* V2 Pipeline Tab */\r\n <V2PipelineTab />\r\n ) : isUnifiedTab ? (\r\n /* Unified Search Results */\r\n unifiedLoading ? (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary mr-2\" />\r\n <span className=\"text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.searching' })}\r\n </span>\r\n </div>\r\n ) : unifiedQuery.trim().length === 0 ? (\r\n <Card className=\"p-8 text-center\">\r\n <Search className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\r\n {formatMessage({ id: 'memory.tabs.unifiedSearch' })}\r\n </h3>\r\n <p className=\"mt-2 text-muted-foreground\">\r\n {formatMessage({ id: 'memory.filters.searchUnified' })}\r\n </p>\r\n </Card>\r\n ) : unifiedResults.length === 0 ? (\r\n <Card className=\"p-8 text-center\">\r\n <Search className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\r\n {formatMessage({ id: 'memory.unified.noResults' })}\r\n </h3>\r\n </Card>\r\n ) : (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {unifiedResults.map((result) => (\r\n <UnifiedResultCard\r\n key={`${result.source_type}-${result.source_id}`}\r\n result={result}\r\n onCopy={copyToClipboard}\r\n />\r\n ))}\r\n </div>\r\n )\r\n ) : (\r\n /* Standard Memory List */\r\n isLoading ? (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {[1, 2, 3, 4, 5, 6].map((i) => (\r\n <div key={i} className=\"h-64 bg-muted animate-pulse rounded-lg\" />\r\n ))}\r\n </div>\r\n ) : memories.length === 0 ? (\r\n <Card className=\"p-8 text-center\">\r\n <Brain className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\r\n {formatMessage({ id: 'memory.emptyState.title' })}\r\n </h3>\r\n <p className=\"mt-2 text-muted-foreground\">\r\n {formatMessage({ id: 'memory.emptyState.message' })}\r\n </p>\r\n <Button className=\"mt-4\" onClick={() => { setEditingMemory(null); setIsNewMemoryOpen(true); }}>\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.emptyState.createFirst' })}\r\n </Button>\r\n </Card>\r\n ) : (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {memories.map((memory) => (\r\n <MemoryCard\r\n key={memory.id}\r\n memory={memory}\r\n onView={setViewingMemory}\r\n onEdit={handleEdit}\r\n onDelete={handleDelete}\r\n onCopy={copyToClipboard}\r\n onToggleFavorite={handleToggleFavorite}\r\n onArchive={handleArchive}\r\n onUnarchive={handleUnarchive}\r\n />\r\n ))}\r\n </div>\r\n )\r\n )}\r\n\r\n {/* View Memory Dialog */}\r\n <ViewMemoryDialog\r\n memory={viewingMemory}\r\n open={viewingMemory !== null}\r\n onOpenChange={(open) => { if (!open) setViewingMemory(null); }}\r\n onEdit={handleEdit}\r\n onCopy={copyToClipboard}\r\n />\r\n\r\n {/* New/Edit Memory Dialog */}\r\n <NewMemoryDialog\r\n open={isNewMemoryOpen}\r\n onOpenChange={(open) => {\r\n setIsNewMemoryOpen(open);\r\n if (!open) setEditingMemory(null);\r\n }}\r\n onSubmit={handleCreateMemory}\r\n isCreating={isCreating || isUpdating}\r\n editingMemory={editingMemory}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default MemoryPage;\r\n"],"names":["STALE_TIME","useMemory","options","filter","staleTime","enabled","queryClient","useQueryClient","projectPath","useWorkflowStore","selectProjectPath","queryEnabled","query","useQuery","workspaceQueryKeys","fetchMemories","allMemories","_a","totalSize","_b","claudeMdCount","_c","filteredMemories","memories","searchLower","m","t","tag","parseMemoryMetadata","allTags","refetch","invalidate","useCreateMemory","mutation","useMutation","input","createMemory","useUpdateMemory","memoryId","updateMemory","useDeleteMemory","deleteMemory","useArchiveMemory","archiveMemoryApi","useUnarchiveMemory","unarchiveMemoryApi","useMemoryMutations","create","update","remove","archive","unarchive","useUnifiedSearch","categories","topK","minScore","result","fetchUnifiedSearch","useUnifiedStats","fetchUnifiedStats","useRecommendations","limit","fetchRecommendations","useReindex","triggerReindex","memoryV2Keys","path","filters","includeNative","useExtractionStatus","getExtractionStatus","useConsolidationStatus","getConsolidationStatus","useV2Jobs","getV2Jobs","useTriggerExtraction","maxSessions","triggerExtraction","useTriggerConsolidation","triggerConsolidation","usePreviewSessions","previewExtractionQueue","useTriggerSelectiveExtraction","params","triggerSelectiveExtraction","formatBytes","bytes","k","sizes","formatTimestamp","timestamp","date","formatDistanceToNow","SessionPreviewPanel","onClose","onExtractComplete","intl","useIntl","searchQuery","setSearchQuery","useState","selectedIds","setSelectedIds","setIncludeNative","data","isLoading","filteredSessions","useMemo","session","readySessions","s","toggleSelection","sessionId","prev","next","selectAll","selectNone","handleExtract","jsxs","jsx","Eye","Checkbox","checked","Button","Loader2","Search","Input","e","isReady","isSelected","isDisabled","cn","Badge","CheckCircle2","Clock","XCircle","Fragment","formatRelativeTime","STATUS_CONFIG","CheckCircle","AlertCircle","StatusBadge","status","config","ExtractionCard","trigger","setMaxSessions","showPreview","setShowPreview","handleTrigger","hasRunningJob","j","lastRunText","Card","Zap","Play","RefreshCw","job","Dialog","DialogContent","ConsolidationCard","copied","setCopied","handleCopy","err","isRunning","Database","DialogHeader","DialogTitle","FileText","Check","Copy","ReactMarkdown","remarkGfm","rehypeHighlight","JobsList","kindFilter","setKindFilter","statusFilter","setStatusFilter","selectedJob","setSelectedJob","copiedError","setCopiedError","handleCopyError","Activity","count","PipelineStatusBanner","jobs","runningJobs","errorJobs","hasRunningJobs","errorCount","runningCount","V2PipelineTab","SOURCE_TYPE_COLORS","SOURCE_TYPE_ICONS","Brain","Terminal","GitBranch","Hash","Layers","SourceTypeBadge","sourceType","colorClass","icon","MemoryCard","memory","onView","onEdit","onDelete","onCopy","onToggleFavorite","onArchive","onUnarchive","formattedDate","metadata","isFavorite","priority","isArchived","formattedSize","Star","Edit","ArchiveRestore","Archive","Trash2","Tag","UnifiedResultCard","formatMessage","scorePercent","RecommendationsPanel","recommendations","rec","ViewMemoryDialog","open","onOpenChange","NewMemoryDialog","onSubmit","isCreating","editingMemory","content","setContent","tagsInput","setTagsInput","setIsFavorite","setPriority","useEffect","handleSubmit","tags","Plus","CATEGORY_OPTIONS","MemoryPage","selectedTags","setSelectedTags","isNewMemoryOpen","setIsNewMemoryOpen","setEditingMemory","viewingMemory","setViewingMemory","currentTab","setCurrentTab","unifiedQuery","setUnifiedQuery","selectedCategory","setSelectedCategory","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","isUnifiedTab","favoriteFilter","archivedFilter","isFetching","error","unifiedResults","unifiedTotal","unifiedLoading","unifiedFetching","unifiedError","refetchUnified","unifiedStats","statsLoading","refetchStats","reindex","isReindexing","archiveMemory","unarchiveMemory","isUpdating","handleCreateMemory","handleEdit","handleDelete","handleToggleFavorite","currentMetadata","newFavorite","toast","handleArchive","handleUnarchive","copyToClipboard","handleReindex","toggleTag","formattedTotalSize","handleRefresh","isRefreshing","activeError","Minimize2","Maximize2","TabsNavigation","v","opt","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MemoryPage-BI4FAXhs.js","sources":["../../src/hooks/useMemory.ts","../../src/hooks/useUnifiedSearch.ts","../../src/hooks/useMemoryV2.ts","../../src/components/memory/SessionPreviewPanel.tsx","../../src/components/memory/V2PipelineTab.tsx","../../src/pages/MemoryPage.tsx"],"sourcesContent":["// ========================================\r\n// useMemory Hook\r\n// ========================================\r\n// TanStack Query hooks for core memory management\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n fetchMemories,\r\n createMemory,\r\n updateMemory,\r\n deleteMemory,\r\n archiveMemory as archiveMemoryApi,\r\n unarchiveMemory as unarchiveMemoryApi,\r\n type CoreMemory,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\nimport { parseMemoryMetadata } from '@/lib/utils';\r\n\r\n// Query key factory\r\nexport const memoryKeys = {\r\n all: ['memory'] as const,\r\n lists: () => [...memoryKeys.all, 'list'] as const,\r\n list: (filters?: MemoryFilter) => [...memoryKeys.lists(), filters] as const,\r\n details: () => [...memoryKeys.all, 'detail'] as const,\r\n detail: (id: string) => [...memoryKeys.details(), id] as const,\r\n};\r\n\r\n// Default stale time: 1 minute\r\nconst STALE_TIME = 60 * 1000;\r\n\r\nexport interface MemoryFilter {\r\n search?: string;\r\n tags?: string[];\r\n favorite?: boolean;\r\n archived?: boolean;\r\n}\r\n\r\nexport interface UseMemoryOptions {\r\n filter?: MemoryFilter;\r\n staleTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseMemoryReturn {\r\n memories: CoreMemory[];\r\n totalSize: number;\r\n claudeMdCount: number;\r\n allTags: string[];\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n invalidate: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching and filtering memories\r\n */\r\nexport function useMemory(options: UseMemoryOptions = {}): UseMemoryReturn {\r\n const { filter, staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n // Only enable query when projectPath is available\r\n const queryEnabled = enabled && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.memoryList(projectPath),\r\n queryFn: () => fetchMemories(projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n });\r\n\r\n const allMemories = query.data?.memories ?? [];\r\n const totalSize = query.data?.totalSize ?? 0;\r\n const claudeMdCount = query.data?.claudeMdCount ?? 0;\r\n\r\n // Apply filters\r\n const filteredMemories = (() => {\r\n let memories = allMemories;\r\n\r\n if (filter?.search) {\r\n const searchLower = filter.search.toLowerCase();\r\n memories = memories.filter(\r\n (m) =>\r\n m.content.toLowerCase().includes(searchLower) ||\r\n m.source?.toLowerCase().includes(searchLower) ||\r\n m.tags?.some((t) => t.toLowerCase().includes(searchLower))\r\n );\r\n }\r\n\r\n if (filter?.tags && filter.tags.length > 0) {\r\n memories = memories.filter((m) =>\r\n filter.tags!.some((tag) => m.tags?.includes(tag))\r\n );\r\n }\r\n\r\n // Filter by favorite status (from metadata)\r\n if (filter?.favorite === true) {\r\n memories = memories.filter((m) => {\r\n const metadata = parseMemoryMetadata(m.metadata);\r\n return metadata.favorite === true;\r\n });\r\n }\r\n\r\n // Filter by archived status\r\n if (filter?.archived === true) {\r\n memories = memories.filter((m) => m.archived === true);\r\n } else if (filter?.archived === false) {\r\n memories = memories.filter((m) => m.archived !== true);\r\n }\r\n\r\n return memories;\r\n })();\r\n\r\n // Collect all unique tags\r\n const allTags = Array.from(\r\n new Set(allMemories.flatMap((m) => m.tags ?? []))\r\n ).sort();\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n const invalidate = async () => {\r\n if (projectPath) {\r\n await queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.memory(projectPath) });\r\n }\r\n };\r\n\r\n return {\r\n memories: filteredMemories,\r\n totalSize,\r\n claudeMdCount,\r\n allTags,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n invalidate,\r\n };\r\n}\r\n\r\n// ========== Mutations ==========\r\n\r\nexport interface UseCreateMemoryReturn {\r\n createMemory: (input: { content: string; tags?: string[]; metadata?: Record<string, any> }) => Promise<CoreMemory>;\r\n isCreating: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useCreateMemory(): UseCreateMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (input: { content: string; tags?: string[]; metadata?: Record<string, any> }) =>\r\n createMemory(input, projectPath),\r\n onSuccess: () => {\r\n // Invalidate memory cache to trigger refetch\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n createMemory: mutation.mutateAsync,\r\n isCreating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseUpdateMemoryReturn {\r\n updateMemory: (memoryId: string, input: Partial<CoreMemory>) => Promise<CoreMemory>;\r\n isUpdating: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useUpdateMemory(): UseUpdateMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: ({ memoryId, input }: { memoryId: string; input: Partial<CoreMemory> }) =>\r\n updateMemory(memoryId, input, projectPath),\r\n onSuccess: () => {\r\n // Invalidate memory cache to trigger refetch\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n updateMemory: (memoryId, input) => mutation.mutateAsync({ memoryId, input }),\r\n isUpdating: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseDeleteMemoryReturn {\r\n deleteMemory: (memoryId: string) => Promise<void>;\r\n isDeleting: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useDeleteMemory(): UseDeleteMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (memoryId: string) => deleteMemory(memoryId, projectPath),\r\n onSuccess: () => {\r\n // Invalidate to ensure sync with server\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n deleteMemory: mutation.mutateAsync,\r\n isDeleting: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseArchiveMemoryReturn {\r\n archiveMemory: (memoryId: string) => Promise<void>;\r\n isArchiving: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useArchiveMemory(): UseArchiveMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (memoryId: string) => archiveMemoryApi(memoryId, projectPath),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n archiveMemory: mutation.mutateAsync,\r\n isArchiving: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\nexport interface UseUnarchiveMemoryReturn {\r\n unarchiveMemory: (memoryId: string) => Promise<void>;\r\n isUnarchiving: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function useUnarchiveMemory(): UseUnarchiveMemoryReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: (memoryId: string) => unarchiveMemoryApi(memoryId, projectPath),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: projectPath ? workspaceQueryKeys.memory(projectPath) : ['memory'] });\r\n },\r\n });\r\n\r\n return {\r\n unarchiveMemory: mutation.mutateAsync,\r\n isUnarchiving: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n\r\n/**\r\n * Combined hook for all memory mutations\r\n */\r\nexport function useMemoryMutations() {\r\n const create = useCreateMemory();\r\n const update = useUpdateMemory();\r\n const remove = useDeleteMemory();\r\n const archive = useArchiveMemory();\r\n const unarchive = useUnarchiveMemory();\r\n\r\n return {\r\n createMemory: create.createMemory,\r\n updateMemory: update.updateMemory,\r\n deleteMemory: remove.deleteMemory,\r\n archiveMemory: archive.archiveMemory,\r\n unarchiveMemory: unarchive.unarchiveMemory,\r\n isCreating: create.isCreating,\r\n isUpdating: update.isUpdating,\r\n isDeleting: remove.isDeleting,\r\n isArchiving: archive.isArchiving,\r\n isUnarchiving: unarchive.isUnarchiving,\r\n isMutating: create.isCreating || update.isUpdating || remove.isDeleting || archive.isArchiving || unarchive.isUnarchiving,\r\n };\r\n}\r\n","// ========================================\r\n// useUnifiedSearch Hook\r\n// ========================================\r\n// TanStack Query hooks for unified memory search, stats, and recommendations\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n fetchUnifiedSearch,\r\n fetchUnifiedStats,\r\n fetchRecommendations,\r\n triggerReindex,\r\n type UnifiedSearchResult,\r\n type UnifiedMemoryStats,\r\n type RecommendationResult,\r\n type ReindexResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// Default stale time: 1 minute\r\nconst STALE_TIME = 60 * 1000;\r\n\r\n// ========== Unified Search ==========\r\n\r\nexport interface UseUnifiedSearchOptions {\r\n query: string;\r\n categories?: string;\r\n topK?: number;\r\n minScore?: number;\r\n enabled?: boolean;\r\n staleTime?: number;\r\n}\r\n\r\nexport interface UseUnifiedSearchReturn {\r\n results: UnifiedSearchResult[];\r\n total: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for unified vector + FTS5 search across all memory categories\r\n */\r\nexport function useUnifiedSearch(options: UseUnifiedSearchOptions): UseUnifiedSearchReturn {\r\n const {\r\n query,\r\n categories,\r\n topK,\r\n minScore,\r\n enabled = true,\r\n staleTime = STALE_TIME,\r\n } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n // Only enable query when projectPath exists and query is non-empty\r\n const queryEnabled = enabled && !!projectPath && query.trim().length > 0;\r\n\r\n const result = useQuery({\r\n queryKey: workspaceQueryKeys.unifiedSearch(projectPath || '', query, categories),\r\n queryFn: () =>\r\n fetchUnifiedSearch(\r\n query,\r\n { topK, minScore, category: categories },\r\n projectPath || undefined\r\n ),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 1,\r\n });\r\n\r\n const refetch = async () => {\r\n await result.refetch();\r\n };\r\n\r\n return {\r\n results: result.data?.results ?? [],\r\n total: result.data?.total ?? 0,\r\n isLoading: result.isLoading,\r\n isFetching: result.isFetching,\r\n error: result.error,\r\n refetch,\r\n };\r\n}\r\n\r\n// ========== Unified Stats ==========\r\n\r\nexport interface UseUnifiedStatsReturn {\r\n stats: UnifiedMemoryStats | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Hook for fetching unified memory statistics\r\n */\r\nexport function useUnifiedStats(): UseUnifiedStatsReturn {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const queryEnabled = !!projectPath;\r\n\r\n const result = useQuery({\r\n queryKey: workspaceQueryKeys.unifiedStats(projectPath || ''),\r\n queryFn: () => fetchUnifiedStats(projectPath || undefined),\r\n staleTime: STALE_TIME,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n });\r\n\r\n const refetch = async () => {\r\n await result.refetch();\r\n };\r\n\r\n return {\r\n stats: result.data?.stats ?? null,\r\n isLoading: result.isLoading,\r\n isFetching: result.isFetching,\r\n error: result.error,\r\n refetch,\r\n };\r\n}\r\n\r\n// ========== Recommendations ==========\r\n\r\nexport interface UseRecommendationsOptions {\r\n memoryId: string;\r\n limit?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseRecommendationsReturn {\r\n recommendations: RecommendationResult[];\r\n total: number;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * Hook for KNN-based memory recommendations\r\n */\r\nexport function useRecommendations(options: UseRecommendationsOptions): UseRecommendationsReturn {\r\n const { memoryId, limit = 5, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const queryEnabled = enabled && !!projectPath && !!memoryId;\r\n\r\n const result = useQuery({\r\n queryKey: workspaceQueryKeys.unifiedRecommendations(projectPath || '', memoryId),\r\n queryFn: () => fetchRecommendations(memoryId, limit, projectPath || undefined),\r\n staleTime: STALE_TIME,\r\n enabled: queryEnabled,\r\n retry: 1,\r\n });\r\n\r\n return {\r\n recommendations: result.data?.recommendations ?? [],\r\n total: result.data?.total ?? 0,\r\n isLoading: result.isLoading,\r\n isFetching: result.isFetching,\r\n error: result.error,\r\n };\r\n}\r\n\r\n// ========== Reindex Mutation ==========\r\n\r\nexport interface UseReindexReturn {\r\n reindex: () => Promise<ReindexResponse>;\r\n isReindexing: boolean;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * Hook for triggering vector index rebuild\r\n */\r\nexport function useReindex(): UseReindexReturn {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const mutation = useMutation({\r\n mutationFn: () => triggerReindex(projectPath || undefined),\r\n onSuccess: () => {\r\n // Invalidate unified memory cache after reindex\r\n if (projectPath) {\r\n queryClient.invalidateQueries({\r\n queryKey: workspaceQueryKeys.unifiedMemory(projectPath),\r\n });\r\n }\r\n },\r\n });\r\n\r\n return {\r\n reindex: mutation.mutateAsync,\r\n isReindexing: mutation.isPending,\r\n error: mutation.error,\r\n };\r\n}\r\n","// ========================================\r\n// useMemoryV2 Hook\r\n// ========================================\r\n// TanStack Query hooks for Memory V2 pipeline\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n triggerExtraction,\r\n getExtractionStatus,\r\n triggerConsolidation,\r\n getConsolidationStatus,\r\n getV2Jobs,\r\n previewExtractionQueue,\r\n triggerSelectiveExtraction,\r\n type ExtractionStatus,\r\n type ConsolidationStatus,\r\n type V2JobsResponse,\r\n type ExtractionPreviewResponse,\r\n type SelectiveExtractionResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// Query keys\r\nexport const memoryV2Keys = {\r\n all: ['memoryV2'] as const,\r\n extractionStatus: (path?: string) => [...memoryV2Keys.all, 'extraction', path] as const,\r\n consolidationStatus: (path?: string) => [...memoryV2Keys.all, 'consolidation', path] as const,\r\n jobs: (path?: string, filters?: { kind?: string; status_filter?: string }) =>\r\n [...memoryV2Keys.all, 'jobs', path, filters] as const,\r\n preview: (path?: string, includeNative?: boolean) =>\r\n [...memoryV2Keys.all, 'preview', path, includeNative] as const,\r\n};\r\n\r\n// Default stale time: 30 seconds (V2 status changes frequently)\r\nconst STALE_TIME = 30 * 1000;\r\n\r\n// Hook: 提取状态\r\nexport function useExtractionStatus() {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.extractionStatus(projectPath),\r\n queryFn: () => getExtractionStatus(projectPath),\r\n enabled: !!projectPath,\r\n staleTime: STALE_TIME,\r\n refetchInterval: 5000, // 每 5 秒刷新\r\n });\r\n}\r\n\r\n// Hook: 合并状态\r\nexport function useConsolidationStatus() {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.consolidationStatus(projectPath),\r\n queryFn: () => getConsolidationStatus(projectPath),\r\n enabled: !!projectPath,\r\n staleTime: STALE_TIME,\r\n refetchInterval: 5000,\r\n });\r\n}\r\n\r\n// Hook: V2 作业列表\r\nexport function useV2Jobs(filters?: { kind?: string; status_filter?: string }) {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.jobs(projectPath, filters),\r\n queryFn: () => getV2Jobs(filters, projectPath),\r\n enabled: !!projectPath,\r\n staleTime: STALE_TIME,\r\n refetchInterval: 10000, // 每 10 秒刷新\r\n });\r\n}\r\n\r\n// Hook: 触发提取\r\nexport function useTriggerExtraction() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useMutation({\r\n mutationFn: (maxSessions?: number) => triggerExtraction(maxSessions, projectPath),\r\n onSuccess: () => {\r\n // Invalidate related queries\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.extractionStatus(projectPath) });\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.jobs(projectPath) });\r\n },\r\n });\r\n}\r\n\r\n// Hook: 触发合并\r\nexport function useTriggerConsolidation() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useMutation({\r\n mutationFn: () => triggerConsolidation(projectPath),\r\n onSuccess: () => {\r\n // Invalidate related queries\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.consolidationStatus(projectPath) });\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.jobs(projectPath) });\r\n },\r\n });\r\n}\r\n\r\n// Hook: Preview sessions for extraction\r\nexport function usePreviewSessions(includeNative: boolean = false) {\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useQuery({\r\n queryKey: memoryV2Keys.preview(projectPath, includeNative),\r\n queryFn: () => previewExtractionQueue(includeNative, undefined, projectPath),\r\n enabled: !!projectPath,\r\n staleTime: 10 * 1000, // 10 seconds\r\n });\r\n}\r\n\r\n// Hook: Trigger selective extraction\r\nexport function useTriggerSelectiveExtraction() {\r\n const queryClient = useQueryClient();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n return useMutation({\r\n mutationFn: (params: { sessionIds: string[]; includeNative?: boolean }) =>\r\n triggerSelectiveExtraction({\r\n sessionIds: params.sessionIds,\r\n includeNative: params.includeNative,\r\n path: projectPath,\r\n }),\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: memoryV2Keys.all });\r\n },\r\n });\r\n}\r\n\r\n// Export types\r\nexport type { ExtractionStatus, ConsolidationStatus, V2JobsResponse, ExtractionPreviewResponse, SelectiveExtractionResponse };\r\n","// ========================================\r\n// SessionPreviewPanel Component\r\n// ========================================\r\n// Preview and select sessions for Memory V2 extraction\r\n\r\nimport { useState, useMemo } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { formatDistanceToNow } from 'date-fns';\r\nimport { Search, Eye, Loader2, CheckCircle2, XCircle, Clock } from 'lucide-react';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Checkbox } from '@/components/ui/Checkbox';\r\nimport {\r\n usePreviewSessions,\r\n useTriggerSelectiveExtraction,\r\n} from '@/hooks/useMemoryV2';\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface SessionPreviewPanelProps {\r\n onClose?: () => void;\r\n onExtractComplete?: () => void;\r\n}\r\n\r\n// Helper function to format bytes\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\r\n}\r\n\r\n// Helper function to format timestamp\r\nfunction formatTimestamp(timestamp: number): string {\r\n try {\r\n const date = new Date(timestamp);\r\n return formatDistanceToNow(date, { addSuffix: true });\r\n } catch {\r\n return '-';\r\n }\r\n}\r\n\r\nexport function SessionPreviewPanel({ onClose, onExtractComplete }: SessionPreviewPanelProps) {\r\n const intl = useIntl();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n const [includeNative, setIncludeNative] = useState(false);\r\n\r\n const { data, isLoading, refetch } = usePreviewSessions(includeNative);\r\n const triggerExtraction = useTriggerSelectiveExtraction();\r\n\r\n // Filter sessions based on search query\r\n const filteredSessions = useMemo(() => {\r\n if (!data?.sessions) return [];\r\n if (!searchQuery.trim()) return data.sessions;\r\n\r\n const query = searchQuery.toLowerCase();\r\n return data.sessions.filter(\r\n (session) =>\r\n session.sessionId.toLowerCase().includes(query) ||\r\n session.tool.toLowerCase().includes(query) ||\r\n session.source.toLowerCase().includes(query)\r\n );\r\n }, [data?.sessions, searchQuery]);\r\n\r\n // Get ready sessions (eligible and not extracted)\r\n const readySessions = useMemo(() => {\r\n return filteredSessions.filter((s) => s.eligible && !s.extracted);\r\n }, [filteredSessions]);\r\n\r\n // Toggle session selection\r\n const toggleSelection = (sessionId: string) => {\r\n setSelectedIds((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(sessionId)) {\r\n next.delete(sessionId);\r\n } else {\r\n next.add(sessionId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n // Select all ready sessions\r\n const selectAll = () => {\r\n setSelectedIds(new Set(readySessions.map((s) => s.sessionId)));\r\n };\r\n\r\n // Clear selection\r\n const selectNone = () => {\r\n setSelectedIds(new Set());\r\n };\r\n\r\n // Trigger extraction for selected sessions\r\n const handleExtract = async () => {\r\n if (selectedIds.size === 0) return;\r\n\r\n triggerExtraction.mutate(\r\n {\r\n sessionIds: Array.from(selectedIds),\r\n includeNative,\r\n },\r\n {\r\n onSuccess: () => {\r\n setSelectedIds(new Set());\r\n onExtractComplete?.();\r\n },\r\n }\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col h-full\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <Eye className=\"w-5 h-5\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.title', defaultMessage: 'Extraction Queue Preview' })}\r\n </h2>\r\n <div className=\"flex items-center gap-2\">\r\n <label className=\"flex items-center gap-2 text-sm cursor-pointer\">\r\n <Checkbox\r\n checked={includeNative}\r\n onCheckedChange={(checked) => setIncludeNative(checked === true)}\r\n />\r\n {intl.formatMessage({ id: 'memory.v2.preview.includeNative', defaultMessage: 'Include Native Sessions' })}\r\n </label>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {isLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n 'Refresh'\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Summary Bar */}\r\n {data?.summary && (\r\n <div className=\"grid grid-cols-4 gap-2 mb-4\">\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold\">{data.summary.total}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.total', defaultMessage: 'Total' })}\r\n </div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold text-blue-600\">{data.summary.eligible}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.eligible', defaultMessage: 'Eligible' })}\r\n </div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold text-green-600\">{data.summary.alreadyExtracted}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.extracted', defaultMessage: 'Already Extracted' })}\r\n </div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold text-amber-600\">{data.summary.readyForExtraction}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.ready', defaultMessage: 'Ready' })}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search and Actions */}\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={intl.formatMessage({\r\n id: 'memory.v2.preview.selectSessions',\r\n defaultMessage: 'Search sessions...',\r\n })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={selectAll}>\r\n {intl.formatMessage({ id: 'memory.v2.preview.selectAll', defaultMessage: 'Select All' })}\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={selectNone}>\r\n {intl.formatMessage({ id: 'memory.v2.preview.selectNone', defaultMessage: 'Select None' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Session Table */}\r\n <div className=\"flex-1 overflow-auto border rounded-lg\">\r\n {isLoading ? (\r\n <div className=\"flex items-center justify-center h-48\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n ) : filteredSessions.length === 0 ? (\r\n <div className=\"flex items-center justify-center h-48 text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.preview.noSessions', defaultMessage: 'No sessions found' })}\r\n </div>\r\n ) : (\r\n <table className=\"w-full text-sm\">\r\n <thead className=\"bg-muted sticky top-0\">\r\n <tr>\r\n <th className=\"w-10 p-2\"></th>\r\n <th className=\"text-left p-2\">Source</th>\r\n <th className=\"text-left p-2\">Session ID</th>\r\n <th className=\"text-left p-2\">Tool</th>\r\n <th className=\"text-left p-2\">Timestamp</th>\r\n <th className=\"text-right p-2\">Size</th>\r\n <th className=\"text-right p-2\">Turns</th>\r\n <th className=\"text-center p-2\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {filteredSessions.map((session) => {\r\n const isReady = session.eligible && !session.extracted;\r\n const isSelected = selectedIds.has(session.sessionId);\r\n const isDisabled = !isReady;\r\n\r\n return (\r\n <tr\r\n key={session.sessionId}\r\n className={cn(\r\n 'border-b hover:bg-muted/50 transition-colors',\r\n isDisabled && 'opacity-60',\r\n isSelected && 'bg-blue-50 dark:bg-blue-950/20'\r\n )}\r\n >\r\n <td className=\"p-2\">\r\n <Checkbox\r\n checked={isSelected}\r\n disabled={isDisabled}\r\n onCheckedChange={() => toggleSelection(session.sessionId)}\r\n />\r\n </td>\r\n <td className=\"p-2\">\r\n <Badge\r\n variant=\"outline\"\r\n className={cn(\r\n session.source === 'ccw'\r\n ? 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300'\r\n : 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-300'\r\n )}\r\n >\r\n {session.source === 'ccw'\r\n ? intl.formatMessage({ id: 'memory.v2.preview.sourceCcw', defaultMessage: 'CCW' })\r\n : intl.formatMessage({ id: 'memory.v2.preview.sourceNative', defaultMessage: 'Native' })}\r\n </Badge>\r\n </td>\r\n <td className=\"p-2 font-mono text-xs truncate max-w-[150px]\" title={session.sessionId}>\r\n {session.sessionId}\r\n </td>\r\n <td className=\"p-2 truncate max-w-[100px]\" title={session.tool}>\r\n {session.tool || '-'}\r\n </td>\r\n <td className=\"p-2 text-muted-foreground\">\r\n {formatTimestamp(session.timestamp)}\r\n </td>\r\n <td className=\"p-2 text-right font-mono text-xs\">\r\n {formatBytes(session.bytes)}\r\n </td>\r\n <td className=\"p-2 text-right\">\r\n {session.turns}\r\n </td>\r\n <td className=\"p-2 text-center\">\r\n {session.extracted ? (\r\n <Badge className=\"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300\">\r\n <CheckCircle2 className=\"w-3 h-3 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.extracted', defaultMessage: 'Extracted' })}\r\n </Badge>\r\n ) : session.eligible ? (\r\n <Badge className=\"bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300\">\r\n <Clock className=\"w-3 h-3 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.ready', defaultMessage: 'Ready' })}\r\n </Badge>\r\n ) : (\r\n <Badge className=\"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300\">\r\n <XCircle className=\"w-3 h-3 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.ineligible', defaultMessage: 'Ineligible' })}\r\n </Badge>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n )}\r\n </div>\r\n\r\n {/* Footer Actions */}\r\n <div className=\"flex items-center justify-between mt-4 pt-4 border-t\">\r\n <div className=\"text-sm text-muted-foreground\">\r\n {selectedIds.size > 0 ? (\r\n intl.formatMessage(\r\n { id: 'memory.v2.preview.selected', defaultMessage: '{count} sessions selected' },\r\n { count: selectedIds.size }\r\n )\r\n ) : (\r\n intl.formatMessage({ id: 'memory.v2.preview.selectHint', defaultMessage: 'Select sessions to extract' })\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {onClose && (\r\n <Button variant=\"outline\" onClick={onClose}>\r\n {intl.formatMessage({ id: 'common.close', defaultMessage: 'Close' })}\r\n </Button>\r\n )}\r\n <Button\r\n onClick={handleExtract}\r\n disabled={selectedIds.size === 0 || triggerExtraction.isPending}\r\n >\r\n {triggerExtraction.isPending ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\r\n {intl.formatMessage({ id: 'memory.v2.extraction.extracting', defaultMessage: 'Extracting...' })}\r\n </>\r\n ) : (\r\n intl.formatMessage(\r\n { id: 'memory.v2.preview.extractSelected', defaultMessage: 'Extract Selected ({count})' },\r\n { count: selectedIds.size }\r\n )\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SessionPreviewPanel;\r\n","// ========================================\r\n// V2PipelineTab Component\r\n// ========================================\r\n// Memory V2 Pipeline management UI\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { formatDistanceToNow } from 'date-fns';\r\nimport {\r\n Zap,\r\n CheckCircle,\r\n Clock,\r\n AlertCircle,\r\n Play,\r\n Eye,\r\n Loader2,\r\n RefreshCw,\r\n FileText,\r\n Database,\r\n Activity,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport ReactMarkdown from 'react-markdown';\r\nimport remarkGfm from 'remark-gfm';\r\nimport rehypeHighlight from 'rehype-highlight';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/Dialog';\r\nimport { SessionPreviewPanel } from '@/components/memory/SessionPreviewPanel';\r\nimport 'highlight.js/styles/github-dark.css';\r\nimport {\r\n useExtractionStatus,\r\n useConsolidationStatus,\r\n useV2Jobs,\r\n useTriggerExtraction,\r\n useTriggerConsolidation,\r\n} from '@/hooks/useMemoryV2';\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ========== Helper Functions ==========\r\n\r\n/**\r\n * Format a timestamp to relative time string\r\n */\r\nfunction formatRelativeTime(timestamp: number | string | undefined): string | null {\r\n if (!timestamp) return null;\r\n\r\n try {\r\n const date = typeof timestamp === 'string' ? new Date(timestamp) : new Date(timestamp);\r\n if (isNaN(date.getTime())) return null;\r\n\r\n return formatDistanceToNow(date, { addSuffix: true });\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// ========== Status Badge ==========\r\n\r\nconst STATUS_CONFIG: Record<string, { color: string; icon: React.ReactNode; label: string }> = {\r\n idle: { color: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300', icon: <Clock className=\"w-3 h-3\" />, label: 'Idle' },\r\n running: { color: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300', icon: <Loader2 className=\"w-3 h-3 animate-spin\" />, label: 'Running' },\r\n completed: { color: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300', icon: <CheckCircle className=\"w-3 h-3\" />, label: 'Completed' },\r\n done: { color: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300', icon: <CheckCircle className=\"w-3 h-3\" />, label: 'Done' },\r\n error: { color: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300', icon: <AlertCircle className=\"w-3 h-3\" />, label: 'Error' },\r\n pending: { color: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300', icon: <Clock className=\"w-3 h-3\" />, label: 'Pending' },\r\n};\r\n\r\nfunction StatusBadge({ status }: { status: string }) {\r\n const config = STATUS_CONFIG[status] || STATUS_CONFIG.idle;\r\n return (\r\n <Badge className={cn('flex items-center gap-1', config.color)}>\r\n {config.icon}\r\n {config.label}\r\n </Badge>\r\n );\r\n}\r\n\r\n// ========== Extraction Card ==========\r\n\r\nfunction ExtractionCard() {\r\n const intl = useIntl();\r\n const { data: status, isLoading, refetch } = useExtractionStatus();\r\n const trigger = useTriggerExtraction();\r\n const [maxSessions, setMaxSessions] = useState(10);\r\n const [showPreview, setShowPreview] = useState(false);\r\n\r\n const handleTrigger = () => {\r\n trigger.mutate(maxSessions);\r\n };\r\n\r\n // Check if any job is running\r\n const hasRunningJob = status?.jobs?.some(j => j.status === 'running');\r\n const lastRunText = formatRelativeTime(status?.lastRun);\r\n\r\n return (\r\n <>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div>\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Zap className=\"w-5 h-5 text-yellow-500\" />\r\n Phase 1: {intl.formatMessage({ id: 'memory.v2.extraction.title', defaultMessage: 'Extraction' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.description', defaultMessage: 'Extract structured memories from CLI sessions' })}\r\n </p>\r\n {lastRunText && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.lastRun', defaultMessage: 'Last run' })}: {lastRunText}\r\n </p>\r\n )}\r\n </div>\r\n {status && (\r\n <div className=\"text-right\">\r\n <div className=\"text-2xl font-bold\">{status.total_stage1}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.extracted', defaultMessage: 'Extracted' })}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <input\r\n type=\"number\"\r\n value={maxSessions}\r\n onChange={(e) => setMaxSessions(Math.max(1, parseInt(e.target.value) || 10))}\r\n className=\"w-20 px-2 py-1 text-sm border rounded bg-background\"\r\n min={1}\r\n max={64}\r\n />\r\n <span className=\"text-sm text-muted-foreground\">sessions max</span>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n onClick={handleTrigger}\r\n disabled={trigger.isPending || hasRunningJob}\r\n size=\"sm\"\r\n >\r\n {trigger.isPending || hasRunningJob ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\r\n {intl.formatMessage({ id: 'memory.v2.extraction.extracting', defaultMessage: 'Extracting...' })}\r\n </>\r\n ) : (\r\n <>\r\n <Play className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.extraction.trigger', defaultMessage: 'Trigger Extraction' })}\r\n </>\r\n )}\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setShowPreview(true)}\r\n title={intl.formatMessage({ id: 'memory.v2.preview.previewQueue', defaultMessage: 'Preview Queue' })}\r\n >\r\n <Eye className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.preview.previewQueue', defaultMessage: 'Preview Queue' })}\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n <RefreshCw className={cn('w-4 h-4', isLoading && 'animate-spin')} />\r\n </Button>\r\n </div>\r\n\r\n {status?.jobs && status.jobs.length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t\">\r\n <div className=\"text-xs text-muted-foreground mb-2\">\r\n {intl.formatMessage({ id: 'memory.v2.extraction.recentJobs', defaultMessage: 'Recent Jobs' })}\r\n </div>\r\n <div className=\"space-y-1 max-h-32 overflow-y-auto\">\r\n {status.jobs.slice(0, 5).map((job) => (\r\n <div key={job.job_key} className=\"flex items-center justify-between text-sm\">\r\n <span className=\"font-mono text-xs truncate max-w-[150px]\">{job.job_key}</span>\r\n <StatusBadge status={job.status} />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </Card>\r\n\r\n {/* Preview Queue Dialog */}\r\n <Dialog open={showPreview} onOpenChange={setShowPreview}>\r\n <DialogContent className=\"max-w-4xl max-h-[80vh]\">\r\n <SessionPreviewPanel\r\n onClose={() => setShowPreview(false)}\r\n onExtractComplete={() => {\r\n setShowPreview(false);\r\n refetch();\r\n }}\r\n />\r\n </DialogContent>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\n// ========== Consolidation Card ==========\r\n\r\nfunction ConsolidationCard() {\r\n const intl = useIntl();\r\n const { data: status, isLoading, refetch } = useConsolidationStatus();\r\n const trigger = useTriggerConsolidation();\r\n const [showPreview, setShowPreview] = useState(false);\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleTrigger = () => {\r\n trigger.mutate();\r\n };\r\n\r\n const handleCopy = async () => {\r\n try {\r\n await navigator.clipboard.writeText(status?.memoryMdPreview || '');\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n };\r\n\r\n const isRunning = status?.status === 'running';\r\n const lastRunText = formatRelativeTime(status?.lastRun);\r\n\r\n return (\r\n <>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div>\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Database className=\"w-5 h-5 text-blue-500\" />\r\n Phase 2: {intl.formatMessage({ id: 'memory.v2.consolidation.title', defaultMessage: 'Consolidation' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.description', defaultMessage: 'Merge extracted results into MEMORY.md' })}\r\n </p>\r\n {lastRunText && (\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.lastRun', defaultMessage: 'Last run' })}: {lastRunText}\r\n </p>\r\n )}\r\n </div>\r\n {status && <StatusBadge status={status.status} />}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold\">\r\n {status?.memoryMdAvailable ? '✅' : '❌'}\r\n </div>\r\n <div className=\"text-xs text-muted-foreground\">MEMORY.md</div>\r\n </div>\r\n <div className=\"text-center p-2 bg-muted rounded\">\r\n <div className=\"text-lg font-bold\">{status?.inputCount ?? '-'}</div>\r\n <div className=\"text-xs text-muted-foreground\">Inputs</div>\r\n </div>\r\n </div>\r\n\r\n {status?.lastError && (\r\n <div className=\"mb-4 p-2 bg-red-100 dark:bg-red-900/30 rounded text-xs text-red-800 dark:text-red-300\">\r\n {status.lastError}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n onClick={handleTrigger}\r\n disabled={trigger.isPending || isRunning}\r\n size=\"sm\"\r\n >\r\n {trigger.isPending || isRunning ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-1 animate-spin\" />\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.consolidating', defaultMessage: 'Consolidating...' })}\r\n </>\r\n ) : (\r\n <>\r\n <Play className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.trigger', defaultMessage: 'Trigger Consolidation' })}\r\n </>\r\n )}\r\n </Button>\r\n\r\n {status?.memoryMdAvailable && (\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowPreview(true)}>\r\n <Eye className=\"w-4 h-4 mr-1\" />\r\n {intl.formatMessage({ id: 'memory.v2.consolidation.preview', defaultMessage: 'Preview' })}\r\n </Button>\r\n )}\r\n\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n <RefreshCw className={cn('w-4 h-4', isLoading && 'animate-spin')} />\r\n </Button>\r\n </div>\r\n </Card>\r\n\r\n {/* MEMORY.md Preview Dialog */}\r\n <Dialog open={showPreview} onOpenChange={setShowPreview}>\r\n <DialogContent className=\"max-w-4xl max-h-[80vh] overflow-hidden flex flex-col\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center justify-between pr-8\">\r\n <span className=\"flex items-center gap-2\">\r\n <FileText className=\"w-5 h-5\" />\r\n MEMORY.md\r\n </span>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopy}\r\n className=\"h-8 px-2\"\r\n title={copied\r\n ? intl.formatMessage({ id: 'memory.v2.consolidation.copySuccess', defaultMessage: 'Copied' })\r\n : intl.formatMessage({ id: 'memory.actions.copy', defaultMessage: 'Copy' })\r\n }\r\n >\r\n {copied ? (\r\n <Check className=\"w-4 h-4 text-green-500\" />\r\n ) : (\r\n <Copy className=\"w-4 h-4\" />\r\n )}\r\n </Button>\r\n </DialogTitle>\r\n </DialogHeader>\r\n <div className=\"overflow-auto flex-1 markdown-preview\">\r\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\r\n <ReactMarkdown\r\n remarkPlugins={[remarkGfm]}\r\n rehypePlugins={[rehypeHighlight]}\r\n >\r\n {status?.memoryMdPreview || intl.formatMessage({\r\n id: 'memory.v2.consolidation.noContent',\r\n defaultMessage: 'No content available'\r\n })}\r\n </ReactMarkdown>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\n// ========== Jobs List ==========\r\n\r\ninterface V2Job {\r\n kind: string;\r\n job_key: string;\r\n status: 'pending' | 'running' | 'done' | 'error';\r\n last_error?: string;\r\n worker_id?: string;\r\n started_at?: number;\r\n finished_at?: number;\r\n retry_remaining?: number;\r\n}\r\n\r\nfunction JobsList() {\r\n const intl = useIntl();\r\n const [kindFilter, setKindFilter] = useState<string>('');\r\n const [statusFilter, setStatusFilter] = useState<string>('');\r\n const [selectedJob, setSelectedJob] = useState<V2Job | null>(null);\r\n const [copiedError, setCopiedError] = useState(false);\r\n\r\n // Build filters object\r\n const filters = {\r\n ...(kindFilter && { kind: kindFilter }),\r\n ...(statusFilter && { status_filter: statusFilter }),\r\n };\r\n\r\n const { data, isLoading, refetch } = useV2Jobs(Object.keys(filters).length > 0 ? filters : undefined);\r\n\r\n // Format timestamp to readable string\r\n const formatTimestamp = (timestamp: number | undefined): string => {\r\n if (!timestamp) return '-';\r\n try {\r\n const date = new Date(timestamp);\r\n return date.toLocaleString();\r\n } catch {\r\n return '-';\r\n }\r\n };\r\n\r\n // Copy error to clipboard\r\n const handleCopyError = async () => {\r\n if (selectedJob?.last_error) {\r\n try {\r\n await navigator.clipboard.writeText(selectedJob.last_error);\r\n setCopiedError(true);\r\n setTimeout(() => setCopiedError(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-medium flex items-center gap-2\">\r\n <Activity className=\"w-5 h-5 text-purple-500\" />\r\n {intl.formatMessage({ id: 'memory.v2.jobs.title', defaultMessage: 'Jobs' })}\r\n </h3>\r\n <div className=\"flex items-center gap-2\">\r\n <select\r\n value={kindFilter}\r\n onChange={(e) => setKindFilter(e.target.value)}\r\n className=\"px-2 py-1 text-sm border rounded bg-background\"\r\n >\r\n <option value=\"\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.allKinds', defaultMessage: 'All Kinds' })}\r\n </option>\r\n <option value=\"phase1_extraction\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.extraction', defaultMessage: 'Extraction' })}\r\n </option>\r\n <option value=\"memory_consolidate_global\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.consolidation', defaultMessage: 'Consolidation' })}\r\n </option>\r\n </select>\r\n <select\r\n value={statusFilter}\r\n onChange={(e) => setStatusFilter(e.target.value)}\r\n className=\"px-2 py-1 text-sm border rounded bg-background\"\r\n >\r\n <option value=\"\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.all', defaultMessage: 'All Status' })}\r\n </option>\r\n <option value=\"pending\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.pending', defaultMessage: 'Pending' })}\r\n </option>\r\n <option value=\"running\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.running', defaultMessage: 'Running' })}\r\n </option>\r\n <option value=\"done\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.done', defaultMessage: 'Done' })}\r\n </option>\r\n <option value=\"error\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.statusFilter.error', defaultMessage: 'Error' })}\r\n </option>\r\n </select>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n <RefreshCw className={cn('w-4 h-4', isLoading && 'animate-spin')} />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {data?.jobs && data.jobs.length > 0 ? (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm\">\r\n <thead>\r\n <tr className=\"border-b\">\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.kind', defaultMessage: 'Kind' })}\r\n </th>\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.key', defaultMessage: 'Key' })}\r\n </th>\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.status', defaultMessage: 'Status' })}\r\n </th>\r\n <th className=\"text-left p-2\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.error', defaultMessage: 'Error' })}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {data.jobs.map((job) => (\r\n <tr\r\n key={`${job.kind}-${job.job_key}`}\r\n className=\"border-b cursor-pointer hover:bg-muted/50 transition-colors\"\r\n onClick={() => setSelectedJob(job)}\r\n >\r\n <td className=\"p-2\">\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {job.kind === 'phase1_extraction' ? 'Extraction' :\r\n job.kind === 'memory_consolidate_global' ? 'Consolidation' : job.kind}\r\n </Badge>\r\n </td>\r\n <td className=\"p-2 font-mono text-xs truncate max-w-[150px]\">{job.job_key}</td>\r\n <td className=\"p-2\"><StatusBadge status={job.status} /></td>\r\n <td className=\"p-2 text-red-500 text-xs truncate max-w-[200px]\">{job.last_error || '-'}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className=\"text-center text-muted-foreground py-8\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.noJobs', defaultMessage: 'No jobs found' })}\r\n </div>\r\n )}\r\n\r\n {/* 按状态统计 */}\r\n {data?.byStatus && Object.keys(data.byStatus).length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t flex items-center gap-4 text-sm flex-wrap\">\r\n {Object.entries(data.byStatus).map(([status, count]) => (\r\n <span key={status} className=\"flex items-center gap-1\">\r\n <StatusBadge status={status} />\r\n <span className=\"font-bold\">{count}</span>\r\n </span>\r\n ))}\r\n <span className=\"text-muted-foreground ml-auto\">\r\n Total: {data.total}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* Job Detail Dialog */}\r\n <Dialog open={!!selectedJob} onOpenChange={() => setSelectedJob(null)}>\r\n <DialogContent className=\"max-w-2xl\">\r\n <DialogHeader>\r\n <DialogTitle>\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.title', defaultMessage: 'Job Details' })}\r\n </DialogTitle>\r\n </DialogHeader>\r\n <div className=\"space-y-4\">\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.kind', defaultMessage: 'Kind' })}\r\n </label>\r\n <p className=\"text-sm font-medium\">\r\n {selectedJob?.kind === 'phase1_extraction' ? 'Extraction' :\r\n selectedJob?.kind === 'memory_consolidate_global' ? 'Consolidation' : selectedJob?.kind}\r\n </p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.status', defaultMessage: 'Status' })}\r\n </label>\r\n <div className=\"mt-1\">\r\n {selectedJob && <StatusBadge status={selectedJob.status} />}\r\n </div>\r\n </div>\r\n <div className=\"col-span-2\">\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.jobKey', defaultMessage: 'Job ID' })}\r\n </label>\r\n <p className=\"text-sm font-mono break-all\">{selectedJob?.job_key}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.startedAt', defaultMessage: 'Started At' })}\r\n </label>\r\n <p className=\"text-sm\">{formatTimestamp(selectedJob?.started_at)}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.finishedAt', defaultMessage: 'Finished At' })}\r\n </label>\r\n <p className=\"text-sm\">{formatTimestamp(selectedJob?.finished_at)}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.workerId', defaultMessage: 'Worker ID' })}\r\n </label>\r\n <p className=\"text-sm font-mono truncate\">{selectedJob?.worker_id || '-'}</p>\r\n </div>\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.retryRemaining', defaultMessage: 'Retry Remaining' })}\r\n </label>\r\n <p className=\"text-sm\">{selectedJob?.retry_remaining ?? '-'}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Error Section */}\r\n {selectedJob?.last_error && (\r\n <div>\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.error', defaultMessage: 'Error' })}\r\n </label>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleCopyError}\r\n className=\"h-6 px-2\"\r\n title={copiedError\r\n ? intl.formatMessage({ id: 'memory.actions.copySuccess', defaultMessage: 'Copied' })\r\n : intl.formatMessage({ id: 'memory.actions.copy', defaultMessage: 'Copy' })\r\n }\r\n >\r\n {copiedError ? (\r\n <Check className=\"w-3 h-3 text-green-500\" />\r\n ) : (\r\n <Copy className=\"w-3 h-3\" />\r\n )}\r\n </Button>\r\n </div>\r\n <pre className=\"text-xs bg-red-50 dark:bg-red-950/30 text-red-800 dark:text-red-300 p-3 rounded overflow-auto max-h-40 whitespace-pre-wrap break-all\">\r\n {selectedJob.last_error}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {!selectedJob?.last_error && (\r\n <div>\r\n <label className=\"text-xs text-muted-foreground\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.error', defaultMessage: 'Error' })}\r\n </label>\r\n <p className=\"text-sm text-muted-foreground italic\">\r\n {intl.formatMessage({ id: 'memory.v2.jobs.detail.noError', defaultMessage: 'No error' })}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Pipeline Status Banner ==========\r\n\r\nfunction PipelineStatusBanner() {\r\n const intl = useIntl();\r\n const { data } = useV2Jobs();\r\n\r\n // Detect running and error jobs\r\n const jobs = data?.jobs || [];\r\n const runningJobs = jobs.filter(j => j.status === 'running');\r\n const errorJobs = jobs.filter(j => j.status === 'error');\r\n const hasRunningJobs = runningJobs.length > 0;\r\n const errorCount = errorJobs.length;\r\n const runningCount = runningJobs.length;\r\n\r\n if (hasRunningJobs) {\r\n return (\r\n <div className=\"mb-4 p-3 bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 rounded-lg flex items-center gap-2\">\r\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\r\n <span className=\"text-sm text-blue-700 dark:text-blue-300\">\r\n {intl.formatMessage(\r\n { id: 'memory.v2.statusBanner.running', defaultMessage: 'Pipeline Running - {count} job(s) in progress' },\r\n { count: runningCount }\r\n )}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (errorCount > 0) {\r\n return (\r\n <div className=\"mb-4 p-3 bg-yellow-50 dark:bg-yellow-950/30 border border-yellow-200 dark:border-yellow-800 rounded-lg flex items-center gap-2\">\r\n <AlertCircle className=\"w-4 h-4 text-yellow-500\" />\r\n <span className=\"text-sm text-yellow-700 dark:text-yellow-300\">\r\n {intl.formatMessage(\r\n { id: 'memory.v2.statusBanner.hasErrors', defaultMessage: 'Pipeline Idle - {count} job(s) failed' },\r\n { count: errorCount }\r\n )}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\nexport function V2PipelineTab() {\r\n return (\r\n <div className=\"space-y-4\">\r\n <PipelineStatusBanner />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <ExtractionCard />\r\n <ConsolidationCard />\r\n </div>\r\n <JobsList />\r\n </div>\r\n );\r\n}\r\n\r\nexport default V2PipelineTab;\r\n","// ========================================\r\n// Memory Page\r\n// ========================================\r\n// View and manage core memory and context with CRUD operations\r\n// Includes unified vector search across all memory categories\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { toast } from 'sonner';\r\nimport {\r\n Brain,\r\n Search,\r\n Plus,\r\n Database,\r\n FileText,\r\n RefreshCw,\r\n Trash2,\r\n Edit,\r\n Tag,\r\n Loader2,\r\n Copy,\r\n Star,\r\n Archive,\r\n ArchiveRestore,\r\n AlertCircle,\r\n Layers,\r\n Zap,\r\n Terminal,\r\n GitBranch,\r\n Hash,\r\n Maximize2,\r\n Minimize2,\r\n} from 'lucide-react';\r\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/Dialog';\r\nimport { Checkbox } from '@/components/ui/Checkbox';\r\nimport { useMemory, useMemoryMutations, useUnifiedSearch, useUnifiedStats, useRecommendations, useReindex } from '@/hooks';\r\nimport type { CoreMemory, UnifiedSearchResult } from '@/lib/api';\r\nimport { cn, parseMemoryMetadata } from '@/lib/utils';\r\nimport { V2PipelineTab } from '@/components/memory/V2PipelineTab';\r\n\r\n// ========== Source Type Helpers ==========\r\n\r\nconst SOURCE_TYPE_COLORS: Record<string, string> = {\r\n core_memory: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300',\r\n cli_history: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300',\r\n workflow: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300',\r\n entity: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300',\r\n pattern: 'bg-pink-100 text-pink-800 dark:bg-pink-900/30 dark:text-pink-300',\r\n};\r\n\r\nconst SOURCE_TYPE_ICONS: Record<string, React.ReactNode> = {\r\n core_memory: <Brain className=\"w-3 h-3\" />,\r\n cli_history: <Terminal className=\"w-3 h-3\" />,\r\n workflow: <GitBranch className=\"w-3 h-3\" />,\r\n entity: <Hash className=\"w-3 h-3\" />,\r\n pattern: <Layers className=\"w-3 h-3\" />,\r\n};\r\n\r\nfunction SourceTypeBadge({ sourceType }: { sourceType: string }) {\r\n const colorClass = SOURCE_TYPE_COLORS[sourceType] || 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300';\r\n const icon = SOURCE_TYPE_ICONS[sourceType] || <Database className=\"w-3 h-3\" />;\r\n\r\n return (\r\n <span className={cn('inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium', colorClass)}>\r\n {icon}\r\n {sourceType}\r\n </span>\r\n );\r\n}\r\n\r\n// ========== Memory Card Component ==========\r\n\r\ninterface MemoryCardProps {\r\n memory: CoreMemory;\r\n onView: (memory: CoreMemory) => void;\r\n onEdit: (memory: CoreMemory) => void;\r\n onDelete: (memory: CoreMemory) => void;\r\n onCopy: (content: string) => void;\r\n onToggleFavorite: (memory: CoreMemory) => void;\r\n onArchive: (memory: CoreMemory) => void;\r\n onUnarchive: (memory: CoreMemory) => void;\r\n}\r\n\r\nfunction MemoryCard({ memory, onView, onEdit, onDelete, onCopy, onToggleFavorite, onArchive, onUnarchive }: MemoryCardProps) {\r\n const formattedDate = new Date(memory.createdAt).toLocaleDateString();\r\n\r\n // Parse metadata from memory\r\n const metadata = parseMemoryMetadata(memory.metadata);\r\n const isFavorite = metadata.favorite === true;\r\n const priority = metadata.priority || 'medium';\r\n const isArchived = memory.archived || false;\r\n const formattedSize = memory.size\r\n ? memory.size < 1024\r\n ? `${memory.size} B`\r\n : `${(memory.size / 1024).toFixed(1)} KB`\r\n : 'Unknown';\r\n\r\n return (\r\n <Card className=\"overflow-hidden\">\r\n <div\r\n className=\"p-4 cursor-pointer hover:bg-muted/50 transition-colors\"\r\n onClick={() => onView(memory)}\r\n >\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"p-2 rounded-lg bg-primary/10\">\r\n <Brain className=\"w-5 h-5 text-primary\" />\r\n </div>\r\n <div className=\"min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {memory.id}\r\n </span>\r\n {memory.source && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {memory.source}\r\n </Badge>\r\n )}\r\n {priority !== 'medium' && (\r\n <Badge variant={priority === 'high' ? 'destructive' : 'secondary'} className=\"text-xs\">\r\n {priority}\r\n </Badge>\r\n )}\r\n {isArchived && (\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n Archived\r\n </Badge>\r\n )}\r\n </div>\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {formattedDate} - {formattedSize}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\"h-8 w-8 p-0\", isFavorite && \"text-yellow-500\")}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onToggleFavorite(memory);\r\n }}\r\n >\r\n <Star className={cn(\"w-4 h-4\", isFavorite && \"fill-current\")} />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onCopy(memory.content);\r\n }}\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onEdit(memory);\r\n }}\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n </Button>\r\n {!isArchived ? (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onArchive(memory);\r\n }}\r\n >\r\n <Archive className=\"w-4 h-4\" />\r\n </Button>\r\n ) : (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onUnarchive(memory);\r\n }}\r\n >\r\n <ArchiveRestore className=\"w-4 h-4\" />\r\n </Button>\r\n )}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0 text-destructive hover:text-destructive\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDelete(memory);\r\n }}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Preview */}\r\n <p className=\"text-sm text-muted-foreground mt-2 line-clamp-2\">\r\n {memory.content}\r\n </p>\r\n\r\n {/* Tags */}\r\n {memory.tags && memory.tags.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1 mt-2\">\r\n {memory.tags.slice(0, 5).map((tag) => (\r\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\r\n <Tag className=\"w-3 h-3 mr-1\" />\r\n {tag}\r\n </Badge>\r\n ))}\r\n {memory.tags.length > 5 && (\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n +{memory.tags.length - 5}\r\n </Badge>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Unified Search Result Card ==========\r\n\r\ninterface UnifiedResultCardProps {\r\n result: UnifiedSearchResult;\r\n onCopy: (content: string) => void;\r\n}\r\n\r\nfunction UnifiedResultCard({ result, onCopy }: UnifiedResultCardProps) {\r\n const { formatMessage } = useIntl();\r\n const scorePercent = (result.score * 100).toFixed(1);\r\n\r\n return (\r\n <Card className=\"overflow-hidden\">\r\n <div className=\"p-4\">\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <div className=\"flex items-start gap-3 min-w-0 flex-1\">\r\n <SourceTypeBadge sourceType={result.source_type} />\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <span className=\"text-sm font-medium text-foreground truncate\">\r\n {result.source_id}\r\n </span>\r\n <Badge variant=\"outline\" className=\"text-xs shrink-0\">\r\n {formatMessage({ id: 'memory.unified.score' })}: {scorePercent}%\r\n </Badge>\r\n </div>\r\n {/* Rank sources */}\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n {result.rank_sources.vector_rank != null && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.vectorRank' }, { rank: result.rank_sources.vector_rank })}\r\n </span>\r\n )}\r\n {result.rank_sources.fts_rank != null && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.ftsRank' }, { rank: result.rank_sources.fts_rank })}\r\n </span>\r\n )}\r\n {result.rank_sources.heat_score != null && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.heatScore' }, { score: result.rank_sources.heat_score.toFixed(2) })}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0 shrink-0\"\r\n onClick={() => onCopy(result.content)}\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n\r\n {/* Content preview */}\r\n <p className=\"text-sm text-muted-foreground mt-2 line-clamp-3\">\r\n {result.content}\r\n </p>\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Recommendations Panel ==========\r\n\r\ninterface RecommendationsPanelProps {\r\n memoryId: string;\r\n onCopy: (content: string) => void;\r\n}\r\n\r\nfunction RecommendationsPanel({ memoryId, onCopy }: RecommendationsPanelProps) {\r\n const { formatMessage } = useIntl();\r\n const { recommendations, isLoading } = useRecommendations({\r\n memoryId,\r\n limit: 5,\r\n enabled: !!memoryId,\r\n });\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center gap-2 text-muted-foreground py-2\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span className=\"text-sm\">{formatMessage({ id: 'memory.unified.searching' })}</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (recommendations.length === 0) {\r\n return (\r\n <p className=\"text-sm text-muted-foreground py-2\">\r\n {formatMessage({ id: 'memory.unified.noRecommendations' })}\r\n </p>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n {recommendations.map((rec) => (\r\n <div\r\n key={rec.source_id}\r\n className=\"flex items-start gap-2 p-2 rounded-md bg-muted/30 hover:bg-muted/50 transition-colors\"\r\n >\r\n <SourceTypeBadge sourceType={rec.source_type} />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-xs font-medium text-foreground truncate\">\r\n {rec.source_id}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground shrink-0\">\r\n {(rec.score * 100).toFixed(0)}%\r\n </span>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground line-clamp-2 mt-0.5\">\r\n {rec.content}\r\n </p>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-6 w-6 p-0 shrink-0\"\r\n onClick={() => onCopy(rec.content)}\r\n >\r\n <Copy className=\"w-3 h-3\" />\r\n </Button>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== View Memory Dialog ==========\r\n\r\ninterface ViewMemoryDialogProps {\r\n memory: CoreMemory | null;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onEdit: (memory: CoreMemory) => void;\r\n onCopy: (content: string) => void;\r\n}\r\n\r\nfunction ViewMemoryDialog({ memory, open, onOpenChange, onEdit, onCopy }: ViewMemoryDialogProps) {\r\n const { formatMessage } = useIntl();\r\n if (!memory) return null;\r\n\r\n const metadata = parseMemoryMetadata(memory.metadata);\r\n const priority = metadata.priority || 'medium';\r\n const formattedDate = new Date(memory.createdAt).toLocaleDateString();\r\n const formattedSize = memory.size\r\n ? memory.size < 1024\r\n ? `${memory.size} B`\r\n : `${(memory.size / 1024).toFixed(1)} KB`\r\n : 'Unknown';\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-3xl max-h-[80vh] flex flex-col\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <Brain className=\"w-5 h-5 text-primary\" />\r\n {memory.id}\r\n </DialogTitle>\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n {memory.source && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {memory.source}\r\n </Badge>\r\n )}\r\n {priority !== 'medium' && (\r\n <Badge variant={priority === 'high' ? 'destructive' : 'secondary'} className=\"text-xs\">\r\n {priority}\r\n </Badge>\r\n )}\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formattedDate} - {formattedSize}\r\n </span>\r\n </div>\r\n </DialogHeader>\r\n\r\n {/* Tags */}\r\n {memory.tags && memory.tags.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1\">\r\n {memory.tags.map((tag) => (\r\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\r\n <Tag className=\"w-3 h-3 mr-1\" />\r\n {tag}\r\n </Badge>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto mt-2\">\r\n <pre className=\"text-sm text-foreground whitespace-pre-wrap font-mono bg-muted/30 p-4 rounded-lg\">\r\n {memory.content}\r\n </pre>\r\n </div>\r\n\r\n {/* Recommendations */}\r\n <div className=\"pt-2 border-t border-border\">\r\n <h4 className=\"text-sm font-medium text-foreground flex items-center gap-1.5 mb-2\">\r\n <Zap className=\"w-4 h-4 text-primary\" />\r\n {formatMessage({ id: 'memory.unified.recommendations' })}\r\n </h4>\r\n <RecommendationsPanel memoryId={memory.id} onCopy={onCopy} />\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-2 pt-2 border-t border-border\">\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => onCopy(memory.content)}>\r\n <Copy className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.actions.copy' })}\r\n </Button>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => { onOpenChange(false); onEdit(memory); }}>\r\n <Edit className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.actions.edit' })}\r\n </Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\n// ========== New Memory Dialog ==========\r\n\r\ninterface NewMemoryDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onSubmit: (data: { content: string; tags?: string[]; metadata?: Record<string, any> }) => void;\r\n isCreating: boolean;\r\n editingMemory?: CoreMemory | null;\r\n}\r\n\r\nfunction NewMemoryDialog({\r\n open,\r\n onOpenChange,\r\n onSubmit,\r\n isCreating,\r\n editingMemory,\r\n}: NewMemoryDialogProps) {\r\n const { formatMessage } = useIntl();\r\n const [content, setContent] = useState(editingMemory?.content || '');\r\n const [tagsInput, setTagsInput] = useState(editingMemory?.tags?.join(', ') || '');\r\n const [isFavorite, setIsFavorite] = useState(false);\r\n const [priority, setPriority] = useState<'low' | 'medium' | 'high'>('medium');\r\n\r\n // Initialize from editing memory metadata\r\n useEffect(() => {\r\n if (editingMemory) {\r\n // Sync content and tags\r\n setContent(editingMemory.content || '');\r\n setTagsInput(editingMemory.tags?.join(', ') || '');\r\n\r\n // Sync metadata\r\n const metadata = parseMemoryMetadata(editingMemory.metadata);\r\n setIsFavorite(metadata.favorite === true);\r\n setPriority(metadata.priority || 'medium');\r\n } else {\r\n // New mode: reset all state\r\n setContent('');\r\n setTagsInput('');\r\n setIsFavorite(false);\r\n setPriority('medium');\r\n }\r\n }, [editingMemory]);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (content.trim()) {\r\n const tags = tagsInput\r\n .split(',')\r\n .map((t) => t.trim())\r\n .filter(Boolean);\r\n\r\n // Build metadata object\r\n const metadata: Record<string, any> = {};\r\n if (isFavorite) metadata.favorite = true;\r\n if (priority !== 'medium') metadata.priority = priority;\r\n\r\n onSubmit({\r\n content: content.trim(),\r\n tags: tags.length > 0 ? tags : undefined,\r\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\r\n });\r\n setContent('');\r\n setTagsInput('');\r\n setIsFavorite(false);\r\n setPriority('medium');\r\n }\r\n };\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-2xl\">\r\n <DialogHeader>\r\n <DialogTitle>\r\n {editingMemory ? formatMessage({ id: 'memory.createDialog.editTitle' }) : formatMessage({ id: 'memory.createDialog.title' })}\r\n </DialogTitle>\r\n </DialogHeader>\r\n <form onSubmit={handleSubmit} className=\"space-y-4 mt-4\">\r\n <div>\r\n <label className=\"text-sm font-medium text-foreground\">{formatMessage({ id: 'memory.createDialog.labels.content' })}</label>\r\n <textarea\r\n value={content}\r\n onChange={(e) => setContent(e.target.value)}\r\n placeholder={formatMessage({ id: 'memory.createDialog.placeholders.content' })}\r\n className=\"mt-1 w-full min-h-[200px] p-3 bg-background border border-input rounded-md text-sm font-mono resize-none focus:outline-none focus:ring-2 focus:ring-primary\"\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"text-sm font-medium text-foreground\">{formatMessage({ id: 'memory.createDialog.labels.tags' })}</label>\r\n <Input\r\n value={tagsInput}\r\n onChange={(e) => setTagsInput(e.target.value)}\r\n placeholder={formatMessage({ id: 'memory.createDialog.placeholders.tags' })}\r\n className=\"mt-1\"\r\n />\r\n </div>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Checkbox\r\n id=\"favorite\"\r\n checked={isFavorite}\r\n onCheckedChange={(checked) => setIsFavorite(checked === true)}\r\n />\r\n <label htmlFor=\"favorite\" className=\"text-sm font-medium cursor-pointer\">\r\n {formatMessage({ id: 'memory.createDialog.labels.favorite' })}\r\n </label>\r\n </div>\r\n <div>\r\n <label className=\"text-sm font-medium\">{formatMessage({ id: 'memory.createDialog.labels.priority' })}</label>\r\n <select\r\n value={priority}\r\n onChange={(e) => setPriority(e.target.value as 'low' | 'medium' | 'high')}\r\n className=\"mt-1 w-full p-2 bg-background border border-input rounded-md text-sm\"\r\n >\r\n <option value=\"low\">{formatMessage({ id: 'memory.priority.low' })}</option>\r\n <option value=\"medium\">{formatMessage({ id: 'memory.priority.medium' })}</option>\r\n <option value=\"high\">{formatMessage({ id: 'memory.priority.high' })}</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\r\n {formatMessage({ id: 'memory.createDialog.buttons.cancel' })}\r\n </Button>\r\n <Button type=\"submit\" disabled={isCreating || !content.trim()}>\r\n {isCreating ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\r\n {editingMemory ? formatMessage({ id: 'memory.createDialog.buttons.updating' }) : formatMessage({ id: 'memory.createDialog.buttons.creating' })}\r\n </>\r\n ) : (\r\n <>\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {editingMemory ? formatMessage({ id: 'memory.createDialog.buttons.update' }) : formatMessage({ id: 'memory.createDialog.buttons.create' })}\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n </form>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\n// ========== Category Filter ==========\r\n\r\nconst CATEGORY_OPTIONS = [\r\n { value: '', labelId: 'memory.filters.categoryAll' },\r\n { value: 'core_memory', labelId: 'memory.filters.categoryCoreMemory' },\r\n { value: 'cli_history', labelId: 'memory.filters.categoryCliHistory' },\r\n { value: 'workflow', labelId: 'memory.filters.categoryWorkflow' },\r\n { value: 'entity', labelId: 'memory.filters.categoryEntity' },\r\n { value: 'pattern', labelId: 'memory.filters.categoryPattern' },\r\n];\r\n\r\n// ========== Main Page Component ==========\r\n\r\nexport function MemoryPage() {\r\n const { formatMessage } = useIntl();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedTags, setSelectedTags] = useState<string[]>([]);\r\n const [isNewMemoryOpen, setIsNewMemoryOpen] = useState(false);\r\n const [editingMemory, setEditingMemory] = useState<CoreMemory | null>(null);\r\n const [viewingMemory, setViewingMemory] = useState<CoreMemory | null>(null);\r\n const [currentTab, setCurrentTab] = useState<'memories' | 'favorites' | 'archived' | 'unifiedSearch' | 'v2pipeline'>('memories');\r\n const [unifiedQuery, setUnifiedQuery] = useState('');\r\n const [selectedCategory, setSelectedCategory] = useState('');\r\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\r\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\r\n\r\n const isUnifiedTab = currentTab === 'unifiedSearch';\r\n\r\n // Build filter based on current tab (for non-unified tabs)\r\n const favoriteFilter = currentTab === 'favorites' ? { favorite: true } : undefined;\r\n const archivedFilter = currentTab === 'archived' ? { archived: true } : { archived: false };\r\n\r\n const {\r\n memories,\r\n totalSize,\r\n claudeMdCount,\r\n allTags,\r\n isLoading,\r\n isFetching,\r\n error,\r\n refetch,\r\n } = useMemory({\r\n filter: {\r\n search: searchQuery || undefined,\r\n tags: selectedTags.length > 0 ? selectedTags : undefined,\r\n ...favoriteFilter,\r\n ...archivedFilter,\r\n },\r\n enabled: !isUnifiedTab,\r\n });\r\n\r\n // Unified search\r\n const {\r\n results: unifiedResults,\r\n total: unifiedTotal,\r\n isLoading: unifiedLoading,\r\n isFetching: unifiedFetching,\r\n error: unifiedError,\r\n refetch: refetchUnified,\r\n } = useUnifiedSearch({\r\n query: unifiedQuery,\r\n categories: selectedCategory || undefined,\r\n topK: 20,\r\n enabled: isUnifiedTab && unifiedQuery.trim().length > 0,\r\n });\r\n\r\n // Unified stats\r\n const {\r\n stats: unifiedStats,\r\n isLoading: statsLoading,\r\n refetch: refetchStats,\r\n } = useUnifiedStats();\r\n\r\n // Reindex mutation\r\n const { reindex, isReindexing } = useReindex();\r\n\r\n const { createMemory, updateMemory, deleteMemory, archiveMemory, unarchiveMemory, isCreating, isUpdating } =\r\n useMemoryMutations();\r\n\r\n const handleCreateMemory = async (data: { content: string; tags?: string[]; metadata?: Record<string, any> }) => {\r\n if (editingMemory) {\r\n await updateMemory(editingMemory.id, data);\r\n setEditingMemory(null);\r\n } else {\r\n await createMemory(data);\r\n }\r\n setIsNewMemoryOpen(false);\r\n };\r\n\r\n const handleEdit = (memory: CoreMemory) => {\r\n setEditingMemory(memory);\r\n setIsNewMemoryOpen(true);\r\n };\r\n\r\n const handleDelete = async (memory: CoreMemory) => {\r\n if (confirm(`Delete memory \"${memory.id}\"?`)) {\r\n await deleteMemory(memory.id);\r\n }\r\n };\r\n\r\n const handleToggleFavorite = async (memory: CoreMemory) => {\r\n try {\r\n const currentMetadata = parseMemoryMetadata(memory.metadata);\r\n const newFavorite = !(currentMetadata.favorite === true);\r\n await updateMemory(memory.id, {\r\n content: memory.content,\r\n metadata: { ...currentMetadata, favorite: newFavorite },\r\n });\r\n toast.success(\r\n formatMessage({\r\n id: newFavorite ? 'memory.actions.favoriteAdded' : 'memory.actions.favoriteRemoved',\r\n })\r\n );\r\n } catch (err) {\r\n console.error('Failed to toggle favorite:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.favoriteError' }));\r\n }\r\n };\r\n\r\n const handleArchive = async (memory: CoreMemory) => {\r\n try {\r\n await archiveMemory(memory.id);\r\n toast.success(formatMessage({ id: 'memory.actions.archiveSuccess' }));\r\n } catch (err) {\r\n console.error('Failed to archive:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.archiveError' }));\r\n }\r\n };\r\n\r\n const handleUnarchive = async (memory: CoreMemory) => {\r\n try {\r\n await unarchiveMemory(memory.id);\r\n toast.success(formatMessage({ id: 'memory.actions.unarchiveSuccess' }));\r\n } catch (err) {\r\n console.error('Failed to unarchive:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.unarchiveError' }));\r\n }\r\n };\r\n\r\n const copyToClipboard = async (content: string) => {\r\n try {\r\n await navigator.clipboard.writeText(content);\r\n toast.success(formatMessage({ id: 'memory.actions.copySuccess' }));\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n toast.error(formatMessage({ id: 'memory.actions.copyError' }));\r\n }\r\n };\r\n\r\n const handleReindex = async () => {\r\n try {\r\n await reindex();\r\n toast.success(formatMessage({ id: 'memory.unified.reindexSuccess' }));\r\n refetchStats();\r\n } catch (err) {\r\n console.error('Failed to reindex:', err);\r\n toast.error(formatMessage({ id: 'memory.unified.reindexError' }));\r\n }\r\n };\r\n\r\n const toggleTag = (tag: string) => {\r\n setSelectedTags((prev) =>\r\n prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag]\r\n );\r\n };\r\n\r\n const formattedTotalSize = totalSize < 1024\r\n ? `${totalSize} B`\r\n : totalSize < 1024 * 1024\r\n ? `${(totalSize / 1024).toFixed(1)} KB`\r\n : `${(totalSize / (1024 * 1024)).toFixed(1)} MB`;\r\n\r\n const handleRefresh = () => {\r\n if (isUnifiedTab) {\r\n refetchUnified();\r\n refetchStats();\r\n } else {\r\n refetch();\r\n }\r\n };\r\n\r\n const isRefreshing = isUnifiedTab ? unifiedFetching : isFetching;\r\n const activeError = isUnifiedTab ? unifiedError : error;\r\n\r\n return (\r\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\r\n {/* Page Header */}\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\r\n <Brain className=\"w-6 h-6 text-primary\" />\r\n {formatMessage({ id: 'memory.title' })}\r\n </h1>\r\n <p className=\"text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'memory.description' })}\r\n </p>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={toggleImmersiveMode}\r\n className={cn(\r\n 'p-2 rounded-md transition-colors',\r\n isImmersiveMode\r\n ? 'bg-primary/10 text-primary'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\r\n >\r\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\r\n </button>\r\n {isUnifiedTab && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleReindex}\r\n disabled={isReindexing}\r\n >\r\n {isReindexing ? (\r\n <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\r\n ) : (\r\n <Zap className=\"w-4 h-4 mr-2\" />\r\n )}\r\n {formatMessage({ id: isReindexing ? 'memory.unified.reindexing' : 'memory.unified.reindex' })}\r\n </Button>\r\n )}\r\n <Button variant=\"outline\" onClick={handleRefresh} disabled={isRefreshing}>\r\n <RefreshCw className={cn('w-4 h-4 mr-2', isRefreshing && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh' })}\r\n </Button>\r\n {!isUnifiedTab && (\r\n <Button onClick={() => { setEditingMemory(null); setIsNewMemoryOpen(true); }}>\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.actions.add' })}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <TabsNavigation\r\n value={currentTab}\r\n onValueChange={(v) => setCurrentTab(v as typeof currentTab)}\r\n tabs={[\r\n {\r\n value: 'memories',\r\n label: formatMessage({ id: 'memory.tabs.memories' }),\r\n icon: <Brain className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'favorites',\r\n label: formatMessage({ id: 'memory.tabs.favorites' }),\r\n icon: <Star className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'archived',\r\n label: formatMessage({ id: 'memory.tabs.archived' }),\r\n icon: <Archive className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'unifiedSearch',\r\n label: formatMessage({ id: 'memory.tabs.unifiedSearch' }),\r\n icon: <Search className=\"h-4 w-4\" />,\r\n },\r\n {\r\n value: 'v2pipeline',\r\n label: 'V2 Pipeline',\r\n icon: <Zap className=\"h-4 w-4\" />,\r\n },\r\n ]}\r\n />\r\n\r\n {/* Error alert */}\r\n {activeError && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{activeError.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={handleRefresh}>\r\n {formatMessage({ id: 'home.errors.retry' })}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Stats Cards */}\r\n {isUnifiedTab ? (\r\n /* Unified Stats Cards */\r\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-primary/10\">\r\n <Database className=\"w-5 h-5 text-primary\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.core_memories.total ?? 0)}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.count' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-orange-500/10\">\r\n <Hash className=\"w-5 h-5 text-orange-500\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.entities ?? 0)}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.entities' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-blue-500/10\">\r\n <Layers className=\"w-5 h-5 text-blue-500\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.vector_index.total_chunks ?? 0)}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.vectorChunks' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={cn(\r\n \"p-2 rounded-lg\",\r\n unifiedStats?.vector_index.hnsw_available ? \"bg-green-500/10\" : \"bg-muted\"\r\n )}>\r\n <Zap className={cn(\r\n \"w-5 h-5\",\r\n unifiedStats?.vector_index.hnsw_available ? \"text-green-500\" : \"text-muted-foreground\"\r\n )} />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">\r\n {statsLoading ? '-' : (unifiedStats?.vector_index.hnsw_available ? unifiedStats.vector_index.hnsw_count : 'N/A')}\r\n </div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.hnswStatus' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n </div>\r\n ) : (\r\n /* Standard Stats Cards */\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-primary/10\">\r\n <Database className=\"w-5 h-5 text-primary\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">{memories.length}</div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.count' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-info/10\">\r\n <FileText className=\"w-5 h-5 text-info\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">{claudeMdCount}</div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.claudeMdCount' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-success/10\">\r\n <Brain className=\"w-5 h-5 text-success\" />\r\n </div>\r\n <div>\r\n <div className=\"text-2xl font-bold text-foreground\">{formattedTotalSize}</div>\r\n <p className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'memory.stats.totalSize' })}</p>\r\n </div>\r\n </div>\r\n </Card>\r\n </div>\r\n )}\r\n\r\n {/* Search and Filters */}\r\n {isUnifiedTab ? (\r\n /* Unified Search Input + Category Filter */\r\n <div className=\"space-y-3\">\r\n <div className=\"flex gap-3\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'memory.filters.searchUnified' })}\r\n value={unifiedQuery}\r\n onChange={(e) => setUnifiedQuery(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n <select\r\n value={selectedCategory}\r\n onChange={(e) => setSelectedCategory(e.target.value)}\r\n className=\"px-3 py-2 bg-background border border-input rounded-md text-sm min-w-[160px]\"\r\n >\r\n {CATEGORY_OPTIONS.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {formatMessage({ id: opt.labelId })}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n {unifiedQuery.trim().length > 0 && !unifiedLoading && (\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.resultCount' }, { count: unifiedTotal })}\r\n </p>\r\n )}\r\n </div>\r\n ) : (\r\n /* Standard Search + Tag Filters */\r\n <div className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'memory.filters.search' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n\r\n {/* Tags Filter */}\r\n {allTags.length > 0 && (\r\n <div className=\"flex flex-wrap gap-2\">\r\n <span className=\"text-sm text-muted-foreground py-1\">{formatMessage({ id: 'memory.card.tags' })}:</span>\r\n {allTags.map((tag) => (\r\n <Button\r\n key={tag}\r\n variant={selectedTags.includes(tag) ? 'default' : 'outline'}\r\n size=\"sm\"\r\n className=\"h-7\"\r\n onClick={() => toggleTag(tag)}\r\n >\r\n <Tag className=\"w-3 h-3 mr-1\" />\r\n {tag}\r\n </Button>\r\n ))}\r\n {selectedTags.length > 0 && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-7\"\r\n onClick={() => setSelectedTags([])}\r\n >\r\n {formatMessage({ id: 'memory.filters.clear' })}\r\n </Button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content Area */}\r\n {currentTab === 'v2pipeline' ? (\r\n /* V2 Pipeline Tab */\r\n <V2PipelineTab />\r\n ) : isUnifiedTab ? (\r\n /* Unified Search Results */\r\n unifiedLoading ? (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary mr-2\" />\r\n <span className=\"text-muted-foreground\">\r\n {formatMessage({ id: 'memory.unified.searching' })}\r\n </span>\r\n </div>\r\n ) : unifiedQuery.trim().length === 0 ? (\r\n <Card className=\"p-8 text-center\">\r\n <Search className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\r\n {formatMessage({ id: 'memory.tabs.unifiedSearch' })}\r\n </h3>\r\n <p className=\"mt-2 text-muted-foreground\">\r\n {formatMessage({ id: 'memory.filters.searchUnified' })}\r\n </p>\r\n </Card>\r\n ) : unifiedResults.length === 0 ? (\r\n <Card className=\"p-8 text-center\">\r\n <Search className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\r\n {formatMessage({ id: 'memory.unified.noResults' })}\r\n </h3>\r\n </Card>\r\n ) : (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {unifiedResults.map((result) => (\r\n <UnifiedResultCard\r\n key={`${result.source_type}-${result.source_id}`}\r\n result={result}\r\n onCopy={copyToClipboard}\r\n />\r\n ))}\r\n </div>\r\n )\r\n ) : (\r\n /* Standard Memory List */\r\n isLoading ? (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {[1, 2, 3, 4, 5, 6].map((i) => (\r\n <div key={i} className=\"h-64 bg-muted animate-pulse rounded-lg\" />\r\n ))}\r\n </div>\r\n ) : memories.length === 0 ? (\r\n <Card className=\"p-8 text-center\">\r\n <Brain className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\r\n {formatMessage({ id: 'memory.emptyState.title' })}\r\n </h3>\r\n <p className=\"mt-2 text-muted-foreground\">\r\n {formatMessage({ id: 'memory.emptyState.message' })}\r\n </p>\r\n <Button className=\"mt-4\" onClick={() => { setEditingMemory(null); setIsNewMemoryOpen(true); }}>\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'memory.emptyState.createFirst' })}\r\n </Button>\r\n </Card>\r\n ) : (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {memories.map((memory) => (\r\n <MemoryCard\r\n key={memory.id}\r\n memory={memory}\r\n onView={setViewingMemory}\r\n onEdit={handleEdit}\r\n onDelete={handleDelete}\r\n onCopy={copyToClipboard}\r\n onToggleFavorite={handleToggleFavorite}\r\n onArchive={handleArchive}\r\n onUnarchive={handleUnarchive}\r\n />\r\n ))}\r\n </div>\r\n )\r\n )}\r\n\r\n {/* View Memory Dialog */}\r\n <ViewMemoryDialog\r\n memory={viewingMemory}\r\n open={viewingMemory !== null}\r\n onOpenChange={(open) => { if (!open) setViewingMemory(null); }}\r\n onEdit={handleEdit}\r\n onCopy={copyToClipboard}\r\n />\r\n\r\n {/* New/Edit Memory Dialog */}\r\n <NewMemoryDialog\r\n open={isNewMemoryOpen}\r\n onOpenChange={(open) => {\r\n setIsNewMemoryOpen(open);\r\n if (!open) setEditingMemory(null);\r\n }}\r\n onSubmit={handleCreateMemory}\r\n isCreating={isCreating || isUpdating}\r\n editingMemory={editingMemory}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default MemoryPage;\r\n"],"names":["STALE_TIME","useMemory","options","filter","staleTime","enabled","queryClient","useQueryClient","projectPath","useWorkflowStore","selectProjectPath","queryEnabled","query","useQuery","workspaceQueryKeys","fetchMemories","allMemories","_a","totalSize","_b","claudeMdCount","_c","filteredMemories","memories","searchLower","m","t","tag","parseMemoryMetadata","allTags","refetch","invalidate","useCreateMemory","mutation","useMutation","input","createMemory","useUpdateMemory","memoryId","updateMemory","useDeleteMemory","deleteMemory","useArchiveMemory","archiveMemoryApi","useUnarchiveMemory","unarchiveMemoryApi","useMemoryMutations","create","update","remove","archive","unarchive","useUnifiedSearch","categories","topK","minScore","result","fetchUnifiedSearch","useUnifiedStats","fetchUnifiedStats","useRecommendations","limit","fetchRecommendations","useReindex","triggerReindex","memoryV2Keys","path","filters","includeNative","useExtractionStatus","getExtractionStatus","useConsolidationStatus","getConsolidationStatus","useV2Jobs","getV2Jobs","useTriggerExtraction","maxSessions","triggerExtraction","useTriggerConsolidation","triggerConsolidation","usePreviewSessions","previewExtractionQueue","useTriggerSelectiveExtraction","params","triggerSelectiveExtraction","formatBytes","bytes","k","sizes","formatTimestamp","timestamp","date","formatDistanceToNow","SessionPreviewPanel","onClose","onExtractComplete","intl","useIntl","searchQuery","setSearchQuery","useState","selectedIds","setSelectedIds","setIncludeNative","data","isLoading","filteredSessions","useMemo","session","readySessions","s","toggleSelection","sessionId","prev","next","selectAll","selectNone","handleExtract","jsxs","jsx","Eye","Checkbox","checked","Button","Loader2","Search","Input","e","isReady","isSelected","isDisabled","cn","Badge","CheckCircle2","Clock","XCircle","Fragment","formatRelativeTime","STATUS_CONFIG","CheckCircle","AlertCircle","StatusBadge","status","config","ExtractionCard","trigger","setMaxSessions","showPreview","setShowPreview","handleTrigger","hasRunningJob","j","lastRunText","Card","Zap","Play","RefreshCw","job","Dialog","DialogContent","ConsolidationCard","copied","setCopied","handleCopy","err","isRunning","Database","DialogHeader","DialogTitle","FileText","Check","Copy","ReactMarkdown","remarkGfm","rehypeHighlight","JobsList","kindFilter","setKindFilter","statusFilter","setStatusFilter","selectedJob","setSelectedJob","copiedError","setCopiedError","handleCopyError","Activity","count","PipelineStatusBanner","jobs","runningJobs","errorJobs","hasRunningJobs","errorCount","runningCount","V2PipelineTab","SOURCE_TYPE_COLORS","SOURCE_TYPE_ICONS","Brain","Terminal","GitBranch","Hash","Layers","SourceTypeBadge","sourceType","colorClass","icon","MemoryCard","memory","onView","onEdit","onDelete","onCopy","onToggleFavorite","onArchive","onUnarchive","formattedDate","metadata","isFavorite","priority","isArchived","formattedSize","Star","Edit","ArchiveRestore","Archive","Trash2","Tag","UnifiedResultCard","formatMessage","scorePercent","RecommendationsPanel","recommendations","rec","ViewMemoryDialog","open","onOpenChange","NewMemoryDialog","onSubmit","isCreating","editingMemory","content","setContent","tagsInput","setTagsInput","setIsFavorite","setPriority","useEffect","handleSubmit","tags","Plus","CATEGORY_OPTIONS","MemoryPage","selectedTags","setSelectedTags","isNewMemoryOpen","setIsNewMemoryOpen","setEditingMemory","viewingMemory","setViewingMemory","currentTab","setCurrentTab","unifiedQuery","setUnifiedQuery","selectedCategory","setSelectedCategory","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","isUnifiedTab","favoriteFilter","archivedFilter","isFetching","error","unifiedResults","unifiedTotal","unifiedLoading","unifiedFetching","unifiedError","refetchUnified","unifiedStats","statsLoading","refetchStats","reindex","isReindexing","archiveMemory","unarchiveMemory","isUpdating","handleCreateMemory","handleEdit","handleDelete","handleToggleFavorite","currentMetadata","newFavorite","toast","handleArchive","handleUnarchive","copyToClipboard","handleReindex","toggleTag","formattedTotalSize","handleRefresh","isRefreshing","activeError","Minimize2","Maximize2","TabsNavigation","v","opt","i"],"mappings":"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"}
|