Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
d7b8ba8
feat: add sdk robot duplication
RohitR311 Mar 12, 2026
c088514
fix: error handling apikey check
RohitR311 Mar 21, 2026
47fc6dd
fix: add langgraph svg
RohitR311 Mar 21, 2026
de05e41
fix: enforce unique robot names across all creation flows and edit
ritamganguliac Mar 21, 2026
3953c72
fix: address PR review comments for unique robot names
ritamganguliac Mar 21, 2026
833ece5
fix: address remaining coderabbit review comments
ritamganguliac Mar 21, 2026
95f40ff
fix(recorder): auto-discard recording session after 10-minute timeout
ritamganguliac Mar 22, 2026
ae7c322
fix(recorder): clear recording state on timeout in RecordingPage
ritamganguliac Mar 22, 2026
f88cc70
feat: add status check route sdk
RohitR311 Mar 24, 2026
dfaf56f
fix: outpuit display scrape
RohitR311 Mar 24, 2026
36e51b5
fix: specify out formats
RohitR311 Mar 24, 2026
1ee88ea
Merge pull request #1011 from getmaxun/icon-fix
amhsirak Mar 24, 2026
7d74d4a
Merge pull request #1012 from getmaxun/add-status
amhsirak Mar 24, 2026
d0e3048
Merge pull request #999 from ritam1303/fix/recording-session-timeout
amhsirak Mar 24, 2026
f929799
fix: sdk doc link path
RohitR311 Mar 24, 2026
2a4cde8
fix: duplicate field naming capture data
RohitR311 Mar 24, 2026
4d6e934
Merge pull request #998 from ritam1303/master
amhsirak Mar 24, 2026
64a16f6
Merge pull request #1005 from getmaxun/sdk-dup
amhsirak Mar 24, 2026
a5eb9b8
Merge pull request #1010 from getmaxun/key-fix
amhsirak Mar 24, 2026
e6ad87e
Merge pull request #1014 from getmaxun/doc-sdk
amhsirak Mar 24, 2026
1009b64
Merge pull request #1015 from getmaxun/field-fix
amhsirak Mar 24, 2026
902ca49
chore: v0.0.36
amhsirak Mar 24, 2026
3c173c0
Merge pull request #1016 from getmaxun/pre-release-36
RohitR311 Mar 24, 2026
496febc
chore: add maxun cli
amhsirak Mar 25, 2026
eb414ee
chore(ts): browserId type string | null
amhsirak Mar 26, 2026
3bfe837
feat(ts): add httpExecution to CreateRunResponse
amhsirak Mar 26, 2026
3077b1e
fix: add optimistic run
RohitR311 Mar 26, 2026
bcfcaad
Added Output Format Selection to Crawl and Search Robots
Rutetid Mar 21, 2026
61e42b8
Applied suggested fix by coderabbit
Rutetid Mar 21, 2026
3d1300b
feat: enhance screenshot tab accessibility with dynamic IDs
Rutetid Mar 21, 2026
c26f94f
Applied the Required changes
Rutetid Mar 29, 2026
2443007
applied all fixes
Rutetid Mar 29, 2026
cb54a6f
fixed issue with search robot
Rutetid Mar 29, 2026
bd818a5
Merge pull request #1009 from Rutetid/feat/Add-Output-Format-Selectio…
amhsirak Mar 30, 2026
7428cd1
feat: add cli
amhsirak Apr 2, 2026
97c8022
feat: cli icon
amhsirak Apr 2, 2026
6c3fb85
fix: move sdk tab above cli
amhsirak Apr 2, 2026
349034b
fix: tab font 15ox
amhsirak Apr 2, 2026
fd5e0e9
fix: match tabs
amhsirak Apr 2, 2026
38a3a6b
feat: use Dialog instead of GenericModal
amhsirak Apr 2, 2026
2d01f66
chore: lint
amhsirak Apr 2, 2026
f7a84bf
chore: lint
amhsirak Apr 2, 2026
110ef9c
fix: color error
amhsirak Apr 2, 2026
3d394b1
fix: remove outlined
amhsirak Apr 2, 2026
1979fa9
fix: remove custom fontweight
amhsirak Apr 2, 2026
59ec403
feat: replace generic modal w dialog
amhsirak Apr 2, 2026
c1e885a
chore: lint
amhsirak Apr 2, 2026
ba6ac59
feat: replace generic modal w dialog
amhsirak Apr 2, 2026
255811b
chore: lint
amhsirak Apr 2, 2026
06da90a
fix: re-arrange order of buttons
amhsirak Apr 2, 2026
5e18920
fix: border none
amhsirak Apr 2, 2026
1411c3c
feat: replace generic modal w dialog
amhsirak Apr 2, 2026
119dcbf
chore: cleanup unused imports
amhsirak Apr 2, 2026
f07687e
feat: replace generic modal w dialog
amhsirak Apr 2, 2026
b3a2f9d
feat: replace generic modal w dialog
amhsirak Apr 2, 2026
78e4652
feat: add run status for cli and mcp
RohitR311 Apr 3, 2026
d933533
feat: add translation run status
RohitR311 Apr 3, 2026
dde428d
fix: copy clipboard hosted context
RohitR311 Apr 7, 2026
38bf3a8
fix: add missing i18n translation keys across all locales
smeetagrawal23-sys Apr 9, 2026
78e71d5
feat: add claude code integration
amhsirak Apr 10, 2026
34a8852
fix: ai mode text
amhsirak Apr 10, 2026
933e57f
fix: remove hard coded bgColor
amhsirak Apr 10, 2026
aba46fd
feat: use dialog instead of modal
amhsirak Apr 10, 2026
1152eab
chore: lint
amhsirak Apr 10, 2026
9976f9e
fix: -rm padding
amhsirak Apr 10, 2026
11ba3c7
fix: -rm pb 0
amhsirak Apr 10, 2026
7f70c02
feat: use dialog instead of modal
amhsirak Apr 10, 2026
e1bb740
chore: lint
amhsirak Apr 10, 2026
0083c98
fix: -rm p
amhsirak Apr 10, 2026
2a8f7e7
Merge pull request #1017 from getmaxun/success-fix
amhsirak Apr 10, 2026
a1b2faf
Merge pull request #1019 from getmaxun/cli-menu
amhsirak Apr 10, 2026
82f4d7d
Merge pull request #1022 from getmaxun/run-status
amhsirak Apr 10, 2026
3e15e3f
Merge pull request #1024 from getmaxun/ckey-fix
amhsirak Apr 10, 2026
f5a479b
Merge branch 'develop' into sync-del-conf
RohitR311 Apr 10, 2026
119c201
Merge pull request #1020 from getmaxun/sync-del-conf
amhsirak Apr 10, 2026
46554d2
Merge branch 'develop' into fix/missing-i18n-translations
RohitR311 Apr 10, 2026
ac2ea68
Merge pull request #1025 from Smeet23/fix/missing-i18n-translations
amhsirak Apr 10, 2026
e5c4668
chore: claude svg
amhsirak Apr 10, 2026
74d55d4
Merge pull request #1028 from getmaxun/claude-skill
amhsirak Apr 10, 2026
60f0f50
Merge branch 'develop' into ui-changes
RohitR311 Apr 10, 2026
6442159
Merge pull request #1029 from getmaxun/ui-changes
amhsirak Apr 10, 2026
b475e76
chore: release v0.0.37
amhsirak Apr 10, 2026
251555d
fix: rm duplicate code block
RohitR311 Apr 10, 2026
926cdc1
feat: add openclaw integration
RohitR311 Apr 10, 2026
d9bfe54
fix: ignore deprecation
RohitR311 Apr 10, 2026
758bc57
Merge pull request #1030 from getmaxun/pre-release-37
RohitR311 Apr 10, 2026
214ac55
chore: rm ignore deprecation
RohitR311 Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ It supports extraction, crawling, scraping, and search — designed to scale fro
2. **[Scrape](https://docs.maxun.dev/robot/scrape/scrape-robots)** – Convert full webpages into clean Markdown or HTML and capture screenshots.
3. **[Crawl](https://docs.maxun.dev/robot/crawl/crawl-introduction)** – Crawl entire websites and extract content from every relevant page, with full control over scope and discovery.
4. **[Search](https://docs.maxun.dev/robot/search/search-introduction)** – Run automated web searches to discover or scrape results, with support for time-based filters.
5. **[SDK](https://docs.maxun.dev/sdk/sdk-overview)** – A complete developer toolkit for scraping, extraction, scheduling, and end-to-end data automation.
5. **[SDK](https://docs.maxun.dev/category/sdk)** – A complete developer toolkit for scraping, extraction, scheduling, and end-to-end data automation.
6. **[CLI](https://docs.maxun.dev/category/cli)** – Create robots, trigger runs, and retrieve extracted data from your terminal.


## How Does It Work?

Expand Down
7 changes: 6 additions & 1 deletion maxun-core/src/interpret.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2524,7 +2524,12 @@ export default class Interpreter extends EventEmitter {

console.log("REPEAT COUNT", repeatCount);
if (this.options.maxRepeats && repeatCount > this.options.maxRepeats) {
return;

const failedAction = (action?.what?.find((w: any) => w?.action !== 'flag')?.action) || 'unknown';
const maxRepeats = this.options.maxRepeats;
this.log(`Action ${String(failedAction)} exceeded max retries (${maxRepeats})`, Level.ERROR);
cleanup();
throw new Error(`Action ${String(failedAction)} exceeded max retries (${maxRepeats})`);
}
lastAction = action;

Expand Down
32 changes: 26 additions & 6 deletions maxun-core/src/utils/concurrency.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,14 @@ export default class Concurrency {
private jobQueue: Function[] = [];

/**
* "Resolve" callbacks of the waitForCompletion() promises.
* Resolve/reject callbacks of the waitForCompletion() promises.
*/
private waiting: Function[] = [];
private waiting: Array<{ resolve: () => void; reject: (error: Error) => void }> = [];

/**
* First worker error captured during current execution wave.
*/
private firstError: Error | null = null;

/**
* Constructs a new instance of concurrency manager.
Expand All @@ -42,7 +47,11 @@ export default class Concurrency {
// console.debug("Job finished, running the next waiting job...");
this.runNextJob();
}).catch((error) => {
console.error(`Job failed with error: ${error.message}`);
const normalizedError = error instanceof Error ? error : new Error(String(error));
console.error(`Job failed with error: ${normalizedError.message}`);
if (!this.firstError) {
this.firstError = normalizedError;
}
// Continue processing other jobs even if one fails
this.runNextJob();
});
Expand All @@ -51,7 +60,18 @@ export default class Concurrency {
this.activeWorkers -= 1;
if (this.activeWorkers === 0) {
// console.debug("This concurrency manager is idle!");
this.waiting.forEach((x) => x());
const pending = [...this.waiting];
this.waiting = [];
const pendingError = this.firstError;
this.firstError = null;

pending.forEach(({ resolve, reject }) => {
if (pendingError) {
reject(pendingError);
} else {
resolve();
}
});
}
}
}
Expand Down Expand Up @@ -82,8 +102,8 @@ export default class Concurrency {
* @returns Promise, resolved after there is no running/waiting worker.
*/
waitForCompletion(): Promise<void> {
return new Promise((res) => {
this.waiting.push(res);
return new Promise((resolve, reject) => {
this.waiting.push({ resolve, reject });
});
}
}
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "maxun",
"version": "0.0.35",
"version": "0.0.37",
"author": "Maxun",
"license": "AGPL-3.0-or-later",
"dependencies": {
Expand Down Expand Up @@ -88,7 +88,7 @@
"start": "npm run build:server && concurrently -k \"npm run server\" \"npm run client\"",
"server": "cross-env NODE_OPTIONS='--max-old-space-size=4096' node server/dist/server/src/server.js",
"start:dev": "concurrently -k \"npm run server:dev\" \"npm run client\"",
"server:dev": "cross-env NODE_OPTIONS='--max-old-space-size=2048' nodemon server/src/server.ts",
"server:dev": "cross-env NODE_OPTIONS='--max-old-space-size=4096' nodemon server/src/server.ts",
"client": "vite",
"build": "vite build",
"build:server": "tsc -p server/tsconfig.json",
Expand Down
11 changes: 9 additions & 2 deletions public/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@
"errors": {
"user_not_logged": "Benutzer nicht angemeldet. Aufnahme kann nicht gespeichert werden.",
"exists_warning": "Ein Roboter mit diesem Namen existiert bereits, bitte bestätigen Sie das Überschreiben des Roboters.",
"name_exists": "Ein Roboter mit diesem Namen existiert bereits. Bitte wählen Sie einen anderen Namen.",
"no_actions_performed": "Roboter kann nicht gespeichert werden. Bitte führen Sie mindestens eine Erfassungsaktion durch, bevor Sie speichern."
},
"tooltips": {
Expand All @@ -294,7 +295,8 @@
"notifications": {
"terminated": "Aktuelle Aufnahme wurde beendet",
"environment_reset": "Browser-Umgebung wurde zurückgesetzt",
"reset_successful": "Alle Aufnahmen erfolgreich zurückgesetzt und zum Ausgangszustand zurückgekehrt"
"reset_successful": "Alle Aufnahmen erfolgreich zurückgesetzt und zum Ausgangszustand zurückgekehrt",
"timeout_discarded": "Die Aufnahmesitzung ist nach 10 Minuten abgelaufen und wurde automatisch verworfen."
}
},
"interpretation_log": {
Expand Down Expand Up @@ -440,7 +442,8 @@
"warning": "⚠️ Stellen Sie sicher, dass die neue Seite die gleiche Struktur wie die Originalseite hat."
},
"fields": {
"target_url": "Roboter Ziel-URL"
"target_url": "Roboter Ziel-URL",
"new_name": "Roboter-Name"
},
"buttons": {
"duplicate": "Roboter duplizieren",
Expand All @@ -449,6 +452,7 @@
"notifications": {
"robot_not_found": "Roboterdetails konnten nicht gefunden werden. Bitte versuchen Sie es erneut.",
"url_required": "Ziel-URL ist erforderlich.",
"name_required": "Roboter-Name ist erforderlich.",
"duplicate_success": "Roboter erfolgreich dupliziert.",
"duplicate_error": "Fehler beim Aktualisieren der Ziel-URL. Bitte versuchen Sie es erneut.",
"unknown_error": "Beim Aktualisieren der Ziel-URL ist ein Fehler aufgetreten."
Expand Down Expand Up @@ -551,6 +555,9 @@
"manual_run": "Manuelle Ausführung",
"scheduled_run": "Geplante Ausführung",
"api": "API",
"sdk": "SDK",
"mcp": "MCP",
"cli": "CLI",
"unknown_run_type": "Unbekannter Ausführungstyp"
},
"run_status_chips": {
Expand Down
10 changes: 8 additions & 2 deletions public/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@
"errors": {
"user_not_logged": "User not logged in. Cannot save recording.",
"exists_warning": "Robot with this name already exists, please confirm the Robot's overwrite.",
"name_exists": "A robot with this name already exists. Please choose a different name.",
"no_actions_performed": "Cannot save robot. Please perform at least one capture action before saving."
},
"tooltips": {
Expand All @@ -294,7 +295,8 @@
"notifications": {
"terminated": "Current Recording was terminated",
"environment_reset": "Browser environment has been reset",
"reset_successful": "Successfully reset all captures and returned to initial state"
"reset_successful": "Successfully reset all captures and returned to initial state",
"timeout_discarded": "Recording session timed out after 10 minutes and was automatically discarded."
}
},
"interpretation_log": {
Expand Down Expand Up @@ -440,7 +442,8 @@
"warning": "⚠️ Ensure the new page has the same structure as the original page."
},
"fields": {
"target_url": "Target URL"
"target_url": "Target URL",
"new_name": "Robot Name"
},
"buttons": {
"duplicate": "Duplicate Robot",
Expand All @@ -449,6 +452,7 @@
"notifications": {
"robot_not_found": "Could not find robot details. Please try again.",
"url_required": "Target URL is required.",
"name_required": "Robot name is required.",
"duplicate_success": "Robot duplicated successfully.",
"duplicate_error": "Failed to update the Target URL. Please try again.",
"unknown_error": "An error occurred while updating the Target URL."
Expand Down Expand Up @@ -552,6 +556,8 @@
"scheduled_run": "Scheduled",
"api": "API",
"sdk": "SDK",
"mcp": "MCP",
"cli": "CLI",
"unknown_run_type": "Unknown Run Type"
},
"run_status_chips": {
Expand Down
11 changes: 9 additions & 2 deletions public/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@
"errors": {
"user_not_logged": "Usuario no conectado. No se puede guardar la grabación.",
"exists_warning": "Ya existe un robot con este nombre, por favor confirme la sobrescritura del robot.",
"name_exists": "Ya existe un robot con este nombre. Por favor elige un nombre diferente.",
"no_actions_performed": "No se puede guardar el robot. Por favor realice al menos una acción de captura antes de guardar."
},
"tooltips": {
Expand All @@ -294,7 +295,8 @@
"notifications": {
"terminated": "La grabación actual fue terminada",
"environment_reset": "El entorno del navegador ha sido reiniciado",
"reset_successful": "Se reiniciaron correctamente todas las capturas y se volvió al estado inicial"
"reset_successful": "Se reiniciaron correctamente todas las capturas y se volvió al estado inicial",
"timeout_discarded": "La sesión de grabación expiró después de 10 minutos y fue descartada automáticamente."
}
},
"interpretation_buttons": {
Expand Down Expand Up @@ -440,7 +442,8 @@
"warning": "⚠️ Asegúrate de que la nueva página tenga la misma estructura que la página original."
},
"fields": {
"target_url": "URL Destino del Robot"
"target_url": "URL Destino del Robot",
"new_name": "Nombre del Robot"
},
"buttons": {
"duplicate": "Duplicar Robot",
Expand All @@ -449,6 +452,7 @@
"notifications": {
"robot_not_found": "No se pudieron encontrar los detalles del robot. Por favor, inténtalo de nuevo.",
"url_required": "Se requiere la URL de destino.",
"name_required": "El nombre del robot es obligatorio.",
"duplicate_success": "Robot duplicado con éxito.",
"duplicate_error": "Error al actualizar la URL de destino. Por favor, inténtalo de nuevo.",
"unknown_error": "Ocurrió un error al actualizar la URL de destino."
Expand Down Expand Up @@ -551,6 +555,9 @@
"manual_run": "Ejecución Manual",
"scheduled_run": "Ejecución Programada",
"api": "API",
"sdk": "SDK",
"mcp": "MCP",
"cli": "CLI",
"unknown_run_type": "Tipo de Ejecución Desconocido"
},
"run_status_chips": {
Expand Down
12 changes: 10 additions & 2 deletions public/locales/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@
"errors": {
"user_not_logged": "ユーザーがログインしていません。録画を保存できません。",
"exists_warning": "この名前のロボットは既に存在します。ロボットの上書きを確認してください。",
"name_exists": "この名前のロボットは既に存在します。別の名前を選んでください。",
"no_actions_performed": "ロボットを保存できません。保存する前に少なくとも1つのキャプチャアクションを実行してください。"
},
"tooltips": {
Expand All @@ -294,7 +295,8 @@
"notifications": {
"terminated": "現在の録画は終了しました",
"environment_reset": "ブラウザー環境がリセットされました",
"reset_successful": "すべてのキャプチャーを正常にリセットし、初期状態に戻りました"
"reset_successful": "すべてのキャプチャーを正常にリセットし、初期状態に戻りました",
"timeout_discarded": "録画セッションが10分後にタイムアウトし、自動的に破棄されました。"
}
},
"interpretation_log": {
Expand Down Expand Up @@ -440,7 +442,8 @@
"warning": "⚠️ 新しいページが元のページと同じ構造であることを確認してください。"
},
"fields": {
"target_url": "ロボットのターゲットURL"
"target_url": "ロボットのターゲットURL",
"new_name": "ロボット名"
},
"buttons": {
"duplicate": "ロボットを複製",
Expand All @@ -449,6 +452,7 @@
"notifications": {
"robot_not_found": "ロボットの詳細が見つかりません。もう一度お試しください。",
"url_required": "ターゲットURLが必要です。",
"name_required": "ロボット名は必須です。",
"duplicate_success": "ロボットが正常に複製されました。",
"duplicate_error": "ターゲットURLの更新に失敗しました。もう一度お試しください。",
"unknown_error": "ターゲットURLの更新中にエラーが発生しました。"
Expand All @@ -457,6 +461,7 @@
"robot_settings": {
"title": "ロボット設定",
"target_url": "ロボットのターゲットURL",
"new_name": "ロボット名",
"robot_id": "ロボットID",
"robot_limit": "ロボットの制限",
"created_by_user": "作成したユーザー",
Expand Down Expand Up @@ -551,6 +556,9 @@
"manual_run": "手動実行",
"scheduled_run": "スケジュール実行",
"api": "API",
"sdk": "SDK",
"mcp": "MCP",
"cli": "CLI",
"unknown_run_type": "不明な実行タイプ"
},
"run_status_chips": {
Expand Down
13 changes: 11 additions & 2 deletions public/locales/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@
"confirm_all_list_fields": "Lütfen devam etmeden önce tüm liste alanlarını onaylayın."
},
"tooltips": {
"capture_list_first": "Önce bir listenin üzerine gelin ve içindeki metin alanlarını seçin",
"confirm_all_list_fields": "Lütfen bir sonraki adıma geçmeden önce tüm liste alanlarını onaylayın"
}
},
Expand All @@ -278,6 +279,7 @@
"errors": {
"user_not_logged": "Kullanıcı girişi yok. Kaydedilemedi.",
"exists_warning": "Bu isimde robot zaten var; üzerine yazmayı onaylayın.",
"name_exists": "Bu isimde bir robot zaten mevcut. Lütfen farklı bir isim seçin.",
"no_actions_performed": "Robot kaydedilemez. Lütfen kaydetmeden önce en az bir yakalama eylemi gerçekleştirin."
},
"tooltips": {
Expand All @@ -293,7 +295,8 @@
"notifications": {
"terminated": "Kayıt sonlandırıldı",
"environment_reset": "Tarayıcı ortamı sıfırlandı",
"reset_successful": "Yakalamalar sıfırlandı ve başlangıç durumuna dönüldü"
"reset_successful": "Yakalamalar sıfırlandı ve başlangıç durumuna dönüldü",
"timeout_discarded": "Kayıt oturumu 10 dakika sonra zaman aşımına uğradı ve otomatik olarak atıldı."
}
},
"interpretation_log": {
Expand Down Expand Up @@ -439,7 +442,8 @@
"warning": "⚠️ Yeni sayfanın yapısının aynı olduğundan emin olun."
},
"fields": {
"target_url": "Robot Hedef URL"
"target_url": "Robot Hedef URL",
"new_name": "Robot Adı"
},
"buttons": {
"duplicate": "Robotu Çoğalt",
Expand All @@ -448,6 +452,7 @@
"notifications": {
"robot_not_found": "Robot bulunamadı. Tekrar deneyin.",
"url_required": "Hedef URL gerekli.",
"name_required": "Robot adı gereklidir.",
"duplicate_success": "Robot çoğaltıldı",
"duplicate_error": "Hedef URL güncellenemedi. Tekrar deneyin.",
"unknown_error": "Hedef URL güncellenirken hata oluştu"
Expand All @@ -456,6 +461,7 @@
"robot_settings": {
"title": "Robot Ayarları",
"target_url": "Robot Hedef URL",
"new_name": "Robot Adı",
"robot_id": "Robot ID",
"robot_limit": "Robot Limiti",
"created_by_user": "Oluşturan",
Expand Down Expand Up @@ -550,6 +556,9 @@
"manual_run": "Manuel",
"scheduled_run": "Zamanlanmış",
"api": "API",
"sdk": "SDK",
"mcp": "MCP",
"cli": "CLI",
"unknown_run_type": "Bilinmeyen"
},
"run_status_chips": {
Expand Down
Loading
Loading