@librechat/agents 3.1.80-dev.2 → 3.1.80-dev.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.
@@ -626,7 +626,13 @@ for member in team:
626
626
  expect(output).toContain('stderr:\nWarning: deprecated function');
627
627
  });
628
628
 
629
- it('formats file information correctly', () => {
629
+ it('preserves files on the artifact but omits them from the LLM-facing output', () => {
630
+ /* The post-execution file summary was removed because it
631
+ * misled the model more than it helped — especially with
632
+ * bash, where models naturally `ls /mnt/data/` to discover
633
+ * available files. The artifact still carries every file
634
+ * so the host's session-tracking layer stays in sync;
635
+ * the LLM just doesn't see the prescriptive listing. */
630
636
  const response: t.ProgrammaticExecutionResponse = {
631
637
  status: 'completed',
632
638
  stdout: 'Generated report\n',
@@ -634,95 +640,26 @@ for member in team:
634
640
  files: [
635
641
  { id: '1', name: 'report.pdf' },
636
642
  { id: '2', name: 'data.csv' },
637
- ],
638
- session_id: 'sess_abc123',
639
- };
640
-
641
- const [output, artifact] = formatCompletedResponse(response);
642
-
643
- expect(output).toContain('Generated files:');
644
- expect(output).toContain('report.pdf');
645
- expect(output).toContain('data.csv');
646
- expect(artifact.files).toHaveLength(2);
647
- expect(artifact.files).toEqual(response.files);
648
- });
649
-
650
- it('handles image files with special message', () => {
651
- const response: t.ProgrammaticExecutionResponse = {
652
- status: 'completed',
653
- stdout: '',
654
- stderr: '',
655
- files: [
656
- { id: '1', name: 'chart.png' },
657
- { id: '2', name: 'photo.jpg' },
658
- ],
659
- session_id: 'sess_abc123',
660
- };
661
-
662
- const [output] = formatCompletedResponse(response);
663
-
664
- expect(output).toContain('chart.png');
665
- expect(output).toContain('Image is already displayed to the user');
666
- });
667
-
668
- it('splits inherited inputs from generated outputs into distinct sections', () => {
669
- const response: t.ProgrammaticExecutionResponse = {
670
- status: 'completed',
671
- stdout: 'analysis done\n',
672
- stderr: '',
673
- files: [
674
- { id: 'g1', name: 'report.pdf' },
675
643
  { id: 'i1', name: 'pptx/SKILL.md', inherited: true },
676
- { id: 'i2', name: 'pptx/scripts/clean.py', inherited: true },
677
- { id: 'g2', name: 'chart.png' },
678
644
  ],
679
645
  session_id: 'sess_abc123',
680
646
  };
681
647
 
682
648
  const [output, artifact] = formatCompletedResponse(response);
683
649
 
684
- /* Generated section lists only outputs the run produced. */
685
- const generatedIdx = output.indexOf('Generated files:');
686
- const inheritedIdx = output.indexOf('Available files (inputs');
687
- expect(generatedIdx).toBeGreaterThan(-1);
688
- expect(inheritedIdx).toBeGreaterThan(generatedIdx);
689
-
690
- /* Slice each section so we can assert membership without
691
- * cross-talk between the two listings. */
692
- const generatedSection = output.slice(generatedIdx, inheritedIdx);
693
- const inheritedSection = output.slice(inheritedIdx);
694
-
695
- expect(generatedSection).toContain('report.pdf');
696
- expect(generatedSection).toContain('chart.png');
697
- expect(generatedSection).not.toContain('SKILL.md');
698
-
699
- expect(inheritedSection).toContain('pptx/SKILL.md');
700
- expect(inheritedSection).toContain('pptx/scripts/clean.py');
701
- expect(inheritedSection).toContain('Available as an input');
702
-
703
- /* The artifact still carries every file so the host can still
704
- * thread per-file ids through to subsequent calls. */
705
- expect(artifact.files).toHaveLength(4);
706
- });
707
-
708
- it('omits the Generated files header when every entry is inherited', () => {
709
- const response: t.ProgrammaticExecutionResponse = {
710
- status: 'completed',
711
- stdout: 'cat: ok\n',
712
- stderr: '',
713
- files: [
714
- { id: 'i1', name: 'pptx/SKILL.md', inherited: true },
715
- { id: 'i2', name: 'pptx/editing.md', inherited: true },
716
- ],
717
- session_id: 'sess_abc123',
718
- };
719
-
720
- const [output] = formatCompletedResponse(response);
721
-
650
+ /* Tool result text is stdout/stderr only. */
651
+ expect(output).toContain('stdout:\nGenerated report');
722
652
  expect(output).not.toContain('Generated files:');
723
- expect(output).toContain('Available files (inputs');
724
- expect(output).toContain('pptx/SKILL.md');
725
- expect(output).toContain('pptx/editing.md');
653
+ expect(output).not.toContain('Available files');
654
+ expect(output).not.toContain('report.pdf');
655
+ expect(output).not.toContain('SKILL.md');
656
+ expect(output).not.toContain('Image is already displayed');
657
+ expect(output).not.toContain('Available as an input');
658
+
659
+ /* Host-facing artifact still has every file with its
660
+ * `inherited` flag intact for session-context merging. */
661
+ expect(artifact.files).toHaveLength(3);
662
+ expect(artifact.files).toEqual(response.files);
726
663
  });
727
664
  });
728
665
 
@@ -922,7 +859,11 @@ for member in team:
922
859
  });
923
860
  });
924
861
 
925
- it('formats response with files', () => {
862
+ it('passes files through on the artifact, never on the LLM-facing output', () => {
863
+ /* Output stays stdout/stderr-only regardless of file count or
864
+ * filename shape. The artifact is the sole sink for file refs;
865
+ * hosts thread them into `_injected_files` on subsequent
866
+ * tool calls via `storeCodeSessionFromResults`. */
926
867
  const response: t.ProgrammaticExecutionResponse = {
927
868
  status: 'completed',
928
869
  stdout: 'Report generated\n',
@@ -930,61 +871,21 @@ for member in team:
930
871
  files: [
931
872
  { id: '1', name: 'report.csv' },
932
873
  { id: '2', name: 'chart.png' },
933
- ],
934
- session_id: 'sess_xyz',
935
- };
936
-
937
- const [output, artifact] = formatCompletedResponse(response);
938
-
939
- expect(output).toContain('Generated files:');
940
- expect(output).toContain('report.csv');
941
- expect(output).toContain('chart.png');
942
- expect(output).toContain('File is already downloaded');
943
- expect(output).toContain('Image is already displayed');
944
- expect(artifact.files).toHaveLength(2);
945
- });
946
-
947
- it('handles multiple files with correct separators', () => {
948
- const response: t.ProgrammaticExecutionResponse = {
949
- status: 'completed',
950
- stdout: 'Done\n',
951
- stderr: '',
952
- files: [
953
- { id: '1', name: 'file1.txt' },
954
- { id: '2', name: 'file2.txt' },
955
- ],
956
- session_id: 'sess_xyz',
957
- };
958
-
959
- const [output] = formatCompletedResponse(response);
960
-
961
- // 2 files format: "- /mnt/data/file1.txt | ..., - /mnt/data/file2.txt | ..."
962
- expect(output).toContain('file1.txt');
963
- expect(output).toContain('file2.txt');
964
- expect(output).toContain('- /mnt/data/file1.txt');
965
- expect(output).toContain('- /mnt/data/file2.txt');
966
- });
967
-
968
- it('handles many files with newline separators', () => {
969
- const response: t.ProgrammaticExecutionResponse = {
970
- status: 'completed',
971
- stdout: 'Done\n',
972
- stderr: '',
973
- files: [
974
- { id: '1', name: 'file1.txt' },
975
- { id: '2', name: 'file2.txt' },
976
874
  { id: '3', name: 'file3.txt' },
977
875
  { id: '4', name: 'file4.txt' },
978
876
  ],
979
877
  session_id: 'sess_xyz',
980
878
  };
981
879
 
982
- const [output] = formatCompletedResponse(response);
880
+ const [output, artifact] = formatCompletedResponse(response);
881
+
882
+ expect(output).toBe('stdout:\nReport generated');
883
+ expect(output).not.toContain('report.csv');
884
+ expect(output).not.toContain('chart.png');
885
+ expect(output).not.toContain('/mnt/data/');
983
886
 
984
- // More than 3 files should use newline separators
985
- expect(output).toContain('file1.txt');
986
- expect(output).toContain('file4.txt');
987
- expect(output.match(/,\n/g)?.length).toBeGreaterThanOrEqual(2);
887
+ expect(artifact.files).toHaveLength(4);
888
+ expect(artifact.files).toEqual(response.files);
988
889
  });
989
890
  });
990
891