@stackmemoryai/stackmemory 0.5.31 → 0.5.34

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.
Files changed (148) hide show
  1. package/dist/agents/core/agent-task-manager.js.map +1 -1
  2. package/dist/cli/claude-sm.js +199 -16
  3. package/dist/cli/claude-sm.js.map +2 -2
  4. package/dist/cli/commands/clear.js +1 -1
  5. package/dist/cli/commands/clear.js.map +1 -1
  6. package/dist/cli/commands/context.js +1 -12
  7. package/dist/cli/commands/context.js.map +2 -2
  8. package/dist/cli/commands/dashboard.js.map +1 -1
  9. package/dist/cli/commands/discovery.js +1 -1
  10. package/dist/cli/commands/discovery.js.map +1 -1
  11. package/dist/cli/commands/handoff.js +1 -1
  12. package/dist/cli/commands/handoff.js.map +1 -1
  13. package/dist/cli/commands/linear.js +1 -14
  14. package/dist/cli/commands/linear.js.map +2 -2
  15. package/dist/cli/commands/login.js +32 -10
  16. package/dist/cli/commands/login.js.map +2 -2
  17. package/dist/cli/commands/migrate.js +80 -22
  18. package/dist/cli/commands/migrate.js.map +2 -2
  19. package/dist/cli/commands/model.js +533 -0
  20. package/dist/cli/commands/model.js.map +7 -0
  21. package/dist/cli/commands/monitor.js +1 -1
  22. package/dist/cli/commands/monitor.js.map +1 -1
  23. package/dist/cli/commands/quality.js +1 -1
  24. package/dist/cli/commands/quality.js.map +1 -1
  25. package/dist/cli/commands/ralph.js +93 -28
  26. package/dist/cli/commands/ralph.js.map +2 -2
  27. package/dist/cli/commands/service.js +10 -3
  28. package/dist/cli/commands/service.js.map +2 -2
  29. package/dist/cli/commands/skills.js +61 -11
  30. package/dist/cli/commands/skills.js.map +2 -2
  31. package/dist/cli/commands/sms-notify.js +342 -22
  32. package/dist/cli/commands/sms-notify.js.map +3 -3
  33. package/dist/cli/commands/workflow.js +1 -1
  34. package/dist/cli/commands/workflow.js.map +1 -1
  35. package/dist/cli/commands/worktree.js +1 -1
  36. package/dist/cli/commands/worktree.js.map +1 -1
  37. package/dist/cli/index.js +3 -1
  38. package/dist/cli/index.js.map +2 -2
  39. package/dist/core/context/auto-context.js.map +1 -1
  40. package/dist/core/context/compaction-handler.js.map +2 -2
  41. package/dist/core/context/context-bridge.js.map +2 -2
  42. package/dist/core/context/dual-stack-manager.js +24 -8
  43. package/dist/core/context/dual-stack-manager.js.map +2 -2
  44. package/dist/core/context/enhanced-rehydration.js.map +1 -1
  45. package/dist/core/context/frame-database.js +41 -5
  46. package/dist/core/context/frame-database.js.map +2 -2
  47. package/dist/core/context/frame-digest.js +6 -1
  48. package/dist/core/context/frame-digest.js.map +2 -2
  49. package/dist/core/context/frame-handoff-manager.js.map +1 -1
  50. package/dist/core/context/frame-lifecycle-hooks.js +119 -0
  51. package/dist/core/context/frame-lifecycle-hooks.js.map +7 -0
  52. package/dist/core/context/frame-manager.js +56 -9
  53. package/dist/core/context/frame-manager.js.map +2 -2
  54. package/dist/core/context/frame-stack.js +29 -0
  55. package/dist/core/context/frame-stack.js.map +2 -2
  56. package/dist/core/context/incremental-gc.js.map +2 -2
  57. package/dist/core/context/index.js +4 -22
  58. package/dist/core/context/index.js.map +2 -2
  59. package/dist/core/context/permission-manager.js +0 -11
  60. package/dist/core/context/permission-manager.js.map +2 -2
  61. package/dist/core/context/recursive-context-manager.js +15 -9
  62. package/dist/core/context/recursive-context-manager.js.map +2 -2
  63. package/dist/core/context/refactored-frame-manager.js +140 -34
  64. package/dist/core/context/refactored-frame-manager.js.map +3 -3
  65. package/dist/core/context/shared-context-layer.js +0 -11
  66. package/dist/core/context/shared-context-layer.js.map +2 -2
  67. package/dist/core/context/stack-merge-resolver.js.map +1 -1
  68. package/dist/core/context/validation.js +6 -1
  69. package/dist/core/context/validation.js.map +2 -2
  70. package/dist/core/database/database-adapter.js.map +1 -1
  71. package/dist/core/database/paradedb-adapter.js.map +1 -1
  72. package/dist/core/database/query-router.js.map +1 -1
  73. package/dist/core/database/sqlite-adapter.js.map +1 -1
  74. package/dist/core/digest/frame-digest-integration.js.map +1 -1
  75. package/dist/core/digest/hybrid-digest-generator.js.map +1 -1
  76. package/dist/core/digest/types.js.map +1 -1
  77. package/dist/core/errors/index.js +249 -0
  78. package/dist/core/errors/index.js.map +2 -2
  79. package/dist/core/frame/workflow-templates.js.map +2 -2
  80. package/dist/core/merge/conflict-detector.js.map +1 -1
  81. package/dist/core/merge/resolution-engine.js.map +1 -1
  82. package/dist/core/merge/stack-diff.js.map +1 -1
  83. package/dist/core/models/fallback-monitor.js +229 -0
  84. package/dist/core/models/fallback-monitor.js.map +7 -0
  85. package/dist/core/models/model-router.js +340 -0
  86. package/dist/core/models/model-router.js.map +7 -0
  87. package/dist/core/monitoring/error-handler.js +37 -270
  88. package/dist/core/monitoring/error-handler.js.map +3 -3
  89. package/dist/core/monitoring/session-monitor.js.map +1 -1
  90. package/dist/core/performance/lazy-context-loader.js.map +1 -1
  91. package/dist/core/performance/optimized-frame-context.js.map +1 -1
  92. package/dist/core/retrieval/context-retriever.js.map +1 -1
  93. package/dist/core/retrieval/graph-retrieval.js.map +1 -1
  94. package/dist/core/retrieval/hierarchical-retrieval.js.map +1 -1
  95. package/dist/core/retrieval/llm-context-retrieval.js.map +1 -1
  96. package/dist/core/retrieval/retrieval-benchmarks.js.map +1 -1
  97. package/dist/core/retrieval/summary-generator.js.map +1 -1
  98. package/dist/core/retrieval/types.js.map +1 -1
  99. package/dist/core/storage/chromadb-adapter.js.map +1 -1
  100. package/dist/core/storage/infinite-storage.js.map +1 -1
  101. package/dist/core/storage/two-tier-storage.js.map +1 -1
  102. package/dist/features/tasks/task-aware-context.js.map +1 -1
  103. package/dist/features/web/server/index.js +1 -1
  104. package/dist/features/web/server/index.js.map +1 -1
  105. package/dist/hooks/claude-code-whatsapp-hook.js +197 -0
  106. package/dist/hooks/claude-code-whatsapp-hook.js.map +7 -0
  107. package/dist/hooks/linear-task-picker.js +1 -1
  108. package/dist/hooks/linear-task-picker.js.map +2 -2
  109. package/dist/hooks/schemas.js +105 -1
  110. package/dist/hooks/schemas.js.map +2 -2
  111. package/dist/hooks/session-summary.js +5 -1
  112. package/dist/hooks/session-summary.js.map +2 -2
  113. package/dist/hooks/sms-action-runner.js +16 -1
  114. package/dist/hooks/sms-action-runner.js.map +2 -2
  115. package/dist/hooks/sms-notify.js +4 -2
  116. package/dist/hooks/sms-notify.js.map +2 -2
  117. package/dist/hooks/sms-webhook.js +23 -2
  118. package/dist/hooks/sms-webhook.js.map +2 -2
  119. package/dist/hooks/whatsapp-commands.js +516 -0
  120. package/dist/hooks/whatsapp-commands.js.map +7 -0
  121. package/dist/hooks/whatsapp-scheduler.js +317 -0
  122. package/dist/hooks/whatsapp-scheduler.js.map +7 -0
  123. package/dist/hooks/whatsapp-sync.js +409 -0
  124. package/dist/hooks/whatsapp-sync.js.map +7 -0
  125. package/dist/index.js +1 -1
  126. package/dist/index.js.map +1 -1
  127. package/dist/integrations/mcp/handlers/context-handlers.js.map +1 -1
  128. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +1 -1
  129. package/dist/integrations/mcp/server.js +1 -1
  130. package/dist/integrations/mcp/server.js.map +1 -1
  131. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +1 -1
  132. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +1 -1
  133. package/dist/integrations/ralph/context/stackmemory-context-loader.js +1 -1
  134. package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +1 -1
  135. package/dist/integrations/ralph/learning/pattern-learner.js +1 -1
  136. package/dist/integrations/ralph/learning/pattern-learner.js.map +1 -1
  137. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +1 -1
  138. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +1 -1
  139. package/dist/integrations/ralph/swarm/swarm-coordinator.js +1 -1
  140. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +1 -1
  141. package/dist/integrations/ralph/visualization/ralph-debugger.js +1 -1
  142. package/dist/integrations/ralph/visualization/ralph-debugger.js.map +1 -1
  143. package/dist/mcp/stackmemory-mcp-server.js +1 -1
  144. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  145. package/dist/skills/claude-skills.js.map +1 -1
  146. package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
  147. package/dist/skills/unified-rlm-orchestrator.js.map +1 -1
  148. package/package.json +2 -3
@@ -12,6 +12,7 @@ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
12
12
  ErrorCode2["DB_INSERT_FAILED"] = "DB_007";
13
13
  ErrorCode2["DB_UPDATE_FAILED"] = "DB_008";
14
14
  ErrorCode2["DB_DELETE_FAILED"] = "DB_009";
15
+ ErrorCode2["DB_CORRUPTION"] = "DB_010";
15
16
  ErrorCode2["FRAME_NOT_FOUND"] = "FRAME_001";
16
17
  ErrorCode2["FRAME_INVALID_STATE"] = "FRAME_002";
17
18
  ErrorCode2["FRAME_PARENT_NOT_FOUND"] = "FRAME_003";
@@ -47,6 +48,18 @@ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
47
48
  ErrorCode2["RESOURCE_EXHAUSTED"] = "SYS_006";
48
49
  ErrorCode2["SERVICE_UNAVAILABLE"] = "SYS_007";
49
50
  ErrorCode2["SYSTEM_INIT_FAILED"] = "SYS_008";
51
+ ErrorCode2["UNKNOWN_ERROR"] = "SYS_009";
52
+ ErrorCode2["OPERATION_TIMEOUT"] = "SYS_010";
53
+ ErrorCode2["AUTH_FAILED"] = "AUTH_001";
54
+ ErrorCode2["TOKEN_EXPIRED"] = "AUTH_002";
55
+ ErrorCode2["INVALID_CREDENTIALS"] = "AUTH_003";
56
+ ErrorCode2["FILE_NOT_FOUND"] = "FS_001";
57
+ ErrorCode2["DISK_FULL"] = "FS_002";
58
+ ErrorCode2["NOT_GIT_REPO"] = "GIT_001";
59
+ ErrorCode2["GIT_COMMAND_FAILED"] = "GIT_002";
60
+ ErrorCode2["INVALID_BRANCH"] = "GIT_003";
61
+ ErrorCode2["NETWORK_ERROR"] = "NET_001";
62
+ ErrorCode2["API_ERROR"] = "NET_002";
50
63
  ErrorCode2["STACK_CONTEXT_NOT_FOUND"] = "COLLAB_001";
51
64
  ErrorCode2["HANDOFF_REQUEST_EXPIRED"] = "COLLAB_002";
52
65
  ErrorCode2["MERGE_CONFLICT_UNRESOLVABLE"] = "COLLAB_003";
@@ -243,9 +256,241 @@ function createErrorHandler(defaultContext) {
243
256
  );
244
257
  };
245
258
  }
259
+ function getUserFriendlyMessage(code) {
260
+ switch (code) {
261
+ // Auth errors
262
+ case "AUTH_001" /* AUTH_FAILED */:
263
+ return "Authentication failed. Please check your credentials and try again.";
264
+ case "AUTH_002" /* TOKEN_EXPIRED */:
265
+ return "Your session has expired. Please log in again.";
266
+ case "AUTH_003" /* INVALID_CREDENTIALS */:
267
+ return "Invalid credentials provided. Please check and try again.";
268
+ // File system errors
269
+ case "FS_001" /* FILE_NOT_FOUND */:
270
+ return "The requested file or directory was not found.";
271
+ case "SYS_005" /* PERMISSION_DENIED */:
272
+ return "Permission denied. Please check file permissions or run with appropriate privileges.";
273
+ case "FS_002" /* DISK_FULL */:
274
+ return "Insufficient disk space. Please free up space and try again.";
275
+ // Git errors
276
+ case "GIT_001" /* NOT_GIT_REPO */:
277
+ return "This command requires a git repository. Please run it from within a git repository.";
278
+ case "GIT_002" /* GIT_COMMAND_FAILED */:
279
+ return "Git operation failed. Please ensure your repository is in a valid state.";
280
+ case "GIT_003" /* INVALID_BRANCH */:
281
+ return "Invalid branch specified. Please check the branch name and try again.";
282
+ // Database errors
283
+ case "DB_001" /* DB_CONNECTION_FAILED */:
284
+ return "Database connection failed. Please try again or contact support if the issue persists.";
285
+ case "DB_002" /* DB_QUERY_FAILED */:
286
+ return "Database query failed. Please try again.";
287
+ case "DB_010" /* DB_CORRUPTION */:
288
+ return "Database appears to be corrupted. Please contact support.";
289
+ // Network errors
290
+ case "NET_001" /* NETWORK_ERROR */:
291
+ return "Network error. Please check your internet connection and try again.";
292
+ case "NET_002" /* API_ERROR */:
293
+ return "API request failed. Please try again later.";
294
+ case "SYS_010" /* OPERATION_TIMEOUT */:
295
+ return "The operation timed out. Please try again.";
296
+ // Validation errors
297
+ case "VAL_002" /* INVALID_INPUT */:
298
+ return "Invalid input provided. Please check your command and try again.";
299
+ case "VAL_001" /* VALIDATION_FAILED */:
300
+ return "Validation failed. Please check your input and try again.";
301
+ case "VAL_003" /* MISSING_REQUIRED_FIELD */:
302
+ return "A required field is missing. Please provide all required information.";
303
+ // System errors
304
+ case "SYS_004" /* CONFIGURATION_ERROR */:
305
+ return "Configuration error. Please check your settings.";
306
+ case "SYS_007" /* SERVICE_UNAVAILABLE */:
307
+ return "Service is temporarily unavailable. Please try again later.";
308
+ // Default
309
+ default:
310
+ return "An unexpected error occurred. Please try again or contact support.";
311
+ }
312
+ }
313
+ class ErrorHandler {
314
+ static retryMap = /* @__PURE__ */ new Map();
315
+ static MAX_RETRIES = 3;
316
+ /**
317
+ * Handle an error and exit the process
318
+ */
319
+ static handle(error, operation) {
320
+ if (error instanceof StackMemoryError) {
321
+ const userMessage = getUserFriendlyMessage(error.code);
322
+ console.error(`\u274C ${userMessage}`);
323
+ if (error.isRetryable) {
324
+ console.error("\u{1F4A1} This error may be recoverable. Please try again.");
325
+ }
326
+ process.exit(1);
327
+ }
328
+ if (error instanceof Error) {
329
+ let stackMemoryError;
330
+ if ("code" in error && typeof error.code === "string") {
331
+ stackMemoryError = ErrorHandler.fromNodeError(
332
+ error,
333
+ { operation }
334
+ );
335
+ } else {
336
+ stackMemoryError = wrapError(error, error.message, "COLLAB_005" /* OPERATION_FAILED */, {
337
+ operation
338
+ });
339
+ }
340
+ const userMessage = getUserFriendlyMessage(stackMemoryError.code);
341
+ console.error(`\u274C ${userMessage}`);
342
+ if (stackMemoryError.isRetryable) {
343
+ console.error("\u{1F4A1} This error may be recoverable. Please try again.");
344
+ }
345
+ process.exit(1);
346
+ }
347
+ console.error("\u274C An unexpected error occurred.");
348
+ process.exit(1);
349
+ }
350
+ /**
351
+ * Convert Node.js error to StackMemoryError
352
+ */
353
+ static fromNodeError(nodeError, context = {}) {
354
+ const code = nodeError.code;
355
+ switch (code) {
356
+ case "ENOENT":
357
+ return new SystemError(
358
+ `File or directory not found: ${nodeError.path}`,
359
+ "FS_001" /* FILE_NOT_FOUND */,
360
+ { ...context, path: nodeError.path },
361
+ nodeError
362
+ );
363
+ case "EACCES":
364
+ case "EPERM":
365
+ return new SystemError(
366
+ `Permission denied: ${nodeError.path}`,
367
+ "SYS_005" /* PERMISSION_DENIED */,
368
+ { ...context, path: nodeError.path },
369
+ nodeError
370
+ );
371
+ case "ENOSPC":
372
+ return new SystemError(
373
+ "No space left on device",
374
+ "FS_002" /* DISK_FULL */,
375
+ context,
376
+ nodeError
377
+ );
378
+ case "ETIMEDOUT":
379
+ return new SystemError(
380
+ "Operation timed out",
381
+ "SYS_010" /* OPERATION_TIMEOUT */,
382
+ context,
383
+ nodeError
384
+ );
385
+ default:
386
+ return new SystemError(
387
+ nodeError.message,
388
+ "SYS_009" /* UNKNOWN_ERROR */,
389
+ { ...context, nodeErrorCode: code },
390
+ nodeError
391
+ );
392
+ }
393
+ }
394
+ /**
395
+ * Safely execute an operation with optional fallback
396
+ */
397
+ static async safeExecute(operation, operationName, fallback) {
398
+ try {
399
+ return await operation();
400
+ } catch (error) {
401
+ if (fallback !== void 0) {
402
+ return fallback;
403
+ }
404
+ ErrorHandler.handle(error, operationName);
405
+ }
406
+ }
407
+ /**
408
+ * Execute with automatic retry and exponential backoff
409
+ */
410
+ static async withRetry(operation, operationName, maxRetries = ErrorHandler.MAX_RETRIES) {
411
+ let lastError;
412
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
413
+ try {
414
+ const result = await operation();
415
+ ErrorHandler.retryMap.delete(operationName);
416
+ return result;
417
+ } catch (error) {
418
+ lastError = error;
419
+ if (error instanceof StackMemoryError && !error.isRetryable) {
420
+ ErrorHandler.handle(error, operationName);
421
+ }
422
+ if (attempt === maxRetries) {
423
+ break;
424
+ }
425
+ const delay = Math.min(1e3 * Math.pow(2, attempt - 1), 5e3);
426
+ await new Promise((resolve) => setTimeout(resolve, delay));
427
+ }
428
+ }
429
+ ErrorHandler.handle(lastError, `${operationName} (after ${maxRetries} attempts)`);
430
+ }
431
+ /**
432
+ * Create a circuit breaker for an operation
433
+ */
434
+ static createCircuitBreaker(operation, operationName, threshold = 5) {
435
+ let failures = 0;
436
+ let lastFailure = 0;
437
+ const resetTimeout = 3e4;
438
+ return async () => {
439
+ const now = Date.now();
440
+ if (now - lastFailure > resetTimeout) {
441
+ failures = 0;
442
+ }
443
+ if (failures >= threshold) {
444
+ throw new SystemError(
445
+ `Circuit breaker open for '${operationName}'`,
446
+ "SYS_007" /* SERVICE_UNAVAILABLE */,
447
+ { operationName, failures, threshold }
448
+ );
449
+ }
450
+ try {
451
+ const result = await operation();
452
+ failures = 0;
453
+ return result;
454
+ } catch (error) {
455
+ failures++;
456
+ lastFailure = now;
457
+ throw error;
458
+ }
459
+ };
460
+ }
461
+ }
462
+ const validateInput = (value, name, validator) => {
463
+ if (!validator(value)) {
464
+ throw new ValidationError(
465
+ `Invalid ${name}: ${String(value)}`,
466
+ "VAL_002" /* INVALID_INPUT */,
467
+ { name, value }
468
+ );
469
+ }
470
+ };
471
+ const validateEmail = (email) => {
472
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
473
+ if (!emailRegex.test(email) || email.length > 254) {
474
+ throw new ValidationError(
475
+ `Invalid email format: ${email}`,
476
+ "VAL_002" /* INVALID_INPUT */,
477
+ { email }
478
+ );
479
+ }
480
+ };
481
+ const validatePath = (filePath) => {
482
+ if (!filePath || filePath.includes("..") || filePath.includes("\0")) {
483
+ throw new ValidationError(
484
+ `Invalid path: ${filePath}`,
485
+ "VAL_002" /* INVALID_INPUT */,
486
+ { path: filePath }
487
+ );
488
+ }
489
+ };
246
490
  export {
247
491
  DatabaseError,
248
492
  ErrorCode,
493
+ ErrorHandler,
249
494
  FrameError,
250
495
  IntegrationError,
251
496
  MCPError,
@@ -256,8 +501,12 @@ export {
256
501
  ValidationError,
257
502
  createErrorHandler,
258
503
  getErrorMessage,
504
+ getUserFriendlyMessage,
259
505
  isRetryableError,
260
506
  isStackMemoryError,
507
+ validateEmail,
508
+ validateInput,
509
+ validatePath,
261
510
  wrapError
262
511
  };
263
512
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/errors/index.ts"],
4
- "sourcesContent": ["/**\n * Custom error classes for StackMemory\n * Provides a hierarchy of error types for better error handling and debugging\n */\n\nexport enum ErrorCode {\n // Database errors (1000-1999)\n DB_CONNECTION_FAILED = 'DB_001',\n DB_QUERY_FAILED = 'DB_002',\n DB_TRANSACTION_FAILED = 'DB_003',\n DB_MIGRATION_FAILED = 'DB_004',\n DB_CONSTRAINT_VIOLATION = 'DB_005',\n DB_SCHEMA_ERROR = 'DB_006',\n DB_INSERT_FAILED = 'DB_007',\n DB_UPDATE_FAILED = 'DB_008',\n DB_DELETE_FAILED = 'DB_009',\n\n // Frame errors (2000-2999)\n FRAME_NOT_FOUND = 'FRAME_001',\n FRAME_INVALID_STATE = 'FRAME_002',\n FRAME_PARENT_NOT_FOUND = 'FRAME_003',\n FRAME_CYCLE_DETECTED = 'FRAME_004',\n FRAME_ALREADY_CLOSED = 'FRAME_005',\n FRAME_INIT_FAILED = 'FRAME_006',\n FRAME_INVALID_INPUT = 'FRAME_007',\n FRAME_STACK_OVERFLOW = 'FRAME_008',\n\n // Task errors (3000-3999)\n TASK_NOT_FOUND = 'TASK_001',\n TASK_INVALID_STATE = 'TASK_002',\n TASK_DEPENDENCY_CONFLICT = 'TASK_003',\n TASK_CIRCULAR_DEPENDENCY = 'TASK_004',\n\n // Integration errors (4000-4999)\n LINEAR_AUTH_FAILED = 'LINEAR_001',\n LINEAR_API_ERROR = 'LINEAR_002',\n LINEAR_SYNC_FAILED = 'LINEAR_003',\n LINEAR_WEBHOOK_FAILED = 'LINEAR_004',\n\n // MCP errors (5000-5999)\n MCP_TOOL_NOT_FOUND = 'MCP_001',\n MCP_INVALID_PARAMS = 'MCP_002',\n MCP_EXECUTION_FAILED = 'MCP_003',\n MCP_RATE_LIMITED = 'MCP_004',\n\n // Project errors (6000-6999)\n PROJECT_NOT_FOUND = 'PROJECT_001',\n PROJECT_INVALID_PATH = 'PROJECT_002',\n PROJECT_GIT_ERROR = 'PROJECT_003',\n\n // Validation errors (7000-7999)\n VALIDATION_FAILED = 'VAL_001',\n INVALID_INPUT = 'VAL_002',\n MISSING_REQUIRED_FIELD = 'VAL_003',\n TYPE_MISMATCH = 'VAL_004',\n\n // System errors (8000-8999)\n INITIALIZATION_ERROR = 'SYS_001',\n NOT_FOUND = 'SYS_002',\n INTERNAL_ERROR = 'SYS_003',\n CONFIGURATION_ERROR = 'SYS_004',\n PERMISSION_DENIED = 'SYS_005',\n RESOURCE_EXHAUSTED = 'SYS_006',\n SERVICE_UNAVAILABLE = 'SYS_007',\n SYSTEM_INIT_FAILED = 'SYS_008',\n\n // Collaboration errors (9000-9999)\n STACK_CONTEXT_NOT_FOUND = 'COLLAB_001',\n HANDOFF_REQUEST_EXPIRED = 'COLLAB_002',\n MERGE_CONFLICT_UNRESOLVABLE = 'COLLAB_003',\n PERMISSION_VIOLATION = 'COLLAB_004',\n OPERATION_FAILED = 'COLLAB_005',\n OPERATION_EXPIRED = 'COLLAB_006',\n INVALID_STATE = 'COLLAB_007',\n RESOURCE_NOT_FOUND = 'COLLAB_008',\n HANDOFF_ALREADY_EXISTS = 'COLLAB_009',\n MERGE_SESSION_INVALID = 'COLLAB_010',\n STACK_SWITCH_FAILED = 'COLLAB_011',\n APPROVAL_TIMEOUT = 'COLLAB_012',\n CONFLICT_RESOLUTION_FAILED = 'COLLAB_013',\n TEAM_ACCESS_DENIED = 'COLLAB_014',\n STACK_LIMIT_EXCEEDED = 'COLLAB_015',\n}\n\nexport interface ErrorContext {\n [key: string]: unknown;\n}\n\nexport interface StackMemoryErrorOptions {\n code: ErrorCode;\n message: string;\n context?: ErrorContext;\n cause?: Error;\n isRetryable?: boolean;\n httpStatus?: number;\n}\n\n/**\n * Base error class for all StackMemory errors\n */\nexport class StackMemoryError extends Error {\n public readonly code: ErrorCode;\n public readonly context?: ErrorContext;\n public readonly cause?: Error;\n public readonly isRetryable: boolean;\n public readonly httpStatus: number;\n public readonly timestamp: Date;\n\n constructor(options: StackMemoryErrorOptions) {\n super(options.message);\n this.name = this.constructor.name;\n this.code = options.code;\n this.context = options.context;\n this.cause = options.cause;\n this.isRetryable = options.isRetryable ?? false;\n this.httpStatus = options.httpStatus ?? 500;\n this.timestamp = new Date();\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n isRetryable: this.isRetryable,\n httpStatus: this.httpStatus,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Database-related errors\n */\nexport class DatabaseError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.DB_QUERY_FAILED,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.DB_CONNECTION_FAILED,\n httpStatus: 503,\n });\n }\n}\n\n/**\n * Frame-related errors\n */\nexport class FrameError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.FRAME_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Task-related errors\n */\nexport class TaskError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TASK_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Integration errors (Linear, etc.)\n */\nexport class IntegrationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.LINEAR_API_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: true,\n httpStatus: 502,\n });\n }\n}\n\n/**\n * MCP-related errors\n */\nexport class MCPError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.MCP_EXECUTION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: code === ErrorCode.MCP_RATE_LIMITED,\n httpStatus: code === ErrorCode.MCP_RATE_LIMITED ? 429 : 400,\n });\n }\n}\n\n/**\n * Validation errors\n */\nexport class ValidationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.VALIDATION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Project-related errors\n */\nexport class ProjectError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.PROJECT_NOT_FOUND,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 404,\n });\n }\n}\n\n/**\n * System/Internal errors\n */\nexport class SystemError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.SERVICE_UNAVAILABLE,\n httpStatus: 500,\n });\n }\n}\n\n/**\n * Helper function to determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof StackMemoryError) {\n return error.isRetryable;\n }\n // Check for common retryable error patterns\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('econnrefused') ||\n message.includes('timeout') ||\n message.includes('enotfound') ||\n message.includes('socket hang up')\n );\n }\n return false;\n}\n\n/**\n * Helper function to safely extract error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'An unknown error occurred';\n}\n\n/**\n * Helper function to wrap unknown errors in StackMemoryError\n */\nexport function wrapError(\n error: unknown,\n defaultMessage: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext\n): StackMemoryError {\n if (error instanceof StackMemoryError) {\n return error;\n }\n\n const cause = error instanceof Error ? error : undefined;\n const message = error instanceof Error ? error.message : defaultMessage;\n\n return new SystemError(message, code, context, cause);\n}\n\n/**\n * Type guard to check if error is a StackMemoryError\n */\nexport function isStackMemoryError(error: unknown): error is StackMemoryError {\n return error instanceof StackMemoryError;\n}\n\n/**\n * Create context-aware error handler\n */\nexport function createErrorHandler(defaultContext: ErrorContext) {\n return (error: unknown, additionalContext?: ErrorContext) => {\n const context = { ...defaultContext, ...additionalContext };\n\n if (error instanceof StackMemoryError) {\n // Create a new error with merged context since context is readonly\n return new StackMemoryError({\n code: error.code,\n message: error.message,\n context: { ...error.context, ...context },\n cause: error.cause,\n isRetryable: error.isRetryable,\n httpStatus: error.httpStatus,\n });\n }\n\n return wrapError(\n error,\n getErrorMessage(error),\n ErrorCode.INTERNAL_ERROR,\n context\n );\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Custom error classes for StackMemory\n * Provides a hierarchy of error types for better error handling and debugging\n */\n\nexport enum ErrorCode {\n // Database errors (DB_*)\n DB_CONNECTION_FAILED = 'DB_001',\n DB_QUERY_FAILED = 'DB_002',\n DB_TRANSACTION_FAILED = 'DB_003',\n DB_MIGRATION_FAILED = 'DB_004',\n DB_CONSTRAINT_VIOLATION = 'DB_005',\n DB_SCHEMA_ERROR = 'DB_006',\n DB_INSERT_FAILED = 'DB_007',\n DB_UPDATE_FAILED = 'DB_008',\n DB_DELETE_FAILED = 'DB_009',\n DB_CORRUPTION = 'DB_010',\n\n // Frame errors (FRAME_*)\n FRAME_NOT_FOUND = 'FRAME_001',\n FRAME_INVALID_STATE = 'FRAME_002',\n FRAME_PARENT_NOT_FOUND = 'FRAME_003',\n FRAME_CYCLE_DETECTED = 'FRAME_004',\n FRAME_ALREADY_CLOSED = 'FRAME_005',\n FRAME_INIT_FAILED = 'FRAME_006',\n FRAME_INVALID_INPUT = 'FRAME_007',\n FRAME_STACK_OVERFLOW = 'FRAME_008',\n\n // Task errors (TASK_*)\n TASK_NOT_FOUND = 'TASK_001',\n TASK_INVALID_STATE = 'TASK_002',\n TASK_DEPENDENCY_CONFLICT = 'TASK_003',\n TASK_CIRCULAR_DEPENDENCY = 'TASK_004',\n\n // Integration errors (LINEAR_*)\n LINEAR_AUTH_FAILED = 'LINEAR_001',\n LINEAR_API_ERROR = 'LINEAR_002',\n LINEAR_SYNC_FAILED = 'LINEAR_003',\n LINEAR_WEBHOOK_FAILED = 'LINEAR_004',\n\n // MCP errors (MCP_*)\n MCP_TOOL_NOT_FOUND = 'MCP_001',\n MCP_INVALID_PARAMS = 'MCP_002',\n MCP_EXECUTION_FAILED = 'MCP_003',\n MCP_RATE_LIMITED = 'MCP_004',\n\n // Project errors (PROJECT_*)\n PROJECT_NOT_FOUND = 'PROJECT_001',\n PROJECT_INVALID_PATH = 'PROJECT_002',\n PROJECT_GIT_ERROR = 'PROJECT_003',\n\n // Validation errors (VAL_*)\n VALIDATION_FAILED = 'VAL_001',\n INVALID_INPUT = 'VAL_002',\n MISSING_REQUIRED_FIELD = 'VAL_003',\n TYPE_MISMATCH = 'VAL_004',\n\n // System errors (SYS_*)\n INITIALIZATION_ERROR = 'SYS_001',\n NOT_FOUND = 'SYS_002',\n INTERNAL_ERROR = 'SYS_003',\n CONFIGURATION_ERROR = 'SYS_004',\n PERMISSION_DENIED = 'SYS_005',\n RESOURCE_EXHAUSTED = 'SYS_006',\n SERVICE_UNAVAILABLE = 'SYS_007',\n SYSTEM_INIT_FAILED = 'SYS_008',\n UNKNOWN_ERROR = 'SYS_009',\n OPERATION_TIMEOUT = 'SYS_010',\n\n // Authentication errors (AUTH_*)\n AUTH_FAILED = 'AUTH_001',\n TOKEN_EXPIRED = 'AUTH_002',\n INVALID_CREDENTIALS = 'AUTH_003',\n\n // File system errors (FS_*)\n FILE_NOT_FOUND = 'FS_001',\n DISK_FULL = 'FS_002',\n\n // Git errors (GIT_*)\n NOT_GIT_REPO = 'GIT_001',\n GIT_COMMAND_FAILED = 'GIT_002',\n INVALID_BRANCH = 'GIT_003',\n\n // Network errors (NET_*)\n NETWORK_ERROR = 'NET_001',\n API_ERROR = 'NET_002',\n\n // Collaboration errors (COLLAB_*)\n STACK_CONTEXT_NOT_FOUND = 'COLLAB_001',\n HANDOFF_REQUEST_EXPIRED = 'COLLAB_002',\n MERGE_CONFLICT_UNRESOLVABLE = 'COLLAB_003',\n PERMISSION_VIOLATION = 'COLLAB_004',\n OPERATION_FAILED = 'COLLAB_005',\n OPERATION_EXPIRED = 'COLLAB_006',\n INVALID_STATE = 'COLLAB_007',\n RESOURCE_NOT_FOUND = 'COLLAB_008',\n HANDOFF_ALREADY_EXISTS = 'COLLAB_009',\n MERGE_SESSION_INVALID = 'COLLAB_010',\n STACK_SWITCH_FAILED = 'COLLAB_011',\n APPROVAL_TIMEOUT = 'COLLAB_012',\n CONFLICT_RESOLUTION_FAILED = 'COLLAB_013',\n TEAM_ACCESS_DENIED = 'COLLAB_014',\n STACK_LIMIT_EXCEEDED = 'COLLAB_015',\n}\n\nexport interface ErrorContext {\n [key: string]: unknown;\n}\n\nexport interface StackMemoryErrorOptions {\n code: ErrorCode;\n message: string;\n context?: ErrorContext;\n cause?: Error;\n isRetryable?: boolean;\n httpStatus?: number;\n}\n\n/**\n * Base error class for all StackMemory errors\n */\nexport class StackMemoryError extends Error {\n public readonly code: ErrorCode;\n public readonly context?: ErrorContext;\n public readonly cause?: Error;\n public readonly isRetryable: boolean;\n public readonly httpStatus: number;\n public readonly timestamp: Date;\n\n constructor(options: StackMemoryErrorOptions) {\n super(options.message);\n this.name = this.constructor.name;\n this.code = options.code;\n this.context = options.context;\n this.cause = options.cause;\n this.isRetryable = options.isRetryable ?? false;\n this.httpStatus = options.httpStatus ?? 500;\n this.timestamp = new Date();\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n isRetryable: this.isRetryable,\n httpStatus: this.httpStatus,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Database-related errors\n */\nexport class DatabaseError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.DB_QUERY_FAILED,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.DB_CONNECTION_FAILED,\n httpStatus: 503,\n });\n }\n}\n\n/**\n * Frame-related errors\n */\nexport class FrameError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.FRAME_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Task-related errors\n */\nexport class TaskError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TASK_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Integration errors (Linear, etc.)\n */\nexport class IntegrationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.LINEAR_API_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: true,\n httpStatus: 502,\n });\n }\n}\n\n/**\n * MCP-related errors\n */\nexport class MCPError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.MCP_EXECUTION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: code === ErrorCode.MCP_RATE_LIMITED,\n httpStatus: code === ErrorCode.MCP_RATE_LIMITED ? 429 : 400,\n });\n }\n}\n\n/**\n * Validation errors\n */\nexport class ValidationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.VALIDATION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Project-related errors\n */\nexport class ProjectError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.PROJECT_NOT_FOUND,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 404,\n });\n }\n}\n\n/**\n * System/Internal errors\n */\nexport class SystemError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.SERVICE_UNAVAILABLE,\n httpStatus: 500,\n });\n }\n}\n\n/**\n * Helper function to determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof StackMemoryError) {\n return error.isRetryable;\n }\n // Check for common retryable error patterns\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('econnrefused') ||\n message.includes('timeout') ||\n message.includes('enotfound') ||\n message.includes('socket hang up')\n );\n }\n return false;\n}\n\n/**\n * Helper function to safely extract error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'An unknown error occurred';\n}\n\n/**\n * Helper function to wrap unknown errors in StackMemoryError\n */\nexport function wrapError(\n error: unknown,\n defaultMessage: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext\n): StackMemoryError {\n if (error instanceof StackMemoryError) {\n return error;\n }\n\n const cause = error instanceof Error ? error : undefined;\n const message = error instanceof Error ? error.message : defaultMessage;\n\n return new SystemError(message, code, context, cause);\n}\n\n/**\n * Type guard to check if error is a StackMemoryError\n */\nexport function isStackMemoryError(error: unknown): error is StackMemoryError {\n return error instanceof StackMemoryError;\n}\n\n/**\n * Create context-aware error handler\n */\nexport function createErrorHandler(defaultContext: ErrorContext) {\n return (error: unknown, additionalContext?: ErrorContext) => {\n const context = { ...defaultContext, ...additionalContext };\n\n if (error instanceof StackMemoryError) {\n // Create a new error with merged context since context is readonly\n return new StackMemoryError({\n code: error.code,\n message: error.message,\n context: { ...error.context, ...context },\n cause: error.cause,\n isRetryable: error.isRetryable,\n httpStatus: error.httpStatus,\n });\n }\n\n return wrapError(\n error,\n getErrorMessage(error),\n ErrorCode.INTERNAL_ERROR,\n context\n );\n };\n}\n\n/**\n * User-friendly error messages for each error code\n */\nexport function getUserFriendlyMessage(code: ErrorCode): string {\n switch (code) {\n // Auth errors\n case ErrorCode.AUTH_FAILED:\n return 'Authentication failed. Please check your credentials and try again.';\n case ErrorCode.TOKEN_EXPIRED:\n return 'Your session has expired. Please log in again.';\n case ErrorCode.INVALID_CREDENTIALS:\n return 'Invalid credentials provided. Please check and try again.';\n\n // File system errors\n case ErrorCode.FILE_NOT_FOUND:\n return 'The requested file or directory was not found.';\n case ErrorCode.PERMISSION_DENIED:\n return 'Permission denied. Please check file permissions or run with appropriate privileges.';\n case ErrorCode.DISK_FULL:\n return 'Insufficient disk space. Please free up space and try again.';\n\n // Git errors\n case ErrorCode.NOT_GIT_REPO:\n return 'This command requires a git repository. Please run it from within a git repository.';\n case ErrorCode.GIT_COMMAND_FAILED:\n return 'Git operation failed. Please ensure your repository is in a valid state.';\n case ErrorCode.INVALID_BRANCH:\n return 'Invalid branch specified. Please check the branch name and try again.';\n\n // Database errors\n case ErrorCode.DB_CONNECTION_FAILED:\n return 'Database connection failed. Please try again or contact support if the issue persists.';\n case ErrorCode.DB_QUERY_FAILED:\n return 'Database query failed. Please try again.';\n case ErrorCode.DB_CORRUPTION:\n return 'Database appears to be corrupted. Please contact support.';\n\n // Network errors\n case ErrorCode.NETWORK_ERROR:\n return 'Network error. Please check your internet connection and try again.';\n case ErrorCode.API_ERROR:\n return 'API request failed. Please try again later.';\n case ErrorCode.OPERATION_TIMEOUT:\n return 'The operation timed out. Please try again.';\n\n // Validation errors\n case ErrorCode.INVALID_INPUT:\n return 'Invalid input provided. Please check your command and try again.';\n case ErrorCode.VALIDATION_FAILED:\n return 'Validation failed. Please check your input and try again.';\n case ErrorCode.MISSING_REQUIRED_FIELD:\n return 'A required field is missing. Please provide all required information.';\n\n // System errors\n case ErrorCode.CONFIGURATION_ERROR:\n return 'Configuration error. Please check your settings.';\n case ErrorCode.SERVICE_UNAVAILABLE:\n return 'Service is temporarily unavailable. Please try again later.';\n\n // Default\n default:\n return 'An unexpected error occurred. Please try again or contact support.';\n }\n}\n\n/**\n * ErrorHandler provides utilities for handling errors in CLI context\n */\nexport class ErrorHandler {\n private static retryMap = new Map<string, number>();\n private static readonly MAX_RETRIES = 3;\n\n /**\n * Handle an error and exit the process\n */\n static handle(error: unknown, operation: string): never {\n if (error instanceof StackMemoryError) {\n const userMessage = getUserFriendlyMessage(error.code);\n console.error(`\u274C ${userMessage}`);\n\n if (error.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n if (error instanceof Error) {\n let stackMemoryError: StackMemoryError;\n\n if ('code' in error && typeof error.code === 'string') {\n stackMemoryError = ErrorHandler.fromNodeError(\n error as NodeJS.ErrnoException,\n { operation }\n );\n } else {\n stackMemoryError = wrapError(error, error.message, ErrorCode.OPERATION_FAILED, {\n operation,\n });\n }\n\n const userMessage = getUserFriendlyMessage(stackMemoryError.code);\n console.error(`\u274C ${userMessage}`);\n\n if (stackMemoryError.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n // Unknown error type\n console.error('\u274C An unexpected error occurred.');\n process.exit(1);\n }\n\n /**\n * Convert Node.js error to StackMemoryError\n */\n static fromNodeError(\n nodeError: NodeJS.ErrnoException,\n context: ErrorContext = {}\n ): StackMemoryError {\n const code = nodeError.code;\n\n switch (code) {\n case 'ENOENT':\n return new SystemError(\n `File or directory not found: ${nodeError.path}`,\n ErrorCode.FILE_NOT_FOUND,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'EACCES':\n case 'EPERM':\n return new SystemError(\n `Permission denied: ${nodeError.path}`,\n ErrorCode.PERMISSION_DENIED,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'ENOSPC':\n return new SystemError(\n 'No space left on device',\n ErrorCode.DISK_FULL,\n context,\n nodeError\n );\n\n case 'ETIMEDOUT':\n return new SystemError(\n 'Operation timed out',\n ErrorCode.OPERATION_TIMEOUT,\n context,\n nodeError\n );\n\n default:\n return new SystemError(\n nodeError.message,\n ErrorCode.UNKNOWN_ERROR,\n { ...context, nodeErrorCode: code },\n nodeError\n );\n }\n }\n\n /**\n * Safely execute an operation with optional fallback\n */\n static async safeExecute<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n fallback?: T\n ): Promise<T | undefined> {\n try {\n return await operation();\n } catch (error: unknown) {\n if (fallback !== undefined) {\n return fallback;\n }\n ErrorHandler.handle(error, operationName);\n }\n }\n\n /**\n * Execute with automatic retry and exponential backoff\n */\n static async withRetry<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n maxRetries: number = ErrorHandler.MAX_RETRIES\n ): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const result = await operation();\n ErrorHandler.retryMap.delete(operationName);\n return result;\n } catch (error: unknown) {\n lastError = error;\n\n if (error instanceof StackMemoryError && !error.isRetryable) {\n ErrorHandler.handle(error, operationName);\n }\n\n if (attempt === maxRetries) {\n break;\n }\n\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n ErrorHandler.handle(lastError, `${operationName} (after ${maxRetries} attempts)`);\n }\n\n /**\n * Create a circuit breaker for an operation\n */\n static createCircuitBreaker<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n threshold: number = 5\n ) {\n let failures = 0;\n let lastFailure = 0;\n const resetTimeout = 30000;\n\n return async (): Promise<T> => {\n const now = Date.now();\n\n if (now - lastFailure > resetTimeout) {\n failures = 0;\n }\n\n if (failures >= threshold) {\n throw new SystemError(\n `Circuit breaker open for '${operationName}'`,\n ErrorCode.SERVICE_UNAVAILABLE,\n { operationName, failures, threshold }\n );\n }\n\n try {\n const result = await operation();\n failures = 0;\n return result;\n } catch (error: unknown) {\n failures++;\n lastFailure = now;\n throw error;\n }\n };\n }\n}\n\n/**\n * Validation utilities\n */\nexport const validateInput = (\n value: unknown,\n name: string,\n validator: (val: unknown) => boolean\n): asserts value is NonNullable<unknown> => {\n if (!validator(value)) {\n throw new ValidationError(\n `Invalid ${name}: ${String(value)}`,\n ErrorCode.INVALID_INPUT,\n { name, value }\n );\n }\n};\n\nexport const validateEmail = (email: string): asserts email is string => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email) || email.length > 254) {\n throw new ValidationError(\n `Invalid email format: ${email}`,\n ErrorCode.INVALID_INPUT,\n { email }\n );\n }\n};\n\nexport const validatePath = (filePath: string): asserts filePath is string => {\n if (!filePath || filePath.includes('..') || filePath.includes('\\0')) {\n throw new ValidationError(\n `Invalid path: ${filePath}`,\n ErrorCode.INVALID_INPUT,\n { path: filePath }\n );\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["ErrorCode"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/frame/workflow-templates.ts"],
4
- "sourcesContent": ["/**\n * Workflow Templates for StackMemory\n * Inspired by Continuous-Claude's structured approach\n *\n * Each workflow auto-creates child frames for phases\n * and enforces completion gates between transitions\n */\n\nimport { Frame } from '../types';\nimport { FrameManager } from './frame-manager';\n\nexport interface WorkflowPhase {\n name: string;\n requiredOutputs?: string[];\n validationRules?: ((frame: Frame) => boolean)[];\n autoTransition?: boolean;\n}\n\nexport interface WorkflowTemplate {\n name: string;\n description: string;\n phases: WorkflowPhase[];\n metadata?: Record<string, any>;\n}\n\nexport class WorkflowTemplates {\n private frameManager: FrameManager;\n\n constructor(frameManager: FrameManager) {\n this.frameManager = frameManager;\n }\n\n /**\n * TDD Workflow: Red \u2192 Green \u2192 Refactor\n */\n static TDD: WorkflowTemplate = {\n name: 'tdd',\n description: 'Test-Driven Development workflow',\n phases: [\n {\n name: 'write-failing-tests',\n requiredOutputs: ['test_file', 'test_count'],\n validationRules: [(frame) => frame.metadata?.tests_failing === true],\n },\n {\n name: 'implement-minimal',\n requiredOutputs: ['implementation_file'],\n validationRules: [(frame) => frame.metadata?.tests_passing === true],\n },\n {\n name: 'refactor',\n requiredOutputs: ['refactored_files'],\n validationRules: [\n (frame) => frame.metadata?.tests_passing === true,\n (frame) => frame.metadata?.complexity_reduced === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Feature Development Workflow\n */\n static FEATURE: WorkflowTemplate = {\n name: 'feature',\n description: 'Feature development workflow',\n phases: [\n {\n name: 'research',\n requiredOutputs: ['requirements', 'constraints', 'dependencies'],\n validationRules: [\n (frame) => frame.metadata?.research_complete === true,\n ],\n },\n {\n name: 'design',\n requiredOutputs: ['architecture_decision', 'api_design'],\n validationRules: [(frame) => frame.metadata?.design_reviewed === true],\n },\n {\n name: 'implement',\n requiredOutputs: ['implementation_files', 'tests'],\n validationRules: [\n (frame) => frame.metadata?.tests_passing === true,\n (frame) => frame.metadata?.lint_passing === true,\n ],\n },\n {\n name: 'validate',\n requiredOutputs: ['test_results', 'performance_metrics'],\n validationRules: [\n (frame) => frame.metadata?.validation_complete === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Bug Fix Workflow\n */\n static BUGFIX: WorkflowTemplate = {\n name: 'bugfix',\n description: 'Bug fixing workflow',\n phases: [\n {\n name: 'reproduce',\n requiredOutputs: ['reproduction_steps', 'failing_test'],\n validationRules: [(frame) => frame.metadata?.bug_reproduced === true],\n },\n {\n name: 'diagnose',\n requiredOutputs: ['root_cause', 'affected_code'],\n validationRules: [(frame) => frame.metadata?.cause_identified === true],\n },\n {\n name: 'fix',\n requiredOutputs: ['fix_commits', 'updated_tests'],\n validationRules: [(frame) => frame.metadata?.fix_applied === true],\n },\n {\n name: 'verify',\n requiredOutputs: ['verification_results', 'regression_tests'],\n validationRules: [\n (frame) => frame.metadata?.bug_fixed === true,\n (frame) => frame.metadata?.no_regressions === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Refactoring Workflow\n */\n static REFACTOR: WorkflowTemplate = {\n name: 'refactor',\n description: 'Code refactoring workflow',\n phases: [\n {\n name: 'analyze',\n requiredOutputs: [\n 'code_metrics',\n 'smell_detection',\n 'complexity_report',\n ],\n validationRules: [\n (frame) => frame.metadata?.analysis_complete === true,\n ],\n },\n {\n name: 'plan',\n requiredOutputs: ['refactor_plan', 'risk_assessment'],\n validationRules: [(frame) => frame.metadata?.plan_approved === true],\n },\n {\n name: 'refactor',\n requiredOutputs: ['refactored_code', 'preserved_tests'],\n validationRules: [(frame) => frame.metadata?.tests_passing === true],\n },\n {\n name: 'validate',\n requiredOutputs: ['before_after_metrics', 'performance_comparison'],\n validationRules: [\n (frame) => frame.metadata?.metrics_improved === true,\n (frame) => frame.metadata?.behavior_preserved === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Start a workflow, creating the parent frame and first phase frame\n */\n async startWorkflow(\n template: WorkflowTemplate,\n parentFrameId?: string\n ): Promise<Frame> {\n // Create parent workflow frame\n const workflowFrame = await this.frameManager.push(\n {\n type: 'workflow',\n description: `${template.name} workflow`,\n metadata: {\n workflow: template.name,\n current_phase: 0,\n phases: template.phases.map((p) => p.name),\n started_at: new Date().toISOString(),\n },\n },\n parentFrameId\n );\n\n // Auto-create first phase frame\n await this.startPhase(workflowFrame.id, 0);\n\n return workflowFrame;\n }\n\n /**\n * Transition to next phase if current phase is complete\n */\n async transitionPhase(frameId: string): Promise<boolean> {\n const frame = await this.frameManager.getFrame(frameId);\n if (!frame || frame.type !== 'workflow') return false;\n\n const currentPhase = frame.metadata?.current_phase || 0;\n const template = this.getTemplate(frame.metadata?.workflow);\n if (!template) return false;\n\n // Validate current phase completion\n const phaseFrame = await this.getCurrentPhaseFrame(frameId);\n if (!phaseFrame) return false;\n\n const phase = template.phases[currentPhase];\n const isComplete = await this.validatePhase(phaseFrame, phase);\n\n if (!isComplete) {\n console.log(`Phase ${phase.name} validation failed`);\n return false;\n }\n\n // Close current phase frame\n await this.frameManager.close(phaseFrame.id, {\n completed: true,\n phase: phase.name,\n });\n\n // Check if workflow is complete\n if (currentPhase >= template.phases.length - 1) {\n await this.frameManager.close(frameId, {\n workflow_complete: true,\n completed_at: new Date().toISOString(),\n });\n return true;\n }\n\n // Start next phase\n await this.frameManager.updateMetadata(frameId, {\n current_phase: currentPhase + 1,\n });\n await this.startPhase(frameId, currentPhase + 1);\n\n return true;\n }\n\n /**\n * Start a specific phase within a workflow\n */\n private async startPhase(\n workflowFrameId: string,\n phaseIndex: number\n ): Promise<Frame> {\n const frame = await this.frameManager.getFrame(workflowFrameId);\n const template = this.getTemplate(frame?.metadata?.workflow);\n if (!template || phaseIndex >= template.phases.length) {\n throw new Error('Invalid phase index');\n }\n\n const phase = template.phases[phaseIndex];\n return await this.frameManager.push(\n {\n type: 'phase',\n description: `Phase: ${phase.name}`,\n metadata: {\n phase_name: phase.name,\n phase_index: phaseIndex,\n required_outputs: phase.requiredOutputs,\n started_at: new Date().toISOString(),\n },\n },\n workflowFrameId\n );\n }\n\n /**\n * Validate a phase frame against its requirements\n */\n private async validatePhase(\n frame: Frame,\n phase: WorkflowPhase\n ): Promise<boolean> {\n // Check required outputs\n if (phase.requiredOutputs) {\n for (const output of phase.requiredOutputs) {\n if (!frame.metadata?.[output]) {\n return false;\n }\n }\n }\n\n // Run validation rules\n if (phase.validationRules) {\n for (const rule of phase.validationRules) {\n if (!rule(frame)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Get current phase frame for a workflow\n */\n private async getCurrentPhaseFrame(\n workflowFrameId: string\n ): Promise<Frame | null> {\n const children = await this.frameManager.getChildren(workflowFrameId);\n return (\n children.find((f) => f.type === 'phase' && f.status === 'open') || null\n );\n }\n\n /**\n * Get template by name\n */\n private getTemplate(name?: string): WorkflowTemplate | null {\n if (!name) return null;\n\n const templates: Record<string, WorkflowTemplate> = {\n tdd: WorkflowTemplates.TDD,\n feature: WorkflowTemplates.FEATURE,\n bugfix: WorkflowTemplates.BUGFIX,\n refactor: WorkflowTemplates.REFACTOR,\n };\n\n return templates[name] || null;\n }\n\n /**\n * List available workflow templates\n */\n static listTemplates(): WorkflowTemplate[] {\n return [\n WorkflowTemplates.TDD,\n WorkflowTemplates.FEATURE,\n WorkflowTemplates.BUGFIX,\n WorkflowTemplates.REFACTOR,\n ];\n }\n}\n\n/**\n * Export workflow templates object for CLI commands\n */\nexport const workflowTemplates = {\n tdd: {\n name: 'Test-Driven Development',\n description: 'Write tests first, then implement',\n phases: [\n { name: 'write-failing-tests', description: 'Write tests that fail' },\n { name: 'implement-code', description: 'Make tests pass' },\n { name: 'refactor', description: 'Clean up code' },\n ],\n },\n feature: {\n name: 'Feature Development',\n description: 'Develop a new feature',\n phases: [\n { name: 'design', description: 'Design the feature' },\n { name: 'implement', description: 'Build the feature' },\n { name: 'test', description: 'Test the feature' },\n ],\n },\n bugfix: {\n name: 'Bug Fix',\n description: 'Fix a reported bug',\n phases: [\n { name: 'reproduce', description: 'Reproduce the bug' },\n { name: 'fix', description: 'Fix the bug' },\n { name: 'verify', description: 'Verify the fix' },\n ],\n },\n refactor: {\n name: 'Refactoring',\n description: 'Improve code structure',\n phases: [\n { name: 'analyze', description: 'Analyze current code' },\n { name: 'refactor', description: 'Refactor code' },\n { name: 'test', description: 'Ensure no regressions' },\n ],\n },\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Workflow Templates for StackMemory\n * Inspired by Continuous-Claude's structured approach\n *\n * Each workflow auto-creates child frames for phases\n * and enforces completion gates between transitions\n */\n\nimport { Frame, FrameManager } from '../context/index.js';\n\nexport interface WorkflowPhase {\n name: string;\n requiredOutputs?: string[];\n validationRules?: ((frame: Frame) => boolean)[];\n autoTransition?: boolean;\n}\n\nexport interface WorkflowTemplate {\n name: string;\n description: string;\n phases: WorkflowPhase[];\n metadata?: Record<string, any>;\n}\n\nexport class WorkflowTemplates {\n private frameManager: FrameManager;\n\n constructor(frameManager: FrameManager) {\n this.frameManager = frameManager;\n }\n\n /**\n * TDD Workflow: Red \u2192 Green \u2192 Refactor\n */\n static TDD: WorkflowTemplate = {\n name: 'tdd',\n description: 'Test-Driven Development workflow',\n phases: [\n {\n name: 'write-failing-tests',\n requiredOutputs: ['test_file', 'test_count'],\n validationRules: [(frame) => frame.metadata?.tests_failing === true],\n },\n {\n name: 'implement-minimal',\n requiredOutputs: ['implementation_file'],\n validationRules: [(frame) => frame.metadata?.tests_passing === true],\n },\n {\n name: 'refactor',\n requiredOutputs: ['refactored_files'],\n validationRules: [\n (frame) => frame.metadata?.tests_passing === true,\n (frame) => frame.metadata?.complexity_reduced === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Feature Development Workflow\n */\n static FEATURE: WorkflowTemplate = {\n name: 'feature',\n description: 'Feature development workflow',\n phases: [\n {\n name: 'research',\n requiredOutputs: ['requirements', 'constraints', 'dependencies'],\n validationRules: [\n (frame) => frame.metadata?.research_complete === true,\n ],\n },\n {\n name: 'design',\n requiredOutputs: ['architecture_decision', 'api_design'],\n validationRules: [(frame) => frame.metadata?.design_reviewed === true],\n },\n {\n name: 'implement',\n requiredOutputs: ['implementation_files', 'tests'],\n validationRules: [\n (frame) => frame.metadata?.tests_passing === true,\n (frame) => frame.metadata?.lint_passing === true,\n ],\n },\n {\n name: 'validate',\n requiredOutputs: ['test_results', 'performance_metrics'],\n validationRules: [\n (frame) => frame.metadata?.validation_complete === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Bug Fix Workflow\n */\n static BUGFIX: WorkflowTemplate = {\n name: 'bugfix',\n description: 'Bug fixing workflow',\n phases: [\n {\n name: 'reproduce',\n requiredOutputs: ['reproduction_steps', 'failing_test'],\n validationRules: [(frame) => frame.metadata?.bug_reproduced === true],\n },\n {\n name: 'diagnose',\n requiredOutputs: ['root_cause', 'affected_code'],\n validationRules: [(frame) => frame.metadata?.cause_identified === true],\n },\n {\n name: 'fix',\n requiredOutputs: ['fix_commits', 'updated_tests'],\n validationRules: [(frame) => frame.metadata?.fix_applied === true],\n },\n {\n name: 'verify',\n requiredOutputs: ['verification_results', 'regression_tests'],\n validationRules: [\n (frame) => frame.metadata?.bug_fixed === true,\n (frame) => frame.metadata?.no_regressions === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Refactoring Workflow\n */\n static REFACTOR: WorkflowTemplate = {\n name: 'refactor',\n description: 'Code refactoring workflow',\n phases: [\n {\n name: 'analyze',\n requiredOutputs: [\n 'code_metrics',\n 'smell_detection',\n 'complexity_report',\n ],\n validationRules: [\n (frame) => frame.metadata?.analysis_complete === true,\n ],\n },\n {\n name: 'plan',\n requiredOutputs: ['refactor_plan', 'risk_assessment'],\n validationRules: [(frame) => frame.metadata?.plan_approved === true],\n },\n {\n name: 'refactor',\n requiredOutputs: ['refactored_code', 'preserved_tests'],\n validationRules: [(frame) => frame.metadata?.tests_passing === true],\n },\n {\n name: 'validate',\n requiredOutputs: ['before_after_metrics', 'performance_comparison'],\n validationRules: [\n (frame) => frame.metadata?.metrics_improved === true,\n (frame) => frame.metadata?.behavior_preserved === true,\n ],\n autoTransition: true,\n },\n ],\n };\n\n /**\n * Start a workflow, creating the parent frame and first phase frame\n */\n async startWorkflow(\n template: WorkflowTemplate,\n parentFrameId?: string\n ): Promise<Frame> {\n // Create parent workflow frame\n const workflowFrame = await this.frameManager.push(\n {\n type: 'workflow',\n description: `${template.name} workflow`,\n metadata: {\n workflow: template.name,\n current_phase: 0,\n phases: template.phases.map((p) => p.name),\n started_at: new Date().toISOString(),\n },\n },\n parentFrameId\n );\n\n // Auto-create first phase frame\n await this.startPhase(workflowFrame.id, 0);\n\n return workflowFrame;\n }\n\n /**\n * Transition to next phase if current phase is complete\n */\n async transitionPhase(frameId: string): Promise<boolean> {\n const frame = await this.frameManager.getFrame(frameId);\n if (!frame || frame.type !== 'workflow') return false;\n\n const currentPhase = frame.metadata?.current_phase || 0;\n const template = this.getTemplate(frame.metadata?.workflow);\n if (!template) return false;\n\n // Validate current phase completion\n const phaseFrame = await this.getCurrentPhaseFrame(frameId);\n if (!phaseFrame) return false;\n\n const phase = template.phases[currentPhase];\n const isComplete = await this.validatePhase(phaseFrame, phase);\n\n if (!isComplete) {\n console.log(`Phase ${phase.name} validation failed`);\n return false;\n }\n\n // Close current phase frame\n await this.frameManager.close(phaseFrame.id, {\n completed: true,\n phase: phase.name,\n });\n\n // Check if workflow is complete\n if (currentPhase >= template.phases.length - 1) {\n await this.frameManager.close(frameId, {\n workflow_complete: true,\n completed_at: new Date().toISOString(),\n });\n return true;\n }\n\n // Start next phase\n await this.frameManager.updateMetadata(frameId, {\n current_phase: currentPhase + 1,\n });\n await this.startPhase(frameId, currentPhase + 1);\n\n return true;\n }\n\n /**\n * Start a specific phase within a workflow\n */\n private async startPhase(\n workflowFrameId: string,\n phaseIndex: number\n ): Promise<Frame> {\n const frame = await this.frameManager.getFrame(workflowFrameId);\n const template = this.getTemplate(frame?.metadata?.workflow);\n if (!template || phaseIndex >= template.phases.length) {\n throw new Error('Invalid phase index');\n }\n\n const phase = template.phases[phaseIndex];\n return await this.frameManager.push(\n {\n type: 'phase',\n description: `Phase: ${phase.name}`,\n metadata: {\n phase_name: phase.name,\n phase_index: phaseIndex,\n required_outputs: phase.requiredOutputs,\n started_at: new Date().toISOString(),\n },\n },\n workflowFrameId\n );\n }\n\n /**\n * Validate a phase frame against its requirements\n */\n private async validatePhase(\n frame: Frame,\n phase: WorkflowPhase\n ): Promise<boolean> {\n // Check required outputs\n if (phase.requiredOutputs) {\n for (const output of phase.requiredOutputs) {\n if (!frame.metadata?.[output]) {\n return false;\n }\n }\n }\n\n // Run validation rules\n if (phase.validationRules) {\n for (const rule of phase.validationRules) {\n if (!rule(frame)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Get current phase frame for a workflow\n */\n private async getCurrentPhaseFrame(\n workflowFrameId: string\n ): Promise<Frame | null> {\n const children = await this.frameManager.getChildren(workflowFrameId);\n return (\n children.find((f) => f.type === 'phase' && f.status === 'open') || null\n );\n }\n\n /**\n * Get template by name\n */\n private getTemplate(name?: string): WorkflowTemplate | null {\n if (!name) return null;\n\n const templates: Record<string, WorkflowTemplate> = {\n tdd: WorkflowTemplates.TDD,\n feature: WorkflowTemplates.FEATURE,\n bugfix: WorkflowTemplates.BUGFIX,\n refactor: WorkflowTemplates.REFACTOR,\n };\n\n return templates[name] || null;\n }\n\n /**\n * List available workflow templates\n */\n static listTemplates(): WorkflowTemplate[] {\n return [\n WorkflowTemplates.TDD,\n WorkflowTemplates.FEATURE,\n WorkflowTemplates.BUGFIX,\n WorkflowTemplates.REFACTOR,\n ];\n }\n}\n\n/**\n * Export workflow templates object for CLI commands\n */\nexport const workflowTemplates = {\n tdd: {\n name: 'Test-Driven Development',\n description: 'Write tests first, then implement',\n phases: [\n { name: 'write-failing-tests', description: 'Write tests that fail' },\n { name: 'implement-code', description: 'Make tests pass' },\n { name: 'refactor', description: 'Clean up code' },\n ],\n },\n feature: {\n name: 'Feature Development',\n description: 'Develop a new feature',\n phases: [\n { name: 'design', description: 'Design the feature' },\n { name: 'implement', description: 'Build the feature' },\n { name: 'test', description: 'Test the feature' },\n ],\n },\n bugfix: {\n name: 'Bug Fix',\n description: 'Fix a reported bug',\n phases: [\n { name: 'reproduce', description: 'Reproduce the bug' },\n { name: 'fix', description: 'Fix the bug' },\n { name: 'verify', description: 'Verify the fix' },\n ],\n },\n refactor: {\n name: 'Refactoring',\n description: 'Improve code structure',\n phases: [\n { name: 'analyze', description: 'Analyze current code' },\n { name: 'refactor', description: 'Refactor code' },\n { name: 'test', description: 'Ensure no regressions' },\n ],\n },\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/merge/conflict-detector.ts"],
4
- "sourcesContent": ["/**\n * Conflict Detection Engine\n * Detects paradoxes in parallel frame timelines\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n MergeConflict,\n FrameStack,\n ParallelSolution,\n DecisionConflict,\n} from './types.js';\nimport { Frame, Event } from '../context/frame-manager.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport class ConflictDetector {\n private readonly SIMILARITY_THRESHOLD = 0.8;\n\n /**\n * Detect all types of conflicts between two frame stacks\n */\n detectConflicts(stack1: FrameStack, stack2: FrameStack): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Detect parallel solution conflicts\n const parallelConflicts = this.detectParallelSolutions(stack1, stack2);\n conflicts.push(...parallelConflicts);\n\n // Detect conflicting decisions\n const decisionConflicts = this.detectConflictingDecisions(\n stack1.events,\n stack2.events\n );\n conflicts.push(...decisionConflicts);\n\n // Detect structural divergence\n const structuralConflicts = this.detectStructuralDivergence(\n stack1.frames,\n stack2.frames\n );\n conflicts.push(...structuralConflicts);\n\n logger.info(`Detected ${conflicts.length} conflicts between stacks`, {\n stack1Id: stack1.id,\n stack2Id: stack2.id,\n conflictTypes: this.summarizeConflictTypes(conflicts),\n });\n\n return conflicts;\n }\n\n /**\n * Analyze frames to find parallel solutions to the same problem\n */\n analyzeParallelSolutions(frames: Frame[]): ParallelSolution[] {\n const solutions: ParallelSolution[] = [];\n\n // Group frames by similar purpose/name\n const groupedFrames = this.groupSimilarFrames(frames);\n\n for (const group of groupedFrames) {\n if (group.length > 1) {\n // Multiple frames solving similar problems\n group.forEach((frame) => {\n solutions.push({\n frameId: frame.frame_id,\n solution: this.extractSolution(frame),\n approach: this.analyzeApproach(frame),\n author: frame.inputs?.author || 'unknown',\n timestamp: frame.created_at,\n effectiveness: this.calculateEffectiveness(frame),\n });\n });\n }\n }\n\n return solutions;\n }\n\n /**\n * Identify conflicting decisions in event streams\n */\n identifyConflictingDecisions(events: Event[]): DecisionConflict[] {\n const conflicts: DecisionConflict[] = [];\n const decisions = this.extractDecisions(events);\n\n for (let i = 0; i < decisions.length; i++) {\n for (let j = i + 1; j < decisions.length; j++) {\n if (this.decisionsConflict(decisions[i], decisions[j])) {\n conflicts.push({\n decision1: decisions[i].payload?.decision || '',\n decision2: decisions[j].payload?.decision || '',\n impact: this.assessImpact(decisions[i], decisions[j]),\n canCoexist: this.canCoexist(decisions[i], decisions[j]),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect parallel solutions between two stacks\n */\n private detectParallelSolutions(\n stack1: FrameStack,\n stack2: FrameStack\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Find frames that appear to solve the same problem\n for (const frame1 of stack1.frames) {\n for (const frame2 of stack2.frames) {\n if (\n this.framesAreSimilar(frame1, frame2) &&\n !this.framesAreIdentical(frame1, frame2)\n ) {\n conflicts.push({\n id: uuidv4(),\n type: 'parallel_solution',\n frameId1: frame1.frame_id,\n frameId2: frame2.frame_id,\n severity: this.calculateParallelSeverity(frame1, frame2),\n description: `Parallel solutions detected: \"${frame1.name}\" vs \"${frame2.name}\"`,\n detectedAt: Date.now(),\n conflictingPaths: this.extractPaths(frame1, frame2),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect conflicting decisions between event streams\n */\n private detectConflictingDecisions(\n events1: Event[],\n events2: Event[]\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n const decisions1 = this.extractDecisions(events1);\n const decisions2 = this.extractDecisions(events2);\n\n for (const d1 of decisions1) {\n for (const d2 of decisions2) {\n if (this.decisionsConflict(d1, d2)) {\n conflicts.push({\n id: uuidv4(),\n type: 'conflicting_decision',\n frameId1: d1.frame_id,\n frameId2: d2.frame_id,\n severity: this.assessImpact(d1, d2) as\n | 'low'\n | 'medium'\n | 'high'\n | 'critical',\n description: `Conflicting decisions: \"${d1.payload?.decision}\" vs \"${d2.payload?.decision}\"`,\n detectedAt: Date.now(),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect structural divergence in frame hierarchies\n */\n private detectStructuralDivergence(\n frames1: Frame[],\n frames2: Frame[]\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Build frame trees\n const tree1 = this.buildFrameTree(frames1);\n const tree2 = this.buildFrameTree(frames2);\n\n // Find divergence points\n const divergences = this.findDivergences(tree1, tree2);\n\n for (const divergence of divergences) {\n conflicts.push({\n id: uuidv4(),\n type: 'structural_divergence',\n frameId1: divergence.node1,\n frameId2: divergence.node2,\n severity: this.calculateDivergenceSeverity(divergence),\n description: `Structural divergence at depth ${divergence.depth}`,\n detectedAt: Date.now(),\n });\n }\n\n return conflicts;\n }\n\n /**\n * Helper: Check if two frames are similar (solving same problem)\n */\n private framesAreSimilar(frame1: Frame, frame2: Frame): boolean {\n // Check name similarity\n const nameSimilarity = this.calculateSimilarity(frame1.name, frame2.name);\n if (nameSimilarity > this.SIMILARITY_THRESHOLD) return true;\n\n // Check type and parent\n if (\n frame1.type === frame2.type &&\n frame1.parent_frame_id === frame2.parent_frame_id\n ) {\n return true;\n }\n\n // Check inputs similarity\n const inputSimilarity = this.compareInputs(frame1.inputs, frame2.inputs);\n return inputSimilarity > this.SIMILARITY_THRESHOLD;\n }\n\n /**\n * Helper: Check if frames are identical\n */\n private framesAreIdentical(frame1: Frame, frame2: Frame): boolean {\n return frame1.frame_id === frame2.frame_id;\n }\n\n /**\n * Helper: Calculate string similarity (Levenshtein-based)\n */\n private calculateSimilarity(str1: string, str2: string): number {\n const maxLen = Math.max(str1.length, str2.length);\n if (maxLen === 0) return 1;\n\n const distance = this.levenshteinDistance(str1, str2);\n return 1 - distance / maxLen;\n }\n\n /**\n * Helper: Levenshtein distance implementation\n */\n private levenshteinDistance(str1: string, str2: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= str2.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= str1.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= str2.length; i++) {\n for (let j = 1; j <= str1.length; j++) {\n if (str2.charAt(i - 1) === str1.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n\n /**\n * Helper: Compare frame inputs\n */\n private compareInputs(\n inputs1: Record<string, unknown>,\n inputs2: Record<string, unknown>\n ): number {\n const keys1 = Object.keys(inputs1 || {});\n const keys2 = Object.keys(inputs2 || {});\n const allKeys = new Set([...keys1, ...keys2]);\n\n if (allKeys.size === 0) return 1;\n\n let matches = 0;\n for (const key of allKeys) {\n if (JSON.stringify(inputs1[key]) === JSON.stringify(inputs2[key])) {\n matches++;\n }\n }\n\n return matches / allKeys.size;\n }\n\n /**\n * Helper: Calculate severity for parallel solutions\n */\n private calculateParallelSeverity(\n frame1: Frame,\n frame2: Frame\n ): 'low' | 'medium' | 'high' | 'critical' {\n // Critical if both are completed and have different outputs\n if (frame1.state === 'closed' && frame2.state === 'closed') {\n const outputSimilarity = this.compareInputs(\n frame1.outputs,\n frame2.outputs\n );\n if (outputSimilarity < 0.5) return 'critical';\n if (outputSimilarity < 0.7) return 'high';\n }\n\n // High if different approaches to same parent task\n if (frame1.parent_frame_id === frame2.parent_frame_id) {\n return 'high';\n }\n\n return 'medium';\n }\n\n /**\n * Helper: Extract decision events\n */\n private extractDecisions(events: Event[]): Event[] {\n return events.filter(\n (e) =>\n e.event_type === 'decision' ||\n e.payload?.type === 'decision' ||\n e.payload?.decision !== undefined\n );\n }\n\n /**\n * Helper: Check if two decisions conflict\n */\n private decisionsConflict(d1: Event, d2: Event): boolean {\n // Check if decisions affect same resource/path\n const resource1 = d1.payload?.resource || d1.payload?.path;\n const resource2 = d2.payload?.resource || d2.payload?.path;\n\n if (resource1 && resource2 && resource1 === resource2) {\n // Different decisions on same resource\n return d1.payload?.decision !== d2.payload?.decision;\n }\n\n // Check for logical conflicts\n return this.hasLogicalConflict(d1.payload, d2.payload);\n }\n\n /**\n * Helper: Check for logical conflicts in payloads\n */\n private hasLogicalConflict(payload1: unknown, payload2: unknown): boolean {\n // Architecture decisions\n if (payload1?.architecture && payload2?.architecture) {\n return payload1.architecture !== payload2.architecture;\n }\n\n // Technology choices\n if (payload1?.technology && payload2?.technology) {\n return payload1.technology !== payload2.technology;\n }\n\n return false;\n }\n\n /**\n * Helper: Assess impact of conflicting decisions\n */\n private assessImpact(d1: Event, d2: Event): 'low' | 'medium' | 'high' {\n // High impact for architecture/design decisions\n if (\n d1.payload?.type === 'architecture' ||\n d2.payload?.type === 'architecture'\n ) {\n return 'high';\n }\n\n // Medium for implementation decisions\n if (\n d1.payload?.scope === 'implementation' ||\n d2.payload?.scope === 'implementation'\n ) {\n return 'medium';\n }\n\n return 'low';\n }\n\n /**\n * Helper: Check if decisions can coexist\n */\n private canCoexist(d1: Event, d2: Event): boolean {\n // Different scopes can coexist\n if (d1.payload?.scope !== d2.payload?.scope) {\n return true;\n }\n\n // Non-conflicting resources can coexist\n const resource1 = d1.payload?.resource;\n const resource2 = d2.payload?.resource;\n\n return resource1 !== resource2;\n }\n\n /**\n * Helper: Build frame tree structure\n */\n private buildFrameTree(frames: Frame[]): Map<string, Set<string>> {\n const tree = new Map<string, Set<string>>();\n\n for (const frame of frames) {\n if (frame.parent_frame_id) {\n if (!tree.has(frame.parent_frame_id)) {\n tree.set(frame.parent_frame_id, new Set());\n }\n const parentSet = tree.get(frame.parent_frame_id);\n if (parentSet) {\n parentSet.add(frame.frame_id);\n }\n }\n }\n\n return tree;\n }\n\n /**\n * Helper: Find divergence points in trees\n */\n private findDivergences(\n tree1: Map<string, Set<string>>,\n tree2: Map<string, Set<string>>\n ): Array<{ node1: string; node2: string; depth: number }> {\n const divergences: Array<{ node1: string; node2: string; depth: number }> =\n [];\n\n // Find nodes that exist in both but have different children\n for (const [node, children1] of tree1) {\n if (tree2.has(node)) {\n const children2 = tree2.get(node);\n if (children2 && !this.setsEqual(children1, children2)) {\n divergences.push({\n node1: node,\n node2: node,\n depth: this.calculateDepth(node, tree1),\n });\n }\n }\n }\n\n return divergences;\n }\n\n /**\n * Helper: Check if two sets are equal\n */\n private setsEqual<T>(set1: Set<T>, set2: Set<T>): boolean {\n if (set1.size !== set2.size) return false;\n for (const item of set1) {\n if (!set2.has(item)) return false;\n }\n return true;\n }\n\n /**\n * Helper: Calculate node depth in tree\n */\n private calculateDepth(node: string, tree: Map<string, Set<string>>): number {\n let depth = 0;\n let current = node;\n\n // Find parent of current node\n for (const [parent, children] of tree) {\n if (children.has(current)) {\n depth++;\n current = parent;\n }\n }\n\n return depth;\n }\n\n /**\n * Helper: Calculate divergence severity\n */\n private calculateDivergenceSeverity(divergence: {\n depth: number;\n }): 'low' | 'medium' | 'high' | 'critical' {\n if (divergence.depth === 0) return 'critical'; // Root divergence\n if (divergence.depth === 1) return 'high';\n if (divergence.depth === 2) return 'medium';\n return 'low';\n }\n\n /**\n * Helper: Extract paths from frames\n */\n private extractPaths(frame1: Frame, frame2: Frame): string[] {\n const paths: string[] = [];\n\n if (frame1.inputs?.path) paths.push(frame1.inputs.path);\n if (frame2.inputs?.path) paths.push(frame2.inputs.path);\n if (frame1.outputs?.files) paths.push(...frame1.outputs.files);\n if (frame2.outputs?.files) paths.push(...frame2.outputs.files);\n\n return [...new Set(paths)];\n }\n\n /**\n * Helper: Extract solution from frame\n */\n private extractSolution(frame: Frame): string {\n return (\n frame.outputs?.solution || frame.digest_text || 'No solution description'\n );\n }\n\n /**\n * Helper: Analyze approach taken\n */\n private analyzeApproach(frame: Frame): string {\n if (frame.outputs?.approach) return frame.outputs.approach;\n if (frame.type === 'debug') return 'Debug approach';\n if (frame.type === 'review') return 'Review approach';\n return 'Standard approach';\n }\n\n /**\n * Helper: Calculate solution effectiveness\n */\n private calculateEffectiveness(frame: Frame): number {\n let score = 0.5; // Base score\n\n // Completed frames are more effective\n if (frame.state === 'closed') score += 0.2;\n\n // Frames with outputs are more effective\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.1;\n\n // Frames with digests are more effective\n if (frame.digest_text) score += 0.1;\n\n // Quick completion is more effective\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration < 300000) score += 0.1; // Less than 5 minutes\n }\n\n return Math.min(score, 1);\n }\n\n /**\n * Helper: Group similar frames together\n */\n private groupSimilarFrames(frames: Frame[]): Frame[][] {\n const groups: Frame[][] = [];\n const processed = new Set<string>();\n\n for (const frame of frames) {\n if (processed.has(frame.frame_id)) continue;\n\n const group = [frame];\n processed.add(frame.frame_id);\n\n for (const other of frames) {\n if (\n !processed.has(other.frame_id) &&\n this.framesAreSimilar(frame, other)\n ) {\n group.push(other);\n processed.add(other.frame_id);\n }\n }\n\n groups.push(group);\n }\n\n return groups;\n }\n\n /**\n * Helper: Summarize conflict types\n */\n private summarizeConflictTypes(\n conflicts: MergeConflict[]\n ): Record<string, number> {\n const summary: Record<string, number> = {\n parallel_solution: 0,\n conflicting_decision: 0,\n structural_divergence: 0,\n };\n\n for (const conflict of conflicts) {\n summary[conflict.type]++;\n }\n\n return summary;\n }\n}\n"],
4
+ "sourcesContent": ["/**\n * Conflict Detection Engine\n * Detects paradoxes in parallel frame timelines\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n MergeConflict,\n FrameStack,\n ParallelSolution,\n DecisionConflict,\n} from './types.js';\nimport { Frame, Event } from '../context/index.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport class ConflictDetector {\n private readonly SIMILARITY_THRESHOLD = 0.8;\n\n /**\n * Detect all types of conflicts between two frame stacks\n */\n detectConflicts(stack1: FrameStack, stack2: FrameStack): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Detect parallel solution conflicts\n const parallelConflicts = this.detectParallelSolutions(stack1, stack2);\n conflicts.push(...parallelConflicts);\n\n // Detect conflicting decisions\n const decisionConflicts = this.detectConflictingDecisions(\n stack1.events,\n stack2.events\n );\n conflicts.push(...decisionConflicts);\n\n // Detect structural divergence\n const structuralConflicts = this.detectStructuralDivergence(\n stack1.frames,\n stack2.frames\n );\n conflicts.push(...structuralConflicts);\n\n logger.info(`Detected ${conflicts.length} conflicts between stacks`, {\n stack1Id: stack1.id,\n stack2Id: stack2.id,\n conflictTypes: this.summarizeConflictTypes(conflicts),\n });\n\n return conflicts;\n }\n\n /**\n * Analyze frames to find parallel solutions to the same problem\n */\n analyzeParallelSolutions(frames: Frame[]): ParallelSolution[] {\n const solutions: ParallelSolution[] = [];\n\n // Group frames by similar purpose/name\n const groupedFrames = this.groupSimilarFrames(frames);\n\n for (const group of groupedFrames) {\n if (group.length > 1) {\n // Multiple frames solving similar problems\n group.forEach((frame) => {\n solutions.push({\n frameId: frame.frame_id,\n solution: this.extractSolution(frame),\n approach: this.analyzeApproach(frame),\n author: frame.inputs?.author || 'unknown',\n timestamp: frame.created_at,\n effectiveness: this.calculateEffectiveness(frame),\n });\n });\n }\n }\n\n return solutions;\n }\n\n /**\n * Identify conflicting decisions in event streams\n */\n identifyConflictingDecisions(events: Event[]): DecisionConflict[] {\n const conflicts: DecisionConflict[] = [];\n const decisions = this.extractDecisions(events);\n\n for (let i = 0; i < decisions.length; i++) {\n for (let j = i + 1; j < decisions.length; j++) {\n if (this.decisionsConflict(decisions[i], decisions[j])) {\n conflicts.push({\n decision1: decisions[i].payload?.decision || '',\n decision2: decisions[j].payload?.decision || '',\n impact: this.assessImpact(decisions[i], decisions[j]),\n canCoexist: this.canCoexist(decisions[i], decisions[j]),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect parallel solutions between two stacks\n */\n private detectParallelSolutions(\n stack1: FrameStack,\n stack2: FrameStack\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Find frames that appear to solve the same problem\n for (const frame1 of stack1.frames) {\n for (const frame2 of stack2.frames) {\n if (\n this.framesAreSimilar(frame1, frame2) &&\n !this.framesAreIdentical(frame1, frame2)\n ) {\n conflicts.push({\n id: uuidv4(),\n type: 'parallel_solution',\n frameId1: frame1.frame_id,\n frameId2: frame2.frame_id,\n severity: this.calculateParallelSeverity(frame1, frame2),\n description: `Parallel solutions detected: \"${frame1.name}\" vs \"${frame2.name}\"`,\n detectedAt: Date.now(),\n conflictingPaths: this.extractPaths(frame1, frame2),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect conflicting decisions between event streams\n */\n private detectConflictingDecisions(\n events1: Event[],\n events2: Event[]\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n const decisions1 = this.extractDecisions(events1);\n const decisions2 = this.extractDecisions(events2);\n\n for (const d1 of decisions1) {\n for (const d2 of decisions2) {\n if (this.decisionsConflict(d1, d2)) {\n conflicts.push({\n id: uuidv4(),\n type: 'conflicting_decision',\n frameId1: d1.frame_id,\n frameId2: d2.frame_id,\n severity: this.assessImpact(d1, d2) as\n | 'low'\n | 'medium'\n | 'high'\n | 'critical',\n description: `Conflicting decisions: \"${d1.payload?.decision}\" vs \"${d2.payload?.decision}\"`,\n detectedAt: Date.now(),\n });\n }\n }\n }\n\n return conflicts;\n }\n\n /**\n * Detect structural divergence in frame hierarchies\n */\n private detectStructuralDivergence(\n frames1: Frame[],\n frames2: Frame[]\n ): MergeConflict[] {\n const conflicts: MergeConflict[] = [];\n\n // Build frame trees\n const tree1 = this.buildFrameTree(frames1);\n const tree2 = this.buildFrameTree(frames2);\n\n // Find divergence points\n const divergences = this.findDivergences(tree1, tree2);\n\n for (const divergence of divergences) {\n conflicts.push({\n id: uuidv4(),\n type: 'structural_divergence',\n frameId1: divergence.node1,\n frameId2: divergence.node2,\n severity: this.calculateDivergenceSeverity(divergence),\n description: `Structural divergence at depth ${divergence.depth}`,\n detectedAt: Date.now(),\n });\n }\n\n return conflicts;\n }\n\n /**\n * Helper: Check if two frames are similar (solving same problem)\n */\n private framesAreSimilar(frame1: Frame, frame2: Frame): boolean {\n // Check name similarity\n const nameSimilarity = this.calculateSimilarity(frame1.name, frame2.name);\n if (nameSimilarity > this.SIMILARITY_THRESHOLD) return true;\n\n // Check type and parent\n if (\n frame1.type === frame2.type &&\n frame1.parent_frame_id === frame2.parent_frame_id\n ) {\n return true;\n }\n\n // Check inputs similarity\n const inputSimilarity = this.compareInputs(frame1.inputs, frame2.inputs);\n return inputSimilarity > this.SIMILARITY_THRESHOLD;\n }\n\n /**\n * Helper: Check if frames are identical\n */\n private framesAreIdentical(frame1: Frame, frame2: Frame): boolean {\n return frame1.frame_id === frame2.frame_id;\n }\n\n /**\n * Helper: Calculate string similarity (Levenshtein-based)\n */\n private calculateSimilarity(str1: string, str2: string): number {\n const maxLen = Math.max(str1.length, str2.length);\n if (maxLen === 0) return 1;\n\n const distance = this.levenshteinDistance(str1, str2);\n return 1 - distance / maxLen;\n }\n\n /**\n * Helper: Levenshtein distance implementation\n */\n private levenshteinDistance(str1: string, str2: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= str2.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= str1.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= str2.length; i++) {\n for (let j = 1; j <= str1.length; j++) {\n if (str2.charAt(i - 1) === str1.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n\n /**\n * Helper: Compare frame inputs\n */\n private compareInputs(\n inputs1: Record<string, unknown>,\n inputs2: Record<string, unknown>\n ): number {\n const keys1 = Object.keys(inputs1 || {});\n const keys2 = Object.keys(inputs2 || {});\n const allKeys = new Set([...keys1, ...keys2]);\n\n if (allKeys.size === 0) return 1;\n\n let matches = 0;\n for (const key of allKeys) {\n if (JSON.stringify(inputs1[key]) === JSON.stringify(inputs2[key])) {\n matches++;\n }\n }\n\n return matches / allKeys.size;\n }\n\n /**\n * Helper: Calculate severity for parallel solutions\n */\n private calculateParallelSeverity(\n frame1: Frame,\n frame2: Frame\n ): 'low' | 'medium' | 'high' | 'critical' {\n // Critical if both are completed and have different outputs\n if (frame1.state === 'closed' && frame2.state === 'closed') {\n const outputSimilarity = this.compareInputs(\n frame1.outputs,\n frame2.outputs\n );\n if (outputSimilarity < 0.5) return 'critical';\n if (outputSimilarity < 0.7) return 'high';\n }\n\n // High if different approaches to same parent task\n if (frame1.parent_frame_id === frame2.parent_frame_id) {\n return 'high';\n }\n\n return 'medium';\n }\n\n /**\n * Helper: Extract decision events\n */\n private extractDecisions(events: Event[]): Event[] {\n return events.filter(\n (e) =>\n e.event_type === 'decision' ||\n e.payload?.type === 'decision' ||\n e.payload?.decision !== undefined\n );\n }\n\n /**\n * Helper: Check if two decisions conflict\n */\n private decisionsConflict(d1: Event, d2: Event): boolean {\n // Check if decisions affect same resource/path\n const resource1 = d1.payload?.resource || d1.payload?.path;\n const resource2 = d2.payload?.resource || d2.payload?.path;\n\n if (resource1 && resource2 && resource1 === resource2) {\n // Different decisions on same resource\n return d1.payload?.decision !== d2.payload?.decision;\n }\n\n // Check for logical conflicts\n return this.hasLogicalConflict(d1.payload, d2.payload);\n }\n\n /**\n * Helper: Check for logical conflicts in payloads\n */\n private hasLogicalConflict(payload1: unknown, payload2: unknown): boolean {\n // Architecture decisions\n if (payload1?.architecture && payload2?.architecture) {\n return payload1.architecture !== payload2.architecture;\n }\n\n // Technology choices\n if (payload1?.technology && payload2?.technology) {\n return payload1.technology !== payload2.technology;\n }\n\n return false;\n }\n\n /**\n * Helper: Assess impact of conflicting decisions\n */\n private assessImpact(d1: Event, d2: Event): 'low' | 'medium' | 'high' {\n // High impact for architecture/design decisions\n if (\n d1.payload?.type === 'architecture' ||\n d2.payload?.type === 'architecture'\n ) {\n return 'high';\n }\n\n // Medium for implementation decisions\n if (\n d1.payload?.scope === 'implementation' ||\n d2.payload?.scope === 'implementation'\n ) {\n return 'medium';\n }\n\n return 'low';\n }\n\n /**\n * Helper: Check if decisions can coexist\n */\n private canCoexist(d1: Event, d2: Event): boolean {\n // Different scopes can coexist\n if (d1.payload?.scope !== d2.payload?.scope) {\n return true;\n }\n\n // Non-conflicting resources can coexist\n const resource1 = d1.payload?.resource;\n const resource2 = d2.payload?.resource;\n\n return resource1 !== resource2;\n }\n\n /**\n * Helper: Build frame tree structure\n */\n private buildFrameTree(frames: Frame[]): Map<string, Set<string>> {\n const tree = new Map<string, Set<string>>();\n\n for (const frame of frames) {\n if (frame.parent_frame_id) {\n if (!tree.has(frame.parent_frame_id)) {\n tree.set(frame.parent_frame_id, new Set());\n }\n const parentSet = tree.get(frame.parent_frame_id);\n if (parentSet) {\n parentSet.add(frame.frame_id);\n }\n }\n }\n\n return tree;\n }\n\n /**\n * Helper: Find divergence points in trees\n */\n private findDivergences(\n tree1: Map<string, Set<string>>,\n tree2: Map<string, Set<string>>\n ): Array<{ node1: string; node2: string; depth: number }> {\n const divergences: Array<{ node1: string; node2: string; depth: number }> =\n [];\n\n // Find nodes that exist in both but have different children\n for (const [node, children1] of tree1) {\n if (tree2.has(node)) {\n const children2 = tree2.get(node);\n if (children2 && !this.setsEqual(children1, children2)) {\n divergences.push({\n node1: node,\n node2: node,\n depth: this.calculateDepth(node, tree1),\n });\n }\n }\n }\n\n return divergences;\n }\n\n /**\n * Helper: Check if two sets are equal\n */\n private setsEqual<T>(set1: Set<T>, set2: Set<T>): boolean {\n if (set1.size !== set2.size) return false;\n for (const item of set1) {\n if (!set2.has(item)) return false;\n }\n return true;\n }\n\n /**\n * Helper: Calculate node depth in tree\n */\n private calculateDepth(node: string, tree: Map<string, Set<string>>): number {\n let depth = 0;\n let current = node;\n\n // Find parent of current node\n for (const [parent, children] of tree) {\n if (children.has(current)) {\n depth++;\n current = parent;\n }\n }\n\n return depth;\n }\n\n /**\n * Helper: Calculate divergence severity\n */\n private calculateDivergenceSeverity(divergence: {\n depth: number;\n }): 'low' | 'medium' | 'high' | 'critical' {\n if (divergence.depth === 0) return 'critical'; // Root divergence\n if (divergence.depth === 1) return 'high';\n if (divergence.depth === 2) return 'medium';\n return 'low';\n }\n\n /**\n * Helper: Extract paths from frames\n */\n private extractPaths(frame1: Frame, frame2: Frame): string[] {\n const paths: string[] = [];\n\n if (frame1.inputs?.path) paths.push(frame1.inputs.path);\n if (frame2.inputs?.path) paths.push(frame2.inputs.path);\n if (frame1.outputs?.files) paths.push(...frame1.outputs.files);\n if (frame2.outputs?.files) paths.push(...frame2.outputs.files);\n\n return [...new Set(paths)];\n }\n\n /**\n * Helper: Extract solution from frame\n */\n private extractSolution(frame: Frame): string {\n return (\n frame.outputs?.solution || frame.digest_text || 'No solution description'\n );\n }\n\n /**\n * Helper: Analyze approach taken\n */\n private analyzeApproach(frame: Frame): string {\n if (frame.outputs?.approach) return frame.outputs.approach;\n if (frame.type === 'debug') return 'Debug approach';\n if (frame.type === 'review') return 'Review approach';\n return 'Standard approach';\n }\n\n /**\n * Helper: Calculate solution effectiveness\n */\n private calculateEffectiveness(frame: Frame): number {\n let score = 0.5; // Base score\n\n // Completed frames are more effective\n if (frame.state === 'closed') score += 0.2;\n\n // Frames with outputs are more effective\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.1;\n\n // Frames with digests are more effective\n if (frame.digest_text) score += 0.1;\n\n // Quick completion is more effective\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration < 300000) score += 0.1; // Less than 5 minutes\n }\n\n return Math.min(score, 1);\n }\n\n /**\n * Helper: Group similar frames together\n */\n private groupSimilarFrames(frames: Frame[]): Frame[][] {\n const groups: Frame[][] = [];\n const processed = new Set<string>();\n\n for (const frame of frames) {\n if (processed.has(frame.frame_id)) continue;\n\n const group = [frame];\n processed.add(frame.frame_id);\n\n for (const other of frames) {\n if (\n !processed.has(other.frame_id) &&\n this.framesAreSimilar(frame, other)\n ) {\n group.push(other);\n processed.add(other.frame_id);\n }\n }\n\n groups.push(group);\n }\n\n return groups;\n }\n\n /**\n * Helper: Summarize conflict types\n */\n private summarizeConflictTypes(\n conflicts: MergeConflict[]\n ): Record<string, number> {\n const summary: Record<string, number> = {\n parallel_solution: 0,\n conflicting_decision: 0,\n structural_divergence: 0,\n };\n\n for (const conflict of conflicts) {\n summary[conflict.type]++;\n }\n\n return summary;\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }