@ginkoai/cli 1.0.0 → 1.4.1
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/README.md +19 -0
- package/dist/analysis/project-analyzer.d.ts.map +1 -1
- package/dist/analysis/project-analyzer.js +68 -4
- package/dist/analysis/project-analyzer.js.map +1 -1
- package/dist/commands/architecture/architecture-pipeline-enhanced.d.ts.map +1 -1
- package/dist/commands/architecture/architecture-pipeline-enhanced.js +10 -6
- package/dist/commands/architecture/architecture-pipeline-enhanced.js.map +1 -1
- package/dist/commands/backlog/base.d.ts.map +1 -1
- package/dist/commands/backlog/base.js +3 -0
- package/dist/commands/backlog/base.js.map +1 -1
- package/dist/commands/backlog/create.js +20 -20
- package/dist/commands/backlog/create.js.map +1 -1
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +6 -1
- package/dist/commands/backlog/index.js.map +1 -1
- package/dist/commands/changelog/changelog-reflection.d.ts.map +1 -1
- package/dist/commands/changelog/changelog-reflection.js +7 -3
- package/dist/commands/changelog/changelog-reflection.js.map +1 -1
- package/dist/commands/charter.d.ts +28 -0
- package/dist/commands/charter.d.ts.map +1 -0
- package/dist/commands/charter.js +434 -0
- package/dist/commands/charter.js.map +1 -0
- package/dist/commands/documentation/documentation-pipeline.d.ts.map +1 -1
- package/dist/commands/documentation/documentation-pipeline.js +15 -7
- package/dist/commands/documentation/documentation-pipeline.js.map +1 -1
- package/dist/commands/git/git-pipeline.d.ts.map +1 -1
- package/dist/commands/git/git-pipeline.js +3 -2
- package/dist/commands/git/git-pipeline.js.map +1 -1
- package/dist/commands/graph/api-client.d.ts +212 -0
- package/dist/commands/graph/api-client.d.ts.map +1 -0
- package/dist/commands/graph/api-client.js +143 -0
- package/dist/commands/graph/api-client.js.map +1 -0
- package/dist/commands/graph/config.d.ts +82 -0
- package/dist/commands/graph/config.d.ts.map +1 -0
- package/dist/commands/graph/config.js +113 -0
- package/dist/commands/graph/config.js.map +1 -0
- package/dist/commands/graph/explore.d.ts +19 -0
- package/dist/commands/graph/explore.d.ts.map +1 -0
- package/dist/commands/graph/explore.js +117 -0
- package/dist/commands/graph/explore.js.map +1 -0
- package/dist/commands/graph/index.d.ts +17 -0
- package/dist/commands/graph/index.d.ts.map +1 -0
- package/dist/commands/graph/index.js +104 -0
- package/dist/commands/graph/index.js.map +1 -0
- package/dist/commands/graph/init.d.ts +21 -0
- package/dist/commands/graph/init.d.ts.map +1 -0
- package/dist/commands/graph/init.js +173 -0
- package/dist/commands/graph/init.js.map +1 -0
- package/dist/commands/graph/load.d.ts +21 -0
- package/dist/commands/graph/load.d.ts.map +1 -0
- package/dist/commands/graph/load.js +224 -0
- package/dist/commands/graph/load.js.map +1 -0
- package/dist/commands/graph/query.d.ts +23 -0
- package/dist/commands/graph/query.d.ts.map +1 -0
- package/dist/commands/graph/query.js +145 -0
- package/dist/commands/graph/query.js.map +1 -0
- package/dist/commands/graph/status.d.ts +15 -0
- package/dist/commands/graph/status.d.ts.map +1 -0
- package/dist/commands/graph/status.js +88 -0
- package/dist/commands/graph/status.js.map +1 -0
- package/dist/commands/handoff.d.ts +14 -5
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +84 -142
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +88 -41
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge/create.d.ts +24 -0
- package/dist/commands/knowledge/create.d.ts.map +1 -0
- package/dist/commands/knowledge/create.js +180 -0
- package/dist/commands/knowledge/create.js.map +1 -0
- package/dist/commands/knowledge/graph.d.ts +21 -0
- package/dist/commands/knowledge/graph.d.ts.map +1 -0
- package/dist/commands/knowledge/graph.js +199 -0
- package/dist/commands/knowledge/graph.js.map +1 -0
- package/dist/commands/knowledge/index.d.ts +25 -0
- package/dist/commands/knowledge/index.d.ts.map +1 -0
- package/dist/commands/knowledge/index.js +121 -0
- package/dist/commands/knowledge/index.js.map +1 -0
- package/dist/commands/knowledge/search.d.ts +23 -0
- package/dist/commands/knowledge/search.d.ts.map +1 -0
- package/dist/commands/knowledge/search.js +157 -0
- package/dist/commands/knowledge/search.js.map +1 -0
- package/dist/commands/knowledge/sync.d.ts +28 -0
- package/dist/commands/knowledge/sync.d.ts.map +1 -0
- package/dist/commands/knowledge/sync.js +251 -0
- package/dist/commands/knowledge/sync.js.map +1 -0
- package/dist/commands/log.d.ts +32 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +632 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.d.ts +27 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +177 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +15 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +31 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.d.ts.map +1 -0
- package/dist/commands/project/create.js +69 -0
- package/dist/commands/project/create.js.map +1 -0
- package/dist/commands/project/delete.d.ts +19 -0
- package/dist/commands/project/delete.d.ts.map +1 -0
- package/dist/commands/project/delete.js +73 -0
- package/dist/commands/project/delete.js.map +1 -0
- package/dist/commands/project/index.d.ts +22 -0
- package/dist/commands/project/index.d.ts.map +1 -0
- package/dist/commands/project/index.js +134 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/project/info.d.ts +15 -0
- package/dist/commands/project/info.d.ts.map +1 -0
- package/dist/commands/project/info.js +92 -0
- package/dist/commands/project/info.js.map +1 -0
- package/dist/commands/project/list.d.ts +20 -0
- package/dist/commands/project/list.d.ts.map +1 -0
- package/dist/commands/project/list.js +82 -0
- package/dist/commands/project/list.js.map +1 -0
- package/dist/commands/project/members.d.ts +27 -0
- package/dist/commands/project/members.d.ts.map +1 -0
- package/dist/commands/project/members.js +140 -0
- package/dist/commands/project/members.js.map +1 -0
- package/dist/commands/project/update.d.ts +24 -0
- package/dist/commands/project/update.d.ts.map +1 -0
- package/dist/commands/project/update.js +83 -0
- package/dist/commands/project/update.js.map +1 -0
- package/dist/commands/reflect.js +0 -3
- package/dist/commands/reflect.js.map +1 -1
- package/dist/commands/ship.d.ts +3 -1
- package/dist/commands/ship.d.ts.map +1 -1
- package/dist/commands/ship.js +100 -9
- package/dist/commands/ship.js.map +1 -1
- package/dist/commands/start/index.d.ts.map +1 -1
- package/dist/commands/start/index.js +5 -3
- package/dist/commands/start/index.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts +2 -1
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +265 -43
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +41 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/team/create.d.ts +15 -0
- package/dist/commands/team/create.d.ts.map +1 -0
- package/dist/commands/team/create.js +48 -0
- package/dist/commands/team/create.js.map +1 -0
- package/dist/commands/team/index.d.ts +22 -0
- package/dist/commands/team/index.d.ts.map +1 -0
- package/dist/commands/team/index.js +109 -0
- package/dist/commands/team/index.js.map +1 -0
- package/dist/commands/team/list.d.ts +15 -0
- package/dist/commands/team/list.d.ts.map +1 -0
- package/dist/commands/team/list.js +67 -0
- package/dist/commands/team/list.js.map +1 -0
- package/dist/commands/team/members.d.ts +27 -0
- package/dist/commands/team/members.d.ts.map +1 -0
- package/dist/commands/team/members.js +135 -0
- package/dist/commands/team/members.js.map +1 -0
- package/dist/commands/team/projects.d.ts +19 -0
- package/dist/commands/team/projects.d.ts.map +1 -0
- package/dist/commands/team/projects.js +107 -0
- package/dist/commands/team/projects.js.map +1 -0
- package/dist/commands/team.d.ts +22 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +238 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/testing/testing-pipeline-enhanced.d.ts.map +1 -1
- package/dist/commands/testing/testing-pipeline-enhanced.js +5 -3
- package/dist/commands/testing/testing-pipeline-enhanced.js.map +1 -1
- package/dist/commands/testing/testing-pipeline.d.ts.map +1 -1
- package/dist/commands/testing/testing-pipeline.js +5 -3
- package/dist/commands/testing/testing-pipeline.js.map +1 -1
- package/dist/commands/whoami.d.ts +15 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +38 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/reflection-pattern.d.ts +1 -1
- package/dist/core/reflection-pattern.d.ts.map +1 -1
- package/dist/core/reflection-pattern.js +2 -12
- package/dist/core/reflection-pattern.js.map +1 -1
- package/dist/core/session-log-manager.d.ts +44 -4
- package/dist/core/session-log-manager.d.ts.map +1 -1
- package/dist/core/session-log-manager.js +132 -31
- package/dist/core/session-log-manager.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +116 -17
- package/dist/index.js.map +1 -1
- package/dist/lib/api/projects-client.d.ts +119 -0
- package/dist/lib/api/projects-client.d.ts.map +1 -0
- package/dist/lib/api/projects-client.js +125 -0
- package/dist/lib/api/projects-client.js.map +1 -0
- package/dist/lib/api/teams-client.d.ts +73 -0
- package/dist/lib/api/teams-client.d.ts.map +1 -0
- package/dist/lib/api/teams-client.js +68 -0
- package/dist/lib/api/teams-client.js.map +1 -0
- package/dist/lib/charter/charter-editor.d.ts +60 -0
- package/dist/lib/charter/charter-editor.d.ts.map +1 -0
- package/dist/lib/charter/charter-editor.js +559 -0
- package/dist/lib/charter/charter-editor.js.map +1 -0
- package/dist/lib/charter/charter-storage.d.ts +92 -0
- package/dist/lib/charter/charter-storage.d.ts.map +1 -0
- package/dist/lib/charter/charter-storage.js +501 -0
- package/dist/lib/charter/charter-storage.js.map +1 -0
- package/dist/lib/charter/charter-synthesizer.d.ts +94 -0
- package/dist/lib/charter/charter-synthesizer.d.ts.map +1 -0
- package/dist/lib/charter/charter-synthesizer.js +521 -0
- package/dist/lib/charter/charter-synthesizer.js.map +1 -0
- package/dist/lib/charter/charter-versioning.d.ts +57 -0
- package/dist/lib/charter/charter-versioning.d.ts.map +1 -0
- package/dist/lib/charter/charter-versioning.js +283 -0
- package/dist/lib/charter/charter-versioning.js.map +1 -0
- package/dist/lib/charter/confidence-scorer.d.ts +263 -0
- package/dist/lib/charter/confidence-scorer.d.ts.map +1 -0
- package/dist/lib/charter/confidence-scorer.js +737 -0
- package/dist/lib/charter/confidence-scorer.js.map +1 -0
- package/dist/lib/charter/conversation-context.d.ts +99 -0
- package/dist/lib/charter/conversation-context.d.ts.map +1 -0
- package/dist/lib/charter/conversation-context.js +297 -0
- package/dist/lib/charter/conversation-context.js.map +1 -0
- package/dist/lib/charter/conversation-facilitator.d.ts +117 -0
- package/dist/lib/charter/conversation-facilitator.d.ts.map +1 -0
- package/dist/lib/charter/conversation-facilitator.js +360 -0
- package/dist/lib/charter/conversation-facilitator.js.map +1 -0
- package/dist/lib/charter/question-templates.d.ts +82 -0
- package/dist/lib/charter/question-templates.d.ts.map +1 -0
- package/dist/lib/charter/question-templates.js +355 -0
- package/dist/lib/charter/question-templates.js.map +1 -0
- package/dist/lib/charter/signal-detection.d.ts +49 -0
- package/dist/lib/charter/signal-detection.d.ts.map +1 -0
- package/dist/lib/charter/signal-detection.js +338 -0
- package/dist/lib/charter/signal-detection.js.map +1 -0
- package/dist/lib/context-loader-events.d.ts +111 -0
- package/dist/lib/context-loader-events.d.ts.map +1 -0
- package/dist/lib/context-loader-events.js +475 -0
- package/dist/lib/context-loader-events.js.map +1 -0
- package/dist/lib/event-logger.d.ts +64 -0
- package/dist/lib/event-logger.d.ts.map +1 -0
- package/dist/lib/event-logger.js +197 -0
- package/dist/lib/event-logger.js.map +1 -0
- package/dist/lib/event-queue.d.ts +104 -0
- package/dist/lib/event-queue.d.ts.map +1 -0
- package/dist/lib/event-queue.js +274 -0
- package/dist/lib/event-queue.js.map +1 -0
- package/dist/lib/session-cursor.d.ts +80 -0
- package/dist/lib/session-cursor.d.ts.map +1 -0
- package/dist/lib/session-cursor.js +250 -0
- package/dist/lib/session-cursor.js.map +1 -0
- package/dist/lib/sync/conflict-detector.d.ts +41 -0
- package/dist/lib/sync/conflict-detector.d.ts.map +1 -0
- package/dist/lib/sync/conflict-detector.js +124 -0
- package/dist/lib/sync/conflict-detector.js.map +1 -0
- package/dist/lib/sync/logger.d.ts +89 -0
- package/dist/lib/sync/logger.d.ts.map +1 -0
- package/dist/lib/sync/logger.js +202 -0
- package/dist/lib/sync/logger.js.map +1 -0
- package/dist/lib/sync/parser.d.ts +32 -0
- package/dist/lib/sync/parser.d.ts.map +1 -0
- package/dist/lib/sync/parser.js +180 -0
- package/dist/lib/sync/parser.js.map +1 -0
- package/dist/lib/sync/scanner.d.ts +34 -0
- package/dist/lib/sync/scanner.d.ts.map +1 -0
- package/dist/lib/sync/scanner.js +97 -0
- package/dist/lib/sync/scanner.js.map +1 -0
- package/dist/lib/sync/uploader.d.ts +33 -0
- package/dist/lib/sync/uploader.d.ts.map +1 -0
- package/dist/lib/sync/uploader.js +188 -0
- package/dist/lib/sync/uploader.js.map +1 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.d.ts +77 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.d.ts.map +1 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.js +178 -0
- package/dist/lib/write-dispatcher/adapters/graph-adapter.js.map +1 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.d.ts +133 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.d.ts.map +1 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.js +324 -0
- package/dist/lib/write-dispatcher/adapters/local-adapter.js.map +1 -0
- package/dist/lib/write-dispatcher/write-dispatcher.d.ts +151 -0
- package/dist/lib/write-dispatcher/write-dispatcher.d.ts.map +1 -0
- package/dist/lib/write-dispatcher/write-dispatcher.js +197 -0
- package/dist/lib/write-dispatcher/write-dispatcher.js.map +1 -0
- package/dist/types/charter.d.ts +330 -0
- package/dist/types/charter.d.ts.map +1 -0
- package/dist/types/charter.js +76 -0
- package/dist/types/charter.js.map +1 -0
- package/dist/types/config.d.ts +65 -17
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +50 -21
- package/dist/types/config.js.map +1 -1
- package/dist/utils/api-client.d.ts +36 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +97 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/auth-storage.d.ts +56 -0
- package/dist/utils/auth-storage.d.ts.map +1 -0
- package/dist/utils/auth-storage.js +133 -0
- package/dist/utils/auth-storage.js.map +1 -0
- package/dist/utils/cleanup.d.ts +21 -0
- package/dist/utils/cleanup.d.ts.map +1 -0
- package/dist/utils/cleanup.js +122 -0
- package/dist/utils/cleanup.js.map +1 -0
- package/dist/utils/config-loader.d.ts +76 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +269 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/context-loader.d.ts +154 -0
- package/dist/utils/context-loader.d.ts.map +1 -0
- package/dist/utils/context-loader.js +411 -0
- package/dist/utils/context-loader.js.map +1 -0
- package/dist/utils/dispatcher-logger.d.ts +30 -0
- package/dist/utils/dispatcher-logger.d.ts.map +1 -0
- package/dist/utils/dispatcher-logger.js +128 -0
- package/dist/utils/dispatcher-logger.js.map +1 -0
- package/dist/utils/ginko-root.d.ts +3 -2
- package/dist/utils/ginko-root.d.ts.map +1 -1
- package/dist/utils/ginko-root.js +35 -2
- package/dist/utils/ginko-root.js.map +1 -1
- package/dist/utils/helpers.d.ts +1 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +3 -0
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/log-quality.d.ts +55 -0
- package/dist/utils/log-quality.d.ts.map +1 -0
- package/dist/utils/log-quality.js +297 -0
- package/dist/utils/log-quality.js.map +1 -0
- package/dist/utils/reference-parser.d.ts +164 -0
- package/dist/utils/reference-parser.d.ts.map +1 -0
- package/dist/utils/reference-parser.js +363 -0
- package/dist/utils/reference-parser.js.map +1 -0
- package/dist/utils/synthesis.d.ts +180 -0
- package/dist/utils/synthesis.d.ts.map +1 -0
- package/dist/utils/synthesis.js +724 -0
- package/dist/utils/synthesis.js.map +1 -0
- package/dist/utils/team-awareness.d.ts +127 -0
- package/dist/utils/team-awareness.d.ts.map +1 -0
- package/dist/utils/team-awareness.js +385 -0
- package/dist/utils/team-awareness.js.map +1 -0
- package/package.json +6 -4
- package/dist/commands/handoff/handoff-reflection-pipeline.d.ts +0 -106
- package/dist/commands/handoff/handoff-reflection-pipeline.d.ts.map +0 -1
- package/dist/commands/handoff/handoff-reflection-pipeline.js +0 -534
- package/dist/commands/handoff/handoff-reflection-pipeline.js.map +0 -1
- package/dist/commands/handoff/handoff-save.d.ts +0 -16
- package/dist/commands/handoff/handoff-save.d.ts.map +0 -1
- package/dist/commands/handoff/handoff-save.js +0 -72
- package/dist/commands/handoff/handoff-save.js.map +0 -1
- package/dist/commands/handoff/index.d.ts +0 -19
- package/dist/commands/handoff/index.d.ts.map +0 -1
- package/dist/commands/handoff/index.js +0 -55
- package/dist/commands/handoff/index.js.map +0 -1
- package/dist/commands/handoff-ai-orig.d.ts +0 -27
- package/dist/commands/handoff-ai-orig.d.ts.map +0 -1
- package/dist/commands/handoff-ai-orig.js +0 -405
- package/dist/commands/handoff-ai-orig.js.map +0 -1
- package/dist/commands/handoff-ai.d.ts +0 -27
- package/dist/commands/handoff-ai.d.ts.map +0 -1
- package/dist/commands/handoff-ai.js +0 -405
- package/dist/commands/handoff-ai.js.map +0 -1
- package/dist/commands/handoff-enhanced-orig.d.ts +0 -25
- package/dist/commands/handoff-enhanced-orig.d.ts.map +0 -1
- package/dist/commands/handoff-enhanced-orig.js +0 -349
- package/dist/commands/handoff-enhanced-orig.js.map +0 -1
- package/dist/commands/handoff-enhanced.d.ts +0 -25
- package/dist/commands/handoff-enhanced.d.ts.map +0 -1
- package/dist/commands/handoff-enhanced.js +0 -349
- package/dist/commands/handoff-enhanced.js.map +0 -1
- package/dist/commands/handoff-orig.d.ts +0 -10
- package/dist/commands/handoff-orig.d.ts.map +0 -1
- package/dist/commands/handoff-orig.js +0 -167
- package/dist/commands/handoff-orig.js.map +0 -1
- package/dist/commands/init-enhanced.d.ts +0 -20
- package/dist/commands/init-enhanced.d.ts.map +0 -1
- package/dist/commands/init-enhanced.js +0 -430
- package/dist/commands/init-enhanced.js.map +0 -1
- package/dist/commands/prd/prd-reflection-enhanced.d.ts +0 -63
- package/dist/commands/prd/prd-reflection-enhanced.d.ts.map +0 -1
- package/dist/commands/prd/prd-reflection-enhanced.js +0 -310
- package/dist/commands/prd/prd-reflection-enhanced.js.map +0 -1
- package/dist/commands/start-enhanced.d.ts +0 -19
- package/dist/commands/start-enhanced.d.ts.map +0 -1
- package/dist/commands/start-enhanced.js +0 -434
- package/dist/commands/start-enhanced.js.map +0 -1
- package/dist/commands/start.d.ts +0 -10
- package/dist/commands/start.d.ts.map +0 -1
- package/dist/commands/start.js +0 -119
- package/dist/commands/start.js.map +0 -1
- package/dist/core/config/config-aware-reflection.d.ts +0 -37
- package/dist/core/config/config-aware-reflection.d.ts.map +0 -1
- package/dist/core/config/config-aware-reflection.js +0 -97
- package/dist/core/config/config-aware-reflection.js.map +0 -1
- package/dist/core/config/config-loader.d.ts +0 -154
- package/dist/core/config/config-loader.d.ts.map +0 -1
- package/dist/core/config/config-loader.js +0 -424
- package/dist/core/config/config-loader.js.map +0 -1
- package/dist/core/config/config-migrator.d.ts +0 -150
- package/dist/core/config/config-migrator.d.ts.map +0 -1
- package/dist/core/config/config-migrator.js +0 -423
- package/dist/core/config/config-migrator.js.map +0 -1
- package/dist/core/config/config-schema.d.ts +0 -276
- package/dist/core/config/config-schema.d.ts.map +0 -1
- package/dist/core/config/config-schema.js +0 -277
- package/dist/core/config/config-schema.js.map +0 -1
- package/dist/core/config/index.d.ts +0 -260
- package/dist/core/config/index.d.ts.map +0 -1
- package/dist/core/config/index.js +0 -283
- package/dist/core/config/index.js.map +0 -1
- package/dist/core/config/interactive-config.d.ts +0 -76
- package/dist/core/config/interactive-config.d.ts.map +0 -1
- package/dist/core/config/interactive-config.js +0 -315
- package/dist/core/config/interactive-config.js.map +0 -1
- package/dist/core/config/path-config.d.ts +0 -121
- package/dist/core/config/path-config.d.ts.map +0 -1
- package/dist/core/config/path-config.js +0 -210
- package/dist/core/config/path-config.js.map +0 -1
- package/dist/core/config/path-resolver.d.ts +0 -151
- package/dist/core/config/path-resolver.d.ts.map +0 -1
- package/dist/core/config/path-resolver.js +0 -343
- package/dist/core/config/path-resolver.js.map +0 -1
- package/dist/core/config/project-detector.d.ts +0 -58
- package/dist/core/config/project-detector.d.ts.map +0 -1
- package/dist/core/config/project-detector.js +0 -310
- package/dist/core/config/project-detector.js.map +0 -1
- package/dist/core/config-backup/config-aware-reflection.d.ts +0 -37
- package/dist/core/config-backup/config-aware-reflection.d.ts.map +0 -1
- package/dist/core/config-backup/config-aware-reflection.js +0 -97
- package/dist/core/config-backup/config-aware-reflection.js.map +0 -1
- package/dist/core/config-backup/config-loader.d.ts +0 -71
- package/dist/core/config-backup/config-loader.d.ts.map +0 -1
- package/dist/core/config-backup/config-loader.js +0 -288
- package/dist/core/config-backup/config-loader.js.map +0 -1
- package/dist/core/config-backup/interactive-config.d.ts +0 -76
- package/dist/core/config-backup/interactive-config.d.ts.map +0 -1
- package/dist/core/config-backup/interactive-config.js +0 -315
- package/dist/core/config-backup/interactive-config.js.map +0 -1
- package/dist/core/config-backup/path-config.d.ts +0 -121
- package/dist/core/config-backup/path-config.d.ts.map +0 -1
- package/dist/core/config-backup/path-config.js +0 -210
- package/dist/core/config-backup/path-config.js.map +0 -1
- package/dist/core/config-backup/project-detector.d.ts +0 -58
- package/dist/core/config-backup/project-detector.d.ts.map +0 -1
- package/dist/core/config-backup/project-detector.js +0 -310
- package/dist/core/config-backup/project-detector.js.map +0 -1
- package/dist/core/documents/document-manager.d.ts +0 -97
- package/dist/core/documents/document-manager.d.ts.map +0 -1
- package/dist/core/documents/document-manager.js +0 -441
- package/dist/core/documents/document-manager.js.map +0 -1
- package/dist/core/documents/document-migrator.d.ts +0 -138
- package/dist/core/documents/document-migrator.d.ts.map +0 -1
- package/dist/core/documents/document-migrator.js +0 -349
- package/dist/core/documents/document-migrator.js.map +0 -1
- package/dist/core/documents/document-namer.d.ts +0 -111
- package/dist/core/documents/document-namer.d.ts.map +0 -1
- package/dist/core/documents/document-namer.js +0 -225
- package/dist/core/documents/document-namer.js.map +0 -1
- package/dist/core/documents/examples.d.ts +0 -74
- package/dist/core/documents/examples.d.ts.map +0 -1
- package/dist/core/documents/examples.js +0 -273
- package/dist/core/documents/examples.js.map +0 -1
- package/dist/core/documents/file-system.d.ts +0 -93
- package/dist/core/documents/file-system.d.ts.map +0 -1
- package/dist/core/documents/file-system.js +0 -432
- package/dist/core/documents/file-system.js.map +0 -1
- package/dist/core/documents/index.d.ts +0 -97
- package/dist/core/documents/index.d.ts.map +0 -1
- package/dist/core/documents/index.js +0 -119
- package/dist/core/documents/index.js.map +0 -1
- package/dist/core/documents/markdown-processor.d.ts +0 -84
- package/dist/core/documents/markdown-processor.d.ts.map +0 -1
- package/dist/core/documents/markdown-processor.js +0 -302
- package/dist/core/documents/markdown-processor.js.map +0 -1
- package/dist/core/documents/sequence-manager.d.ts +0 -107
- package/dist/core/documents/sequence-manager.d.ts.map +0 -1
- package/dist/core/documents/sequence-manager.js +0 -246
- package/dist/core/documents/sequence-manager.js.map +0 -1
- package/dist/core/documents/template-engine.d.ts +0 -101
- package/dist/core/documents/template-engine.d.ts.map +0 -1
- package/dist/core/documents/template-engine.js +0 -440
- package/dist/core/documents/template-engine.js.map +0 -1
- package/dist/core/platform/hook-migration.d.ts +0 -73
- package/dist/core/platform/hook-migration.d.ts.map +0 -1
- package/dist/core/platform/hook-migration.js +0 -339
- package/dist/core/platform/hook-migration.js.map +0 -1
- package/dist/core/platform/hook-migrator.d.ts +0 -49
- package/dist/core/platform/hook-migrator.d.ts.map +0 -1
- package/dist/core/platform/hook-migrator.js +0 -305
- package/dist/core/platform/hook-migrator.js.map +0 -1
- package/dist/core/platform/path-resolver.d.ts +0 -120
- package/dist/core/platform/path-resolver.d.ts.map +0 -1
- package/dist/core/platform/path-resolver.js +0 -339
- package/dist/core/platform/path-resolver.js.map +0 -1
- package/dist/core/platform/platform-templates.d.ts +0 -62
- package/dist/core/platform/platform-templates.d.ts.map +0 -1
- package/dist/core/platform/platform-templates.js +0 -364
- package/dist/core/platform/platform-templates.js.map +0 -1
- package/dist/core/pressure-monitor.d.ts +0 -76
- package/dist/core/pressure-monitor.d.ts.map +0 -1
- package/dist/core/pressure-monitor.js +0 -156
- package/dist/core/pressure-monitor.js.map +0 -1
- package/dist/core/validators/git-validator.test.d.ts +0 -12
- package/dist/core/validators/git-validator.test.d.ts.map +0 -1
- package/dist/core/validators/git-validator.test.js +0 -40
- package/dist/core/validators/git-validator.test.js.map +0 -1
- package/dist/core/validators/temp_index.d.ts +0 -56
- package/dist/core/validators/temp_index.d.ts.map +0 -1
- package/dist/core/validators/temp_index.js +0 -94
- package/dist/core/validators/temp_index.js.map +0 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-11-04
|
|
5
|
+
* @tags: [event-logging, dual-write, adr-043, session-events]
|
|
6
|
+
* @related: [event-queue.ts, ../commands/log.ts, ../utils/session-logger.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [fs-extra, uuid]
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'fs-extra';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
14
|
+
import { getGinkoDir, getUserEmail, getProjectRoot } from '../utils/helpers.js';
|
|
15
|
+
import { execSync } from 'child_process';
|
|
16
|
+
/**
|
|
17
|
+
* Get current event context (user, org, project)
|
|
18
|
+
*/
|
|
19
|
+
async function getEventContext() {
|
|
20
|
+
const userEmail = await getUserEmail();
|
|
21
|
+
const projectRoot = await getProjectRoot();
|
|
22
|
+
const projectName = path.basename(projectRoot);
|
|
23
|
+
// Get current branch
|
|
24
|
+
let branch = 'main';
|
|
25
|
+
try {
|
|
26
|
+
branch = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
27
|
+
encoding: 'utf8',
|
|
28
|
+
cwd: projectRoot
|
|
29
|
+
}).trim();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// Not in a git repo or git not available
|
|
33
|
+
}
|
|
34
|
+
// Organization ID: extract from project path or use default
|
|
35
|
+
// Example: /Users/cnorton/Development/ginko -> "watchhill-ai"
|
|
36
|
+
const orgId = 'watchhill-ai'; // Can be enhanced to read from config
|
|
37
|
+
return {
|
|
38
|
+
user_id: userEmail,
|
|
39
|
+
organization_id: orgId,
|
|
40
|
+
project_id: projectName,
|
|
41
|
+
branch
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate unique event ID
|
|
46
|
+
*/
|
|
47
|
+
function generateEventId() {
|
|
48
|
+
const timestamp = Date.now();
|
|
49
|
+
const random = uuidv4().split('-')[0]; // Use first segment of UUID
|
|
50
|
+
return `event_${timestamp}_${random}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Capture current context pressure (placeholder for future integration)
|
|
54
|
+
*/
|
|
55
|
+
function captureContextPressure() {
|
|
56
|
+
// TODO: Integrate with actual context pressure tracking
|
|
57
|
+
// For now, return a reasonable default
|
|
58
|
+
return 0.5; // 50%
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get path to current events file (JSONL)
|
|
62
|
+
*/
|
|
63
|
+
async function getEventsFilePath() {
|
|
64
|
+
const ginkoDir = await getGinkoDir();
|
|
65
|
+
const userEmail = await getUserEmail();
|
|
66
|
+
const userSlug = userEmail.replace('@', '-at-').replace(/\./g, '-');
|
|
67
|
+
const sessionDir = path.join(ginkoDir, 'sessions', userSlug);
|
|
68
|
+
// Ensure session directory exists
|
|
69
|
+
await fs.ensureDir(sessionDir);
|
|
70
|
+
return path.join(sessionDir, 'current-events.jsonl');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Append event to local file (JSONL format)
|
|
74
|
+
*
|
|
75
|
+
* CRITICAL: This MUST succeed even if Neo4j is offline.
|
|
76
|
+
* Never block user on network issues.
|
|
77
|
+
*/
|
|
78
|
+
async function appendToLocalFile(event) {
|
|
79
|
+
try {
|
|
80
|
+
const filePath = await getEventsFilePath();
|
|
81
|
+
const eventLine = JSON.stringify(event) + '\n';
|
|
82
|
+
// Atomic append operation
|
|
83
|
+
await fs.appendFile(filePath, eventLine, 'utf8');
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
// Log error but don't propagate - we need to be resilient
|
|
87
|
+
console.error('[EventLogger] Failed to write to local file:', error instanceof Error ? error.message : String(error));
|
|
88
|
+
throw error; // Re-throw because local write MUST succeed
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Log an event with dual-write pattern
|
|
93
|
+
*
|
|
94
|
+
* Pattern (ADR-043):
|
|
95
|
+
* 1. Write to local file immediately (blocking, must succeed)
|
|
96
|
+
* 2. Add to async queue for Neo4j sync (non-blocking)
|
|
97
|
+
* 3. Return immediately (don't wait for sync)
|
|
98
|
+
*
|
|
99
|
+
* @param entry - Event entry data
|
|
100
|
+
* @returns Promise<Event> - The logged event with metadata
|
|
101
|
+
*/
|
|
102
|
+
export async function logEvent(entry) {
|
|
103
|
+
// 1. Gather context
|
|
104
|
+
const context = await getEventContext();
|
|
105
|
+
const pressure = captureContextPressure();
|
|
106
|
+
// 2. Create event with metadata
|
|
107
|
+
const event = {
|
|
108
|
+
id: generateEventId(),
|
|
109
|
+
user_id: context.user_id,
|
|
110
|
+
organization_id: context.organization_id,
|
|
111
|
+
project_id: context.project_id,
|
|
112
|
+
timestamp: new Date().toISOString(),
|
|
113
|
+
pressure,
|
|
114
|
+
branch: entry.branch || context.branch,
|
|
115
|
+
category: entry.category,
|
|
116
|
+
description: entry.description,
|
|
117
|
+
files: entry.files,
|
|
118
|
+
impact: entry.impact || 'medium',
|
|
119
|
+
tags: entry.tags,
|
|
120
|
+
shared: entry.shared || false,
|
|
121
|
+
commit_hash: entry.commit_hash,
|
|
122
|
+
synced_to_graph: false
|
|
123
|
+
};
|
|
124
|
+
// 3. Write to local file immediately (MUST succeed)
|
|
125
|
+
await appendToLocalFile(event);
|
|
126
|
+
// 4. Add to async queue (import lazily to avoid circular deps)
|
|
127
|
+
try {
|
|
128
|
+
const { addToQueue } = await import('./event-queue.js');
|
|
129
|
+
await addToQueue(event);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
// Queue failure is non-critical - event is persisted locally
|
|
133
|
+
console.warn('[EventLogger] Failed to add to sync queue:', error instanceof Error ? error.message : String(error));
|
|
134
|
+
}
|
|
135
|
+
return event;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Load all events from local file
|
|
139
|
+
*/
|
|
140
|
+
export async function loadEvents() {
|
|
141
|
+
try {
|
|
142
|
+
const filePath = await getEventsFilePath();
|
|
143
|
+
if (!await fs.pathExists(filePath)) {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
147
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
148
|
+
return lines.map(line => JSON.parse(line));
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error('[EventLogger] Failed to load events:', error instanceof Error ? error.message : String(error));
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Mark events as synced to graph
|
|
157
|
+
*/
|
|
158
|
+
export async function markEventsSynced(eventIds) {
|
|
159
|
+
try {
|
|
160
|
+
const events = await loadEvents();
|
|
161
|
+
const eventIdSet = new Set(eventIds);
|
|
162
|
+
// Update synced status
|
|
163
|
+
const updatedEvents = events.map(event => {
|
|
164
|
+
if (eventIdSet.has(event.id)) {
|
|
165
|
+
return { ...event, synced_to_graph: true };
|
|
166
|
+
}
|
|
167
|
+
return event;
|
|
168
|
+
});
|
|
169
|
+
// Rewrite file with updated events
|
|
170
|
+
const filePath = await getEventsFilePath();
|
|
171
|
+
const content = updatedEvents.map(e => JSON.stringify(e)).join('\n') + '\n';
|
|
172
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error('[EventLogger] Failed to mark events as synced:', error instanceof Error ? error.message : String(error));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get events that need syncing (not yet synced to graph)
|
|
180
|
+
*/
|
|
181
|
+
export async function getUnsyncedEvents() {
|
|
182
|
+
const events = await loadEvents();
|
|
183
|
+
return events.filter(event => !event.synced_to_graph);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Clear events file (for testing)
|
|
187
|
+
*/
|
|
188
|
+
export async function clearEvents() {
|
|
189
|
+
try {
|
|
190
|
+
const filePath = await getEventsFilePath();
|
|
191
|
+
await fs.writeFile(filePath, '', 'utf8');
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.error('[EventLogger] Failed to clear events:', error instanceof Error ? error.message : String(error));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=event-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-logger.js","sourceRoot":"","sources":["../../src/lib/event-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAuCzC;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE/C,qBAAqB;IACrB,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC,iCAAiC,EAAE;YACnD,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yCAAyC;IAC3C,CAAC;IAED,4DAA4D;IAC5D,8DAA8D;IAC9D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,sCAAsC;IAEpE,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,WAAW;QACvB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;IACnE,OAAO,SAAS,SAAS,IAAI,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB;IAC7B,wDAAwD;IACxD,uCAAuC;IACvC,OAAO,GAAG,CAAC,CAAC,MAAM;AACpB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE7D,kCAAkC;IAClC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE/B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAAC,KAAY;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAE/C,0BAA0B;QAC1B,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0DAA0D;QAC1D,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtH,MAAM,KAAK,CAAC,CAAC,4CAA4C;IAC3D,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAiB;IAC9C,oBAAoB;IACpB,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAE1C,gCAAgC;IAChC,MAAM,KAAK,GAAU;QACnB,EAAE,EAAE,eAAe,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ;QACR,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;QAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,eAAe,EAAE,KAAK;KACvB,CAAC;IAEF,oDAAoD;IACpD,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE/B,+DAA+D;IAC/D,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6DAA6D;QAC7D,OAAO,CAAC,IAAI,CAAC,4CAA4C,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAE3C,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEzE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9G,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAErC,uBAAuB;QACvB,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;YAC7C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5E,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1H,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-11-04
|
|
5
|
+
* @tags: [event-queue, async-sync, neo4j, adr-043]
|
|
6
|
+
* @related: [event-logger.ts, ../commands/graph/api-client.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: []
|
|
10
|
+
*/
|
|
11
|
+
import { Event } from './event-logger.js';
|
|
12
|
+
/**
|
|
13
|
+
* Event queue configuration
|
|
14
|
+
*/
|
|
15
|
+
interface QueueConfig {
|
|
16
|
+
syncIntervalMs: number;
|
|
17
|
+
syncThreshold: number;
|
|
18
|
+
maxBatchSize: number;
|
|
19
|
+
retryAttempts: number;
|
|
20
|
+
retryDelayMs: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Sync status tracking
|
|
24
|
+
*/
|
|
25
|
+
interface SyncStatus {
|
|
26
|
+
lastSyncTime: Date | null;
|
|
27
|
+
pendingCount: number;
|
|
28
|
+
totalSynced: number;
|
|
29
|
+
lastError: string | null;
|
|
30
|
+
isRunning: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Event Queue for async Neo4j synchronization
|
|
34
|
+
*
|
|
35
|
+
* Pattern (ADR-043):
|
|
36
|
+
* - Batches events for efficient sync
|
|
37
|
+
* - Triggers sync on 5-minute timer OR 5 events (whichever first)
|
|
38
|
+
* - Retries on failure with exponential backoff
|
|
39
|
+
* - Preserves events in local file on failure
|
|
40
|
+
*/
|
|
41
|
+
export declare class EventQueue {
|
|
42
|
+
private config;
|
|
43
|
+
private syncTimer;
|
|
44
|
+
private status;
|
|
45
|
+
private isShuttingDown;
|
|
46
|
+
constructor(config?: Partial<QueueConfig>);
|
|
47
|
+
/**
|
|
48
|
+
* Start the sync queue
|
|
49
|
+
*/
|
|
50
|
+
start(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Stop the sync queue
|
|
53
|
+
*/
|
|
54
|
+
stop(): void;
|
|
55
|
+
/**
|
|
56
|
+
* Add event to queue and trigger sync if threshold reached
|
|
57
|
+
*/
|
|
58
|
+
addToQueue(event: Event): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Sync queued events to Neo4j
|
|
61
|
+
*
|
|
62
|
+
* Batch syncs up to maxBatchSize events per call.
|
|
63
|
+
* Retries on failure with exponential backoff.
|
|
64
|
+
*/
|
|
65
|
+
syncToGraph(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Sync a batch of events to Neo4j graph
|
|
68
|
+
*/
|
|
69
|
+
private syncBatchToGraph;
|
|
70
|
+
/**
|
|
71
|
+
* Flush queue immediately (for handoff/shutdown)
|
|
72
|
+
*/
|
|
73
|
+
flush(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Graceful shutdown with pending sync wait
|
|
76
|
+
*/
|
|
77
|
+
shutdown(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Get current queue status
|
|
80
|
+
*/
|
|
81
|
+
getStatus(): SyncStatus;
|
|
82
|
+
/**
|
|
83
|
+
* Schedule sync if needed (called after adding to queue)
|
|
84
|
+
*/
|
|
85
|
+
scheduleSyncIfNeeded(): void;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Initialize global event queue
|
|
89
|
+
*/
|
|
90
|
+
export declare function initializeQueue(config?: Partial<QueueConfig>): EventQueue;
|
|
91
|
+
/**
|
|
92
|
+
* Get global queue instance
|
|
93
|
+
*/
|
|
94
|
+
export declare function getQueue(): EventQueue;
|
|
95
|
+
/**
|
|
96
|
+
* Add event to global queue
|
|
97
|
+
*/
|
|
98
|
+
export declare function addToQueue(event: Event): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Check if queue is initialized
|
|
101
|
+
*/
|
|
102
|
+
export declare function isQueueInitialized(): boolean;
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=event-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/lib/event-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAuC,MAAM,mBAAmB,CAAC;AAE/E;;GAEG;AACH,UAAU,WAAW;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;GAEG;AACH,UAAU,UAAU;IAClB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,MAAM,CAMZ;IACF,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAIzC;;OAEG;IACH,KAAK,IAAI,IAAI;IAyBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7C;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAgElC;;OAEG;YACW,gBAAgB;IA+B9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B;;OAEG;IACH,SAAS,IAAI,UAAU;IAIvB;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAI7B;AAOD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,UAAU,CAsBzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,UAAU,CAKrC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-11-04
|
|
5
|
+
* @tags: [event-queue, async-sync, neo4j, adr-043]
|
|
6
|
+
* @related: [event-logger.ts, ../commands/graph/api-client.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: []
|
|
10
|
+
*/
|
|
11
|
+
import { getUnsyncedEvents, markEventsSynced } from './event-logger.js';
|
|
12
|
+
const DEFAULT_CONFIG = {
|
|
13
|
+
syncIntervalMs: 5 * 60 * 1000, // 5 minutes
|
|
14
|
+
syncThreshold: 5, // 5 events
|
|
15
|
+
maxBatchSize: 20, // 20 events max
|
|
16
|
+
retryAttempts: 3, // 3 retries
|
|
17
|
+
retryDelayMs: 5000 // 5 seconds
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Event Queue for async Neo4j synchronization
|
|
21
|
+
*
|
|
22
|
+
* Pattern (ADR-043):
|
|
23
|
+
* - Batches events for efficient sync
|
|
24
|
+
* - Triggers sync on 5-minute timer OR 5 events (whichever first)
|
|
25
|
+
* - Retries on failure with exponential backoff
|
|
26
|
+
* - Preserves events in local file on failure
|
|
27
|
+
*/
|
|
28
|
+
export class EventQueue {
|
|
29
|
+
config;
|
|
30
|
+
syncTimer = null;
|
|
31
|
+
status = {
|
|
32
|
+
lastSyncTime: null,
|
|
33
|
+
pendingCount: 0,
|
|
34
|
+
totalSynced: 0,
|
|
35
|
+
lastError: null,
|
|
36
|
+
isRunning: false
|
|
37
|
+
};
|
|
38
|
+
isShuttingDown = false;
|
|
39
|
+
constructor(config) {
|
|
40
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Start the sync queue
|
|
44
|
+
*/
|
|
45
|
+
start() {
|
|
46
|
+
if (this.syncTimer) {
|
|
47
|
+
console.warn('[EventQueue] Queue already started');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log(`[EventQueue] Starting sync queue (interval: ${this.config.syncIntervalMs / 1000}s, threshold: ${this.config.syncThreshold} events)`);
|
|
51
|
+
// Schedule periodic sync
|
|
52
|
+
// Use unref() to allow process to exit if no other work pending
|
|
53
|
+
this.syncTimer = setInterval(() => {
|
|
54
|
+
this.syncToGraph().catch(error => {
|
|
55
|
+
console.error('[EventQueue] Scheduled sync failed:', error instanceof Error ? error.message : String(error));
|
|
56
|
+
});
|
|
57
|
+
}, this.config.syncIntervalMs);
|
|
58
|
+
// Don't keep process alive just for this timer
|
|
59
|
+
this.syncTimer.unref();
|
|
60
|
+
// Initial sync on start
|
|
61
|
+
this.syncToGraph().catch(error => {
|
|
62
|
+
console.warn('[EventQueue] Initial sync failed:', error instanceof Error ? error.message : String(error));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stop the sync queue
|
|
67
|
+
*/
|
|
68
|
+
stop() {
|
|
69
|
+
if (this.syncTimer) {
|
|
70
|
+
clearInterval(this.syncTimer);
|
|
71
|
+
this.syncTimer = null;
|
|
72
|
+
console.log('[EventQueue] Sync queue stopped');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Add event to queue and trigger sync if threshold reached
|
|
77
|
+
*/
|
|
78
|
+
async addToQueue(event) {
|
|
79
|
+
// Update pending count
|
|
80
|
+
const unsyncedEvents = await getUnsyncedEvents();
|
|
81
|
+
this.status.pendingCount = unsyncedEvents.length;
|
|
82
|
+
// Check if we should trigger sync based on threshold
|
|
83
|
+
if (this.status.pendingCount >= this.config.syncThreshold) {
|
|
84
|
+
console.log(`[EventQueue] Threshold reached (${this.status.pendingCount} events), triggering sync`);
|
|
85
|
+
// Fire and forget - don't block
|
|
86
|
+
this.syncToGraph().catch(error => {
|
|
87
|
+
console.warn('[EventQueue] Threshold sync failed:', error instanceof Error ? error.message : String(error));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Sync queued events to Neo4j
|
|
93
|
+
*
|
|
94
|
+
* Batch syncs up to maxBatchSize events per call.
|
|
95
|
+
* Retries on failure with exponential backoff.
|
|
96
|
+
*/
|
|
97
|
+
async syncToGraph() {
|
|
98
|
+
if (this.status.isRunning) {
|
|
99
|
+
console.log('[EventQueue] Sync already in progress, skipping');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (this.isShuttingDown) {
|
|
103
|
+
console.log('[EventQueue] Shutting down, skipping sync');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.status.isRunning = true;
|
|
107
|
+
this.status.lastError = null;
|
|
108
|
+
try {
|
|
109
|
+
// Get unsynced events
|
|
110
|
+
const unsyncedEvents = await getUnsyncedEvents();
|
|
111
|
+
if (unsyncedEvents.length === 0) {
|
|
112
|
+
console.log('[EventQueue] No events to sync');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Batch events
|
|
116
|
+
const batch = unsyncedEvents.slice(0, this.config.maxBatchSize);
|
|
117
|
+
console.log(`[EventQueue] Syncing ${batch.length} events to graph`);
|
|
118
|
+
// Attempt sync with retries
|
|
119
|
+
let lastError = null;
|
|
120
|
+
for (let attempt = 1; attempt <= this.config.retryAttempts; attempt++) {
|
|
121
|
+
try {
|
|
122
|
+
await this.syncBatchToGraph(batch);
|
|
123
|
+
// Success - mark events as synced
|
|
124
|
+
const eventIds = batch.map(e => e.id);
|
|
125
|
+
await markEventsSynced(eventIds);
|
|
126
|
+
this.status.totalSynced += batch.length;
|
|
127
|
+
this.status.lastSyncTime = new Date();
|
|
128
|
+
this.status.pendingCount = unsyncedEvents.length - batch.length;
|
|
129
|
+
console.log(`[EventQueue] ✓ Synced ${batch.length} events to graph`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
134
|
+
console.warn(`[EventQueue] Sync attempt ${attempt}/${this.config.retryAttempts} failed:`, lastError.message);
|
|
135
|
+
if (attempt < this.config.retryAttempts) {
|
|
136
|
+
// Wait before retry with exponential backoff
|
|
137
|
+
const delay = this.config.retryDelayMs * Math.pow(2, attempt - 1);
|
|
138
|
+
console.log(`[EventQueue] Retrying in ${delay / 1000}s...`);
|
|
139
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// All retries failed
|
|
144
|
+
this.status.lastError = lastError?.message || 'Unknown error';
|
|
145
|
+
console.error('[EventQueue] ⚠ Graph sync failed after all retries, events remain in local log');
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
this.status.isRunning = false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Sync a batch of events to Neo4j graph
|
|
153
|
+
*/
|
|
154
|
+
async syncBatchToGraph(events) {
|
|
155
|
+
try {
|
|
156
|
+
// Import graph API client lazily
|
|
157
|
+
const { createGraphEvents } = await import('../commands/graph/api-client.js');
|
|
158
|
+
// Convert events to graph API format
|
|
159
|
+
const graphEvents = events.map(event => ({
|
|
160
|
+
id: event.id,
|
|
161
|
+
user_id: event.user_id,
|
|
162
|
+
organization_id: event.organization_id,
|
|
163
|
+
project_id: event.project_id,
|
|
164
|
+
category: event.category,
|
|
165
|
+
description: event.description,
|
|
166
|
+
timestamp: event.timestamp,
|
|
167
|
+
impact: event.impact,
|
|
168
|
+
files: event.files,
|
|
169
|
+
branch: event.branch,
|
|
170
|
+
tags: event.tags,
|
|
171
|
+
shared: event.shared,
|
|
172
|
+
commit_hash: event.commit_hash,
|
|
173
|
+
pressure: event.pressure
|
|
174
|
+
}));
|
|
175
|
+
// Call graph API to create events
|
|
176
|
+
await createGraphEvents(graphEvents);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
// Re-throw to trigger retry logic
|
|
180
|
+
throw new Error(`Graph API error: ${error instanceof Error ? error.message : String(error)}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Flush queue immediately (for handoff/shutdown)
|
|
185
|
+
*/
|
|
186
|
+
async flush() {
|
|
187
|
+
console.log('[EventQueue] Flushing queue...');
|
|
188
|
+
this.stop(); // Stop scheduled syncs
|
|
189
|
+
await this.syncToGraph(); // Final sync
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Graceful shutdown with pending sync wait
|
|
193
|
+
*/
|
|
194
|
+
async shutdown() {
|
|
195
|
+
console.log('[EventQueue] Initiating graceful shutdown...');
|
|
196
|
+
this.isShuttingDown = true;
|
|
197
|
+
// Stop scheduled syncs
|
|
198
|
+
this.stop();
|
|
199
|
+
// Wait for current sync to complete
|
|
200
|
+
const maxWaitMs = 30000; // 30 seconds max
|
|
201
|
+
const startTime = Date.now();
|
|
202
|
+
while (this.status.isRunning && (Date.now() - startTime) < maxWaitMs) {
|
|
203
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
204
|
+
}
|
|
205
|
+
// Final flush
|
|
206
|
+
await this.flush();
|
|
207
|
+
console.log('[EventQueue] Shutdown complete');
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get current queue status
|
|
211
|
+
*/
|
|
212
|
+
getStatus() {
|
|
213
|
+
return { ...this.status };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Schedule sync if needed (called after adding to queue)
|
|
217
|
+
*/
|
|
218
|
+
scheduleSyncIfNeeded() {
|
|
219
|
+
// Already handled in addToQueue
|
|
220
|
+
// This method exists for API compatibility
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Global queue instance (singleton)
|
|
225
|
+
*/
|
|
226
|
+
let globalQueue = null;
|
|
227
|
+
/**
|
|
228
|
+
* Initialize global event queue
|
|
229
|
+
*/
|
|
230
|
+
export function initializeQueue(config) {
|
|
231
|
+
if (globalQueue) {
|
|
232
|
+
console.warn('[EventQueue] Queue already initialized');
|
|
233
|
+
return globalQueue;
|
|
234
|
+
}
|
|
235
|
+
globalQueue = new EventQueue(config);
|
|
236
|
+
globalQueue.start();
|
|
237
|
+
// Register shutdown handlers
|
|
238
|
+
const shutdownHandler = () => {
|
|
239
|
+
if (globalQueue) {
|
|
240
|
+
globalQueue.shutdown().catch(error => {
|
|
241
|
+
console.error('[EventQueue] Shutdown error:', error);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
process.on('SIGINT', shutdownHandler);
|
|
246
|
+
process.on('SIGTERM', shutdownHandler);
|
|
247
|
+
return globalQueue;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get global queue instance
|
|
251
|
+
*/
|
|
252
|
+
export function getQueue() {
|
|
253
|
+
if (!globalQueue) {
|
|
254
|
+
throw new Error('EventQueue not initialized. Call initializeQueue() first.');
|
|
255
|
+
}
|
|
256
|
+
return globalQueue;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Add event to global queue
|
|
260
|
+
*/
|
|
261
|
+
export async function addToQueue(event) {
|
|
262
|
+
// Lazy initialization on first use
|
|
263
|
+
if (!globalQueue) {
|
|
264
|
+
initializeQueue();
|
|
265
|
+
}
|
|
266
|
+
await globalQueue.addToQueue(event);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Check if queue is initialized
|
|
270
|
+
*/
|
|
271
|
+
export function isQueueInitialized() {
|
|
272
|
+
return globalQueue !== null;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=event-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/lib/event-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-11-04
|
|
5
|
+
* @tags: [session, cursor, event-stream, adr-043, multi-context]
|
|
6
|
+
* @related: [commands/start/index.ts, utils/helpers.ts, lib/write-dispatcher/write-dispatcher.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [fs-extra, simple-git]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Session cursor interface (ADR-043)
|
|
13
|
+
* Cursors point into the event stream, scoped to user + project + branch
|
|
14
|
+
*/
|
|
15
|
+
export interface SessionCursor {
|
|
16
|
+
id: string;
|
|
17
|
+
user_id: string;
|
|
18
|
+
organization_id: string;
|
|
19
|
+
project_id: string;
|
|
20
|
+
branch: string;
|
|
21
|
+
current_event_id: string;
|
|
22
|
+
last_loaded_event_id?: string;
|
|
23
|
+
started: Date;
|
|
24
|
+
last_active: Date;
|
|
25
|
+
status: 'active' | 'paused';
|
|
26
|
+
context_snapshot?: any;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a new session cursor
|
|
30
|
+
*/
|
|
31
|
+
export declare function createCursor(params: {
|
|
32
|
+
branch: string;
|
|
33
|
+
projectId: string;
|
|
34
|
+
organizationId: string;
|
|
35
|
+
contextSnapshot?: any;
|
|
36
|
+
}): Promise<SessionCursor>;
|
|
37
|
+
/**
|
|
38
|
+
* Resume an existing cursor
|
|
39
|
+
*/
|
|
40
|
+
export declare function resumeCursor(cursorId: string): Promise<SessionCursor>;
|
|
41
|
+
/**
|
|
42
|
+
* Update cursor properties
|
|
43
|
+
*/
|
|
44
|
+
export declare function updateCursor(cursorId: string, updates: Partial<SessionCursor>): Promise<SessionCursor>;
|
|
45
|
+
/**
|
|
46
|
+
* Find a cursor matching the given filters
|
|
47
|
+
*/
|
|
48
|
+
export declare function findCursor(filters: {
|
|
49
|
+
branch?: string;
|
|
50
|
+
projectId?: string;
|
|
51
|
+
status?: 'active' | 'paused';
|
|
52
|
+
}): Promise<SessionCursor | null>;
|
|
53
|
+
/**
|
|
54
|
+
* List all cursors for a user
|
|
55
|
+
*/
|
|
56
|
+
export declare function listCursors(userId?: string): Promise<SessionCursor[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Delete a cursor
|
|
59
|
+
*/
|
|
60
|
+
export declare function deleteCursor(cursorId: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Create or resume cursor for current context
|
|
63
|
+
* This is the main entry point for session management
|
|
64
|
+
*/
|
|
65
|
+
export declare function getOrCreateCursor(options: {
|
|
66
|
+
branch?: string;
|
|
67
|
+
projectId?: string;
|
|
68
|
+
}): Promise<{
|
|
69
|
+
cursor: SessionCursor;
|
|
70
|
+
isNew: boolean;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Pause current active cursor
|
|
74
|
+
*/
|
|
75
|
+
export declare function pauseCurrentCursor(options: {
|
|
76
|
+
branch?: string;
|
|
77
|
+
projectId?: string;
|
|
78
|
+
finalEventId?: string;
|
|
79
|
+
}): Promise<SessionCursor | null>;
|
|
80
|
+
//# sourceMappingURL=session-cursor.d.ts.map
|