aifastdb-devplan 1.6.1 → 1.6.3

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 (97) hide show
  1. package/dist/dev-plan-document-store.d.ts +13 -1
  2. package/dist/dev-plan-document-store.d.ts.map +1 -1
  3. package/dist/dev-plan-document-store.js +119 -0
  4. package/dist/dev-plan-document-store.js.map +1 -1
  5. package/dist/dev-plan-factory.d.ts.map +1 -1
  6. package/dist/dev-plan-factory.js +3 -1
  7. package/dist/dev-plan-factory.js.map +1 -1
  8. package/dist/dev-plan-graph-store.d.ts +341 -9
  9. package/dist/dev-plan-graph-store.d.ts.map +1 -1
  10. package/dist/dev-plan-graph-store.js +2414 -210
  11. package/dist/dev-plan-graph-store.js.map +1 -1
  12. package/dist/dev-plan-interface.d.ts +119 -1
  13. package/dist/dev-plan-interface.d.ts.map +1 -1
  14. package/dist/dev-plan-migrate.d.ts +1 -0
  15. package/dist/dev-plan-migrate.d.ts.map +1 -1
  16. package/dist/dev-plan-migrate.js +28 -2
  17. package/dist/dev-plan-migrate.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/mcp-server/index.js +652 -0
  22. package/dist/mcp-server/index.js.map +1 -1
  23. package/dist/shard-config.d.ts +64 -0
  24. package/dist/shard-config.d.ts.map +1 -0
  25. package/dist/shard-config.js +109 -0
  26. package/dist/shard-config.js.map +1 -0
  27. package/dist/types.d.ts +305 -2
  28. package/dist/types.d.ts.map +1 -1
  29. package/dist/types.js.map +1 -1
  30. package/dist/visualize/graph-canvas/api-compat.d.ts.map +1 -1
  31. package/dist/visualize/graph-canvas/api-compat.js +22 -12
  32. package/dist/visualize/graph-canvas/api-compat.js.map +1 -1
  33. package/dist/visualize/graph-canvas/core.d.ts.map +1 -1
  34. package/dist/visualize/graph-canvas/core.js +296 -4
  35. package/dist/visualize/graph-canvas/core.js.map +1 -1
  36. package/dist/visualize/graph-canvas/interaction.d.ts.map +1 -1
  37. package/dist/visualize/graph-canvas/interaction.js +11 -0
  38. package/dist/visualize/graph-canvas/interaction.js.map +1 -1
  39. package/dist/visualize/graph-canvas/layout-worker.d.ts.map +1 -1
  40. package/dist/visualize/graph-canvas/layout-worker.js +45 -9
  41. package/dist/visualize/graph-canvas/layout-worker.js.map +1 -1
  42. package/dist/visualize/graph-canvas/renderer.d.ts.map +1 -1
  43. package/dist/visualize/graph-canvas/renderer.js +164 -33
  44. package/dist/visualize/graph-canvas/renderer.js.map +1 -1
  45. package/dist/visualize/graph-canvas/styles.d.ts.map +1 -1
  46. package/dist/visualize/graph-canvas/styles.js +146 -121
  47. package/dist/visualize/graph-canvas/styles.js.map +1 -1
  48. package/dist/visualize/graph-canvas/viewport.d.ts.map +1 -1
  49. package/dist/visualize/graph-canvas/viewport.js +10 -0
  50. package/dist/visualize/graph-canvas/viewport.js.map +1 -1
  51. package/dist/visualize/server.js +371 -32
  52. package/dist/visualize/server.js.map +1 -1
  53. package/dist/visualize/template-core.d.ts +9 -0
  54. package/dist/visualize/template-core.d.ts.map +1 -0
  55. package/dist/visualize/template-core.js +721 -0
  56. package/dist/visualize/template-core.js.map +1 -0
  57. package/dist/visualize/template-data-loading.d.ts +7 -0
  58. package/dist/visualize/template-data-loading.d.ts.map +1 -0
  59. package/dist/visualize/template-data-loading.js +677 -0
  60. package/dist/visualize/template-data-loading.js.map +1 -0
  61. package/dist/visualize/template-detail-panel.d.ts +14 -0
  62. package/dist/visualize/template-detail-panel.d.ts.map +1 -0
  63. package/dist/visualize/template-detail-panel.js +624 -0
  64. package/dist/visualize/template-detail-panel.js.map +1 -0
  65. package/dist/visualize/template-graph-3d.d.ts +7 -0
  66. package/dist/visualize/template-graph-3d.d.ts.map +1 -0
  67. package/dist/visualize/template-graph-3d.js +1114 -0
  68. package/dist/visualize/template-graph-3d.js.map +1 -0
  69. package/dist/visualize/template-graph-vis.d.ts +8 -0
  70. package/dist/visualize/template-graph-vis.d.ts.map +1 -0
  71. package/dist/visualize/template-graph-vis.js +1215 -0
  72. package/dist/visualize/template-graph-vis.js.map +1 -0
  73. package/dist/visualize/template-html.d.ts +9 -0
  74. package/dist/visualize/template-html.d.ts.map +1 -0
  75. package/dist/visualize/template-html.js +635 -0
  76. package/dist/visualize/template-html.js.map +1 -0
  77. package/dist/visualize/template-md-viewer.d.ts +11 -0
  78. package/dist/visualize/template-md-viewer.d.ts.map +1 -0
  79. package/dist/visualize/template-md-viewer.js +806 -0
  80. package/dist/visualize/template-md-viewer.js.map +1 -0
  81. package/dist/visualize/template-pages.d.ts +7 -0
  82. package/dist/visualize/template-pages.d.ts.map +1 -0
  83. package/dist/visualize/template-pages.js +1892 -0
  84. package/dist/visualize/template-pages.js.map +1 -0
  85. package/dist/visualize/template-stats-modal.d.ts +7 -0
  86. package/dist/visualize/template-stats-modal.d.ts.map +1 -0
  87. package/dist/visualize/template-stats-modal.js +466 -0
  88. package/dist/visualize/template-stats-modal.js.map +1 -0
  89. package/dist/visualize/template-styles.d.ts +9 -0
  90. package/dist/visualize/template-styles.d.ts.map +1 -0
  91. package/dist/visualize/template-styles.js +623 -0
  92. package/dist/visualize/template-styles.js.map +1 -0
  93. package/dist/visualize/template.d.ts +15 -3
  94. package/dist/visualize/template.d.ts.map +1 -1
  95. package/dist/visualize/template.js +44 -3475
  96. package/dist/visualize/template.js.map +1 -1
  97. package/package.json +2 -2
@@ -122,8 +122,11 @@ RenderPipeline.prototype._fullRender = function(ctx) {
122
122
  }
123
123
  }
124
124
 
125
- // ── 6. Draw edges (only between visible nodes) ──
126
- this._drawEdges(ctx, lodLevel);
125
+ // ── 6. Draw edges (skip during zoom/drag for performance — T11.8) ──
126
+ var skipEdges = engine._isZooming || (engine._interaction && engine._interaction._isDraggingCanvas);
127
+ if (!skipEdges) {
128
+ this._drawEdges(ctx, lodLevel);
129
+ }
127
130
 
128
131
  // ── 7. Draw nodes ──
129
132
  this._drawNodes(ctx, lodLevel);
@@ -314,21 +317,40 @@ RenderPipeline.prototype._drawEdges = function(ctx, lodLevel) {
314
317
 
315
318
  ctx.beginPath();
316
319
 
320
+ // Compute control point for quadratic Bezier curve (LOD >= 1)
321
+ var cpX = null, cpY = null;
317
322
  if (lodLevel === 0) {
318
323
  // LOD 0: straight lines only (maximum performance)
319
324
  ctx.moveTo(fromNode.x, fromNode.y);
320
325
  ctx.lineTo(toNode.x, toNode.y);
321
326
  } else {
322
- // LOD 1-2: slight curve for visual separation of parallel edges
323
- ctx.moveTo(fromNode.x, fromNode.y);
324
- ctx.lineTo(toNode.x, toNode.y);
327
+ // LOD 1-2: smooth quadratic Bezier curve (T11.4)
328
+ var edgeDx = toNode.x - fromNode.x;
329
+ var edgeDy = toNode.y - fromNode.y;
330
+ var edgeLen = Math.sqrt(edgeDx * edgeDx + edgeDy * edgeDy);
331
+ if (edgeLen < 1) {
332
+ ctx.moveTo(fromNode.x, fromNode.y);
333
+ ctx.lineTo(toNode.x, toNode.y);
334
+ } else {
335
+ // Compute control point: perpendicular offset from midpoint
336
+ var roundness = style.roundness || 0.15;
337
+ var midX = (fromNode.x + toNode.x) / 2;
338
+ var midY = (fromNode.y + toNode.y) / 2;
339
+ var perpX = -edgeDy / edgeLen;
340
+ var perpY = edgeDx / edgeLen;
341
+ var offset = roundness * edgeLen * 0.15;
342
+ cpX = midX + perpX * offset;
343
+ cpY = midY + perpY * offset;
344
+ ctx.moveTo(fromNode.x, fromNode.y);
345
+ ctx.quadraticCurveTo(cpX, cpY, toNode.x, toNode.y);
346
+ }
325
347
  }
326
348
 
327
349
  ctx.stroke();
328
350
 
329
351
  // ── Arrow head (LOD >= 1) ──
330
352
  if (lodLevel >= 1 && style.arrows) {
331
- this._drawArrowHead(ctx, fromNode, toNode, style);
353
+ this._drawArrowHead(ctx, fromNode, toNode, style, cpX, cpY);
332
354
  }
333
355
  }
334
356
 
@@ -336,20 +358,40 @@ RenderPipeline.prototype._drawEdges = function(ctx, lodLevel) {
336
358
  ctx.setLineDash([]);
337
359
  };
338
360
 
339
- RenderPipeline.prototype._drawArrowHead = function(ctx, fromNode, toNode, style) {
361
+ RenderPipeline.prototype._drawArrowHead = function(ctx, fromNode, toNode, style, cpX, cpY) {
340
362
  var scale = this._engine._viewport.getScale();
341
363
  var arrowSize = Math.max(4, 8 / scale);
342
- var dx = toNode.x - fromNode.x;
343
- var dy = toNode.y - fromNode.y;
344
- var len = Math.sqrt(dx * dx + dy * dy);
345
- if (len < 1) return;
346
-
347
- // Arrow at edge of target node
348
364
  var toR = toNode._radius || 10;
349
- var ratio = (len - toR) / len;
350
- var ax = fromNode.x + dx * ratio;
351
- var ay = fromNode.y + dy * ratio;
352
- var angle = Math.atan2(dy, dx);
365
+ var angle;
366
+
367
+ if (cpX != null && cpY != null) {
368
+ // T11.4: Arrow direction along Bezier curve tangent at endpoint
369
+ // For quadratic Bezier B(t) = (1-t)^2*P0 + 2(1-t)t*CP + t^2*P1
370
+ // Tangent at t=1: B'(1) = 2*(P1 - CP)
371
+ var tdx = toNode.x - cpX;
372
+ var tdy = toNode.y - cpY;
373
+ var tlen = Math.sqrt(tdx * tdx + tdy * tdy);
374
+ if (tlen < 0.1) {
375
+ tdx = toNode.x - fromNode.x;
376
+ tdy = toNode.y - fromNode.y;
377
+ tlen = Math.sqrt(tdx * tdx + tdy * tdy);
378
+ }
379
+ if (tlen < 0.1) return;
380
+ angle = Math.atan2(tdy, tdx);
381
+ // Arrow position: step back from toNode by toR along tangent direction
382
+ var ax = toNode.x - (tdx / tlen) * toR;
383
+ var ay = toNode.y - (tdy / tlen) * toR;
384
+ } else {
385
+ // Straight line: use direct vector
386
+ var dx = toNode.x - fromNode.x;
387
+ var dy = toNode.y - fromNode.y;
388
+ var len = Math.sqrt(dx * dx + dy * dy);
389
+ if (len < 1) return;
390
+ angle = Math.atan2(dy, dx);
391
+ var ratio = (len - toR) / len;
392
+ var ax = fromNode.x + dx * ratio;
393
+ var ay = fromNode.y + dy * ratio;
394
+ }
353
395
 
354
396
  ctx.fillStyle = ctx.strokeStyle;
355
397
  ctx.beginPath();
@@ -371,6 +413,7 @@ RenderPipeline.prototype._drawArrowHead = function(ctx, fromNode, toNode, style)
371
413
  RenderPipeline.prototype._drawNodes = function(ctx, lodLevel) {
372
414
  var nodes = this._visibleNodes;
373
415
  var styles = this._engine._styles;
416
+ var enableShadow = (lodLevel >= 2);
374
417
 
375
418
  for (var i = 0; i < nodes.length; i++) {
376
419
  var n = nodes[i];
@@ -378,14 +421,50 @@ RenderPipeline.prototype._drawNodes = function(ctx, lodLevel) {
378
421
  var r = n._radius || style.radius || 10;
379
422
  n._radius = r; // cache for hit-test
380
423
 
381
- // ── Selection / hover glow ──
424
+ // ── Selection / hover glow (T11.3 enhanced) ──
382
425
  if (n._selected || n._hovered) {
383
- ctx.globalAlpha = 0.3;
426
+ var glowR = r * (n._selected ? 1.15 : 1.08);
427
+ var glowPad = (n._selected ? 8 : 5) / this._engine._viewport.getScale();
428
+ // Outer glow
429
+ ctx.globalAlpha = n._selected ? 0.35 : 0.2;
384
430
  ctx.fillStyle = n._selected ? '#6366f1' : '#818cf8';
385
431
  ctx.beginPath();
386
- ctx.arc(n.x, n.y, r + 6 / this._engine._viewport.getScale(), 0, Math.PI * 2);
432
+ ctx.arc(n.x, n.y, glowR + glowPad, 0, Math.PI * 2);
387
433
  ctx.fill();
434
+ // White border ring
435
+ ctx.globalAlpha = n._selected ? 0.9 : 0.6;
436
+ ctx.strokeStyle = '#ffffff';
437
+ ctx.lineWidth = (n._selected ? 2.5 : 1.5) / this._engine._viewport.getScale();
438
+ ctx.beginPath();
439
+ ctx.arc(n.x, n.y, glowR + 1 / this._engine._viewport.getScale(), 0, Math.PI * 2);
440
+ ctx.stroke();
388
441
  ctx.globalAlpha = 1;
442
+ // Apply slight scale to the rendered radius for selected nodes
443
+ if (n._selected) r = glowR;
444
+ }
445
+
446
+ // ── Shadow (LOD >= 2 only) ──
447
+ if (enableShadow) {
448
+ ctx.shadowColor = 'rgba(0,0,0,0.3)';
449
+ ctx.shadowBlur = 5;
450
+ ctx.shadowOffsetX = 0;
451
+ ctx.shadowOffsetY = 2;
452
+ }
453
+
454
+ // ── Compute box dimensions for 'box' shape (text-adaptive) ──
455
+ var shape = style.shape || 'circle';
456
+ if ((shape === 'box' || shape === 'square') && n.label && lodLevel >= 1) {
457
+ var boxFontSize = (style.fontSize || 12) / this._engine._viewport.getScale();
458
+ ctx.font = Math.max(boxFontSize, 2) + 'px -apple-system, sans-serif';
459
+ if (!n._textWidth || n._textWidthScale !== this._engine._viewport.getScale()) {
460
+ var maxChars = lodLevel >= 2 ? 30 : 15;
461
+ var displayLabel = n.label.length > maxChars ? n.label.substring(0, maxChars) + '\u2026' : n.label;
462
+ n._textWidth = ctx.measureText(displayLabel).width;
463
+ n._textWidthScale = this._engine._viewport.getScale();
464
+ }
465
+ var pad = 8 / this._engine._viewport.getScale();
466
+ n._boxW = Math.max(n._textWidth + pad * 2, r * 2);
467
+ n._boxH = boxFontSize + pad * 2;
389
468
  }
390
469
 
391
470
  // ── Node shape ──
@@ -393,14 +472,22 @@ RenderPipeline.prototype._drawNodes = function(ctx, lodLevel) {
393
472
  ctx.strokeStyle = style.borderColor || '#4b5563';
394
473
  ctx.lineWidth = (style.borderWidth || 1) / this._engine._viewport.getScale();
395
474
 
396
- this._drawShape(ctx, n.x, n.y, r, style.shape || 'circle');
475
+ this._drawShape(ctx, n.x, n.y, r, shape, n);
397
476
 
398
477
  ctx.fill();
399
478
  if (lodLevel >= 1) ctx.stroke();
479
+
480
+ // ── Reset shadow ──
481
+ if (enableShadow) {
482
+ ctx.shadowColor = 'transparent';
483
+ ctx.shadowBlur = 0;
484
+ ctx.shadowOffsetX = 0;
485
+ ctx.shadowOffsetY = 0;
486
+ }
400
487
  }
401
488
  };
402
489
 
403
- RenderPipeline.prototype._drawShape = function(ctx, x, y, r, shape) {
490
+ RenderPipeline.prototype._drawShape = function(ctx, x, y, r, shape, node) {
404
491
  ctx.beginPath();
405
492
 
406
493
  switch (shape) {
@@ -416,7 +503,33 @@ RenderPipeline.prototype._drawShape = function(ctx, x, y, r, shape) {
416
503
  break;
417
504
  case 'box':
418
505
  case 'square':
419
- ctx.rect(x - r, y - r * 0.7, r * 2, r * 1.4);
506
+ // Text-adaptive rounded rectangle (T11.2)
507
+ if (node && node._boxW && node._boxH) {
508
+ var bw = node._boxW;
509
+ var bh = node._boxH;
510
+ var br = 4 / this._engine._viewport.getScale(); // border radius
511
+ if (ctx.roundRect) {
512
+ ctx.roundRect(x - bw / 2, y - bh / 2, bw, bh, br);
513
+ } else {
514
+ // Fallback for browsers without roundRect
515
+ var rx = x - bw / 2, ry = y - bh / 2;
516
+ ctx.moveTo(rx + br, ry);
517
+ ctx.lineTo(rx + bw - br, ry);
518
+ ctx.quadraticCurveTo(rx + bw, ry, rx + bw, ry + br);
519
+ ctx.lineTo(rx + bw, ry + bh - br);
520
+ ctx.quadraticCurveTo(rx + bw, ry + bh, rx + bw - br, ry + bh);
521
+ ctx.lineTo(rx + br, ry + bh);
522
+ ctx.quadraticCurveTo(rx, ry + bh, rx, ry + bh - br);
523
+ ctx.lineTo(rx, ry + br);
524
+ ctx.quadraticCurveTo(rx, ry, rx + br, ry);
525
+ ctx.closePath();
526
+ }
527
+ // Update node radius for hit-test (use half of the larger dimension)
528
+ node._radius = Math.max(bw, bh) / 2;
529
+ } else {
530
+ // Fallback: fixed-size box (LOD 0 or no label)
531
+ ctx.rect(x - r, y - r * 0.7, r * 2, r * 1.4);
532
+ }
420
533
  break;
421
534
  case 'triangle':
422
535
  ctx.moveTo(x, y - r);
@@ -471,30 +584,46 @@ RenderPipeline.prototype._drawLabels = function(ctx, lodLevel) {
471
584
  var style = n._style || styles.getNodeStyle(n);
472
585
  var fontSize = (style.fontSize || 12) / scale;
473
586
 
474
- // LOD 1: only show labels for larger nodes
587
+ // LOD 1: only show labels for larger nodes + skip sub-task/document (T11.10)
475
588
  if (lodLevel === 1) {
476
589
  var screenSize = (n._radius || 10) * scale;
477
590
  if (screenSize < 6) continue; // too small on screen
591
+ var nodeType = n.type || '';
592
+ if (nodeType === 'sub-task' || nodeType === 'document') continue;
478
593
  }
479
594
 
480
595
  // Truncate long labels
481
596
  var label = n.label;
482
597
  var maxChars = lodLevel >= 2 ? 30 : 15;
483
- if (label.length > maxChars) label = label.substring(0, maxChars) + '';
598
+ if (label.length > maxChars) label = label.substring(0, maxChars) + '\u2026';
484
599
 
485
600
  ctx.font = Math.max(fontSize, 2) + 'px -apple-system, sans-serif';
486
- ctx.fillStyle = style.fontColor || '#e5e7eb';
487
601
  ctx.textAlign = 'center';
488
602
  ctx.textBaseline = 'middle';
489
603
 
490
604
  var shape = style.shape || 'circle';
491
605
  if (shape === 'box' || shape === 'square') {
492
- // Label inside box
606
+ // Label inside box (text-adaptive box already drawn in _drawNodes)
607
+ ctx.fillStyle = style.fontColor || '#e5e7eb';
493
608
  ctx.fillText(label, n.x, n.y);
494
609
  } else {
495
- // Label below node
610
+ // Label below node with semi-transparent background (T11.5)
496
611
  var r = n._radius || 10;
497
- ctx.fillText(label, n.x, n.y + r + fontSize * 0.8);
612
+ var labelY = n.y + r + fontSize * 0.8;
613
+ var tw = ctx.measureText(label).width;
614
+ var bgPadH = 3 / scale;
615
+ var bgPadV = 2 / scale;
616
+ // Draw background rectangle
617
+ ctx.fillStyle = 'rgba(17, 24, 39, 0.75)';
618
+ ctx.fillRect(
619
+ n.x - tw / 2 - bgPadH,
620
+ labelY - fontSize / 2 - bgPadV,
621
+ tw + bgPadH * 2,
622
+ fontSize + bgPadV * 2
623
+ );
624
+ // Draw label text
625
+ ctx.fillStyle = style.fontColor || '#e5e7eb';
626
+ ctx.fillText(label, n.x, labelY);
498
627
  }
499
628
  }
500
629
  };
@@ -567,11 +696,13 @@ RenderPipeline.prototype._drawStatusPie = function(ctx, cluster) {
567
696
  var breakdown = cluster.statusBreakdown;
568
697
  if (!breakdown) return;
569
698
 
699
+ // 从统一配置读取状态颜色
700
+ var _uniSC = (typeof getUnifiedNodeStyle === 'function') ? getUnifiedNodeStyle().statusGeneric : null;
570
701
  var STATUS_COLORS = {
571
- completed: '#059669',
572
- in_progress: '#7c3aed',
573
- pending: '#4b5563',
574
- cancelled: '#92400e',
702
+ completed: _uniSC ? _uniSC.completed.bg : '#059669',
703
+ in_progress: _uniSC ? _uniSC.in_progress.bg : '#7c3aed',
704
+ pending: _uniSC ? _uniSC.pending.bg : '#4b5563',
705
+ cancelled: _uniSC ? _uniSC.cancelled.bg : '#92400e',
575
706
  };
576
707
 
577
708
  var total = cluster.count;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/renderer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAEH,8CA2pBC;AA3pBD,SAAgB,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAypBR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/renderer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAEH,8CA8xBC;AA9xBD,SAAgB,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4xBR,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,eAAe,IAAI,MAAM,CA2HxC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,eAAe,IAAI,MAAM,CAoJxC"}
@@ -11,127 +11,152 @@
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getStylesScript = getStylesScript;
13
13
  function getStylesScript() {
14
- return `
15
- // ============================================================================
16
- // StyleManager — Node & Edge Styles
17
- // ============================================================================
18
-
19
- function StyleManager() {
20
- // Status colors (same as original vis-network styles)
21
- this.STATUS_COLORS = {
22
- completed: { bg: '#059669', border: '#047857', font: '#d1fae5' },
23
- in_progress: { bg: '#7c3aed', border: '#6d28d9', font: '#ddd6fe' },
24
- pending: { bg: '#4b5563', border: '#374151', font: '#d1d5db' },
25
- cancelled: { bg: '#92400e', border: '#78350f', font: '#fde68a' },
26
- };
27
-
28
- // Node sizing rules by type
29
- this.NODE_SIZE_RULES = {
30
- 'project': { min: 35, max: 65, baseFont: 16, maxFont: 22, scale: 3.5 },
31
- 'module': { min: 20, max: 45, baseFont: 12, maxFont: 16, scale: 2.8 },
32
- 'main-task': { min: 14, max: 38, baseFont: 11, maxFont: 15, scale: 2.2 },
33
- 'sub-task': { min: 7, max: 18, baseFont: 8, maxFont: 11, scale: 1.5 },
34
- 'document': { min: 12, max: 30, baseFont: 9, maxFont: 13, scale: 1.8 },
35
- };
36
-
37
- // Node type shapes
38
- this.NODE_SHAPES = {
39
- 'project': 'star',
40
- 'module': 'diamond',
41
- 'main-task': 'circle',
42
- 'sub-task': 'circle',
43
- 'document': 'box',
44
- };
45
-
46
- // Node type colors (for non-status-based types)
47
- this.NODE_COLORS = {
48
- 'project': { bg: '#f59e0b', border: '#d97706', font: '#fff' },
49
- 'module': { bg: '#059669', border: '#047857', font: '#d1fae5' },
50
- 'document': { bg: '#2563eb', border: '#1d4ed8', font: '#dbeafe' },
51
- };
52
-
53
- // Edge styles by label
54
- this.EDGE_STYLES = {
55
- 'has_main_task': { width: 2, color: '#4b5563', highlightColor: '#93c5fd', dashes: null, arrows: true },
56
- 'has_sub_task': { width: 1, color: '#4b5563', highlightColor: '#818cf8', dashes: null, arrows: true },
57
- 'has_document': { width: 1, color: '#4b5563', highlightColor: '#60a5fa', dashes: [5, 5], arrows: true },
58
- 'module_has_task':{ width: 1.5, color: '#4b5563', highlightColor: '#34d399', dashes: [2, 4], arrows: true },
59
- 'task_has_doc': { width: 1.5, color: '#4b5563', highlightColor: '#f59e0b', dashes: [4, 3], arrows: true },
60
- 'doc_has_child': { width: 1.5, color: '#4b5563', highlightColor: '#c084fc', dashes: [6, 3], arrows: true },
61
- };
62
-
63
- this.EDGE_DEFAULT = { width: 1, color: '#4b5563', highlightColor: '#9ca3af', dashes: null, arrows: false };
64
- }
65
-
66
- /**
67
- * Compute node size and font size based on type and degree.
68
- */
69
- StyleManager.prototype._calcNodeSize = function(type, degree) {
70
- var rule = this.NODE_SIZE_RULES[type] || { min: 10, max: 22, baseFont: 10, maxFont: 13, scale: 1.0 };
71
- var size = rule.min + rule.scale * Math.sqrt(degree || 0);
72
- size = Math.max(rule.min, Math.min(size, rule.max));
73
- var sizeRatio = (size - rule.min) / (rule.max - rule.min || 1);
74
- var fontSize = Math.round(rule.baseFont + sizeRatio * (rule.maxFont - rule.baseFont));
75
- return { size: Math.round(size), fontSize: fontSize };
76
- };
77
-
78
- /**
79
- * Get style for a node.
80
- * @param {Object} node
81
- * @returns {Object} { shape, radius, bgColor, borderColor, borderWidth, fontColor, fontSize }
82
- */
83
- StyleManager.prototype.getNodeStyle = function(node) {
84
- var type = node.type || 'default';
85
- var props = node.properties || {};
86
- var status = props.status || 'pending';
87
- var degree = node.degree || 0;
88
-
89
- var ns = this._calcNodeSize(type, degree);
90
- var shape = this.NODE_SHAPES[type] || 'circle';
91
-
92
- // Determine colors
93
- var colors;
94
- if (type === 'project' || type === 'module' || type === 'document') {
95
- colors = this.NODE_COLORS[type] || this.STATUS_COLORS.pending;
96
- } else {
97
- // main-task and sub-task use status colors
98
- colors = this.STATUS_COLORS[status] || this.STATUS_COLORS.pending;
99
- }
100
-
101
- return {
102
- shape: shape,
103
- radius: ns.size,
104
- bgColor: colors.bg,
105
- borderColor: colors.border,
106
- borderWidth: type === 'project' ? 3 : (type === 'sub-task' ? 1 : 2),
107
- fontColor: colors.font,
108
- fontSize: ns.fontSize,
109
- };
110
- };
111
-
112
- /**
113
- * Get style for an edge.
114
- * @param {Object} edge
115
- * @returns {Object} { width, color, highlightColor, dashes, arrows }
116
- */
117
- StyleManager.prototype.getEdgeStyle = function(edge) {
118
- var label = edge.label || edge._label || '';
119
- return this.EDGE_STYLES[label] || this.EDGE_DEFAULT;
120
- };
121
-
122
- /**
123
- * Apply styles to all nodes and edges (batch).
124
- */
125
- StyleManager.prototype.applyAllStyles = function(nodes, edges) {
126
- for (var i = 0; i < nodes.length; i++) {
127
- var style = this.getNodeStyle(nodes[i]);
128
- nodes[i]._style = style;
129
- nodes[i]._radius = style.radius;
130
- }
131
- for (var i = 0; i < edges.length; i++) {
132
- edges[i]._style = this.getEdgeStyle(edges[i]);
133
- }
134
- };
14
+ return `
15
+ // ============================================================================
16
+ // StyleManager — Node & Edge Styles
17
+ // ============================================================================
18
+
19
+ function StyleManager() {
20
+ // 从统一配置加载颜色 (如果 getUnifiedNodeStyle 可用)
21
+ var _uni = (typeof getUnifiedNodeStyle === 'function') ? getUnifiedNodeStyle() : null;
22
+
23
+ // Status colors
24
+ this.STATUS_COLORS = _uni ? _uni.statusGeneric : {
25
+ completed: { bg: '#059669', border: '#047857', font: '#d1fae5' },
26
+ in_progress: { bg: '#7c3aed', border: '#6d28d9', font: '#ddd6fe' },
27
+ pending: { bg: '#4b5563', border: '#374151', font: '#d1d5db' },
28
+ cancelled: { bg: '#92400e', border: '#78350f', font: '#fde68a' },
29
+ };
30
+
31
+ // 统一样式缓存 (供 getNodeStyle 使用)
32
+ this._uniStyle = _uni;
33
+
34
+ // Node sizing rules by type
35
+ this.NODE_SIZE_RULES = {
36
+ 'project': { min: 35, max: 65, baseFont: 16, maxFont: 22, scale: 3.5 },
37
+ 'module': { min: 20, max: 45, baseFont: 12, maxFont: 16, scale: 2.8 },
38
+ 'main-task': { min: 14, max: 38, baseFont: 11, maxFont: 15, scale: 2.2 },
39
+ 'sub-task': { min: 7, max: 18, baseFont: 8, maxFont: 11, scale: 1.5 },
40
+ 'document': { min: 12, max: 30, baseFont: 9, maxFont: 13, scale: 1.8 },
41
+ 'memory': { min: 6, max: 20, baseFont: 7, maxFont: 11, scale: 1.2 },
42
+ };
43
+
44
+ // Node type shapes
45
+ this.NODE_SHAPES = {
46
+ 'project': 'star',
47
+ 'module': 'diamond',
48
+ 'main-task': 'circle',
49
+ 'sub-task': 'circle',
50
+ 'document': 'box',
51
+ 'memory': 'hexagon',
52
+ };
53
+
54
+ // Node type colors (for non-status-based types) — 从统一配置读取
55
+ this.NODE_COLORS = _uni ? {
56
+ 'project': _uni.project,
57
+ 'module': _uni.module,
58
+ 'document': _uni.document,
59
+ 'memory': _uni.memory,
60
+ } : {
61
+ 'project': { bg: '#f59e0b', border: '#d97706', font: '#fff' },
62
+ 'module': { bg: '#ff6600', border: '#cc5200', font: '#fff3e0' },
63
+ 'document': { bg: '#2563eb', border: '#1d4ed8', font: '#dbeafe' },
64
+ 'memory': { bg: '#e879f9', border: '#a21caf', font: '#fdf4ff' },
65
+ };
66
+
67
+ // Edge styles by label
68
+ this.EDGE_STYLES = {
69
+ 'has_main_task': { width: 2, color: '#4b5563', highlightColor: '#93c5fd', dashes: null, arrows: true },
70
+ 'has_sub_task': { width: 1, color: '#4b5563', highlightColor: '#818cf8', dashes: null, arrows: true },
71
+ 'has_document': { width: 1, color: '#4b5563', highlightColor: '#60a5fa', dashes: [5, 5], arrows: true },
72
+ 'module_has_task':{ width: 1.5, color: '#4b5563', highlightColor: '#ff8533', dashes: [2, 4], arrows: true },
73
+ 'task_has_doc': { width: 1.5, color: '#4b5563', highlightColor: '#f59e0b', dashes: [4, 3], arrows: true },
74
+ 'doc_has_child': { width: 1.5, color: '#4b5563', highlightColor: '#c084fc', dashes: [6, 3], arrows: true },
75
+ 'has_memory': { width: 1, color: '#581c87', highlightColor: '#e879f9', dashes: [3, 3], arrows: true },
76
+ 'memory_relates': { width: 1.5, color: '#86198f', highlightColor: '#f0abfc', dashes: null, arrows: false },
77
+ 'memory_from_task':{ width: 1, color: '#581c87', highlightColor: '#c084fc', dashes: [4, 2], arrows: true },
78
+ 'memory_from_doc':{ width: 1, color: '#581c87', highlightColor: '#a78bfa', dashes: [2, 3], arrows: true },
79
+ 'module_memory': { width: 1, color: '#581c87', highlightColor: '#d946ef', dashes: [3, 2], arrows: true },
80
+ 'memory_supersedes':{ width: 1, color: '#701a75', highlightColor: '#f472b6', dashes: [6, 2], arrows: true },
81
+ };
82
+
83
+ this.EDGE_DEFAULT = { width: 1, color: '#4b5563', highlightColor: '#9ca3af', dashes: null, arrows: false };
84
+ }
85
+
86
+ /**
87
+ * Compute node size and font size based on type and degree.
88
+ */
89
+ StyleManager.prototype._calcNodeSize = function(type, degree) {
90
+ var rule = this.NODE_SIZE_RULES[type] || { min: 10, max: 22, baseFont: 10, maxFont: 13, scale: 1.0 };
91
+ var size = rule.min + rule.scale * Math.sqrt(degree || 0);
92
+ size = Math.max(rule.min, Math.min(size, rule.max));
93
+ var sizeRatio = (size - rule.min) / (rule.max - rule.min || 1);
94
+ var fontSize = Math.round(rule.baseFont + sizeRatio * (rule.maxFont - rule.baseFont));
95
+ return { size: Math.round(size), fontSize: fontSize };
96
+ };
97
+
98
+ /**
99
+ * Get style for a node.
100
+ * @param {Object} node
101
+ * @returns {Object} { shape, radius, bgColor, borderColor, borderWidth, fontColor, fontSize }
102
+ */
103
+ StyleManager.prototype.getNodeStyle = function(node) {
104
+ var type = node.type || 'default';
105
+ var props = node.properties || {};
106
+ var status = props.status || 'pending';
107
+ var degree = node.degree || 0;
108
+
109
+ var ns = this._calcNodeSize(type, degree);
110
+ var shape = this.NODE_SHAPES[type] || 'circle';
111
+
112
+ // Determine colors — 从统一配置读取
113
+ var colors;
114
+ if (type === 'project' || type === 'module' || type === 'document') {
115
+ colors = this.NODE_COLORS[type] || this.STATUS_COLORS.pending;
116
+ } else if (type === 'main-task') {
117
+ // 主任务: 从统一配置读取状态颜色
118
+ var _mt = this._uniStyle ? this._uniStyle.mainTask : null;
119
+ colors = (_mt && _mt[status]) || (_mt && _mt.pending) || this.STATUS_COLORS[status] || this.STATUS_COLORS.pending;
120
+ } else {
121
+ // 子任务: 从统一配置读取状态颜色 (completed=亮绿色)
122
+ var _st = this._uniStyle ? this._uniStyle.subTask : null;
123
+ colors = (_st && _st[status]) || (_st && _st.pending) || this.STATUS_COLORS[status] || this.STATUS_COLORS.pending;
124
+ }
125
+
126
+ return {
127
+ shape: shape,
128
+ radius: ns.size,
129
+ bgColor: colors.bg,
130
+ borderColor: colors.border,
131
+ borderWidth: type === 'project' ? 3 : (type === 'sub-task' ? 1 : 2),
132
+ fontColor: colors.font,
133
+ fontSize: ns.fontSize,
134
+ };
135
+ };
136
+
137
+ /**
138
+ * Get style for an edge.
139
+ * @param {Object} edge
140
+ * @returns {Object} { width, color, highlightColor, dashes, arrows }
141
+ */
142
+ StyleManager.prototype.getEdgeStyle = function(edge) {
143
+ var label = edge.label || edge._label || '';
144
+ return this.EDGE_STYLES[label] || this.EDGE_DEFAULT;
145
+ };
146
+
147
+ /**
148
+ * Apply styles to all nodes and edges (batch).
149
+ */
150
+ StyleManager.prototype.applyAllStyles = function(nodes, edges) {
151
+ for (var i = 0; i < nodes.length; i++) {
152
+ var style = this.getNodeStyle(nodes[i]);
153
+ nodes[i]._style = style;
154
+ nodes[i]._radius = style.radius;
155
+ }
156
+ for (var i = 0; i < edges.length; i++) {
157
+ edges[i]._style = this.getEdgeStyle(edges[i]);
158
+ }
159
+ };
135
160
  `;
136
161
  }
137
162
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,0CA2HC;AA3HD,SAAgB,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,0CAoJC;AApJD,SAAgB,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJR,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,iBAAiB,IAAI,MAAM,CAmW1C"}
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,iBAAiB,IAAI,MAAM,CA6W1C"}
@@ -316,6 +316,16 @@ ViewportManager.prototype._bindEvents = function() {
316
316
  var delta = -e.deltaY;
317
317
  var factor = 1 + delta * self._zoomSpeed;
318
318
  factor = Math.max(0.5, Math.min(factor, 2)); // clamp per-event
319
+
320
+ // T11.8: Flag zooming state to skip edge rendering during rapid zoom
321
+ var engine = self._engine;
322
+ engine._isZooming = true;
323
+ if (engine._zoomTimer) clearTimeout(engine._zoomTimer);
324
+ engine._zoomTimer = setTimeout(function() {
325
+ engine._isZooming = false;
326
+ engine.markDirty(); // Redraw with edges after zoom stops
327
+ }, 150);
328
+
319
329
  self.zoom(factor, x, y);
320
330
  }, { passive: false });
321
331
 
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAEH,8CAmWC;AAnWD,SAAgB,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiWR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAEH,8CA6WC;AA7WD,SAAgB,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2WR,CAAC;AACF,CAAC"}