claude-code-workflow 6.1.4 → 6.2.2
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/CLAUDE.md +10 -0
- package/.claude/agents/action-planning-agent.md +857 -778
- package/.claude/agents/cli-execution-agent.md +266 -269
- package/.claude/agents/cli-explore-agent.md +2 -2
- package/.claude/agents/cli-lite-planning-agent.md +142 -92
- package/.claude/agents/cli-planning-agent.md +4 -4
- package/.claude/agents/code-developer.md +7 -6
- package/.claude/agents/conceptual-planning-agent.md +2 -2
- package/.claude/agents/context-search-agent.md +31 -32
- package/.claude/agents/doc-generator.md +4 -4
- package/.claude/agents/memory-bridge.md +93 -93
- package/.claude/agents/test-context-search-agent.md +8 -7
- package/.claude/agents/test-fix-agent.md +7 -6
- package/.claude/commands/clean.md +516 -0
- package/.claude/commands/memory/compact.md +383 -0
- package/.claude/commands/memory/docs-full-cli.md +471 -471
- package/.claude/commands/memory/docs-related-cli.md +386 -386
- package/.claude/commands/memory/docs.md +615 -615
- package/.claude/commands/memory/load.md +5 -5
- package/.claude/commands/memory/tech-research-rules.md +310 -0
- package/.claude/commands/memory/update-full.md +332 -332
- package/.claude/commands/memory/workflow-skill-memory.md +4 -4
- package/.claude/commands/task/create.md +151 -151
- package/.claude/commands/version.md +254 -254
- package/.claude/commands/workflow/brainstorm/api-designer.md +587 -585
- package/.claude/commands/workflow/brainstorm/artifacts.md +1 -0
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -443
- package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
- package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
- package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
- package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
- package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
- package/.claude/commands/workflow/brainstorm/system-architect.md +389 -387
- package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
- package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
- package/.claude/commands/workflow/debug.md +321 -0
- package/.claude/commands/workflow/execute.md +13 -0
- package/.claude/commands/workflow/init.md +165 -164
- package/.claude/commands/workflow/lite-execute.md +119 -13
- package/.claude/commands/workflow/lite-fix.md +623 -621
- package/.claude/commands/workflow/lite-plan.md +610 -592
- package/.claude/commands/workflow/plan.md +5 -5
- package/.claude/commands/workflow/review-module-cycle.md +2 -0
- package/.claude/commands/workflow/review-session-cycle.md +2 -0
- package/.claude/commands/workflow/review.md +297 -291
- package/.claude/commands/workflow/session/complete.md +153 -500
- package/.claude/commands/workflow/session/list.md +95 -95
- package/.claude/commands/workflow/session/resume.md +60 -60
- package/.claude/commands/workflow/session/start.md +199 -199
- package/.claude/commands/workflow/tdd-plan.md +3 -3
- package/.claude/commands/workflow/tdd-verify.md +23 -9
- package/.claude/commands/workflow/test-cycle-execute.md +2 -0
- package/.claude/commands/workflow/test-fix-gen.md +699 -699
- package/.claude/commands/workflow/tools/conflict-resolution.md +104 -18
- package/.claude/commands/workflow/tools/context-gather.md +436 -434
- package/.claude/commands/workflow/tools/task-generate-agent.md +490 -291
- package/.claude/commands/workflow/tools/task-generate-tdd.md +18 -10
- package/.claude/commands/workflow/tools/test-concept-enhanced.md +2 -1
- package/.claude/commands/workflow/tools/test-context-gather.md +1 -0
- package/.claude/commands/workflow/tools/test-task-generate.md +1 -0
- package/.claude/commands/workflow/ui-design/import-from-code.md +9 -6
- package/.claude/skills/command-guide/SKILL.md +5 -5
- package/.claude/skills/command-guide/index/all-commands.json +1 -1
- package/.claude/skills/command-guide/index/by-category.json +1 -1
- package/.claude/skills/command-guide/index/by-use-case.json +1 -1
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -778
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +266 -269
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +2 -2
- package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +142 -92
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +4 -4
- package/.claude/skills/command-guide/reference/agents/code-developer.md +7 -6
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +2 -2
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +31 -32
- package/.claude/skills/command-guide/reference/agents/doc-generator.md +4 -4
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
- package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +8 -7
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +7 -6
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +17 -16
- package/.claude/skills/command-guide/reference/commands/memory/load.md +5 -5
- package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +194 -357
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
- package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +4 -4
- package/.claude/skills/command-guide/reference/commands/task/create.md +151 -151
- package/.claude/skills/command-guide/reference/commands/version.md +254 -254
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -585
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -443
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -220
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -387
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -221
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -221
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +25 -20
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -686
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -621
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -592
- package/.claude/skills/command-guide/reference/commands/workflow/plan.md +5 -5
- package/.claude/skills/command-guide/reference/commands/workflow/review.md +25 -18
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -500
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +45 -27
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +35 -19
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +90 -33
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +3 -3
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +23 -9
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -699
- package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +103 -17
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -291
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +17 -10
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +6 -6
- package/.claude/workflows/chinese-response.md +38 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-api.txt +122 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-components.txt +122 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-config.txt +89 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-core.txt +60 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-patterns.txt +70 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-testing.txt +81 -0
- package/.claude/workflows/cli-templates/prompts/rules/tech-rules-agent-prompt.txt +89 -0
- package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -131
- package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +5 -9
- package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +5 -9
- package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +112 -0
- package/.claude/workflows/cli-templates/protocols/write-protocol.md +201 -0
- package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +137 -0
- package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +127 -0
- package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +25 -0
- package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +25 -0
- package/.claude/workflows/cli-tools-usage.md +526 -0
- package/{CLAUDE.md → .claude/workflows/coding-philosophy.md} +24 -45
- package/.claude/workflows/context-tools.md +84 -0
- package/.claude/workflows/file-modification.md +64 -0
- package/.claude/workflows/tool-strategy.md +216 -79
- package/.claude/workflows/windows-platform.md +16 -0
- package/.claude/workflows/workflow-architecture.md +942 -942
- package/.codex/AGENTS.md +63 -330
- package/.codex/prompts/debug.md +318 -0
- package/.codex/prompts/execute.md +273 -0
- package/.codex/prompts/lite-execute.md +164 -0
- package/.codex/prompts/lite-plan.md +469 -0
- package/.codex/prompts.zip +0 -0
- package/.gemini/GEMINI.md +25 -164
- package/.qwen/QWEN.md +0 -139
- package/README.md +29 -9
- package/ccw/README.md +30 -6
- package/ccw/bin/ccw-mcp.js +7 -0
- package/ccw/bin/ccw.js +9 -9
- package/ccw/package.json +65 -47
- package/ccw/src/.workflow/.cli-history/history.db +0 -0
- package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
- package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
- package/ccw/src/cli.ts +244 -0
- package/ccw/src/commands/cli.ts +740 -0
- package/ccw/src/commands/core-memory.ts +770 -0
- package/ccw/src/commands/hook.ts +315 -0
- package/ccw/src/commands/install.ts +519 -0
- package/ccw/src/commands/{list.js → list.ts} +1 -1
- package/ccw/src/commands/memory.ts +1090 -0
- package/ccw/src/commands/{serve.js → serve.ts} +14 -5
- package/ccw/src/commands/session-path-resolver.ts +372 -0
- package/ccw/src/commands/session.ts +1141 -0
- package/ccw/src/commands/{stop.js → stop.ts} +16 -6
- package/ccw/src/commands/tool.ts +201 -0
- package/ccw/src/commands/{uninstall.js → uninstall.ts} +89 -40
- package/ccw/src/commands/{upgrade.js → upgrade.ts} +68 -23
- package/ccw/src/commands/{view.js → view.ts} +22 -8
- package/ccw/src/config/storage-paths.ts +670 -0
- package/ccw/src/core/cache-manager.ts +294 -0
- package/ccw/src/core/claude-freshness.ts +319 -0
- package/ccw/src/core/core-memory-store.ts +1528 -0
- package/ccw/src/core/{dashboard-generator-patch.js → dashboard-generator-patch.ts} +18 -0
- package/ccw/src/core/{dashboard-generator.js → dashboard-generator.ts} +69 -12
- package/ccw/src/core/data-aggregator.ts +584 -0
- package/ccw/src/core/history-importer.ts +625 -0
- package/ccw/src/core/{lite-scanner.js → lite-scanner-complete.ts} +162 -66
- package/ccw/src/core/lite-scanner.ts +469 -0
- package/ccw/src/core/{manifest.js → manifest.ts} +104 -34
- package/ccw/src/core/memory-embedder-bridge.ts +262 -0
- package/ccw/src/core/memory-store.ts +978 -0
- package/ccw/src/core/routes/ccw-routes.ts +96 -0
- package/ccw/src/core/routes/claude-routes.ts +1183 -0
- package/ccw/src/core/routes/cli-routes.ts +561 -0
- package/ccw/src/core/routes/codexlens-routes.ts +806 -0
- package/ccw/src/core/routes/core-memory-routes.ts +605 -0
- package/ccw/src/core/routes/files-routes.ts +428 -0
- package/ccw/src/core/routes/graph-routes.md +164 -0
- package/ccw/src/core/routes/graph-routes.ts +626 -0
- package/ccw/src/core/routes/help-routes.ts +308 -0
- package/ccw/src/core/routes/hooks-routes.ts +405 -0
- package/ccw/src/core/routes/mcp-routes.ts +1271 -0
- package/ccw/src/core/routes/mcp-routes.ts.backup +550 -0
- package/ccw/src/core/routes/mcp-templates-db.ts +268 -0
- package/ccw/src/core/routes/memory-routes.ts +1206 -0
- package/ccw/src/core/routes/rules-routes.ts +526 -0
- package/ccw/src/core/routes/session-routes.ts +467 -0
- package/ccw/src/core/routes/skills-routes.ts +599 -0
- package/ccw/src/core/routes/status-routes.ts +57 -0
- package/ccw/src/core/routes/system-routes.ts +427 -0
- package/ccw/src/core/server.ts +431 -0
- package/ccw/src/core/session-clustering-service.ts +1258 -0
- package/ccw/src/core/session-scanner.ts +283 -0
- package/ccw/src/core/websocket.ts +190 -0
- package/ccw/src/{index.js → index.ts} +1 -0
- package/ccw/src/mcp-server/index.ts +186 -0
- package/ccw/src/templates/assets/css/github-dark.min.css +10 -0
- package/ccw/src/templates/assets/css/github.min.css +10 -0
- package/ccw/src/templates/assets/js/cytoscape.min.js +32 -0
- package/ccw/src/templates/assets/js/d3.min.js +2 -0
- package/ccw/src/templates/assets/js/highlight.min.js +1244 -0
- package/ccw/src/templates/assets/js/lucide.min.js +12 -0
- package/ccw/src/templates/assets/js/marked.min.js +69 -0
- package/ccw/src/templates/assets/js/tailwind.js +83 -0
- package/ccw/src/templates/dashboard-css/01-base.css +11 -0
- package/ccw/src/templates/dashboard-css/02-session.css +22 -0
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +10 -0
- package/ccw/src/templates/dashboard-css/06-cards.css +10 -4
- package/ccw/src/templates/dashboard-css/07-managers.css +1178 -7
- package/ccw/src/templates/dashboard-css/09-explorer.css +23 -12
- package/ccw/src/templates/dashboard-css/10-cli-status.css +337 -0
- package/ccw/src/templates/dashboard-css/11-cli-history.css +271 -0
- package/ccw/src/templates/dashboard-css/12-cli-legacy.css +796 -0
- package/ccw/src/templates/dashboard-css/13-cli-ccw.css +199 -0
- package/ccw/src/templates/dashboard-css/14-cli-modals.css +258 -0
- package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
- package/ccw/src/templates/dashboard-css/16-cli-session.css +241 -0
- package/ccw/src/templates/dashboard-css/17-cli-conversation.css +283 -0
- package/ccw/src/templates/dashboard-css/18-cli-settings.css +160 -0
- package/ccw/src/templates/dashboard-css/19-cli-native-session.css +496 -0
- package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
- package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
- package/ccw/src/templates/dashboard-css/22-cli-semantic.css +240 -0
- package/ccw/src/templates/dashboard-css/23-memory.css +2390 -0
- package/ccw/src/templates/dashboard-css/24-prompt-history.css +1089 -0
- package/ccw/src/templates/dashboard-css/25-skills-rules.css +326 -0
- package/ccw/src/templates/dashboard-css/26-claude-manager.css +908 -0
- package/ccw/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
- package/ccw/src/templates/dashboard-css/28-mcp-manager.css +748 -0
- package/ccw/src/templates/dashboard-css/29-help.css +264 -0
- package/ccw/src/templates/dashboard-css/30-core-memory.css +1700 -0
- package/ccw/src/templates/dashboard-js/api.js +162 -142
- package/ccw/src/templates/dashboard-js/components/carousel.js +4 -4
- package/ccw/src/templates/dashboard-js/components/cli-history.js +876 -0
- package/ccw/src/templates/dashboard-js/components/cli-status.js +978 -0
- package/ccw/src/templates/dashboard-js/components/global-notifications.js +508 -219
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +1277 -282
- package/ccw/src/templates/dashboard-js/components/index-manager.js +302 -0
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +718 -27
- package/ccw/src/templates/dashboard-js/components/modals.js +66 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +80 -12
- package/ccw/src/templates/dashboard-js/components/notifications.js +758 -194
- package/ccw/src/templates/dashboard-js/components/storage-manager.js +478 -0
- package/ccw/src/templates/dashboard-js/components/tabs-other.js +157 -6
- package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
- package/ccw/src/templates/dashboard-js/help-i18n.js +272 -0
- package/ccw/src/templates/dashboard-js/i18n.js +2807 -0
- package/ccw/src/templates/dashboard-js/main.js +15 -0
- package/ccw/src/templates/dashboard-js/state.js +243 -42
- package/ccw/src/templates/dashboard-js/utils.js +47 -1
- package/ccw/src/templates/dashboard-js/views/claude-manager.js +912 -0
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +2272 -0
- package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
- package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
- package/ccw/src/templates/dashboard-js/views/core-memory.js +782 -0
- package/ccw/src/templates/dashboard-js/views/explorer.js +888 -852
- package/ccw/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
- package/ccw/src/templates/dashboard-js/views/help.js +856 -0
- package/ccw/src/templates/dashboard-js/views/history.js +337 -0
- package/ccw/src/templates/dashboard-js/views/home.js +61 -15
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +311 -43
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +204 -28
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2187 -411
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
- package/ccw/src/templates/dashboard-js/views/memory.js +1221 -0
- package/ccw/src/templates/dashboard-js/views/prompt-history.js +713 -0
- package/ccw/src/templates/dashboard-js/views/rules-manager.js +828 -0
- package/ccw/src/templates/dashboard-js/views/session-detail.js +54 -53
- package/ccw/src/templates/dashboard-js/views/skills-manager.js +819 -0
- package/ccw/src/templates/dashboard.html +185 -85
- package/ccw/src/templates/hooks-config-example.json +60 -0
- package/ccw/src/tools/classify-folders.ts +245 -0
- package/ccw/src/tools/cli-config-manager.ts +268 -0
- package/ccw/src/tools/cli-executor.ts +2014 -0
- package/ccw/src/tools/cli-history-store.ts +1195 -0
- package/ccw/src/tools/codex-lens.ts +1141 -0
- package/ccw/src/tools/{convert-tokens-to-css.js → convert-tokens-to-css.ts} +73 -23
- package/ccw/src/tools/core-memory.ts +444 -0
- package/ccw/src/tools/detect-changed-modules.ts +325 -0
- package/ccw/src/tools/{discover-design-files.js → discover-design-files.ts} +74 -24
- package/ccw/src/tools/edit-file.ts +568 -0
- package/ccw/src/tools/{generate-module-docs.js → generate-module-docs.ts} +207 -185
- package/ccw/src/tools/{get-modules-by-depth.js → get-modules-by-depth.ts} +120 -79
- package/ccw/src/tools/index.ts +370 -0
- package/ccw/src/tools/native-session-discovery.ts +795 -0
- package/ccw/src/tools/notifier.ts +129 -0
- package/ccw/src/tools/read-file.ts +410 -0
- package/ccw/src/tools/resume-strategy.ts +345 -0
- package/ccw/src/tools/session-content-parser.ts +619 -0
- package/ccw/src/tools/session-manager.ts +1026 -0
- package/ccw/src/tools/smart-context.ts +228 -0
- package/ccw/src/tools/smart-search.ts +2065 -0
- package/ccw/src/tools/smart-search.ts.backup +1233 -0
- package/ccw/src/tools/storage-manager.ts +455 -0
- package/ccw/src/tools/write-file.ts +222 -0
- package/ccw/src/types/config.ts +11 -0
- package/ccw/src/types/index.ts +3 -0
- package/ccw/src/types/session.ts +25 -0
- package/ccw/src/types/tool.ts +41 -0
- package/ccw/src/utils/{browser-launcher.js → browser-launcher.ts} +10 -8
- package/ccw/src/utils/file-utils.ts +48 -0
- package/ccw/src/utils/{path-resolver.js → path-resolver.ts} +114 -78
- package/ccw/src/utils/path-validator.ts +153 -0
- package/ccw/src/utils/{ui.js → ui.ts} +32 -25
- package/codex-lens/pyproject.toml +48 -0
- package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
- package/codex-lens/src/codexlens/__init__.py +28 -0
- package/codex-lens/src/codexlens/__main__.py +14 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__init__.py +27 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/commands.py +1931 -0
- package/codex-lens/src/codexlens/cli/embedding_manager.py +620 -0
- package/codex-lens/src/codexlens/cli/model_manager.py +289 -0
- package/codex-lens/src/codexlens/cli/output.py +124 -0
- package/codex-lens/src/codexlens/config.py +201 -0
- package/codex-lens/src/codexlens/entities.py +121 -0
- package/codex-lens/src/codexlens/errors.py +55 -0
- package/codex-lens/src/codexlens/indexing/README.md +77 -0
- package/codex-lens/src/codexlens/indexing/__init__.py +4 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -0
- package/codex-lens/src/codexlens/parsers/__init__.py +8 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/encoding.py +202 -0
- package/codex-lens/src/codexlens/parsers/factory.py +256 -0
- package/codex-lens/src/codexlens/parsers/tokenizer.py +98 -0
- package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -0
- package/codex-lens/src/codexlens/search/__init__.py +15 -0
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/chain_search.py +647 -0
- package/codex-lens/src/codexlens/search/enrichment.py +150 -0
- package/codex-lens/src/codexlens/search/hybrid_search.py +313 -0
- package/codex-lens/src/codexlens/search/query_parser.py +242 -0
- package/codex-lens/src/codexlens/search/ranking.py +274 -0
- package/codex-lens/src/codexlens/semantic/__init__.py +39 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/ann_index.py +414 -0
- package/codex-lens/src/codexlens/semantic/chunker.py +448 -0
- package/codex-lens/src/codexlens/semantic/code_extractor.py +274 -0
- package/codex-lens/src/codexlens/semantic/embedder.py +185 -0
- package/codex-lens/src/codexlens/semantic/vector_store.py +955 -0
- package/codex-lens/src/codexlens/storage/__init__.py +29 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/dir_index.py +1850 -0
- package/codex-lens/src/codexlens/storage/file_cache.py +32 -0
- package/codex-lens/src/codexlens/storage/index_tree.py +776 -0
- package/codex-lens/src/codexlens/storage/migration_manager.py +154 -0
- package/codex-lens/src/codexlens/storage/migrations/__init__.py +1 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_001_normalize_keywords.py +123 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_002_add_token_metadata.py +48 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_004_dual_fts.py +232 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_005_cleanup_unused_fields.py +196 -0
- package/codex-lens/src/codexlens/storage/path_mapper.py +274 -0
- package/codex-lens/src/codexlens/storage/registry.py +670 -0
- package/codex-lens/src/codexlens/storage/sqlite_store.py +576 -0
- package/codex-lens/src/codexlens/storage/sqlite_utils.py +64 -0
- package/package.json +4 -1
- package/.claude/commands/memory/tech-research.md +0 -477
- package/.claude/scripts/classify-folders.sh +0 -39
- package/.claude/scripts/convert_tokens_to_css.sh +0 -229
- package/.claude/scripts/detect_changed_modules.sh +0 -161
- package/.claude/scripts/discover-design-files.sh +0 -87
- package/.claude/scripts/extract-animations.js +0 -243
- package/.claude/scripts/extract-computed-styles.js +0 -118
- package/.claude/scripts/extract-layout-structure.js +0 -411
- package/.claude/scripts/generate_module_docs.sh +0 -717
- package/.claude/scripts/get_modules_by_depth.sh +0 -170
- package/.claude/scripts/ui-generate-preview.sh +0 -395
- package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
- package/.claude/scripts/update_module_claude.sh +0 -337
- package/.claude/workflows/context-search-strategy.md +0 -77
- package/.claude/workflows/intelligent-tools-strategy.md +0 -662
- package/ccw/src/cli.js +0 -119
- package/ccw/src/commands/install.js +0 -324
- package/ccw/src/commands/tool.js +0 -138
- package/ccw/src/core/data-aggregator.js +0 -409
- package/ccw/src/core/server.js +0 -2063
- package/ccw/src/core/session-scanner.js +0 -235
- package/ccw/src/tools/classify-folders.js +0 -204
- package/ccw/src/tools/detect-changed-modules.js +0 -288
- package/ccw/src/tools/edit-file.js +0 -266
- package/ccw/src/tools/index.js +0 -176
- package/ccw/src/utils/file-utils.js +0 -48
|
@@ -1,194 +1,758 @@
|
|
|
1
|
-
// ==========================================
|
|
2
|
-
// NOTIFICATIONS COMPONENT
|
|
3
|
-
// ==========================================
|
|
4
|
-
// Real-time silent refresh (no notification bubbles)
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
1
|
+
// ==========================================
|
|
2
|
+
// NOTIFICATIONS COMPONENT
|
|
3
|
+
// ==========================================
|
|
4
|
+
// Real-time silent refresh (no notification bubbles)
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Format JSON object for display in notifications
|
|
8
|
+
* Parses JSON strings and formats objects into readable key-value pairs
|
|
9
|
+
* @param {Object|string} obj - Object or JSON string to format
|
|
10
|
+
* @param {number} maxLen - Max string length (unused, kept for compatibility)
|
|
11
|
+
* @returns {string} Formatted string with key: value pairs
|
|
12
|
+
*/
|
|
13
|
+
function formatJsonDetails(obj, maxLen = 150) {
|
|
14
|
+
// Handle null/undefined
|
|
15
|
+
if (obj === null || obj === undefined) return '';
|
|
16
|
+
|
|
17
|
+
// If it is a string, try to parse as JSON
|
|
18
|
+
if (typeof obj === 'string') {
|
|
19
|
+
// Check if it looks like JSON
|
|
20
|
+
const trimmed = obj.trim();
|
|
21
|
+
if ((trimmed.startsWith('{') && trimmed.endsWith('}')) ||
|
|
22
|
+
(trimmed.startsWith('[') && trimmed.endsWith(']'))) {
|
|
23
|
+
try {
|
|
24
|
+
obj = JSON.parse(trimmed);
|
|
25
|
+
} catch (e) {
|
|
26
|
+
// Not valid JSON, return as-is
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
// Plain string, return as-is
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Handle non-objects (numbers, booleans, etc.)
|
|
36
|
+
if (typeof obj !== 'object') return String(obj);
|
|
37
|
+
|
|
38
|
+
// Handle arrays
|
|
39
|
+
if (Array.isArray(obj)) {
|
|
40
|
+
if (obj.length === 0) return '(empty array)';
|
|
41
|
+
return obj.slice(0, 5).map((item, i) => {
|
|
42
|
+
const itemStr = typeof item === 'object' ? JSON.stringify(item) : String(item);
|
|
43
|
+
return `[${i}] ${itemStr.length > 50 ? itemStr.substring(0, 47) + '...' : itemStr}`;
|
|
44
|
+
}).join('\n') + (obj.length > 5 ? `\n... +${obj.length - 5} more` : '');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Handle objects - format as readable key: value pairs
|
|
48
|
+
try {
|
|
49
|
+
const entries = Object.entries(obj);
|
|
50
|
+
if (entries.length === 0) return '(empty object)';
|
|
51
|
+
|
|
52
|
+
// Format each entry with proper value display
|
|
53
|
+
const lines = entries.slice(0, 8).map(([key, val]) => {
|
|
54
|
+
let valStr;
|
|
55
|
+
if (val === null) {
|
|
56
|
+
valStr = 'null';
|
|
57
|
+
} else if (val === undefined) {
|
|
58
|
+
valStr = 'undefined';
|
|
59
|
+
} else if (typeof val === 'boolean') {
|
|
60
|
+
valStr = val ? 'true' : 'false';
|
|
61
|
+
} else if (typeof val === 'number') {
|
|
62
|
+
valStr = String(val);
|
|
63
|
+
} else if (typeof val === 'object') {
|
|
64
|
+
valStr = JSON.stringify(val);
|
|
65
|
+
if (valStr.length > 40) valStr = valStr.substring(0, 37) + '...';
|
|
66
|
+
} else {
|
|
67
|
+
valStr = String(val);
|
|
68
|
+
if (valStr.length > 50) valStr = valStr.substring(0, 47) + '...';
|
|
69
|
+
}
|
|
70
|
+
return `${key}: ${valStr}`;
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
if (entries.length > 8) {
|
|
74
|
+
lines.push(`... +${entries.length - 8} more fields`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
} catch (e) {
|
|
79
|
+
// Fallback to stringified version
|
|
80
|
+
const str = JSON.stringify(obj);
|
|
81
|
+
return str.length > 200 ? str.substring(0, 197) + '...' : str;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
let wsConnection = null;
|
|
86
|
+
let autoRefreshInterval = null;
|
|
87
|
+
let lastDataHash = null;
|
|
88
|
+
const AUTO_REFRESH_INTERVAL_MS = 30000; // 30 seconds
|
|
89
|
+
|
|
90
|
+
// Custom event handlers registry for components to subscribe to specific events
|
|
91
|
+
const wsEventHandlers = {};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Register a custom handler for a specific WebSocket event type
|
|
95
|
+
* @param {string} eventType - The event type to listen for
|
|
96
|
+
* @param {Function} handler - The handler function
|
|
97
|
+
*/
|
|
98
|
+
function registerWsEventHandler(eventType, handler) {
|
|
99
|
+
if (!wsEventHandlers[eventType]) {
|
|
100
|
+
wsEventHandlers[eventType] = [];
|
|
101
|
+
}
|
|
102
|
+
wsEventHandlers[eventType].push(handler);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Unregister a custom handler for a specific WebSocket event type
|
|
107
|
+
* @param {string} eventType - The event type
|
|
108
|
+
* @param {Function} handler - The handler function to remove
|
|
109
|
+
*/
|
|
110
|
+
function unregisterWsEventHandler(eventType, handler) {
|
|
111
|
+
if (wsEventHandlers[eventType]) {
|
|
112
|
+
wsEventHandlers[eventType] = wsEventHandlers[eventType].filter(h => h !== handler);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Dispatch event to registered handlers
|
|
118
|
+
* @param {string} eventType - The event type
|
|
119
|
+
* @param {Object} data - The full event data
|
|
120
|
+
*/
|
|
121
|
+
function dispatchToEventHandlers(eventType, data) {
|
|
122
|
+
if (wsEventHandlers[eventType]) {
|
|
123
|
+
wsEventHandlers[eventType].forEach(handler => {
|
|
124
|
+
try {
|
|
125
|
+
handler(data);
|
|
126
|
+
} catch (e) {
|
|
127
|
+
console.error('[WS] Error in custom handler for', eventType, e);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// ========== WebSocket Connection ==========
|
|
134
|
+
function initWebSocket() {
|
|
135
|
+
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
136
|
+
const wsUrl = `${protocol}//${window.location.host}/ws`;
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
wsConnection = new WebSocket(wsUrl);
|
|
140
|
+
|
|
141
|
+
wsConnection.onopen = () => {
|
|
142
|
+
console.log('[WS] Connected');
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
wsConnection.onmessage = (event) => {
|
|
146
|
+
try {
|
|
147
|
+
const data = JSON.parse(event.data);
|
|
148
|
+
handleNotification(data);
|
|
149
|
+
} catch (e) {
|
|
150
|
+
console.error('[WS] Failed to parse message:', e);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
wsConnection.onclose = () => {
|
|
155
|
+
console.log('[WS] Disconnected, reconnecting in 5s...');
|
|
156
|
+
setTimeout(initWebSocket, 5000);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
wsConnection.onerror = (error) => {
|
|
160
|
+
console.error('[WS] Error:', error);
|
|
161
|
+
};
|
|
162
|
+
} catch (e) {
|
|
163
|
+
console.log('[WS] WebSocket not available, using polling');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ========== Notification Handler ==========
|
|
168
|
+
function handleNotification(data) {
|
|
169
|
+
const { type, payload } = data;
|
|
170
|
+
|
|
171
|
+
// Silent refresh - no notification bubbles
|
|
172
|
+
switch (type) {
|
|
173
|
+
case 'session_updated':
|
|
174
|
+
case 'summary_written':
|
|
175
|
+
case 'task_completed':
|
|
176
|
+
case 'new_session':
|
|
177
|
+
// Just refresh data silently
|
|
178
|
+
refreshIfNeeded();
|
|
179
|
+
// Optionally highlight in carousel if it's the current session
|
|
180
|
+
if (payload.sessionId && typeof carouselGoTo === 'function') {
|
|
181
|
+
carouselGoTo(payload.sessionId);
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
|
|
185
|
+
case 'SESSION_CREATED':
|
|
186
|
+
case 'SESSION_ARCHIVED':
|
|
187
|
+
case 'TASK_UPDATED':
|
|
188
|
+
case 'SESSION_UPDATED':
|
|
189
|
+
case 'TASK_CREATED':
|
|
190
|
+
case 'SUMMARY_WRITTEN':
|
|
191
|
+
case 'PLAN_UPDATED':
|
|
192
|
+
case 'REVIEW_UPDATED':
|
|
193
|
+
case 'CONTENT_WRITTEN':
|
|
194
|
+
case 'FILE_DELETED':
|
|
195
|
+
case 'DIRECTORY_CREATED':
|
|
196
|
+
// Route to state reducer for granular updates
|
|
197
|
+
if (typeof handleWorkflowEvent === 'function') {
|
|
198
|
+
handleWorkflowEvent({ type, ...payload });
|
|
199
|
+
} else {
|
|
200
|
+
// Fallback to full refresh if reducer not available
|
|
201
|
+
refreshIfNeeded();
|
|
202
|
+
}
|
|
203
|
+
break;
|
|
204
|
+
|
|
205
|
+
case 'tool_execution':
|
|
206
|
+
// Handle tool execution notifications from MCP tools
|
|
207
|
+
handleToolExecutionNotification(payload);
|
|
208
|
+
break;
|
|
209
|
+
|
|
210
|
+
case 'cli_execution':
|
|
211
|
+
// Handle CLI command notifications (ccw cli -p)
|
|
212
|
+
handleCliCommandNotification(payload);
|
|
213
|
+
break;
|
|
214
|
+
|
|
215
|
+
// CLI Tool Execution Events
|
|
216
|
+
case 'CLI_EXECUTION_STARTED':
|
|
217
|
+
if (typeof handleCliExecutionStarted === 'function') {
|
|
218
|
+
handleCliExecutionStarted(payload);
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
|
|
222
|
+
case 'CLI_OUTPUT':
|
|
223
|
+
if (typeof handleCliOutput === 'function') {
|
|
224
|
+
handleCliOutput(payload);
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
|
|
228
|
+
case 'CLI_EXECUTION_COMPLETED':
|
|
229
|
+
if (typeof handleCliExecutionCompleted === 'function') {
|
|
230
|
+
handleCliExecutionCompleted(payload);
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
|
|
234
|
+
case 'CLI_EXECUTION_ERROR':
|
|
235
|
+
if (typeof handleCliExecutionError === 'function') {
|
|
236
|
+
handleCliExecutionError(payload);
|
|
237
|
+
}
|
|
238
|
+
break;
|
|
239
|
+
|
|
240
|
+
// CLI Review Events
|
|
241
|
+
case 'CLI_REVIEW_UPDATED':
|
|
242
|
+
if (typeof handleCliReviewUpdated === 'function') {
|
|
243
|
+
handleCliReviewUpdated(payload);
|
|
244
|
+
}
|
|
245
|
+
// Also refresh CLI history to show review status
|
|
246
|
+
if (typeof refreshCliHistory === 'function') {
|
|
247
|
+
refreshCliHistory();
|
|
248
|
+
}
|
|
249
|
+
break;
|
|
250
|
+
|
|
251
|
+
// System Notify Events (from CLI commands)
|
|
252
|
+
case 'REFRESH_REQUIRED':
|
|
253
|
+
handleRefreshRequired(payload);
|
|
254
|
+
break;
|
|
255
|
+
|
|
256
|
+
case 'MEMORY_UPDATED':
|
|
257
|
+
if (typeof handleMemoryUpdated === 'function') {
|
|
258
|
+
handleMemoryUpdated(payload);
|
|
259
|
+
}
|
|
260
|
+
// Force refresh of memory view
|
|
261
|
+
if (typeof loadMemoryStats === 'function') {
|
|
262
|
+
loadMemoryStats().then(function() {
|
|
263
|
+
if (typeof renderHotspotsColumn === 'function') renderHotspotsColumn();
|
|
264
|
+
}).catch(function(err) {
|
|
265
|
+
console.error('[Memory] Failed to refresh stats:', err);
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
break;
|
|
269
|
+
|
|
270
|
+
case 'HISTORY_UPDATED':
|
|
271
|
+
// Refresh CLI history when updated externally
|
|
272
|
+
if (typeof refreshCliHistory === 'function') {
|
|
273
|
+
refreshCliHistory();
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
|
|
277
|
+
case 'INSIGHT_GENERATED':
|
|
278
|
+
// Refresh insights when new insight is generated
|
|
279
|
+
if (typeof loadInsightsHistory === 'function') {
|
|
280
|
+
loadInsightsHistory();
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
|
|
284
|
+
case 'ACTIVE_MEMORY_SYNCED':
|
|
285
|
+
// Handle Active Memory sync completion
|
|
286
|
+
if (typeof addGlobalNotification === 'function') {
|
|
287
|
+
const { filesAnalyzed, tool, usedCli } = payload;
|
|
288
|
+
const method = usedCli ? `CLI (${tool})` : 'Basic';
|
|
289
|
+
addGlobalNotification(
|
|
290
|
+
'success',
|
|
291
|
+
'Active Memory synced',
|
|
292
|
+
{
|
|
293
|
+
'Files Analyzed': filesAnalyzed,
|
|
294
|
+
'Method': method,
|
|
295
|
+
'Timestamp': new Date(payload.timestamp).toLocaleTimeString()
|
|
296
|
+
},
|
|
297
|
+
'Memory'
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
// Refresh Active Memory status
|
|
301
|
+
if (typeof loadActiveMemoryStatus === 'function') {
|
|
302
|
+
loadActiveMemoryStatus().catch(function(err) {
|
|
303
|
+
console.error('[Active Memory] Failed to refresh status:', err);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
console.log('[Active Memory] Sync completed:', payload);
|
|
307
|
+
break;
|
|
308
|
+
|
|
309
|
+
case 'CLAUDE_FILE_SYNCED':
|
|
310
|
+
// Handle CLAUDE.md file sync completion
|
|
311
|
+
if (typeof addGlobalNotification === 'function') {
|
|
312
|
+
const { path, level, tool, mode } = payload;
|
|
313
|
+
const fileName = path.split(/[/\\]/).pop();
|
|
314
|
+
addGlobalNotification(
|
|
315
|
+
'success',
|
|
316
|
+
`${fileName} synced`,
|
|
317
|
+
{
|
|
318
|
+
'Level': level,
|
|
319
|
+
'Tool': tool,
|
|
320
|
+
'Mode': mode,
|
|
321
|
+
'Time': new Date(payload.timestamp).toLocaleTimeString()
|
|
322
|
+
},
|
|
323
|
+
'CLAUDE.md'
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
// Refresh file list
|
|
327
|
+
if (typeof loadClaudeFiles === 'function') {
|
|
328
|
+
loadClaudeFiles().then(() => {
|
|
329
|
+
// Re-render the view to show updated content
|
|
330
|
+
if (typeof renderClaudeManager === 'function') {
|
|
331
|
+
renderClaudeManager();
|
|
332
|
+
}
|
|
333
|
+
}).catch(err => console.error('[CLAUDE.md] Failed to refresh files:', err));
|
|
334
|
+
}
|
|
335
|
+
console.log('[CLAUDE.md] Sync completed:', payload);
|
|
336
|
+
break;
|
|
337
|
+
|
|
338
|
+
case 'CLI_TOOL_INSTALLED':
|
|
339
|
+
// Handle CLI tool installation completion
|
|
340
|
+
if (typeof addGlobalNotification === 'function') {
|
|
341
|
+
const { tool } = payload;
|
|
342
|
+
addGlobalNotification(
|
|
343
|
+
'success',
|
|
344
|
+
`${tool} installed successfully`,
|
|
345
|
+
{
|
|
346
|
+
'Tool': tool,
|
|
347
|
+
'Time': new Date(payload.timestamp).toLocaleTimeString()
|
|
348
|
+
},
|
|
349
|
+
'CLI Tools'
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
// Refresh CLI manager
|
|
353
|
+
if (typeof loadCliToolStatus === 'function') {
|
|
354
|
+
loadCliToolStatus().then(() => {
|
|
355
|
+
if (typeof renderToolsSection === 'function') {
|
|
356
|
+
renderToolsSection();
|
|
357
|
+
}
|
|
358
|
+
}).catch(err => console.error('[CLI Tools] Failed to refresh status:', err));
|
|
359
|
+
}
|
|
360
|
+
console.log('[CLI Tools] Installation completed:', payload);
|
|
361
|
+
break;
|
|
362
|
+
|
|
363
|
+
case 'CLI_TOOL_UNINSTALLED':
|
|
364
|
+
// Handle CLI tool uninstallation completion
|
|
365
|
+
if (typeof addGlobalNotification === 'function') {
|
|
366
|
+
const { tool } = payload;
|
|
367
|
+
addGlobalNotification(
|
|
368
|
+
'success',
|
|
369
|
+
`${tool} uninstalled successfully`,
|
|
370
|
+
{
|
|
371
|
+
'Tool': tool,
|
|
372
|
+
'Time': new Date(payload.timestamp).toLocaleTimeString()
|
|
373
|
+
},
|
|
374
|
+
'CLI Tools'
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
// Refresh CLI manager
|
|
378
|
+
if (typeof loadCliToolStatus === 'function') {
|
|
379
|
+
loadCliToolStatus().then(() => {
|
|
380
|
+
if (typeof renderToolsSection === 'function') {
|
|
381
|
+
renderToolsSection();
|
|
382
|
+
}
|
|
383
|
+
}).catch(err => console.error('[CLI Tools] Failed to refresh status:', err));
|
|
384
|
+
}
|
|
385
|
+
console.log('[CLI Tools] Uninstallation completed:', payload);
|
|
386
|
+
break;
|
|
387
|
+
|
|
388
|
+
case 'CODEXLENS_INSTALLED':
|
|
389
|
+
// Handle CodexLens installation completion
|
|
390
|
+
if (typeof addGlobalNotification === 'function') {
|
|
391
|
+
const { version } = payload;
|
|
392
|
+
addGlobalNotification(
|
|
393
|
+
'success',
|
|
394
|
+
`CodexLens installed successfully`,
|
|
395
|
+
{
|
|
396
|
+
'Version': version || 'latest',
|
|
397
|
+
'Time': new Date(payload.timestamp).toLocaleTimeString()
|
|
398
|
+
},
|
|
399
|
+
'CodexLens'
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
// Refresh CLI status if active
|
|
403
|
+
if (typeof loadCodexLensStatus === 'function') {
|
|
404
|
+
loadCodexLensStatus().then(() => {
|
|
405
|
+
if (typeof renderCliStatus === 'function') {
|
|
406
|
+
renderCliStatus();
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
console.log('[CodexLens] Installation completed:', payload);
|
|
411
|
+
break;
|
|
412
|
+
|
|
413
|
+
case 'CODEXLENS_UNINSTALLED':
|
|
414
|
+
// Handle CodexLens uninstallation completion
|
|
415
|
+
if (typeof addGlobalNotification === 'function') {
|
|
416
|
+
addGlobalNotification(
|
|
417
|
+
'success',
|
|
418
|
+
`CodexLens uninstalled successfully`,
|
|
419
|
+
{
|
|
420
|
+
'Time': new Date(payload.timestamp).toLocaleTimeString()
|
|
421
|
+
},
|
|
422
|
+
'CodexLens'
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
// Refresh CLI status if active
|
|
426
|
+
if (typeof loadCodexLensStatus === 'function') {
|
|
427
|
+
loadCodexLensStatus().then(() => {
|
|
428
|
+
if (typeof renderCliStatus === 'function') {
|
|
429
|
+
renderCliStatus();
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
console.log('[CodexLens] Uninstallation completed:', payload);
|
|
434
|
+
break;
|
|
435
|
+
|
|
436
|
+
case 'CODEXLENS_INDEX_PROGRESS':
|
|
437
|
+
// Handle CodexLens index progress updates
|
|
438
|
+
dispatchToEventHandlers('CODEXLENS_INDEX_PROGRESS', data);
|
|
439
|
+
console.log('[CodexLens] Index progress:', payload.stage, payload.percent + '%');
|
|
440
|
+
break;
|
|
441
|
+
|
|
442
|
+
default:
|
|
443
|
+
console.log('[WS] Unknown notification type:', type);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Handle tool execution notifications from MCP tools
|
|
449
|
+
* @param {Object} payload - Tool execution payload
|
|
450
|
+
*/
|
|
451
|
+
function handleToolExecutionNotification(payload) {
|
|
452
|
+
const { toolName, status, params, result, error, timestamp } = payload;
|
|
453
|
+
|
|
454
|
+
// Determine notification type and message
|
|
455
|
+
let notifType = 'info';
|
|
456
|
+
let message = `Tool: ${toolName}`;
|
|
457
|
+
let details = null;
|
|
458
|
+
|
|
459
|
+
switch (status) {
|
|
460
|
+
case 'started':
|
|
461
|
+
notifType = 'info';
|
|
462
|
+
message = `Executing ${toolName}...`;
|
|
463
|
+
// Pass raw object for HTML formatting
|
|
464
|
+
if (params) {
|
|
465
|
+
details = params;
|
|
466
|
+
}
|
|
467
|
+
break;
|
|
468
|
+
|
|
469
|
+
case 'completed':
|
|
470
|
+
notifType = 'success';
|
|
471
|
+
message = `${toolName} completed`;
|
|
472
|
+
// Pass raw object for HTML formatting
|
|
473
|
+
if (result) {
|
|
474
|
+
if (result._truncated) {
|
|
475
|
+
details = result.preview;
|
|
476
|
+
} else {
|
|
477
|
+
details = result;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
break;
|
|
481
|
+
|
|
482
|
+
case 'failed':
|
|
483
|
+
notifType = 'error';
|
|
484
|
+
message = `${toolName} failed`;
|
|
485
|
+
details = error || 'Unknown error';
|
|
486
|
+
break;
|
|
487
|
+
|
|
488
|
+
default:
|
|
489
|
+
notifType = 'info';
|
|
490
|
+
message = `${toolName}: ${status}`;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Add to global notifications - pass objects directly for HTML formatting
|
|
494
|
+
if (typeof addGlobalNotification === 'function') {
|
|
495
|
+
addGlobalNotification(notifType, message, details, 'MCP');
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// Log to console
|
|
499
|
+
console.log(`[MCP] ${status}: ${toolName}`, payload);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Handle CLI command notifications (ccw cli -p)
|
|
504
|
+
* @param {Object} payload - CLI execution payload
|
|
505
|
+
*/
|
|
506
|
+
function handleCliCommandNotification(payload) {
|
|
507
|
+
const { event, tool, mode, prompt_preview, execution_id, success, duration_ms, status, error, turn_count, custom_id } = payload;
|
|
508
|
+
|
|
509
|
+
let notifType = 'info';
|
|
510
|
+
let message = '';
|
|
511
|
+
let details = null;
|
|
512
|
+
|
|
513
|
+
switch (event) {
|
|
514
|
+
case 'started':
|
|
515
|
+
notifType = 'info';
|
|
516
|
+
message = `CLI ${tool} started`;
|
|
517
|
+
// Pass structured object for rich display
|
|
518
|
+
details = {
|
|
519
|
+
mode: mode,
|
|
520
|
+
prompt: prompt_preview
|
|
521
|
+
};
|
|
522
|
+
if (custom_id) {
|
|
523
|
+
details.id = custom_id;
|
|
524
|
+
}
|
|
525
|
+
break;
|
|
526
|
+
|
|
527
|
+
case 'completed':
|
|
528
|
+
if (success) {
|
|
529
|
+
notifType = 'success';
|
|
530
|
+
const turnStr = turn_count > 1 ? ` (turn ${turn_count})` : '';
|
|
531
|
+
message = `CLI ${tool} completed${turnStr}`;
|
|
532
|
+
// Pass structured object for rich display
|
|
533
|
+
details = {
|
|
534
|
+
duration: duration_ms ? `${(duration_ms / 1000).toFixed(1)}s` : '-',
|
|
535
|
+
execution_id: execution_id
|
|
536
|
+
};
|
|
537
|
+
if (turn_count > 1) {
|
|
538
|
+
details.turns = turn_count;
|
|
539
|
+
}
|
|
540
|
+
} else {
|
|
541
|
+
notifType = 'error';
|
|
542
|
+
message = `CLI ${tool} failed`;
|
|
543
|
+
details = {
|
|
544
|
+
status: status || 'Unknown error',
|
|
545
|
+
execution_id: execution_id
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
break;
|
|
549
|
+
|
|
550
|
+
case 'error':
|
|
551
|
+
notifType = 'error';
|
|
552
|
+
message = `CLI ${tool} error`;
|
|
553
|
+
details = error || 'Unknown error';
|
|
554
|
+
break;
|
|
555
|
+
|
|
556
|
+
default:
|
|
557
|
+
notifType = 'info';
|
|
558
|
+
message = `CLI ${tool}: ${event}`;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// Add to global notifications - pass objects for HTML formatting
|
|
562
|
+
if (typeof addGlobalNotification === 'function') {
|
|
563
|
+
addGlobalNotification(notifType, message, details, 'CLI');
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Refresh CLI history if on history view
|
|
567
|
+
if (event === 'completed' && typeof currentView !== 'undefined' &&
|
|
568
|
+
(currentView === 'history' || currentView === 'cli-history')) {
|
|
569
|
+
if (typeof loadCliHistory === 'function' && typeof renderCliHistoryView === 'function') {
|
|
570
|
+
loadCliHistory().then(() => renderCliHistoryView());
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Log to console
|
|
575
|
+
console.log(`[CLI Command] ${event}: ${tool}`, payload);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// ========== Auto Refresh ==========
|
|
579
|
+
function initAutoRefresh() {
|
|
580
|
+
// Calculate initial hash
|
|
581
|
+
lastDataHash = calculateDataHash();
|
|
582
|
+
|
|
583
|
+
// Start polling interval
|
|
584
|
+
autoRefreshInterval = setInterval(checkForChanges, AUTO_REFRESH_INTERVAL_MS);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function calculateDataHash() {
|
|
588
|
+
if (!workflowData) return null;
|
|
589
|
+
|
|
590
|
+
// Simple hash based on key data points
|
|
591
|
+
const hashData = {
|
|
592
|
+
activeSessions: (workflowData.activeSessions || []).length,
|
|
593
|
+
archivedSessions: (workflowData.archivedSessions || []).length,
|
|
594
|
+
totalTasks: workflowData.statistics?.totalTasks || 0,
|
|
595
|
+
completedTasks: workflowData.statistics?.completedTasks || 0,
|
|
596
|
+
generatedAt: workflowData.generatedAt
|
|
597
|
+
};
|
|
598
|
+
|
|
599
|
+
return JSON.stringify(hashData);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
async function checkForChanges() {
|
|
603
|
+
if (!window.SERVER_MODE) return;
|
|
604
|
+
|
|
605
|
+
try {
|
|
606
|
+
const response = await fetch(`/api/data?path=${encodeURIComponent(projectPath)}`);
|
|
607
|
+
if (!response.ok) return;
|
|
608
|
+
|
|
609
|
+
const newData = await response.json();
|
|
610
|
+
const newHash = JSON.stringify({
|
|
611
|
+
activeSessions: (newData.activeSessions || []).length,
|
|
612
|
+
archivedSessions: (newData.archivedSessions || []).length,
|
|
613
|
+
totalTasks: newData.statistics?.totalTasks || 0,
|
|
614
|
+
completedTasks: newData.statistics?.completedTasks || 0,
|
|
615
|
+
generatedAt: newData.generatedAt
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
if (newHash !== lastDataHash) {
|
|
619
|
+
lastDataHash = newHash;
|
|
620
|
+
// Silent refresh - no notification
|
|
621
|
+
await refreshWorkspaceData(newData);
|
|
622
|
+
}
|
|
623
|
+
} catch (e) {
|
|
624
|
+
console.error('[AutoRefresh] Check failed:', e);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
async function refreshIfNeeded() {
|
|
629
|
+
if (!window.SERVER_MODE) return;
|
|
630
|
+
|
|
631
|
+
try {
|
|
632
|
+
const response = await fetch(`/api/data?path=${encodeURIComponent(projectPath)}`);
|
|
633
|
+
if (!response.ok) return;
|
|
634
|
+
|
|
635
|
+
const newData = await response.json();
|
|
636
|
+
await refreshWorkspaceData(newData);
|
|
637
|
+
} catch (e) {
|
|
638
|
+
console.error('[Refresh] Failed:', e);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
async function refreshWorkspaceData(newData) {
|
|
643
|
+
// Update global data
|
|
644
|
+
window.workflowData = newData;
|
|
645
|
+
|
|
646
|
+
// Clear and repopulate stores
|
|
647
|
+
Object.keys(sessionDataStore).forEach(k => delete sessionDataStore[k]);
|
|
648
|
+
Object.keys(liteTaskDataStore).forEach(k => delete liteTaskDataStore[k]);
|
|
649
|
+
|
|
650
|
+
[...(newData.activeSessions || []), ...(newData.archivedSessions || [])].forEach(s => {
|
|
651
|
+
const key = `session-${s.session_id}`.replace(/[^a-zA-Z0-9-]/g, '-');
|
|
652
|
+
sessionDataStore[key] = s;
|
|
653
|
+
});
|
|
654
|
+
|
|
655
|
+
[...(newData.liteTasks?.litePlan || []), ...(newData.liteTasks?.liteFix || [])].forEach(s => {
|
|
656
|
+
const key = `lite-${s.session_id}`.replace(/[^a-zA-Z0-9-]/g, '-');
|
|
657
|
+
liteTaskDataStore[key] = s;
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
// Update UI silently
|
|
661
|
+
updateStats();
|
|
662
|
+
updateBadges();
|
|
663
|
+
updateCarousel();
|
|
664
|
+
|
|
665
|
+
// Re-render current view if needed
|
|
666
|
+
if (currentView === 'sessions') {
|
|
667
|
+
renderSessions();
|
|
668
|
+
} else if (currentView === 'liteTasks') {
|
|
669
|
+
renderLiteTasks();
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
lastDataHash = calculateDataHash();
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* Handle REFRESH_REQUIRED events from CLI commands
|
|
677
|
+
* @param {Object} payload - Contains scope (memory|history|insights|all)
|
|
678
|
+
*/
|
|
679
|
+
function handleRefreshRequired(payload) {
|
|
680
|
+
const scope = payload?.scope || 'all';
|
|
681
|
+
console.log('[WS] Refresh required for scope:', scope);
|
|
682
|
+
|
|
683
|
+
switch (scope) {
|
|
684
|
+
case 'memory':
|
|
685
|
+
// Refresh memory stats and graph
|
|
686
|
+
if (typeof loadMemoryStats === 'function') {
|
|
687
|
+
loadMemoryStats().then(function() {
|
|
688
|
+
if (typeof renderHotspotsColumn === 'function') renderHotspotsColumn();
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
if (typeof loadMemoryGraph === 'function') {
|
|
692
|
+
loadMemoryGraph();
|
|
693
|
+
}
|
|
694
|
+
break;
|
|
695
|
+
|
|
696
|
+
case 'history':
|
|
697
|
+
// Refresh CLI history
|
|
698
|
+
if (typeof refreshCliHistory === 'function') {
|
|
699
|
+
refreshCliHistory();
|
|
700
|
+
}
|
|
701
|
+
break;
|
|
702
|
+
|
|
703
|
+
case 'insights':
|
|
704
|
+
// Refresh insights history
|
|
705
|
+
if (typeof loadInsightsHistory === 'function') {
|
|
706
|
+
loadInsightsHistory();
|
|
707
|
+
}
|
|
708
|
+
break;
|
|
709
|
+
|
|
710
|
+
case 'all':
|
|
711
|
+
default:
|
|
712
|
+
// Refresh everything
|
|
713
|
+
refreshIfNeeded();
|
|
714
|
+
if (typeof loadMemoryStats === 'function') {
|
|
715
|
+
loadMemoryStats().then(function() {
|
|
716
|
+
if (typeof renderHotspotsColumn === 'function') renderHotspotsColumn();
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
if (typeof refreshCliHistory === 'function') {
|
|
720
|
+
refreshCliHistory();
|
|
721
|
+
}
|
|
722
|
+
if (typeof loadInsightsHistory === 'function') {
|
|
723
|
+
loadInsightsHistory();
|
|
724
|
+
}
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// ========== Cleanup ==========
|
|
730
|
+
function stopAutoRefresh() {
|
|
731
|
+
if (autoRefreshInterval) {
|
|
732
|
+
clearInterval(autoRefreshInterval);
|
|
733
|
+
autoRefreshInterval = null;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
function closeWebSocket() {
|
|
738
|
+
if (wsConnection) {
|
|
739
|
+
wsConnection.close();
|
|
740
|
+
wsConnection = null;
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// ========== Navigation Helper ==========
|
|
745
|
+
function goToSession(sessionId) {
|
|
746
|
+
// Find session in carousel and navigate
|
|
747
|
+
const sessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
|
|
748
|
+
|
|
749
|
+
// Jump to session in carousel if visible
|
|
750
|
+
if (typeof carouselGoTo === 'function') {
|
|
751
|
+
carouselGoTo(sessionId);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// Navigate to session detail
|
|
755
|
+
if (sessionDataStore[sessionKey]) {
|
|
756
|
+
showSessionDetailPage(sessionKey);
|
|
757
|
+
}
|
|
758
|
+
}
|