-
-
Drag and drop video file
-
-
-
No video chosen
-
-
+
+
+
Drag and drop video file
+
+
+
No video chosen
+
+
+
+
Search video
+
+
+
+
+
+
+ Select ki:
+
+
+
+
+ Select transcription:
+
+
+
+
+ Select type:
+
+ .pdf
+ .word
+ .txt
+
+
+
+
+
Select language:
+
+
+
+
+
+
+
+
+
+
Submit
+
+
+
+
+
---Starting---
+
+
+
---Transkribing---
+
+
+
---Document creation---
+
+
+
+
+
+
+
+ Select Speaker:
+
+
+
+
+
Selected Speaker
+
+ Currently there is no audio file here.
+
+
+
+ Write name:
+
+
+
+ Rename Speaker
+ Rewrite document
+
+
+
+
+ Download
-
Search video
-
-
-
Choose prefered document style:
-
-
- Meeting report
-
+
→
-
-
- Summary with timestamps
-
-
Submit
-
-
-
-
diff --git a/electron/main/preload.js b/electron/main/preload.js
index b027cde..356ada0 100644
--- a/electron/main/preload.js
+++ b/electron/main/preload.js
@@ -15,12 +15,22 @@ try {
getModuleNames: () => ipcRenderer.invoke('get-module-names')
})
-
-
- ipcRenderer.on("progress", (event, resp) => {
- alert(`Finished step ${resp.curstep} of ${resp.totalsteps}`)
+ contextBridge.exposeInMainWorld('electron', {
+ progress: (callback) => ipcRenderer.on('progress', callback)
})
+ contextBridge.exposeInMainWorld('audios', {
+ speakerAudios: (callback) => ipcRenderer.on('speakerAudios', callback)
+ })
+ contextBridge.exposeInMainWorld("submitSpeaker", {
+ speaker_submit: (speaker_names) => {ipcRenderer.send("speaker_submit", speaker_names)}
+ })
+
+ contextBridge.exposeInMainWorld("download", {
+ file_download: () => {ipcRenderer.send("file_download")}
+ })
+
+
ipcRenderer.on("error", (event, err) => {alert(err)})
} catch (error) {
console.log("Error in preload.js");
diff --git a/electron/main/renderer.js b/electron/main/renderer.js
index fcdd894..a45626a 100644
--- a/electron/main/renderer.js
+++ b/electron/main/renderer.js
@@ -19,7 +19,6 @@ uploadContainer.addEventListener("drop", (e) => {
const testEndings = [".mp4", ".mov", ".avi", ".mkv"];
var pathToLower = filePath.toLowerCase();
if(testEndings.some(e => pathToLower.endsWith(e))){
- document.getElementById("progressbar").style.visibility = "visible";
const files1 = e.dataTransfer.files;
handleFiles(files1);
}else{
@@ -28,12 +27,12 @@ uploadContainer.addEventListener("drop", (e) => {
} catch (error) {
console.log("Error in renderer.js with the listerner for the drop function");
+ console.log(error);
}
})
window.addEventListener('load', async (e) => {
try {
- console.log("test");
loadLanguageOptions();
const value = await window.onStartup.getModuleNames();
loadAiOptions(value.ai_modules);
@@ -55,24 +54,16 @@ language_option.addEventListener('change', (e)=>{
});
+//listener for the file explorer search when something got selected
videoUpload.addEventListener("change", () => {
try {
- activateSubmitBtn(videoUpload.files.length > 0);
+ if (videoUpload.files.length > 0) {
+ const file = videoUpload.files;
+ handleFiles(file);
+ }
} catch (error) {
console.log(error);
}
-
-});
-
-//listener for the file explorer search when something got selected
-videoUpload.addEventListener('change', () => {
- try {
- handleFiles(videoUpload.files);
- } catch (error) {
- console.log("Error in manualBtn EventListener change");
- console.log(error);
- }
-
});
//listener for the file explorer search
@@ -84,4 +75,169 @@ manualUploadBtn.addEventListener('click', () => {
console.log(error);
}
-});
\ No newline at end of file
+});
+
+stepButtons.forEach(btn => {
+ btn.addEventListener("click", () => {
+ try {
+ const step = parseInt(btn.dataset.step);
+ showStep(step);
+ } catch (error) {
+
+ }
+ });
+});
+
+prevBtn.addEventListener("click", () => {
+ try {
+ if (currentStep > 1) showStep(currentStep - 1);
+ } catch (error) {
+
+ }
+});
+
+nextBtn.addEventListener("click", () => {
+ try {
+ if(currentStep < totalSteps) showStep(currentStep + 1);
+ } catch (error) {
+
+ }
+});
+
+//Checkboxlistener so that only one can be selected at a time
+docFormat.addEventListener("change", (e) =>{
+ try {
+ if(docFormat.checked){
+ docFormatSummary1.checked = false;
+ docFormatSummary2.checked = false;
+ docFormatSummary3.checked = false;
+ docFormatCustom.checked = false;
+ }
+ } catch (error) {
+
+ }
+});
+docFormatSummary1.addEventListener("change", (e) =>{
+ try {
+ if(docFormatSummary1.checked){
+ docFormat.checked = false;
+ docFormatSummary2.checked = false;
+ docFormatSummary3.checked = false;
+ docFormatCustom.checked = false;
+ }
+ } catch (error) {
+
+ }
+});
+docFormatSummary2.addEventListener("change", (e) =>{
+ try {
+ if(docFormatSummary2.checked){
+ docFormatSummary1.checked = false;
+ docFormat.checked = false;
+ docFormatSummary3.checked = false;
+ docFormatCustom.checked = false;
+ }
+ } catch (error) {
+
+ }
+});
+docFormatSummary3.addEventListener("change", (e) =>{
+ try {
+ if(docFormatSummary3.checked){
+ docFormatSummary1.checked = false;
+ docFormatSummary2.checked = false;
+ docFormat.checked = false;
+ docFormatCustom.checked = false;
+ }
+ } catch (error) {
+
+ }
+});
+docFormatCustom.addEventListener("change", (e) =>{
+ try {
+ if(docFormatCustom.checked){
+ docFormatSummary1.checked = false;
+ docFormatSummary2.checked = false;
+ docFormatSummary3.checked = false;
+ docFormat.checked = false;
+ }
+ } catch (error) {
+
+ }
+});
+
+//Speaker change listener
+cur_speaker.addEventListener("change", (e) =>{
+ try {
+ document.getElementById("speakerAudioViewer").src = speakerAudios[document.getElementById("cur_speaker").value].src;
+ } catch (error) {
+
+ }
+});
+
+window.audios.speakerAudios((event, arg) => {
+ loadSpeakerOptions(arg);
+ setSpeakerAudiosValue(arg);
+});
+
+window.electron.progress((event, arg) => {
+ if(arg.curstep == 1){
+ setCircleOne();
+ }else if(arg.curstep == 2){
+ setCircleZwo();
+ } else if(arg.curstep == 3){
+ setCircleThree();
+ }else if(arg.curstep == 4){
+ setCircleFour();
+ }
+});
+
+function setCircleOne(){
+ try {
+ if(document.getElementById("box1").style.backgroundColor == "green"){
+ document.getElementById("box1").style.backgroundColor = "red";
+ }else{
+ document.getElementById("box1").style.backgroundColor = "green";
+ }
+ } catch (error) {
+ }
+
+};
+function setCircleZwo(){
+ try {
+ if(document.getElementById("box2").style.backgroundColor == "green"){
+ document.getElementById("box2").style.backgroundColor = "red";
+ }else{
+ document.getElementById("box2").style.backgroundColor = "green";
+ }
+ } catch (error) {
+
+ }
+
+};
+function setCircleThree(){
+ try {
+ if(document.getElementById("box3").style.backgroundColor == "green"){
+ document.getElementById("box3").style.backgroundColor = "red";
+ }else{
+ document.getElementById("box3").style.backgroundColor = "green";
+ }
+ } catch (error) {
+
+ }
+
+};
+function setCircleFour(){
+ try {
+ if(document.getElementById("box4").style.backgroundColor == "green"){
+ document.getElementById("box4").style.backgroundColor = "red";
+ }else{
+ document.getElementById("box4").style.backgroundColor = "green";
+ }
+ } catch (error) {
+
+ }
+};
+
+
+
diff --git a/electron/main/script.js b/electron/main/script.js
index 51935ed..910000e 100644
--- a/electron/main/script.js
+++ b/electron/main/script.js
@@ -1,4 +1,4 @@
-
+let currentVideoPath = null;
//function to check if one checkbox is at least klicked
function checkBoxes() {
try {
@@ -25,18 +25,20 @@ function checkBoxes() {
var pathTest = window.electronAPI.getFilePath(videoUpload.files[0]);
var pathToLower = pathTest.toLowerCase();
if(testEndings.some(e => pathToLower.endsWith(e))){
- document.getElementById("progressbar").style.visibility = "visible";
//assembly of the json for the main
- const selectedStyles = [checkedCounter];
- var iter = 0;
- checkboxes.forEach(function(checkbox){
- if(checkbox.checked){
- console.log(checkbox.value);
- selectedStyles[iter] = {iter: checkbox.value};
- iter++;
- }
- });
+ var typeCheckbox;
+ if(document.getElementById("docFormat").checked) typeCheckbox = document.getElementById("docFormat").value;
+ if(document.getElementById("docFormatSummary1").checked) typeCheckbox = document.getElementById("docFormatSummary1").value;
+ if(document.getElementById("docFormatSummary2").checked) typeCheckbox = document.getElementById("docFormatSummary2").value;
+ if(document.getElementById("docFormatSummary3").checked) typeCheckbox = document.getElementById("docFormatSummary3").value;
+ if(document.getElementById("docFormatCustom").checked) typeCheckbox = document.getElementById("docFormatCustom").value;
+
+ document.getElementById("testy").style.visibility = "visible"
+ document.getElementById("box1").style.backgroundColor = "red";
+ document.getElementById("box2").style.backgroundColor = "red";
+ document.getElementById("box3").style.backgroundColor = "red";
+ document.getElementById("box4").style.backgroundColor = "red";
console.log(selectedCheckboxes);
const outputType = document.getElementById("output_type");
const transcriptionType = document.getElementById("transkript_type");
@@ -44,15 +46,15 @@ function checkBoxes() {
const sendingPackage = {
"video": {
"module":"extraction-video-to-audio",
- "inputVideoPath": pathTest,
- "outputType": outputType.value
+ "inputVideoPath": pathTest
},
"transcription": {
"module": transcriptionType.value
},
"document": {
"module":aiType.value,
- "styles": selectedStyles
+ "type": typeCheckbox,
+ "outputType": outputType.value
}
};
window.submit.submit(sendingPackage)
@@ -105,6 +107,7 @@ function handleFiles(files) {
const filePath = window.explorer.onFileDrop(files[0])
videoUpload.files = files;
fileName.textContent = `Chosen video: ${file.name}`;
+ currentVideoPath = filePath;
generateThumbnail(filePath);
activateSubmitBtn(true);
}
@@ -167,6 +170,25 @@ function loadTranscriptionOptions(options){
}
}
+//function to load data type options to the drop down list
+function loadDataTypeOptions(options){
+ try {
+ var menu = document.getElementById('output_type');
+ var object_holdy;
+ var choice ;
+ object_holdy = options
+ for(i = 0; i < options.length; i++){
+ choice = document.createElement('option');
+ choice.textContent = object_holdy[i].displayname;
+ choice.value = object_holdy[i].name;
+ menu.appendChild(choice);
+ }
+ } catch (error) {
+ console.log("Error in script.js function loadDataTypeOptions");
+ console.log(error);
+ }
+}
+
//function to load language options to the drop down list
function loadLanguageOptions(){
try {
@@ -180,16 +202,53 @@ function loadLanguageOptions(){
choice.value = object_holdy[i];
menu.appendChild(choice);
}
-
} catch (error) {
console.log("Error in script.js loadLanguageOptions function");
console.log(error);
}
}
+//function to load speaker options to the drop down list
+function loadSpeakerOptions(options){
+ try {
+ var menu = document.getElementById('cur_speaker');
+ var l = document.getElementById('cur_speaker').options.length -1;
+ for(i = l; i >= 0; i--){
+ menu.remove(i);
+ }
+ var object_holdy;
+ var choice;
+ object_holdy = Object.keys(options);
+ for(i = 0; i < object_holdy.length; i++){
+ choice = document.createElement('option');
+ choice.textContent = options[object_holdy[i]].name;
+ choice.value = object_holdy[i];
+ menu.appendChild(choice);
+ }
+ document.getElementById("speakerAudioViewer").src = options.speakerA.src;
+ } catch (error) {
+ console.log("Error in script.js loadSpeakerOptions function");
+ console.log(error);
+ }
+}
+
+//function to load speaker audio file options to the drop down list
+function loadSpeakerAudio(option){
+ try {
+ var menu = document.getElementById('speakerAudioViewer');
+ var aud = document.createElement("source");
+ aud.src = options;
+ menu.appendChild(aud);
+ } catch (error) {
+ console.log("Error in script.js loadSpeakerAudio function");
+ console.log(error);
+ }
+}
+
+
function activateSubmitBtn(hasFile){
try {
- submitButton.disabled = !hasFile;
+ document.getElementById("submitButton").disabled = !hasFile;
} catch (error) {
console.log(error);
}
@@ -214,3 +273,68 @@ function generateThumbnail(path){
videoElement.style.maxHeight = 40;
videoElement.autoplay = false;
}
+
+//Step-navigation
+const steps = document.querySelectorAll(".step");
+const stepButtons = document.querySelectorAll(".step-item");
+let currentStep = 1;
+const totalSteps = steps.length;
+
+function showStep(stepNumber) {
+ if (stepNumber < 1 || stepNumber > totalSteps){
+ console.error("StepNumber out of Bounds", stepNumber);
+ return;
+ }
+ steps.forEach(step => step.style.display = "none");
+ document.getElementById("step" + stepNumber).style.display = "flex";
+
+ stepButtons.forEach(btn => btn.classList.remove("active"));
+ document.querySelector(`.step-item[data-step="${stepNumber}"]`).classList.add("active");
+ const activeBtn = document.querySelector(`.step-item[data-step="${stepNumber}"]`);
+
+ if(activeBtn) activeBtn.classList.add("active");
+
+ prevBtn.disabled = stepNumber == 1;
+ nextBtn.disabled = stepNumber === totalSteps;
+ currentStep = stepNumber;
+}
+
+
+//Audio value setter
+var speakerAudios = {};
+var speakerEndValues = {};
+function setSpeakerAudiosValue(valy){
+ try {
+ speakerAudios = valy;
+ speakerRewriten = valy;
+ document.getElementById("speakerAudioViewer").src = valy.speakerA.src;
+ } catch (error) {
+
+ }
+}
+
+function rewriteSpeakerName(){
+ try {
+ var tempy = document.getElementById("cur_speaker").value;
+ speakerAudios[tempy].name = document.getElementById("newSpeaker").value;
+ loadSpeakerOptions(speakerAudios);
+ } catch (error) {
+ console.log("\n\n\n" + error + "\n\n\n")
+ }
+}
+
+function sendSpeakerPackages(){
+ try {
+ window.submitSpeaker.speaker_submit(speakerAudios);
+ } catch (error) {
+
+ }
+}
+
+function fileDownload() {
+ try {
+ window.download.file_download();
+ } catch (error) {
+ console.error("Download failed:", error);
+ }
+}
diff --git a/electron/main/style.css b/electron/main/style.css
index 0912516..4040e09 100644
--- a/electron/main/style.css
+++ b/electron/main/style.css
@@ -6,11 +6,32 @@ body {
align-items: center;
height: 100vh;
background-color: #f2f3f4;
- gap: 15px;
+ gap: 10px;
margin: 0;
}
-
+#h1 {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ margin: 0;
+ z-index: 20;
+}
+
+#h1-wrapper {
+ position: relative;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ width: 770px;
+ height: 60px;
+ background-color: #FFF;
+ box-shadow: 0px 4px 10px rgba(0,0,0,0.1);
+ border-radius: 5px;
+ margin-bottom: 10px;
+ display: flex;
+ align-items: center;
+}
+
.upload-container {
background: white;
padding: 40px;
@@ -86,31 +107,86 @@ body {
.submit-btn:hover {
background-color: #0056b3;
}
+
+#step2 {
+ gap: 30px;
+}
+
+.KI-wrapper {
+ margin-top: 40px;
+}
input[type="file"] {
display: none;
}
-.checkbox-container{
-margin-top: 8px;
-display: flex;
-align-items: center;
-gap: 5px;
-}
-
.checkbox-group {
- margin-top: 15px;
- margin-bottom: 15px;
+ --borderColor: #007bfff5;
+ --borderWidth: .125em;
+ }
+
+ .checkbox-group input[type=checkbox] {
+ -webkit-appearance: none;
+ appearance: none;
+ vertical-align: middle;
+ background: #fff;
+ font-size: 1.8em;
+ border-radius: 0.125em;
+ display: inline-block;
+ border: var(--borderWidth) solid var(--borderColor);
+ width: 1em;
+ height: 1em;
+ position: relative;
+ }
+ .checkbox-group input[type=checkbox]:before,
+ .checkbox-group input[type=checkbox]:after {
+ content: "";
+ position: absolute;
+ background: var(--borderColor);
+ width: calc(var(--borderWidth) * 3);
+ height: var(--borderWidth);
+ top: 50%;
+ left: 10%;
+ transform-origin: left center;
+ }
+ .checkbox-group input[type=checkbox]:before {
+ transform: rotate(45deg) translate(calc(var(--borderWidth) / -2), calc(var(--borderWidth) / -2)) scaleX(0);
+ transition: transform 200ms ease-in 200ms;
+ }
+ .checkbox-group input[type=checkbox]:after {
+ width: calc(var(--borderWidth) * 5);
+ transform: rotate(-45deg) translateY(calc(var(--borderWidth) * 2)) scaleX(0);
+ transform-origin: left center;
+ transition: transform 200ms ease-in;
+ }
+ .checkbox-group input[type=checkbox]:checked:before {
+ transform: rotate(45deg) translate(calc(var(--borderWidth) / -2), calc(var(--borderWidth) / -2)) scaleX(1);
+ transition: transform 200ms ease-in;
+ }
+ .checkbox-group input[type=checkbox]:checked:after {
+ width: calc(var(--borderWidth) * 5);
+ transform: rotate(-45deg) translateY(calc(var(--borderWidth) * 2)) scaleX(1);
+ transition: transform 200ms ease-out 200ms;
+ }
+ .checkbox-group input[type=checkbox]:focus {
+ outline: calc(var(--borderWidth) / 2) dotted rgba(0, 0, 0, 0.25);
+ }
+
+.checkbox-container{
+ margin-top: 8px;
display: flex;
- flex-direction: column;
- gap: 10px;
- align-items: flex-start;
+ justify-items: left;
+ align-items: center;
+ gap: 5px;
}
-
+
+
.submit-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
padding: 10px 20px;
- margin-top: 10px;
- margin-bottom: 10px;
+ margin: 130px auto 10px auto;
background-color: #007BFF;
color: white;
border: none;
@@ -126,13 +202,12 @@ gap: 5px;
}
.mitte {
- background-color: #FDFCFA;
+ background-color: #FFF;
display: flex;
width: 700px;
flex-direction: column;
align-items: center;
- padding: 5% 50px;
- margin-top: 20px;
+ padding: 40px;
gap: 10px;
border: 0px;
border-color: black;
@@ -141,14 +216,11 @@ gap: 5px;
box-shadow: 0px 4px 10px rgba(0,0,0,0.1);
}
-h1 {
- align-content: center;
-}
-
.progressbar{
position: relative;
width: 210px;
height: 30px;
+ margin: 50px 20px 5px 20px;
background: rgb(42, 46, 78);
border-radius: 5px;
overflow: hidden;
@@ -173,9 +245,10 @@ h1 {
.dropdownMenus {
display: flex;
- justify-content: flex-end;
+ justify-content: center;
margin-top: 1px;
- gap: 150px;
+ margin-bottom: 30px;
+ gap: 170px;
padding: 2px 10px 2px 10px;
}
@@ -184,5 +257,257 @@ h1 {
}
.labelDiv {
- gap: 200px;
+ gap: 60px;
+ display: flex;
+ justify-content: center;
+ overflow-wrap:inherit;
+ padding-bottom: 20px;
+ margin-top: 40px;
+ margin-bottom: 10px;
+}
+
+/*Step bar*/
+.step-nav {
+ display: flex;
+ gap: 20px;
+ justify-content: center;
+ background: #fff;
+ padding: 10px 30px;
+ border-radius: 6px;
+ box-shadow: 0 4px 10px rgba(0,0,0,0.1);
+}
+
+.step-item {
+ padding: 10px 25px;
+ border-radius: 8px;
+ background: #eee;
+ cursor: pointer;
+ font-weight: bold;
+ transition: 0.2s;
+}
+
+.step-item.active {
+ background: #007BFF;
+ color: white;
+}
+
+.step-item:hover {
+ background: #d9d9d9;
+}
+
+/*panels*/
+.step {
+ margin-top: 70px;
+ display: flex;
+ flex-direction: column;
+ min-height: 400px;
+}
+
+/*Navigation arrows*/
+.step-nav-arrows {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.middle-container-wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 30px;
+ width: max-content;
+ height: auto;
+}
+
+.navBtn {
+ display: flex;
+ justify-content: center;
+ padding: 10px 25px;
+ background-color: #007BFF;
+ color: white;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 14px;
+}
+
+.navBtn:disabled {
+ background-color: #ccc;
+ cursor: not-allowed;
+}
+
+.testy{
+ background-color: #FFF;
+ display: flex;
+ width: auto;
+ flex-direction: row;
+ align-items: center;
+ margin-top: 20px;
+ gap: 10px;
+ border: 0px;
+ border-color: black;
+ border-style: solid;
+ border-radius: 6px;
+ visibility: hidden;
+}
+
+.box2 {
+ background-color: red;
+ width: 40px;
+ height: 40px;
+ padding: 5px;
+ border: 1px solid black;
+ margin: 5px;
+ border-radius: 100px;
+}
+
+li {
+ color: #FFF;
+}
+
+.p-menu1 {
+ margin-left: 20px;
+ z-index: 10;
+}
+
+.hamburger1 {
+ height: 45px;
+ margin: 0;
+ padding-top: 8px;
+ display: grid;
+ grid-template-rows: repeat(3, 1fr);
+ justify-items: center;
+ z-index: 120;
+}
+
+.hamburger1 div {
+ background-color: rgb(61, 61, 61);
+ position: relative;
+ width: 40px;
+ height: 5px;
+ margin-top: 0;
+ -webkit-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+
+#toggle1 {
+ display: none;
+}
+
+#toggle1:checked + .hamburger1 .top {
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ margin-top: 22.5px;
+}
+
+#toggle1:checked + .hamburger1 .meat {
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ margin-top: -5px;
+}
+
+#toggle1:checked + .hamburger1 .bottom {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+}
+
+#toggle1:checked ~ .menu1 {
+ height: 150px;
+ width: 300px;
+}
+
+/* Menu */
+.menu1 {
+ position: absolute;
+ top: 55px;
+ left: 20px;
+ width: 240px;
+ border-radius: 5px;
+ background-color: #1C3B69;
+ margin: 0;
+ display: grid;
+ grid-template-rows: 1fr repeat(4, 0.5fr);
+ grid-row-gap: 25px;
+ padding: 0;
+ list-style: none;
+ clear: both;
+ width: auto;
+ text-align: center;
+ height: 0px;
+ overflow: hidden;
+ transition: height 0.3s ease, width 0.3s ease;
+ z-index: 9999;
+ -webkit-transition: all 0.3s ease;
+}
+
+.menu1 a:first-child {
+ margin-top: 30px;
+}
+
+.menu1 a:last-child {
+ margin-bottom: 30px;
+}
+
+.li1 {
+ color: #fff;
+ width: 100%;
+ margin: 0;
+ padding: 10px 0px;
+ font: 700 20px 'Oswald', sans-serif;
+ text-decoration: none;
+}
+
+.li1:hover {
+ background-color: #FFF;
+ color: rgb(61, 61, 61);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+ -webkit-transition: all 0.3s ease;
+ transition: all 0.3s ease;
+}
+
+#step2, #step3, #step5 {
+ font-size: larger;
+}
+
+#step4 {
+ align-items: center;
+}
+
+#step5 {
+ align-items: flex-start;
+}
+
+.button-group {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+ margin-top: 10px;
+}
+
+.download-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 10px 20px;
+ margin-left: auto;
+ margin-right: 0px;
+ margin-top: 130px;
+ margin-bottom: 10px;
+ background-color: #007BFF;
+ color: white;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 14px;
+}
+
+#speakerLocker, #speakerResender{
+ padding: 10px 20px;
+ margin: 20px auto;
+ background-color: #007BFF;
+ color: white;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 14px;
}
\ No newline at end of file
diff --git a/main.js b/main.js
index 39c408d..7e2dd9a 100644
--- a/main.js
+++ b/main.js
@@ -61,7 +61,7 @@ let mainWindow;
function createWindow() {
mainWindow = new electron.BrowserWindow({
- width: 800,
+ width: 1200,
height: 800,
webPreferences: {
nodeIntegration: false,
@@ -124,16 +124,28 @@ electron.ipcMain.handle('get-module-names', async () => {
// mainWindow.webContents.send("modules", module_array)
// })
-
+var globalArgs = {}
+var globalFinalHtmlPath = ""
electron.ipcMain.on("file_submit", async (event, args) => {
try {
+ globalArgs = args
let curstep = 0
- let totalsteps = 3 + args.document.styles.length
+ let totalsteps = 4
- if(args.document.styles.length == 0)
- throw new Error("At least one Document Style needed");
+ const TEMPLATE_MAP = {
+ "followup-report": "followup_report.txt",
+ "agenda": "agenda.txt",
+ "result-protocol": "result_protocol.txt",
+ "sprint-planning": "sprint_planning_note.txt",
+ "custom": "custom_document.txt"
+ };
+ const templateFile = TEMPLATE_MAP[args.document.type];
+
+ if (!templateFile) {
+ throw new Error("Unknown document type: " + args.document.type);
+ }
console.log(args);
let audiopath = ""
@@ -141,13 +153,14 @@ electron.ipcMain.on("file_submit", async (event, args) => {
console.log("\n\n Running the Video to Audio Extractor");
// This code handles the Video to Audio extraction module call
- await mapFunctions.get("module-handler").function(args.video.module, {inputVideoPath: args.video.inputVideoPath, outputType: args.video.outputType}).then(resp => {
+ await mapFunctions.get("module-handler").function(args.video.module, {inputVideoPath: args.video.inputVideoPath, outputType: mapFunctions.get(args.transcription.module).audioformat}).then(resp => {
console.log(resp);
audiopath = resp
curstep++
mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
}).catch(err => {
mainWindow.webContents.send("error", err)
+ console.log(err);
return
})
@@ -162,6 +175,7 @@ electron.ipcMain.on("file_submit", async (event, args) => {
mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
}).catch(err => {
mainWindow.webContents.send("error", err)
+ console.log(err);
return
})
@@ -176,31 +190,47 @@ electron.ipcMain.on("file_submit", async (event, args) => {
mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
}).catch(err => {
mainWindow.webContents.send("error", err)
+ console.log(err);
return
})
console.log("\n\n Running the LLM module");
// TODO implement documentation module
// This code handles the Text to Document processing module call
- for (let i = 0; i < args.document.styles.length; i++) {
- await mapFunctions.get("module-handler").function(args.document.module, {prompt: args.document.styles[i].prompt, transcript: transcriptpath}).then(resp => {
- console.log(resp);
- transcriptpath = resp
- curstep++
- mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
- }).catch(err => {
- mainWindow.webContents.send("error", err)
- return
- })
- }
+
+ console.log(`\n\n Running the LLM for Document Style ${args.document.type}`);
+
+ await mapFunctions.get("module-handler").function(args.document.module, { inputTranscriptPath: transcriptpath, documentTypePath: "./storage/documentType/" + templateFile, language: "en" }).then(resp => {
+ console.log(resp);
+ globalFinalHtmlPath = resp
+ curstep++
+ mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
+ }).catch(err => {
+ mainWindow.webContents.send("error", err)
+ console.log(err);
+ return
+ })
+ await mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: transcriptpath }).then(resp => {
+ mainWindow.webContents.send("speakerAudios", resp)
+ }).catch(err => {
+ mainWindow.webContents.send("error", err)
+ console.log(err);
+ return
+ })
} catch (error) {
console.log(error);
}
})
+electron.ipcMain.on("file_download", async() => {
+ await mapFunctions.get("htmlDocumentConverter").convert({inputPath:globalFinalHtmlPath, format: globalArgs.document.outputType, showDialog: true});
+})
+electron.ipcMain.on("speaker_submit", async() => {
+ console.log("\n\n\nJa also hier kam was an \n\n\n");
+})
let q =
{
@@ -232,4 +262,4 @@ let q1 = {
{name:"abc", displayname:"ABC"},
{name:"qeg", displayname:"aqghegahu"}
]
-}
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 4de511e..3f885ed 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,12 +12,14 @@
"@google/genai": "^1.30.0",
"@types/axios": "^0.9.36",
"axios": "^1.13.2",
- "cli-progress": "^3.12.0",
"dotenv": "^17.2.3",
"electron": "^39.1.1",
"express": "^5.1.0",
- "ffmpeg-static": "^5.2.0",
- "fluent-ffmpeg": "^2.1.3"
+ "ffmpeg-static": "^5.3.0",
+ "fluent-ffmpeg": "^2.1.3",
+ "html-to-docx": "^1.8.0",
+ "mocha": "^11.7.5",
+ "puppeteer": "^24.33.0"
},
"devDependencies": {
"@types/cli-progress": "^3.11.6",
@@ -27,6 +29,29 @@
"typescript": "^5.9.3"
}
},
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
@@ -185,6 +210,93 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "node_modules/@oozcitak/dom": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.6.tgz",
+ "integrity": "sha512-k4uEIa6DI3FCrFJMGq/05U/59WnS9DjME0kaPqBRCJAqBTkmopbYV1Xs4qFKbDJ/9wOg8W97p+1E0heng/LH7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/infra": "1.0.5",
+ "@oozcitak/url": "1.0.0",
+ "@oozcitak/util": "8.3.4"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/@oozcitak/infra": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.5.tgz",
+ "integrity": "sha512-o+zZH7M6l5e3FaAWy3ojaPIVN5eusaYPrKm6MZQt0DKNdgXa2wDYExjpP0t/zx+GoQgQKzLu7cfD8rHCLt8JrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/util": "8.0.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@oozcitak/infra/node_modules/@oozcitak/util": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.0.0.tgz",
+ "integrity": "sha512-+9Hq6yuoq/3TRV/n/xcpydGBq2qN2/DEDMqNTG7rm95K6ZE2/YY/sPyx62+1n8QsE9O26e5M1URlXsk+AnN9Jw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@oozcitak/url": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.0.tgz",
+ "integrity": "sha512-LGrMeSxeLzsdaitxq3ZmBRVOrlRRQIgNNci6L0VRnOKlJFuRIkNm4B+BObXPCJA6JT5bEJtrrwjn30jueHJYZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/infra": "1.0.3",
+ "@oozcitak/util": "1.0.2"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/@oozcitak/url/node_modules/@oozcitak/infra": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.3.tgz",
+ "integrity": "sha512-9O2wxXGnRzy76O1XUxESxDGsXT5kzETJPvYbreO4mv6bqe1+YSuux2cZTagjJ/T4UfEwFJz5ixanOqB0QgYAag==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/util": "1.0.1"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@oozcitak/url/node_modules/@oozcitak/infra/node_modules/@oozcitak/util": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-1.0.1.tgz",
+ "integrity": "sha512-dFwFqcKrQnJ2SapOmRD1nQWEZUtbtIy9Y6TyJquzsalWNJsKIPxmTI0KG6Ypyl8j7v89L2wixH9fQDNrF78hKg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@oozcitak/url/node_modules/@oozcitak/util": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-1.0.2.tgz",
+ "integrity": "sha512-4n8B1cWlJleSOSba5gxsMcN4tO8KkkcvXhNWW+ADqvq9Xj+Lrl9uCa90GRpjekqQJyt84aUX015DG81LFpZYXA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@oozcitak/util": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.4.tgz",
+ "integrity": "sha512-6gH/bLQJSJEg7OEpkH4wGQdA8KXHRbzL1YkGyUO12YNAgV3jxKy4K9kvfXj4+9T0OLug5k58cnPCKSSIKzp7pg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -194,6 +306,39 @@
"node": ">=14"
}
},
+ "node_modules/@puppeteer/browsers": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz",
+ "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "extract-zip": "^2.0.1",
+ "progress": "^2.0.3",
+ "proxy-agent": "^6.5.0",
+ "semver": "^7.7.3",
+ "tar-fs": "^3.1.1",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "browsers": "lib/cjs/main-cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@puppeteer/browsers/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@sindresorhus/is": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
@@ -216,6 +361,12 @@
"node": ">=10"
}
},
+ "node_modules/@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
+ "license": "MIT"
+ },
"node_modules/@tsconfig/node10": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
@@ -299,7 +450,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz",
"integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"undici-types": "~7.16.0"
}
@@ -398,6 +548,23 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/async": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
@@ -418,11 +585,116 @@
"proxy-from-env": "^1.1.0"
}
},
+ "node_modules/b4a": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
+ "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
+ "node_modules/bare-events": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
+ "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "bare-abort-controller": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-fs": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz",
+ "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4",
+ "bare-url": "^2.2.2",
+ "fast-fifo": "^1.3.2"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
+ "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "bare": ">=1.14.0"
+ }
+ },
+ "node_modules/bare-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-os": "^3.0.1"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
+ "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.21.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-url": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz",
+ "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-path": "^3.0.0"
+ }
+ },
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -442,6 +714,15 @@
}
]
},
+ "node_modules/basic-ftp": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
+ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
"node_modules/bignumber.js": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
@@ -451,22 +732,27 @@
}
},
"node_modules/body-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
- "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
+ "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==",
+ "license": "MIT",
"dependencies": {
"bytes": "^3.1.2",
"content-type": "^1.0.5",
- "debug": "^4.4.0",
+ "debug": "^4.4.3",
"http-errors": "^2.0.0",
- "iconv-lite": "^0.6.3",
+ "iconv-lite": "^0.7.0",
"on-finished": "^2.4.1",
"qs": "^6.14.0",
- "raw-body": "^3.0.0",
- "type-is": "^2.0.0"
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
},
"engines": {
"node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/boolean": {
@@ -484,6 +770,17 @@
"balanced-match": "^1.0.0"
}
},
+ "node_modules/browser-split": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/browser-split/-/browser-split-0.0.1.tgz",
+ "integrity": "sha512-JhvgRb2ihQhsljNda3BI8/UcRHVzrVwo3Q+P8vDtSiyobXuFpuZ9mq+MbRGMnC22CjW3RrfXdg6j6ITX8M+7Ow==",
+ "license": "MIT"
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
+ },
"node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@@ -563,22 +860,152 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
"license": "Apache-2.0"
},
- "node_modules/cli-progress": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
- "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
- "license": "MIT",
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dependencies": {
- "string-width": "^4.2.3"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chromium-bidi": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz",
+ "integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "mitt": "^3.0.1",
+ "zod": "^3.24.1"
+ },
+ "peerDependencies": {
+ "devtools-protocol": "*"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/clone-response": {
@@ -669,6 +1096,38 @@
"node": ">=6.6.0"
}
},
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -728,6 +1187,17 @@
}
}
},
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@@ -795,6 +1265,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/degenerator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -817,6 +1301,12 @@
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"optional": true
},
+ "node_modules/devtools-protocol": {
+ "version": "0.0.1534754",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1534754.tgz",
+ "integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==",
+ "license": "BSD-3-Clause"
+ },
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -827,6 +1317,67 @@
"node": ">=0.3.1"
}
},
+ "node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
"node_modules/dotenv": {
"version": "17.2.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
@@ -921,6 +1472,27 @@
"once": "^1.4.0"
}
},
+ "node_modules/ent": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz",
+ "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "punycode": "^1.4.1",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/env-paths": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
@@ -930,6 +1502,25 @@
"node": ">=6"
}
},
+ "node_modules/error": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/error/-/error-4.4.0.tgz",
+ "integrity": "sha512-SNDKualLUtT4StGFP7xNfuFybL2f6iJujFtrWuvJqGbVQGaN+adE23veqzPz1hjUjTunLi2EnJ+0SJxtbJreKw==",
+ "dependencies": {
+ "camelize": "^1.0.0",
+ "string-template": "~0.2.0",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -977,6 +1568,14 @@
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"optional": true
},
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -986,7 +1585,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "optional": true,
"engines": {
"node": ">=10"
},
@@ -994,6 +1592,58 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -1002,6 +1652,23 @@
"node": ">= 0.6"
}
},
+ "node_modules/ev-store": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ev-store/-/ev-store-7.0.0.tgz",
+ "integrity": "sha512-otazchNRnGzp2YarBJ+GXKVGvhxVATB1zmaStxJBYet0Dyq7A9VhH8IUEB/gRcL6Ch52lfpgPTRJ2m49epyMsQ==",
+ "dependencies": {
+ "individual": "^3.0.0"
+ }
+ },
+ "node_modules/events-universal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-events": "^2.7.0"
+ }
+ },
"node_modules/express": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
@@ -1067,6 +1734,12 @@
"@types/yauzl": "^2.9.1"
}
},
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "license": "MIT"
+ },
"node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
@@ -1098,9 +1771,9 @@
}
},
"node_modules/ffmpeg-static": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz",
- "integrity": "sha512-WrM7kLW+do9HLr+H6tk7LzQ7kPqbAgLjdzNE32+u3Ff11gXt9Kkkd2nusGFrlWMIe+XaA97t+I8JS7sZIrvRgA==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.3.0.tgz",
+ "integrity": "sha512-H+K6sW6TiIX6VGend0KQwthe+kaceeH/luE8dIZyOP35ik7ahYojDuqlTV1bOrtEwl01sy2HFNGQfi5IDJvotg==",
"hasInstallScript": true,
"license": "GPL-3.0-or-later",
"dependencies": {
@@ -1129,11 +1802,35 @@
"node": ">= 0.8"
}
},
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
"node_modules/fluent-ffmpeg": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz",
"integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==",
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "MIT",
"dependencies": {
"async": "^0.2.9",
"which": "^1.1.1"
@@ -1305,6 +2002,14 @@
"node": ">=18"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -1354,6 +2059,29 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-uri": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
+ "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
+ "license": "MIT",
+ "dependencies": {
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^6.0.2",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/get-uri/node_modules/data-uri-to-buffer": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/glob": {
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
@@ -1373,6 +2101,16 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "license": "MIT",
+ "dependencies": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
"node_modules/global-agent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
@@ -1495,6 +2233,14 @@
"node": ">=18"
}
},
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/has-property-descriptors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
@@ -1543,6 +2289,96 @@
"node": ">= 0.4"
}
},
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/html-to-docx": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/html-to-docx/-/html-to-docx-1.8.0.tgz",
+ "integrity": "sha512-IiMBWIqXM4+cEsW//RKoonWV7DlXAJBmmKI73XJSVWTIXjGUaxSr2ck1jqzVRZknpvO8xsFnVicldKVAWrBYBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/dom": "1.15.6",
+ "@oozcitak/util": "8.3.4",
+ "color-name": "^1.1.4",
+ "html-entities": "^2.3.3",
+ "html-to-vdom": "^0.7.0",
+ "image-size": "^1.0.0",
+ "image-to-base64": "^2.2.0",
+ "jszip": "^3.7.1",
+ "lodash": "^4.17.21",
+ "mime-types": "^2.1.35",
+ "nanoid": "^3.1.25",
+ "virtual-dom": "^2.1.1",
+ "xmlbuilder2": "2.1.2"
+ }
+ },
+ "node_modules/html-to-docx/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/html-to-docx/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/html-to-vdom": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/html-to-vdom/-/html-to-vdom-0.7.0.tgz",
+ "integrity": "sha512-k+d2qNkbx0JO00KezQsNcn6k2I/xSBP4yXYFLvXbcasTTDh+RDLUJS3puxqyNnpdyXWRHFGoKU7cRmby8/APcQ==",
+ "license": "ISC",
+ "dependencies": {
+ "ent": "^2.0.0",
+ "htmlparser2": "^3.8.2"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^1.3.1",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.1.1"
+ }
+ },
"node_modules/http-cache-semantics": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
@@ -1571,6 +2407,28 @@
"node": ">= 0.8"
}
},
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/http-proxy-agent/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/http-response-object": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
@@ -1612,22 +2470,107 @@
}
},
"node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
+ "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
+ "license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
+ "node_modules/image-size": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz",
+ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==",
+ "license": "MIT",
+ "dependencies": {
+ "queue": "6.0.2"
+ },
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=16.x"
+ }
+ },
+ "node_modules/image-to-base64": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/image-to-base64/-/image-to-base64-2.2.0.tgz",
+ "integrity": "sha512-Z+aMwm/91UOQqHhrz7Upre2ytKhWejZlWV/JxUTD1sT7GWWKFDJUEV5scVQKnkzSgPHFuQBUEWcanO+ma0PSVw==",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^2.6.0"
+ }
+ },
+ "node_modules/image-to-base64/node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+ "license": "MIT"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/individual": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/individual/-/individual-3.0.0.tgz",
+ "integrity": "sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g=="
+ },
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
+ "node_modules/ip-address": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
+ "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -1636,6 +2579,12 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -1645,11 +2594,71 @@
"node": ">=8"
}
},
+ "node_modules/is-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-promise": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="
},
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -1670,6 +2679,23 @@
"@pkgjs/parseargs": "^0.11.0"
}
},
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
"node_modules/json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
@@ -1683,6 +2709,12 @@
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
},
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
"node_modules/json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -1697,6 +2729,48 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jszip": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+ "license": "(MIT OR GPL-3.0-or-later)",
+ "dependencies": {
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/jszip/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/jszip/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/jszip/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"node_modules/jwa": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
@@ -1708,11 +2782,12 @@
}
},
"node_modules/jws": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
- "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
+ "license": "MIT",
"dependencies": {
- "jwa": "^2.0.0",
+ "jwa": "^2.0.1",
"safe-buffer": "^5.0.1"
}
},
@@ -1724,6 +2799,56 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
@@ -1810,6 +2935,15 @@
"node": ">=4"
}
},
+ "node_modules/min-document": {
+ "version": "2.19.2",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz",
+ "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==",
+ "license": "MIT",
+ "dependencies": {
+ "dom-walk": "^0.1.0"
+ }
+ },
"node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -1832,12 +2966,79 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
+ "node_modules/mocha": {
+ "version": "11.7.5",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz",
+ "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==",
+ "dependencies": {
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^4.0.1",
+ "debug": "^4.3.5",
+ "diff": "^7.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^10.4.5",
+ "he": "^1.2.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^9.0.5",
+ "ms": "^2.1.3",
+ "picocolors": "^1.1.1",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^9.2.0",
+ "yargs": "^17.7.2",
+ "yargs-parser": "^21.1.1",
+ "yargs-unparser": "^2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/mocha/node_modules/diff": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
+ "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
"node_modules/negotiator": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
@@ -1846,6 +3047,21 @@
"node": ">= 0.6"
}
},
+ "node_modules/netmask": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
+ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/next-tick": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz",
+ "integrity": "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==",
+ "license": "MIT"
+ },
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -1940,16 +3156,134 @@
"node": ">=8"
}
},
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pac-proxy-agent": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.6",
+ "pac-resolver": "^7.0.1",
+ "socks-proxy-agent": "^8.0.5"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-resolver": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
+ "license": "MIT",
+ "dependencies": {
+ "degenerator": "^5.0.0",
+ "netmask": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
},
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/parse-cache-control": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
"integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="
},
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -1958,6 +3292,14 @@
"node": ">= 0.8"
}
},
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -1995,6 +3337,26 @@
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
},
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -2016,6 +3378,56 @@
"node": ">= 0.10"
}
},
+ "node_modules/proxy-agent": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.1",
+ "https-proxy-agent": "^7.0.6",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.1.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.5"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -2030,6 +3442,51 @@
"once": "^1.3.1"
}
},
+ "node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "license": "MIT"
+ },
+ "node_modules/puppeteer": {
+ "version": "24.33.0",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.33.0.tgz",
+ "integrity": "sha512-nl3wsAztq5F8zybn4Tk41OCnYIzFIzGC6AN0WcF2KCUnWenajvRRPgBmS6LvNUV2HEeIzT2zRZHH0TgVxLDKew==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@puppeteer/browsers": "2.11.0",
+ "chromium-bidi": "11.0.0",
+ "cosmiconfig": "^9.0.0",
+ "devtools-protocol": "0.0.1534754",
+ "puppeteer-core": "24.33.0",
+ "typed-query-selector": "^2.12.0"
+ },
+ "bin": {
+ "puppeteer": "lib/cjs/puppeteer/node/cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/puppeteer-core": {
+ "version": "24.33.0",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.33.0.tgz",
+ "integrity": "sha512-tPTxVg+Qdj/8av4cy6szv3GlhxeOoNhiiMZ955fjxQyvPQE/6DjCa6ZyF/x0WJrlgBZtaLSP8TQgJb7FdLDXXA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@puppeteer/browsers": "2.11.0",
+ "chromium-bidi": "11.0.0",
+ "debug": "^4.4.3",
+ "devtools-protocol": "0.0.1534754",
+ "typed-query-selector": "^2.12.0",
+ "webdriver-bidi-protocol": "0.3.9",
+ "ws": "^8.18.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/qs": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
@@ -2044,6 +3501,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/queue": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "~2.0.3"
+ }
+ },
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
@@ -2055,6 +3521,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -2077,21 +3551,6 @@
"node": ">= 0.10"
}
},
- "node_modules/raw-body/node_modules/iconv-lite": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
- "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -2106,11 +3565,40 @@
"node": ">= 6"
}
},
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resolve-alpn": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
"integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
},
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/responselike": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
@@ -2188,6 +3676,23 @@
],
"license": "MIT"
},
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -2243,6 +3748,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
"node_modules/serve-static": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
@@ -2257,6 +3770,12 @@
"node": ">= 18"
}
},
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "license": "MIT"
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -2360,6 +3879,63 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.7",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^10.0.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/socks-proxy-agent/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/sprintf-js": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
@@ -2374,6 +3950,17 @@
"node": ">= 0.8"
}
},
+ "node_modules/streamx": {
+ "version": "2.23.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
+ "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
+ "license": "MIT",
+ "dependencies": {
+ "events-universal": "^1.0.0",
+ "fast-fifo": "^1.3.2",
+ "text-decoder": "^1.1.0"
+ }
+ },
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -2383,6 +3970,11 @@
"safe-buffer": "~5.2.0"
}
},
+ "node_modules/string-template": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
+ "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw=="
+ },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -2435,6 +4027,17 @@
"node": ">=8"
}
},
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/sumchecker": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
@@ -2446,6 +4049,54 @@
"node": ">= 8.0"
}
},
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz",
+ "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==",
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ },
+ "optionalDependencies": {
+ "bare-fs": "^4.0.1",
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/text-decoder": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -2454,6 +4105,12 @@
"node": ">=0.6"
}
},
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
"node_modules/ts-node": {
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
@@ -2498,6 +4155,12 @@
}
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
"node_modules/type-fest": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
@@ -2523,6 +4186,12 @@
"node": ">= 0.6"
}
},
+ "node_modules/typed-query-selector": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz",
+ "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==",
+ "license": "MIT"
+ },
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -2533,9 +4202,8 @@
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -2587,6 +4255,22 @@
"node": ">= 0.8"
}
},
+ "node_modules/virtual-dom": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/virtual-dom/-/virtual-dom-2.1.1.tgz",
+ "integrity": "sha512-wb6Qc9Lbqug0kRqo/iuApfBpJJAq14Sk1faAnSmtqXiwahg7PVTvWMs9L02Z8nNIMqbwsxzBAA90bbtRLbw0zg==",
+ "license": "MIT",
+ "dependencies": {
+ "browser-split": "0.0.1",
+ "error": "^4.3.0",
+ "ev-store": "^7.0.0",
+ "global": "^4.3.0",
+ "is-object": "^1.0.1",
+ "next-tick": "^0.2.2",
+ "x-is-array": "0.1.0",
+ "x-is-string": "0.1.0"
+ }
+ },
"node_modules/web-streams-polyfill": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
@@ -2595,6 +4279,28 @@
"node": ">= 8"
}
},
+ "node_modules/webdriver-bidi-protocol": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.9.tgz",
+ "integrity": "sha512-uIYvlRQ0PwtZR1EzHlTMol1G0lAlmOe6wPykF9a77AK3bkpvZHzIVxRE2ThOx5vjy2zISe0zhwf5rzuUfbo1PQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
"node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@@ -2607,6 +4313,11 @@
"which": "bin/which"
}
},
+ "node_modules/workerpool": {
+ "version": "9.3.4",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz",
+ "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg=="
+ },
"node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -2725,6 +4436,118 @@
}
}
},
+ "node_modules/x-is-array": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/x-is-array/-/x-is-array-0.1.0.tgz",
+ "integrity": "sha512-goHPif61oNrr0jJgsXRfc8oqtYzvfiMJpTqwE7Z4y9uH+T3UozkGqQ4d2nX9mB9khvA8U2o/UbPOFjgC7hLWIA=="
+ },
+ "node_modules/x-is-string": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
+ "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w=="
+ },
+ "node_modules/xmlbuilder2": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-2.1.2.tgz",
+ "integrity": "sha512-PI710tmtVlQ5VmwzbRTuhmVhKnj9pM8Si+iOZCV2g2SNo3gCrpzR2Ka9wNzZtqfD+mnP+xkrqoNy0sjKZqP4Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/dom": "1.15.5",
+ "@oozcitak/infra": "1.0.5",
+ "@oozcitak/util": "8.3.3"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/xmlbuilder2/node_modules/@oozcitak/dom": {
+ "version": "1.15.5",
+ "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.5.tgz",
+ "integrity": "sha512-L6v3Mwb0TaYBYgeYlIeBaHnc+2ZEaDSbFiRm5KmqZQSoBlbPlf+l6aIH/sD5GUf2MYwULw00LT7+dOnEuAEC0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/infra": "1.0.5",
+ "@oozcitak/url": "1.0.0",
+ "@oozcitak/util": "8.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/xmlbuilder2/node_modules/@oozcitak/dom/node_modules/@oozcitak/util": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.0.0.tgz",
+ "integrity": "sha512-+9Hq6yuoq/3TRV/n/xcpydGBq2qN2/DEDMqNTG7rm95K6ZE2/YY/sPyx62+1n8QsE9O26e5M1URlXsk+AnN9Jw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/xmlbuilder2/node_modules/@oozcitak/util": {
+ "version": "8.3.3",
+ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.3.tgz",
+ "integrity": "sha512-Ufpab7G5PfnEhQyy5kDg9C8ltWJjsVT1P/IYqacjstaqydG4Q21HAT2HUZQYBrC/a1ZLKCz87pfydlDvv8y97w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
@@ -2743,6 +4566,26 @@
"engines": {
"node": ">=6"
}
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
}
}
}
diff --git a/package.json b/package.json
index 4b6cc7b..c5ea093 100644
--- a/package.json
+++ b/package.json
@@ -3,12 +3,14 @@
"@google/genai": "^1.30.0",
"@types/axios": "^0.9.36",
"axios": "^1.13.2",
- "cli-progress": "^3.12.0",
"dotenv": "^17.2.3",
"electron": "^39.1.1",
"express": "^5.1.0",
- "ffmpeg-static": "^5.2.0",
- "fluent-ffmpeg": "^2.1.3"
+ "ffmpeg-static": "^5.3.0",
+ "fluent-ffmpeg": "^2.1.3",
+ "html-to-docx": "^1.8.0",
+ "mocha": "^11.7.5",
+ "puppeteer": "^24.33.0"
},
"devDependencies": {
"@types/cli-progress": "^3.11.6",
@@ -27,7 +29,7 @@
},
"scripts": {
"start": "electron main.js",
- "test": "echo \"Error: no test specified\" && exit 1"
+ "test": "mocha ./test/unit/test.js"
},
"repository": {
"type": "git",
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 36a15fc..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-fastapi
-uvicorn
-pytest
diff --git a/requires.js b/requires.js
index 6036867..6a7e20a 100644
--- a/requires.js
+++ b/requires.js
@@ -6,17 +6,19 @@ platform = process.platform
mainDir = __dirname
fs = require("fs")
readline = require("readline")
+
+puppeteer = require("puppeteer")
+htmltodocx = require("html-to-docx")
config = require("./config/config")
ffmpegPath = require('ffmpeg-static');
ffmpeg = require('fluent-ffmpeg');
path = require('path');
-cliProgress = require('cli-progress');
+// cliProgress = require('cli-progress');
// { app, BrowserWindow, ipcMain, dialog } = require('electron');
electron = require('electron');
-genai = require("@google/genai");
axios = require("axios")
diff --git a/scripts/show-models.js b/scripts/show-models.js
new file mode 100644
index 0000000..9aae541
--- /dev/null
+++ b/scripts/show-models.js
@@ -0,0 +1,47 @@
+const fs = require('fs');
+const path = require('path');
+
+//node show-models.js, remember to set SAIA_API_KEY in your environment before running the script
+
+const SAIA_API_KEY = process.env.SAIA_API_KEY;
+const SAIA_MODELS_URL = "https://chat-ai.academiccloud.de/v1/models";
+
+// Script to list available models
+(async () => {
+ if (!SAIA_API_KEY) {
+ console.error("ERROR: SAIA_API_KEY environment variable is not set!");
+ process.exit(1);
+ }
+
+ console.log("Fetching available models from SAIA...\n");
+
+ try {
+ const response = await fetch(SAIA_MODELS_URL, {
+ method: "GET",
+ headers: {
+ "Authorization": `Bearer ${SAIA_API_KEY}`,
+ "Accept": "application/json"
+ }
+ });
+
+ if (!response.ok) {
+ const text = await response.text();
+ throw new Error(`SAIA API error (${response.status}): ${text}`);
+ }
+
+ const data = await response.json();
+
+ console.log("Available models:");
+ console.log(JSON.stringify(data, null, 2));
+
+ if (data.data && Array.isArray(data.data)) {
+ console.log("\n\nModel IDs:");
+ data.data.forEach(model => {
+ console.log(`- ${model.id}`);
+ });
+ }
+
+ } catch (error) {
+ console.error("Error fetching models:", error);
+ }
+})();
\ No newline at end of file
diff --git a/services/modules/audioSnippets/extract-speaker-snippets.js b/services/modules/audioSnippets/extract-speaker-snippets.js
new file mode 100644
index 0000000..efb0e83
--- /dev/null
+++ b/services/modules/audioSnippets/extract-speaker-snippets.js
@@ -0,0 +1,102 @@
+
+const ffmpeg = require("fluent-ffmpeg");
+const ffmpegPath = require("ffmpeg-static");
+
+ffmpeg.setFfmpegPath(ffmpegPath);
+
+module.exports = {
+ name: "extract-speaker-snippets",
+ type: "audio",
+ displayname: "Extract Speaker Snippets",
+
+ async function(parameter) {
+ return new Promise(async (resolve, reject) => {
+
+ let output = {}
+
+ // console.log("Extract Speaker Snippets\n");
+
+ // Pfade
+ const AUDIO_PATH = parameter.audioPath; // Gesamt-Audio
+ const JSON_PATH = parameter.jsonPath; // json summary
+ const OUTPUT_DIR = path.join(__dirname, "/../../../storage/audio/speakerSnippets");
+
+
+ if (!AUDIO_PATH || !JSON_PATH) {
+ // console.error("no audioPath or jsonPath available");
+ reject(new Error("no audioPath or jsonPath available"));
+ return;
+ }
+
+ // Output-Ordner
+ if (!fs.existsSync(OUTPUT_DIR)) {
+ fs.mkdirSync(OUTPUT_DIR, { recursive: true });
+ }
+
+ // JSON laden
+ let entries;
+ try {
+ entries = JSON.parse(fs.readFileSync(JSON_PATH, "utf8"));
+ } catch (err) {
+ // console.error("JSON reading failed", err);
+ reject(new Error(err));
+ return;
+ }
+
+ if (!Array.isArray(entries)) {
+ // console.error("JSON is not an Array");
+ reject(new Error("JSON is not an Array"));
+ return;
+ }
+
+ // Pro Speaker genau EINEN Satz merken
+ const speakerMap = {};
+
+ for (const item of entries) {
+ if (!speakerMap[item.speaker]) {
+ speakerMap[item.speaker] = item;
+ }
+ }
+
+ // FFmpeg pro Speaker ausführen (sequenziell)
+ for (const speaker of Object.keys(speakerMap)) {
+ const data = speakerMap[speaker];
+
+ // ms → Sekunden
+ const startSec = data.start / 1000;
+ const durationSec = (data.end - data.start) / 1000;
+
+ if (durationSec <= 0) {
+ // console.log(`invalid times for Speaker ${speaker}`);
+ continue;
+ }
+
+ const outFile = path.join(OUTPUT_DIR, `speaker_${speaker}.wav`);
+ try {
+ await new Promise((res, rej) => {
+ ffmpeg(AUDIO_PATH)
+ .setStartTime(startSec)
+ .setDuration(durationSec)
+ .output(outFile)
+ .on("end", () => {
+ output[`speaker${speaker}`] = {src: outFile, name: `speaker${speaker}`}
+ // console.log(`Snippet erstellt: speaker_${speaker}.wav`);
+ res();
+ })
+ .on("error", (err) => {
+ // console.error(`FFmpeg Fehler (${speaker})`, err.message);
+ rej(err);
+ return
+ })
+ .run();
+ });
+ } catch (error) {
+ reject(error)
+ return
+ }
+ }
+ resolve(output)
+ // console.log("\nAlle Speaker-Snippets erstellt\n");
+ })
+ }
+};
\ No newline at end of file
diff --git a/services/modules/convert/convert.js b/services/modules/convert/convert.js
new file mode 100644
index 0000000..54b30ef
--- /dev/null
+++ b/services/modules/convert/convert.js
@@ -0,0 +1,197 @@
+const fs = require('fs');
+const path = require('path');
+const puppeteer = require('puppeteer');
+const htmlToDocx = require('html-to-docx');
+const { execSync } = require('child_process');
+const os = require('os');
+
+const outputDir = path.join(__dirname, "../../../storage/documents");
+
+if (!fs.existsSync(outputDir)) {
+ fs.mkdirSync(outputDir, { recursive: true });
+}
+
+async function showSaveDialog(defaultName, format) {
+ const platform = os.platform();
+
+ if (platform === 'darwin') {
+ // macOS
+ const applescript = `
+ set defaultName to "${defaultName}.${format}"
+ set theFile to choose file name with prompt "Dokument speichern als:" default name defaultName
+ POSIX path of theFile
+ `;
+
+ try {
+ const result = execSync(`osascript -e '${applescript}'`, { encoding: 'utf8' });
+ return result.trim();
+ } catch (err) {
+ if (err.status === 1) return null; // User canceled
+ throw err;
+ }
+ } else if (platform === 'win32') {
+ const safeName = decodeURIComponent(defaultName);
+
+ const powershell = `
+ Add-Type -AssemblyName System.Windows.Forms;
+ $dialog = New-Object System.Windows.Forms.SaveFileDialog;
+ $dialog.FileName = '${safeName}.${format}';
+ $dialog.Filter = '${format.toUpperCase()} Dateien (*.${format})|*.${format}|Alle Dateien (*.*)|*.*';
+ $dialog.Title = 'Dokument speichern als';
+ $result = $dialog.ShowDialog();
+ if ($result -eq 'OK') { $dialog.FileName }
+ `;
+
+ try {
+ const result = execSync(
+ `powershell -NoProfile -Command "${powershell.replace(/\r?\n/g, ' ')}"`,
+ { encoding: 'utf8' }
+ );
+ return result.trim() || null;
+ } catch (err) {
+ if (err.status === 1) return null; // User cancelled
+ throw new Error("Save dialog failed: " + err.message);
+ }
+ } else {
+ // Linux - zenity oder kdialog
+ try {
+ const result = execSync(
+ `zenity --file-selection --save --confirm-overwrite --filename="${defaultName}.${format}"`,
+ { encoding: 'utf8' }
+ );
+ return result.trim();
+ } catch (err) {
+ try {
+ const result = execSync(
+ `kdialog --getsavefilename . "${defaultName}.${format}"`,
+ { encoding: 'utf8' }
+ );
+ return result.trim();
+ } catch (err2) {
+ // Fallback
+ return path.join(os.homedir(), 'Downloads', `${defaultName}.${format}`);
+ }
+ }
+ }
+}
+
+const module_exports = {
+ name: "htmlDocumentConverter",
+ type: "converter",
+ displayname: "HTML Document Converter",
+ description: "Converts LLM-generated HTML to PDF, DOCX, TXT, or HTML",
+
+ /**
+ * Main conversion function
+ * @param {Object} options
+ * @param {string} options.inputPath - Path to the HTML input
+ * @param {string} options.format - 'pdf' | 'docx' | 'html' | 'txt'
+ * @param {string} [options.outputName] - Optional output filename (without extension)
+ * @param {boolean} [options.showDialog] - Show save dialog (default: false in module mode, true in CLI mode)
+ */
+ async convert({ inputPath, format = 'pdf', outputName, showDialog = false }) {
+ if (!fs.existsSync(inputPath)) {
+ throw new Error(`Input file not found: ${inputPath}`);
+ }
+
+ const ext = path.extname(inputPath).toLowerCase();
+ const baseName = outputName || path.basename(inputPath, ext);
+
+ let outputFile;
+
+ if (showDialog) {
+ // Zeige nativen Dialog
+ outputFile = await showSaveDialog(baseName, format);
+ if (!outputFile) {
+ console.log('Speichervorgang abgebrochen.');
+ return null;
+ }
+ } else {
+ // Nutze Standard-Ausgabeverzeichnis
+ outputFile = path.join(outputDir, `${baseName}.${format.toLowerCase()}`);
+ }
+
+ let htmlContent = fs.readFileSync(inputPath, 'utf8');
+
+ // Remove
tags if present
+ htmlContent = htmlContent.replace(/[\s\S]*?<\/think>/gi, '');
+
+ switch (format.toLowerCase()) {
+ case 'html':
+ fs.writeFileSync(outputFile, htmlContent, 'utf8');
+ break;
+ case 'pdf':
+ await this.htmlToPDF(htmlContent, outputFile);
+ break;
+ case 'docx':
+ await this.htmlToDOCX(htmlContent, outputFile);
+ break;
+ case 'txt':
+ fs.writeFileSync(outputFile, this.htmlToTXT(htmlContent), 'utf8');
+ break;
+ default:
+ throw new Error(`Unsupported format: ${format}`);
+ }
+
+ console.log(`Erfolgreich gespeichert: ${outputFile}`);
+ return outputFile;
+ },
+
+ // HTML → PDF
+ async htmlToPDF(html, outputPath) {
+ const browser = await puppeteer.launch({
+ headless: true,
+ args: ['--no-sandbox', '--disable-setuid-sandbox']
+ });
+ const page = await browser.newPage();
+ await page.setContent(html, { waitUntil: 'networkidle0' });
+ await page.pdf({
+ path: outputPath,
+ format: 'A4',
+ printBackground: true,
+ margin: { top: '20mm', right: '20mm', bottom: '20mm', left: '20mm' }
+ });
+ await browser.close();
+ },
+
+ // HTML → DOCX
+ async htmlToDOCX(html, outputPath) {
+ const buffer = await htmlToDocx(html);
+ fs.writeFileSync(outputPath, buffer);
+ },
+
+ // HTML → TXT (rudimentär)
+ htmlToTXT(html) {
+ return html.replace(/<[^>]*>/g, '').replace(/\s+\n/g, '\n').trim();
+ }
+};
+
+module.exports = module_exports;
+
+// CLI usage mit Dialog
+if (require.main === module) {
+ (async () => {
+ const args = process.argv.slice(2);
+ if (args.length < 1) {
+ console.log('Usage: node htmlDocumentConverter.js [format]');
+ console.log('Formats: pdf (default), docx, html, txt');
+ console.log('');
+ console.log('Ein nativer "Speichern unter" Dialog wird automatisch geöffnet.');
+ process.exit(1);
+ }
+
+ const inputPath = args[0];
+ const format = args[1] || 'pdf';
+
+ try {
+ await module_exports.convert({
+ inputPath,
+ format,
+ showDialog: true
+ });
+ } catch (err) {
+ console.error('Konvertierung fehlgeschlagen:', err.message);
+ process.exit(1);
+ }
+ })();
+}
\ No newline at end of file
diff --git a/services/modules/extraction/ffmpegExtractor.js b/services/modules/extraction/ffmpegExtractor.js
index 2f00b15..c91eacf 100644
--- a/services/modules/extraction/ffmpegExtractor.js
+++ b/services/modules/extraction/ffmpegExtractor.js
@@ -24,17 +24,11 @@ module.exports = {
outputType: String // Audio file output format
}
*/
- let progressBar = new cliProgress.SingleBar({
- format: 'Processing |{bar}| {percentage}% | {timemark}',
- barCompleteChar: '\u2588',
- barIncompleteChar: '\u2591',
- hideCursor: true
- });
try {
return new Promise((resolve, reject) => {
- this.extractAudioFromVideo(parameter.inputVideoPath, progressBar, parameter.outputType)
+ this.extractAudioFromVideo(parameter.inputVideoPath, parameter.outputType)
.then((resp) => resolve(resp))
- .catch((err) => console.error(err));
+ .catch((err) => {reject(err)});
})
} catch (error) {
console.log(parameter.outputType);
@@ -52,7 +46,7 @@ module.exports = {
* - Shows CLI progress bar
* - Handles errors gracefully (without errors)
*/
- extractAudioFromVideo: async function (videoFilePath, progressBar, outputType){
+ extractAudioFromVideo: async function (videoFilePath, outputType){
let inputVideoName = path.basename(videoFilePath, path.extname(videoFilePath));
let outputAudioPath = path.join(outputDir, `${inputVideoName}.${outputType}`);
@@ -63,28 +57,17 @@ module.exports = {
// .audioCodec('pcm_s16le')
.audioChannels(1)
.audioFrequency(16000)
- // .setFfmpegPath("./ffmpeg.exe")
- .on('progress', (progress) => {
- if (!progressBar.isActive) progressBar.start(100, 0, { timemark: '00:00:00' });
- if (progress.percent) {
- progressBar.update(progress.percent, { timemark: progress.timemark });
- }
- })
.on('end', () => {
- progressBar.update(100, { timemark: 'done' });
- progressBar.stop();
- console.log(`Extraction completed: ${outputAudioPath}`);
resolve(outputAudioPath);
})
.on('error', (err) => {
- progressBar.stop();
- console.error(`failed_audio_extraction on type ${outputType}: ${err.message}`);
+ // console.error(`failed_audio_extraction on type ${outputType}: ${err.message}`);
reject(err);
})
.save(outputAudioPath);
} catch (error) {
- console.log();
+ // console.log(error);
}
});
}
diff --git a/services/modules/jsonTools/transcriptionSummarizer.js b/services/modules/jsonTools/transcriptionSummarizer.js
index 745c5b7..1be34a3 100644
--- a/services/modules/jsonTools/transcriptionSummarizer.js
+++ b/services/modules/jsonTools/transcriptionSummarizer.js
@@ -21,30 +21,36 @@ module.exports = {
const raw = fs.readFileSync(args.jsonPath, "utf-8");
inputJson = JSON.parse(raw);
} catch (e) {
- console.error("Failed to load JSON from file:", e);
- return { error: "Could not read JSON from file path." };
+ // console.error("Failed to load JSON from file:", e);
+ reject(e)
+ return
}
}
// JSON parsen
if (typeof args === "string") {
try {
- await new Promise((res) => {
+ await new Promise((res, rej) => {
fs.readFile(args, 'utf8', function (err, data) {
- if (err) throw err;
+ if (err){
+ rej(err)
+ return
+ }
inputJson = JSON.parse(data);
res()
});
})
} catch (e) {
- console.log("Invalid JSON in summarize-transcription");
- console.log(e)
- return { error: "Invalid JSON" };
+ // console.log("Invalid JSON in summarize-transcription");
+ // console.log(e)
+ reject(e)
+ return
}
}
const words = inputJson.words;
if (!Array.isArray(words)) {
- return { error: "No words Array found" };
+ reject("No words Array found")
+ return
}
const ENDINGS = [".", "!", "?"]; // '...' auch als Satzende ?
@@ -136,11 +142,11 @@ module.exports = {
const txtPath = path.join(outputDir, "transcription_result.txt");
fs.writeFileSync(txtPath, output.join("\n"), "utf-8");
- console.log(`Summary successfully saved:\n- ${jsonPath}\n- ${txtPath}`);
+ // console.log(`Summary successfully saved:\n- ${jsonPath}\n- ${txtPath}`);
resolve(jsonPath);
} catch (err) {
- console.error("Error saving Summary:", err);
+ // console.error("Error saving Summary:", err);
reject(err);
}
})
diff --git a/services/modules/jsonTools/transcriptionSummarizer2.js b/services/modules/jsonTools/transcriptionSummarizer2.js
index 60d0bb8..aefe70c 100644
--- a/services/modules/jsonTools/transcriptionSummarizer2.js
+++ b/services/modules/jsonTools/transcriptionSummarizer2.js
@@ -32,29 +32,35 @@ module.exports = {
inputJson = JSON.parse(raw);
} catch (e) {
console.error("Failed to load JSON from file:", e);
- return { error: "Could not read JSON from file path." };
+ reject("Could not read JSON from file path.")
+ return
}
}
// JSON parsen
- if (typeof args === "string") {
- try {
- await new Promise((res) => {
- fs.readFile(args, 'utf8', function (err, data) {
- if (err) throw err;
- inputJson = JSON.parse(data);
- res()
- });
- })
- } catch (e) {
- console.log("Invalid JSON in summarize-transcription");
- console.log(e)
- return { error: "Invalid JSON" };
- }
+ if (typeof args === "string") {
+ try {
+ await new Promise((res, rej) => {
+ fs.readFile(args, 'utf8', function (err, data) {
+ if (err){
+ rej(err)
+ return
+ }
+ inputJson = JSON.parse(data);
+ res()
+ });
+ })
+ } catch (e) {
+ // console.log("Invalid JSON in summarize-transcription");
+ // console.log(e)
+ reject(e)
+ return
}
+ }
const words = inputJson.words;
if (!Array.isArray(words)) {
- return { error: "No words Array found" };
+ reject("No words Array found")
+ return;
}
const ENDINGS = [".", "!", "?"]; // '...' auch als Satzende ?
@@ -70,7 +76,7 @@ module.exports = {
if (!currentSpeaker) currentSpeaker = w.speaker;
if (startTime === null) startTime = w.start;
endTime = w.end;
-
+
//speaker changing
if (currentSpeaker !== w.speaker && currentSentence) {
result.push({
@@ -132,10 +138,10 @@ module.exports = {
const txtPath = path.join(outputDir, `${filename}-${new Date().getTime()}.txt`);
fs.writeFileSync(txtPath, output.join("\n"), "utf-8");
- console.log(`Summary successfully saved:\n- ${jsonPath}\n- ${txtPath}`);
+ // console.log(`Summary successfully saved:\n- ${jsonPath}\n- ${txtPath}`);
resolve(jsonPath);
} catch (err) {
- console.error("Error saving Summary:", err);
+ // console.error("Error saving Summary:", err);
reject(err);
}
})
diff --git a/services/modules/llm-chat_gpt/chatgpt.js b/services/modules/llm-chat_gpt/chatgpt.js
index 8446af5..93b9746 100644
--- a/services/modules/llm-chat_gpt/chatgpt.js
+++ b/services/modules/llm-chat_gpt/chatgpt.js
@@ -1,8 +1,137 @@
-module.exports = {
- name:"chatgpt", // Unique name for our function that will later be used to get the function from the map via "mapFunctions.get("example").function()"
- type:"llm", // value used to differentiate each module to order them in the UI
- displayname:"ChatGPT", // The displayname used within the UI
- async function(parameter){
- // TODO add code to actually send the transcript to ChatGPT and get a response back
+// const fs = require('fs');
+// const path = require('path');
+
+const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory
+
+if (!fs.existsSync(outputDir)) {
+ fs.mkdirSync(outputDir, { recursive: true }); // Create output directory if it doesn't exist
+}
+
+// Ensure SAIA API key is set in environment variables: export SAIA_API_KEY="your_api_key_here"
+const SAIA_API_KEY = process.env.SAIA_API_KEY; // Ensure SAIA API key is set in environment variables
+const SAIA_URL = "https://chat-ai.academiccloud.de/v1/chat/completions"; // URL for the REST call, used model and action
+
+const module_exports = {
+ name: "llm-saia_openai_gpt",
+ type: "llm",
+ displayname: "GPT 120B",
+ description: "Generates documents using OpenAI GPT OSS 120B via SAIA platform",
+
+ async function(parameter) {
+ return new Promise(async (resolve, reject) => {
+ try {
+ // console.log("SAIA OpenAI GPT module invoked with parameters:", parameter);
+
+ resolve(await this.createDocumentFromTranscript( //Call the function to create document with transcript, document type and language
+ parameter.inputTranscriptPath, // Path to input transcript file
+ parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user
+ parameter.language // Language for the document which is chosen in the front end by the user
+ ));
+
+ } catch (error) {
+ // console.error("Error in SAIA OpenAI GPT module:", error);
+ reject(error)
+ }
+ })
+
+ },
+
+ createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English
+ return new Promise(async(resolve, reject) => {
+ try {
+ const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path
+ const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path
+ const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed
+
+ // return
+ // --- REST CALL ---
+ const response = await fetch(SAIA_URL, { //safe model response in variable
+ method: "POST",
+ headers: {
+ "Authorization": `Bearer ${SAIA_API_KEY}`,
+ "Accept": "application/json",
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ model: "openai-gpt-oss-120b",
+ messages: [
+ { role: "system", content: "You are a helpful assistant that generates HTML documents from transcripts. Output only valid HTML content without any preamble, explanations, or markdown formatting." },
+ { role: "user", content: promptText }
+ ],
+ temperature: 0
+ })
+ });
+
+ if (!response.ok) { //ok is true when a responce was successfull
+ const text = await response.text();
+ throw new Error(`SAIA API error (${response.status}): ${text}`);
+ }
+
+ const data = await response.json();
+
+ // Get generated text from response or default to empty string (if null)
+ // SAIA uses OpenAI-compatible structure: data.choices[x].message.content
+ const output = data.choices?.[0]?.message?.content || "";
+ let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file
+ // console.log(inputTranscriptName);
+ const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name
+ fs.writeFileSync(outPath, output, "utf8"); // Write output to file
+
+ // console.log("Generated document written to:", outPath);
+ resolve(outPath)
+
+ } catch (error) {
+ // console.error("Error generating SAIA content:", error);
+ reject(error)
+ }
+ })
}
+};
+
+module.exports = module_exports;
+
+// CLI Mode: Allow direct execution
+if (require.main === module) {
+ (async () => {
+ const args = process.argv.slice(2);
+
+ if (args.length < 2) {
+ console.error("Usage: node llm-openai-gpt.js [language]");
+ console.error("Example: node llm-openai-gpt.js ./transcript.json ./docType.txt de");
+ process.exit(1);
+ }
+
+ const [transcriptPath, documentTypePath, language] = args;
+
+ // Check if API key is set
+ if (!SAIA_API_KEY) {
+ console.error("ERROR: SAIA_API_KEY environment variable is not set!");
+ console.error("Please set it with: export SAIA_API_KEY='your_api_key_here'");
+ process.exit(1);
+ }
+
+ // Check if files exist
+ if (!fs.existsSync(transcriptPath)) {
+ console.error(`ERROR: Transcript file not found: ${transcriptPath}`);
+ process.exit(1);
+ }
+
+ if (!fs.existsSync(documentTypePath)) {
+ console.error(`ERROR: Document type file not found: ${documentTypePath}`);
+ process.exit(1);
+ }
+
+ console.log("Starting document generation...");
+ console.log(`Transcript: ${transcriptPath}`);
+ console.log(`Document Type: ${documentTypePath}`);
+ console.log(`Language: ${language || 'en (default)'}`);
+
+ await module_exports.createDocumentFromTranscript(
+ transcriptPath,
+ documentTypePath,
+ language || 'en'
+ );
+
+ console.log("Done!");
+ })();
}
\ No newline at end of file
diff --git a/services/modules/llm-gemini/gemini.js b/services/modules/llm-gemini/gemini.js
index 6bd88a6..beff750 100644
--- a/services/modules/llm-gemini/gemini.js
+++ b/services/modules/llm-gemini/gemini.js
@@ -1,76 +1,134 @@
-const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory
+const fs = require('fs');
+const path = require('path');
+
+const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true }); // Create output directory if it doesn't exist
}
// Ensure Google API key is set in environment variables: export GOOGLE_API_KEY="your_api_key_here"
-
const GEMINI_API_KEY = process.env.GOOGLE_API_KEY; // Ensure Google API key is set in environment variables: export GOOGLE_API_KEY="your_api_key_here"
-const GEMINI_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent"; //URL for the REST call, used model and action
+const GEMINI_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent"; // URL for the REST call, used model and action
-module.exports = {
+const module_exports = {
name: "llm-gemini",
type: "llm",
displayname: "Gemini LLM",
description: "Generates documents using Google Gemini LLM",
async function(parameter) {
- try {
- console.log("Gemini LLM module invoked with parameters:", parameter);
+ return new Promise(async (resolve, reject) => {
+ try {
+ // console.log("Gemini LLM module invoked with parameters:", parameter);
- await this.createDocumentFromTranscript( //Call the function to create document with transcript, document type and language
- parameter.inputTranscriptPath, // Path to input transcript file
- parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user
- parameter.language // Language for the document which is chosen in the front end by the user
- );
+ resolve(await this.createDocumentFromTranscript( //Call the function to create document with transcript, document type and language
+ parameter.inputTranscriptPath, // Path to input transcript file
+ parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user
+ parameter.language // Language for the document which is chosen in the front end by the user
+ ));
+
+ } catch (error) {
+ // console.error("Error in Gemini LLM module:", error);
+ reject(error)
+ }
+ })
- } catch (error) {
- console.error("Error in Gemini LLM module:", error);
- }
},
createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English
- try {
- const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path
- const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path
- const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed
+ return new Promise(async(resolve, reject) => {
+ try {
+ const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path
+ const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path
+ const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed
- // --- REST CALL ---
- const response = await fetch(`${GEMINI_URL}?key=${GEMINI_API_KEY}`, { //safe model response in variable
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify({
- contents: [
- {
- parts: [
- { text: promptText } // Input prompt for content generation
- ]
- }
- ]
- })
- });
+ // --- REST CALL ---
+ const response = await fetch(`${GEMINI_URL}?key=${GEMINI_API_KEY}`, { //safe model response in variable
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ contents: [
+ {
+ parts: [
+ { text: promptText } // Input prompt for content generation
+ ]
+ }
+ ]
+ })
+ });
- if (!response.ok) { //ok is true when a responce was successfull
- const text = await response.text();
- throw new Error(`Gemini API error (${response.status}): ${text}`);
+ if (!response.ok) { //ok is true when a responce was successfull
+ const text = await response.text();
+ throw new Error(`Gemini API error (${response.status}): ${text}`);
+ }
+
+ const data = await response.json();
+
+ // Get generated text from response or default to empty string (if null)
+ const output = data?.candidates?.[0]?.content?.parts?.[0]?.text || "";
+ let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file
+ // console.log(inputTranscriptName);
+ const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name
+ fs.writeFileSync(outPath, output, "utf8"); // Write output to file
+
+ // console.log("Generated document written to:", outPath);
+ resolve(outPath)
+
+ } catch (error) {
+ // console.error("Error generating Gemini content:", error);
+ reject(error)
}
-
- const data = await response.json();
-
- // Get generated text from response or default to empty string (if null)
- const output = data?.candidates?.[0]?.content?.parts?.[0]?.text || "";
- let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file
- console.log(inputTranscriptName);
- const outPath = path.join(outputDir, `${inputTranscriptName}.md`); // Output file path & name to make naming dynamic. Pulled from input transcript name
- fs.writeFileSync(outPath, output, "utf8"); // Write output to file
-
- console.log("Generated document written to:", outPath);
-
- } catch (error) {
- console.error("Error generating Gemini content:", error);
- }
+ })
}
-};
\ No newline at end of file
+};
+
+module.exports = module_exports;
+
+// CLI Mode: Allow direct execution
+if (require.main === module) {
+ (async () => {
+ const args = process.argv.slice(2);
+
+ if (args.length < 2) {
+ console.error("Usage: node llm-gemini.js [language]");
+ console.error("Example: node llm-gemini.js ./transcript.json ./docType.txt de");
+ process.exit(1);
+ }
+
+ const [transcriptPath, documentTypePath, language] = args;
+
+ // Check if API key is set
+ if (!GEMINI_API_KEY) {
+ console.error("ERROR: GOOGLE_API_KEY environment variable is not set!");
+ console.error("Please set it with: export GOOGLE_API_KEY='your_api_key_here'");
+ process.exit(1);
+ }
+
+ // Check if files exist
+ if (!fs.existsSync(transcriptPath)) {
+ console.error(`ERROR: Transcript file not found: ${transcriptPath}`);
+ process.exit(1);
+ }
+
+ if (!fs.existsSync(documentTypePath)) {
+ console.error(`ERROR: Document type file not found: ${documentTypePath}`);
+ process.exit(1);
+ }
+
+ console.log("Starting document generation...");
+ console.log(`Transcript: ${transcriptPath}`);
+ console.log(`Document Type: ${documentTypePath}`);
+ console.log(`Language: ${language || 'en (default)'}`);
+
+ await module_exports.createDocumentFromTranscript(
+ transcriptPath,
+ documentTypePath,
+ language || 'en'
+ );
+
+ console.log("Done!");
+ })();
+}
\ No newline at end of file
diff --git a/services/modules/quen3/qwen3.js b/services/modules/quen3/qwen3.js
new file mode 100644
index 0000000..0bc913a
--- /dev/null
+++ b/services/modules/quen3/qwen3.js
@@ -0,0 +1,136 @@
+const fs = require('fs');
+const path = require('path');
+
+const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory
+
+if (!fs.existsSync(outputDir)) {
+ fs.mkdirSync(outputDir, { recursive: true }); // Create output directory if it doesn't exist
+}
+
+// Ensure SAIA API key is set in environment variables: export SAIA_API_KEY="your_api_key_here"
+const SAIA_API_KEY = process.env.SAIA_API_KEY;
+const SAIA_URL = "https://chat-ai.academiccloud.de/v1/chat/completions"; // URL for the REST call, used model and action
+
+const module_exports = {
+ name: "qwen3-235b-a22b",
+ type: "llm",
+ displayname: "QWEN 3 235B",
+ description: "Generates documents using QWEN 3 235B via SAIA platform",
+
+ async function(parameter) {
+ return new Promise(async (resolve, reject) => {
+ try {
+ // console.log("SAIA QWEN 3 235B module invoked with parameters:", parameter);
+
+ resolve(await this.createDocumentFromTranscript( //Call the function to create document with transcript, document type and language
+ parameter.inputTranscriptPath, // Path to input transcript file
+ parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user
+ parameter.language // Language for the document which is chosen in the front end by the user
+ ));
+
+ } catch (error) {
+ // console.error("Error in SAIA QWEN 3 235B module:", error);
+ reject(error)
+ }
+ })
+
+ },
+
+ createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English
+ return new Promise(async(resolve, reject) => {
+ try {
+ const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path
+ const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path
+ const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed
+
+ // --- REST CALL ---
+ const response = await fetch(SAIA_URL, { //safe model response in variable
+ method: "POST",
+ headers: {
+ "Authorization": `Bearer ${SAIA_API_KEY}`,
+ "Accept": "application/json",
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ model: "qwen3-235b-a22b",
+ messages: [
+ { role: "system", content: "You are a helpful assistant that generates HTML documents from transcripts. Output only valid HTML content without any preamble, explanations, or markdown formatting." },
+ { role: "user", content: promptText }
+ ],
+ temperature: 0
+ })
+ });
+
+ if (!response.ok) { //ok is true when a responce was successfull
+ const text = await response.text();
+ throw new Error(`SAIA API error (${response.status}): ${text}`);
+ }
+
+ const data = await response.json();
+
+ // Get generated text from response or default to empty string (if null)
+ // SAIA uses OpenAI-compatible structure: data.choices[x].message.content
+ const output = data.choices?.[0]?.message?.content || "";
+ let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file
+ // console.log(inputTranscriptName);
+ const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name
+ fs.writeFileSync(outPath, output, "utf8"); // Write output to file
+
+ // console.log("Generated document written to:", outPath);
+ resolve(outPath)
+
+ } catch (error) {
+ // console.error("Error generating SAIA content:", error);
+ reject(error)
+ }
+ })
+ }
+};
+
+module.exports = module_exports;
+
+// CLI Mode: Allow direct execution
+if (require.main === module) {
+ (async () => {
+ const args = process.argv.slice(2);
+
+ if (args.length < 2) {
+ console.error("Usage: node qwen3.js [language]");
+ console.error("Example: node qwen3.js ./transcript.json ./docType.txt de");
+ process.exit(1);
+ }
+
+ const [transcriptPath, documentTypePath, language] = args;
+
+ // Check if API key is set
+ if (!SAIA_API_KEY) {
+ console.error("ERROR: SAIA_API_KEY environment variable is not set!");
+ console.error("Please set it with: export SAIA_API_KEY='your_api_key_here'");
+ process.exit(1);
+ }
+
+ // Check if files exist
+ if (!fs.existsSync(transcriptPath)) {
+ console.error(`ERROR: Transcript file not found: ${transcriptPath}`);
+ process.exit(1);
+ }
+
+ if (!fs.existsSync(documentTypePath)) {
+ console.error(`ERROR: Document type file not found: ${documentTypePath}`);
+ process.exit(1);
+ }
+
+ console.log("Starting document generation...");
+ console.log(`Transcript: ${transcriptPath}`);
+ console.log(`Document Type: ${documentTypePath}`);
+ console.log(`Language: ${language || 'en (default)'}`);
+
+ await module_exports.createDocumentFromTranscript(
+ transcriptPath,
+ documentTypePath,
+ language || 'en'
+ );
+
+ console.log("Done!");
+ })();
+}
\ No newline at end of file
diff --git a/services/modules/transcription-local/whisper.cpp b/services/modules/transcription-local/whisper.cpp
new file mode 160000
index 0000000..999a7e0
--- /dev/null
+++ b/services/modules/transcription-local/whisper.cpp
@@ -0,0 +1 @@
+Subproject commit 999a7e0cbf8484dc2cea1e9f855d6b39f34f7ae9
diff --git a/services/modules/transcription-remote/assembly.js b/services/modules/transcription-remote/assembly.js
index 3b02e4c..442d290 100644
--- a/services/modules/transcription-remote/assembly.js
+++ b/services/modules/transcription-remote/assembly.js
@@ -78,7 +78,7 @@ function saveTranscript(transcript, sessionId) {
const outputPath = path.join(outputDir, `${sessionId}.json`);
fs.writeFileSync(outputPath, JSON.stringify(transcript, null, 2));
- console.log(`Transcript saved: ${outputPath}`);
+ // console.log(`Transcript saved: ${outputPath}`);
return outputPath;
}
@@ -89,6 +89,7 @@ module.exports = {
name: 'assembly',
type: 'transcription',
displayname: 'AssemblyAI',
+ audioformat: "mp3",
async function(audioFileName) {
return new Promise(async (resolve, reject) => {
@@ -115,8 +116,9 @@ module.exports = {
resolve(saveTranscript(transcript, sessionId));
} catch (error) {
- console.error('Transcription error:', error.message);
+ // console.error('Transcription error:', error.message);
reject(error);
+ return
}
})
}
diff --git a/services/modules/utility/@startup.js b/services/modules/utility/@startup.js
index cf6eaf8..09b1ae5 100644
--- a/services/modules/utility/@startup.js
+++ b/services/modules/utility/@startup.js
@@ -1,3 +1,4 @@
+
module.exports = {
name:"Startup_function",
async function(){
@@ -9,6 +10,7 @@ module.exports = {
// let transcript = await mapFunctions.get("assembly").function('../../storage/audio/IMG_2978.wav');
// let summary = await mapFunctions.get("summarize-transcription").function({jsonPath:'/Users/santa/Proj25/video2document/storage/transcripts/IMG_2978.json'});
+ // let snippets = await mapFunctions.get("extract-speaker-snippets").function({audioPath:'/Users/santa/Proj25/video2document/storage/audio/KittyKat.wav', jsonPath1: '/Users/santa/Proj25/video2document/storage/transcriptionSummaries/KittyKat-1765806474958.json' });
diff --git a/start.bat b/start.bat
new file mode 100644
index 0000000..b215b6a
--- /dev/null
+++ b/start.bat
@@ -0,0 +1,23 @@
+@echo off
+cd /d %~dp0
+
+:: Prüfen ob Node.js installiert ist
+where node >nul 2>nul
+if %errorlevel% neq 0 (
+ echo Node.js ist nicht installiert.
+ pause
+ exit /b 1
+)
+
+echo Node.js gefunden:
+node -v
+
+npm install
+if %errorlevel% neq 0 (
+ echo npm install fehlgeschlagen.
+ pause
+ exit /b 1
+)
+
+npm start
+pause
\ No newline at end of file
diff --git a/start.sh b/start.sh
new file mode 100755
index 0000000..d83ac83
--- /dev/null
+++ b/start.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# Prüfen ob Node.js installiert ist
+if ! command -v node >/dev/null 2>&1; then
+ echo "Node.js ist nicht installiert."
+ exit 1
+fi
+
+echo "Node.js gefunden: $(node -v)"
+
+# Abhängigkeiten installieren
+npm install || exit 1
+
+# Projekt starten
+npm start
\ No newline at end of file
diff --git a/storage/.DS_Store b/storage/.DS_Store
new file mode 100644
index 0000000..7cbbcbf
Binary files /dev/null and b/storage/.DS_Store differ
diff --git a/storage/audio/.DS_Store b/storage/audio/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/storage/audio/.DS_Store differ
diff --git a/test/.gitkeep b/storage/documentType/.gitkeep
similarity index 100%
rename from test/.gitkeep
rename to storage/documentType/.gitkeep
diff --git a/storage/documentType/agenda.txt b/storage/documentType/agenda.txt
new file mode 100644
index 0000000..02d4d47
--- /dev/null
+++ b/storage/documentType/agenda.txt
@@ -0,0 +1,26 @@
+Du bist ein erfahrener Moderator und Projektmanager.
+
+AUFGABE:
+Erstelle eine sinnvolle Meeting-Agenda basierend auf dem folgenden Transkript.
+
+ANFORDERUNGEN:
+- Rekonstruiere die tatsächlichen Themenblöcke
+- Ordne sie logisch und chronologisch
+- Fasse ähnliche Diskussionen zusammen
+- Keine irrelevanten Details aufnehmen
+
+STRUKTUR:
+- Titel der Agenda
+- Ziel des Meetings (1–2 Sätze)
+- Agenda-Punkte (nummeriert)
+ - Thema
+ - Kurzbeschreibung
+ - Ziel des Punktes (Information, Entscheidung, Diskussion)
+
+STIL:
+- Klar, kompakt
+- Business-orientiert
+- Keine Sprecher- oder Zeitangaben
+- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
+
+TRANSKRIPT:
diff --git a/storage/documentType/custom_document.txt b/storage/documentType/custom_document.txt
new file mode 100644
index 0000000..58cc983
--- /dev/null
+++ b/storage/documentType/custom_document.txt
@@ -0,0 +1,22 @@
+Du bist ein intelligenter Dokumenten-Generator.
+
+AUFGABE:
+Erstelle ein individuelles Dokument basierend auf:
+1) dem Meeting-Transkript
+2) der zusätzlichen Nutzeranweisung
+
+WICHTIG:
+- Priorisiere die Nutzeranweisung
+- Nutze das Transkript als Wissensquelle
+- Struktur, Tonalität und Detailgrad anpassen
+- Inhalte logisch zusammenführen
+- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
+
+FORMAT:
+- Passe Struktur und Stil an den Nutzerwunsch an
+- Klare Überschriften
+- Keine Sprecher- oder Zeitangaben
+
+TRANSKRIPT & NUTZERANWEISUNG:
+
+
diff --git a/storage/documentType/followup_report.txt b/storage/documentType/followup_report.txt
new file mode 100644
index 0000000..048d05d
--- /dev/null
+++ b/storage/documentType/followup_report.txt
@@ -0,0 +1,45 @@
+Du bist ein professioneller Meeting-Analyst und Business Writer.
+
+AUFGABE:
+Erstelle einen strukturierten Follow-up Report basierend auf dem folgenden Meeting-Transkript.
+
+ANFORDERUNGEN:
+- Fasse Inhalte sinngemäß zusammen
+- Entferne Redundanzen und Smalltalk
+- Formuliere klar, präzise und professionell
+- Verwende neutrale Business-Sprache
+- Keine Zeitstempel oder Sprecher-Namen zitieren
+- Leite Entscheidungen und Aufgaben logisch ab, wenn sie implizit sind
+- Markiere offene Punkte klar
+- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
+
+STRUKTUR DES DOKUMENTS:
+1. Titel & Metadaten
+ - Meetingtitel (ableiten)
+ - Datum (falls im Transkript erwähnt, sonst „nicht angegeben“)
+ - Teilnehmer (zusammengefasst)
+
+2. Executive Summary (max. 5 Bullet Points)
+
+3. Besprochene Themen
+ - Thema
+ - Kernaussagen
+ - Relevante Erkenntnisse
+
+4. Entscheidungen
+ - Entscheidung
+ - Kontext / Begründung
+
+5. Action Items
+ - Aufgabe
+ - Verantwortlich (falls ableitbar)
+ - Ziel / Zweck
+
+6. Offene Fragen & Risiken
+
+STIL:
+- Überschriften klar strukturiert
+- Bullet Points bevorzugen
+- Präzise, keine Umgangssprache
+
+TRANSKRIPT:
diff --git a/storage/documentType/result_protocol.txt b/storage/documentType/result_protocol.txt
new file mode 100644
index 0000000..867289f
--- /dev/null
+++ b/storage/documentType/result_protocol.txt
@@ -0,0 +1,27 @@
+Du bist ein professioneller Protokollführer.
+
+AUFGABE:
+Erstelle ein Ergebnisprotokoll basierend auf dem Meeting-Transkript.
+
+FOKUS:
+- Ergebnisse statt Diskussionen
+- Entscheidungen, Beschlüsse, Vereinbarungen
+- Klare, überprüfbare Aussagen
+
+STRUKTUR:
+1. Meeting-Informationen
+2. Ergebnisse je Thema
+ - Thema
+ - Ergebnis / Beschluss
+3. Entscheidungen
+4. Aufgaben & Verantwortlichkeiten
+5. Offene Punkte
+
+REGELN:
+- Keine Meinungen oder Spekulationen
+- Keine Zeit- oder Sprecherangaben
+- Sachlich, formal
+- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
+
+
+TRANSKRIPT:
diff --git a/storage/documentType/sprint_planning_note.txt b/storage/documentType/sprint_planning_note.txt
new file mode 100644
index 0000000..0193922
--- /dev/null
+++ b/storage/documentType/sprint_planning_note.txt
@@ -0,0 +1,35 @@
+Du bist ein erfahrener Scrum Master.
+
+AUFGABE:
+Erstelle Sprint Planning Notes aus dem folgenden Meeting-Transkript.
+
+FOKUS:
+- Sprint-Ziele
+- User Stories / Tasks
+- Abhängigkeiten
+- Risiken
+- Commitments
+
+STRUKTUR:
+1. Sprint Overview
+ - Sprint-Ziel
+ - Zeitraum (falls erwähnt)
+
+2. Geplante Arbeit
+ - User Story / Task
+ - Beschreibung
+ - Akzeptanzkriterien (falls ableitbar)
+
+3. Abhängigkeiten & Blocker
+
+4. Risiken & Annahmen
+
+5. Vereinbarungen / Team-Commitments
+
+STIL:
+- Agile-konform
+- Klar & umsetzungsorientiert
+- Bullet Points bevorzugen
+- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
+
+TRANSKRIPT:
diff --git a/test/unit/.gitkeep b/storage/documents/.gitkeep
similarity index 100%
rename from test/unit/.gitkeep
rename to storage/documents/.gitkeep
diff --git a/storage/transcriptionSummaries/.gitkeep b/storage/transcriptionSummaries/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/test/test_health.py b/test/test_health.py
deleted file mode 100644
index 7b088a7..0000000
--- a/test/test_health.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from fastapi.testclient import TestClient
-from app.main import app
-
-client = TestClient(app)
-
-def test_health():
- response = client.get("/health")
- assert response.status_code == 200
diff --git a/test/unit/test.js b/test/unit/test.js
new file mode 100644
index 0000000..b5c12ee
--- /dev/null
+++ b/test/unit/test.js
@@ -0,0 +1,243 @@
+// DO NOT TOUCH THIS
+require("../../requires.js")
+
+mapFunctions = new Map()
+// Loading the Function Map
+var path = `${mainDir}/services/modules`
+var folders = fs.readdirSync(path).filter(function (file) {
+ return fs.statSync(path+'/'+file).isDirectory();
+});
+folders.forEach(element => {
+ var commandFiles = fs.readdirSync(`${path}/${element}`).filter(file => file.endsWith('.js') && !file.startsWith("index"));
+ for (const file of commandFiles) {
+ delete require.cache[require.resolve(`${path}/${element}/${file}`)];
+ const command = require(`${path}/${element}/${file}`);
+ mapFunctions.set(command.name, command);
+ }
+});
+// You can touch beyond this point
+
+let audiopath
+let transcriptPath
+let summarizePath
+let llmpath
+let speakers
+
+describe("Unit Tests", function() {
+
+ describe('Audio Extraction', function () {
+ this.slow(1000)
+ this.timeout(3000)
+ it('Extract .mp4 to .mp3', function (done) {
+
+ mapFunctions.get("extraction-video-to-audio").function({inputVideoPath: __dirname.replaceAll("\\","/")+"/testvideo.mp4", outputType: "mp3"}).then(resp => {
+ audiopath = resp
+ // console.log(resp);
+ done()
+ }).catch(err => {
+ done(err);
+ })
+ })
+ it('Extract .mp4 to .flac', function (done) {
+
+ mapFunctions.get("extraction-video-to-audio").function({inputVideoPath: __dirname.replaceAll("\\","/")+"/testvideo.mp4", outputType: "flac"}).then(resp => {
+ // console.log(resp);
+ done()
+ }).catch(err => {
+ done(err);
+ })
+ })
+ it('Extracting to a nonexistant format', function (done) {
+
+ mapFunctions.get("extraction-video-to-audio").function({inputVideoPath: __dirname.replaceAll("\\","/")+"/testvideo.mp4", outputType: "qqq"}).then(resp => {
+ // console.log(resp);
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ it('Extracting from nonexistant file', function (done) {
+
+ mapFunctions.get("extraction-video-to-audio").function({inputVideoPath: "a", outputType: "mp3"}).then(resp => {
+ // console.log(resp);
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ it('Extracting from nonexistant file to nonexistant format', function (done) {
+
+ mapFunctions.get("extraction-video-to-audio").function({inputVideoPath: "a", outputType: "qqq"}).then(resp => {
+ // console.log(resp);
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ });
+
+
+ describe("Audio Transcription", function() {
+ this.slow(20000)
+ this.timeout(120000)
+
+ it('Assembly', function (done) {
+ mapFunctions.get("assembly").function(audiopath).then(resp => {
+ // console.log(resp);
+ transcriptPath = resp
+ done()
+ }).catch(err => {
+ done(err)
+ })
+ })
+
+ it('Assembly Wrong file', function (done) {
+ mapFunctions.get("assembly").function("a").then(resp => {
+ // console.log(resp);
+ // transcriptPath = resp
+ done("Didnt crash")
+ }).catch(err => {
+ // console.log(err);
+ done()
+ })
+ })
+ // TODO add more Transcription Tool tests here
+ })
+
+ describe("Transcript Summarizer", function() {
+ this.slow(100)
+ this.timeout(1000)
+
+ it("Summarizer 1", function (done){
+ mapFunctions.get("summarize-transcription").function(transcriptPath).then(resp => {
+ done()
+ }).catch(err => {
+ done(err)
+ })
+ })
+
+ it("Summarizer 1 Wrong File", function (done){
+ mapFunctions.get("summarize-transcription").function("a").then(resp => {
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+
+ it("Summarizer 2 (Main)", function (done){
+ mapFunctions.get("summarize-transcription2").function(transcriptPath).then(resp => {
+ summarizePath = resp
+ done()
+ }).catch(err => {
+ done(err)
+ })
+ })
+
+ it("Summarizer 2 (Main) Wrong File", function (done){
+ mapFunctions.get("summarize-transcription2").function("a").then(resp => {
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ })
+
+ describe("Large Language Model", function() {
+ this.slow(30000)
+ this.timeout(120000)
+
+ it("ChatGPT", function (done){
+ mapFunctions.get("llm-saia_openai_gpt").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/followup_report.txt", language: "en"}).then(resp => {
+ llmpath = resp
+ done()
+ }).catch(err => {
+ done(err)
+ })
+ })
+
+
+ it("Gemini", function (done){
+ mapFunctions.get("llm-gemini").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/followup_report.txt", language: "en"}).then(resp => {
+ done()
+ }).catch(err => {
+ if(err.includes("(503)")){done()} // Error 503 is gemini overload, so an Error that they can at any time throw at us which would crash the pipeline, so we just ignore it and we just imagine that the test passed
+ else{
+ console.log(err);
+ done(err)
+ }
+ })
+ })
+
+ it("Qwen3", function (done){
+ mapFunctions.get("qwen3-235b-a22b").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/followup_report.txt", language: "en"}).then(resp => {
+ done()
+ }).catch(err => {
+ done(err)
+ })
+ })
+
+
+ it("ChatGPT (Nonexistant Type File)", function (done){
+ mapFunctions.get("llm-saia_openai_gpt").function({inputTranscriptPath: summarizePath, documentTypePath: "a", language: "en"}).then(resp => {
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ it("Gemini (Nonexistant Type File)", function (done){
+ mapFunctions.get("llm-gemini").function({inputTranscriptPath: summarizePath, documentTypePath: "a", language: "en"}).then(resp => {
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ it("Qwen3 (Nonexistant Type File)", function (done){
+ mapFunctions.get("qwen3-235b-a22b").function({inputTranscriptPath: summarizePath, documentTypePath: "a", language: "en"}).then(resp => {
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ })
+
+ describe("Audio Snippet", function() {
+ this.slow(1000)
+ this.timeout(5000)
+
+ // transcriptPath = "A:\\programing\\@projects\\video2document\\storage\\transcriptionSummaries\\testvideo-1765900665001.json"
+ // audiopath = "A:\\programing\\@projects\\video2document\\storage\\audio\\testvideo.mp3"
+
+
+ it("Audio Snipper Generator", function (done){
+ mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: summarizePath }).then(resp => {
+ speakers = resp
+ done()
+ }).catch(err => {
+ done(err)
+ })
+ })
+
+ it("Audio Snipper Generator (Nonexistant Transcript File)", function (done){
+ mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: "a" }).then(resp => {
+ speakers = resp
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+
+ it("Audio Snipper Generator (Nonexistant Audio File)", function (done){
+ mapFunctions.get("extract-speaker-snippets").function({audioPath: "a", jsonPath: summarizePath }).then(resp => {
+ speakers = resp
+ done("Didnt crash")
+ }).catch(err => {
+ done()
+ })
+ })
+ })
+ after(function() {
+ console.log(`\n\n\n${audiopath} \n${transcriptPath} \n${summarizePath} \n${llmpath}`);
+ })
+})
+
+
diff --git a/test/unit/testvideo.mp4 b/test/unit/testvideo.mp4
new file mode 100644
index 0000000..625a31f
Binary files /dev/null and b/test/unit/testvideo.mp4 differ