claude-flow-novice 2.0.4 → 2.0.5
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/dist/src/cli/commands/guidance.js +668 -487
- package/dist/src/cli/commands/index-validate.js +29 -18
- package/dist/src/cli/commands/mcp-troubleshoot.js +282 -230
- package/dist/src/cli/commands/neural-goal-init.js +125 -92
- package/dist/src/cli/commands/swarm-exec.js +393 -317
- package/dist/src/cli/commands/validate-framework.js +1100 -983
- package/dist/src/cli/commands/validate.js +223 -144
- package/dist/src/cli/main.js +1 -1
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +277 -265
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +7 -6
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +356 -373
- package/dist/src/cli/simple-commands/__tests__/task.test.js +7 -6
- package/dist/src/cli/simple-commands/agent.js +193 -157
- package/dist/src/cli/simple-commands/analysis.js +446 -336
- package/dist/src/cli/simple-commands/automation-executor.js +1339 -1095
- package/dist/src/cli/simple-commands/automation.js +469 -481
- package/dist/src/cli/simple-commands/batch-manager.js +313 -261
- package/dist/src/cli/simple-commands/claude-telemetry.js +267 -241
- package/dist/src/cli/simple-commands/claude-track.js +90 -68
- package/dist/src/cli/simple-commands/concurrent-display.js +320 -266
- package/dist/src/cli/simple-commands/config.js +290 -245
- package/dist/src/cli/simple-commands/coordination.js +234 -182
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +615 -812
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +981 -922
- package/dist/src/cli/simple-commands/fix-hook-variables.js +294 -274
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +457 -378
- package/dist/src/cli/simple-commands/github/github-api.js +574 -535
- package/dist/src/cli/simple-commands/github/init.js +303 -276
- package/dist/src/cli/simple-commands/github.js +247 -222
- package/dist/src/cli/simple-commands/goal.js +63 -51
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +278 -208
- package/dist/src/cli/simple-commands/hive-mind/communication.js +696 -601
- package/dist/src/cli/simple-commands/hive-mind/core.js +979 -907
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +655 -406
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1245 -1125
- package/dist/src/cli/simple-commands/hive-mind/memory.js +1090 -854
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +574 -459
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +347 -263
- package/dist/src/cli/simple-commands/hive-mind/queen.js +768 -727
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +1049 -745
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +283 -227
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +217 -174
- package/dist/src/cli/simple-commands/hive-mind.js +2282 -1841
- package/dist/src/cli/simple-commands/hive.js +79 -90
- package/dist/src/cli/simple-commands/hook-safety.js +521 -431
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +254 -203
- package/dist/src/cli/simple-commands/hooks.js +1204 -1064
- package/dist/src/cli/simple-commands/init/agent-copier.js +319 -294
- package/dist/src/cli/simple-commands/init/batch-init.js +562 -496
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +19 -13
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +19 -13
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +88 -61
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +150 -125
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +49 -42
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +61 -43
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +147 -141
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +44 -31
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +90 -64
- package/dist/src/cli/simple-commands/init/help.js +107 -104
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +528 -509
- package/dist/src/cli/simple-commands/init/index.js +1759 -1510
- package/dist/src/cli/simple-commands/init/performance-monitor.js +317 -234
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +504 -441
- package/dist/src/cli/simple-commands/init/rollback/index.js +364 -289
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +728 -652
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +481 -416
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +448 -369
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +2 -1
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +99 -122
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +37 -32
- package/dist/src/cli/simple-commands/init/sparc-structure.js +62 -55
- package/dist/src/cli/simple-commands/init/template-copier.js +533 -421
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +6 -3
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +318 -344
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +218 -173
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +75 -65
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +6 -3
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +4 -2
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +230 -187
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +80 -53
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +85 -101
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +330 -283
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +561 -495
- package/dist/src/cli/simple-commands/init/validation/index.js +358 -302
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +359 -308
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +366 -389
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +268 -270
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +447 -427
- package/dist/src/cli/simple-commands/init.js +2 -1
- package/dist/src/cli/simple-commands/mcp-health.js +158 -131
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +634 -533
- package/dist/src/cli/simple-commands/mcp.js +400 -345
- package/dist/src/cli/simple-commands/memory-consolidation.js +537 -426
- package/dist/src/cli/simple-commands/memory.js +311 -247
- package/dist/src/cli/simple-commands/migrate-hooks.js +46 -39
- package/dist/src/cli/simple-commands/monitor.js +363 -294
- package/dist/src/cli/simple-commands/neural.js +65 -51
- package/dist/src/cli/simple-commands/pair-autofix-only.js +662 -538
- package/dist/src/cli/simple-commands/pair-basic.js +656 -528
- package/dist/src/cli/simple-commands/pair-old.js +543 -430
- package/dist/src/cli/simple-commands/pair-working.js +751 -615
- package/dist/src/cli/simple-commands/pair.js +751 -615
- package/dist/src/cli/simple-commands/performance-hooks.js +111 -83
- package/dist/src/cli/simple-commands/performance-metrics.js +433 -348
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +787 -708
- package/dist/src/cli/simple-commands/process-ui.js +254 -230
- package/dist/src/cli/simple-commands/realtime-update-system.js +611 -525
- package/dist/src/cli/simple-commands/sparc/architecture.js +1530 -1704
- package/dist/src/cli/simple-commands/sparc/commands.js +516 -438
- package/dist/src/cli/simple-commands/sparc/completion.js +1481 -1224
- package/dist/src/cli/simple-commands/sparc/coordinator.js +978 -913
- package/dist/src/cli/simple-commands/sparc/index.js +298 -241
- package/dist/src/cli/simple-commands/sparc/phase-base.js +390 -314
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +869 -965
- package/dist/src/cli/simple-commands/sparc/refinement.js +1273 -980
- package/dist/src/cli/simple-commands/sparc/specification.js +645 -559
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +55 -47
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +87 -101
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +493 -465
- package/dist/src/cli/simple-commands/start-ui.js +132 -108
- package/dist/src/cli/simple-commands/start-wrapper.js +268 -240
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +275 -254
- package/dist/src/cli/simple-commands/stream-chain-clean.js +171 -128
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +82 -61
- package/dist/src/cli/simple-commands/stream-chain-real.js +331 -267
- package/dist/src/cli/simple-commands/stream-chain-working.js +263 -211
- package/dist/src/cli/simple-commands/stream-chain.js +318 -260
- package/dist/src/cli/simple-commands/stream-processor.js +315 -290
- package/dist/src/cli/simple-commands/swarm-executor.js +222 -189
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +300 -208
- package/dist/src/cli/simple-commands/swarm-ui.js +703 -623
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +286 -258
- package/dist/src/cli/simple-commands/swarm.js +1082 -887
- package/dist/src/cli/simple-commands/task.js +206 -161
- package/dist/src/cli/simple-commands/timestamp-fix.js +89 -59
- package/dist/src/cli/simple-commands/token-tracker.js +316 -258
- package/dist/src/cli/simple-commands/tool-execution-framework.js +519 -433
- package/dist/src/cli/simple-commands/train-and-stream.js +331 -275
- package/dist/src/cli/simple-commands/training-pipeline.js +725 -619
- package/dist/src/cli/simple-commands/training.js +227 -170
- package/dist/src/cli/simple-commands/verification-hooks.js +284 -261
- package/dist/src/cli/simple-commands/verification-integration.js +417 -389
- package/dist/src/cli/simple-commands/verification-training-integration.js +606 -486
- package/dist/src/cli/simple-commands/verification.js +513 -493
- package/dist/src/cli/simple-commands/web-server.js +836 -766
- package/dist/src/cli/simple-commands/webui-validator.js +124 -106
- package/dist/src/coordination/byzantine-memory-channels.js +25 -1
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +251 -212
- package/dist/src/coordination/event-bus/qe-event-bus.js +748 -608
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +454 -379
- package/dist/src/coordination/iteration-tracker.js +454 -363
- package/dist/src/index.js +384 -35
- package/dist/src/mcp/DEPRECATED.js +60 -46
- package/dist/src/mcp/fixes/mcp-error-fixes.js +134 -115
- package/dist/src/mcp/implementations/agent-tracker.js +128 -114
- package/dist/src/mcp/implementations/daa-tools.js +350 -292
- package/dist/src/mcp/implementations/workflow-tools.js +361 -329
- package/dist/src/mcp/mcp-config-manager.js +1331 -1183
- package/dist/src/mcp/mcp-server-novice-simplified.js +17 -11
- package/dist/src/mcp/mcp-server-novice.js +17 -11
- package/dist/src/mcp/mcp-server-sdk.js +17 -11
- package/dist/src/mcp/mcp-server.js +1484 -1620
- package/dist/src/mcp/ruv-swarm-wrapper.js +239 -209
- package/dist/src/memory/advanced-serializer.js +589 -609
- package/dist/src/memory/enhanced-examples.js +305 -220
- package/dist/src/memory/enhanced-memory.js +336 -295
- package/dist/src/memory/enhanced-session-serializer.js +492 -408
- package/dist/src/memory/fallback-memory-system.js +1021 -900
- package/dist/src/memory/fallback-store.js +131 -93
- package/dist/src/memory/high-performance-serialization.js +730 -592
- package/dist/src/memory/in-memory-store.js +213 -161
- package/dist/src/memory/index.js +157 -123
- package/dist/src/memory/lock-free-structures.js +764 -578
- package/dist/src/memory/memory-mapped-persistence.js +766 -585
- package/dist/src/memory/memory-pressure-manager.js +707 -569
- package/dist/src/memory/migration.js +445 -358
- package/dist/src/memory/shared-memory.js +768 -641
- package/dist/src/memory/sqlite-store.js +325 -245
- package/dist/src/memory/sqlite-wrapper.js +151 -122
- package/dist/src/memory/swarm-memory.js +603 -470
- package/dist/src/memory/test-example.js +134 -126
- package/dist/src/memory/ultra-fast-memory-store.js +821 -622
- package/dist/src/memory/unified-memory-manager.js +437 -356
- package/dist/src/swarm/CodeRefactoringSwarm.js +952 -777
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +400 -332
- package/dist/src/utils/error-handler.js +2 -36
- package/dist/src/utils/github-cli-safe.js +64 -56
- package/dist/src/utils/github-cli-safety-wrapper.js +546 -451
- package/dist/src/utils/npx-isolated-cache.js +119 -104
- package/dist/src/utils/preference-manager.js +652 -622
- package/dist/src/utils/timezone-utils.js +105 -86
- package/dist/src/web/api/apm-routes.js +353 -0
- package/dist/src/web/api/config/api-config.js +184 -0
- package/dist/src/web/api/middleware/auth.js +203 -0
- package/dist/src/web/api/middleware/cache.js +273 -0
- package/dist/src/web/api/middleware/error-handler.js +257 -0
- package/dist/src/web/api/middleware/request-logger.js +215 -0
- package/dist/src/web/api/middleware/validation.js +323 -0
- package/dist/src/web/api/routes/events.js +463 -0
- package/dist/src/web/api/routes/hierarchy.js +300 -0
- package/dist/src/web/api/routes/index.js +12 -0
- package/dist/src/web/api/routes/metrics.js +559 -0
- package/dist/src/web/api/routes/parallel-status.js +359 -0
- package/dist/src/web/api/routes/status.js +448 -0
- package/dist/src/web/api/server.js +462 -0
- package/dist/src/web/dashboard/hooks/useWebSocket.js +383 -0
- package/dist/src/web/dashboard/index.js +85 -0
- package/dist/src/web/dashboard/realtime/CustomSyncManager.js +439 -0
- package/dist/src/web/dashboard/realtime/NativeWebSocketManager.js +323 -0
- package/dist/src/web/dashboard/realtime/PerformanceBenchmark.js +527 -0
- package/dist/src/web/dashboard/realtime/RealtimeCommunicationManager.js +474 -0
- package/dist/src/web/dashboard/realtime/RealtimeServer.js +666 -0
- package/dist/src/web/dashboard/realtime/SSEManager.js +426 -0
- package/dist/src/web/dashboard/types.js +4 -0
- package/dist/src/web/messaging/agent-status-tracker.js +453 -0
- package/dist/src/web/messaging/human-intervention-system.js +305 -0
- package/dist/src/web/messaging/message-filter.js +302 -0
- package/dist/src/web/messaging/swarm-message-router.js +324 -0
- package/dist/src/web/messaging/transparency-logger.js +421 -0
- package/dist/src/web/portal-server.js +460 -0
- package/dist/src/web/server.js +322 -0
- package/dist/src/web/websocket/apm-websocket-handler.js +453 -0
- package/dist/src/web/websocket/websocket-manager.js +780 -0
- package/package.json +5 -3
- package/dist/src/cli/minimal-main.js +0 -22
- package/dist/src/enterprise/analytics-manager.js +0 -1135
- package/dist/src/enterprise/audit-manager.js +0 -1115
- package/dist/src/enterprise/cloud-manager.js +0 -891
- package/dist/src/enterprise/deployment-manager.js +0 -966
- package/dist/src/enterprise/index.js +0 -6
- package/dist/src/enterprise/project-manager.js +0 -584
- package/dist/src/enterprise/security-manager.js +0 -991
- package/dist/src/migration/index.js +0 -92
- package/dist/src/migration/logger.js +0 -121
- package/dist/src/migration/migration-analyzer.js +0 -268
- package/dist/src/migration/migration-runner.js +0 -522
- package/dist/src/migration/migration-validator.js +0 -285
- package/dist/src/migration/progress-reporter.js +0 -150
- package/dist/src/migration/rollback-manager.js +0 -321
- package/dist/src/migration/tests/migration-system.test.js +0 -7
- package/dist/src/migration/types.js +0 -3
- package/dist/src/swarm/__tests__/integration.test.js +0 -227
- package/dist/src/swarm/__tests__/prompt-copier.test.js +0 -344
- package/dist/src/swarm/advanced-orchestrator.js +0 -1095
- package/dist/src/swarm/claude-code-interface.js +0 -961
- package/dist/src/swarm/claude-flow-executor.js +0 -229
- package/dist/src/swarm/consensus-coordinator.js +0 -475
- package/dist/src/swarm/coordinator.js +0 -2993
- package/dist/src/swarm/direct-executor.js +0 -1180
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +0 -691
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +0 -998
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +0 -1197
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +0 -772
- package/dist/src/swarm/error-recovery/resilience-architecture.js +0 -714
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +0 -1319
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +0 -808
- package/dist/src/swarm/executor-v2.js +0 -322
- package/dist/src/swarm/executor.js +0 -815
- package/dist/src/swarm/hive-mind-integration.js +0 -703
- package/dist/src/swarm/index.js +0 -41
- package/dist/src/swarm/json-output-aggregator.js +0 -267
- package/dist/src/swarm/large-scale-coordinator.js +0 -542
- package/dist/src/swarm/mcp-integration-wrapper.js +0 -628
- package/dist/src/swarm/memory.js +0 -1117
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +0 -348
- package/dist/src/swarm/optimizations/async-file-manager.js +0 -285
- package/dist/src/swarm/optimizations/circular-buffer.js +0 -162
- package/dist/src/swarm/optimizations/connection-pool.js +0 -244
- package/dist/src/swarm/optimizations/index.js +0 -28
- package/dist/src/swarm/optimizations/optimized-executor.js +0 -320
- package/dist/src/swarm/optimizations/ttl-map.js +0 -234
- package/dist/src/swarm/prompt-cli.js +0 -200
- package/dist/src/swarm/prompt-copier-enhanced.js +0 -202
- package/dist/src/swarm/prompt-copier.js +0 -381
- package/dist/src/swarm/prompt-manager.js +0 -295
- package/dist/src/swarm/prompt-utils.js +0 -310
- package/dist/src/swarm/result-aggregator.js +0 -718
- package/dist/src/swarm/sparc-executor.js +0 -1568
- package/dist/src/swarm/strategies/auto.js +0 -758
- package/dist/src/swarm/strategies/base.js +0 -128
- package/dist/src/swarm/strategies/research.js +0 -914
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +0 -2
- package/dist/src/swarm/types.js +0 -52
- package/dist/src/swarm/workers/copy-worker.js +0 -56
- package/dist/src/validators/epic-config-schema.js +0 -214
- package/dist/src/validators/index.js +0 -10
- package/dist/src/validators/swarm-init-validator.js +0 -259
- package/dist/src/validators/todowrite-batching-validator.js +0 -215
- package/dist/src/validators/todowrite-integration.js +0 -187
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/documentSymbols/browser/documentSymbols.js +0 -23
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js +0 -57
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +0 -401
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js +0 -181
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js +0 -44
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js +0 -157
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/edit.js +0 -71
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/editorState/browser/editorState.js +0 -112
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findController.js +0 -990
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findDecorations.js +0 -296
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findModel.js +0 -488
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findOptionsWidget.js +0 -138
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findState.js +0 -243
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findWidget.js +0 -1177
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/folding.js +0 -1093
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/foldingDecorations.js +0 -133
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/foldingModel.js +0 -538
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/foldingRanges.js +0 -351
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js +0 -49
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/format/browser/format.js +0 -360
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/format/browser/formatActions.js +0 -263
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/format/browser/formattingEdit.js +0 -54
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture.js +0 -149
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/hover/browser/contentHover.js +0 -874
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/inlineCompletions/browser/commandIds.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/inlineCompletions/browser/commands.js +0 -199
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/linesOperations/browser/copyLinesCommand.js +0 -70
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/quickAccess/browser/commandsQuickAccess.js +0 -26
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess.js +0 -153
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +0 -33
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/semanticTokens/browser/documentSemanticTokens.js +0 -354
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/smartSelect/browser/bracketSelections.js +0 -146
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/suggest/browser/completionModel.js +0 -224
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +0 -119
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/edcore.main.js +0 -14
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.all.js +0 -63
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.api.js +0 -55
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.main.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.worker.js +0 -25
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/standalone/browser/colorizer.js +0 -118
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/language/css/css.worker.js +0 -36869
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/language/css/cssMode.js +0 -2035
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/accessibility/browser/accessibilityService.js +0 -88
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/accessibility/common/accessibility.js +0 -9
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/action/common/action.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/action/common/actionCommonCategories.js +0 -13
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/browser/actionList.js +0 -276
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/browser/actionWidget.js +0 -248
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/common/actionWidget.js +0 -5
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actions/common/actions.js +0 -409
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/audioCues/browser/audioCueService.js +0 -176
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/clipboard/browser/clipboardService.js +0 -141
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/clipboard/common/clipboardService.js +0 -6
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/commands/common/commands.js +0 -80
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configuration.js +0 -86
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurationModels.js +0 -554
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurationRegistry.js +0 -317
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurations.js +0 -41
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/browser/contextKeyService.js +0 -432
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/common/contextkey.js +0 -1547
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/common/contextkeys.js +0 -18
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextMenuHandler.js +0 -124
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextMenuService.js +0 -101
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextView.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextViewService.js +0 -72
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/dialogs/common/dialogs.js +0 -2
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/dnd/browser/dnd.js +0 -36
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/editor/common/editor.js +0 -17
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/environment/common/environment.js +0 -2
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/extensions/common/extensions.js +0 -47
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/files/common/files.js +0 -9
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +0 -105
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/instantiation/common/descriptors.js +0 -11
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/instantiation/common/extensions.js +0 -15
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/keybinding/common/abstractKeybindingService.js +0 -277
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/keybinding/common/baseResolvedKeybinding.js +0 -53
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +0 -354
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/theme/browser/defaultStyles.js +0 -162
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/theme/common/colorRegistry.js +0 -482
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/abap/abap.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/apex/apex.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/azcli/azcli.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/bat/bat.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/bicep/bicep.js +0 -11
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/cameligo/cameligo.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/clojure/clojure.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/coffee/coffee.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/cpp/cpp.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/csharp/csharp.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/csp/csp.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/css/css.js +0 -12
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/cypher/cypher.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/dart/dart.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/dockerfile/dockerfile.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/ecl/ecl.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/elixir/elixir.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/flow9/flow9.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.js +0 -745
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.de.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.es.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.fr.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.it.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.ja.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.ko.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.ru.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.zh-cn.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.zh-tw.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/language/css/cssMode.js +0 -13
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/language/css/cssWorker.js +0 -81
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/cli.js +0 -64
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/example.js +0 -36
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/index.js +0 -205
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/test.js +0 -260
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/async/index.browser.js +0 -34
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/async/index.js +0 -35
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/async/index.native.js +0 -26
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/index.browser.js +0 -34
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/index.js +0 -45
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/nanoid.js +0 -1
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/non-secure/index.js +0 -21
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/url-alphabet/index.js +0 -3
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/bin/nodemon.js +0 -16
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/cli/index.js +0 -49
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/cli/parse.js +0 -230
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/command.js +0 -43
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/defaults.js +0 -34
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/exec.js +0 -234
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/index.js +0 -93
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/load.js +0 -225
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/help/index.js +0 -27
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/index.js +0 -1
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/index.js +0 -4
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/match.js +0 -287
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/run.js +0 -562
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/signals.js +0 -34
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/watch.js +0 -244
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/nodemon.js +0 -317
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/rules/add.js +0 -89
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/rules/index.js +0 -53
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/rules/parse.js +0 -43
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/spawn.js +0 -74
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/bus.js +0 -44
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/clone.js +0 -40
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/colour.js +0 -26
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/index.js +0 -103
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/log.js +0 -82
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/merge.js +0 -47
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/version.js +0 -100
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/brace-expansion/index.js +0 -201
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/has-flag/index.js +0 -8
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/minimatch/minimatch.js +0 -947
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/supports-color/browser.js +0 -5
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/supports-color/index.js +0 -131
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/bin/pidtree.js +0 -128
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/index.js +0 -49
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/bin.js +0 -61
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/get.js +0 -45
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/pidtree.js +0 -104
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/ps.js +0 -47
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/wmic.js +0 -49
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/doc.js +0 -1270
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/acorn.js +0 -15
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/angular.js +0 -2
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/babel.js +0 -15
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/estree.js +0 -36
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/flow.js +0 -19
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/glimmer.js +0 -29
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/graphql.js +0 -29
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/html.js +0 -22
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/markdown.js +0 -63
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/meriyah.js +0 -4
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/postcss.js +0 -54
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/typescript.js +0 -20
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/yaml.js +0 -160
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/standalone.js +0 -34
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/bin/react-scripts.js +0 -58
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/env.js +0 -112
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/getHttpsConfig.js +0 -74
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/jest/babelTransform.js +0 -37
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/jest/cssTransform.js +0 -22
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/jest/fileTransform.js +0 -40
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/modules.js +0 -142
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/paths.js +0 -153
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/webpack/persistentCache/createEnvironmentHash.js +0 -9
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/webpack.config.js +0 -796
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/webpackDevServer.config.js +0 -135
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/scripts/build.js +0 -225
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/scripts/eject.js +0 -340
|
@@ -1,85 +1,115 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hive Mind Session Manager
|
|
3
3
|
* Handles session persistence and resume functionality for swarms
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
8
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { cwd } from '../../node-compat.js';
|
|
11
|
+
import { createDatabase, isSQLiteAvailable, isWindows } from '../../../memory/sqlite-wrapper.js';
|
|
12
|
+
import { sessionSerializer } from '../../../memory/enhanced-session-serializer.js';
|
|
13
|
+
import { SerializationError, DeserializationError } from '../../../memory/advanced-serializer.js';
|
|
14
|
+
|
|
10
15
|
export class HiveMindSessionManager {
|
|
11
|
-
|
|
16
|
+
constructor(hiveMindDir = null) {
|
|
17
|
+
this.hiveMindDir = hiveMindDir || path.join(cwd(), '.hive-mind');
|
|
18
|
+
this.sessionsDir = path.join(this.hiveMindDir, 'sessions');
|
|
19
|
+
this.dbPath = path.join(this.hiveMindDir, 'hive.db');
|
|
20
|
+
this.db = null;
|
|
21
|
+
this.isInMemory = false;
|
|
22
|
+
this.memoryStore = null;
|
|
23
|
+
this.initializationPromise = null;
|
|
24
|
+
|
|
25
|
+
// Ensure directories exist
|
|
26
|
+
this.ensureDirectories();
|
|
27
|
+
|
|
28
|
+
// Initialize database connection (store promise for later)
|
|
29
|
+
this.initializationPromise = this.initializeDatabase();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
12
33
|
* Initialize database with fallback support
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
*/
|
|
35
|
+
async initializeDatabase() {
|
|
36
|
+
try {
|
|
37
|
+
const sqliteAvailable = await isSQLiteAvailable();
|
|
38
|
+
|
|
39
|
+
if (!sqliteAvailable) {
|
|
40
|
+
console.warn('SQLite not available, using in-memory session storage');
|
|
41
|
+
this.initializeInMemoryFallback();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.db = await createDatabase(this.dbPath);
|
|
46
|
+
if (this.db) {
|
|
47
|
+
this.initializeSchema();
|
|
48
|
+
} else {
|
|
49
|
+
throw new Error('Failed to create database instance');
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error('Failed to create SQLite database:', error.message);
|
|
53
|
+
console.warn('Falling back to in-memory session storage');
|
|
54
|
+
this.initializeInMemoryFallback();
|
|
32
55
|
}
|
|
33
|
-
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
34
59
|
* Ensure database is initialized before use
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (this.db === null && !this.isInMemory) {
|
|
41
|
-
await this.initializeDatabase();
|
|
42
|
-
}
|
|
60
|
+
*/
|
|
61
|
+
async ensureInitialized() {
|
|
62
|
+
if (this.initializationPromise) {
|
|
63
|
+
await this.initializationPromise;
|
|
64
|
+
this.initializationPromise = null;
|
|
43
65
|
}
|
|
44
|
-
|
|
66
|
+
|
|
67
|
+
if (this.db === null && !this.isInMemory) {
|
|
68
|
+
await this.initializeDatabase();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
45
73
|
* Initialize in-memory fallback for session storage
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
74
|
+
*/
|
|
75
|
+
initializeInMemoryFallback() {
|
|
76
|
+
this.isInMemory = true;
|
|
77
|
+
this.memoryStore = {
|
|
78
|
+
sessions: new Map(),
|
|
79
|
+
checkpoints: new Map(),
|
|
80
|
+
logs: new Map(),
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
if (isWindows()) {
|
|
84
|
+
console.info(`
|
|
55
85
|
Note: Session data will not persist between runs on Windows without SQLite.
|
|
56
86
|
To enable persistence, see: https://github.com/ruvnet/claude-code-flow/docs/windows-installation.md
|
|
57
87
|
`);
|
|
58
|
-
}
|
|
59
88
|
}
|
|
60
|
-
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
61
92
|
* Ensure required directories exist
|
|
62
|
-
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
mkdirSync(this.sessionsDir, {
|
|
70
|
-
recursive: true
|
|
71
|
-
});
|
|
72
|
-
}
|
|
93
|
+
*/
|
|
94
|
+
ensureDirectories() {
|
|
95
|
+
if (!existsSync(this.hiveMindDir)) {
|
|
96
|
+
mkdirSync(this.hiveMindDir, { recursive: true });
|
|
97
|
+
}
|
|
98
|
+
if (!existsSync(this.sessionsDir)) {
|
|
99
|
+
mkdirSync(this.sessionsDir, { recursive: true });
|
|
73
100
|
}
|
|
74
|
-
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
75
104
|
* Initialize database schema for sessions
|
|
76
|
-
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
105
|
+
*/
|
|
106
|
+
initializeSchema() {
|
|
107
|
+
if (!this.db) {
|
|
108
|
+
console.error('Database not initialized');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Create the base schema
|
|
112
|
+
this.db.exec(`
|
|
83
113
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
84
114
|
id TEXT PRIMARY KEY,
|
|
85
115
|
swarm_id TEXT NOT NULL,
|
|
@@ -118,189 +148,247 @@ To enable persistence, see: https://github.com/ruvnet/claude-code-flow/docs/wind
|
|
|
118
148
|
FOREIGN KEY (session_id) REFERENCES sessions(id)
|
|
119
149
|
);
|
|
120
150
|
`);
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
151
|
+
|
|
152
|
+
// Run migrations to add new columns
|
|
153
|
+
this.runMigrations();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
125
157
|
* Run database migrations
|
|
126
|
-
*/
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
// Check if required columns exist
|
|
133
|
-
const columns = this.db.prepare('PRAGMA table_info(sessions)').all();
|
|
134
|
-
// Core columns
|
|
135
|
-
const hasObjective = columns.some((col)=>col.name === 'objective');
|
|
136
|
-
const hasSwarmName = columns.some((col)=>col.name === 'swarm_name');
|
|
137
|
-
const hasCheckpointData = columns.some((col)=>col.name === 'checkpoint_data');
|
|
138
|
-
const hasMetadata = columns.some((col)=>col.name === 'metadata');
|
|
139
|
-
const hasParentPid = columns.some((col)=>col.name === 'parent_pid');
|
|
140
|
-
const hasChildPids = columns.some((col)=>col.name === 'child_pids');
|
|
141
|
-
// Timestamp columns
|
|
142
|
-
const hasUpdatedAt = columns.some((col)=>col.name === 'updated_at');
|
|
143
|
-
const hasPausedAt = columns.some((col)=>col.name === 'paused_at');
|
|
144
|
-
const hasResumedAt = columns.some((col)=>col.name === 'resumed_at');
|
|
145
|
-
const hasCompletionPercentage = columns.some((col)=>col.name === 'completion_percentage');
|
|
146
|
-
if (!hasObjective) {
|
|
147
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN objective TEXT');
|
|
148
|
-
console.log('Added objective column to sessions table');
|
|
149
|
-
}
|
|
150
|
-
if (!hasSwarmName) {
|
|
151
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN swarm_name TEXT');
|
|
152
|
-
console.log('Added swarm_name column to sessions table');
|
|
153
|
-
}
|
|
154
|
-
if (!hasCheckpointData) {
|
|
155
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN checkpoint_data TEXT');
|
|
156
|
-
console.log('Added checkpoint_data column to sessions table');
|
|
157
|
-
}
|
|
158
|
-
if (!hasMetadata) {
|
|
159
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN metadata TEXT');
|
|
160
|
-
console.log('Added metadata column to sessions table');
|
|
161
|
-
}
|
|
162
|
-
if (!hasParentPid) {
|
|
163
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN parent_pid INTEGER');
|
|
164
|
-
console.log('Added parent_pid column to sessions table');
|
|
165
|
-
}
|
|
166
|
-
if (!hasChildPids) {
|
|
167
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN child_pids TEXT');
|
|
168
|
-
console.log('Added child_pids column to sessions table');
|
|
169
|
-
}
|
|
170
|
-
if (!hasUpdatedAt) {
|
|
171
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN updated_at DATETIME DEFAULT CURRENT_TIMESTAMP');
|
|
172
|
-
console.log('Added updated_at column to sessions table');
|
|
173
|
-
}
|
|
174
|
-
if (!hasPausedAt) {
|
|
175
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN paused_at DATETIME');
|
|
176
|
-
console.log('Added paused_at column to sessions table');
|
|
177
|
-
}
|
|
178
|
-
if (!hasResumedAt) {
|
|
179
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN resumed_at DATETIME');
|
|
180
|
-
console.log('Added resumed_at column to sessions table');
|
|
181
|
-
}
|
|
182
|
-
if (!hasCompletionPercentage) {
|
|
183
|
-
this.db.exec('ALTER TABLE sessions ADD COLUMN completion_percentage REAL DEFAULT 0');
|
|
184
|
-
console.log('Added completion_percentage column to sessions table');
|
|
185
|
-
}
|
|
186
|
-
} catch (error) {
|
|
187
|
-
console.error('Migration error:', error);
|
|
188
|
-
}
|
|
158
|
+
*/
|
|
159
|
+
runMigrations() {
|
|
160
|
+
if (!this.db) {
|
|
161
|
+
console.error('Database not initialized for migrations');
|
|
162
|
+
return;
|
|
189
163
|
}
|
|
190
|
-
|
|
164
|
+
try {
|
|
165
|
+
// Check if required columns exist
|
|
166
|
+
const columns = this.db.prepare('PRAGMA table_info(sessions)').all();
|
|
167
|
+
|
|
168
|
+
// Core columns
|
|
169
|
+
const hasObjective = columns.some((col) => col.name === 'objective');
|
|
170
|
+
const hasSwarmName = columns.some((col) => col.name === 'swarm_name');
|
|
171
|
+
const hasCheckpointData = columns.some((col) => col.name === 'checkpoint_data');
|
|
172
|
+
const hasMetadata = columns.some((col) => col.name === 'metadata');
|
|
173
|
+
const hasParentPid = columns.some((col) => col.name === 'parent_pid');
|
|
174
|
+
const hasChildPids = columns.some((col) => col.name === 'child_pids');
|
|
175
|
+
|
|
176
|
+
// Timestamp columns
|
|
177
|
+
const hasUpdatedAt = columns.some((col) => col.name === 'updated_at');
|
|
178
|
+
const hasPausedAt = columns.some((col) => col.name === 'paused_at');
|
|
179
|
+
const hasResumedAt = columns.some((col) => col.name === 'resumed_at');
|
|
180
|
+
const hasCompletionPercentage = columns.some((col) => col.name === 'completion_percentage');
|
|
181
|
+
|
|
182
|
+
if (!hasObjective) {
|
|
183
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN objective TEXT');
|
|
184
|
+
console.log('Added objective column to sessions table');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (!hasSwarmName) {
|
|
188
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN swarm_name TEXT');
|
|
189
|
+
console.log('Added swarm_name column to sessions table');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (!hasCheckpointData) {
|
|
193
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN checkpoint_data TEXT');
|
|
194
|
+
console.log('Added checkpoint_data column to sessions table');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (!hasMetadata) {
|
|
198
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN metadata TEXT');
|
|
199
|
+
console.log('Added metadata column to sessions table');
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (!hasParentPid) {
|
|
203
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN parent_pid INTEGER');
|
|
204
|
+
console.log('Added parent_pid column to sessions table');
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (!hasChildPids) {
|
|
208
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN child_pids TEXT');
|
|
209
|
+
console.log('Added child_pids column to sessions table');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (!hasUpdatedAt) {
|
|
213
|
+
this.db.exec(
|
|
214
|
+
'ALTER TABLE sessions ADD COLUMN updated_at DATETIME DEFAULT CURRENT_TIMESTAMP',
|
|
215
|
+
);
|
|
216
|
+
console.log('Added updated_at column to sessions table');
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (!hasPausedAt) {
|
|
220
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN paused_at DATETIME');
|
|
221
|
+
console.log('Added paused_at column to sessions table');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (!hasResumedAt) {
|
|
225
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN resumed_at DATETIME');
|
|
226
|
+
console.log('Added resumed_at column to sessions table');
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (!hasCompletionPercentage) {
|
|
230
|
+
this.db.exec('ALTER TABLE sessions ADD COLUMN completion_percentage REAL DEFAULT 0');
|
|
231
|
+
console.log('Added completion_percentage column to sessions table');
|
|
232
|
+
}
|
|
233
|
+
} catch (error) {
|
|
234
|
+
console.error('Migration error:', error);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
191
239
|
* Create a new session for a swarm
|
|
192
|
-
*/
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
240
|
+
*/
|
|
241
|
+
async createSession(swarmId, swarmName, objective, metadata = {}) {
|
|
242
|
+
await this.ensureInitialized();
|
|
243
|
+
|
|
244
|
+
const sessionId = `session-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
245
|
+
|
|
246
|
+
if (this.isInMemory) {
|
|
247
|
+
// Use in-memory storage
|
|
248
|
+
const sessionData = {
|
|
249
|
+
id: sessionId,
|
|
250
|
+
swarm_id: swarmId,
|
|
251
|
+
swarm_name: swarmName,
|
|
252
|
+
objective,
|
|
253
|
+
status: 'active',
|
|
254
|
+
created_at: new Date().toISOString(),
|
|
255
|
+
updated_at: new Date().toISOString(),
|
|
256
|
+
metadata: sessionSerializer.serializeMetadata(metadata),
|
|
257
|
+
parent_pid: process.pid,
|
|
258
|
+
child_pids: '[]',
|
|
259
|
+
};
|
|
260
|
+
this.memoryStore.sessions.set(sessionId, sessionData);
|
|
261
|
+
} else {
|
|
262
|
+
// Use SQLite
|
|
263
|
+
const stmt = this.db.prepare(`
|
|
213
264
|
INSERT INTO sessions (id, swarm_id, swarm_name, objective, metadata, parent_pid)
|
|
214
265
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
215
266
|
`);
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
267
|
+
|
|
268
|
+
stmt.run(
|
|
269
|
+
sessionId,
|
|
270
|
+
swarmId,
|
|
271
|
+
swarmName,
|
|
272
|
+
objective,
|
|
273
|
+
sessionSerializer.serializeMetadata(metadata),
|
|
274
|
+
process.pid,
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Log session creation
|
|
279
|
+
await this.logSessionEvent(sessionId, 'info', 'Session created', null, {
|
|
280
|
+
swarmId,
|
|
281
|
+
swarmName,
|
|
282
|
+
objective,
|
|
283
|
+
parentPid: process.pid,
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
return sessionId;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
228
290
|
* Save session checkpoint
|
|
229
|
-
*/
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
291
|
+
*/
|
|
292
|
+
async saveCheckpoint(sessionId, checkpointName, checkpointData) {
|
|
293
|
+
await this.ensureInitialized();
|
|
294
|
+
|
|
295
|
+
const checkpointId = `checkpoint-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
296
|
+
|
|
297
|
+
if (this.isInMemory) {
|
|
298
|
+
// Use in-memory storage
|
|
299
|
+
const checkpointEntry = {
|
|
300
|
+
id: checkpointId,
|
|
301
|
+
session_id: sessionId,
|
|
302
|
+
checkpoint_name: checkpointName,
|
|
303
|
+
checkpoint_data: sessionSerializer.serializeCheckpointData(checkpointData),
|
|
304
|
+
created_at: new Date().toISOString(),
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
if (!this.memoryStore.checkpoints.has(sessionId)) {
|
|
308
|
+
this.memoryStore.checkpoints.set(sessionId, []);
|
|
309
|
+
}
|
|
310
|
+
this.memoryStore.checkpoints.get(sessionId).push(checkpointEntry);
|
|
311
|
+
|
|
312
|
+
// Update session data
|
|
313
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
314
|
+
if (session) {
|
|
315
|
+
session.checkpoint_data = sessionSerializer.serializeCheckpointData(checkpointData);
|
|
316
|
+
session.updated_at = new Date().toISOString();
|
|
317
|
+
}
|
|
318
|
+
} else {
|
|
319
|
+
// Save to database
|
|
320
|
+
const stmt = this.db.prepare(`
|
|
254
321
|
INSERT INTO session_checkpoints (id, session_id, checkpoint_name, checkpoint_data)
|
|
255
322
|
VALUES (?, ?, ?, ?)
|
|
256
323
|
`);
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
324
|
+
|
|
325
|
+
stmt.run(
|
|
326
|
+
checkpointId,
|
|
327
|
+
sessionId,
|
|
328
|
+
checkpointName,
|
|
329
|
+
sessionSerializer.serializeCheckpointData(checkpointData),
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
// Update session checkpoint data and timestamp
|
|
333
|
+
const updateStmt = this.db.prepare(`
|
|
260
334
|
UPDATE sessions
|
|
261
335
|
SET checkpoint_data = ?, updated_at = CURRENT_TIMESTAMP
|
|
262
336
|
WHERE id = ?
|
|
263
337
|
`);
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
338
|
+
|
|
339
|
+
updateStmt.run(sessionSerializer.serializeCheckpointData(checkpointData), sessionId);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Save checkpoint file for backup
|
|
343
|
+
const checkpointFile = path.join(this.sessionsDir, `${sessionId}-${checkpointName}.json`);
|
|
344
|
+
await writeFile(
|
|
345
|
+
checkpointFile,
|
|
346
|
+
sessionSerializer.serializeSessionData({
|
|
347
|
+
sessionId,
|
|
348
|
+
checkpointId,
|
|
349
|
+
checkpointName,
|
|
350
|
+
timestamp: new Date().toISOString(),
|
|
351
|
+
data: checkpointData,
|
|
352
|
+
}),
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
await this.logSessionEvent(sessionId, 'info', `Checkpoint saved: ${checkpointName}`, null, {
|
|
356
|
+
checkpointId,
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
return checkpointId;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
281
363
|
* Get active sessions
|
|
282
|
-
*/
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
364
|
+
*/
|
|
365
|
+
async getActiveSessions() {
|
|
366
|
+
await this.ensureInitialized();
|
|
367
|
+
|
|
368
|
+
if (this.isInMemory) {
|
|
369
|
+
// Use in-memory storage
|
|
370
|
+
const sessions = [];
|
|
371
|
+
for (const [sessionId, session] of this.memoryStore.sessions) {
|
|
372
|
+
if (session.status === 'active' || session.status === 'paused') {
|
|
373
|
+
sessions.push({
|
|
374
|
+
...session,
|
|
375
|
+
metadata: session.metadata
|
|
376
|
+
? sessionSerializer.deserializeMetadata(session.metadata)
|
|
377
|
+
: {},
|
|
378
|
+
checkpoint_data: session.checkpoint_data
|
|
379
|
+
? sessionSerializer.deserializeCheckpointData(session.checkpoint_data)
|
|
380
|
+
: null,
|
|
381
|
+
agent_count: 0, // Not tracked in memory mode
|
|
382
|
+
task_count: 0, // Not tracked in memory mode
|
|
383
|
+
completed_tasks: 0, // Not tracked in memory mode
|
|
384
|
+
completion_percentage: 0,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return sessions.sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at));
|
|
389
|
+
} else {
|
|
390
|
+
// Use SQLite
|
|
391
|
+
const stmt = this.db.prepare(`
|
|
304
392
|
SELECT s.*,
|
|
305
393
|
COUNT(DISTINCT a.id) as agent_count,
|
|
306
394
|
COUNT(DISTINCT t.id) as task_count,
|
|
@@ -312,608 +400,824 @@ To enable persistence, see: https://github.com/ruvnet/claude-code-flow/docs/wind
|
|
|
312
400
|
GROUP BY s.id
|
|
313
401
|
ORDER BY s.updated_at DESC
|
|
314
402
|
`);
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
403
|
+
|
|
404
|
+
const sessions = stmt.all();
|
|
405
|
+
|
|
406
|
+
// Parse JSON fields
|
|
407
|
+
return sessions.map((session) => ({
|
|
408
|
+
...session,
|
|
409
|
+
metadata: session.metadata ? sessionSerializer.deserializeMetadata(session.metadata) : {},
|
|
410
|
+
checkpoint_data: session.checkpoint_data
|
|
411
|
+
? sessionSerializer.deserializeCheckpointData(session.checkpoint_data)
|
|
412
|
+
: null,
|
|
413
|
+
completion_percentage:
|
|
414
|
+
session.task_count > 0
|
|
415
|
+
? Math.round((session.completed_tasks / session.task_count) * 100)
|
|
416
|
+
: 0,
|
|
417
|
+
}));
|
|
324
418
|
}
|
|
325
|
-
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
326
422
|
* Get session by ID with full details
|
|
327
|
-
*/
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
423
|
+
*/
|
|
424
|
+
async getSession(sessionId) {
|
|
425
|
+
await this.ensureInitialized();
|
|
426
|
+
|
|
427
|
+
if (this.isInMemory) {
|
|
428
|
+
// Use in-memory storage
|
|
429
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
430
|
+
if (!session) {
|
|
431
|
+
return null;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Return simplified session data for in-memory mode
|
|
435
|
+
return {
|
|
436
|
+
...session,
|
|
437
|
+
metadata: session.metadata ? sessionSerializer.deserializeMetadata(session.metadata) : {},
|
|
438
|
+
checkpoint_data: session.checkpoint_data
|
|
439
|
+
? sessionSerializer.deserializeCheckpointData(session.checkpoint_data)
|
|
440
|
+
: null,
|
|
441
|
+
swarm: null, // Not available in memory mode
|
|
442
|
+
agents: [], // Not available in memory mode
|
|
443
|
+
tasks: [], // Not available in memory mode
|
|
444
|
+
checkpoints: this.memoryStore.checkpoints.get(sessionId) || [],
|
|
445
|
+
recentLogs: this.memoryStore.logs.get(sessionId) || [],
|
|
446
|
+
statistics: {
|
|
447
|
+
totalAgents: 0,
|
|
448
|
+
activeAgents: 0,
|
|
449
|
+
totalTasks: 0,
|
|
450
|
+
completedTasks: 0,
|
|
451
|
+
pendingTasks: 0,
|
|
452
|
+
inProgressTasks: 0,
|
|
453
|
+
completionPercentage: session.completion_percentage || 0,
|
|
454
|
+
},
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
const session = this.db
|
|
459
|
+
.prepare(
|
|
460
|
+
`
|
|
357
461
|
SELECT * FROM sessions WHERE id = ?
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
462
|
+
`,
|
|
463
|
+
)
|
|
464
|
+
.get(sessionId);
|
|
465
|
+
|
|
466
|
+
if (!session) {
|
|
467
|
+
return null;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Get associated swarm data
|
|
471
|
+
const swarm = this.db
|
|
472
|
+
.prepare(
|
|
473
|
+
`
|
|
364
474
|
SELECT * FROM swarms WHERE id = ?
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
475
|
+
`,
|
|
476
|
+
)
|
|
477
|
+
.get(session.swarm_id);
|
|
478
|
+
|
|
479
|
+
// Get agents
|
|
480
|
+
const agents = this.db
|
|
481
|
+
.prepare(
|
|
482
|
+
`
|
|
368
483
|
SELECT * FROM agents WHERE swarm_id = ?
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
484
|
+
`,
|
|
485
|
+
)
|
|
486
|
+
.all(session.swarm_id);
|
|
487
|
+
|
|
488
|
+
// Get tasks
|
|
489
|
+
const tasks = this.db
|
|
490
|
+
.prepare(
|
|
491
|
+
`
|
|
372
492
|
SELECT * FROM tasks WHERE swarm_id = ?
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
493
|
+
`,
|
|
494
|
+
)
|
|
495
|
+
.all(session.swarm_id);
|
|
496
|
+
|
|
497
|
+
// Get checkpoints
|
|
498
|
+
const checkpoints = this.db
|
|
499
|
+
.prepare(
|
|
500
|
+
`
|
|
376
501
|
SELECT * FROM session_checkpoints
|
|
377
502
|
WHERE session_id = ?
|
|
378
503
|
ORDER BY created_at DESC
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
504
|
+
`,
|
|
505
|
+
)
|
|
506
|
+
.all(sessionId);
|
|
507
|
+
|
|
508
|
+
// Get recent logs
|
|
509
|
+
const recentLogs = this.db
|
|
510
|
+
.prepare(
|
|
511
|
+
`
|
|
382
512
|
SELECT * FROM session_logs
|
|
383
513
|
WHERE session_id = ?
|
|
384
514
|
ORDER BY timestamp DESC
|
|
385
515
|
LIMIT 50
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
516
|
+
`,
|
|
517
|
+
)
|
|
518
|
+
.all(sessionId);
|
|
519
|
+
|
|
520
|
+
return {
|
|
521
|
+
...session,
|
|
522
|
+
metadata: session.metadata ? sessionSerializer.deserializeMetadata(session.metadata) : {},
|
|
523
|
+
checkpoint_data: session.checkpoint_data
|
|
524
|
+
? sessionSerializer.deserializeCheckpointData(session.checkpoint_data)
|
|
525
|
+
: null,
|
|
526
|
+
swarm,
|
|
527
|
+
agents,
|
|
528
|
+
tasks,
|
|
529
|
+
checkpoints: checkpoints.map((cp) => ({
|
|
530
|
+
...cp,
|
|
531
|
+
checkpoint_data: sessionSerializer.deserializeCheckpointData(cp.checkpoint_data),
|
|
532
|
+
})),
|
|
533
|
+
recentLogs,
|
|
534
|
+
statistics: {
|
|
535
|
+
totalAgents: agents.length,
|
|
536
|
+
activeAgents: agents.filter((a) => a.status === 'active' || a.status === 'busy').length,
|
|
537
|
+
totalTasks: tasks.length,
|
|
538
|
+
completedTasks: tasks.filter((t) => t.status === 'completed').length,
|
|
539
|
+
pendingTasks: tasks.filter((t) => t.status === 'pending').length,
|
|
540
|
+
inProgressTasks: tasks.filter((t) => t.status === 'in_progress').length,
|
|
541
|
+
completionPercentage:
|
|
542
|
+
tasks.length > 0
|
|
543
|
+
? Math.round(
|
|
544
|
+
(tasks.filter((t) => t.status === 'completed').length / tasks.length) * 100,
|
|
545
|
+
)
|
|
546
|
+
: 0,
|
|
547
|
+
},
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
411
552
|
* Pause a session
|
|
412
|
-
*/
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
553
|
+
*/
|
|
554
|
+
async pauseSession(sessionId) {
|
|
555
|
+
await this.ensureInitialized();
|
|
556
|
+
|
|
557
|
+
if (this.isInMemory) {
|
|
558
|
+
// Use in-memory storage
|
|
559
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
560
|
+
if (session) {
|
|
561
|
+
session.status = 'paused';
|
|
562
|
+
session.paused_at = new Date().toISOString();
|
|
563
|
+
session.updated_at = new Date().toISOString();
|
|
564
|
+
|
|
565
|
+
await this.logSessionEvent(sessionId, 'info', 'Session paused');
|
|
566
|
+
return true;
|
|
567
|
+
}
|
|
568
|
+
return false;
|
|
569
|
+
} else {
|
|
570
|
+
// Use SQLite
|
|
571
|
+
const stmt = this.db.prepare(`
|
|
428
572
|
UPDATE sessions
|
|
429
573
|
SET status = 'paused', paused_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP
|
|
430
574
|
WHERE id = ?
|
|
431
575
|
`);
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
576
|
+
|
|
577
|
+
const result = stmt.run(sessionId);
|
|
578
|
+
|
|
579
|
+
if (result.changes > 0) {
|
|
580
|
+
await this.logSessionEvent(sessionId, 'info', 'Session paused');
|
|
581
|
+
|
|
582
|
+
// Update swarm status
|
|
583
|
+
const session = this.db
|
|
584
|
+
.prepare('SELECT swarm_id FROM sessions WHERE id = ?')
|
|
585
|
+
.get(sessionId);
|
|
586
|
+
if (session) {
|
|
587
|
+
this.db
|
|
588
|
+
.prepare('UPDATE swarms SET status = ? WHERE id = ?')
|
|
589
|
+
.run('paused', session.swarm_id);
|
|
442
590
|
}
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
return result.changes > 0;
|
|
443
594
|
}
|
|
444
|
-
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
445
598
|
* Resume any previous session (paused, stopped, or inactive)
|
|
446
|
-
*/
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
599
|
+
*/
|
|
600
|
+
async resumeSession(sessionId) {
|
|
601
|
+
const session = await this.getSession(sessionId);
|
|
602
|
+
|
|
603
|
+
if (!session) {
|
|
604
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// Allow resuming any session regardless of status
|
|
608
|
+
console.log(`Resuming session ${sessionId} from status: ${session.status}`);
|
|
609
|
+
|
|
610
|
+
// If session was stopped, log that we're restarting it
|
|
611
|
+
if (session.status === 'stopped') {
|
|
612
|
+
await this.logSessionEvent(
|
|
613
|
+
sessionId,
|
|
614
|
+
'info',
|
|
615
|
+
`Restarting stopped session with original configuration`,
|
|
616
|
+
);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// Update session status
|
|
620
|
+
if (this.isInMemory) {
|
|
621
|
+
// Use in-memory storage
|
|
622
|
+
const sessionData = this.memoryStore.sessions.get(sessionId);
|
|
623
|
+
if (sessionData) {
|
|
624
|
+
sessionData.status = 'active';
|
|
625
|
+
sessionData.resumed_at = new Date().toISOString();
|
|
626
|
+
sessionData.updated_at = new Date().toISOString();
|
|
627
|
+
}
|
|
628
|
+
} else {
|
|
629
|
+
// Use SQLite
|
|
630
|
+
const stmt = this.db.prepare(`
|
|
469
631
|
UPDATE sessions
|
|
470
632
|
SET status = 'active', resumed_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP
|
|
471
633
|
WHERE id = ?
|
|
472
634
|
`);
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
635
|
+
|
|
636
|
+
stmt.run(sessionId);
|
|
637
|
+
|
|
638
|
+
// Update swarm status
|
|
639
|
+
this.db.prepare('UPDATE swarms SET status = ? WHERE id = ?').run('active', session.swarm_id);
|
|
640
|
+
|
|
641
|
+
// Update agent statuses
|
|
642
|
+
this.db
|
|
643
|
+
.prepare(
|
|
644
|
+
`
|
|
478
645
|
UPDATE agents
|
|
479
646
|
SET status = CASE
|
|
480
647
|
WHEN role = 'queen' THEN 'active'
|
|
481
648
|
ELSE 'idle'
|
|
482
649
|
END
|
|
483
650
|
WHERE swarm_id = ?
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
pausedDuration: session.paused_at ? new Date() - new Date(session.paused_at) : null
|
|
488
|
-
});
|
|
489
|
-
return session;
|
|
651
|
+
`,
|
|
652
|
+
)
|
|
653
|
+
.run(session.swarm_id);
|
|
490
654
|
}
|
|
491
|
-
|
|
655
|
+
|
|
656
|
+
await this.logSessionEvent(sessionId, 'info', 'Session resumed', null, {
|
|
657
|
+
pausedDuration: session.paused_at ? new Date() - new Date(session.paused_at) : null,
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
return session;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/**
|
|
492
664
|
* Mark session as completed
|
|
493
|
-
*/
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
665
|
+
*/
|
|
666
|
+
async completeSession(sessionId) {
|
|
667
|
+
await this.ensureInitialized();
|
|
668
|
+
|
|
669
|
+
if (this.isInMemory) {
|
|
670
|
+
// Use in-memory storage
|
|
671
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
672
|
+
if (session) {
|
|
673
|
+
session.status = 'completed';
|
|
674
|
+
session.updated_at = new Date().toISOString();
|
|
675
|
+
session.completion_percentage = 100;
|
|
676
|
+
|
|
677
|
+
await this.logSessionEvent(sessionId, 'info', 'Session completed');
|
|
678
|
+
return true;
|
|
679
|
+
}
|
|
680
|
+
return false;
|
|
681
|
+
} else {
|
|
682
|
+
// Use SQLite
|
|
683
|
+
const stmt = this.db.prepare(`
|
|
509
684
|
UPDATE sessions
|
|
510
685
|
SET status = 'completed', updated_at = CURRENT_TIMESTAMP, completion_percentage = 100
|
|
511
686
|
WHERE id = ?
|
|
512
687
|
`);
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
688
|
+
|
|
689
|
+
const result = stmt.run(sessionId);
|
|
690
|
+
|
|
691
|
+
if (result.changes > 0) {
|
|
692
|
+
await this.logSessionEvent(sessionId, 'info', 'Session completed');
|
|
693
|
+
|
|
694
|
+
// Update swarm status
|
|
695
|
+
const session = this.db
|
|
696
|
+
.prepare('SELECT swarm_id FROM sessions WHERE id = ?')
|
|
697
|
+
.get(sessionId);
|
|
698
|
+
if (session) {
|
|
699
|
+
this.db
|
|
700
|
+
.prepare('UPDATE swarms SET status = ? WHERE id = ?')
|
|
701
|
+
.run('completed', session.swarm_id);
|
|
523
702
|
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
return result.changes > 0;
|
|
524
706
|
}
|
|
525
|
-
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/**
|
|
526
710
|
* Archive old sessions
|
|
527
|
-
*/
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
711
|
+
*/
|
|
712
|
+
async archiveSessions(daysOld = 30) {
|
|
713
|
+
await this.ensureInitialized();
|
|
714
|
+
|
|
715
|
+
if (this.isInMemory) {
|
|
716
|
+
// In-memory mode doesn't support archiving
|
|
717
|
+
console.warn('Session archiving not supported in in-memory mode');
|
|
718
|
+
return 0;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
const cutoffDate = new Date();
|
|
722
|
+
cutoffDate.setDate(cutoffDate.getDate() - daysOld);
|
|
723
|
+
|
|
724
|
+
const sessionsToArchive = this.db
|
|
725
|
+
.prepare(
|
|
726
|
+
`
|
|
537
727
|
SELECT * FROM sessions
|
|
538
728
|
WHERE status = 'completed' AND updated_at < ?
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
for (const session of sessionsToArchive){
|
|
547
|
-
const sessionData = await this.getSession(session.id);
|
|
548
|
-
const archiveFile = path.join(archiveDir, `${session.id}-archive.json`);
|
|
549
|
-
await writeFile(archiveFile, sessionSerializer.serializeSessionData(sessionData));
|
|
550
|
-
// Remove from database
|
|
551
|
-
this.db.prepare('DELETE FROM session_logs WHERE session_id = ?').run(session.id);
|
|
552
|
-
this.db.prepare('DELETE FROM session_checkpoints WHERE session_id = ?').run(session.id);
|
|
553
|
-
this.db.prepare('DELETE FROM sessions WHERE id = ?').run(session.id);
|
|
554
|
-
}
|
|
555
|
-
return sessionsToArchive.length;
|
|
729
|
+
`,
|
|
730
|
+
)
|
|
731
|
+
.all(cutoffDate.toISOString());
|
|
732
|
+
|
|
733
|
+
const archiveDir = path.join(this.sessionsDir, 'archive');
|
|
734
|
+
if (!existsSync(archiveDir)) {
|
|
735
|
+
mkdirSync(archiveDir, { recursive: true });
|
|
556
736
|
}
|
|
557
|
-
|
|
737
|
+
|
|
738
|
+
for (const session of sessionsToArchive) {
|
|
739
|
+
const sessionData = await this.getSession(session.id);
|
|
740
|
+
const archiveFile = path.join(archiveDir, `${session.id}-archive.json`);
|
|
741
|
+
|
|
742
|
+
await writeFile(archiveFile, sessionSerializer.serializeSessionData(sessionData));
|
|
743
|
+
|
|
744
|
+
// Remove from database
|
|
745
|
+
this.db.prepare('DELETE FROM session_logs WHERE session_id = ?').run(session.id);
|
|
746
|
+
this.db.prepare('DELETE FROM session_checkpoints WHERE session_id = ?').run(session.id);
|
|
747
|
+
this.db.prepare('DELETE FROM sessions WHERE id = ?').run(session.id);
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
return sessionsToArchive.length;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/**
|
|
558
754
|
* Log session event
|
|
559
|
-
*/
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
755
|
+
*/
|
|
756
|
+
async logSessionEvent(sessionId, logLevel, message, agentId = null, data = null) {
|
|
757
|
+
await this.ensureInitialized();
|
|
758
|
+
|
|
759
|
+
if (this.isInMemory) {
|
|
760
|
+
// Use in-memory storage for logs
|
|
761
|
+
const logId = `log-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
762
|
+
const logEntry = {
|
|
763
|
+
id: logId,
|
|
764
|
+
session_id: sessionId,
|
|
765
|
+
timestamp: new Date().toISOString(),
|
|
766
|
+
log_level: logLevel,
|
|
767
|
+
message,
|
|
768
|
+
agent_id: agentId,
|
|
769
|
+
data: data ? sessionSerializer.serializeLogData(data) : null,
|
|
770
|
+
};
|
|
771
|
+
|
|
772
|
+
if (!this.memoryStore.logs.has(sessionId)) {
|
|
773
|
+
this.memoryStore.logs.set(sessionId, []);
|
|
774
|
+
}
|
|
775
|
+
this.memoryStore.logs.get(sessionId).push(logEntry);
|
|
776
|
+
} else {
|
|
777
|
+
// Use SQLite
|
|
778
|
+
const stmt = this.db.prepare(`
|
|
580
779
|
INSERT INTO session_logs (session_id, log_level, message, agent_id, data)
|
|
581
780
|
VALUES (?, ?, ?, ?, ?)
|
|
582
781
|
`);
|
|
583
|
-
|
|
584
|
-
|
|
782
|
+
|
|
783
|
+
stmt.run(
|
|
784
|
+
sessionId,
|
|
785
|
+
logLevel,
|
|
786
|
+
message,
|
|
787
|
+
agentId,
|
|
788
|
+
data ? sessionSerializer.serializeLogData(data) : null,
|
|
789
|
+
);
|
|
585
790
|
}
|
|
586
|
-
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
/**
|
|
587
794
|
* Get session logs
|
|
588
|
-
*/
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
795
|
+
*/
|
|
796
|
+
async getSessionLogs(sessionId, limit = 100, offset = 0) {
|
|
797
|
+
await this.ensureInitialized();
|
|
798
|
+
|
|
799
|
+
if (this.isInMemory) {
|
|
800
|
+
// Use in-memory storage
|
|
801
|
+
const logs = this.memoryStore.logs.get(sessionId) || [];
|
|
802
|
+
return logs.slice(offset, offset + limit).map((log) => ({
|
|
803
|
+
...log,
|
|
804
|
+
data: log.data ? sessionSerializer.deserializeLogData(log.data) : null,
|
|
805
|
+
}));
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
const stmt = this.db.prepare(`
|
|
599
809
|
SELECT * FROM session_logs
|
|
600
810
|
WHERE session_id = ?
|
|
601
811
|
ORDER BY timestamp DESC
|
|
602
812
|
LIMIT ? OFFSET ?
|
|
603
813
|
`);
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
814
|
+
|
|
815
|
+
const logs = stmt.all(sessionId, limit, offset);
|
|
816
|
+
|
|
817
|
+
return logs.map((log) => ({
|
|
818
|
+
...log,
|
|
819
|
+
data: log.data ? sessionSerializer.deserializeLogData(log.data) : null,
|
|
820
|
+
}));
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/**
|
|
611
824
|
* Update session progress
|
|
612
|
-
*/
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
825
|
+
*/
|
|
826
|
+
async updateSessionProgress(sessionId, completionPercentage) {
|
|
827
|
+
await this.ensureInitialized();
|
|
828
|
+
|
|
829
|
+
if (this.isInMemory) {
|
|
830
|
+
// Use in-memory storage
|
|
831
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
832
|
+
if (session) {
|
|
833
|
+
session.completion_percentage = completionPercentage;
|
|
834
|
+
session.updated_at = new Date().toISOString();
|
|
835
|
+
}
|
|
836
|
+
} else {
|
|
837
|
+
// Use SQLite
|
|
838
|
+
const stmt = this.db.prepare(`
|
|
624
839
|
UPDATE sessions
|
|
625
840
|
SET completion_percentage = ?, updated_at = CURRENT_TIMESTAMP
|
|
626
841
|
WHERE id = ?
|
|
627
842
|
`);
|
|
628
|
-
|
|
629
|
-
|
|
843
|
+
|
|
844
|
+
stmt.run(completionPercentage, sessionId);
|
|
630
845
|
}
|
|
631
|
-
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/**
|
|
632
849
|
* Generate session summary
|
|
633
|
-
*/
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
const tasksByType = session.agents.reduce((acc, agent)=>{
|
|
640
|
-
const agentTasks = session.tasks.filter((t)=>t.agent_id === agent.id);
|
|
641
|
-
if (!acc[agent.type]) {
|
|
642
|
-
acc[agent.type] = {
|
|
643
|
-
total: 0,
|
|
644
|
-
completed: 0,
|
|
645
|
-
inProgress: 0,
|
|
646
|
-
pending: 0
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
acc[agent.type].total += agentTasks.length;
|
|
650
|
-
acc[agent.type].completed += agentTasks.filter((t)=>t.status === 'completed').length;
|
|
651
|
-
acc[agent.type].inProgress += agentTasks.filter((t)=>t.status === 'in_progress').length;
|
|
652
|
-
acc[agent.type].pending += agentTasks.filter((t)=>t.status === 'pending').length;
|
|
653
|
-
return acc;
|
|
654
|
-
}, {});
|
|
655
|
-
return {
|
|
656
|
-
sessionId: session.id,
|
|
657
|
-
swarmName: session.swarm_name,
|
|
658
|
-
objective: session.objective,
|
|
659
|
-
status: session.status,
|
|
660
|
-
duration: Math.round(duration / 1000 / 60),
|
|
661
|
-
statistics: session.statistics,
|
|
662
|
-
tasksByType,
|
|
663
|
-
checkpointCount: session.checkpoints.length,
|
|
664
|
-
lastCheckpoint: session.checkpoints[0] || null,
|
|
665
|
-
timeline: {
|
|
666
|
-
created: session.created_at,
|
|
667
|
-
lastUpdated: session.updated_at,
|
|
668
|
-
paused: session.paused_at,
|
|
669
|
-
resumed: session.resumed_at
|
|
670
|
-
}
|
|
671
|
-
};
|
|
850
|
+
*/
|
|
851
|
+
async generateSessionSummary(sessionId) {
|
|
852
|
+
const session = await this.getSession(sessionId);
|
|
853
|
+
|
|
854
|
+
if (!session) {
|
|
855
|
+
return null;
|
|
672
856
|
}
|
|
673
|
-
|
|
857
|
+
|
|
858
|
+
const duration =
|
|
859
|
+
session.paused_at && session.resumed_at
|
|
860
|
+
? new Date(session.updated_at) -
|
|
861
|
+
new Date(session.created_at) -
|
|
862
|
+
(new Date(session.resumed_at) - new Date(session.paused_at))
|
|
863
|
+
: new Date(session.updated_at) - new Date(session.created_at);
|
|
864
|
+
|
|
865
|
+
const tasksByType = session.agents.reduce((acc, agent) => {
|
|
866
|
+
const agentTasks = session.tasks.filter((t) => t.agent_id === agent.id);
|
|
867
|
+
if (!acc[agent.type]) {
|
|
868
|
+
acc[agent.type] = {
|
|
869
|
+
total: 0,
|
|
870
|
+
completed: 0,
|
|
871
|
+
inProgress: 0,
|
|
872
|
+
pending: 0,
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
acc[agent.type].total += agentTasks.length;
|
|
876
|
+
acc[agent.type].completed += agentTasks.filter((t) => t.status === 'completed').length;
|
|
877
|
+
acc[agent.type].inProgress += agentTasks.filter((t) => t.status === 'in_progress').length;
|
|
878
|
+
acc[agent.type].pending += agentTasks.filter((t) => t.status === 'pending').length;
|
|
879
|
+
return acc;
|
|
880
|
+
}, {});
|
|
881
|
+
|
|
882
|
+
return {
|
|
883
|
+
sessionId: session.id,
|
|
884
|
+
swarmName: session.swarm_name,
|
|
885
|
+
objective: session.objective,
|
|
886
|
+
status: session.status,
|
|
887
|
+
duration: Math.round(duration / 1000 / 60), // minutes
|
|
888
|
+
statistics: session.statistics,
|
|
889
|
+
tasksByType,
|
|
890
|
+
checkpointCount: session.checkpoints.length,
|
|
891
|
+
lastCheckpoint: session.checkpoints[0] || null,
|
|
892
|
+
timeline: {
|
|
893
|
+
created: session.created_at,
|
|
894
|
+
lastUpdated: session.updated_at,
|
|
895
|
+
paused: session.paused_at,
|
|
896
|
+
resumed: session.resumed_at,
|
|
897
|
+
},
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/**
|
|
674
902
|
* Export session data
|
|
675
|
-
*/
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
await writeFile(exportFile, sessionSerializer.serializeSessionData(session));
|
|
682
|
-
return exportFile;
|
|
903
|
+
*/
|
|
904
|
+
async exportSession(sessionId, exportPath = null) {
|
|
905
|
+
const session = await this.getSession(sessionId);
|
|
906
|
+
|
|
907
|
+
if (!session) {
|
|
908
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
683
909
|
}
|
|
684
|
-
|
|
910
|
+
|
|
911
|
+
const exportFile = exportPath || path.join(this.sessionsDir, `${sessionId}-export.json`);
|
|
912
|
+
|
|
913
|
+
await writeFile(exportFile, sessionSerializer.serializeSessionData(session));
|
|
914
|
+
|
|
915
|
+
return exportFile;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/**
|
|
685
919
|
* Import session data
|
|
686
|
-
*/
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
920
|
+
*/
|
|
921
|
+
async importSession(importPath) {
|
|
922
|
+
const sessionData = sessionSerializer.deserializeSessionData(
|
|
923
|
+
await readFile(importPath, 'utf8'),
|
|
924
|
+
);
|
|
925
|
+
|
|
926
|
+
// Create new session with imported data
|
|
927
|
+
const newSessionId = this.createSession(
|
|
928
|
+
sessionData.swarm_id,
|
|
929
|
+
sessionData.swarm_name,
|
|
930
|
+
sessionData.objective,
|
|
931
|
+
sessionData.metadata,
|
|
932
|
+
);
|
|
933
|
+
|
|
934
|
+
// Import checkpoints
|
|
935
|
+
for (const checkpoint of sessionData.checkpoints || []) {
|
|
936
|
+
await this.saveCheckpoint(
|
|
937
|
+
newSessionId,
|
|
938
|
+
checkpoint.checkpoint_name,
|
|
939
|
+
checkpoint.checkpoint_data,
|
|
940
|
+
);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
// Import logs
|
|
944
|
+
for (const log of sessionData.recentLogs || []) {
|
|
945
|
+
await this.logSessionEvent(
|
|
946
|
+
newSessionId,
|
|
947
|
+
log.log_level,
|
|
948
|
+
log.message,
|
|
949
|
+
log.agent_id,
|
|
950
|
+
log.data ? sessionSerializer.deserializeLogData(log.data) : null,
|
|
951
|
+
);
|
|
699
952
|
}
|
|
700
|
-
|
|
953
|
+
|
|
954
|
+
return newSessionId;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
/**
|
|
701
958
|
* Add a child process PID to session
|
|
702
|
-
*/
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
959
|
+
*/
|
|
960
|
+
async addChildPid(sessionId, pid) {
|
|
961
|
+
await this.ensureInitialized();
|
|
962
|
+
|
|
963
|
+
if (this.isInMemory) {
|
|
964
|
+
// Use in-memory storage
|
|
965
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
966
|
+
if (!session) return false;
|
|
967
|
+
|
|
968
|
+
const childPids = session.child_pids
|
|
969
|
+
? sessionSerializer.deserializeLogData(session.child_pids)
|
|
970
|
+
: [];
|
|
971
|
+
if (!childPids.includes(pid)) {
|
|
972
|
+
childPids.push(pid);
|
|
973
|
+
}
|
|
974
|
+
session.child_pids = sessionSerializer.serializeLogData(childPids);
|
|
975
|
+
session.updated_at = new Date().toISOString();
|
|
976
|
+
|
|
977
|
+
await this.logSessionEvent(sessionId, 'info', 'Child process added', null, { pid });
|
|
978
|
+
return true;
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
const session = this.db.prepare('SELECT child_pids FROM sessions WHERE id = ?').get(sessionId);
|
|
982
|
+
if (!session) return false;
|
|
983
|
+
|
|
984
|
+
const childPids = session.child_pids
|
|
985
|
+
? sessionSerializer.deserializeLogData(session.child_pids)
|
|
986
|
+
: [];
|
|
987
|
+
if (!childPids.includes(pid)) {
|
|
988
|
+
childPids.push(pid);
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
const stmt = this.db.prepare(`
|
|
726
992
|
UPDATE sessions
|
|
727
993
|
SET child_pids = ?, updated_at = CURRENT_TIMESTAMP
|
|
728
994
|
WHERE id = ?
|
|
729
995
|
`);
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
996
|
+
|
|
997
|
+
stmt.run(sessionSerializer.serializeLogData(childPids), sessionId);
|
|
998
|
+
|
|
999
|
+
await this.logSessionEvent(sessionId, 'info', 'Child process added', null, { pid });
|
|
1000
|
+
return true;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
/**
|
|
737
1004
|
* Remove a child process PID from session
|
|
738
|
-
*/
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
1005
|
+
*/
|
|
1006
|
+
async removeChildPid(sessionId, pid) {
|
|
1007
|
+
await this.ensureInitialized();
|
|
1008
|
+
|
|
1009
|
+
if (this.isInMemory) {
|
|
1010
|
+
// Use in-memory storage
|
|
1011
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
1012
|
+
if (!session) return false;
|
|
1013
|
+
|
|
1014
|
+
const childPids = session.child_pids
|
|
1015
|
+
? sessionSerializer.deserializeLogData(session.child_pids)
|
|
1016
|
+
: [];
|
|
1017
|
+
const index = childPids.indexOf(pid);
|
|
1018
|
+
if (index > -1) {
|
|
1019
|
+
childPids.splice(index, 1);
|
|
1020
|
+
}
|
|
1021
|
+
session.child_pids = sessionSerializer.serializeLogData(childPids);
|
|
1022
|
+
session.updated_at = new Date().toISOString();
|
|
1023
|
+
|
|
1024
|
+
await this.logSessionEvent(sessionId, 'info', 'Child process removed', null, { pid });
|
|
1025
|
+
return true;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// Check if database connection is still open before operations
|
|
1029
|
+
if (!this.db || !this.db.open) {
|
|
1030
|
+
console.warn('Database connection closed, cannot remove child PID during cleanup');
|
|
1031
|
+
return false;
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
const session = this.db.prepare('SELECT child_pids FROM sessions WHERE id = ?').get(sessionId);
|
|
1035
|
+
if (!session) return false;
|
|
1036
|
+
|
|
1037
|
+
const childPids = session.child_pids
|
|
1038
|
+
? sessionSerializer.deserializeLogData(session.child_pids)
|
|
1039
|
+
: [];
|
|
1040
|
+
const index = childPids.indexOf(pid);
|
|
1041
|
+
if (index > -1) {
|
|
1042
|
+
childPids.splice(index, 1);
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
const stmt = this.db.prepare(`
|
|
769
1046
|
UPDATE sessions
|
|
770
1047
|
SET child_pids = ?, updated_at = CURRENT_TIMESTAMP
|
|
771
1048
|
WHERE id = ?
|
|
772
1049
|
`);
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
1050
|
+
|
|
1051
|
+
stmt.run(sessionSerializer.serializeLogData(childPids), sessionId);
|
|
1052
|
+
|
|
1053
|
+
await this.logSessionEvent(sessionId, 'info', 'Child process removed', null, { pid });
|
|
1054
|
+
return true;
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
/**
|
|
780
1058
|
* Get all child PIDs for a session
|
|
781
|
-
*/
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
1059
|
+
*/
|
|
1060
|
+
async getChildPids(sessionId) {
|
|
1061
|
+
await this.ensureInitialized();
|
|
1062
|
+
|
|
1063
|
+
if (this.isInMemory) {
|
|
1064
|
+
// Use in-memory storage
|
|
1065
|
+
const session = this.memoryStore.sessions.get(sessionId);
|
|
1066
|
+
if (!session || !session.child_pids) return [];
|
|
1067
|
+
return sessionSerializer.deserializeLogData(session.child_pids);
|
|
1068
|
+
} else {
|
|
1069
|
+
// Check if database connection is still open
|
|
1070
|
+
if (!this.db || !this.db.open) {
|
|
1071
|
+
console.warn('Database connection closed, cannot get child PIDs during cleanup');
|
|
1072
|
+
return [];
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
// Use SQLite
|
|
1076
|
+
const session = this.db
|
|
1077
|
+
.prepare('SELECT child_pids FROM sessions WHERE id = ?')
|
|
1078
|
+
.get(sessionId);
|
|
1079
|
+
if (!session || !session.child_pids) return [];
|
|
1080
|
+
return sessionSerializer.deserializeLogData(session.child_pids);
|
|
799
1081
|
}
|
|
800
|
-
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
/**
|
|
801
1085
|
* Stop a session and terminate all child processes
|
|
802
|
-
*/
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
1086
|
+
*/
|
|
1087
|
+
async stopSession(sessionId) {
|
|
1088
|
+
const session = await this.getSession(sessionId);
|
|
1089
|
+
if (!session) {
|
|
1090
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// Get child PIDs
|
|
1094
|
+
const childPids = await this.getChildPids(sessionId);
|
|
1095
|
+
|
|
1096
|
+
// Terminate child processes
|
|
1097
|
+
for (const pid of childPids) {
|
|
1098
|
+
try {
|
|
1099
|
+
process.kill(pid, 'SIGTERM');
|
|
1100
|
+
await this.logSessionEvent(sessionId, 'info', 'Child process terminated', null, { pid });
|
|
1101
|
+
} catch (err) {
|
|
1102
|
+
// Process might already be dead
|
|
1103
|
+
await this.logSessionEvent(
|
|
1104
|
+
sessionId,
|
|
1105
|
+
'warning',
|
|
1106
|
+
'Failed to terminate child process',
|
|
1107
|
+
null,
|
|
1108
|
+
{
|
|
1109
|
+
pid,
|
|
1110
|
+
error: err.message,
|
|
1111
|
+
},
|
|
1112
|
+
);
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
// Update session status
|
|
1117
|
+
if (this.isInMemory) {
|
|
1118
|
+
// Use in-memory storage
|
|
1119
|
+
const sessionData = this.memoryStore.sessions.get(sessionId);
|
|
1120
|
+
if (sessionData) {
|
|
1121
|
+
sessionData.status = 'stopped';
|
|
1122
|
+
sessionData.updated_at = new Date().toISOString();
|
|
1123
|
+
}
|
|
1124
|
+
} else {
|
|
1125
|
+
// Use SQLite
|
|
1126
|
+
const stmt = this.db.prepare(`
|
|
835
1127
|
UPDATE sessions
|
|
836
1128
|
SET status = 'stopped', updated_at = CURRENT_TIMESTAMP
|
|
837
1129
|
WHERE id = ?
|
|
838
1130
|
`);
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
return true;
|
|
1131
|
+
|
|
1132
|
+
stmt.run(sessionId);
|
|
1133
|
+
|
|
1134
|
+
// Update swarm status
|
|
1135
|
+
this.db.prepare('UPDATE swarms SET status = ? WHERE id = ?').run('stopped', session.swarm_id);
|
|
845
1136
|
}
|
|
846
|
-
|
|
1137
|
+
|
|
1138
|
+
await this.logSessionEvent(sessionId, 'info', 'Session stopped');
|
|
1139
|
+
|
|
1140
|
+
return true;
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
/**
|
|
847
1144
|
* Get active sessions with process information
|
|
848
|
-
*/
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
child_pids: aliveChildPids,
|
|
867
|
-
total_processes: 1 + aliveChildPids.length
|
|
868
|
-
};
|
|
869
|
-
});
|
|
870
|
-
}
|
|
871
|
-
/**
|
|
872
|
-
* Clean up orphaned processes
|
|
873
|
-
*/ async cleanupOrphanedProcesses() {
|
|
874
|
-
await this.ensureInitialized();
|
|
875
|
-
if (this.isInMemory) {
|
|
876
|
-
// In-memory mode doesn't track orphaned processes
|
|
877
|
-
return 0;
|
|
1145
|
+
*/
|
|
1146
|
+
async getActiveSessionsWithProcessInfo() {
|
|
1147
|
+
const sessions = await this.getActiveSessions();
|
|
1148
|
+
|
|
1149
|
+
// Add process info to each session
|
|
1150
|
+
return sessions.map((session) => {
|
|
1151
|
+
const childPids = session.child_pids
|
|
1152
|
+
? sessionSerializer.deserializeLogData(session.child_pids)
|
|
1153
|
+
: [];
|
|
1154
|
+
const aliveChildPids = [];
|
|
1155
|
+
|
|
1156
|
+
// Check which child processes are still alive
|
|
1157
|
+
for (const pid of childPids) {
|
|
1158
|
+
try {
|
|
1159
|
+
process.kill(pid, 0); // Signal 0 just checks if process exists
|
|
1160
|
+
aliveChildPids.push(pid);
|
|
1161
|
+
} catch (err) {
|
|
1162
|
+
// Process is dead
|
|
878
1163
|
}
|
|
879
|
-
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
return {
|
|
1167
|
+
...session,
|
|
1168
|
+
parent_pid: session.parent_pid,
|
|
1169
|
+
child_pids: aliveChildPids,
|
|
1170
|
+
total_processes: 1 + aliveChildPids.length,
|
|
1171
|
+
};
|
|
1172
|
+
});
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
/**
|
|
1176
|
+
* Clean up orphaned processes
|
|
1177
|
+
*/
|
|
1178
|
+
async cleanupOrphanedProcesses() {
|
|
1179
|
+
await this.ensureInitialized();
|
|
1180
|
+
|
|
1181
|
+
if (this.isInMemory) {
|
|
1182
|
+
// In-memory mode doesn't track orphaned processes
|
|
1183
|
+
return 0;
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
const sessions = this.db
|
|
1187
|
+
.prepare(
|
|
1188
|
+
`
|
|
880
1189
|
SELECT * FROM sessions
|
|
881
1190
|
WHERE status IN ('active', 'paused')
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
1191
|
+
`,
|
|
1192
|
+
)
|
|
1193
|
+
.all();
|
|
1194
|
+
|
|
1195
|
+
let cleanedCount = 0;
|
|
1196
|
+
|
|
1197
|
+
for (const session of sessions) {
|
|
1198
|
+
// Check if parent process is still alive
|
|
1199
|
+
try {
|
|
1200
|
+
process.kill(session.parent_pid, 0);
|
|
1201
|
+
} catch (err) {
|
|
1202
|
+
// Parent is dead, clean up session
|
|
1203
|
+
await this.stopSession(session.id);
|
|
1204
|
+
cleanedCount++;
|
|
1205
|
+
await this.logSessionEvent(session.id, 'info', 'Orphaned session cleaned up');
|
|
1206
|
+
}
|
|
896
1207
|
}
|
|
897
|
-
|
|
1208
|
+
|
|
1209
|
+
return cleanedCount;
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
/**
|
|
898
1213
|
* Clean up and close database connection
|
|
899
|
-
*/
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
}
|
|
904
|
-
constructor(hiveMindDir = null){
|
|
905
|
-
this.hiveMindDir = hiveMindDir || path.join(cwd(), '.hive-mind');
|
|
906
|
-
this.sessionsDir = path.join(this.hiveMindDir, 'sessions');
|
|
907
|
-
this.dbPath = path.join(this.hiveMindDir, 'hive.db');
|
|
908
|
-
this.db = null;
|
|
909
|
-
this.isInMemory = false;
|
|
910
|
-
this.memoryStore = null;
|
|
911
|
-
this.initializationPromise = null;
|
|
912
|
-
// Ensure directories exist
|
|
913
|
-
this.ensureDirectories();
|
|
914
|
-
// Initialize database connection (store promise for later)
|
|
915
|
-
this.initializationPromise = this.initializeDatabase();
|
|
1214
|
+
*/
|
|
1215
|
+
close() {
|
|
1216
|
+
if (this.db && !this.isInMemory) {
|
|
1217
|
+
this.db.close();
|
|
916
1218
|
}
|
|
1219
|
+
}
|
|
917
1220
|
}
|
|
1221
|
+
|
|
918
1222
|
// Export for use in other modules
|
|
919
1223
|
export default HiveMindSessionManager;
|