From 9639ef5c403e8d537028b7f959e96fad56c3d427 Mon Sep 17 00:00:00 2001 From: Andy Brenneke Date: Wed, 7 Aug 2024 15:17:30 -0700 Subject: [PATCH] Scan through revision history, show node changes --- .pnp.cjs | 43 +++- ...ences-npm-29.6.3-18ab2c9949-179daf9d2f.zip | Bin 0 -> 12973 bytes ...ittery-npm-1.0.3-02a083c73e-5ba4fc3aff.zip | Bin 0 -> 14307 bytes ...-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip | Bin 0 -> 25159 bytes ...-type-npm-29.6.3-500477292e-88ac9102d4.zip | Bin 0 -> 2840 bytes packages/app/package.json | 5 +- packages/app/src-tauri/tauri.conf.json | 6 + packages/app/src/components/GraphBuilder.tsx | 23 +- .../src/components/GraphInfoSidebarTab.tsx | 4 + .../app/src/components/GraphRevisionList.tsx | 136 +++++++++++ .../src/components/HistoricalGraphNotice.tsx | 69 ++++++ .../app/src/components/NodeChangesModal.tsx | 53 +++++ packages/app/src/components/VisualNode.tsx | 61 ++++- packages/app/src/components/nodeStyles.ts | 8 + packages/app/src/hooks/useGraphRevisions.ts | 97 ++++++++ .../src/hooks/useHistoricalNodeChangeInfo.ts | 60 +++++ packages/app/src/hooks/useLoadGraph.ts | 7 +- packages/app/src/index.tsx | 2 + packages/app/src/state/graph.ts | 16 ++ packages/app/src/state/graphBuilder.ts | 10 +- .../src/utils/ProjectRevisionCalculator.ts | 215 ++++++++++++++++++ packages/app/src/utils/deserializeProject.ts | 51 +++++ .../src/utils/deserializeProject.worker.ts | 16 ++ .../src/integrations/GptTokenizerTokenizer.ts | 6 +- packages/core/src/integrations/Tokenizer.ts | 2 +- packages/core/src/model/nodes/ChatNode.ts | 7 +- packages/core/src/model/nodes/ChunkNode.ts | 8 +- .../anthropic/nodes/ChatAnthropicNode.ts | 9 +- .../plugins/google/nodes/ChatGoogleNode.ts | 5 +- .../src/utils/serialization/serialization.ts | 13 +- .../utils/serialization/serialization_v4.ts | 24 +- yarn.lock | 38 +++- 32 files changed, 939 insertions(+), 55 deletions(-) create mode 100644 .yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip create mode 100644 .yarn/cache/emittery-npm-1.0.3-02a083c73e-5ba4fc3aff.zip create mode 100644 .yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip create mode 100644 .yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip create mode 100644 packages/app/src/components/GraphRevisionList.tsx create mode 100644 packages/app/src/components/HistoricalGraphNotice.tsx create mode 100644 packages/app/src/components/NodeChangesModal.tsx create mode 100644 packages/app/src/hooks/useGraphRevisions.ts create mode 100644 packages/app/src/hooks/useHistoricalNodeChangeInfo.ts create mode 100644 packages/app/src/utils/ProjectRevisionCalculator.ts create mode 100644 packages/app/src/utils/deserializeProject.ts create mode 100644 packages/app/src/utils/deserializeProject.worker.ts diff --git a/.pnp.cjs b/.pnp.cjs index d431cf37d..d1c32b985 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -6614,12 +6614,11 @@ const RAW_RUNTIME_STATE = ["@typescript-eslint/eslint-plugin", "virtual:388c29633752d7c364e0487c276ae72861ce5d69c069bff16a49b35801303d87d39cb24723bbac1721c48df59f346575324fe3c6de8ead4fb7d83d6ae4a0e521#npm:6.9.0"],\ ["@vitejs/plugin-react", "virtual:388c29633752d7c364e0487c276ae72861ce5d69c069bff16a49b35801303d87d39cb24723bbac1721c48df59f346575324fe3c6de8ead4fb7d83d6ae4a0e521#npm:4.1.0"],\ ["ahooks", "virtual:388c29633752d7c364e0487c276ae72861ce5d69c069bff16a49b35801303d87d39cb24723bbac1721c48df59f346575324fe3c6de8ead4fb7d83d6ae4a0e521#npm:3.7.8"],\ - ["chalk", "npm:5.3.0"],\ ["clsx", "npm:2.0.0"],\ ["core-js", "npm:3.33.1"],\ ["csv-parse", "npm:5.5.2"],\ ["csv-stringify", "npm:6.4.4"],\ - ["emittery", "npm:1.0.1"],\ + ["emittery", "npm:1.0.3"],\ ["enquirer", "npm:2.4.1"],\ ["esbuild", "npm:0.19.5"],\ ["eslint", "npm:8.52.0"],\ @@ -6631,8 +6630,10 @@ const RAW_RUNTIME_STATE = ["eslint-plugin-react", "virtual:388c29633752d7c364e0487c276ae72861ce5d69c069bff16a49b35801303d87d39cb24723bbac1721c48df59f346575324fe3c6de8ead4fb7d83d6ae4a0e521#npm:7.33.2"],\ ["eslint-plugin-react-hooks", "virtual:388c29633752d7c364e0487c276ae72861ce5d69c069bff16a49b35801303d87d39cb24723bbac1721c48df59f346575324fe3c6de8ead4fb7d83d6ae4a0e521#npm:4.6.0"],\ ["execa", "npm:8.0.1"],\ + ["fast-deep-equal", "npm:3.1.3"],\ ["fuse.js", "npm:6.6.2"],\ ["immer", "npm:10.0.3"],\ + ["jest-diff", "npm:29.7.0"],\ ["jsonpath-plus", "npm:7.2.0"],\ ["lodash-es", "npm:4.17.21"],\ ["lru-cache", "npm:11.0.0"],\ @@ -13671,6 +13672,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["diff-sequences", [\ + ["npm:29.6.3", {\ + "packageLocation": "./.yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip/node_modules/diff-sequences/",\ + "packageDependencies": [\ + ["diff-sequences", "npm:29.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["digest-fetch", [\ ["npm:1.3.0", {\ "packageLocation": "./.yarn/cache/digest-fetch-npm-1.3.0-00876b1fae-5a90f350ed.zip/node_modules/digest-fetch/",\ @@ -13984,6 +13994,13 @@ const RAW_RUNTIME_STATE = ["emittery", "npm:1.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/emittery-npm-1.0.3-02a083c73e-5ba4fc3aff.zip/node_modules/emittery/",\ + "packageDependencies": [\ + ["emittery", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["emoji-regex", [\ @@ -18443,6 +18460,19 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["jest-diff", [\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip/node_modules/jest-diff/",\ + "packageDependencies": [\ + ["jest-diff", "npm:29.7.0"],\ + ["chalk", "npm:4.1.2"],\ + ["diff-sequences", "npm:29.6.3"],\ + ["jest-get-type", "npm:29.6.3"],\ + ["pretty-format", "npm:29.7.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["jest-environment-jsdom", [\ ["npm:29.7.0", {\ "packageLocation": "./.yarn/cache/jest-environment-jsdom-npm-29.7.0-0b72dd0e0b-23bbfc9bca.zip/node_modules/jest-environment-jsdom/",\ @@ -18473,6 +18503,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["jest-get-type", [\ + ["npm:29.6.3", {\ + "packageLocation": "./.yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip/node_modules/jest-get-type/",\ + "packageDependencies": [\ + ["jest-get-type", "npm:29.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["jest-message-util", [\ ["npm:29.7.0", {\ "packageLocation": "./.yarn/cache/jest-message-util-npm-29.7.0-7f88b6e8d1-31d53c6ed2.zip/node_modules/jest-message-util/",\ diff --git a/.yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip b/.yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip new file mode 100644 index 0000000000000000000000000000000000000000..03fe8b077c982407e2c8e2b82d7f536700553737 GIT binary patch literal 12973 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

j2GFv6*R9GIjm;1yl@#PCSJPF|AUb- zX)koqH(iu}t=1ea0&dQ;5EgPa_0PK1i&zpv64$V{Qz4+NY6^e$%j+WF;K9wVNX8fQ zlh;JOHC?M=8(cr0C~{`|fmmzD$)QC{#iIF%YB6ZzJV{55Ojw*U?#^`=V|scM$9sxC z*l_v3r>~;SN<-l;&Qr<0%*(8*4!_0Oo}6(8Q0+( zvcgi9RdqRP<%w&^f2;O!Jb+cwHc3Zz8!PhCAV>rJYSIUkL|pt@(@iZptpb`+Ev5EQ zNyGM3N?|h1WUzkKc|Od1uv2+dBdlE^XkKudOafi{z@94I;l@nI<4^1w)kxpH$I{phV?{ANED6k3~oi8a=T=6md~C2?T3YQm-RY zH48Quk+z+PX_zix5zLsQf!RHHaKk=HQ&AMMPK3@0G#TR2vSfD?&8ygOvp=3n9Wo*L zC-9R#eLYh{&TGhl-nnlbb;=uc;w26M_Tr451|+1P3PLid*f5`|qimFE+CH2yPpqhS z#ypBf4mM4bqgf#+(HSBv8bCmU*Er&;QNTySw2~tw05zrrJv}>>ZVi%u5#?Yb3TPAG zv9l&+=`0fn5OvJ3H-O+4*;$|{=8_E+fX~IDFlVF-W-`v0S)z%J1D(wB^YT84cBW_df6KE?vLC$=@c}8{PG0#RGifyJfY&(SS8)$S?ha0IAS~ z>+qqDPLS~&M}!{E^LVujjT(ak&&U2)#X^!-5*7e9klhuas7Z*YPP&9*4HE~Qbam=L zFJPqR=!PHTt%RfC_z`KGV*{Ej7c`>aPjiDRB5{DLinpFv zqi3X3V+(x+^yY6sN0vJGY7ujgXKaCEQTUI(9}FSDUO; z-Rb6Ml|-*kje$}X`V74=UU5vzyHyhn>=+kzazDR&4R*ioK^@H7BcBiq4(k1ZhzQRy z9#0oX^?AJn#WeZ0ykoTHiHkLtnP=lbAC??wohF|tK#cEwf2-~UD}aa*7^<9jJIx|{ z1Ab@j*WFw9>(k4*JOpIUW^1R&Gux~;$*iJ||Ln@0o0lAO?)4-L*b;S^kp(!e{Mi9& zh{Qs{qz+Z8Q`mL{uq=G_^ef#JZ2F3vxM=m%)FCL7sLOvsLc~0WWci|}zh7fU1V6Y0 z4Jat((bDd-pM9xVY7N$FCE#low!=z1+|{lhB1N6HUFd}2=|&XOH}c2!N08r+vtPmm z{fxX+0Zh=2(Gbid-fd~oHvgb4kbbAO9OP`;N%#mF9G%bnYap3{dGFT(LtG>|9Iqol zgYqFRcDE$Do&)So134M#4sWo#3nAY-1kG!2hXV{Q1DhpouB%%cUR_j&ksN4aWcr^T8`tSRU4043N&=p zRW>)mX+BO3J>=L|h@Bwp5lIBtEV#~-*;@6*1nPzgV(1Cekew1KVTvu43N+2uw>hN% zW(GW2j(!M$B6u-&L^**cfnvc~GVLLmc5<*Ea?NAhyP+W@0L}JiMoq+E@qsUVgi*Fk zRdklrkgb#(C8@aPwNSQJ;GBB3lW#88iZ+NkXEyYPh*D zgYSSTZst6f@OBDEzS-NX=pC)rrpv_Lb@KC3N9Egoh+mhSbY(4J#WsK7&R)~w`SznfO1(E_B=;vAKmbEoTX9(lUQE(2I3Gipp*~_Ey0e?=Pa$iC+vMOmF0YBWFs7PP9NN=Wk zc__RQkDl?gHGcL^jO^17^~V>e(0uERBIo>zBr1Ju*JYH~@cI^fL{m=OJn`)DdZdh# zblb9=qiW_|;J!>2Rgd(@Kf)A6Qq!8&g<_eSF755bnz&CZC{4HYi9ArqhGnrk1^I| zK}=O8F(>J3BnR1*#(2q}gMs&^-cst-Iku+uvkq9!Lv^cW(1viS=b{lDLZZcz+d z=mS)C$2o$a2FzHCceugIb6hxwGZ-Y3mfKnozDW%~X|l#2GtlDvHWjCWW5uN~ z1XL8Tr4t%YTJr&E7|#0@N^IM%51)mnDS$7^BeY*T_HF znAQoD40lPJ6Oy2&pl}OPVCKZBZTN9wlX3|_*K_v(VI750DIPebDgnnq1U_YffXe<8 z6qU2U%@dxGrA_#ku<+CY%J25sU{@K4Lm+BD9Uu0YE`?$CB@~^NtIJ1a2D}fJ8XkuL zf7I{ro6BF+`Z87M-SE4DP1N`{vvGBD?CoQEGIEc;#4L8ZDz=TN2yuzk=3~|&J6ML~R*h{NGlqWGY#H`>PVubdw0_AL& z@d7N-lBa{DnlLlUERT(bpmqoP$qPG9xvylw_C)*@dNT%kxqAner#cSf936fsD>;y& zsO(oji$`d?BKo~vgJLFK=YwuwDsVT0C145c$XL1i+N3pd6;#S6bnG1~)WYON!0$Fh zrpv&62pueqNN&<`hK~Pybp4vT6fA6HFNaoVhjuQIZkHG2XjMtl#@e4swSjYGAkEls z@lmgR30y{%2-c|XlgTjR6~@kN79Ogfi@>o~o*Svj((aq9{y>pXPut>Fvbmr<^ns=L z>bXHy3#pCNMz`#vw*?GLbct~TlnKt?$afLd?IM88GVJ8q)KRTCP0z14DUuamwY`;6 z=vZhipQEZml~qX23VHj{nb~ccSE-yfO!|Ca8i2Z8OK5WiK3%2*#}s*vfV03xd%^=o z(9S9lVCJEenwFb!zR-k?mS&gQq98%xjP@*!X1=vqGoe(NNi_{yG_i3%t|C2W21kH( zedP#plvTGtVd&iZ&UYtom%{I8;e4P~_Yztwbfl3GdyFXd!lEK)J?3sPm%Rd%{VfL2 zT?Rc&KPKr4-NTKS>D5X?Iur;lQ+C`=A06)lxmzlid7nXyWm_&N3RF4LZ*hU~P1MrS zd9v-gW$;Uz$Jt9O#+`tOP7DT9B?E*@l<*OZGR$KQTUE3H_bf1rH~Y`4p&!jIhFtm) zsY1qS3M{l^SL>9un4-^Tu@0~k13C5MzaV?`{@YE>ANSAy=eaIDnXAg9;&_#(48hs zSj6XB%9LLCnJG|oBjzLisKYT>&P28OSd&xy{FW6_5-@EA)rW2<%$`|kJ%k=mep+=Q zL(E-_lwj`tiAZ;9^K?i?>Qqf8Uaa5SI*Glxr2D&=&oZ^NG3|Kz8B=@hWY=0rL&bG5 zOh&`{;kA+eddn&uxU*xZV$YAo^|MzN=*tsf#dx<7!~K?msE>A2mcGw!YmU;etfuL; zyU(|Vo?(kz%a>lV?Hd-%rks^#*kB*o+8s+wGuS!R@D{@NWCdrAd=~8kPb>-gx!H$g zxJp^sJkDDI3G}`E!UHTM6L7~@_m)s|x`J%+SwYOxiENPuH78yC6A*J6Iu%oM7n}v= z<%`sBm;JLr=Mgk6#$L3i53{Wj*et0#d~dqA*`LdK&TOO;BrxalPqf%bmw+Zi_}(#q zWylI};I2%V#x0x4T{Up!YunF$)M z@ShXnLK(>vue-R`BJQOJGq`m@7I?X@De)mi(O1O4L#5yZvg=z`y})t|;;0xwjkS*A zA7P?Q0^+m+qcAS3fK;YlB4Unu;8yEad%i(bb8@k50=SsvA2kXj+Gk1bG0N9(wg#hM zmx8VbR2CzNj&Soyo_M+u=VTGL_^m~{o~!9gynUUjK^pk%VV?7#iuXyrVnw!dD?T`!k?IunAw#69$;psA_)QUu*mWhBK5V+u^JT1x zh=!#S(mY(YkT$&9aVxKz)$L$*vJe$Mt9BQzp3bWSsrccTgF_J&T@;RSLgf&cI~&r!g_s05KDnbOHIWO zz~a_!Vryh{=b9&iw5y-6qse~qt&(<3*R0b*FFQX#S~Z6E29HypB6kB9)7_z+gGKHk z*L5Yr<2MJXZKm2nCZKEe0r}{rEH`^IxpNas80lKAB7da+zDoI0sA~22^+cC#rAeyo zGE1xxbha9H%o<{a!&I-4;5wf;`OeC-qlL$A!F|hWOQ!j}C-^jKq7f%W0hJ<-V0Gn6 zSMmfVbvqfH7ry-}*0M|PF7;U?=Izg7$y?cf72ov>QuWFPxV3MUHlDeugy*H}7oc=i zY2@0sU>lDG-8Jyiw_zL4MAf9cc$mH4t!&;)(Ct+maztNRi1MLA`W;ZY?{lVD=fO-K@_Sk!X;0GZk8o#1~|TJhUeTyirSxP zfOZe~Gc*qln>r$u*(_#nXrkhpgwIH0@>zT|$DAM*g)Znf0%?H%%F5R`BYr52{QBv( zNoC@Gmi+Wlj1pl!J%_ZMWe%NNnPcX98U!}^%GbRFU254GD(KgYafwcvvu)PRonnN2RWmWhMsiX#oaKbP!x^zpRmK)-9HuHv0HI`mvTc&!CNel^^X`mVN2=uSWN|3p&PD{ z$7>>PHWZD!ZAzA!h}}G9wqg3*`K%wE0$I(?l(g_^D;*O!jDI6(B;E>8OAhli%5c?pA%j?K$%%``-Ks|fZeB>a?^jW@2CM9n7%OK6E2 zSyPkZ+c8z!{YnKG#IasgxL`v}r~TJ0x>W@DU@R(#rFYc~CEdUOM; za|4ePBB(=2(Gz!v%z5Xc(?~7A$o#7j&lwU`$yxj^SVOuhsU|&`f zRM}gn(Bf>b?sFHkZ-(t_H{ z@6U(s{}p-P_XO)-`}u#9*MCR-I|usTsHcC{>0izMzZlWKL;ihd h|2L#5-M@zX`#x8Y1_k?vHN>AI@K3G?8pA*C{tud7DG~qx literal 0 HcmV?d00001 diff --git a/.yarn/cache/emittery-npm-1.0.3-02a083c73e-5ba4fc3aff.zip b/.yarn/cache/emittery-npm-1.0.3-02a083c73e-5ba4fc3aff.zip new file mode 100644 index 0000000000000000000000000000000000000000..3c6fbdd8aee88eeb78cd836172f8c9f443c32e1b GIT binary patch literal 14307 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 M>GuLy|8@5N03~uIL;wH) literal 0 HcmV?d00001 diff --git a/.yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip b/.yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip new file mode 100644 index 0000000000000000000000000000000000000000..0c268e5ea41c8ff21da1539af3b860e38cb92bee GIT binary patch literal 25159 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip b/.yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip new file mode 100644 index 0000000000000000000000000000000000000000..8afbbd1b39357b089cd290c857147bee21b77d92 GIT binary patch literal 2840 zcma)82{@E%8y-vcVXVJ328k@$8mVNgF^G))H?oX)}$$gLfMK! zwr~ikjE3y%&mStBQO$M!Tvz_{e%JNA?{{7AbHC5~J@@lGw}lAV6HpGWFK(f6g}yf<8Qnj&E&eB2^_f74(7WG;8F&$~g0y!%BRM zf%5Gq&K4k8UYSqOb6{#a!cO=0^7-dLwg1iDd->1$oAHmjtBReW{o9`+YT3bpJi? zfC@&hj<7rgqA`kS>4`E-BWCJDiB|o?NLf&ny^*s~1TZ%)N(S{Qe_@WSRHZaBIop~B zoxy*`674vw93eL>t_H>=Id`Okae8Ev;it>jgsNkT65Bfn^wt45?N~Dk{lbIwgbYke z$Whx`+1+aYQa0jdjOY%rxF%*^^cWjiNNv>T>TVsP`rV4wHr{4MU>1<`)HeE2Yk#Vg z=#raDdCG$SZn9ct6dsEmNky%#7jMRzes%4!fmT2~`f337dbeKR=+S2~Z*1R$(?@#O z`gj74tDo$p8)CwS$B9?>@PM@C73YPsJgUosA{C{*EQ7J4|#z4>Cu=jB`WoojsO61|HRxo z0O^iZ@(IqiA_tBsgJL!>qqAiai`hOoz9_vjN$2h7_0d0%V62op;#~3&NIbE-`R1bT zSc04g4`XZ?IqWGV<(^@GlD=QDkQ?<&1(L}K2cymAj;BvO=qwJz09pf_Fg_$h7ppq{`4KA^s2=x+q2`V;s?ivl5mj{YY zvWMMloag)_p%WbD{V!dQ7KY3o_s&zFMGLrVZ&C!cWBr@b9#qDcDiRb;DpH9S)pOIb zvg9OgJReD_XJ*}kB<^G>M8`rr#yZe8G0lNuQgCD+501X4)a!<5_mp(1*G%%vhvjrM zRhZoK^^r0>dy8#Kb^cG0D2u{5Q}Yk5f>~*pr+S3X+059q<-p&2A~uANF2}u0P~Ty) zT9rT~ibNLGF*Jp1_i2qmPLVCDu;D?caXys7Dxgm=d<$za zw%=BGZJdNabBR0QJ~W1kZ1m`=^xJ1z&zf8K&ra`>dwd7U!wWYCQ+MdTbCy^?>vt6b-06thPk{$r_Ocf&)7ZD`lag}(cX>@ZwPiL=q}W&F)T>s zk{=bGW}6tDJGx>y@OF#q3+hODuK!veNGDjV&tP)R@allutoX|cFVAk9ylLyZuwgi) zT{AcBILj6irTr0@yJ}^9o)Fs3Zu2n>f6mR|x@Wg_m4lK&3y*W>q@?^q)jWhJ`RBl} zPXq}_Qv<_G4UGKZf%#rczE=aJQb;f&-8`^WnWJrGhp&0<0`EJW#osVcVctLcm%S+h zfp>_GITd4{-sccJjNW~Xd=(iEyS5%q7d+ba#Fk{v1lPuC<>B-~Y?2{M42z>DpP>P^ z)_k2pwJB4=sU5sE{jl3dTTGxvf}K)zf`yZDY#80qm8VMBWGo-Um@SYtC$7^uI)4^ z?E)-J=;*Z>eywe&fBf56(%GL5D4k!M?rR;|Skn1FaijS_%f*A*hXzy{kEAYt^5JI* z^+O5K@b>Kv>b3oTL>o&w5)6mp(Yn+3d(zxH*q>-{rSX^l2^_6k(Y&O=9;`rr!wyj! p;UTyF-+FWq^kDY<4eHN)DCoglvM@Qqv~SEzePpSrIQC5i{{^c2Zp{Dy literal 0 HcmV?d00001 diff --git a/packages/app/package.json b/packages/app/package.json index 2a92af6e2..3dcc1e5e8 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -80,12 +80,14 @@ "core-js": "^3.33.1", "csv-parse": "^5.5.2", "csv-stringify": "^6.4.4", - "emittery": "^1.0.1", + "emittery": "^1.0.3", "esbuild": "^0.19.5", "eslint": "^8.52.0", "eslint-config-react-app": "^7.0.1", + "fast-deep-equal": "^3.1.3", "fuse.js": "^6.6.2", "immer": "^10.0.3", + "jest-diff": "^29.7.0", "jsonpath-plus": "^7.2.0", "lodash-es": "^4.17.21", "lru-cache": "^11.0.0", @@ -154,7 +156,6 @@ "@types/semver": "^7.5.4", "@types/wicg-file-system-access": "^2023.10.2", "@typescript-eslint/eslint-plugin": "^6.9.0", - "chalk": "^5.3.0", "enquirer": "^2.4.1", "eslint-config-standard-with-typescript": "^39.1.1", "eslint-plugin-import": "^2.29.0", diff --git a/packages/app/src-tauri/tauri.conf.json b/packages/app/src-tauri/tauri.conf.json index 5a5d9dc17..e4b6e11db 100644 --- a/packages/app/src-tauri/tauri.conf.json +++ b/packages/app/src-tauri/tauri.conf.json @@ -45,6 +45,12 @@ "args": true, "cmd": "pnpm", "sidecar": true + }, + { + "name": "git", + "args": true, + "cmd": "git", + "sidecar": false } ] }, diff --git a/packages/app/src/components/GraphBuilder.tsx b/packages/app/src/components/GraphBuilder.tsx index 082ad62e6..ff083b04b 100644 --- a/packages/app/src/components/GraphBuilder.tsx +++ b/packages/app/src/components/GraphBuilder.tsx @@ -1,7 +1,7 @@ import { type FC, useEffect, useMemo, useState, type MouseEvent } from 'react'; import { NodeCanvas } from './NodeCanvas.js'; import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'; -import { connectionsState, nodesByIdState, nodesState } from '../state/graph.js'; +import { connectionsState, isReadOnlyGraphState, nodesByIdState, nodesState } from '../state/graph.js'; import { editingNodeState, selectedNodesState } from '../state/graphBuilder.js'; import { NodeEditorRenderer } from './NodeEditor.js'; import styled from '@emotion/styled'; @@ -22,6 +22,8 @@ import { projectState } from '../state/savedGraphs'; import { useDatasets } from '../hooks/useDatasets'; import { overlayOpenState } from '../state/ui'; import { GraphExecutionSelectorBar } from './GraphExecutionSelectorBar'; +import { HistoricalGraphNotice } from './HistoricalGraphNotice'; +import { NodeChangesModal, NodeChangesModalRenderer } from './NodeChangesModal'; const Container = styled.div` position: relative; @@ -35,14 +37,25 @@ const Container = styled.div` .recording-border { position: absolute; - top: 0; + top: var(--project-selector-height); left: 0; right: 0; bottom: 0; pointer-events: none; - z-index: 100; + z-index: 500; box-shadow: inset 0 0 2px 3px var(--warning-dark); } + + .read-only-border { + position: absolute; + top: var(--project-selector-height); + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + z-index: 500; + box-shadow: inset 0 0 2px 3px var(--grey-light); + } `; export const GraphBuilder: FC = () => { @@ -123,6 +136,7 @@ export const GraphBuilder: FC = () => { ); const overlay = useRecoilValue(overlayOpenState); + const isReadOnly = useRecoilValue(isReadOnlyGraphState); return ( @@ -138,6 +152,7 @@ export const GraphBuilder: FC = () => { onContextMenuItemSelected={contextMenuHandler} /> {loadedRecording &&

} + {isReadOnly &&
} {firstNodeQuestions && firstNodeQuestions.length > 0 && (
); }; diff --git a/packages/app/src/components/GraphRevisionList.tsx b/packages/app/src/components/GraphRevisionList.tsx new file mode 100644 index 000000000..f3f660c2f --- /dev/null +++ b/packages/app/src/components/GraphRevisionList.tsx @@ -0,0 +1,136 @@ +import { useState, type FC } from 'react'; +import { useRecoilValue, useSetRecoilState } from 'recoil'; +import { loadedProjectState } from '../state/savedGraphs'; +import { useGraphRevisions } from '../hooks/useGraphRevisions'; +import { css } from '@emotion/react'; +import Button from '@atlaskit/button'; +import { type CalculatedRevision } from '../utils/ProjectRevisionCalculator'; +import { graphState, historicalGraphState, isReadOnlyGraphState } from '../state/graph'; +import { GraphId } from '@ironclad/rivet-core'; + +const styles = css` + .revisions { + max-height: 800px; + overflow: auto; + display: flex; + flex-direction: column; + margin-right: -12px; + margin-left: -12px; + } + + .revision { + border-bottom: 1px solid var(--grey); + padding: 8px; + padding-left: 12px; + + cursor: pointer; + + &:hover { + background-color: var(--grey-darkish); + } + } + + .hash { + border-radius: 8px; + background-color: black; + display: inline-flex; + padding: 2px 4px; + font-size: 11px; + } + + .message { + font-size: 12px; + } + + .loading-area { + padding: 8px; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + } + + .loaded-area { + padding: 8px; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + } +`; + +export const GraphRevisions: FC = () => { + const projectState = useRecoilValue(loadedProjectState); + const [enabled, setEnabled] = useState(false); + + if (!projectState.loaded || !projectState.path) { + return
No git history
; + } + + if (!enabled) { + return ( +
+ +
+ ); + } + + return ( +
+ +
+ ); +}; + +export const GraphRevisionList: FC = () => { + const { revisions, isLoading, stop, resume, numTotalRevisions, numProcessedRevisions } = useGraphRevisions(); + + return ( +
+
+ {revisions.map((revision) => ( + + ))} + {isLoading ? ( +
+
+ Loading... ({numProcessedRevisions} / {numTotalRevisions}) +
+ +
+ ) : ( +
+ Searched {numProcessedRevisions} revisions for changes to graph. + {(numProcessedRevisions < numTotalRevisions || numTotalRevisions === 0) && ( + + )} +
+ )} +
+
+ ); +}; + +export const GraphRevisionListEntry: FC<{ + revision: CalculatedRevision; +}> = ({ revision }) => { + const currentGraphId = useRecoilValue(graphState).metadata!.id!; + const setGraph = useSetRecoilState(graphState); + const setIsReadOnlyGraph = useSetRecoilState(isReadOnlyGraphState); + const setHistoricalGraph = useSetRecoilState(historicalGraphState); + + function chooseGraph() { + setGraph(revision.projectAtRevision!.graphs[currentGraphId]!); + setIsReadOnlyGraph(true); + setHistoricalGraph(revision); + } + + return ( +
+
+ {revision.hash.slice(0, 6)} +
+
{revision.message}
+
+ ); +}; diff --git a/packages/app/src/components/HistoricalGraphNotice.tsx b/packages/app/src/components/HistoricalGraphNotice.tsx new file mode 100644 index 000000000..b8cef9bba --- /dev/null +++ b/packages/app/src/components/HistoricalGraphNotice.tsx @@ -0,0 +1,69 @@ +import { css } from '@emotion/react'; +import { type FC } from 'react'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { graphState, historicalGraphState, isReadOnlyGraphState } from '../state/graph'; +import Button from '@atlaskit/button'; +import { useLoadGraph } from '../hooks/useLoadGraph'; +import { projectState } from '../state/savedGraphs'; + +const styles = css` + position: fixed; + top: calc(var(--project-selector-height) + 80px); + left: 50%; + transform: translateX(-50%); + background: var(--grey-darkish); + border-radius: 8px; + border: 1px solid var(--grey-dark); + z-index: 50; + display: flex; + flex-direction: column; + gap: 8px; + box-shadow: 3px 1px 10px rgba(0, 0, 0, 0.5); + user-select: none; + padding: 16px; + + code { + background: var(--grey-light); + padding: 2px 4px; + border-radius: 4px; + color: var(--grey-darker); + } +`; + +export const HistoricalGraphNotice: FC = () => { + const loadGraph = useLoadGraph(); + + const project = useRecoilValue(projectState); + const graph = useRecoilValue(graphState); + const [historicalGraph, setHistoricalGraph] = useRecoilState(historicalGraphState); + const [isReadOnlyGraph, setIsReadOnlyGraph] = useRecoilState(isReadOnlyGraphState); + + const currentGraphExists = graph.metadata!.id! in project.graphs; + + function backToCurrent() { + if (currentGraphExists) { + setHistoricalGraph(null); + setIsReadOnlyGraph(false); + loadGraph(project.graphs[graph.metadata!.id!]!); + } + } + + if (!isReadOnlyGraph) { + return null; + } + + return ( +
+ + {historicalGraph == null ? ( + 'Read-only graph' + ) : ( + <> + Viewing graph at commit {historicalGraph.hash.slice(0, 6)} + + )} + + +
+ ); +}; diff --git a/packages/app/src/components/NodeChangesModal.tsx b/packages/app/src/components/NodeChangesModal.tsx new file mode 100644 index 000000000..a307dd2ed --- /dev/null +++ b/packages/app/src/components/NodeChangesModal.tsx @@ -0,0 +1,53 @@ +import { type FC } from 'react'; +import Modal, { ModalBody, ModalTransition, ModalTitle, ModalFooter, ModalHeader } from '@atlaskit/modal-dialog'; +import { useRecoilValue, useSetRecoilState } from 'recoil'; +import { viewingNodeChangesState } from '../state/graphBuilder'; +import { useHistoricalNodeChangeInfo } from '../hooks/useHistoricalNodeChangeInfo'; +import * as yaml from 'yaml'; +import { diffStringsUnified } from 'jest-diff'; + +export const NodeChangesModalRenderer: FC = () => { + const changes = useRecoilValue(viewingNodeChangesState); + + return {changes == null ? null : }; +}; + +export const NodeChangesModal: FC = () => { + const nodeId = useRecoilValue(viewingNodeChangesState); + const changes = useHistoricalNodeChangeInfo(nodeId!); + const setViewingNodeChanges = useSetRecoilState(viewingNodeChangesState); + + if (changes.changed === false) { + return null; + } + + const beforeYaml = yaml.stringify(changes.before!); + const afterYaml = yaml.stringify(changes.after!); + + const yamlDiff = diffStringsUnified(beforeYaml, afterYaml, { + contextLines: 5, + expand: false, + aAnnotation: 'Before', + bAnnotation: 'After', + aColor: (str) => `${str}`, + bColor: (str) => `${str}`, + }); + + return ( + { + setViewingNodeChanges(undefined); + }} + > + + Node Changes + + +
+      
+      
+    
+  );
+};
diff --git a/packages/app/src/components/VisualNode.tsx b/packages/app/src/components/VisualNode.tsx
index 80f840bab..e2762ac30 100644
--- a/packages/app/src/components/VisualNode.tsx
+++ b/packages/app/src/components/VisualNode.tsx
@@ -30,6 +30,7 @@ import SendIcon from 'majesticons/solid/send.svg?react';
 import GitForkLine from 'majesticons/line/git-fork-line.svg?react';
 import PinIcon from 'majesticons/line/pin-line.svg?react';
 import PinSolidIcon from 'majesticons/solid/pin.svg?react';
+import BookIcon from 'majesticons/line/book-open-line.svg?react';
 import { ResizeHandle } from './ResizeHandle.js';
 import { useCanvasPositioning } from '../hooks/useCanvasPositioning.js';
 import { useStableCallback } from '../hooks/useStableCallback.js';
@@ -43,8 +44,10 @@ import {
   draggingWireState,
   isPinnedState,
   pinnedNodesState,
+  viewingNodeChangesState,
 } from '../state/graphBuilder';
 import { Tooltip } from './Tooltip';
+import { useHistoricalNodeChangeInfo } from '../hooks/useHistoricalNodeChangeInfo';
 
 export type VisualNodeProps = {
   heightCache: HeightCache;
@@ -130,6 +133,8 @@ export const VisualNode = memo(
       const isComment = node.type === 'comment';
       useDependsOnPlugins();
 
+      const changeInfo = useHistoricalNodeChangeInfo(node.id);
+
       const asCommentNode = node as CommentNode;
       const style = useMemo(() => {
         const bgColor = node.visualData.color?.bg ?? 'var(--grey-darkish)';
@@ -186,20 +191,32 @@ export const VisualNode = memo(
           ? lastRun?.at(processPage === 'latest' ? lastRun.length - 1 : processPage)?.data
           : undefined;
 
+      const changedClass = changeInfo.changed
+        ? !changeInfo.before && changeInfo.after
+          ? 'changed-added'
+          : 'changed'
+        : '';
+
+      const isHistoricalChanged = changeInfo.changed && !!changeInfo.before && !!changeInfo.after;
+
       return (
         
)}
@@ -399,6 +417,7 @@ const NormalVisualNodeContent: FC<{ lastRun?: ProcessDataForNode[]; processPage: number | 'latest'; isPinned: boolean; + isHistoricalChanged: boolean; onWireStartDrag?: ( event: MouseEvent, startNodeId: NodeId, @@ -440,6 +459,7 @@ const NormalVisualNodeContent: FC<{ onPortMouseOver, onPortMouseOut, isKnownNodeType, + isHistoricalChanged, }) => { useDependsOnPlugins(); @@ -543,6 +563,16 @@ const NormalVisualNodeContent: FC<{ }); }); + const setViewingNodeChanges = useSetRecoilState(viewingNodeChangesState); + + const viewChanges = () => { + if (!isHistoricalChanged) { + return; + } + + setViewingNodeChanges(node.id); + }; + return ( <>
@@ -555,6 +585,13 @@ const NormalVisualNodeContent: FC<{
{node.title}
+ {isHistoricalChanged && ( + + )}