helixmind 0.2.27 → 0.2.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/brain/template.d.ts.map +1 -1
- package/dist/cli/brain/template.js +150 -66
- package/dist/cli/brain/template.js.map +1 -1
- package/dist/cli/checkpoints/keybinding.d.ts.map +1 -1
- package/dist/cli/checkpoints/keybinding.js +2 -1
- package/dist/cli/checkpoints/keybinding.js.map +1 -1
- package/dist/cli/jarvis/queue.d.ts +41 -0
- package/dist/cli/jarvis/queue.d.ts.map +1 -0
- package/dist/cli/jarvis/queue.js +236 -0
- package/dist/cli/jarvis/queue.js.map +1 -0
- package/dist/cli/jarvis/types.d.ts +38 -0
- package/dist/cli/jarvis/types.d.ts.map +1 -0
- package/dist/cli/jarvis/types.js +2 -0
- package/dist/cli/jarvis/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/cli/brain/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/cli/brain/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAqrE3D"}
|
|
@@ -593,43 +593,63 @@ const EDGE_COLORS = {
|
|
|
593
593
|
belongs_to: '#ff6600', part_of: '#ff6600', supersedes: '#ff4444',
|
|
594
594
|
default: '#334466',
|
|
595
595
|
};
|
|
596
|
-
//
|
|
597
|
-
//
|
|
598
|
-
// Render style per level (size, pulse, activity) but NO spatial separation
|
|
596
|
+
// V7: Clustered Galaxy Brain — Force-directed with level clustering
|
|
597
|
+
// Each level forms an organic morphed blob; blobs barely touch each other
|
|
599
598
|
const LEVEL_STYLE = {
|
|
600
|
-
1: { size:
|
|
601
|
-
2: { size:
|
|
602
|
-
3: { size:
|
|
603
|
-
4: { size:
|
|
604
|
-
5: { size:
|
|
605
|
-
6: { size:
|
|
599
|
+
1: { size: 22, pulse: 2.0, activity: 1.0 },
|
|
600
|
+
2: { size: 20, pulse: 1.5, activity: 0.85 },
|
|
601
|
+
3: { size: 17, pulse: 1.0, activity: 0.7 },
|
|
602
|
+
4: { size: 15, pulse: 0.6, activity: 0.5 },
|
|
603
|
+
5: { size: 13, pulse: 0.3, activity: 0.3 },
|
|
604
|
+
6: { size: 18, pulse: 0.8, activity: 0.7 },
|
|
606
605
|
};
|
|
607
606
|
const MAX_RENDERED_EDGES = 12000; // more edges visible in galaxy layout
|
|
608
607
|
|
|
609
|
-
//
|
|
608
|
+
// Clustered force-directed layout: each level forms an organic blob
|
|
609
|
+
// Blobs are pushed apart so they barely touch — morphed spheres
|
|
610
610
|
function computeForceLayout(nodeList, edgeList, nodeIdxMapLocal) {
|
|
611
611
|
const N = nodeList.length;
|
|
612
612
|
if (N === 0) return [];
|
|
613
613
|
|
|
614
|
+
// Group nodes by level
|
|
615
|
+
const levelGroups = {};
|
|
616
|
+
for (let i = 0; i < N; i++) {
|
|
617
|
+
const lv = nodeList[i].level || 3;
|
|
618
|
+
if (!levelGroups[lv]) levelGroups[lv] = [];
|
|
619
|
+
levelGroups[lv].push(i);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Assign each level a seed centroid direction (icosahedron-like placement)
|
|
623
|
+
const levels = Object.keys(levelGroups).map(Number).sort();
|
|
624
|
+
const seedCentroids = {};
|
|
625
|
+
const CLUSTER_SPREAD = 320;
|
|
626
|
+
// Evenly space level centroids on a sphere
|
|
627
|
+
for (let li = 0; li < levels.length; li++) {
|
|
628
|
+
const lv = levels[li];
|
|
629
|
+
const golden = 2.399963;
|
|
630
|
+
const theta = golden * li * 2.5; // multiplied for wider spread
|
|
631
|
+
const phi = Math.acos(1 - 2 * (li + 0.5) / Math.max(levels.length, 2));
|
|
632
|
+
seedCentroids[lv] = {
|
|
633
|
+
x: CLUSTER_SPREAD * Math.sin(phi) * Math.cos(theta),
|
|
634
|
+
y: CLUSTER_SPREAD * Math.cos(phi),
|
|
635
|
+
z: CLUSTER_SPREAD * Math.sin(phi) * Math.sin(theta)
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
|
|
614
639
|
const pos = new Array(N);
|
|
615
|
-
// Initialize
|
|
640
|
+
// Initialize nodes near their level's seed centroid
|
|
616
641
|
for (let i = 0; i < N; i++) {
|
|
617
642
|
const lv = nodeList[i].level || 3;
|
|
618
|
-
|
|
619
|
-
const
|
|
620
|
-
const R = 200 * shell;
|
|
621
|
-
// Golden angle spiral for even distribution
|
|
622
|
-
const golden = 2.399963; // Math.PI * (3 - Math.sqrt(5))
|
|
623
|
-
const theta = golden * i;
|
|
624
|
-
const phi = Math.acos(1 - 2 * (i + 0.5) / N);
|
|
643
|
+
const c = seedCentroids[lv] || { x: 0, y: 0, z: 0 };
|
|
644
|
+
const INIT_SPREAD = 100;
|
|
625
645
|
pos[i] = {
|
|
626
|
-
x:
|
|
627
|
-
y:
|
|
628
|
-
z:
|
|
646
|
+
x: c.x + (srand(i * 7) - 0.5) * INIT_SPREAD,
|
|
647
|
+
y: c.y + (srand(i * 13) - 0.5) * INIT_SPREAD,
|
|
648
|
+
z: c.z + (srand(i * 19) - 0.5) * INIT_SPREAD
|
|
629
649
|
};
|
|
630
650
|
}
|
|
631
651
|
|
|
632
|
-
// Build adjacency
|
|
652
|
+
// Build adjacency
|
|
633
653
|
const adjList = new Array(N);
|
|
634
654
|
for (let i = 0; i < N; i++) adjList[i] = [];
|
|
635
655
|
for (const e of edgeList) {
|
|
@@ -641,25 +661,40 @@ function computeForceLayout(nodeList, edgeList, nodeIdxMapLocal) {
|
|
|
641
661
|
}
|
|
642
662
|
}
|
|
643
663
|
|
|
644
|
-
|
|
645
|
-
const
|
|
646
|
-
const
|
|
647
|
-
const
|
|
648
|
-
const
|
|
649
|
-
const
|
|
650
|
-
const
|
|
664
|
+
const ITERATIONS = 60;
|
|
665
|
+
const REPULSION = 5000;
|
|
666
|
+
const ATTRACTION = 0.012;
|
|
667
|
+
const CLUSTER_PULL = 0.02; // pull nodes toward their own level centroid
|
|
668
|
+
const INTER_REPEL = 18000; // push different-level centroids apart
|
|
669
|
+
const CENTERING = 0.0005;
|
|
670
|
+
const DAMPING = 0.82;
|
|
671
|
+
const K_SAMPLES = Math.min(N, 25);
|
|
651
672
|
|
|
652
673
|
const vel = new Array(N);
|
|
653
674
|
for (let i = 0; i < N; i++) vel[i] = { x: 0, y: 0, z: 0 };
|
|
654
675
|
|
|
655
676
|
for (let iter = 0; iter < ITERATIONS; iter++) {
|
|
656
|
-
const temp = 1.0 - iter / ITERATIONS;
|
|
677
|
+
const temp = 1.0 - iter / ITERATIONS;
|
|
657
678
|
const repScale = REPULSION * temp;
|
|
658
679
|
|
|
680
|
+
// Compute dynamic level centroids
|
|
681
|
+
const dynC = {};
|
|
682
|
+
const dynN = {};
|
|
683
|
+
for (let i = 0; i < N; i++) {
|
|
684
|
+
const lv = nodeList[i].level || 3;
|
|
685
|
+
if (!dynC[lv]) { dynC[lv] = { x: 0, y: 0, z: 0 }; dynN[lv] = 0; }
|
|
686
|
+
dynC[lv].x += pos[i].x; dynC[lv].y += pos[i].y; dynC[lv].z += pos[i].z;
|
|
687
|
+
dynN[lv]++;
|
|
688
|
+
}
|
|
689
|
+
for (const lv in dynC) {
|
|
690
|
+
dynC[lv].x /= dynN[lv]; dynC[lv].y /= dynN[lv]; dynC[lv].z /= dynN[lv];
|
|
691
|
+
}
|
|
692
|
+
|
|
659
693
|
for (let i = 0; i < N; i++) {
|
|
660
694
|
let fx = 0, fy = 0, fz = 0;
|
|
695
|
+
const myLevel = nodeList[i].level || 3;
|
|
661
696
|
|
|
662
|
-
//
|
|
697
|
+
// Node-node repulsion (sampled)
|
|
663
698
|
for (let k = 0; k < K_SAMPLES; k++) {
|
|
664
699
|
const j = Math.floor(srand(iter * 10007 + i * 997 + k * 31) * N);
|
|
665
700
|
if (j === i) continue;
|
|
@@ -667,29 +702,48 @@ function computeForceLayout(nodeList, edgeList, nodeIdxMapLocal) {
|
|
|
667
702
|
const dy = pos[i].y - pos[j].y;
|
|
668
703
|
const dz = pos[i].z - pos[j].z;
|
|
669
704
|
const distSq = dx * dx + dy * dy + dz * dz + 1;
|
|
670
|
-
|
|
705
|
+
// Stronger repulsion between different levels
|
|
706
|
+
const crossMult = (nodeList[j].level || 3) !== myLevel ? 2.5 : 1.0;
|
|
707
|
+
const f = repScale * crossMult / distSq;
|
|
671
708
|
const dist = Math.sqrt(distSq);
|
|
672
|
-
fx += (dx / dist) * f;
|
|
673
|
-
fy += (dy / dist) * f;
|
|
674
|
-
fz += (dz / dist) * f;
|
|
709
|
+
fx += (dx / dist) * f; fy += (dy / dist) * f; fz += (dz / dist) * f;
|
|
675
710
|
}
|
|
676
|
-
// Scale repulsion by N/K_SAMPLES for unbiased estimate
|
|
677
711
|
const repBias = N / K_SAMPLES;
|
|
678
712
|
fx *= repBias; fy *= repBias; fz *= repBias;
|
|
679
713
|
|
|
680
|
-
// Attraction: pull toward connected nodes
|
|
714
|
+
// Attraction: pull toward connected nodes (stronger for same level)
|
|
681
715
|
for (const j of adjList[i]) {
|
|
682
716
|
const dx = pos[j].x - pos[i].x;
|
|
683
717
|
const dy = pos[j].y - pos[i].y;
|
|
684
718
|
const dz = pos[j].z - pos[i].z;
|
|
685
719
|
const dist = Math.sqrt(dx * dx + dy * dy + dz * dz + 1);
|
|
686
|
-
const
|
|
687
|
-
|
|
688
|
-
fy += (dy / dist) * f;
|
|
689
|
-
|
|
720
|
+
const sameLvl = (nodeList[j].level || 3) === myLevel ? 2.5 : 0.3;
|
|
721
|
+
const f = ATTRACTION * dist * sameLvl;
|
|
722
|
+
fx += (dx / dist) * f; fy += (dy / dist) * f; fz += (dz / dist) * f;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// Cluster cohesion: pull toward own level centroid
|
|
726
|
+
const mc = dynC[myLevel];
|
|
727
|
+
if (mc) {
|
|
728
|
+
fx += (mc.x - pos[i].x) * CLUSTER_PULL * temp;
|
|
729
|
+
fy += (mc.y - pos[i].y) * CLUSTER_PULL * temp;
|
|
730
|
+
fz += (mc.z - pos[i].z) * CLUSTER_PULL * temp;
|
|
690
731
|
}
|
|
691
732
|
|
|
692
|
-
//
|
|
733
|
+
// Inter-cluster repulsion: push away from OTHER level centroids
|
|
734
|
+
for (const lv in dynC) {
|
|
735
|
+
if (parseInt(lv) === myLevel) continue;
|
|
736
|
+
const oc = dynC[lv];
|
|
737
|
+
const dx = pos[i].x - oc.x;
|
|
738
|
+
const dy = pos[i].y - oc.y;
|
|
739
|
+
const dz = pos[i].z - oc.z;
|
|
740
|
+
const distSq = dx * dx + dy * dy + dz * dz + 1;
|
|
741
|
+
const f = INTER_REPEL * temp / distSq;
|
|
742
|
+
const dist = Math.sqrt(distSq);
|
|
743
|
+
fx += (dx / dist) * f; fy += (dy / dist) * f; fz += (dz / dist) * f;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
// Light centering
|
|
693
747
|
fx -= pos[i].x * CENTERING;
|
|
694
748
|
fy -= pos[i].y * CENTERING;
|
|
695
749
|
fz -= pos[i].z * CENTERING;
|
|
@@ -698,7 +752,6 @@ function computeForceLayout(nodeList, edgeList, nodeIdxMapLocal) {
|
|
|
698
752
|
vel[i].y = (vel[i].y + fy) * DAMPING;
|
|
699
753
|
vel[i].z = (vel[i].z + fz) * DAMPING;
|
|
700
754
|
|
|
701
|
-
// Cap velocity
|
|
702
755
|
const maxV = 30 * temp + 2;
|
|
703
756
|
const vLen = Math.sqrt(vel[i].x * vel[i].x + vel[i].y * vel[i].y + vel[i].z * vel[i].z);
|
|
704
757
|
if (vLen > maxV) {
|
|
@@ -708,7 +761,6 @@ function computeForceLayout(nodeList, edgeList, nodeIdxMapLocal) {
|
|
|
708
761
|
}
|
|
709
762
|
}
|
|
710
763
|
|
|
711
|
-
// Apply velocities
|
|
712
764
|
for (let i = 0; i < N; i++) {
|
|
713
765
|
pos[i].x += vel[i].x;
|
|
714
766
|
pos[i].y += vel[i].y;
|
|
@@ -716,13 +768,13 @@ function computeForceLayout(nodeList, edgeList, nodeIdxMapLocal) {
|
|
|
716
768
|
}
|
|
717
769
|
}
|
|
718
770
|
|
|
719
|
-
// Scale to fit
|
|
771
|
+
// Scale to fit (target radius ~650 for spacious clusters)
|
|
720
772
|
let maxDist = 0;
|
|
721
773
|
for (let i = 0; i < N; i++) {
|
|
722
774
|
const d = Math.sqrt(pos[i].x * pos[i].x + pos[i].y * pos[i].y + pos[i].z * pos[i].z);
|
|
723
775
|
if (d > maxDist) maxDist = d;
|
|
724
776
|
}
|
|
725
|
-
const scale = maxDist > 0 ?
|
|
777
|
+
const scale = maxDist > 0 ? 650 / maxDist : 1;
|
|
726
778
|
for (let i = 0; i < N; i++) {
|
|
727
779
|
pos[i].x *= scale;
|
|
728
780
|
pos[i].y *= scale;
|
|
@@ -743,10 +795,10 @@ document.body.prepend(renderer.domElement);
|
|
|
743
795
|
|
|
744
796
|
const scene = new THREE.Scene();
|
|
745
797
|
scene.background = new THREE.Color('#030308');
|
|
746
|
-
scene.fog = new THREE.FogExp2('#030308', 0.
|
|
798
|
+
scene.fog = new THREE.FogExp2('#030308', 0.00018);
|
|
747
799
|
|
|
748
800
|
const camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 12000);
|
|
749
|
-
camera.position.set(
|
|
801
|
+
camera.position.set(900, 500, 900);
|
|
750
802
|
|
|
751
803
|
const controls = new OrbitControls(camera, renderer.domElement);
|
|
752
804
|
controls.target.set(0, 0, 0);
|
|
@@ -816,13 +868,13 @@ const nodeMat = new THREE.ShaderMaterial({
|
|
|
816
868
|
vec2 c = gl_PointCoord - vec2(.5);
|
|
817
869
|
float d = length(c);
|
|
818
870
|
if(d > .5) discard;
|
|
819
|
-
|
|
820
|
-
float core = exp(-d*d*
|
|
821
|
-
float
|
|
822
|
-
float
|
|
823
|
-
float
|
|
824
|
-
|
|
825
|
-
gl_FragColor = vec4(vColor * (
|
|
871
|
+
// Sharp saturated core with minimal glow — preserves level color
|
|
872
|
+
float core = exp(-d*d*180.0) * 0.95;
|
|
873
|
+
float halo = exp(-d*d*22.0) * 0.25;
|
|
874
|
+
float outer = exp(-d*d*6.0) * 0.06;
|
|
875
|
+
float intensity = core + halo + outer;
|
|
876
|
+
// Keep color saturated — minimal brightness boost on core
|
|
877
|
+
gl_FragColor = vec4(vColor * (0.85 + core * 0.15), intensity * vAlpha);
|
|
826
878
|
}
|
|
827
879
|
\`,
|
|
828
880
|
transparent: true, depthWrite: false, blending: THREE.AdditiveBlending,
|
|
@@ -924,6 +976,33 @@ function rebuildScene() {
|
|
|
924
976
|
nodeEdgeMap[ti].push(ei);
|
|
925
977
|
});
|
|
926
978
|
|
|
979
|
+
// ---- NODE COLOR: blend level + dominant edge type ----
|
|
980
|
+
// Pre-compute dominant edge type per node
|
|
981
|
+
const nodeEdgeTypeCounts = {};
|
|
982
|
+
for (const e of BRAIN_DATA.edges) {
|
|
983
|
+
const si = nodeIdxMap[e.source], ti = nodeIdxMap[e.target];
|
|
984
|
+
if (si === undefined || ti === undefined) continue;
|
|
985
|
+
const type = e.type || 'related_to';
|
|
986
|
+
if (!nodeEdgeTypeCounts[si]) nodeEdgeTypeCounts[si] = {};
|
|
987
|
+
if (!nodeEdgeTypeCounts[ti]) nodeEdgeTypeCounts[ti] = {};
|
|
988
|
+
nodeEdgeTypeCounts[si][type] = (nodeEdgeTypeCounts[si][type] || 0) + 1;
|
|
989
|
+
nodeEdgeTypeCounts[ti][type] = (nodeEdgeTypeCounts[ti][type] || 0) + 1;
|
|
990
|
+
}
|
|
991
|
+
const nodeDomType = {};
|
|
992
|
+
for (const idx in nodeEdgeTypeCounts) {
|
|
993
|
+
let maxT = 'default', maxC = 0;
|
|
994
|
+
for (const [t, c] of Object.entries(nodeEdgeTypeCounts[idx])) {
|
|
995
|
+
if (c > maxC) { maxC = c; maxT = t; }
|
|
996
|
+
}
|
|
997
|
+
nodeDomType[idx] = maxT;
|
|
998
|
+
}
|
|
999
|
+
// Max degree for brightness scaling
|
|
1000
|
+
let maxDegree = 1;
|
|
1001
|
+
for (let i = 0; i < nCount; i++) {
|
|
1002
|
+
const deg = adj[i] ? adj[i].size : 0;
|
|
1003
|
+
if (deg > maxDegree) maxDegree = deg;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
927
1006
|
// ---- NODE POINTS ----
|
|
928
1007
|
nodeGeo = new THREE.BufferGeometry();
|
|
929
1008
|
const nPos = new Float32Array(nCount * 3);
|
|
@@ -932,13 +1011,23 @@ function rebuildScene() {
|
|
|
932
1011
|
const nHighlight = new Float32Array(nCount);
|
|
933
1012
|
const nPulse = new Float32Array(nCount);
|
|
934
1013
|
const nActivity = new Float32Array(nCount);
|
|
1014
|
+
const ec = new THREE.Color();
|
|
935
1015
|
|
|
936
1016
|
for (let i = 0; i < nCount; i++) {
|
|
937
1017
|
const p = positions[i];
|
|
938
1018
|
const n = nodes[i];
|
|
939
1019
|
const s = LEVEL_STYLE[n.level] || LEVEL_STYLE[3];
|
|
940
1020
|
nPos[i * 3] = p.x; nPos[i * 3 + 1] = p.y; nPos[i * 3 + 2] = p.z;
|
|
1021
|
+
// Base level color
|
|
941
1022
|
tc.set(LEVEL_COLORS_HEX[n.level] || 0x00FFFF);
|
|
1023
|
+
// Blend with dominant edge type color (35% influence) for color variety
|
|
1024
|
+
const domType = nodeDomType[i] || 'default';
|
|
1025
|
+
ec.set(EDGE_COLORS[domType] || EDGE_COLORS.default);
|
|
1026
|
+
tc.lerp(ec, 0.35);
|
|
1027
|
+
// Brightness by degree: low-degree dimmer, high-degree brighter
|
|
1028
|
+
const deg = adj[i] ? adj[i].size : 0;
|
|
1029
|
+
const bright = 0.6 + (deg / maxDegree) * 0.4;
|
|
1030
|
+
tc.multiplyScalar(bright);
|
|
942
1031
|
nCol[i * 3] = tc.r; nCol[i * 3 + 1] = tc.g; nCol[i * 3 + 2] = tc.b;
|
|
943
1032
|
nSize[i] = s.size;
|
|
944
1033
|
nHighlight[i] = 1.0;
|
|
@@ -955,20 +1044,15 @@ function rebuildScene() {
|
|
|
955
1044
|
scene.add(nodePoints);
|
|
956
1045
|
|
|
957
1046
|
// ---- EDGES (LineSegments) ----
|
|
958
|
-
// Prioritize cross-level edges (vertical) over intra-level (horizontal)
|
|
959
1047
|
const allEdges = [];
|
|
960
1048
|
BRAIN_DATA.edges.forEach((e, i) => {
|
|
961
1049
|
const si = nodeIdxMap[e.source], ti = nodeIdxMap[e.target];
|
|
962
1050
|
if (si !== undefined && ti !== undefined) {
|
|
963
|
-
|
|
964
|
-
allEdges.push({ si, ti, weight: e.weight, type: e.type, idx: i, crossLevel });
|
|
1051
|
+
allEdges.push({ si, ti, weight: e.weight, type: e.type, idx: i });
|
|
965
1052
|
}
|
|
966
1053
|
});
|
|
967
|
-
// Sort
|
|
968
|
-
allEdges.sort((a, b) =>
|
|
969
|
-
if (a.crossLevel !== b.crossLevel) return b.crossLevel ? 1 : -1;
|
|
970
|
-
return b.weight - a.weight; // then by weight
|
|
971
|
-
});
|
|
1054
|
+
// Sort by weight (strongest connections first)
|
|
1055
|
+
allEdges.sort((a, b) => b.weight - a.weight);
|
|
972
1056
|
validEdges = allEdges.slice(0, MAX_RENDERED_EDGES);
|
|
973
1057
|
|
|
974
1058
|
eCount = validEdges.length;
|
|
@@ -981,7 +1065,7 @@ function rebuildScene() {
|
|
|
981
1065
|
const alphaScale = Math.min(1.0, 3000 / eCount);
|
|
982
1066
|
|
|
983
1067
|
for (let i = 0; i < eCount; i++) {
|
|
984
|
-
const { si, ti, weight, type
|
|
1068
|
+
const { si, ti, weight, type } = validEdges[i];
|
|
985
1069
|
const s = positions[si], t = positions[ti];
|
|
986
1070
|
const o = i * 6;
|
|
987
1071
|
ePos[o] = s.x; ePos[o + 1] = s.y; ePos[o + 2] = s.z;
|
|
@@ -991,8 +1075,8 @@ function rebuildScene() {
|
|
|
991
1075
|
sc.set(edgeColor); dc.set(edgeColor);
|
|
992
1076
|
eCol[o] = sc.r; eCol[o + 1] = sc.g; eCol[o + 2] = sc.b;
|
|
993
1077
|
eCol[o + 3] = dc.r; eCol[o + 4] = dc.g; eCol[o + 5] = dc.b;
|
|
994
|
-
//
|
|
995
|
-
const baseAlpha = 0.
|
|
1078
|
+
// Boosted edge alpha for colorful connections
|
|
1079
|
+
const baseAlpha = 0.12 + weight * 0.28;
|
|
996
1080
|
eAlpha[i * 2] = baseAlpha * alphaScale;
|
|
997
1081
|
eAlpha[i * 2 + 1] = baseAlpha * alphaScale;
|
|
998
1082
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/cli/brain/template.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEtC,OAAO;;;;;;0CAMiC,IAAI,CAAC,IAAI,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCA2ZxB,IAAI,CAAC,IAAI,CAAC,UAAU,iBAAiB,IAAI,CAAC,IAAI,CAAC,UAAU,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;;wCAE3L,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;uCACpD,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAkKvE,QAAQ
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/cli/brain/template.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEtC,OAAO;;;;;;0CAMiC,IAAI,CAAC,IAAI,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCA2ZxB,IAAI,CAAC,IAAI,CAAC,UAAU,iBAAiB,IAAI,CAAC,IAAI,CAAC,UAAU,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;;wCAE3L,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;uCACpD,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAkKvE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAoiCL,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAukBvE,CAAC;AACT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keybinding.d.ts","sourceRoot":"","sources":["../../../src/cli/checkpoints/keybinding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjG,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CAMvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACzD,KAAK,EAAE,eAAe,GACrB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"keybinding.d.ts","sourceRoot":"","sources":["../../../src/cli/checkpoints/keybinding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjG,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CAMvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACzD,KAAK,EAAE,eAAe,GACrB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2BvC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
export function createKeybindingState() {
|
|
5
5
|
return {
|
|
6
6
|
lastEscTime: 0,
|
|
7
|
-
doubleEscThreshold:
|
|
7
|
+
doubleEscThreshold: 500,
|
|
8
8
|
inBrowser: false,
|
|
9
9
|
};
|
|
10
10
|
}
|
|
@@ -38,6 +38,7 @@ export function processKeypress(key, state) {
|
|
|
38
38
|
state.lastEscTime = now;
|
|
39
39
|
return { action: 'ignore' };
|
|
40
40
|
}
|
|
41
|
+
state.lastEscTime = 0;
|
|
41
42
|
return { action: 'ignore' };
|
|
42
43
|
}
|
|
43
44
|
//# sourceMappingURL=keybinding.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keybinding.js","sourceRoot":"","sources":["../../../src/cli/checkpoints/keybinding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,WAAW,EAAE,CAAC;QACd,kBAAkB,EAAE,GAAG;QACvB,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAyD,EACzD,KAAsB;IAEtB,0CAA0C;IAC1C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACtD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACvD,kCAAkC;QAClC,IAAI,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAC;YACvD,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;YACtB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"keybinding.js","sourceRoot":"","sources":["../../../src/cli/checkpoints/keybinding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,WAAW,EAAE,CAAC;QACd,kBAAkB,EAAE,GAAG;QACvB,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAyD,EACzD,KAAsB;IAEtB,0CAA0C;IAC1C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACtD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACvD,kCAAkC;QAClC,IAAI,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAC;YACvD,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;YACtB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { JarvisTask, JarvisTaskStatus, JarvisTaskPriority, JarvisDaemonState, JarvisStatusInfo } from './types.js';
|
|
2
|
+
export declare class JarvisQueue {
|
|
3
|
+
private data;
|
|
4
|
+
private filePath;
|
|
5
|
+
private onChange?;
|
|
6
|
+
private daemonStartTime;
|
|
7
|
+
constructor(projectRoot: string, onChange?: (event: string, task: JarvisTask) => void);
|
|
8
|
+
private load;
|
|
9
|
+
private save;
|
|
10
|
+
addTask(title: string, description: string, opts?: {
|
|
11
|
+
priority?: JarvisTaskPriority;
|
|
12
|
+
dependencies?: number[];
|
|
13
|
+
tags?: string[];
|
|
14
|
+
maxRetries?: number;
|
|
15
|
+
}): JarvisTask;
|
|
16
|
+
getTask(id: number): JarvisTask | undefined;
|
|
17
|
+
updateTask(id: number, updates: Partial<Pick<JarvisTask, 'status' | 'priority' | 'title' | 'description' | 'result' | 'error' | 'startedAt' | 'completedAt' | 'retries' | 'sessionId' | 'tags'>>): JarvisTask | undefined;
|
|
18
|
+
removeTask(id: number): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the next task to execute: highest priority pending task
|
|
21
|
+
* whose dependencies (if any) are all completed.
|
|
22
|
+
*/
|
|
23
|
+
getNextTask(): JarvisTask | undefined;
|
|
24
|
+
getByStatus(status: JarvisTaskStatus): JarvisTask[];
|
|
25
|
+
getAllTasks(): JarvisTask[];
|
|
26
|
+
clearCompleted(): number;
|
|
27
|
+
get count(): number;
|
|
28
|
+
get pendingCount(): number;
|
|
29
|
+
getDaemonState(): JarvisDaemonState;
|
|
30
|
+
setDaemonState(state: JarvisDaemonState): void;
|
|
31
|
+
getStatus(): JarvisStatusInfo;
|
|
32
|
+
/**
|
|
33
|
+
* Build a summary string for injection into the system prompt.
|
|
34
|
+
*/
|
|
35
|
+
getSummaryForPrompt(): string | null;
|
|
36
|
+
/** Short status line for the status bar */
|
|
37
|
+
getStatusLine(): string;
|
|
38
|
+
/** Set or replace the onChange callback */
|
|
39
|
+
setOnChange(handler: (event: string, task: JarvisTask) => void): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/queue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAmB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMzI,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,CAA4C;IAC7D,OAAO,CAAC,eAAe,CAAuB;gBAElC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI;IAiBrF,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QACjD,QAAQ,CAAC,EAAE,kBAAkB,CAAC;QAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,UAAU;IAoBd,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EACrD,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,GACpE,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAC/D,CAAC,GAAG,UAAU,GAAG,SAAS;IAsB3B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ/B;;;OAGG;IACH,WAAW,IAAI,UAAU,GAAG,SAAS;IAqBrC,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,EAAE;IAInD,WAAW,IAAI,UAAU,EAAE;IAI3B,cAAc,IAAI,MAAM;IAQxB,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAID,cAAc,IAAI,iBAAiB;IAInC,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAW9C,SAAS,IAAI,gBAAgB;IAa7B;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAoCpC,2CAA2C;IAC3C,aAAa,IAAI,MAAM;IAgBvB,2CAA2C;IAC3C,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;CAGtE"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
const EMPTY_DATA = { version: 1, nextId: 1, tasks: [], daemonState: 'stopped' };
|
|
4
|
+
const PRIORITY_ORDER = { high: 0, medium: 1, low: 2 };
|
|
5
|
+
export class JarvisQueue {
|
|
6
|
+
data;
|
|
7
|
+
filePath;
|
|
8
|
+
onChange;
|
|
9
|
+
daemonStartTime = null;
|
|
10
|
+
constructor(projectRoot, onChange) {
|
|
11
|
+
this.filePath = join(projectRoot, '.helixmind', 'jarvis', 'tasks.json');
|
|
12
|
+
this.onChange = onChange;
|
|
13
|
+
this.data = this.load();
|
|
14
|
+
// Crash recovery: reset any stale 'running' tasks back to 'pending'
|
|
15
|
+
for (const task of this.data.tasks) {
|
|
16
|
+
if (task.status === 'running') {
|
|
17
|
+
task.status = 'pending';
|
|
18
|
+
task.updatedAt = Date.now();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (this.data.tasks.some(t => t.status === 'pending')) {
|
|
22
|
+
this.save();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
load() {
|
|
26
|
+
try {
|
|
27
|
+
if (existsSync(this.filePath)) {
|
|
28
|
+
const raw = readFileSync(this.filePath, 'utf-8');
|
|
29
|
+
const parsed = JSON.parse(raw);
|
|
30
|
+
if (parsed.version === 1 && Array.isArray(parsed.tasks)) {
|
|
31
|
+
return parsed;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Corrupted file — start fresh
|
|
37
|
+
}
|
|
38
|
+
return { ...EMPTY_DATA, tasks: [] };
|
|
39
|
+
}
|
|
40
|
+
save() {
|
|
41
|
+
const dir = dirname(this.filePath);
|
|
42
|
+
if (!existsSync(dir)) {
|
|
43
|
+
mkdirSync(dir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
writeFileSync(this.filePath, JSON.stringify(this.data, null, 2), 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
addTask(title, description, opts) {
|
|
48
|
+
const task = {
|
|
49
|
+
id: this.data.nextId++,
|
|
50
|
+
title,
|
|
51
|
+
description,
|
|
52
|
+
status: 'pending',
|
|
53
|
+
priority: opts?.priority ?? 'medium',
|
|
54
|
+
createdAt: Date.now(),
|
|
55
|
+
updatedAt: Date.now(),
|
|
56
|
+
retries: 0,
|
|
57
|
+
maxRetries: opts?.maxRetries ?? 3,
|
|
58
|
+
dependencies: opts?.dependencies,
|
|
59
|
+
tags: opts?.tags,
|
|
60
|
+
};
|
|
61
|
+
this.data.tasks.push(task);
|
|
62
|
+
this.save();
|
|
63
|
+
this.onChange?.('task_created', task);
|
|
64
|
+
return task;
|
|
65
|
+
}
|
|
66
|
+
getTask(id) {
|
|
67
|
+
return this.data.tasks.find(t => t.id === id);
|
|
68
|
+
}
|
|
69
|
+
updateTask(id, updates) {
|
|
70
|
+
const task = this.data.tasks.find(t => t.id === id);
|
|
71
|
+
if (!task)
|
|
72
|
+
return undefined;
|
|
73
|
+
if (updates.status !== undefined)
|
|
74
|
+
task.status = updates.status;
|
|
75
|
+
if (updates.priority !== undefined)
|
|
76
|
+
task.priority = updates.priority;
|
|
77
|
+
if (updates.title !== undefined)
|
|
78
|
+
task.title = updates.title;
|
|
79
|
+
if (updates.description !== undefined)
|
|
80
|
+
task.description = updates.description;
|
|
81
|
+
if (updates.result !== undefined)
|
|
82
|
+
task.result = updates.result;
|
|
83
|
+
if (updates.error !== undefined)
|
|
84
|
+
task.error = updates.error;
|
|
85
|
+
if (updates.startedAt !== undefined)
|
|
86
|
+
task.startedAt = updates.startedAt;
|
|
87
|
+
if (updates.completedAt !== undefined)
|
|
88
|
+
task.completedAt = updates.completedAt;
|
|
89
|
+
if (updates.retries !== undefined)
|
|
90
|
+
task.retries = updates.retries;
|
|
91
|
+
if (updates.sessionId !== undefined)
|
|
92
|
+
task.sessionId = updates.sessionId;
|
|
93
|
+
if (updates.tags !== undefined)
|
|
94
|
+
task.tags = updates.tags;
|
|
95
|
+
task.updatedAt = Date.now();
|
|
96
|
+
this.save();
|
|
97
|
+
this.onChange?.('task_updated', task);
|
|
98
|
+
return task;
|
|
99
|
+
}
|
|
100
|
+
removeTask(id) {
|
|
101
|
+
const idx = this.data.tasks.findIndex(t => t.id === id);
|
|
102
|
+
if (idx === -1)
|
|
103
|
+
return false;
|
|
104
|
+
this.data.tasks.splice(idx, 1);
|
|
105
|
+
this.save();
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Returns the next task to execute: highest priority pending task
|
|
110
|
+
* whose dependencies (if any) are all completed.
|
|
111
|
+
*/
|
|
112
|
+
getNextTask() {
|
|
113
|
+
const pending = this.data.tasks
|
|
114
|
+
.filter(t => t.status === 'pending')
|
|
115
|
+
.filter(t => {
|
|
116
|
+
if (!t.dependencies || t.dependencies.length === 0)
|
|
117
|
+
return true;
|
|
118
|
+
return t.dependencies.every(depId => {
|
|
119
|
+
const dep = this.data.tasks.find(d => d.id === depId);
|
|
120
|
+
return dep?.status === 'completed';
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
pending.sort((a, b) => {
|
|
124
|
+
if (PRIORITY_ORDER[a.priority] !== PRIORITY_ORDER[b.priority]) {
|
|
125
|
+
return PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority];
|
|
126
|
+
}
|
|
127
|
+
return a.createdAt - b.createdAt;
|
|
128
|
+
});
|
|
129
|
+
return pending[0];
|
|
130
|
+
}
|
|
131
|
+
getByStatus(status) {
|
|
132
|
+
return this.data.tasks.filter(t => t.status === status);
|
|
133
|
+
}
|
|
134
|
+
getAllTasks() {
|
|
135
|
+
return [...this.data.tasks];
|
|
136
|
+
}
|
|
137
|
+
clearCompleted() {
|
|
138
|
+
const before = this.data.tasks.length;
|
|
139
|
+
this.data.tasks = this.data.tasks.filter(t => t.status !== 'completed');
|
|
140
|
+
const removed = before - this.data.tasks.length;
|
|
141
|
+
if (removed > 0)
|
|
142
|
+
this.save();
|
|
143
|
+
return removed;
|
|
144
|
+
}
|
|
145
|
+
get count() {
|
|
146
|
+
return this.data.tasks.length;
|
|
147
|
+
}
|
|
148
|
+
get pendingCount() {
|
|
149
|
+
return this.getByStatus('pending').length;
|
|
150
|
+
}
|
|
151
|
+
// --- Daemon state (persisted) ---
|
|
152
|
+
getDaemonState() {
|
|
153
|
+
return this.data.daemonState;
|
|
154
|
+
}
|
|
155
|
+
setDaemonState(state) {
|
|
156
|
+
this.data.daemonState = state;
|
|
157
|
+
if (state === 'running') {
|
|
158
|
+
this.data.lastRunAt = Date.now();
|
|
159
|
+
this.daemonStartTime = Date.now();
|
|
160
|
+
}
|
|
161
|
+
else if (state === 'stopped') {
|
|
162
|
+
this.daemonStartTime = null;
|
|
163
|
+
}
|
|
164
|
+
this.save();
|
|
165
|
+
}
|
|
166
|
+
getStatus() {
|
|
167
|
+
const running = this.data.tasks.find(t => t.status === 'running');
|
|
168
|
+
return {
|
|
169
|
+
daemonState: this.data.daemonState,
|
|
170
|
+
currentTaskId: running?.id ?? null,
|
|
171
|
+
pendingCount: this.getByStatus('pending').length,
|
|
172
|
+
completedCount: this.getByStatus('completed').length,
|
|
173
|
+
failedCount: this.getByStatus('failed').length,
|
|
174
|
+
totalCount: this.data.tasks.length,
|
|
175
|
+
uptimeMs: this.daemonStartTime ? Date.now() - this.daemonStartTime : 0,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Build a summary string for injection into the system prompt.
|
|
180
|
+
*/
|
|
181
|
+
getSummaryForPrompt() {
|
|
182
|
+
if (this.data.tasks.length === 0)
|
|
183
|
+
return null;
|
|
184
|
+
const pending = this.getByStatus('pending');
|
|
185
|
+
const running = this.getByStatus('running');
|
|
186
|
+
const failed = this.getByStatus('failed');
|
|
187
|
+
if (pending.length === 0 && running.length === 0 && failed.length === 0)
|
|
188
|
+
return null;
|
|
189
|
+
const lines = ['## Jarvis Task Queue'];
|
|
190
|
+
if (running.length > 0) {
|
|
191
|
+
lines.push(`\nRunning:`);
|
|
192
|
+
for (const t of running) {
|
|
193
|
+
lines.push(`- #${t.id}: ${t.title} [${t.priority}]`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (pending.length > 0) {
|
|
197
|
+
lines.push(`\nPending (${pending.length}):`);
|
|
198
|
+
for (const t of pending.slice(0, 5)) {
|
|
199
|
+
lines.push(`- #${t.id}: ${t.title} [${t.priority}]`);
|
|
200
|
+
}
|
|
201
|
+
if (pending.length > 5)
|
|
202
|
+
lines.push(` ... and ${pending.length - 5} more`);
|
|
203
|
+
}
|
|
204
|
+
if (failed.length > 0) {
|
|
205
|
+
lines.push(`\nFailed (${failed.length}):`);
|
|
206
|
+
for (const t of failed.slice(0, 3)) {
|
|
207
|
+
lines.push(`- #${t.id}: ${t.title} — ${t.error || 'unknown error'}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return lines.join('\n');
|
|
211
|
+
}
|
|
212
|
+
/** Short status line for the status bar */
|
|
213
|
+
getStatusLine() {
|
|
214
|
+
const pending = this.getByStatus('pending').length;
|
|
215
|
+
const running = this.getByStatus('running').length;
|
|
216
|
+
const completed = this.getByStatus('completed').length;
|
|
217
|
+
const failed = this.getByStatus('failed').length;
|
|
218
|
+
if (pending + running + completed + failed === 0)
|
|
219
|
+
return '';
|
|
220
|
+
const parts = [];
|
|
221
|
+
if (running > 0)
|
|
222
|
+
parts.push(`${running} running`);
|
|
223
|
+
if (pending > 0)
|
|
224
|
+
parts.push(`${pending} pending`);
|
|
225
|
+
if (completed > 0)
|
|
226
|
+
parts.push(`${completed} done`);
|
|
227
|
+
if (failed > 0)
|
|
228
|
+
parts.push(`${failed} failed`);
|
|
229
|
+
return parts.join(', ');
|
|
230
|
+
}
|
|
231
|
+
/** Set or replace the onChange callback */
|
|
232
|
+
setOnChange(handler) {
|
|
233
|
+
this.onChange = handler;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/cli/jarvis/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type JarvisTaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'paused';
|
|
2
|
+
export type JarvisTaskPriority = 'high' | 'medium' | 'low';
|
|
3
|
+
export type JarvisDaemonState = 'stopped' | 'running' | 'paused';
|
|
4
|
+
export interface JarvisTask {
|
|
5
|
+
id: number;
|
|
6
|
+
title: string;
|
|
7
|
+
description: string;
|
|
8
|
+
status: JarvisTaskStatus;
|
|
9
|
+
priority: JarvisTaskPriority;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
startedAt?: number;
|
|
13
|
+
completedAt?: number;
|
|
14
|
+
result?: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
retries: number;
|
|
17
|
+
maxRetries: number;
|
|
18
|
+
sessionId?: string;
|
|
19
|
+
dependencies?: number[];
|
|
20
|
+
tags?: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface JarvisQueueData {
|
|
23
|
+
version: 1;
|
|
24
|
+
nextId: number;
|
|
25
|
+
tasks: JarvisTask[];
|
|
26
|
+
daemonState: JarvisDaemonState;
|
|
27
|
+
lastRunAt?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface JarvisStatusInfo {
|
|
30
|
+
daemonState: JarvisDaemonState;
|
|
31
|
+
currentTaskId: number | null;
|
|
32
|
+
pendingCount: number;
|
|
33
|
+
completedCount: number;
|
|
34
|
+
failedCount: number;
|
|
35
|
+
totalCount: number;
|
|
36
|
+
uptimeMs: number;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACzF,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC3D,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/jarvis/types.ts"],"names":[],"mappings":""}
|