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,215 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
import { PassThrough } from 'stream';
|
|
3
|
+
import { LogFormatter } from './log-formatter.js';
|
|
4
|
+
export class CUILogger {
|
|
5
|
+
pinoLogger;
|
|
6
|
+
constructor(pinoLogger) {
|
|
7
|
+
this.pinoLogger = pinoLogger;
|
|
8
|
+
}
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
debug(message, context) {
|
|
11
|
+
if (context !== undefined) {
|
|
12
|
+
this.pinoLogger.debug(context, message);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
this.pinoLogger.debug(message);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
info(message, context) {
|
|
20
|
+
if (context !== undefined) {
|
|
21
|
+
this.pinoLogger.info(context, message);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.pinoLogger.info(message);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
warn(message, context) {
|
|
29
|
+
if (context !== undefined) {
|
|
30
|
+
this.pinoLogger.warn(context, message);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.pinoLogger.warn(message);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
error(message, error, context) {
|
|
38
|
+
if (error instanceof Error) {
|
|
39
|
+
const logData = { err: error, ...context };
|
|
40
|
+
this.pinoLogger.error(logData, message);
|
|
41
|
+
}
|
|
42
|
+
else if (error !== undefined && context !== undefined) {
|
|
43
|
+
// error is actually context, context is extra data
|
|
44
|
+
const logData = { ...error, ...context };
|
|
45
|
+
this.pinoLogger.error(logData, message);
|
|
46
|
+
}
|
|
47
|
+
else if (error !== undefined) {
|
|
48
|
+
// error is context
|
|
49
|
+
this.pinoLogger.error(error, message);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.pinoLogger.error(message);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
56
|
+
fatal(message, error, context) {
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
const logData = { err: error, ...context };
|
|
59
|
+
this.pinoLogger.fatal(logData, message);
|
|
60
|
+
}
|
|
61
|
+
else if (error !== undefined && context !== undefined) {
|
|
62
|
+
// error is actually context, context is extra data
|
|
63
|
+
const logData = { ...error, ...context };
|
|
64
|
+
this.pinoLogger.fatal(logData, message);
|
|
65
|
+
}
|
|
66
|
+
else if (error !== undefined) {
|
|
67
|
+
// error is context
|
|
68
|
+
this.pinoLogger.fatal(error, message);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.pinoLogger.fatal(message);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Support for creating child loggers
|
|
75
|
+
child(context) {
|
|
76
|
+
return new CUILogger(this.pinoLogger.child(context));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Centralized logger service using Pino
|
|
81
|
+
* Provides consistent logging across all CUI components
|
|
82
|
+
* Log level is controlled by LOG_LEVEL environment variable
|
|
83
|
+
*/
|
|
84
|
+
class LoggerService {
|
|
85
|
+
static instance;
|
|
86
|
+
baseLogger;
|
|
87
|
+
logInterceptStream;
|
|
88
|
+
childLoggers = new Map();
|
|
89
|
+
constructor() {
|
|
90
|
+
// Get log level from environment variable, default to 'info'
|
|
91
|
+
const logLevel = process.env.LOG_LEVEL || 'info';
|
|
92
|
+
// Create a pass-through stream to intercept logs
|
|
93
|
+
this.logInterceptStream = new PassThrough();
|
|
94
|
+
// Forward logs to the log buffer (lazy loaded to avoid circular dependency)
|
|
95
|
+
this.logInterceptStream.on('data', (chunk) => {
|
|
96
|
+
const logLine = chunk.toString().trim();
|
|
97
|
+
if (logLine) {
|
|
98
|
+
// Lazy load to avoid circular dependency
|
|
99
|
+
import('../../services/infrastructure/log-stream-buffer').then(({ logStreamBuffer }) => {
|
|
100
|
+
logStreamBuffer.addLog(logLine);
|
|
101
|
+
}).catch(() => {
|
|
102
|
+
// Silently ignore if log buffer is not available
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
const formatter = new LogFormatter();
|
|
107
|
+
formatter.pipe(process.stdout);
|
|
108
|
+
// Create multi-stream configuration with formatter
|
|
109
|
+
const streams = [
|
|
110
|
+
{ level: logLevel, stream: formatter },
|
|
111
|
+
{ level: logLevel, stream: this.logInterceptStream }
|
|
112
|
+
];
|
|
113
|
+
this.baseLogger = pino({
|
|
114
|
+
level: logLevel,
|
|
115
|
+
formatters: {
|
|
116
|
+
level: (label) => {
|
|
117
|
+
return { level: label };
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
timestamp: pino.stdTimeFunctions.isoTime,
|
|
121
|
+
// Enable in test environment if debug level, otherwise suppress
|
|
122
|
+
enabled: process.env.NODE_ENV !== 'test' || logLevel === 'debug'
|
|
123
|
+
}, pino.multistream(streams));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the singleton logger instance
|
|
127
|
+
*/
|
|
128
|
+
static getInstance() {
|
|
129
|
+
if (!LoggerService.instance) {
|
|
130
|
+
LoggerService.instance = new LoggerService();
|
|
131
|
+
}
|
|
132
|
+
return LoggerService.instance;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create a child logger with context
|
|
136
|
+
*/
|
|
137
|
+
child(context) {
|
|
138
|
+
const contextKey = JSON.stringify(context);
|
|
139
|
+
if (!this.childLoggers.has(contextKey)) {
|
|
140
|
+
this.childLoggers.set(contextKey, this.baseLogger.child(context));
|
|
141
|
+
}
|
|
142
|
+
return new CUILogger(this.childLoggers.get(contextKey));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the base logger
|
|
146
|
+
*/
|
|
147
|
+
getLogger() {
|
|
148
|
+
return new CUILogger(this.baseLogger);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Log debug message
|
|
152
|
+
*/
|
|
153
|
+
debug(message, context) {
|
|
154
|
+
if (context) {
|
|
155
|
+
this.baseLogger.child(context).debug(message);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.baseLogger.debug(message);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Log info message
|
|
163
|
+
*/
|
|
164
|
+
info(message, context) {
|
|
165
|
+
if (context) {
|
|
166
|
+
this.baseLogger.child(context).info(message);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.baseLogger.info(message);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Log warning message
|
|
174
|
+
*/
|
|
175
|
+
warn(message, context) {
|
|
176
|
+
if (context) {
|
|
177
|
+
this.baseLogger.child(context).warn(message);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
this.baseLogger.warn(message);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Log error message
|
|
185
|
+
*/
|
|
186
|
+
error(message, error, context) {
|
|
187
|
+
const logData = error ? { err: error } : {};
|
|
188
|
+
if (context) {
|
|
189
|
+
this.baseLogger.child({ ...context, ...logData }).error(message);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.baseLogger.error(logData, message);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Log fatal message
|
|
197
|
+
*/
|
|
198
|
+
fatal(message, error, context) {
|
|
199
|
+
const logData = error ? { err: error } : {};
|
|
200
|
+
if (context) {
|
|
201
|
+
this.baseLogger.child({ ...context, ...logData }).fatal(message);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.baseLogger.fatal(logData, message);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Export singleton instance
|
|
209
|
+
export const logger = LoggerService.getInstance();
|
|
210
|
+
// Export factory function for creating component loggers
|
|
211
|
+
export function createLogger(component, baseContext) {
|
|
212
|
+
const context = { component, ...baseContext };
|
|
213
|
+
return logger.child(context);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/services/infrastructure/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry - Explicit initialization tracking with dependency validation.
|
|
3
|
+
*
|
|
4
|
+
* Solves the "singleton initialization chaos" problem where:
|
|
5
|
+
* - Services depend on initialization order with no enforcement
|
|
6
|
+
* - Lazy initialization can silently fail if dependencies aren't ready
|
|
7
|
+
* - No visibility into which services are initialized
|
|
8
|
+
*
|
|
9
|
+
* USAGE:
|
|
10
|
+
*
|
|
11
|
+
* 1. Register services during startup:
|
|
12
|
+
* serviceRegistry.register('SessionInfoService', {
|
|
13
|
+
* dependsOn: ['ConfigService']
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* 2. Mark as initialized after async init completes:
|
|
17
|
+
* await sessionInfoService.initialize();
|
|
18
|
+
* serviceRegistry.markInitialized('SessionInfoService');
|
|
19
|
+
*
|
|
20
|
+
* 3. Services can guard their methods:
|
|
21
|
+
* serviceRegistry.requireInitialized('SessionInfoService');
|
|
22
|
+
*
|
|
23
|
+
* 4. Check status for debugging:
|
|
24
|
+
* serviceRegistry.getStatus(); // Returns all services and their state
|
|
25
|
+
*/
|
|
26
|
+
export interface ServiceRegistration {
|
|
27
|
+
/** Services that must be initialized before this one */
|
|
28
|
+
dependsOn?: string[];
|
|
29
|
+
/** Optional description for debugging */
|
|
30
|
+
description?: string;
|
|
31
|
+
}
|
|
32
|
+
declare class ServiceRegistry {
|
|
33
|
+
private services;
|
|
34
|
+
/**
|
|
35
|
+
* Register a service. Call this before initialization.
|
|
36
|
+
* Validates that declared dependencies are already registered.
|
|
37
|
+
*/
|
|
38
|
+
register(name: string, options?: ServiceRegistration): void;
|
|
39
|
+
/**
|
|
40
|
+
* Mark a service as initialized.
|
|
41
|
+
* Validates that all dependencies are already initialized.
|
|
42
|
+
*/
|
|
43
|
+
markInitialized(name: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Check if a service is initialized.
|
|
46
|
+
*/
|
|
47
|
+
isInitialized(name: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Require a service to be initialized, throwing if not.
|
|
50
|
+
* Use this to guard service methods.
|
|
51
|
+
*/
|
|
52
|
+
requireInitialized(name: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get status of all registered services.
|
|
55
|
+
* Useful for debugging and health checks.
|
|
56
|
+
*/
|
|
57
|
+
getStatus(): Record<string, {
|
|
58
|
+
initialized: boolean;
|
|
59
|
+
dependsOn: string[];
|
|
60
|
+
initializedAt?: string;
|
|
61
|
+
}>;
|
|
62
|
+
/**
|
|
63
|
+
* Get list of services that aren't initialized yet.
|
|
64
|
+
*/
|
|
65
|
+
getUninitializedServices(): string[];
|
|
66
|
+
/**
|
|
67
|
+
* Verify all registered services are initialized.
|
|
68
|
+
* Throws if any service is not initialized.
|
|
69
|
+
*/
|
|
70
|
+
requireAllInitialized(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Reset all services (for testing).
|
|
73
|
+
*/
|
|
74
|
+
reset(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Unregister a specific service (for testing).
|
|
77
|
+
*/
|
|
78
|
+
unregister(name: string): void;
|
|
79
|
+
}
|
|
80
|
+
export declare const serviceRegistry: ServiceRegistry;
|
|
81
|
+
export declare const registerService: (name: string, options?: ServiceRegistration) => void;
|
|
82
|
+
export declare const markServiceInitialized: (name: string) => void;
|
|
83
|
+
export declare const requireServiceInitialized: (name: string) => void;
|
|
84
|
+
export declare const isServiceInitialized: (name: string) => boolean;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=service-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-registry.d.ts","sourceRoot":"","sources":["../../../src/services/infrastructure/service-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAmC;IAEnD;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI;IA6B/D;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkCnC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpC;;;OAGG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqBtC;;;OAGG;IACH,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAclG;;OAEG;IACH,wBAAwB,IAAI,MAAM,EAAE;IAMpC;;;OAGG;IACH,qBAAqB,IAAI,IAAI;IAW7B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAG/B;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC;AAGrD,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,UAAU,mBAAmB,SAClC,CAAC;AAE1C,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,SACZ,CAAC;AAExC,eAAO,MAAM,yBAAyB,GAAI,MAAM,MAAM,SACZ,CAAC;AAE3C,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,YACZ,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry - Explicit initialization tracking with dependency validation.
|
|
3
|
+
*
|
|
4
|
+
* Solves the "singleton initialization chaos" problem where:
|
|
5
|
+
* - Services depend on initialization order with no enforcement
|
|
6
|
+
* - Lazy initialization can silently fail if dependencies aren't ready
|
|
7
|
+
* - No visibility into which services are initialized
|
|
8
|
+
*
|
|
9
|
+
* USAGE:
|
|
10
|
+
*
|
|
11
|
+
* 1. Register services during startup:
|
|
12
|
+
* serviceRegistry.register('SessionInfoService', {
|
|
13
|
+
* dependsOn: ['ConfigService']
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* 2. Mark as initialized after async init completes:
|
|
17
|
+
* await sessionInfoService.initialize();
|
|
18
|
+
* serviceRegistry.markInitialized('SessionInfoService');
|
|
19
|
+
*
|
|
20
|
+
* 3. Services can guard their methods:
|
|
21
|
+
* serviceRegistry.requireInitialized('SessionInfoService');
|
|
22
|
+
*
|
|
23
|
+
* 4. Check status for debugging:
|
|
24
|
+
* serviceRegistry.getStatus(); // Returns all services and their state
|
|
25
|
+
*/
|
|
26
|
+
import { createLogger } from './logger.js';
|
|
27
|
+
const logger = createLogger('ServiceRegistry');
|
|
28
|
+
class ServiceRegistry {
|
|
29
|
+
services = new Map();
|
|
30
|
+
/**
|
|
31
|
+
* Register a service. Call this before initialization.
|
|
32
|
+
* Validates that declared dependencies are already registered.
|
|
33
|
+
*/
|
|
34
|
+
register(name, options = {}) {
|
|
35
|
+
if (this.services.has(name)) {
|
|
36
|
+
logger.warn(`Service "${name}" already registered, skipping`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const dependsOn = options.dependsOn || [];
|
|
40
|
+
// Validate dependencies are registered (but not necessarily initialized yet)
|
|
41
|
+
for (const dep of dependsOn) {
|
|
42
|
+
if (!this.services.has(dep)) {
|
|
43
|
+
throw new Error(`Service "${name}" depends on "${dep}" which is not registered. ` +
|
|
44
|
+
`Register dependencies before dependents.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
this.services.set(name, {
|
|
48
|
+
name,
|
|
49
|
+
registered: true,
|
|
50
|
+
initialized: false,
|
|
51
|
+
dependsOn,
|
|
52
|
+
description: options.description
|
|
53
|
+
});
|
|
54
|
+
logger.debug(`Registered service: ${name}`, { dependsOn });
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Mark a service as initialized.
|
|
58
|
+
* Validates that all dependencies are already initialized.
|
|
59
|
+
*/
|
|
60
|
+
markInitialized(name) {
|
|
61
|
+
const state = this.services.get(name);
|
|
62
|
+
if (!state) {
|
|
63
|
+
throw new Error(`Cannot mark "${name}" as initialized - not registered. ` +
|
|
64
|
+
`Call register() before markInitialized().`);
|
|
65
|
+
}
|
|
66
|
+
if (state.initialized) {
|
|
67
|
+
logger.warn(`Service "${name}" already marked as initialized`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Validate all dependencies are initialized
|
|
71
|
+
const uninitializedDeps = state.dependsOn.filter(dep => {
|
|
72
|
+
const depState = this.services.get(dep);
|
|
73
|
+
return !depState?.initialized;
|
|
74
|
+
});
|
|
75
|
+
if (uninitializedDeps.length > 0) {
|
|
76
|
+
throw new Error(`Cannot initialize "${name}" - dependencies not initialized: ${uninitializedDeps.join(', ')}. ` +
|
|
77
|
+
`Initialize dependencies first.`);
|
|
78
|
+
}
|
|
79
|
+
state.initialized = true;
|
|
80
|
+
state.initializedAt = new Date();
|
|
81
|
+
logger.debug(`Initialized service: ${name}`);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if a service is initialized.
|
|
85
|
+
*/
|
|
86
|
+
isInitialized(name) {
|
|
87
|
+
return this.services.get(name)?.initialized ?? false;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Require a service to be initialized, throwing if not.
|
|
91
|
+
* Use this to guard service methods.
|
|
92
|
+
*/
|
|
93
|
+
requireInitialized(name) {
|
|
94
|
+
const state = this.services.get(name);
|
|
95
|
+
if (!state) {
|
|
96
|
+
throw new Error(`Service "${name}" is not registered. ` +
|
|
97
|
+
`This may indicate a missing service or a typo in the service name.`);
|
|
98
|
+
}
|
|
99
|
+
if (!state.initialized) {
|
|
100
|
+
const deps = state.dependsOn.length > 0
|
|
101
|
+
? ` (depends on: ${state.dependsOn.join(', ')})`
|
|
102
|
+
: '';
|
|
103
|
+
throw new Error(`Service "${name}" is not initialized${deps}. ` +
|
|
104
|
+
`Ensure initialize() is called during server startup.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get status of all registered services.
|
|
109
|
+
* Useful for debugging and health checks.
|
|
110
|
+
*/
|
|
111
|
+
getStatus() {
|
|
112
|
+
const status = {};
|
|
113
|
+
for (const [name, state] of this.services) {
|
|
114
|
+
status[name] = {
|
|
115
|
+
initialized: state.initialized,
|
|
116
|
+
dependsOn: state.dependsOn,
|
|
117
|
+
initializedAt: state.initializedAt?.toISOString()
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return status;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get list of services that aren't initialized yet.
|
|
124
|
+
*/
|
|
125
|
+
getUninitializedServices() {
|
|
126
|
+
return Array.from(this.services.entries())
|
|
127
|
+
.filter(([_, state]) => !state.initialized)
|
|
128
|
+
.map(([name]) => name);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Verify all registered services are initialized.
|
|
132
|
+
* Throws if any service is not initialized.
|
|
133
|
+
*/
|
|
134
|
+
requireAllInitialized() {
|
|
135
|
+
const uninitialized = this.getUninitializedServices();
|
|
136
|
+
if (uninitialized.length > 0) {
|
|
137
|
+
throw new Error(`The following services are not initialized: ${uninitialized.join(', ')}. ` +
|
|
138
|
+
`Ensure all services complete initialization during startup.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Reset all services (for testing).
|
|
143
|
+
*/
|
|
144
|
+
reset() {
|
|
145
|
+
this.services.clear();
|
|
146
|
+
logger.debug('Service registry reset');
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Unregister a specific service (for testing).
|
|
150
|
+
*/
|
|
151
|
+
unregister(name) {
|
|
152
|
+
this.services.delete(name);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Singleton instance
|
|
156
|
+
export const serviceRegistry = new ServiceRegistry();
|
|
157
|
+
// Convenience re-exports for common operations
|
|
158
|
+
export const registerService = (name, options) => serviceRegistry.register(name, options);
|
|
159
|
+
export const markServiceInitialized = (name) => serviceRegistry.markInitialized(name);
|
|
160
|
+
export const requireServiceInitialized = (name) => serviceRegistry.requireInitialized(name);
|
|
161
|
+
export const isServiceInitialized = (name) => serviceRegistry.isInitialized(name);
|
|
162
|
+
//# sourceMappingURL=service-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../../../src/services/infrastructure/service-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Response } from 'express';
|
|
2
|
+
import { StreamEvent } from '../../types/index.js';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
/**
|
|
5
|
+
* Manages streaming connections to multiple clients
|
|
6
|
+
*/
|
|
7
|
+
export declare class StreamManager extends EventEmitter {
|
|
8
|
+
private clients;
|
|
9
|
+
private logger;
|
|
10
|
+
private heartbeatInterval?;
|
|
11
|
+
private eventBuffers;
|
|
12
|
+
private readonly EVENT_BUFFER_WINDOW_MS;
|
|
13
|
+
private readonly MAX_BUFFERED_EVENTS;
|
|
14
|
+
private readonly HEARTBEAT_INTERVAL_MS;
|
|
15
|
+
constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Start buffering events for a session.
|
|
18
|
+
* Call this when a session is created, before any clients connect.
|
|
19
|
+
* Events will be replayed when the first client connects.
|
|
20
|
+
*/
|
|
21
|
+
startBuffering(streamingId: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Stop buffering events for a session and discard any buffered events.
|
|
24
|
+
* Called automatically after the buffer window expires.
|
|
25
|
+
*/
|
|
26
|
+
private stopBuffering;
|
|
27
|
+
/**
|
|
28
|
+
* Replay buffered events to a client and stop buffering.
|
|
29
|
+
* Called when the first client connects.
|
|
30
|
+
*/
|
|
31
|
+
private replayBufferedEvents;
|
|
32
|
+
/**
|
|
33
|
+
* Add a client to receive stream updates
|
|
34
|
+
*/
|
|
35
|
+
addClient(streamingId: string, res: Response): void;
|
|
36
|
+
/**
|
|
37
|
+
* Remove a client connection
|
|
38
|
+
*/
|
|
39
|
+
removeClient(streamingId: string, res: Response): void;
|
|
40
|
+
/**
|
|
41
|
+
* Broadcast an event to all clients watching a session
|
|
42
|
+
*/
|
|
43
|
+
broadcast(streamingId: string, event: StreamEvent): void;
|
|
44
|
+
/**
|
|
45
|
+
* Send an SSE event to a specific client
|
|
46
|
+
*/
|
|
47
|
+
private sendSSEEvent;
|
|
48
|
+
/**
|
|
49
|
+
* Send SSE heartbeat (comment) to keep connection alive
|
|
50
|
+
*/
|
|
51
|
+
private sendHeartbeat;
|
|
52
|
+
/**
|
|
53
|
+
* Get number of clients connected to a session
|
|
54
|
+
*/
|
|
55
|
+
getClientCount(streamingId: string): number;
|
|
56
|
+
/**
|
|
57
|
+
* Get all active sessions
|
|
58
|
+
*/
|
|
59
|
+
getActiveSessions(): string[];
|
|
60
|
+
/**
|
|
61
|
+
* Close all connections for a session
|
|
62
|
+
*/
|
|
63
|
+
closeSession(streamingId: string): void;
|
|
64
|
+
/**
|
|
65
|
+
* Get total number of clients across all sessions
|
|
66
|
+
*/
|
|
67
|
+
getTotalClientCount(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Clean up orphaned sessions that don't have an active Claude process.
|
|
70
|
+
* Call this with a set of active streamingIds to close any sessions not in that set.
|
|
71
|
+
*/
|
|
72
|
+
cleanupOrphanedSessions(activeStreamingIds: Set<string>): number;
|
|
73
|
+
/**
|
|
74
|
+
* Disconnect all clients from all sessions
|
|
75
|
+
*/
|
|
76
|
+
disconnectAll(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Start periodic heartbeat to keep SSE connections alive
|
|
79
|
+
* Also prunes stale/dead clients that failed to disconnect properly
|
|
80
|
+
*/
|
|
81
|
+
private startHeartbeat;
|
|
82
|
+
/**
|
|
83
|
+
* Stop periodic heartbeat
|
|
84
|
+
*/
|
|
85
|
+
private stopHeartbeat;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=stream-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-manager.d.ts","sourceRoot":"","sources":["../../../src/services/infrastructure/stream-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAgBtC;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAC,CAAiB;IAG3C,OAAO,CAAC,YAAY,CAAuC;IAI3D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAQ;IAG/C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAK3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;;IAO/C;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAsBzC;;;OAGG;IACH,OAAO,CAAC,aAAa;IAiBrB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI;IA2EnD;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI;IAyBtD;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAwExD;;OAEG;IACH,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI3C;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAwCvC;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAQ7B;;;OAGG;IACH,uBAAuB,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM;IAuBhE;;OAEG;IACH,aAAa,IAAI,IAAI;IAYrB;;;OAGG;IACH,OAAO,CAAC,cAAc;IA2CtB;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB"}
|