lattice-orchestrator 0.7.0
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/LICENSE +201 -0
- package/README.md +58 -0
- package/config/logrotate.conf +15 -0
- package/dist/cli-parser.d.ts +11 -0
- package/dist/cli-parser.d.ts.map +1 -0
- package/dist/cli-parser.js +48 -0
- package/dist/cli-parser.js.map +1 -0
- package/dist/lattice-server.d.ts +70 -0
- package/dist/lattice-server.d.ts.map +1 -0
- package/dist/lattice-server.js +969 -0
- package/dist/lattice-server.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +190 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/mcp-server/lattice-tools.d.ts +15 -0
- package/dist/mcp-server/lattice-tools.d.ts.map +1 -0
- package/dist/mcp-server/lattice-tools.js +366 -0
- package/dist/mcp-server/lattice-tools.js.map +1 -0
- package/dist/middleware/cors-setup.d.ts +7 -0
- package/dist/middleware/cors-setup.d.ts.map +1 -0
- package/dist/middleware/cors-setup.js +8 -0
- package/dist/middleware/cors-setup.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +4 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +27 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/query-parser.d.ts +11 -0
- package/dist/middleware/query-parser.d.ts.map +1 -0
- package/dist/middleware/query-parser.js +68 -0
- package/dist/middleware/query-parser.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +4 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +6 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/process-daemon/index.d.ts +14 -0
- package/dist/process-daemon/index.d.ts.map +1 -0
- package/dist/process-daemon/index.js +51 -0
- package/dist/process-daemon/index.js.map +1 -0
- package/dist/process-daemon/process-daemon.d.ts +101 -0
- package/dist/process-daemon/process-daemon.d.ts.map +1 -0
- package/dist/process-daemon/process-daemon.js +846 -0
- package/dist/process-daemon/process-daemon.js.map +1 -0
- package/dist/process-daemon/process-manager-client.d.ts +123 -0
- package/dist/process-daemon/process-manager-client.d.ts.map +1 -0
- package/dist/process-daemon/process-manager-client.js +329 -0
- package/dist/process-daemon/process-manager-client.js.map +1 -0
- package/dist/process-daemon/process-manager-interface.d.ts +61 -0
- package/dist/process-daemon/process-manager-interface.d.ts.map +1 -0
- package/dist/process-daemon/process-manager-interface.js +8 -0
- package/dist/process-daemon/process-manager-interface.js.map +1 -0
- package/dist/process-daemon/test-daemon.d.ts +12 -0
- package/dist/process-daemon/test-daemon.d.ts.map +1 -0
- package/dist/process-daemon/test-daemon.js +81 -0
- package/dist/process-daemon/test-daemon.js.map +1 -0
- package/dist/process-daemon/types.d.ts +97 -0
- package/dist/process-daemon/types.d.ts.map +1 -0
- package/dist/process-daemon/types.js +8 -0
- package/dist/process-daemon/types.js.map +1 -0
- package/dist/routes/analysis.routes.d.ts +13 -0
- package/dist/routes/analysis.routes.d.ts.map +1 -0
- package/dist/routes/analysis.routes.js +520 -0
- package/dist/routes/analysis.routes.js.map +1 -0
- package/dist/routes/config.routes.d.ts +4 -0
- package/dist/routes/config.routes.d.ts.map +1 -0
- package/dist/routes/config.routes.js +27 -0
- package/dist/routes/config.routes.js.map +1 -0
- package/dist/routes/conversation.routes.d.ts +43 -0
- package/dist/routes/conversation.routes.d.ts.map +1 -0
- package/dist/routes/conversation.routes.js +79 -0
- package/dist/routes/conversation.routes.js.map +1 -0
- package/dist/routes/filesystem.routes.d.ts +4 -0
- package/dist/routes/filesystem.routes.d.ts.map +1 -0
- package/dist/routes/filesystem.routes.js +86 -0
- package/dist/routes/filesystem.routes.js.map +1 -0
- package/dist/routes/insights.routes.d.ts +17 -0
- package/dist/routes/insights.routes.d.ts.map +1 -0
- package/dist/routes/insights.routes.js +633 -0
- package/dist/routes/insights.routes.js.map +1 -0
- package/dist/routes/lattice.routes.d.ts +10 -0
- package/dist/routes/lattice.routes.d.ts.map +1 -0
- package/dist/routes/lattice.routes.js +123 -0
- package/dist/routes/lattice.routes.js.map +1 -0
- package/dist/routes/license.routes.d.ts +3 -0
- package/dist/routes/license.routes.d.ts.map +1 -0
- package/dist/routes/license.routes.js +95 -0
- package/dist/routes/license.routes.js.map +1 -0
- package/dist/routes/log.routes.d.ts +3 -0
- package/dist/routes/log.routes.d.ts.map +1 -0
- package/dist/routes/log.routes.js +184 -0
- package/dist/routes/log.routes.js.map +1 -0
- package/dist/routes/pending-question.routes.d.ts +9 -0
- package/dist/routes/pending-question.routes.d.ts.map +1 -0
- package/dist/routes/pending-question.routes.js +162 -0
- package/dist/routes/pending-question.routes.js.map +1 -0
- package/dist/routes/permission.routes.d.ts +18 -0
- package/dist/routes/permission.routes.d.ts.map +1 -0
- package/dist/routes/permission.routes.js +370 -0
- package/dist/routes/permission.routes.js.map +1 -0
- package/dist/routes/process-events.routes.d.ts +9 -0
- package/dist/routes/process-events.routes.d.ts.map +1 -0
- package/dist/routes/process-events.routes.js +141 -0
- package/dist/routes/process-events.routes.js.map +1 -0
- package/dist/routes/prototype.routes.d.ts +9 -0
- package/dist/routes/prototype.routes.d.ts.map +1 -0
- package/dist/routes/prototype.routes.js +757 -0
- package/dist/routes/prototype.routes.js.map +1 -0
- package/dist/routes/question.routes.d.ts +8 -0
- package/dist/routes/question.routes.d.ts.map +1 -0
- package/dist/routes/question.routes.js +83 -0
- package/dist/routes/question.routes.js.map +1 -0
- package/dist/routes/session-control.routes.d.ts +29 -0
- package/dist/routes/session-control.routes.d.ts.map +1 -0
- package/dist/routes/session-control.routes.js +455 -0
- package/dist/routes/session-control.routes.js.map +1 -0
- package/dist/routes/session-lifecycle.routes.d.ts +21 -0
- package/dist/routes/session-lifecycle.routes.d.ts.map +1 -0
- package/dist/routes/session-lifecycle.routes.js +256 -0
- package/dist/routes/session-lifecycle.routes.js.map +1 -0
- package/dist/routes/session-query.routes.d.ts +25 -0
- package/dist/routes/session-query.routes.d.ts.map +1 -0
- package/dist/routes/session-query.routes.js +363 -0
- package/dist/routes/session-query.routes.js.map +1 -0
- package/dist/routes/session-stream.routes.d.ts +21 -0
- package/dist/routes/session-stream.routes.d.ts.map +1 -0
- package/dist/routes/session-stream.routes.js +235 -0
- package/dist/routes/session-stream.routes.js.map +1 -0
- package/dist/routes/streaming.routes.d.ts +4 -0
- package/dist/routes/streaming.routes.d.ts.map +1 -0
- package/dist/routes/streaming.routes.js +33 -0
- package/dist/routes/streaming.routes.js.map +1 -0
- package/dist/routes/system.routes.d.ts +7 -0
- package/dist/routes/system.routes.d.ts.map +1 -0
- package/dist/routes/system.routes.js +214 -0
- package/dist/routes/system.routes.js.map +1 -0
- package/dist/routes/walkthrough.routes.d.ts +19 -0
- package/dist/routes/walkthrough.routes.d.ts.map +1 -0
- package/dist/routes/walkthrough.routes.js +688 -0
- package/dist/routes/walkthrough.routes.js.map +1 -0
- package/dist/routes/working-directories.routes.d.ts +4 -0
- package/dist/routes/working-directories.routes.d.ts.map +1 -0
- package/dist/routes/working-directories.routes.js +25 -0
- package/dist/routes/working-directories.routes.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/services/ToolMetricsService.d.ts +53 -0
- package/dist/services/ToolMetricsService.d.ts.map +1 -0
- package/dist/services/ToolMetricsService.js +230 -0
- package/dist/services/ToolMetricsService.js.map +1 -0
- package/dist/services/claude-router-service.d.ts +19 -0
- package/dist/services/claude-router-service.d.ts.map +1 -0
- package/dist/services/claude-router-service.js +160 -0
- package/dist/services/claude-router-service.js.map +1 -0
- package/dist/services/commands-service.d.ts +20 -0
- package/dist/services/commands-service.d.ts.map +1 -0
- package/dist/services/commands-service.js +115 -0
- package/dist/services/commands-service.js.map +1 -0
- package/dist/services/connection-debug-logger.d.ts +85 -0
- package/dist/services/connection-debug-logger.d.ts.map +1 -0
- package/dist/services/connection-debug-logger.js +221 -0
- package/dist/services/connection-debug-logger.js.map +1 -0
- package/dist/services/debug-log.d.ts +6 -0
- package/dist/services/debug-log.d.ts.map +1 -0
- package/dist/services/debug-log.js +27 -0
- package/dist/services/debug-log.js.map +1 -0
- package/dist/services/gemini-service.d.ts +35 -0
- package/dist/services/gemini-service.d.ts.map +1 -0
- package/dist/services/gemini-service.js +256 -0
- package/dist/services/gemini-service.js.map +1 -0
- package/dist/services/infrastructure/config-service.d.ts +79 -0
- package/dist/services/infrastructure/config-service.d.ts.map +1 -0
- package/dist/services/infrastructure/config-service.js +431 -0
- package/dist/services/infrastructure/config-service.js.map +1 -0
- package/dist/services/infrastructure/cost-tracker.d.ts +112 -0
- package/dist/services/infrastructure/cost-tracker.d.ts.map +1 -0
- package/dist/services/infrastructure/cost-tracker.js +423 -0
- package/dist/services/infrastructure/cost-tracker.js.map +1 -0
- package/dist/services/infrastructure/file-system-service.d.ts +61 -0
- package/dist/services/infrastructure/file-system-service.d.ts.map +1 -0
- package/dist/services/infrastructure/file-system-service.js +348 -0
- package/dist/services/infrastructure/file-system-service.js.map +1 -0
- package/dist/services/infrastructure/log-formatter.d.ts +5 -0
- package/dist/services/infrastructure/log-formatter.d.ts.map +1 -0
- package/dist/services/infrastructure/log-formatter.js +77 -0
- package/dist/services/infrastructure/log-formatter.js.map +1 -0
- package/dist/services/infrastructure/log-stream-buffer.d.ts +11 -0
- package/dist/services/infrastructure/log-stream-buffer.d.ts.map +1 -0
- package/dist/services/infrastructure/log-stream-buffer.js +36 -0
- package/dist/services/infrastructure/log-stream-buffer.js.map +1 -0
- package/dist/services/infrastructure/logger.d.ts +71 -0
- package/dist/services/infrastructure/logger.d.ts.map +1 -0
- package/dist/services/infrastructure/logger.js +215 -0
- package/dist/services/infrastructure/logger.js.map +1 -0
- package/dist/services/infrastructure/service-registry.d.ts +86 -0
- package/dist/services/infrastructure/service-registry.d.ts.map +1 -0
- package/dist/services/infrastructure/service-registry.js +162 -0
- package/dist/services/infrastructure/service-registry.js.map +1 -0
- package/dist/services/infrastructure/stream-manager.d.ts +87 -0
- package/dist/services/infrastructure/stream-manager.d.ts.map +1 -0
- package/dist/services/infrastructure/stream-manager.js +436 -0
- package/dist/services/infrastructure/stream-manager.js.map +1 -0
- package/dist/services/infrastructure/timing.d.ts +72 -0
- package/dist/services/infrastructure/timing.d.ts.map +1 -0
- package/dist/services/infrastructure/timing.js +115 -0
- package/dist/services/infrastructure/timing.js.map +1 -0
- package/dist/services/insights/anthropic-service.d.ts +224 -0
- package/dist/services/insights/anthropic-service.d.ts.map +1 -0
- package/dist/services/insights/anthropic-service.js +1062 -0
- package/dist/services/insights/anthropic-service.js.map +1 -0
- package/dist/services/insights/insight-audit-repository.d.ts +119 -0
- package/dist/services/insights/insight-audit-repository.d.ts.map +1 -0
- package/dist/services/insights/insight-audit-repository.js +242 -0
- package/dist/services/insights/insight-audit-repository.js.map +1 -0
- package/dist/services/insights/insight-queue.d.ts +99 -0
- package/dist/services/insights/insight-queue.d.ts.map +1 -0
- package/dist/services/insights/insight-queue.js +277 -0
- package/dist/services/insights/insight-queue.js.map +1 -0
- package/dist/services/insights/insights-computer.d.ts +132 -0
- package/dist/services/insights/insights-computer.d.ts.map +1 -0
- package/dist/services/insights/insights-computer.js +936 -0
- package/dist/services/insights/insights-computer.js.map +1 -0
- package/dist/services/insights/insights-coordinator.d.ts +165 -0
- package/dist/services/insights/insights-coordinator.d.ts.map +1 -0
- package/dist/services/insights/insights-coordinator.js +1678 -0
- package/dist/services/insights/insights-coordinator.js.map +1 -0
- package/dist/services/insights/insights-event-log.d.ts +196 -0
- package/dist/services/insights/insights-event-log.d.ts.map +1 -0
- package/dist/services/insights/insights-event-log.js +319 -0
- package/dist/services/insights/insights-event-log.js.map +1 -0
- package/dist/services/lattice-service.d.ts +77 -0
- package/dist/services/lattice-service.d.ts.map +1 -0
- package/dist/services/lattice-service.js +195 -0
- package/dist/services/lattice-service.js.map +1 -0
- package/dist/services/license-service.d.ts +69 -0
- package/dist/services/license-service.d.ts.map +1 -0
- package/dist/services/license-service.js +330 -0
- package/dist/services/license-service.js.map +1 -0
- package/dist/services/mcp-config-generator.d.ts +32 -0
- package/dist/services/mcp-config-generator.d.ts.map +1 -0
- package/dist/services/mcp-config-generator.js +126 -0
- package/dist/services/mcp-config-generator.js.map +1 -0
- package/dist/services/message-filter.d.ts +22 -0
- package/dist/services/message-filter.d.ts.map +1 -0
- package/dist/services/message-filter.js +57 -0
- package/dist/services/message-filter.js.map +1 -0
- package/dist/services/notification-service.d.ts +45 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +184 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/pending-question-service.d.ts +97 -0
- package/dist/services/pending-question-service.d.ts.map +1 -0
- package/dist/services/pending-question-service.js +223 -0
- package/dist/services/pending-question-service.js.map +1 -0
- package/dist/services/permission-event-log.d.ts +136 -0
- package/dist/services/permission-event-log.d.ts.map +1 -0
- package/dist/services/permission-event-log.js +252 -0
- package/dist/services/permission-event-log.js.map +1 -0
- package/dist/services/permission-pattern-matcher.d.ts +82 -0
- package/dist/services/permission-pattern-matcher.d.ts.map +1 -0
- package/dist/services/permission-pattern-matcher.js +294 -0
- package/dist/services/permission-pattern-matcher.js.map +1 -0
- package/dist/services/permission-tracker.d.ts +67 -0
- package/dist/services/permission-tracker.d.ts.map +1 -0
- package/dist/services/permission-tracker.js +162 -0
- package/dist/services/permission-tracker.js.map +1 -0
- package/dist/services/process/claude-process-manager.d.ts +142 -0
- package/dist/services/process/claude-process-manager.d.ts.map +1 -0
- package/dist/services/process/claude-process-manager.js +1218 -0
- package/dist/services/process/claude-process-manager.js.map +1 -0
- package/dist/services/process/conversation-status-manager.d.ts +110 -0
- package/dist/services/process/conversation-status-manager.d.ts.map +1 -0
- package/dist/services/process/conversation-status-manager.js +349 -0
- package/dist/services/process/conversation-status-manager.js.map +1 -0
- package/dist/services/process/json-lines-parser.d.ts +19 -0
- package/dist/services/process/json-lines-parser.d.ts.map +1 -0
- package/dist/services/process/json-lines-parser.js +59 -0
- package/dist/services/process/json-lines-parser.js.map +1 -0
- package/dist/services/process/process-event-log.d.ts +263 -0
- package/dist/services/process/process-event-log.d.ts.map +1 -0
- package/dist/services/process/process-event-log.js +509 -0
- package/dist/services/process/process-event-log.js.map +1 -0
- package/dist/services/process/process-manager-factory.d.ts +109 -0
- package/dist/services/process/process-manager-factory.d.ts.map +1 -0
- package/dist/services/process/process-manager-factory.js +338 -0
- package/dist/services/process/process-manager-factory.js.map +1 -0
- package/dist/services/question-tracker.d.ts +51 -0
- package/dist/services/question-tracker.d.ts.map +1 -0
- package/dist/services/question-tracker.js +111 -0
- package/dist/services/question-tracker.js.map +1 -0
- package/dist/services/sessions/claude-history-reader.d.ts +139 -0
- package/dist/services/sessions/claude-history-reader.d.ts.map +1 -0
- package/dist/services/sessions/claude-history-reader.js +864 -0
- package/dist/services/sessions/claude-history-reader.js.map +1 -0
- package/dist/services/sessions/conversation-cache.d.ts +98 -0
- package/dist/services/sessions/conversation-cache.d.ts.map +1 -0
- package/dist/services/sessions/conversation-cache.js +329 -0
- package/dist/services/sessions/conversation-cache.js.map +1 -0
- package/dist/services/sessions/session-activity-watcher.d.ts +67 -0
- package/dist/services/sessions/session-activity-watcher.d.ts.map +1 -0
- package/dist/services/sessions/session-activity-watcher.js +236 -0
- package/dist/services/sessions/session-activity-watcher.js.map +1 -0
- package/dist/services/sessions/session-analysis-service.d.ts +72 -0
- package/dist/services/sessions/session-analysis-service.d.ts.map +1 -0
- package/dist/services/sessions/session-analysis-service.js +373 -0
- package/dist/services/sessions/session-analysis-service.js.map +1 -0
- package/dist/services/sessions/session-branch-service.d.ts +76 -0
- package/dist/services/sessions/session-branch-service.d.ts.map +1 -0
- package/dist/services/sessions/session-branch-service.js +355 -0
- package/dist/services/sessions/session-branch-service.js.map +1 -0
- package/dist/services/sessions/session-info-service.d.ts +455 -0
- package/dist/services/sessions/session-info-service.d.ts.map +1 -0
- package/dist/services/sessions/session-info-service.js +1640 -0
- package/dist/services/sessions/session-info-service.js.map +1 -0
- package/dist/services/sessions/session-marks-repository.d.ts +78 -0
- package/dist/services/sessions/session-marks-repository.d.ts.map +1 -0
- package/dist/services/sessions/session-marks-repository.js +263 -0
- package/dist/services/sessions/session-marks-repository.js.map +1 -0
- package/dist/services/sessions/session-marks-service.d.ts +137 -0
- package/dist/services/sessions/session-marks-service.d.ts.map +1 -0
- package/dist/services/sessions/session-marks-service.js +562 -0
- package/dist/services/sessions/session-marks-service.js.map +1 -0
- package/dist/services/sessions/session-review-service.d.ts +98 -0
- package/dist/services/sessions/session-review-service.d.ts.map +1 -0
- package/dist/services/sessions/session-review-service.js +629 -0
- package/dist/services/sessions/session-review-service.js.map +1 -0
- package/dist/services/sessions/turn-capture-service.d.ts +83 -0
- package/dist/services/sessions/turn-capture-service.d.ts.map +1 -0
- package/dist/services/sessions/turn-capture-service.js +477 -0
- package/dist/services/sessions/turn-capture-service.js.map +1 -0
- package/dist/services/sessions/turn-repository.d.ts +48 -0
- package/dist/services/sessions/turn-repository.d.ts.map +1 -0
- package/dist/services/sessions/turn-repository.js +103 -0
- package/dist/services/sessions/turn-repository.js.map +1 -0
- package/dist/services/walkthrough-service.d.ts +226 -0
- package/dist/services/walkthrough-service.d.ts.map +1 -0
- package/dist/services/walkthrough-service.js +1112 -0
- package/dist/services/walkthrough-service.js.map +1 -0
- package/dist/services/walkthrough-skill-prompt.d.ts +34 -0
- package/dist/services/walkthrough-skill-prompt.d.ts.map +1 -0
- package/dist/services/walkthrough-skill-prompt.js +313 -0
- package/dist/services/walkthrough-skill-prompt.js.map +1 -0
- package/dist/services/web-push-service.d.ts +48 -0
- package/dist/services/web-push-service.d.ts.map +1 -0
- package/dist/services/web-push-service.js +186 -0
- package/dist/services/web-push-service.js.map +1 -0
- package/dist/services/working-directories-service.d.ts +19 -0
- package/dist/services/working-directories-service.d.ts.map +1 -0
- package/dist/services/working-directories-service.js +103 -0
- package/dist/services/working-directories-service.js.map +1 -0
- package/dist/types/config.d.ts +122 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +21 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/express.d.ts +5 -0
- package/dist/types/express.d.ts.map +1 -0
- package/dist/types/express.js +2 -0
- package/dist/types/express.js.map +1 -0
- package/dist/types/index.d.ts +400 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +41 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/insights.d.ts +176 -0
- package/dist/types/insights.d.ts.map +1 -0
- package/dist/types/insights.js +23 -0
- package/dist/types/insights.js.map +1 -0
- package/dist/types/license.d.ts +70 -0
- package/dist/types/license.d.ts.map +1 -0
- package/dist/types/license.js +5 -0
- package/dist/types/license.js.map +1 -0
- package/dist/types/router-config.d.ts +13 -0
- package/dist/types/router-config.d.ts.map +1 -0
- package/dist/types/router-config.js +2 -0
- package/dist/types/router-config.js.map +1 -0
- package/dist/utils/constants.d.ts +26 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +28 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/machine-id.d.ts +7 -0
- package/dist/utils/machine-id.d.ts.map +1 -0
- package/dist/utils/machine-id.js +76 -0
- package/dist/utils/machine-id.js.map +1 -0
- package/dist/utils/server-startup.d.ts +11 -0
- package/dist/utils/server-startup.d.ts.map +1 -0
- package/dist/utils/server-startup.js +9 -0
- package/dist/utils/server-startup.js.map +1 -0
- package/dist/utils/update-check.d.ts +13 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/dist/utils/update-check.js +90 -0
- package/dist/utils/update-check.js.map +1 -0
- package/dist/web/assets/ArchivedCardPrototype-S9ifiasa.js +5 -0
- package/dist/web/assets/BannerGallery-B__rJV6F.js +1 -0
- package/dist/web/assets/BannerPrototype-DBKP9Uiu.js +52 -0
- package/dist/web/assets/CodeHikeExperiment-B8jjWAFy.js +15 -0
- package/dist/web/assets/ContextTooltipVariations-DzklAFam.js +1 -0
- package/dist/web/assets/FontShowcasePrototype-KIMEWeP2.js +13 -0
- package/dist/web/assets/GeometricGallery-DddlWhHK.js +1 -0
- package/dist/web/assets/HistoryWalkthroughPrototype-DeniRRdw.js +18 -0
- package/dist/web/assets/InlineWalkthroughPrototype-Csd5r_Hk.js +1 -0
- package/dist/web/assets/MarkButtonPrototype-CxhxE0RP.js +1 -0
- package/dist/web/assets/MenuStylesPrototype-D7neA6YM.js +1 -0
- package/dist/web/assets/MomentCardVariations-2GT7GyFn.js +1 -0
- package/dist/web/assets/MomentHeaderVariations-DhGEw4XC.js +1 -0
- package/dist/web/assets/NarrativeWalkthroughDemo-B5C566fu.js +389 -0
- package/dist/web/assets/OutcomeVariations-BrZfsVcs.js +1 -0
- package/dist/web/assets/PermissionPatternPickerPrototype-CBOhe2Me.js +1 -0
- package/dist/web/assets/PermissionPrototype-BcF-a5an.js +1 -0
- package/dist/web/assets/PipelineGallery-BJhyM0rx.js +1 -0
- package/dist/web/assets/ScopeHeaderPrototype-GD1HNfaO.js +1 -0
- package/dist/web/assets/ScopeHeaderStylesPrototype-aa4uNJJ1.js +1 -0
- package/dist/web/assets/ScrollycodingPrototype-CKW1bf72.js +70 -0
- package/dist/web/assets/SectionHeaderVariations-DM8vUwfj.js +1 -0
- package/dist/web/assets/SemanticGallery-CtQEo7St.js +1 -0
- package/dist/web/assets/SessionCardPrototype-CgHCIMHe.js +1 -0
- package/dist/web/assets/SessionSidebarVariations-DMQL3Azj.js +3 -0
- package/dist/web/assets/SessionStartPrototype-Cwsv01Rr.js +1 -0
- package/dist/web/assets/SmartMenuPrototype-Br37Qbs_.js +1 -0
- package/dist/web/assets/StyleGallery-rZgrploB.js +1 -0
- package/dist/web/assets/TimelineCardPrototype-lzPc5mhe.js +19 -0
- package/dist/web/assets/ToolbarPrototype-Dm4BNZra.js +1 -0
- package/dist/web/assets/TooltipExperiment-Dy8QzTIP.js +13 -0
- package/dist/web/assets/WalkthroughCTAPrototype-uHoovujd.js +1 -0
- package/dist/web/assets/WalkthroughHeaderVariations-Do7Di1g1.js +1 -0
- package/dist/web/assets/WalkthroughShowcase-sGmRoPoM.js +112 -0
- package/dist/web/assets/arrow-right-D46Nx1mC.js +1 -0
- package/dist/web/assets/brain-BXIZKtOZ.js +1 -0
- package/dist/web/assets/grid-3x3-Cb81B62m.js +1 -0
- package/dist/web/assets/main-B1fyog77.js +321 -0
- package/dist/web/assets/main-C2PK2Klg.css +1 -0
- package/dist/web/assets/semantic-variations-Bd-W7ea2.js +1 -0
- package/dist/web/assets/target-Cf92wDTW.js +1 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/favicon.svg +22 -0
- package/dist/web/icon-192x192.png +0 -0
- package/dist/web/icon-512x512.png +0 -0
- package/dist/web/index.html +45 -0
- package/dist/web/manifest.json +61 -0
- package/package.json +192 -0
- package/scripts/postinstall.js +60 -0
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Review Service
|
|
3
|
+
*
|
|
4
|
+
* Generates post-session analysis with narrative summary and recommendations
|
|
5
|
+
* for Claude improvements (CLAUDE.md, hooks, skills).
|
|
6
|
+
*
|
|
7
|
+
* Uses turns (session history) as the primary data source.
|
|
8
|
+
*/
|
|
9
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import * as os from 'os';
|
|
13
|
+
import { execSync } from 'child_process';
|
|
14
|
+
import { createLogger } from '../infrastructure/logger.js';
|
|
15
|
+
import { SessionAnalysisService } from './session-analysis-service.js';
|
|
16
|
+
import { SessionInfoService } from '../sessions/session-info-service.js';
|
|
17
|
+
import { TurnCaptureService } from '../sessions/turn-capture-service.js';
|
|
18
|
+
import { ClaudeHistoryReader } from '../sessions/claude-history-reader.js';
|
|
19
|
+
import { SessionMarksService } from './session-marks-service.js';
|
|
20
|
+
const logger = createLogger('SessionReviewService');
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Service
|
|
23
|
+
// =============================================================================
|
|
24
|
+
export class SessionReviewService {
|
|
25
|
+
static instance;
|
|
26
|
+
client = null;
|
|
27
|
+
analysisService;
|
|
28
|
+
sessionInfoService;
|
|
29
|
+
turnCaptureService;
|
|
30
|
+
historyReader;
|
|
31
|
+
sessionMarksService;
|
|
32
|
+
constructor() {
|
|
33
|
+
this.analysisService = SessionAnalysisService.getInstance();
|
|
34
|
+
this.sessionInfoService = SessionInfoService.getInstance();
|
|
35
|
+
this.turnCaptureService = TurnCaptureService.getInstance();
|
|
36
|
+
this.historyReader = new ClaudeHistoryReader();
|
|
37
|
+
this.sessionMarksService = SessionMarksService.getInstance();
|
|
38
|
+
}
|
|
39
|
+
static getInstance() {
|
|
40
|
+
if (!SessionReviewService.instance) {
|
|
41
|
+
SessionReviewService.instance = new SessionReviewService();
|
|
42
|
+
}
|
|
43
|
+
return SessionReviewService.instance;
|
|
44
|
+
}
|
|
45
|
+
getClient() {
|
|
46
|
+
if (!this.client) {
|
|
47
|
+
const configPath = path.join(os.homedir(), '.claudia', 'config.json');
|
|
48
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
49
|
+
const apiKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;
|
|
50
|
+
if (!apiKey) {
|
|
51
|
+
throw new Error('Anthropic API key not configured. Set it in Settings or via ANTHROPIC_API_KEY environment variable.');
|
|
52
|
+
}
|
|
53
|
+
this.client = new Anthropic({ apiKey });
|
|
54
|
+
}
|
|
55
|
+
return this.client;
|
|
56
|
+
}
|
|
57
|
+
async analyzeForReview(sessionIdInput) {
|
|
58
|
+
logger.info('Starting session review analysis', { sessionId: sessionIdInput.slice(0, 8) });
|
|
59
|
+
// Initialize services
|
|
60
|
+
await this.analysisService.initialize();
|
|
61
|
+
await this.sessionInfoService.initialize();
|
|
62
|
+
// Resolve short session ID to full ID (needed for FK constraints)
|
|
63
|
+
const sessionId = await this.sessionInfoService.resolveSessionId(sessionIdInput) || sessionIdInput;
|
|
64
|
+
if (sessionId !== sessionIdInput) {
|
|
65
|
+
logger.debug('Resolved session ID', { from: sessionIdInput, to: sessionId.slice(0, 8) });
|
|
66
|
+
}
|
|
67
|
+
// Get metrics from analysis service
|
|
68
|
+
const metricsResult = await this.analysisService.extractMetrics(sessionId);
|
|
69
|
+
const metrics = metricsResult.metrics || {};
|
|
70
|
+
// Get context from cached insights (for mission/project info)
|
|
71
|
+
const cachedInsights = await this.sessionInfoService.getInsights(sessionId);
|
|
72
|
+
const context = cachedInsights?.context || null;
|
|
73
|
+
// Get turns (session history) - primary source for narrative
|
|
74
|
+
const turns = await this.turnCaptureService.getTurnsForSession(sessionId);
|
|
75
|
+
// Get user-flagged session marks (v2 - supports multiple mark types with turn context)
|
|
76
|
+
const sessionMarks = await this.sessionMarksService.getMarksForSession(sessionId);
|
|
77
|
+
// Get project path and recent commits to avoid stale recommendations
|
|
78
|
+
const projectPath = await this.historyReader.getConversationWorkingDirectory(sessionId);
|
|
79
|
+
const recentCommits = projectPath ? this.getRecentCommits(projectPath, 24) : [];
|
|
80
|
+
// Get file changes for richer context
|
|
81
|
+
const fileChanges = this.sessionInfoService.getFileChanges(sessionId);
|
|
82
|
+
const fileChangeSummaries = this.summarizeFileChanges(fileChanges);
|
|
83
|
+
logger.info('Session review data retrieved', {
|
|
84
|
+
sessionId: sessionId.slice(0, 8),
|
|
85
|
+
turnCount: turns.length,
|
|
86
|
+
sessionMarkCount: sessionMarks.length,
|
|
87
|
+
markTypes: [...new Set(sessionMarks.map(m => m.markType))],
|
|
88
|
+
projectPath,
|
|
89
|
+
recentCommitCount: recentCommits.length,
|
|
90
|
+
fileChangeCount: fileChanges.length,
|
|
91
|
+
filesChanged: fileChangeSummaries.length,
|
|
92
|
+
});
|
|
93
|
+
// Run LLM analysis using turns as primary source
|
|
94
|
+
const llmResult = await this.runLLMAnalysis({
|
|
95
|
+
context,
|
|
96
|
+
turns,
|
|
97
|
+
metrics,
|
|
98
|
+
sessionMarks,
|
|
99
|
+
recentCommits,
|
|
100
|
+
fileChangeSummaries,
|
|
101
|
+
});
|
|
102
|
+
// Format duration - metrics come from extractMetrics which returns camelCase
|
|
103
|
+
const metricsAny = metrics;
|
|
104
|
+
const durationMin = metricsAny.durationMinutes || 0;
|
|
105
|
+
return {
|
|
106
|
+
summary: llmResult.summary,
|
|
107
|
+
groupedEvents: llmResult.groupedEvents,
|
|
108
|
+
metrics: {
|
|
109
|
+
duration: `${durationMin} min`,
|
|
110
|
+
messages: metricsAny.messageCount || 0,
|
|
111
|
+
toolUses: metricsAny.toolUseCount || 0,
|
|
112
|
+
errors: metricsAny.errorCount || 0,
|
|
113
|
+
filesEdited: metricsAny.fileEditCount || 0,
|
|
114
|
+
},
|
|
115
|
+
recommendations: llmResult.recommendations.map((rec, i) => ({
|
|
116
|
+
...rec,
|
|
117
|
+
id: `rec-${sessionId.slice(0, 8)}-${i}`,
|
|
118
|
+
priorOccurrences: 0, // TODO: Check DB for prior similar recommendations
|
|
119
|
+
})),
|
|
120
|
+
rootCauses: llmResult.rootCauses || [],
|
|
121
|
+
claudeAnalysis: llmResult.claudeAnalysis || {
|
|
122
|
+
strengths: [],
|
|
123
|
+
weaknesses: [],
|
|
124
|
+
keyInsight: 'Analysis unavailable',
|
|
125
|
+
},
|
|
126
|
+
userFeedback: llmResult.userFeedback || {
|
|
127
|
+
effective: [],
|
|
128
|
+
opportunities: [],
|
|
129
|
+
keyInsight: 'Analysis unavailable',
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
async runLLMAnalysis(data) {
|
|
134
|
+
const client = this.getClient();
|
|
135
|
+
// Log input data for debugging
|
|
136
|
+
logger.info('Session review input data', {
|
|
137
|
+
context: data.context,
|
|
138
|
+
turnCount: data.turns.length,
|
|
139
|
+
metrics: data.metrics,
|
|
140
|
+
sessionMarkCount: data.sessionMarks?.length || 0,
|
|
141
|
+
markTypes: data.sessionMarks ? [...new Set(data.sessionMarks.map(m => m.markType))] : [],
|
|
142
|
+
});
|
|
143
|
+
// Build context from insights
|
|
144
|
+
const mission = data.context?.mission || 'Unknown goal';
|
|
145
|
+
const project = data.context?.project || 'Unknown project';
|
|
146
|
+
// Format turns as the session narrative
|
|
147
|
+
const turnsStr = data.turns.length > 0
|
|
148
|
+
? data.turns.map(t => `[${t.icon} ${t.tag}] ${t.headline}\n → ${t.actions.join(' → ')}`).join('\n\n')
|
|
149
|
+
: 'No turns captured';
|
|
150
|
+
// Format session marks using the mark type registry
|
|
151
|
+
const marksSection = data.sessionMarks && data.sessionMarks.length > 0
|
|
152
|
+
? this.sessionMarksService.formatMarksForAnalysis(data.sessionMarks)
|
|
153
|
+
: '';
|
|
154
|
+
// Format file changes for richer context
|
|
155
|
+
const fileChangesSection = this.formatFileChangesForPrompt(data.fileChangeSummaries || []);
|
|
156
|
+
// Identify friction/pivot/debug turns that need extra context
|
|
157
|
+
const frictionTurns = data.turns.filter(t => ['friction', 'pivot', 'debug', 'fix'].includes(t.tag) || t.incomplete);
|
|
158
|
+
const frictionContext = this.formatFrictionTurnsForPrompt(frictionTurns);
|
|
159
|
+
const prompt = `You are analyzing a completed coding session from multiple perspectives. The user directed a Claude Code session - giving instructions and making decisions while Claude executed.
|
|
160
|
+
|
|
161
|
+
## Session Context
|
|
162
|
+
- **Project:** ${project}
|
|
163
|
+
- **Mission:** ${mission}
|
|
164
|
+
|
|
165
|
+
## What Happened (Turn by Turn)
|
|
166
|
+
Each entry = one user request + Claude's response:
|
|
167
|
+
|
|
168
|
+
${turnsStr}
|
|
169
|
+
|
|
170
|
+
## Stats
|
|
171
|
+
- ${data.metrics.messageCount || '?'} messages, ${data.metrics.toolUseCount || '?'} tool uses, ${data.metrics.errorCount || '?'} errors
|
|
172
|
+
- ${data.metrics.fileEditCount || '?'} files modified over ${data.metrics.durationMinutes || '?'} minutes
|
|
173
|
+
${fileChangesSection}${frictionContext}${marksSection ? `
|
|
174
|
+
${marksSection}
|
|
175
|
+
|
|
176
|
+
**IMPORTANT**: The user took deliberate action to flag these moments. Strongly prioritize addressing what these marks represent in your analysis. Each mark type has a specific analysis goal listed above - follow those goals.
|
|
177
|
+
` : ''}${data.recentCommits && data.recentCommits.length > 0 ? `
|
|
178
|
+
## 🔧 Recent Commits (Last 24 Hours)
|
|
179
|
+
These commits were made to this project recently (possibly by other sessions or manual work). **DO NOT recommend something that was already fixed by one of these commits.**
|
|
180
|
+
|
|
181
|
+
${data.recentCommits.map(c => `- ${c}`).join('\n')}
|
|
182
|
+
|
|
183
|
+
**CRITICAL**: If a commit message suggests a fix was made (e.g., "fix loading spinner", "separate button states"), DO NOT recommend that same fix. The problem has already been resolved.
|
|
184
|
+
` : ''}
|
|
185
|
+
## Your Analysis
|
|
186
|
+
|
|
187
|
+
Analyze this session from four perspectives:
|
|
188
|
+
|
|
189
|
+
### 1. Summary
|
|
190
|
+
Help the user remember what this session was about:
|
|
191
|
+
- **goal**: What you set out to do (plain language, 1 sentence)
|
|
192
|
+
- **outcome**: What actually happened - key pivots, final result. (1-2 sentences)
|
|
193
|
+
|
|
194
|
+
### 2. Narrative Bullets (groupedEvents)
|
|
195
|
+
Organize into three categories:
|
|
196
|
+
|
|
197
|
+
1. **friction** - Obstacles hit while doing the work: getting blocked, debugging something unexpected, fighting tooling, wrong assumptions that cost time. Things that slowed progress in THIS session.
|
|
198
|
+
2. **built** - Tangible results that persist: code written, features added, configs changed. NOT exploration, NOT temporary work.
|
|
199
|
+
3. **learned** - Significant new understanding gained: how something actually works, why an approach failed, codebase patterns discovered. Must be new information from this session.
|
|
200
|
+
|
|
201
|
+
**Categories can be EMPTY.** Don't force things. Keep bullets SHORT but meaningful (under 12 words).
|
|
202
|
+
|
|
203
|
+
### 3. Recommendations (0-3)
|
|
204
|
+
Generate recommendations that will help in FUTURE sessions, not just describe what you learned here.
|
|
205
|
+
|
|
206
|
+
**THE ANTI-HINDSIGHT TEST**: For each potential recommendation, ask yourself:
|
|
207
|
+
"Would this advice be useful to someone BEFORE they knew what went wrong?"
|
|
208
|
+
|
|
209
|
+
❌ BAD (hindsight-driven, fails the test):
|
|
210
|
+
- "Check React Router's v7_startTransition flag" — only know to check this because we found it
|
|
211
|
+
- "Verify font imports are present" — only know to check because that was the bug
|
|
212
|
+
- "Add validation for X" — where X is the specific thing that broke
|
|
213
|
+
|
|
214
|
+
✅ GOOD (forward-looking, passes the test):
|
|
215
|
+
- "When debugging UI freezes, add RAF heartbeat logging early to distinguish main thread blocking from scheduler delays"
|
|
216
|
+
- "For CSS issues where styles appear correct, check Network tab for failed resource loads before debugging specifics"
|
|
217
|
+
- "Before integrating with external APIs, create a minimal proof-of-concept to validate key operations work"
|
|
218
|
+
|
|
219
|
+
**THE RECURRENCE TEST**: Also ask: "How likely is this exact situation to happen again?"
|
|
220
|
+
- One-off typos, config mistakes, or specific bugs you just fixed → NO RECOMMENDATION (it's done)
|
|
221
|
+
- Patterns that affect a class of similar work → MAYBE worth recommending
|
|
222
|
+
- Workflow gaps that will affect many future sessions → WORTH recommending
|
|
223
|
+
|
|
224
|
+
**If the session was routine work with no real friction, return an empty array.** Most debugging sessions don't need recommendations — the fix IS the outcome.
|
|
225
|
+
|
|
226
|
+
### 4. Root Causes (ONLY if there were significant problems)
|
|
227
|
+
**Return an empty array unless the session had real friction worth analyzing.**
|
|
228
|
+
If there were meaningful problems, dig deeper for each:
|
|
229
|
+
- What visibly went wrong? (surface)
|
|
230
|
+
- What's the fundamental issue underneath? (root)
|
|
231
|
+
- How could this have been prevented? (preventable)
|
|
232
|
+
|
|
233
|
+
Smooth sessions = empty rootCauses array. Don't manufacture problems.
|
|
234
|
+
|
|
235
|
+
### 5. Claude's Performance (ONLY if there's valuable insight)
|
|
236
|
+
**Return empty arrays and generic keyInsight if Claude performed fine.**
|
|
237
|
+
Only populate if there's something genuinely useful to communicate:
|
|
238
|
+
- **strengths**: Notable things Claude did well (empty if nothing stood out)
|
|
239
|
+
- **weaknesses**: Where Claude could have done better (empty if fine)
|
|
240
|
+
- **keyInsight**: One concrete thing to do differently (or "No notable issues" if session went well)
|
|
241
|
+
|
|
242
|
+
Don't force criticism. A smooth session can have empty strengths/weaknesses.
|
|
243
|
+
|
|
244
|
+
### 6. User Effectiveness (ONLY if there's valuable insight)
|
|
245
|
+
**Return empty arrays and generic keyInsight if the user directed well.**
|
|
246
|
+
Only populate if there's something genuinely useful to communicate:
|
|
247
|
+
- **effective**: What worked well in their approach (empty if nothing notable)
|
|
248
|
+
- **opportunities**: Where different behavior might have helped (empty if fine)
|
|
249
|
+
- **keyInsight**: One tip for the user (or "Session directed well" if nothing to add)
|
|
250
|
+
|
|
251
|
+
Don't force feedback. A well-directed session can have empty arrays.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
Return JSON:
|
|
256
|
+
{
|
|
257
|
+
"summary": {
|
|
258
|
+
"goal": "...",
|
|
259
|
+
"outcome": "..."
|
|
260
|
+
},
|
|
261
|
+
"groupedEvents": {
|
|
262
|
+
"friction": [{ "text": "...", "icon": "💥" }, ...],
|
|
263
|
+
"built": [{ "text": "...", "icon": "🔧" }, ...],
|
|
264
|
+
"learned": [{ "text": "...", "icon": "💡" }, ...]
|
|
265
|
+
},
|
|
266
|
+
"recommendations": [
|
|
267
|
+
{
|
|
268
|
+
"observation": "What you noticed in the session",
|
|
269
|
+
"suggestion": "What to do about it",
|
|
270
|
+
"why": "How this helps"
|
|
271
|
+
}
|
|
272
|
+
],
|
|
273
|
+
"rootCauses": [
|
|
274
|
+
{
|
|
275
|
+
"surface": "What went wrong",
|
|
276
|
+
"root": "The fundamental issue",
|
|
277
|
+
"preventable": "How to avoid this"
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"claudeAnalysis": {
|
|
281
|
+
"strengths": ["..."],
|
|
282
|
+
"weaknesses": ["..."],
|
|
283
|
+
"keyInsight": "One thing Claude should do differently"
|
|
284
|
+
},
|
|
285
|
+
"userFeedback": {
|
|
286
|
+
"effective": ["..."],
|
|
287
|
+
"opportunities": ["..."],
|
|
288
|
+
"keyInsight": "One tip for the user"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
Icons for groupedEvents: 💥⚠️🤔🐛🚧 (friction), 🔧✏️🎨🚀📊⚙️ (built), 💡✅🎯⚖️🏁 (learned)
|
|
293
|
+
|
|
294
|
+
Be specific and reference actual events from the session. Empty arrays are fine if a section doesn't apply.`;
|
|
295
|
+
// Log the full prompt
|
|
296
|
+
logger.info('Session review prompt', { prompt });
|
|
297
|
+
try {
|
|
298
|
+
const response = await client.messages.create({
|
|
299
|
+
model: 'claude-opus-4-5-20251101', // Use Opus for high-quality synthesis
|
|
300
|
+
max_tokens: 2000,
|
|
301
|
+
temperature: 0.3,
|
|
302
|
+
messages: [{ role: 'user', content: prompt }],
|
|
303
|
+
});
|
|
304
|
+
const text = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
305
|
+
// Log the raw response
|
|
306
|
+
logger.info('Session review LLM response', { text });
|
|
307
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
308
|
+
if (!jsonMatch) {
|
|
309
|
+
logger.error('No JSON in LLM response', { text: text.slice(0, 200) });
|
|
310
|
+
return this.getDefaultAnalysis();
|
|
311
|
+
}
|
|
312
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
313
|
+
// Log the parsed result
|
|
314
|
+
logger.info('Session review parsed result', { parsed });
|
|
315
|
+
// Filter out recommendations that are already addressed by recent commits
|
|
316
|
+
if (parsed.recommendations?.length > 0 && data.recentCommits && data.recentCommits.length > 0) {
|
|
317
|
+
parsed.recommendations = await this.filterAlreadyAddressedRecommendations(parsed.recommendations, data.recentCommits);
|
|
318
|
+
}
|
|
319
|
+
return parsed;
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
logger.error('LLM analysis failed', { error: err instanceof Error ? err.message : String(err) });
|
|
323
|
+
return this.getDefaultAnalysis();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
getDefaultAnalysis() {
|
|
327
|
+
return {
|
|
328
|
+
summary: {
|
|
329
|
+
goal: 'Unknown',
|
|
330
|
+
outcome: 'Session analysis unavailable',
|
|
331
|
+
},
|
|
332
|
+
groupedEvents: {
|
|
333
|
+
friction: [],
|
|
334
|
+
built: [],
|
|
335
|
+
learned: [{ text: 'Session analysis unavailable', icon: '❓' }],
|
|
336
|
+
},
|
|
337
|
+
recommendations: [],
|
|
338
|
+
rootCauses: [],
|
|
339
|
+
claudeAnalysis: {
|
|
340
|
+
strengths: [],
|
|
341
|
+
weaknesses: [],
|
|
342
|
+
keyInsight: 'Analysis unavailable',
|
|
343
|
+
},
|
|
344
|
+
userFeedback: {
|
|
345
|
+
effective: [],
|
|
346
|
+
opportunities: [],
|
|
347
|
+
keyInsight: 'Analysis unavailable',
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Use Haiku to filter out recommendations that appear to already be addressed
|
|
353
|
+
* by recent commits. This catches cases where Opus didn't make the connection
|
|
354
|
+
* between a general commit message and a specific recommendation.
|
|
355
|
+
*/
|
|
356
|
+
async filterAlreadyAddressedRecommendations(recommendations, recentCommits) {
|
|
357
|
+
if (recommendations.length === 0)
|
|
358
|
+
return recommendations;
|
|
359
|
+
logger.info('Running recommendation deduplication', {
|
|
360
|
+
recommendationCount: recommendations.length,
|
|
361
|
+
commitCount: recentCommits.length,
|
|
362
|
+
});
|
|
363
|
+
const client = this.getClient();
|
|
364
|
+
const prompt = `Check if any of these recommendations have ALREADY been addressed by the recent commits.
|
|
365
|
+
|
|
366
|
+
## Recent Commits
|
|
367
|
+
${recentCommits.map(c => `- ${c}`).join('\n')}
|
|
368
|
+
|
|
369
|
+
## Recommendations to Check
|
|
370
|
+
${recommendations.map((r, i) => `${i + 1}. ${r.suggestion}`).join('\n')}
|
|
371
|
+
|
|
372
|
+
For each recommendation, determine if a commit appears to address the same issue.
|
|
373
|
+
Be generous in matching - if a commit mentions "validation" and a recommendation mentions "add validation for X", that counts as addressed.
|
|
374
|
+
|
|
375
|
+
Return JSON array of indices (0-based) that should be KEPT (not yet addressed):
|
|
376
|
+
{"keep": [0, 2]}
|
|
377
|
+
|
|
378
|
+
If all should be kept: {"keep": [0, 1, ...]}
|
|
379
|
+
If none should be kept: {"keep": []}
|
|
380
|
+
|
|
381
|
+
JSON only:`;
|
|
382
|
+
try {
|
|
383
|
+
const response = await client.messages.create({
|
|
384
|
+
model: 'claude-haiku-4-5-20251001',
|
|
385
|
+
max_tokens: 200,
|
|
386
|
+
temperature: 0,
|
|
387
|
+
messages: [{ role: 'user', content: prompt }],
|
|
388
|
+
});
|
|
389
|
+
const text = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
390
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
391
|
+
if (!jsonMatch) {
|
|
392
|
+
logger.warn('Could not parse deduplication response, keeping all recommendations');
|
|
393
|
+
return recommendations;
|
|
394
|
+
}
|
|
395
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
396
|
+
const keepIndices = new Set(parsed.keep);
|
|
397
|
+
const filtered = recommendations.filter((_, i) => keepIndices.has(i));
|
|
398
|
+
const removedCount = recommendations.length - filtered.length;
|
|
399
|
+
logger.info('Recommendation deduplication complete', {
|
|
400
|
+
original: recommendations.length,
|
|
401
|
+
kept: filtered.length,
|
|
402
|
+
removed: removedCount,
|
|
403
|
+
keepIndices: parsed.keep,
|
|
404
|
+
});
|
|
405
|
+
return filtered;
|
|
406
|
+
}
|
|
407
|
+
catch (err) {
|
|
408
|
+
logger.warn('Recommendation deduplication failed, keeping all', {
|
|
409
|
+
error: err instanceof Error ? err.message : String(err),
|
|
410
|
+
});
|
|
411
|
+
return recommendations;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get recent git commits from the project directory.
|
|
416
|
+
* This helps the LLM avoid recommending fixes that were already made.
|
|
417
|
+
*/
|
|
418
|
+
getRecentCommits(projectPath, hours = 24) {
|
|
419
|
+
try {
|
|
420
|
+
// Check if it's a git repo
|
|
421
|
+
execSync('git rev-parse --git-dir', { cwd: projectPath, stdio: 'pipe' });
|
|
422
|
+
// Get commits from the last N hours with their messages and changed files
|
|
423
|
+
const since = `${hours} hours ago`;
|
|
424
|
+
const output = execSync(`git log --since="${since}" --pretty=format:"%h %s" --name-only 2>/dev/null | head -100`, { cwd: projectPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
425
|
+
if (!output.trim()) {
|
|
426
|
+
return [];
|
|
427
|
+
}
|
|
428
|
+
// Parse output into readable format
|
|
429
|
+
const lines = output.trim().split('\n');
|
|
430
|
+
const commits = [];
|
|
431
|
+
let currentCommit = '';
|
|
432
|
+
let currentFiles = [];
|
|
433
|
+
for (const line of lines) {
|
|
434
|
+
if (line.match(/^[a-f0-9]{7,} /)) {
|
|
435
|
+
// New commit line
|
|
436
|
+
if (currentCommit) {
|
|
437
|
+
commits.push(`${currentCommit}${currentFiles.length > 0 ? ` (files: ${currentFiles.slice(0, 5).join(', ')}${currentFiles.length > 5 ? '...' : ''})` : ''}`);
|
|
438
|
+
}
|
|
439
|
+
currentCommit = line;
|
|
440
|
+
currentFiles = [];
|
|
441
|
+
}
|
|
442
|
+
else if (line.trim()) {
|
|
443
|
+
// File path
|
|
444
|
+
currentFiles.push(line.trim());
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// Don't forget the last commit
|
|
448
|
+
if (currentCommit) {
|
|
449
|
+
commits.push(`${currentCommit}${currentFiles.length > 0 ? ` (files: ${currentFiles.slice(0, 5).join(', ')}${currentFiles.length > 5 ? '...' : ''})` : ''}`);
|
|
450
|
+
}
|
|
451
|
+
logger.info('Retrieved recent commits', { projectPath, commitCount: commits.length });
|
|
452
|
+
return commits;
|
|
453
|
+
}
|
|
454
|
+
catch (err) {
|
|
455
|
+
logger.debug('Could not get recent commits (not a git repo or git error)', {
|
|
456
|
+
projectPath,
|
|
457
|
+
error: err instanceof Error ? err.message : String(err)
|
|
458
|
+
});
|
|
459
|
+
return [];
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Summarize file changes into a digestible format for the LLM.
|
|
464
|
+
* Groups by file and computes line statistics.
|
|
465
|
+
*/
|
|
466
|
+
summarizeFileChanges(changes) {
|
|
467
|
+
const byFile = new Map();
|
|
468
|
+
for (const change of changes) {
|
|
469
|
+
const existing = byFile.get(change.filePath) || [];
|
|
470
|
+
existing.push(change);
|
|
471
|
+
byFile.set(change.filePath, existing);
|
|
472
|
+
}
|
|
473
|
+
const summaries = [];
|
|
474
|
+
for (const [filePath, fileChanges] of byFile) {
|
|
475
|
+
// Compute relative path
|
|
476
|
+
const relativePath = filePath
|
|
477
|
+
.replace(/^\/home\/jason\/(claudia|cui-custom)\//, '')
|
|
478
|
+
.replace(/^\/home\/jason\//, '~/');
|
|
479
|
+
// Collect turn numbers
|
|
480
|
+
const turnNumbers = [...new Set(fileChanges.map(c => c.turnNumber))].sort((a, b) => a - b);
|
|
481
|
+
// Count edits vs writes
|
|
482
|
+
const editCount = fileChanges.filter(c => c.toolName === 'Edit').length;
|
|
483
|
+
const writeCount = fileChanges.filter(c => c.toolName === 'Write').length;
|
|
484
|
+
// Compute line stats
|
|
485
|
+
let linesAdded = 0;
|
|
486
|
+
let linesRemoved = 0;
|
|
487
|
+
for (const change of fileChanges) {
|
|
488
|
+
const newLines = (change.newString.match(/\n/g) || []).length + 1;
|
|
489
|
+
const oldLines = change.oldString ? (change.oldString.match(/\n/g) || []).length + 1 : 0;
|
|
490
|
+
if (change.toolName === 'Write') {
|
|
491
|
+
linesAdded += newLines;
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
linesAdded += Math.max(0, newLines - oldLines);
|
|
495
|
+
linesRemoved += Math.max(0, oldLines - newLines);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
// Generate a brief change summary from the first meaningful edit
|
|
499
|
+
const changeSummary = this.generateChangeSummary(fileChanges);
|
|
500
|
+
summaries.push({
|
|
501
|
+
relativePath,
|
|
502
|
+
turnNumbers,
|
|
503
|
+
editCount,
|
|
504
|
+
writeCount,
|
|
505
|
+
linesAdded,
|
|
506
|
+
linesRemoved,
|
|
507
|
+
changeSummary,
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
// Sort by first turn number
|
|
511
|
+
return summaries.sort((a, b) => a.turnNumbers[0] - b.turnNumbers[0]);
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Generate a brief summary of what changed in a file.
|
|
515
|
+
* Looks at the actual code changes to describe the modification.
|
|
516
|
+
*/
|
|
517
|
+
generateChangeSummary(changes) {
|
|
518
|
+
// Find first non-trivial edit
|
|
519
|
+
const meaningfulChange = changes.find(c => {
|
|
520
|
+
if (c.toolName === 'Write')
|
|
521
|
+
return true;
|
|
522
|
+
// Skip tiny whitespace-only edits
|
|
523
|
+
const oldTrimmed = (c.oldString || '').trim();
|
|
524
|
+
const newTrimmed = c.newString.trim();
|
|
525
|
+
return oldTrimmed !== newTrimmed && newTrimmed.length > 10;
|
|
526
|
+
});
|
|
527
|
+
if (!meaningfulChange) {
|
|
528
|
+
return 'minor changes';
|
|
529
|
+
}
|
|
530
|
+
if (meaningfulChange.toolName === 'Write') {
|
|
531
|
+
// New file - describe what it contains
|
|
532
|
+
const content = meaningfulChange.newString;
|
|
533
|
+
if (content.includes('export function'))
|
|
534
|
+
return 'new function/utility';
|
|
535
|
+
if (content.includes('export class'))
|
|
536
|
+
return 'new class';
|
|
537
|
+
if (content.includes('export const') || content.includes('export interface'))
|
|
538
|
+
return 'new types/constants';
|
|
539
|
+
if (content.includes('describe(') || content.includes('test('))
|
|
540
|
+
return 'new tests';
|
|
541
|
+
return 'new file';
|
|
542
|
+
}
|
|
543
|
+
// Edit - try to describe the change
|
|
544
|
+
const oldStr = meaningfulChange.oldString || '';
|
|
545
|
+
const newStr = meaningfulChange.newString;
|
|
546
|
+
// Look for common patterns
|
|
547
|
+
if (!oldStr && newStr.includes('import'))
|
|
548
|
+
return 'added imports';
|
|
549
|
+
if (newStr.includes('try {') && !oldStr.includes('try {'))
|
|
550
|
+
return 'added error handling';
|
|
551
|
+
if (newStr.includes('await') && !oldStr.includes('await'))
|
|
552
|
+
return 'made async';
|
|
553
|
+
if (newStr.includes('if (') && !oldStr.includes('if ('))
|
|
554
|
+
return 'added conditionals';
|
|
555
|
+
if (newStr.length > oldStr.length * 1.5)
|
|
556
|
+
return 'expanded logic';
|
|
557
|
+
if (newStr.length < oldStr.length * 0.7)
|
|
558
|
+
return 'simplified/removed code';
|
|
559
|
+
// Check for function/variable renames
|
|
560
|
+
const oldFuncs = oldStr.match(/function\s+(\w+)/g) || [];
|
|
561
|
+
const newFuncs = newStr.match(/function\s+(\w+)/g) || [];
|
|
562
|
+
if (oldFuncs.length > 0 && newFuncs.length > 0 && oldFuncs[0] !== newFuncs[0]) {
|
|
563
|
+
return 'renamed function';
|
|
564
|
+
}
|
|
565
|
+
return 'modified';
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Format file changes section for the prompt.
|
|
569
|
+
*/
|
|
570
|
+
formatFileChangesForPrompt(summaries) {
|
|
571
|
+
if (summaries.length === 0) {
|
|
572
|
+
return '';
|
|
573
|
+
}
|
|
574
|
+
const lines = [
|
|
575
|
+
'',
|
|
576
|
+
'## Code Changes Made',
|
|
577
|
+
'These are the actual files that were modified during the session:',
|
|
578
|
+
'',
|
|
579
|
+
];
|
|
580
|
+
for (const summary of summaries) {
|
|
581
|
+
const stats = [];
|
|
582
|
+
if (summary.editCount > 0)
|
|
583
|
+
stats.push(`${summary.editCount} edit${summary.editCount > 1 ? 's' : ''}`);
|
|
584
|
+
if (summary.writeCount > 0)
|
|
585
|
+
stats.push(summary.writeCount > 1 ? `${summary.writeCount} writes` : 'new file');
|
|
586
|
+
const lineStats = [];
|
|
587
|
+
if (summary.linesAdded > 0)
|
|
588
|
+
lineStats.push(`+${summary.linesAdded}`);
|
|
589
|
+
if (summary.linesRemoved > 0)
|
|
590
|
+
lineStats.push(`-${summary.linesRemoved}`);
|
|
591
|
+
const turnInfo = summary.turnNumbers.length === 1
|
|
592
|
+
? `turn ${summary.turnNumbers[0]}`
|
|
593
|
+
: `turns ${summary.turnNumbers[0]}-${summary.turnNumbers[summary.turnNumbers.length - 1]}`;
|
|
594
|
+
lines.push(`- **${summary.relativePath}** (${stats.join(', ')}, ${lineStats.join('/')}, ${turnInfo})`);
|
|
595
|
+
lines.push(` → ${summary.changeSummary}`);
|
|
596
|
+
}
|
|
597
|
+
lines.push('');
|
|
598
|
+
return lines.join('\n');
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Format friction/pivot/debug turns with extra context for better recommendations.
|
|
602
|
+
*/
|
|
603
|
+
formatFrictionTurnsForPrompt(frictionTurns) {
|
|
604
|
+
if (frictionTurns.length === 0) {
|
|
605
|
+
return '';
|
|
606
|
+
}
|
|
607
|
+
const lines = [
|
|
608
|
+
'',
|
|
609
|
+
'## Notable Moments (friction, pivots, fixes)',
|
|
610
|
+
'These turns involved challenges or course corrections - important context for recommendations:',
|
|
611
|
+
'',
|
|
612
|
+
];
|
|
613
|
+
for (const turn of frictionTurns) {
|
|
614
|
+
const status = turn.incomplete ? ' (INTERRUPTED)' : '';
|
|
615
|
+
const reason = turn.terminationReason !== 'normal_completion'
|
|
616
|
+
? ` [${turn.terminationReason.replace('_', ' ')}]`
|
|
617
|
+
: '';
|
|
618
|
+
lines.push(`**Turn ${turn.turnNumber} [${turn.tag}]${status}${reason}:** ${turn.headline}`);
|
|
619
|
+
// Include more detail from actions
|
|
620
|
+
if (turn.actions.length > 0) {
|
|
621
|
+
const actionStr = turn.actions.slice(0, 5).map(a => ` - ${a}`).join('\n');
|
|
622
|
+
lines.push(actionStr);
|
|
623
|
+
}
|
|
624
|
+
lines.push('');
|
|
625
|
+
}
|
|
626
|
+
return lines.join('\n');
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
//# sourceMappingURL=session-review-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-review-service.js","sourceRoot":"","sources":["../../../src/services/sessions/session-review-service.ts"],"names":[],"mappings":"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"}
|