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,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Query Routes - Read-only session queries.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from conversation.routes.ts for maintainability.
|
|
5
|
+
*
|
|
6
|
+
* ROUTES:
|
|
7
|
+
* GET / - List all conversations with pagination
|
|
8
|
+
* GET /active - Get active session IDs (lightweight)
|
|
9
|
+
* GET /:sessionId - Get conversation details and messages
|
|
10
|
+
*/
|
|
11
|
+
import { Router } from 'express';
|
|
12
|
+
import { LatticeError, asClaudeSessionId, } from '../types/index.js';
|
|
13
|
+
import { createLogger } from '../services/infrastructure/logger.js';
|
|
14
|
+
import { createTimer } from '../services/infrastructure/timing.js';
|
|
15
|
+
import { connectionDebugLogger } from '../services/connection-debug-logger.js';
|
|
16
|
+
import { SessionBranchService } from '../services/sessions/session-branch-service.js';
|
|
17
|
+
const logger = createLogger('SessionQueryRoutes');
|
|
18
|
+
export function createSessionQueryRoutes(deps) {
|
|
19
|
+
const { historyReader, conversationStatusManager, sessionInfoService, toolMetricsService, insightsComputer } = deps;
|
|
20
|
+
const router = Router();
|
|
21
|
+
// List conversations
|
|
22
|
+
router.get('/', async (req, res, next) => {
|
|
23
|
+
const requestId = req.requestId;
|
|
24
|
+
const timer = createTimer('listConversations', logger);
|
|
25
|
+
logger.debug('List conversations request', {
|
|
26
|
+
requestId,
|
|
27
|
+
query: req.query
|
|
28
|
+
});
|
|
29
|
+
try {
|
|
30
|
+
const result = await historyReader.listConversations(req.query);
|
|
31
|
+
timer.mark('listConversations');
|
|
32
|
+
const isArchiveView = req.query.archived === true;
|
|
33
|
+
// Update status for each conversation based on active streams
|
|
34
|
+
const conversationsWithStatus = result.conversations.map(conversation => {
|
|
35
|
+
const claudeSessionId = asClaudeSessionId(conversation.sessionId);
|
|
36
|
+
const status = conversationStatusManager.getConversationStatus(claudeSessionId);
|
|
37
|
+
const baseConversation = {
|
|
38
|
+
...conversation,
|
|
39
|
+
status
|
|
40
|
+
};
|
|
41
|
+
// Add toolMetrics if available
|
|
42
|
+
const metrics = toolMetricsService.getMetrics(conversation.sessionId);
|
|
43
|
+
if (metrics) {
|
|
44
|
+
baseConversation.toolMetrics = metrics;
|
|
45
|
+
}
|
|
46
|
+
// Add streamingId if conversation is ongoing
|
|
47
|
+
if (status === 'ongoing') {
|
|
48
|
+
const streamingId = conversationStatusManager.getStreamingId(claudeSessionId);
|
|
49
|
+
if (streamingId) {
|
|
50
|
+
connectionDebugLogger.log('SessionQueryRoutes', 'list-ongoing-session', {
|
|
51
|
+
sessionId: conversation.sessionId.slice(0, 8),
|
|
52
|
+
streamingId: streamingId.slice(0, 8),
|
|
53
|
+
});
|
|
54
|
+
return { ...baseConversation, streamingId };
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Status says ongoing but no streamingId - this shouldn't happen
|
|
58
|
+
connectionDebugLogger.log('SessionQueryRoutes', 'list-ongoing-no-streaming-id', {
|
|
59
|
+
sessionId: conversation.sessionId.slice(0, 8),
|
|
60
|
+
trackedSessions: conversationStatusManager.getActiveSessionIds().map(s => s.slice(0, 8)),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return baseConversation;
|
|
65
|
+
});
|
|
66
|
+
timer.mark('statusMapping');
|
|
67
|
+
// Get all active sessions and add optimistic conversations for those not in history
|
|
68
|
+
// But only when NOT viewing archive (active sessions shouldn't appear in archive view)
|
|
69
|
+
const existingSessionIds = new Set(conversationsWithStatus.map(c => c.sessionId));
|
|
70
|
+
const conversationsNotInHistory = isArchiveView
|
|
71
|
+
? []
|
|
72
|
+
: conversationStatusManager.getConversationsNotInHistory(existingSessionIds);
|
|
73
|
+
// Combine history conversations with active ones not in history
|
|
74
|
+
const allConversations = [...conversationsWithStatus, ...conversationsNotInHistory];
|
|
75
|
+
// Ensure session info entries exist for all conversations
|
|
76
|
+
try {
|
|
77
|
+
await sessionInfoService.syncMissingSessions(allConversations.map(c => c.sessionId));
|
|
78
|
+
}
|
|
79
|
+
catch (syncError) {
|
|
80
|
+
logger.debug('Failed to sync session info', {
|
|
81
|
+
requestId,
|
|
82
|
+
error: syncError instanceof Error ? syncError.message : String(syncError)
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
timer.mark('syncMissingSessions');
|
|
86
|
+
// Fetch cached insights for all sessions in one DB call
|
|
87
|
+
const sessionIds = allConversations.map(c => c.sessionId);
|
|
88
|
+
let cachedInsights = new Map();
|
|
89
|
+
try {
|
|
90
|
+
cachedInsights = await insightsComputer.getCachedInsightsForSessions(sessionIds);
|
|
91
|
+
// If we have sessions without cached insights, compute them in background
|
|
92
|
+
const missingSessions = sessionIds.filter(id => !cachedInsights.has(id));
|
|
93
|
+
if (missingSessions.length > 0) {
|
|
94
|
+
logger.debug('Computing missing insights in background', { count: missingSessions.length });
|
|
95
|
+
// Fire and forget - don't block the response
|
|
96
|
+
insightsComputer.computeMissingInsights(missingSessions, 3).catch(err => logger.debug('Background insights computation failed', { error: err }));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (insightsError) {
|
|
100
|
+
logger.debug('Failed to fetch cached insights', {
|
|
101
|
+
requestId,
|
|
102
|
+
error: insightsError instanceof Error ? insightsError.message : String(insightsError)
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
timer.mark('getCachedInsights');
|
|
106
|
+
// Attach insights to each conversation
|
|
107
|
+
const conversationsWithInsights = allConversations.map(conv => ({
|
|
108
|
+
...conv,
|
|
109
|
+
insights: cachedInsights.get(conv.sessionId) || undefined
|
|
110
|
+
}));
|
|
111
|
+
// Log timing with context
|
|
112
|
+
timer.end({
|
|
113
|
+
requestId,
|
|
114
|
+
conversationCount: conversationsWithInsights.length,
|
|
115
|
+
historyConversations: conversationsWithStatus.length,
|
|
116
|
+
conversationsNotInHistory: conversationsNotInHistory.length,
|
|
117
|
+
totalFound: result.total,
|
|
118
|
+
activeConversations: conversationsWithInsights.filter(c => c.status === 'ongoing').length,
|
|
119
|
+
withInsights: cachedInsights.size,
|
|
120
|
+
archived: isArchiveView,
|
|
121
|
+
});
|
|
122
|
+
res.json({
|
|
123
|
+
conversations: conversationsWithInsights,
|
|
124
|
+
total: result.total + conversationsNotInHistory.length // Update total to include conversations not in history
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
logger.debug('List conversations failed', {
|
|
129
|
+
requestId,
|
|
130
|
+
error: error instanceof Error ? error.message : String(error)
|
|
131
|
+
});
|
|
132
|
+
next(error);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// Get active sessions only (lightweight endpoint for checking current activity)
|
|
136
|
+
// Returns just the currently running sessions without pagination or history lookup
|
|
137
|
+
router.get('/active', async (req, res, next) => {
|
|
138
|
+
const requestId = req.requestId;
|
|
139
|
+
logger.debug('Get active conversations request', { requestId });
|
|
140
|
+
try {
|
|
141
|
+
// Get active session data directly from status manager (fast, in-memory)
|
|
142
|
+
const activeSessionIds = conversationStatusManager.getActiveSessionIds();
|
|
143
|
+
if (activeSessionIds.length === 0) {
|
|
144
|
+
logger.debug('No active sessions', { requestId });
|
|
145
|
+
res.json({ conversations: [], total: 0 });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Build response with minimal data needed for active session display
|
|
149
|
+
const activeConversations = activeSessionIds.map(sessionId => {
|
|
150
|
+
const streamingId = conversationStatusManager.getStreamingId(sessionId);
|
|
151
|
+
const context = conversationStatusManager.getConversationContext(sessionId);
|
|
152
|
+
return {
|
|
153
|
+
sessionId,
|
|
154
|
+
streamingId,
|
|
155
|
+
status: 'ongoing',
|
|
156
|
+
projectPath: context?.workingDirectory,
|
|
157
|
+
initialPrompt: context?.initialPrompt?.slice(0, 200), // Truncate for response size
|
|
158
|
+
startedAt: context?.timestamp,
|
|
159
|
+
model: context?.model,
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
logger.debug('Active conversations retrieved', {
|
|
163
|
+
requestId,
|
|
164
|
+
count: activeConversations.length
|
|
165
|
+
});
|
|
166
|
+
res.json({
|
|
167
|
+
conversations: activeConversations,
|
|
168
|
+
total: activeConversations.length
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
logger.debug('Get active conversations failed', {
|
|
173
|
+
requestId,
|
|
174
|
+
error: error instanceof Error ? error.message : String(error)
|
|
175
|
+
});
|
|
176
|
+
next(error);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
// Get conversation status only (lightweight endpoint for navigation)
|
|
180
|
+
// Returns status + streamingId without loading conversation history
|
|
181
|
+
router.get('/:sessionId/status', async (req, res, next) => {
|
|
182
|
+
const requestId = req.requestId;
|
|
183
|
+
const claudeSessionId = asClaudeSessionId(req.params.sessionId);
|
|
184
|
+
logger.debug('Get conversation status request', {
|
|
185
|
+
requestId,
|
|
186
|
+
sessionId: claudeSessionId,
|
|
187
|
+
});
|
|
188
|
+
try {
|
|
189
|
+
const status = conversationStatusManager.getConversationStatus(claudeSessionId);
|
|
190
|
+
const streamingId = conversationStatusManager.getStreamingId(claudeSessionId);
|
|
191
|
+
res.json({
|
|
192
|
+
sessionId: claudeSessionId,
|
|
193
|
+
status,
|
|
194
|
+
streamingId: streamingId ?? null,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
logger.debug('Get conversation status failed', {
|
|
199
|
+
requestId,
|
|
200
|
+
sessionId: claudeSessionId,
|
|
201
|
+
error: error instanceof Error ? error.message : String(error)
|
|
202
|
+
});
|
|
203
|
+
next(error);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
// Get conversation details
|
|
207
|
+
// Supports pagination via query params:
|
|
208
|
+
// ?limit=N - return only the last N messages (default: all)
|
|
209
|
+
// ?before=messageId - return messages before this message ID (for loading older messages)
|
|
210
|
+
router.get('/:sessionId', async (req, res, next) => {
|
|
211
|
+
const requestId = req.requestId;
|
|
212
|
+
const claudeSessionId = asClaudeSessionId(req.params.sessionId);
|
|
213
|
+
const limit = req.query.limit ? parseInt(req.query.limit, 10) : undefined;
|
|
214
|
+
const before = req.query.before;
|
|
215
|
+
const traceId = req.headers['x-trace-id'];
|
|
216
|
+
const timer = createTimer('getConversationDetails', logger);
|
|
217
|
+
const requestStart = Date.now();
|
|
218
|
+
logger.info('Get conversation details request', {
|
|
219
|
+
requestId,
|
|
220
|
+
traceId,
|
|
221
|
+
sessionId: claudeSessionId,
|
|
222
|
+
limit,
|
|
223
|
+
before
|
|
224
|
+
});
|
|
225
|
+
try {
|
|
226
|
+
// First try to fetch from history using fast direct lookup
|
|
227
|
+
try {
|
|
228
|
+
const { messages: allMessages, metadata } = await historyReader.fetchConversationDirect(claudeSessionId);
|
|
229
|
+
timer.mark('fetchDirect');
|
|
230
|
+
// Apply pagination if requested
|
|
231
|
+
let messages = allMessages;
|
|
232
|
+
let hasMore = false;
|
|
233
|
+
let oldestMessageId;
|
|
234
|
+
const totalMessages = allMessages.length;
|
|
235
|
+
if (limit || before) {
|
|
236
|
+
// If 'before' is specified, find that message and take messages before it
|
|
237
|
+
let endIndex = allMessages.length;
|
|
238
|
+
if (before) {
|
|
239
|
+
const beforeIndex = allMessages.findIndex(m => m.uuid === before);
|
|
240
|
+
if (beforeIndex > 0) {
|
|
241
|
+
endIndex = beforeIndex;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Apply limit - take the last N messages up to endIndex
|
|
245
|
+
const effectiveLimit = limit || 50;
|
|
246
|
+
const startIndex = Math.max(0, endIndex - effectiveLimit);
|
|
247
|
+
messages = allMessages.slice(startIndex, endIndex);
|
|
248
|
+
hasMore = startIndex > 0;
|
|
249
|
+
oldestMessageId = messages.length > 0 ? messages[0].uuid : undefined;
|
|
250
|
+
}
|
|
251
|
+
// Get session info (for branch lineage etc)
|
|
252
|
+
const sessionInfo = await sessionInfoService.getSessionInfo(claudeSessionId);
|
|
253
|
+
// Get branch children (sessions that branched from this one)
|
|
254
|
+
const branchChildren = sessionInfoService.getBranchChildren(claudeSessionId);
|
|
255
|
+
// If this is a branched session, compute the branch point message ID
|
|
256
|
+
// This is needed because the UI may not have loaded all messages (pagination)
|
|
257
|
+
let branchPointMessageId;
|
|
258
|
+
if (sessionInfo?.branched_from_session_id && sessionInfo?.branched_at_turn) {
|
|
259
|
+
const branchService = SessionBranchService.getInstance();
|
|
260
|
+
const messageId = await branchService.getBranchPointMessageId(claudeSessionId, sessionInfo.branched_at_turn);
|
|
261
|
+
if (messageId) {
|
|
262
|
+
branchPointMessageId = messageId;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const response = {
|
|
266
|
+
sessionId: claudeSessionId,
|
|
267
|
+
messages,
|
|
268
|
+
summary: metadata.summary,
|
|
269
|
+
projectPath: metadata.projectPath,
|
|
270
|
+
metadata: {
|
|
271
|
+
totalDuration: metadata.totalDuration,
|
|
272
|
+
model: metadata.model
|
|
273
|
+
},
|
|
274
|
+
totalMessages,
|
|
275
|
+
hasMore,
|
|
276
|
+
oldestMessageId,
|
|
277
|
+
sessionInfo,
|
|
278
|
+
branchChildren: branchChildren.length > 0 ? branchChildren : undefined,
|
|
279
|
+
branchPointMessageId,
|
|
280
|
+
};
|
|
281
|
+
// Add toolMetrics if available
|
|
282
|
+
const metrics = toolMetricsService.getMetrics(claudeSessionId);
|
|
283
|
+
if (metrics) {
|
|
284
|
+
response.toolMetrics = metrics;
|
|
285
|
+
}
|
|
286
|
+
// Check if this session is currently active (CUI-spawned with streamingId)
|
|
287
|
+
const activeStreamingId = conversationStatusManager.getStreamingId(claudeSessionId);
|
|
288
|
+
if (activeStreamingId) {
|
|
289
|
+
response.status = 'ongoing';
|
|
290
|
+
response.streamingId = activeStreamingId;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
response.status = 'completed';
|
|
294
|
+
}
|
|
295
|
+
logger.debug('Conversation details retrieved from history', {
|
|
296
|
+
requestId,
|
|
297
|
+
sessionId: claudeSessionId,
|
|
298
|
+
messageCount: response.messages.length,
|
|
299
|
+
totalMessages,
|
|
300
|
+
hasMore,
|
|
301
|
+
hasSummary: !!response.summary,
|
|
302
|
+
projectPath: response.projectPath
|
|
303
|
+
});
|
|
304
|
+
const durationMs = Date.now() - requestStart;
|
|
305
|
+
if (durationMs > 1000) {
|
|
306
|
+
logger.warn('Slow conversation details response', {
|
|
307
|
+
requestId,
|
|
308
|
+
traceId,
|
|
309
|
+
sessionId: claudeSessionId,
|
|
310
|
+
durationMs,
|
|
311
|
+
messageCount: response.messages.length,
|
|
312
|
+
totalMessages,
|
|
313
|
+
hasMore,
|
|
314
|
+
limit,
|
|
315
|
+
before,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
// Log timing for all requests when traceId present (navigation debugging)
|
|
319
|
+
if (traceId) {
|
|
320
|
+
logger.info('Conversation details response', {
|
|
321
|
+
traceId,
|
|
322
|
+
sessionId: claudeSessionId,
|
|
323
|
+
durationMs,
|
|
324
|
+
messageCount: response.messages.length,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
res.json(response);
|
|
328
|
+
}
|
|
329
|
+
catch (historyError) {
|
|
330
|
+
// If not found in history, check if it's an active session
|
|
331
|
+
if (historyError instanceof LatticeError && historyError.code === 'CONVERSATION_NOT_FOUND') {
|
|
332
|
+
const activeDetails = conversationStatusManager.getActiveConversationDetails(claudeSessionId);
|
|
333
|
+
if (activeDetails) {
|
|
334
|
+
logger.debug('Conversation details created for active session', {
|
|
335
|
+
requestId,
|
|
336
|
+
sessionId: claudeSessionId,
|
|
337
|
+
projectPath: activeDetails.projectPath
|
|
338
|
+
});
|
|
339
|
+
res.json(activeDetails);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// Not found in history and not active
|
|
343
|
+
throw historyError;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
// Other errors, re-throw
|
|
348
|
+
throw historyError;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
logger.debug('Get conversation details failed', {
|
|
354
|
+
requestId,
|
|
355
|
+
sessionId: claudeSessionId,
|
|
356
|
+
error: error instanceof Error ? error.message : String(error)
|
|
357
|
+
});
|
|
358
|
+
next(error);
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
return router;
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=session-query.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-query.routes.js","sourceRoot":"","sources":["../../src/routes/session-query.routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Stream Routes - SSE endpoint for real-time activity updates.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from conversation.routes.ts for maintainability.
|
|
5
|
+
* This is the most complex single endpoint - handles real-time updates
|
|
6
|
+
* for activity, insights, turns, and current work.
|
|
7
|
+
*
|
|
8
|
+
* ROUTES:
|
|
9
|
+
* GET /activity-stream - SSE stream for real-time updates
|
|
10
|
+
*/
|
|
11
|
+
import { Router } from 'express';
|
|
12
|
+
import { ClaudeHistoryReader } from '../services/sessions/claude-history-reader.js';
|
|
13
|
+
import { ConversationStatusManager } from '../services/process/conversation-status-manager.js';
|
|
14
|
+
import { InsightsComputer } from '../services/insights/insights-computer.js';
|
|
15
|
+
export interface SessionStreamRoutesDeps {
|
|
16
|
+
historyReader: ClaudeHistoryReader;
|
|
17
|
+
conversationStatusManager: ConversationStatusManager;
|
|
18
|
+
insightsComputer: InsightsComputer;
|
|
19
|
+
}
|
|
20
|
+
export declare function createSessionStreamRoutes(deps: SessionStreamRoutesDeps): Router;
|
|
21
|
+
//# sourceMappingURL=session-stream.routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-stream.routes.d.ts","sourceRoot":"","sources":["../../src/routes/session-stream.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mDAAmD,CAAC;AAI9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAI5E,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,mBAAmB,CAAC;IACnC,yBAAyB,EAAE,yBAAyB,CAAC;IACrD,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CA0O/E"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Stream Routes - SSE endpoint for real-time activity updates.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from conversation.routes.ts for maintainability.
|
|
5
|
+
* This is the most complex single endpoint - handles real-time updates
|
|
6
|
+
* for activity, insights, turns, and current work.
|
|
7
|
+
*
|
|
8
|
+
* ROUTES:
|
|
9
|
+
* GET /activity-stream - SSE stream for real-time updates
|
|
10
|
+
*/
|
|
11
|
+
import { Router } from 'express';
|
|
12
|
+
import { createLogger } from '../services/infrastructure/logger.js';
|
|
13
|
+
import { debugLog } from '../services/debug-log.js';
|
|
14
|
+
import { connectionDebugLogger } from '../services/connection-debug-logger.js';
|
|
15
|
+
const logger = createLogger('SessionStreamRoutes');
|
|
16
|
+
export function createSessionStreamRoutes(deps) {
|
|
17
|
+
const { historyReader, conversationStatusManager, insightsComputer } = deps;
|
|
18
|
+
const router = Router();
|
|
19
|
+
// SSE endpoint for real-time activity updates
|
|
20
|
+
// Clients subscribe to receive instant updates when files change
|
|
21
|
+
router.get('/activity-stream', (req, res) => {
|
|
22
|
+
const requestId = req.requestId;
|
|
23
|
+
logger.debug('Activity stream client connected', { requestId });
|
|
24
|
+
// Configure SSE headers
|
|
25
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
26
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
27
|
+
res.setHeader('X-Accel-Buffering', 'no');
|
|
28
|
+
res.setHeader('Connection', 'keep-alive');
|
|
29
|
+
// Flush headers immediately so client knows connection is established
|
|
30
|
+
res.flushHeaders();
|
|
31
|
+
// Track cleanup state to handle early disconnection
|
|
32
|
+
// These get populated as listeners are added, so cleanup only removes what was added
|
|
33
|
+
let cleanupCalled = false;
|
|
34
|
+
let keepAliveInterval = null;
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
let watcher = null;
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
+
let onActivity = null;
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
let onInsights = null;
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
+
let onTurnCaptured = null;
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
|
+
let onCurrentWork = null;
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
let onCurrentWorkClear = null;
|
|
47
|
+
let onSessionEnded = null;
|
|
48
|
+
// Register cleanup BEFORE any async operations to prevent listener leaks
|
|
49
|
+
const cleanup = () => {
|
|
50
|
+
if (cleanupCalled)
|
|
51
|
+
return;
|
|
52
|
+
cleanupCalled = true;
|
|
53
|
+
logger.debug('Activity stream client disconnected', { requestId });
|
|
54
|
+
if (keepAliveInterval) {
|
|
55
|
+
clearInterval(keepAliveInterval);
|
|
56
|
+
}
|
|
57
|
+
if (watcher) {
|
|
58
|
+
if (onActivity)
|
|
59
|
+
watcher.off('activity', onActivity);
|
|
60
|
+
if (onInsights)
|
|
61
|
+
watcher.off('insights', onInsights);
|
|
62
|
+
if (onTurnCaptured)
|
|
63
|
+
watcher.off('turn-captured', onTurnCaptured);
|
|
64
|
+
if (onCurrentWork)
|
|
65
|
+
watcher.off('current-work', onCurrentWork);
|
|
66
|
+
if (onCurrentWorkClear)
|
|
67
|
+
watcher.off('current-work-clear', onCurrentWorkClear);
|
|
68
|
+
}
|
|
69
|
+
if (onSessionEnded) {
|
|
70
|
+
conversationStatusManager.off('session-ended', onSessionEnded);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
// Register cleanup handler BEFORE any async work
|
|
74
|
+
req.on('close', cleanup);
|
|
75
|
+
// Import and get the watcher
|
|
76
|
+
import('../services/sessions/session-activity-watcher.js').then(async ({ getSessionActivityWatcher }) => {
|
|
77
|
+
// Check if client already disconnected during import
|
|
78
|
+
if (cleanupCalled)
|
|
79
|
+
return;
|
|
80
|
+
watcher = getSessionActivityWatcher();
|
|
81
|
+
// Start the watcher if not already running
|
|
82
|
+
watcher.start();
|
|
83
|
+
// Send initial connection confirmation
|
|
84
|
+
res.write(`data: ${JSON.stringify({ type: 'connected', timestamp: Date.now() })}\n\n`);
|
|
85
|
+
// Seed initial state: send action history for all recent sessions
|
|
86
|
+
try {
|
|
87
|
+
if (cleanupCalled)
|
|
88
|
+
return;
|
|
89
|
+
const { conversations } = await historyReader.listConversations({ limit: 50, sortBy: 'updated', order: 'desc', archived: false });
|
|
90
|
+
const recentSessions = conversations.map(c => c.sessionId);
|
|
91
|
+
for (const sessionId of recentSessions) {
|
|
92
|
+
if (cleanupCalled)
|
|
93
|
+
return;
|
|
94
|
+
try {
|
|
95
|
+
const { messages } = await historyReader.fetchConversationDirect(sessionId);
|
|
96
|
+
if (messages.length === 0)
|
|
97
|
+
continue;
|
|
98
|
+
const recentActions = insightsComputer.extractRecentActions(messages, 14);
|
|
99
|
+
if (recentActions.length > 0) {
|
|
100
|
+
const initialUpdate = {
|
|
101
|
+
type: 'activity',
|
|
102
|
+
sessionId,
|
|
103
|
+
recentActions,
|
|
104
|
+
timestamp: Date.now()
|
|
105
|
+
};
|
|
106
|
+
res.write(`data: ${JSON.stringify(initialUpdate)}\n\n`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
// Skip sessions with errors
|
|
111
|
+
logger.debug('Failed to seed initial state for session', { sessionId: sessionId.slice(0, 8), err });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.warn('Failed to seed initial activity state', { err });
|
|
117
|
+
}
|
|
118
|
+
// Seed insights timestamps so reconnecting clients can detect missed updates
|
|
119
|
+
try {
|
|
120
|
+
if (cleanupCalled)
|
|
121
|
+
return;
|
|
122
|
+
const sessionIds = (await historyReader.listConversations({ limit: 50, sortBy: 'updated', order: 'desc', archived: false })).conversations.map(c => c.sessionId);
|
|
123
|
+
const cachedInsights = await insightsComputer.getCachedInsightsForSessions(sessionIds);
|
|
124
|
+
const insightsTimestamps = {};
|
|
125
|
+
for (const [sessionId, insights] of cachedInsights.entries()) {
|
|
126
|
+
if (insights.computedAt) {
|
|
127
|
+
insightsTimestamps[sessionId] = insights.computedAt;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (Object.keys(insightsTimestamps).length > 0) {
|
|
131
|
+
res.write(`data: ${JSON.stringify({ type: 'insights-status', timestamps: insightsTimestamps })}\n\n`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
logger.warn('Failed to seed insights timestamps', { err });
|
|
136
|
+
}
|
|
137
|
+
// Check again before adding listeners
|
|
138
|
+
if (cleanupCalled)
|
|
139
|
+
return;
|
|
140
|
+
// Forward activity updates to this client
|
|
141
|
+
onActivity = (update) => {
|
|
142
|
+
res.write(`data: ${JSON.stringify({ type: 'activity', ...update })}\n\n`);
|
|
143
|
+
};
|
|
144
|
+
// Forward insights updates to this client
|
|
145
|
+
onInsights = (update) => {
|
|
146
|
+
// Rename 'type' to 'insightType' to avoid collision with SSE event type
|
|
147
|
+
const { type: insightType, ...rest } = update;
|
|
148
|
+
logger.info('[SSE] Sending insights update', {
|
|
149
|
+
traceId: update.traceId,
|
|
150
|
+
sessionId: update.sessionId.slice(0, 8),
|
|
151
|
+
insightType,
|
|
152
|
+
hasIdentityImage: !!update.identityImage
|
|
153
|
+
});
|
|
154
|
+
debugLog('[SSE] Sending insights update to client', {
|
|
155
|
+
traceId: update.traceId,
|
|
156
|
+
sessionId: update.sessionId.slice(0, 8),
|
|
157
|
+
insightType,
|
|
158
|
+
timestamp: update.timestamp
|
|
159
|
+
});
|
|
160
|
+
res.write(`data: ${JSON.stringify({ type: 'insights', insightType, ...rest })}\n\n`);
|
|
161
|
+
};
|
|
162
|
+
watcher.on('activity', onActivity);
|
|
163
|
+
watcher.on('insights', onInsights);
|
|
164
|
+
// Forward session-ended events so clients know immediately when a session stops
|
|
165
|
+
onSessionEnded = (data) => {
|
|
166
|
+
logger.info('[SSE] Sending session-ended', {
|
|
167
|
+
sessionId: data.claudeSessionId.slice(0, 8),
|
|
168
|
+
streamingId: data.streamingId.slice(0, 8)
|
|
169
|
+
});
|
|
170
|
+
connectionDebugLogger.log('ActivityStream', 'session-ended-broadcast', {
|
|
171
|
+
sessionId: data.claudeSessionId.slice(0, 8),
|
|
172
|
+
streamingId: data.streamingId.slice(0, 8),
|
|
173
|
+
});
|
|
174
|
+
res.write(`data: ${JSON.stringify({
|
|
175
|
+
type: 'session-ended',
|
|
176
|
+
sessionId: data.claudeSessionId,
|
|
177
|
+
streamingId: data.streamingId,
|
|
178
|
+
timestamp: Date.now()
|
|
179
|
+
})}\n\n`);
|
|
180
|
+
};
|
|
181
|
+
conversationStatusManager.on('session-ended', onSessionEnded);
|
|
182
|
+
// Forward turn-captured events for real-time history updates
|
|
183
|
+
onTurnCaptured = (data) => {
|
|
184
|
+
logger.info('[SSE] Sending turn-captured', {
|
|
185
|
+
sessionId: data.sessionId.slice(0, 8)
|
|
186
|
+
});
|
|
187
|
+
res.write(`data: ${JSON.stringify({
|
|
188
|
+
type: 'turn-captured',
|
|
189
|
+
sessionId: data.sessionId,
|
|
190
|
+
turn: data.turn,
|
|
191
|
+
timestamp: Date.now()
|
|
192
|
+
})}\n\n`);
|
|
193
|
+
};
|
|
194
|
+
watcher.on('turn-captured', onTurnCaptured);
|
|
195
|
+
// Forward current-work events (what user just asked Claude to do)
|
|
196
|
+
onCurrentWork = (data) => {
|
|
197
|
+
logger.info('[SSE] Sending current-work', {
|
|
198
|
+
sessionId: data.sessionId.slice(0, 8),
|
|
199
|
+
summaryPreview: data.summary.slice(0, 40)
|
|
200
|
+
});
|
|
201
|
+
res.write(`data: ${JSON.stringify({
|
|
202
|
+
type: 'current-work',
|
|
203
|
+
sessionId: data.sessionId,
|
|
204
|
+
summary: data.summary,
|
|
205
|
+
userMessage: data.userMessage,
|
|
206
|
+
startedAt: data.startedAt,
|
|
207
|
+
timestamp: Date.now()
|
|
208
|
+
})}\n\n`);
|
|
209
|
+
};
|
|
210
|
+
watcher.on('current-work', onCurrentWork);
|
|
211
|
+
// Forward current-work-clear events (when Claude finishes)
|
|
212
|
+
onCurrentWorkClear = (data) => {
|
|
213
|
+
logger.info('[SSE] Sending current-work-clear', {
|
|
214
|
+
sessionId: data.sessionId.slice(0, 8)
|
|
215
|
+
});
|
|
216
|
+
res.write(`data: ${JSON.stringify({
|
|
217
|
+
type: 'current-work-clear',
|
|
218
|
+
sessionId: data.sessionId,
|
|
219
|
+
clearedAt: data.clearedAt,
|
|
220
|
+
timestamp: Date.now()
|
|
221
|
+
})}\n\n`);
|
|
222
|
+
};
|
|
223
|
+
watcher.on('current-work-clear', onCurrentWorkClear);
|
|
224
|
+
// Keep-alive ping every 30 seconds
|
|
225
|
+
keepAliveInterval = setInterval(() => {
|
|
226
|
+
res.write(`data: ${JSON.stringify({ type: 'ping', timestamp: Date.now() })}\n\n`);
|
|
227
|
+
}, 30000);
|
|
228
|
+
}).catch((error) => {
|
|
229
|
+
logger.error('Activity stream failed to initialize watcher', { requestId, error });
|
|
230
|
+
res.write(`data: ${JSON.stringify({ type: 'error', error: 'Failed to initialize activity watcher' })}\n\n`);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
return router;
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=session-stream.routes.js.map
|