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,562 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Marks Service
|
|
3
|
+
*
|
|
4
|
+
* Handles user-flagged marks on session content for post-session analysis.
|
|
5
|
+
* Marks can be of different types (friction, skill) and capture full turn context
|
|
6
|
+
* for richer analysis.
|
|
7
|
+
*
|
|
8
|
+
* Key concepts:
|
|
9
|
+
* - Mark: A user flag on a specific message or tool use
|
|
10
|
+
* - Mark type: The intent behind the mark (friction = "this was painful", skill = "this could be automated")
|
|
11
|
+
* - Turn context: Full snapshot of the turn containing the marked content
|
|
12
|
+
*/
|
|
13
|
+
import { createLogger } from '../infrastructure/logger.js';
|
|
14
|
+
import { SessionInfoService } from '../sessions/session-info-service.js';
|
|
15
|
+
import { ClaudeHistoryReader } from '../sessions/claude-history-reader.js';
|
|
16
|
+
import { TurnCaptureService } from '../sessions/turn-capture-service.js';
|
|
17
|
+
const logger = createLogger('SessionMarksService');
|
|
18
|
+
export const MARK_TYPES = {
|
|
19
|
+
friction: {
|
|
20
|
+
label: 'Friction',
|
|
21
|
+
icon: '⚠️',
|
|
22
|
+
description: 'Something about this was frustrating or could be improved',
|
|
23
|
+
promptFraming: (turn) => {
|
|
24
|
+
// Check if user marked their own message (correction/complaint about preceding response)
|
|
25
|
+
if (turn.isUserMessageMarked && turn.precedingAssistantBlocks) {
|
|
26
|
+
return `### Turn ${turn.turnNumber}. [User Correction] — Friction
|
|
27
|
+
**What Claude did in the preceding turn:**
|
|
28
|
+
${formatAssistantBlocks(turn.precedingAssistantBlocks, { fullContent: true })}
|
|
29
|
+
|
|
30
|
+
**User's correction/complaint:** ← MARKED AS FRICTION
|
|
31
|
+
"${turn.userMessage}"`;
|
|
32
|
+
}
|
|
33
|
+
// Standard case: user marked Claude's response or tool use
|
|
34
|
+
const markedBlock = turn.assistantBlocks.find(b => b.isMarked);
|
|
35
|
+
const markedLabel = markedBlock?.toolName
|
|
36
|
+
? `[Tool: ${markedBlock.toolName}]`
|
|
37
|
+
: '[Response]';
|
|
38
|
+
return `### Turn ${turn.turnNumber}. ${markedLabel} — Friction
|
|
39
|
+
**User asked:** ${turn.userMessage}
|
|
40
|
+
|
|
41
|
+
**What happened:**
|
|
42
|
+
${formatAssistantBlocks(turn.assistantBlocks, { showMarkers: true, markerText: 'MARKED AS FRICTION' })}`;
|
|
43
|
+
},
|
|
44
|
+
analysisGoal: `Identify what went wrong or felt awkward. The friction might be Claude's behavior, a workflow issue, missing tooling, or unclear context. Suggest how to prevent this in future sessions.`,
|
|
45
|
+
},
|
|
46
|
+
skill: {
|
|
47
|
+
label: 'Skill candidate',
|
|
48
|
+
icon: '🔧',
|
|
49
|
+
description: 'This pattern could become a reusable skill',
|
|
50
|
+
promptFraming: (turn) => {
|
|
51
|
+
// Check if user marked their own message (the user action that could be a skill)
|
|
52
|
+
if (turn.isUserMessageMarked && turn.precedingAssistantBlocks) {
|
|
53
|
+
return `### Turn ${turn.turnNumber}. [User Action] — Skill Candidate
|
|
54
|
+
**What Claude did in the preceding turn:**
|
|
55
|
+
${formatAssistantBlocks(turn.precedingAssistantBlocks, { fullContent: true })}
|
|
56
|
+
|
|
57
|
+
**User's action/request:** ← MARKED AS SKILL CANDIDATE
|
|
58
|
+
"${turn.userMessage}"`;
|
|
59
|
+
}
|
|
60
|
+
// Standard case: user marked Claude's response or tool use
|
|
61
|
+
return `### Turn ${turn.turnNumber}. Skill Candidate
|
|
62
|
+
**User asked:** ${turn.userMessage}
|
|
63
|
+
|
|
64
|
+
**What Claude did:**
|
|
65
|
+
${formatAssistantBlocks(turn.assistantBlocks, { showMarkers: true, markerText: 'SKILL CANDIDATE' })}`;
|
|
66
|
+
},
|
|
67
|
+
analysisGoal: `Analyze what reusable pattern this represents. What would a Claude Code skill look like that handles this? Consider: What's the trigger? What context does it need? What should the skill do?`,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
// =============================================================================
|
|
71
|
+
// Service
|
|
72
|
+
// =============================================================================
|
|
73
|
+
export class SessionMarksService {
|
|
74
|
+
static instance;
|
|
75
|
+
sessionInfoService;
|
|
76
|
+
historyReader;
|
|
77
|
+
turnCaptureService;
|
|
78
|
+
constructor() {
|
|
79
|
+
this.sessionInfoService = SessionInfoService.getInstance();
|
|
80
|
+
this.historyReader = new ClaudeHistoryReader();
|
|
81
|
+
this.turnCaptureService = TurnCaptureService.getInstance();
|
|
82
|
+
}
|
|
83
|
+
static getInstance() {
|
|
84
|
+
if (!SessionMarksService.instance) {
|
|
85
|
+
SessionMarksService.instance = new SessionMarksService();
|
|
86
|
+
}
|
|
87
|
+
return SessionMarksService.instance;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a new session mark.
|
|
91
|
+
* If the turn is complete, captures turn context immediately.
|
|
92
|
+
* If the turn is in progress, turn context will be backfilled on turn completion.
|
|
93
|
+
*/
|
|
94
|
+
async createMark(params) {
|
|
95
|
+
const startTime = Date.now();
|
|
96
|
+
logger.info('Creating session mark', {
|
|
97
|
+
sessionId: params.sessionId.slice(0, 8),
|
|
98
|
+
markType: params.markType,
|
|
99
|
+
contentType: params.contentType,
|
|
100
|
+
messageId: params.messageId,
|
|
101
|
+
});
|
|
102
|
+
// Determine if turn is complete and capture context if so
|
|
103
|
+
const { turnNumber, turnContext, isTurnComplete } = await this.resolveTurnContext(params.sessionId, params.messageId, params.contentType);
|
|
104
|
+
logger.debug('Turn context resolution', {
|
|
105
|
+
sessionId: params.sessionId.slice(0, 8),
|
|
106
|
+
messageId: params.messageId,
|
|
107
|
+
turnNumber,
|
|
108
|
+
isTurnComplete,
|
|
109
|
+
hasTurnContext: !!turnContext,
|
|
110
|
+
});
|
|
111
|
+
// Create the mark
|
|
112
|
+
const id = await this.sessionInfoService.addSessionMark({
|
|
113
|
+
sessionId: params.sessionId,
|
|
114
|
+
messageId: params.messageId,
|
|
115
|
+
markType: params.markType,
|
|
116
|
+
contentType: params.contentType,
|
|
117
|
+
toolName: params.toolName,
|
|
118
|
+
contentPreview: params.contentPreview,
|
|
119
|
+
turnNumber,
|
|
120
|
+
turnContext: turnContext ? JSON.stringify(turnContext) : null,
|
|
121
|
+
});
|
|
122
|
+
const elapsed = Date.now() - startTime;
|
|
123
|
+
logger.info('Session mark created', {
|
|
124
|
+
id,
|
|
125
|
+
sessionId: params.sessionId.slice(0, 8),
|
|
126
|
+
markType: params.markType,
|
|
127
|
+
turnNumber,
|
|
128
|
+
hasTurnContext: !!turnContext,
|
|
129
|
+
elapsedMs: elapsed,
|
|
130
|
+
});
|
|
131
|
+
return id;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Delete a session mark.
|
|
135
|
+
*/
|
|
136
|
+
async deleteMark(id) {
|
|
137
|
+
logger.info('Deleting session mark', { id });
|
|
138
|
+
await this.sessionInfoService.deleteSessionMark(id);
|
|
139
|
+
logger.debug('Session mark deleted', { id });
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get all marks for a session.
|
|
143
|
+
*/
|
|
144
|
+
async getMarksForSession(sessionId) {
|
|
145
|
+
logger.debug('Getting marks for session', { sessionId: sessionId.slice(0, 8) });
|
|
146
|
+
const rawMarks = await this.sessionInfoService.getSessionMarks(sessionId);
|
|
147
|
+
logger.debug('Marks retrieved', {
|
|
148
|
+
sessionId: sessionId.slice(0, 8),
|
|
149
|
+
count: rawMarks.length,
|
|
150
|
+
});
|
|
151
|
+
// Cast markType from string to MarkType and turnContext from unknown to TurnContext
|
|
152
|
+
return rawMarks.map(mark => ({
|
|
153
|
+
...mark,
|
|
154
|
+
markType: mark.markType,
|
|
155
|
+
turnContext: mark.turnContext,
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if a message is marked and return the mark ID if so.
|
|
160
|
+
*/
|
|
161
|
+
async isMarked(sessionId, messageId) {
|
|
162
|
+
return this.sessionInfoService.isSessionMarked(sessionId, messageId);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Backfill turn context for marks that were created during an in-progress turn.
|
|
166
|
+
* Called by TurnCaptureService when a turn completes.
|
|
167
|
+
*/
|
|
168
|
+
async backfillTurnContext(sessionId, turnNumber) {
|
|
169
|
+
const startTime = Date.now();
|
|
170
|
+
logger.debug('Checking for marks needing turn context backfill', {
|
|
171
|
+
sessionId: sessionId.slice(0, 8),
|
|
172
|
+
turnNumber,
|
|
173
|
+
});
|
|
174
|
+
// Get marks without turn context for this session
|
|
175
|
+
const pendingMarks = await this.sessionInfoService.getMarksWithoutTurnContext(sessionId);
|
|
176
|
+
if (pendingMarks.length === 0) {
|
|
177
|
+
logger.debug('No pending marks to backfill', { sessionId: sessionId.slice(0, 8) });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
logger.info('Backfilling turn context for marks', {
|
|
181
|
+
sessionId: sessionId.slice(0, 8),
|
|
182
|
+
turnNumber,
|
|
183
|
+
pendingMarkCount: pendingMarks.length,
|
|
184
|
+
});
|
|
185
|
+
// Get the turn context from JSONL
|
|
186
|
+
const turnContext = await this.extractTurnContext(sessionId, turnNumber, null, null);
|
|
187
|
+
if (!turnContext) {
|
|
188
|
+
logger.warn('Could not extract turn context for backfill', {
|
|
189
|
+
sessionId: sessionId.slice(0, 8),
|
|
190
|
+
turnNumber,
|
|
191
|
+
});
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Update each pending mark
|
|
195
|
+
for (const mark of pendingMarks) {
|
|
196
|
+
// Check if this mark's messageId is in the turn
|
|
197
|
+
const isInTurn = this.isMessageInTurn(mark.messageId, mark.contentType, turnContext);
|
|
198
|
+
if (isInTurn) {
|
|
199
|
+
// Mark the relevant block
|
|
200
|
+
const turnContextWithMark = this.markBlockInContext(turnContext, mark.messageId, mark.contentType);
|
|
201
|
+
await this.sessionInfoService.updateMarkTurnContext(mark.id, turnNumber, JSON.stringify(turnContextWithMark));
|
|
202
|
+
logger.debug('Backfilled turn context for mark', {
|
|
203
|
+
markId: mark.id,
|
|
204
|
+
sessionId: sessionId.slice(0, 8),
|
|
205
|
+
turnNumber,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const elapsed = Date.now() - startTime;
|
|
210
|
+
logger.info('Turn context backfill complete', {
|
|
211
|
+
sessionId: sessionId.slice(0, 8),
|
|
212
|
+
turnNumber,
|
|
213
|
+
elapsedMs: elapsed,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Format marks for post-session analysis using the mark type registry.
|
|
218
|
+
*/
|
|
219
|
+
formatMarksForAnalysis(marks) {
|
|
220
|
+
if (marks.length === 0) {
|
|
221
|
+
return '';
|
|
222
|
+
}
|
|
223
|
+
const sections = [];
|
|
224
|
+
// Group marks by type
|
|
225
|
+
const marksByType = new Map();
|
|
226
|
+
for (const mark of marks) {
|
|
227
|
+
const existing = marksByType.get(mark.markType) || [];
|
|
228
|
+
existing.push(mark);
|
|
229
|
+
marksByType.set(mark.markType, existing);
|
|
230
|
+
}
|
|
231
|
+
// Format each type section
|
|
232
|
+
for (const [markType, typeMarks] of marksByType) {
|
|
233
|
+
const typeDef = MARK_TYPES[markType];
|
|
234
|
+
const typeHeader = `## ${typeDef.icon} User-Flagged: ${typeDef.label} (${typeMarks.length})`;
|
|
235
|
+
const typeGoal = `**Analysis goal:** ${typeDef.analysisGoal}`;
|
|
236
|
+
const markItems = typeMarks.map(mark => {
|
|
237
|
+
if (mark.turnContext) {
|
|
238
|
+
return typeDef.promptFraming(mark.turnContext);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
// Fallback if no turn context (shouldn't happen normally)
|
|
242
|
+
return `### Turn ? — ${typeDef.label}
|
|
243
|
+
**Marked content:** ${mark.contentPreview}
|
|
244
|
+
(Full turn context unavailable)`;
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
sections.push(`${typeHeader}\n\n${typeGoal}\n\n${markItems.join('\n\n')}`);
|
|
248
|
+
}
|
|
249
|
+
return sections.join('\n\n---\n\n');
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get available mark types for the UI.
|
|
253
|
+
*/
|
|
254
|
+
getAvailableMarkTypes() {
|
|
255
|
+
return Object.entries(MARK_TYPES).map(([type, def]) => ({
|
|
256
|
+
type: type,
|
|
257
|
+
label: def.label,
|
|
258
|
+
icon: def.icon,
|
|
259
|
+
description: def.description,
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
// ===========================================================================
|
|
263
|
+
// Private helpers
|
|
264
|
+
// ===========================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Resolve turn context for a mark.
|
|
267
|
+
* Returns turn number and context if the turn is complete, or just turn number if in progress.
|
|
268
|
+
*/
|
|
269
|
+
async resolveTurnContext(sessionId, messageId, contentType) {
|
|
270
|
+
// Get existing turns for this session
|
|
271
|
+
const existingTurns = await this.turnCaptureService.getTurnsForSession(sessionId);
|
|
272
|
+
const currentTurnNumber = existingTurns.length + 1;
|
|
273
|
+
// Try to find which turn contains this message
|
|
274
|
+
// First check if message is in a completed turn
|
|
275
|
+
const { messages } = await this.historyReader.fetchConversationDirect(sessionId);
|
|
276
|
+
if (messages.length === 0) {
|
|
277
|
+
logger.debug('No messages in conversation', { sessionId: sessionId.slice(0, 8) });
|
|
278
|
+
return { turnNumber: null, turnContext: null, isTurnComplete: false };
|
|
279
|
+
}
|
|
280
|
+
// Find the turn containing this message/tool
|
|
281
|
+
const turnInfo = this.findTurnForMessage(messages, messageId, contentType);
|
|
282
|
+
if (!turnInfo) {
|
|
283
|
+
// Message not found - might be in currently streaming turn
|
|
284
|
+
logger.debug('Message not found in existing turns, assuming current turn', {
|
|
285
|
+
sessionId: sessionId.slice(0, 8),
|
|
286
|
+
messageId,
|
|
287
|
+
});
|
|
288
|
+
return { turnNumber: currentTurnNumber, turnContext: null, isTurnComplete: false };
|
|
289
|
+
}
|
|
290
|
+
// Check if this is the last turn (might still be in progress)
|
|
291
|
+
const isLastTurn = turnInfo.turnNumber === currentTurnNumber;
|
|
292
|
+
// For now, assume turns captured in session_turns are complete
|
|
293
|
+
// A turn is "in progress" only if it's beyond the last captured turn
|
|
294
|
+
const isTurnComplete = !isLastTurn || existingTurns.length > 0;
|
|
295
|
+
if (isTurnComplete) {
|
|
296
|
+
// Extract full turn context, including preceding turn if user message is marked
|
|
297
|
+
const turnContext = await this.extractTurnContext(sessionId, turnInfo.turnNumber, messageId, contentType, turnInfo.isUserMessage);
|
|
298
|
+
return { turnNumber: turnInfo.turnNumber, turnContext, isTurnComplete: true };
|
|
299
|
+
}
|
|
300
|
+
return { turnNumber: turnInfo.turnNumber, turnContext: null, isTurnComplete: false };
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Find which turn number contains a given message or tool.
|
|
304
|
+
* Also returns whether the marked message is a user message (for capturing preceding context).
|
|
305
|
+
*/
|
|
306
|
+
findTurnForMessage(messages, messageId, contentType) {
|
|
307
|
+
let turnNumber = 0;
|
|
308
|
+
for (const msg of messages) {
|
|
309
|
+
// New turn starts with a human message
|
|
310
|
+
if (msg.type === 'user' && this.hasHumanText(msg)) {
|
|
311
|
+
turnNumber++;
|
|
312
|
+
}
|
|
313
|
+
// Check if this message contains what we're looking for
|
|
314
|
+
if (contentType === 'tool_use' && messageId.startsWith('tool-')) {
|
|
315
|
+
const toolId = messageId.replace('tool-', '');
|
|
316
|
+
if (this.messageContainsTool(msg, toolId)) {
|
|
317
|
+
return { turnNumber, isUserMessage: false };
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else if (contentType === 'response') {
|
|
321
|
+
// Check both user and assistant message IDs
|
|
322
|
+
if (msg.uuid === messageId) {
|
|
323
|
+
return { turnNumber, isUserMessage: msg.type === 'user' };
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Check if a message contains a specific tool use.
|
|
331
|
+
*/
|
|
332
|
+
messageContainsTool(msg, toolId) {
|
|
333
|
+
const content = msg.message?.content;
|
|
334
|
+
if (!Array.isArray(content))
|
|
335
|
+
return false;
|
|
336
|
+
return content.some(block => typeof block === 'object' &&
|
|
337
|
+
block !== null &&
|
|
338
|
+
block.type === 'tool_use' &&
|
|
339
|
+
'id' in block &&
|
|
340
|
+
block.id === toolId);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Check if a user message contains actual human text (not just tool results).
|
|
344
|
+
*/
|
|
345
|
+
hasHumanText(msg) {
|
|
346
|
+
const content = msg.message?.content;
|
|
347
|
+
if (typeof content === 'string' && content.trim()) {
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
if (Array.isArray(content)) {
|
|
351
|
+
return content.some(block => typeof block === 'object' && block !== null && block.type === 'text' && 'text' in block);
|
|
352
|
+
}
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Extract full turn context from JSONL.
|
|
357
|
+
* If isUserMessageMarked is true, also captures the preceding assistant response.
|
|
358
|
+
*/
|
|
359
|
+
async extractTurnContext(sessionId, turnNumber, markedMessageId, markedContentType, isUserMessageMarked = false) {
|
|
360
|
+
const { messages } = await this.historyReader.fetchConversationDirect(sessionId);
|
|
361
|
+
if (messages.length === 0) {
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
// Find the nth human message (turn start) and track turn boundaries
|
|
365
|
+
let currentTurn = 0;
|
|
366
|
+
let turnStartIdx = -1;
|
|
367
|
+
let turnEndIdx = messages.length;
|
|
368
|
+
let prevTurnStartIdx = -1;
|
|
369
|
+
for (let i = 0; i < messages.length; i++) {
|
|
370
|
+
if (messages[i].type === 'user' && this.hasHumanText(messages[i])) {
|
|
371
|
+
currentTurn++;
|
|
372
|
+
if (currentTurn === turnNumber - 1) {
|
|
373
|
+
prevTurnStartIdx = i; // Start of preceding turn
|
|
374
|
+
}
|
|
375
|
+
else if (currentTurn === turnNumber) {
|
|
376
|
+
turnStartIdx = i;
|
|
377
|
+
}
|
|
378
|
+
else if (currentTurn === turnNumber + 1) {
|
|
379
|
+
turnEndIdx = i;
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
if (turnStartIdx === -1) {
|
|
385
|
+
logger.debug('Turn not found', { sessionId: sessionId.slice(0, 8), turnNumber });
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
// Extract user message
|
|
389
|
+
const userMsg = messages[turnStartIdx];
|
|
390
|
+
let userMessage = '';
|
|
391
|
+
const userContent = userMsg.message?.content;
|
|
392
|
+
if (typeof userContent === 'string') {
|
|
393
|
+
userMessage = userContent;
|
|
394
|
+
}
|
|
395
|
+
else if (Array.isArray(userContent)) {
|
|
396
|
+
userMessage = userContent
|
|
397
|
+
.filter((block) => typeof block === 'object' && block !== null && block.type === 'text')
|
|
398
|
+
.map(block => block.text)
|
|
399
|
+
.join('\n');
|
|
400
|
+
}
|
|
401
|
+
// Extract assistant blocks for this turn
|
|
402
|
+
const assistantBlocks = [];
|
|
403
|
+
const pendingTools = new Map();
|
|
404
|
+
for (let i = turnStartIdx + 1; i < turnEndIdx; i++) {
|
|
405
|
+
const msg = messages[i];
|
|
406
|
+
const content = msg.message?.content;
|
|
407
|
+
if (!Array.isArray(content))
|
|
408
|
+
continue;
|
|
409
|
+
for (const block of content) {
|
|
410
|
+
if (typeof block !== 'object' || block === null)
|
|
411
|
+
continue;
|
|
412
|
+
if (msg.type === 'assistant') {
|
|
413
|
+
if (block.type === 'text' && 'text' in block) {
|
|
414
|
+
const textBlock = block;
|
|
415
|
+
const isMarked = markedContentType === 'response' && msg.uuid === markedMessageId;
|
|
416
|
+
assistantBlocks.push({
|
|
417
|
+
type: 'text',
|
|
418
|
+
content: textBlock.text,
|
|
419
|
+
isMarked,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
else if (block.type === 'tool_use' && 'id' in block && 'name' in block) {
|
|
423
|
+
const toolBlock = block;
|
|
424
|
+
const isMarked = markedContentType === 'tool_use' && markedMessageId === `tool-${toolBlock.id}`;
|
|
425
|
+
const idx = assistantBlocks.length;
|
|
426
|
+
assistantBlocks.push({
|
|
427
|
+
type: 'tool_use',
|
|
428
|
+
toolName: toolBlock.name,
|
|
429
|
+
toolInput: toolBlock.input,
|
|
430
|
+
isMarked,
|
|
431
|
+
});
|
|
432
|
+
pendingTools.set(toolBlock.id, { name: toolBlock.name, input: toolBlock.input, idx });
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
else if (msg.type === 'user' && block.type === 'tool_result' && 'tool_use_id' in block) {
|
|
436
|
+
const resultBlock = block;
|
|
437
|
+
const tool = pendingTools.get(resultBlock.tool_use_id);
|
|
438
|
+
if (tool && assistantBlocks[tool.idx]) {
|
|
439
|
+
const resultStr = typeof resultBlock.content === 'string'
|
|
440
|
+
? resultBlock.content
|
|
441
|
+
: JSON.stringify(resultBlock.content);
|
|
442
|
+
assistantBlocks[tool.idx].toolResult = truncate(resultStr, 500);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// If user message was marked, extract the preceding assistant response
|
|
448
|
+
let precedingAssistantBlocks;
|
|
449
|
+
if (isUserMessageMarked && prevTurnStartIdx >= 0) {
|
|
450
|
+
precedingAssistantBlocks = [];
|
|
451
|
+
const prevPendingTools = new Map();
|
|
452
|
+
// Extract from after prev turn's user message up to this turn's user message
|
|
453
|
+
for (let i = prevTurnStartIdx + 1; i < turnStartIdx; i++) {
|
|
454
|
+
const msg = messages[i];
|
|
455
|
+
const content = msg.message?.content;
|
|
456
|
+
if (!Array.isArray(content))
|
|
457
|
+
continue;
|
|
458
|
+
for (const block of content) {
|
|
459
|
+
if (typeof block !== 'object' || block === null)
|
|
460
|
+
continue;
|
|
461
|
+
if (msg.type === 'assistant') {
|
|
462
|
+
if (block.type === 'text' && 'text' in block) {
|
|
463
|
+
const textBlock = block;
|
|
464
|
+
precedingAssistantBlocks.push({
|
|
465
|
+
type: 'text',
|
|
466
|
+
content: textBlock.text,
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
else if (block.type === 'tool_use' && 'id' in block && 'name' in block) {
|
|
470
|
+
const toolBlock = block;
|
|
471
|
+
const idx = precedingAssistantBlocks.length;
|
|
472
|
+
precedingAssistantBlocks.push({
|
|
473
|
+
type: 'tool_use',
|
|
474
|
+
toolName: toolBlock.name,
|
|
475
|
+
toolInput: toolBlock.input,
|
|
476
|
+
});
|
|
477
|
+
prevPendingTools.set(toolBlock.id, { name: toolBlock.name, input: toolBlock.input, idx });
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
else if (msg.type === 'user' && block.type === 'tool_result' && 'tool_use_id' in block) {
|
|
481
|
+
const resultBlock = block;
|
|
482
|
+
const tool = prevPendingTools.get(resultBlock.tool_use_id);
|
|
483
|
+
if (tool && precedingAssistantBlocks[tool.idx]) {
|
|
484
|
+
const resultStr = typeof resultBlock.content === 'string'
|
|
485
|
+
? resultBlock.content
|
|
486
|
+
: JSON.stringify(resultBlock.content);
|
|
487
|
+
precedingAssistantBlocks[tool.idx].toolResult = truncate(resultStr, 500);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return {
|
|
494
|
+
turnNumber,
|
|
495
|
+
userMessage: truncate(userMessage, 2000),
|
|
496
|
+
isUserMessageMarked,
|
|
497
|
+
assistantBlocks,
|
|
498
|
+
precedingAssistantBlocks,
|
|
499
|
+
timestamp: userMsg.timestamp || new Date().toISOString(),
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Check if a message ID is present in a turn context.
|
|
504
|
+
*/
|
|
505
|
+
isMessageInTurn(_messageId, _contentType, _turnContext) {
|
|
506
|
+
// For now, we can't easily verify without re-fetching messages
|
|
507
|
+
// This is called during backfill when we're processing a just-completed turn
|
|
508
|
+
// So any pending marks for this session are likely in this turn
|
|
509
|
+
// A more robust check would store the turn number estimate at mark creation time
|
|
510
|
+
return true;
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Mark a specific block in the turn context as the marked item.
|
|
514
|
+
*/
|
|
515
|
+
markBlockInContext(turnContext, messageId, contentType) {
|
|
516
|
+
// Clear any existing marks and mark the right one
|
|
517
|
+
const updatedBlocks = turnContext.assistantBlocks.map(block => {
|
|
518
|
+
let isMarked = false;
|
|
519
|
+
if (contentType === 'tool_use' && messageId.startsWith('tool-')) {
|
|
520
|
+
// For tool uses, we'd need the tool ID to match
|
|
521
|
+
// Since we don't have direct access here, mark all tool uses with matching name
|
|
522
|
+
// This is imperfect but better than nothing
|
|
523
|
+
isMarked = block.type === 'tool_use';
|
|
524
|
+
}
|
|
525
|
+
else if (contentType === 'response') {
|
|
526
|
+
isMarked = block.type === 'text';
|
|
527
|
+
}
|
|
528
|
+
return { ...block, isMarked };
|
|
529
|
+
});
|
|
530
|
+
return { ...turnContext, assistantBlocks: updatedBlocks };
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
// =============================================================================
|
|
534
|
+
// Utility
|
|
535
|
+
// =============================================================================
|
|
536
|
+
function truncate(str, maxLen) {
|
|
537
|
+
if (str.length <= maxLen)
|
|
538
|
+
return str;
|
|
539
|
+
return str.slice(0, maxLen - 3) + '...';
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Format assistant blocks for analysis prompts.
|
|
543
|
+
* When fullContent is true, uses much larger limits for complete context.
|
|
544
|
+
*/
|
|
545
|
+
function formatAssistantBlocks(blocks, options = {}) {
|
|
546
|
+
const { fullContent = false, showMarkers = false, markerText = 'MARKED' } = options;
|
|
547
|
+
// Use larger limits when we need full context (e.g., for preceding turn analysis)
|
|
548
|
+
const textLimit = fullContent ? 2000 : 200;
|
|
549
|
+
const inputLimit = fullContent ? 500 : 80;
|
|
550
|
+
const resultLimit = fullContent ? 1000 : 100;
|
|
551
|
+
return blocks.map(b => {
|
|
552
|
+
const marker = showMarkers && b.isMarked ? ` ← ${markerText}` : '';
|
|
553
|
+
if (b.type === 'text') {
|
|
554
|
+
return `- Claude responded: "${truncate(b.content || '', textLimit)}"${marker}`;
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
const result = b.toolResult ? `\n Result: ${truncate(b.toolResult, resultLimit)}` : '';
|
|
558
|
+
return `- ${b.toolName}(${truncate(JSON.stringify(b.toolInput), inputLimit)})${result}${marker}`;
|
|
559
|
+
}
|
|
560
|
+
}).join('\n');
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=session-marks-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-marks-service.js","sourceRoot":"","sources":["../../../src/services/sessions/session-marks-service.ts"],"names":[],"mappings":"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"}
|