Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
7999991
fix(agent): convert fatal tool-arg schema validation into recoverable…
senamakel Jul 4, 2026
445ed80
fix(agent): make subagent tool allowlist fail-closed (#4452)
senamakel Jul 4, 2026
44891cd
fix(agent): re-introduce credential scrubbing on tinyagents tool outp…
senamakel Jul 4, 2026
ffc0310
fix(agent): gate trace content at span storage + disjoint Langfuse us…
senamakel Jul 4, 2026
7bb6f45
fix(agent): persist full post-request transcript across mid-turn stee…
senamakel Jul 4, 2026
757141e
fix(agent): abort-on-drop steering forwarder + requeue late steers (#…
senamakel Jul 4, 2026
b6f44e5
fix(agent): single TurnCompleted, drop empty assistant row, clear sta…
senamakel Jul 4, 2026
cff99ce
fix(agent): re-establish task-locals and abort-on-drop for streamed p…
senamakel Jul 4, 2026
7ae723a
fix(agent): register update_memory_md + atomic serialized MEMORY.md w…
senamakel Jul 4, 2026
bb8a85d
fix(agent): classify approval deny/TTL as UserDeclined + persist tool…
senamakel Jul 4, 2026
4955066
fix(agent): fault-tolerant, cached context-compaction summarizer (#4461)
senamakel Jul 4, 2026
1444f73
fix(agent): image-aware token trim, proportional reserve, observable …
senamakel Jul 4, 2026
c857344
fix(agent): restore loop guards — repeat breakers, recoverable headro…
senamakel Jul 4, 2026
d70f110
fix(agent): correct after_tool middleware order — handoff sees raw, c…
senamakel Jul 4, 2026
49ccdbb
fix(agent): restore P-Format tool-call parsing in migrated parse path…
senamakel Jul 4, 2026
271c318
fix(agent): restore sub-agent persistence + observability parity (#4466)
senamakel Jul 4, 2026
c7b5694
fix(agent): cost & telemetry parity — charged USD, cap-summary/failed…
senamakel Jul 4, 2026
294a364
fix(agent): misc tinyagents-migration parity cleanups & doc drift (#4…
senamakel Jul 4, 2026
a35d861
Merge remote-tracking branch 'upstream/main' into agent/parity-all
senamakel Jul 4, 2026
518ac5b
Merge remote-tracking branch 'upstream/main' into agent/parity-all
senamakel Jul 4, 2026
277f6f6
fix(agent): set failure field on subagent unknown-tool completion aft…
senamakel Jul 4, 2026
b719cdc
style(i18n): prettier-format #4459 toolFailure locale strings
senamakel Jul 4, 2026
26dbf59
Merge remote-tracking branch 'upstream/main' into agent/parity-all
senamakel Jul 4, 2026
f7ea876
test(agent): set failure field on AgentProgress in progress-tracing t…
senamakel Jul 4, 2026
8ce7ff5
fix(agent): address CodeRabbit review — recap method, steer mode, tem…
senamakel Jul 4, 2026
4aa6937
fix(agent): don't advance JSON cursor for P-Format tags in parse (#4465)
senamakel Jul 4, 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
6 changes: 6 additions & 0 deletions app/src/lib/i18n/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ const messages: TranslationMap = {
'تحقّق من اتصالك أو إعدادات النموذج؛ سيعيد OpenHuman المحاولة.',
'conversations.toolFailure.timeout.cause': 'استغرق الإجراء وقتًا طويلاً وتم إيقافه.',
'conversations.toolFailure.timeout.next': 'سيعيد OpenHuman المحاولة، أو يمكنك إعادتها يدويًا.',
'conversations.toolFailure.denied.cause': 'لقد رفضت هذا الإجراء.',
'conversations.toolFailure.denied.next':
'لا حاجة لأي شيء — لم يُنفَّذ. اطلبه مجددًا إذا غيّرت رأيك.',
'conversations.toolFailure.approvalExpired.cause': 'انتهت صلاحية طلب الموافقة قبل أن يردّ أحد.',
'conversations.toolFailure.approvalExpired.next':
'اطلبه مجددًا لتشغيله — لن يعيد OpenHuman المحاولة من تلقاء نفسه.',
'conversations.toolFailure.unknown.cause': 'حدث خطأ ما في هذا الإجراء.',
'conversations.toolFailure.unknown.next':
'حاول مرة أخرى؛ وإذا استمر الفشل، شغّل التشخيص من الإعدادات.',
Expand Down
6 changes: 6 additions & 0 deletions app/src/lib/i18n/bn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'কাজটি অনেক বেশি সময় নেওয়ায় থামিয়ে দেওয়া হয়েছে।',
'conversations.toolFailure.timeout.next':
'OpenHuman আবার চেষ্টা করবে, অথবা আপনি নিজে আবার চেষ্টা করতে পারেন।',
'conversations.toolFailure.denied.cause': 'আপনি এই কাজটি প্রত্যাখ্যান করেছেন।',
'conversations.toolFailure.denied.next': 'কিছু করার নেই — এটি চালানো হয়নি। মত বদলালে আবার বলুন।',
'conversations.toolFailure.approvalExpired.cause':
'কেউ সাড়া দেওয়ার আগেই অনুমোদনের অনুরোধের মেয়াদ শেষ হয়ে গেছে।',
'conversations.toolFailure.approvalExpired.next':
'এটি চালাতে আবার বলুন — OpenHuman নিজে থেকে পুনরায় চেষ্টা করবে না।',
'conversations.toolFailure.unknown.cause': 'এই কাজটিতে কিছু ভুল হয়েছে।',
'conversations.toolFailure.unknown.next':
'আবার চেষ্টা করুন; বারবার ব্যর্থ হলে সেটিংস থেকে ডায়াগনস্টিকস চালান।',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'Die Aktion hat zu lange gedauert und wurde gestoppt.',
'conversations.toolFailure.timeout.next':
'OpenHuman versucht es erneut, oder du kannst es manuell wiederholen.',
'conversations.toolFailure.denied.cause': 'Du hast diese Aktion abgelehnt.',
'conversations.toolFailure.denied.next':
'Nichts zu tun — sie wurde nicht ausgeführt. Frag erneut, wenn du es dir anders überlegst.',
'conversations.toolFailure.approvalExpired.cause':
'Die Genehmigungsanfrage ist abgelaufen, bevor jemand geantwortet hat.',
'conversations.toolFailure.approvalExpired.next':
'Frag erneut, um sie auszuführen — OpenHuman versucht es nicht von selbst erneut.',
'conversations.toolFailure.unknown.cause': 'Bei dieser Aktion ist etwas schiefgelaufen.',
'conversations.toolFailure.unknown.next':
'Versuche es erneut; wenn es weiterhin fehlschlägt, führe die Diagnose in den Einstellungen aus.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3852,6 +3852,13 @@ const en: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'The action took too long and was stopped.',
'conversations.toolFailure.timeout.next':
'OpenHuman will try again, or you can retry it manually.',
'conversations.toolFailure.denied.cause': 'You declined this action.',
'conversations.toolFailure.denied.next':
'Nothing to do — it was not run. Ask again if you change your mind.',
'conversations.toolFailure.approvalExpired.cause':
'The approval request expired before anyone responded.',
'conversations.toolFailure.approvalExpired.next':
"Ask again to run it — OpenHuman won't retry it on its own.",
'conversations.toolFailure.unknown.cause': 'Something went wrong with this action.',
'conversations.toolFailure.unknown.next':
'Try again; if it keeps failing, run diagnostics from Settings.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'La acción tardó demasiado y se detuvo.',
'conversations.toolFailure.timeout.next':
'OpenHuman lo intentará de nuevo, o puedes reintentarlo manualmente.',
'conversations.toolFailure.denied.cause': 'Rechazaste esta acción.',
'conversations.toolFailure.denied.next':
'No hay nada que hacer: no se ejecutó. Vuelve a pedirlo si cambias de opinión.',
'conversations.toolFailure.approvalExpired.cause':
'La solicitud de aprobación caducó antes de que alguien respondiera.',
'conversations.toolFailure.approvalExpired.next':
'Vuelve a pedirlo para ejecutarlo: OpenHuman no lo reintentará por su cuenta.',
'conversations.toolFailure.unknown.cause': 'Algo salió mal con esta acción.',
'conversations.toolFailure.unknown.next':
'Inténtalo de nuevo; si sigue fallando, ejecuta el diagnóstico desde Configuración.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': "L'action a pris trop de temps et a été arrêtée.",
'conversations.toolFailure.timeout.next':
"OpenHuman réessaiera, ou vous pouvez relancer l'action manuellement.",
'conversations.toolFailure.denied.cause': 'Vous avez refusé cette action.',
'conversations.toolFailure.denied.next':
"Rien à faire — elle n'a pas été exécutée. Redemandez si vous changez d'avis.",
'conversations.toolFailure.approvalExpired.cause':
"La demande d'approbation a expiré avant que quiconque réponde.",
'conversations.toolFailure.approvalExpired.next':
"Redemandez pour l'exécuter — OpenHuman ne réessaiera pas tout seul.",
'conversations.toolFailure.unknown.cause': 'Un problème est survenu avec cette action.',
'conversations.toolFailure.unknown.next':
"Réessayez ; si l'échec persiste, lancez le diagnostic depuis les Paramètres.",
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/hi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'कार्य में बहुत अधिक समय लगा और इसे रोक दिया गया।',
'conversations.toolFailure.timeout.next':
'OpenHuman फिर से प्रयास करेगा, या आप इसे मैन्युअल रूप से दोबारा कर सकते हैं।',
'conversations.toolFailure.denied.cause': 'आपने इस क्रिया को अस्वीकार कर दिया।',
'conversations.toolFailure.denied.next':
'कुछ नहीं करना है — यह चलाई नहीं गई। मन बदलें तो फिर से कहें।',
'conversations.toolFailure.approvalExpired.cause':
'किसी के जवाब देने से पहले ही अनुमोदन अनुरोध की समय-सीमा समाप्त हो गई।',
'conversations.toolFailure.approvalExpired.next':
'इसे चलाने के लिए फिर से कहें — OpenHuman इसे स्वयं दोबारा नहीं आज़माएगा।',
'conversations.toolFailure.unknown.cause': 'इस कार्य में कुछ गड़बड़ हो गई।',
'conversations.toolFailure.unknown.next':
'दोबारा प्रयास करें; यदि यह बार-बार विफल हो, तो सेटिंग्स से डायग्नोस्टिक्स चलाएँ।',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'Tindakan memakan waktu terlalu lama dan dihentikan.',
'conversations.toolFailure.timeout.next':
'OpenHuman akan mencoba lagi, atau Anda dapat mengulanginya secara manual.',
'conversations.toolFailure.denied.cause': 'Anda menolak tindakan ini.',
'conversations.toolFailure.denied.next':
'Tidak ada yang perlu dilakukan — tindakan ini tidak dijalankan. Minta lagi jika Anda berubah pikiran.',
'conversations.toolFailure.approvalExpired.cause':
'Permintaan persetujuan kedaluwarsa sebelum ada yang merespons.',
'conversations.toolFailure.approvalExpired.next':
'Minta lagi untuk menjalankannya — OpenHuman tidak akan mencobanya sendiri.',
'conversations.toolFailure.unknown.cause': 'Terjadi kesalahan pada tindakan ini.',
'conversations.toolFailure.unknown.next':
'Coba lagi; jika terus gagal, jalankan diagnostik dari Pengaturan.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ const messages: TranslationMap = {
"L'azione ha richiesto troppo tempo ed è stata interrotta.",
'conversations.toolFailure.timeout.next':
'OpenHuman riproverà, oppure puoi riprovare manualmente.',
'conversations.toolFailure.denied.cause': 'Hai rifiutato questa azione.',
'conversations.toolFailure.denied.next':
'Niente da fare — non è stata eseguita. Richiedila di nuovo se cambi idea.',
'conversations.toolFailure.approvalExpired.cause':
'La richiesta di approvazione è scaduta prima che qualcuno rispondesse.',
'conversations.toolFailure.approvalExpired.next':
'Richiedila di nuovo per eseguirla — OpenHuman non riproverà da solo.',
'conversations.toolFailure.unknown.cause': 'Qualcosa è andato storto con questa azione.',
'conversations.toolFailure.unknown.next':
'Riprova; se continua a fallire, esegui la diagnostica dalle Impostazioni.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': '작업이 너무 오래 걸려 중지되었습니다.',
'conversations.toolFailure.timeout.next':
'OpenHuman이 다시 시도하거나 수동으로 다시 실행할 수 있습니다.',
'conversations.toolFailure.denied.cause': '이 작업을 거부했습니다.',
'conversations.toolFailure.denied.next':
'할 일이 없습니다 — 실행되지 않았습니다. 마음이 바뀌면 다시 요청하세요.',
'conversations.toolFailure.approvalExpired.cause':
'아무도 응답하기 전에 승인 요청이 만료되었습니다.',
'conversations.toolFailure.approvalExpired.next':
'실행하려면 다시 요청하세요 — OpenHuman이 스스로 재시도하지 않습니다.',
'conversations.toolFailure.unknown.cause': '이 작업에서 문제가 발생했습니다.',
'conversations.toolFailure.unknown.next':
'다시 시도하세요. 계속 실패하면 설정에서 진단을 실행하세요.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'Czynność trwała zbyt długo i została zatrzymana.',
'conversations.toolFailure.timeout.next':
'OpenHuman spróbuje ponownie lub możesz powtórzyć ją ręcznie.',
'conversations.toolFailure.denied.cause': 'Odrzuciłeś tę czynność.',
'conversations.toolFailure.denied.next':
'Nic do zrobienia — nie została wykonana. Poproś ponownie, jeśli zmienisz zdanie.',
'conversations.toolFailure.approvalExpired.cause':
'Prośba o zatwierdzenie wygasła, zanim ktokolwiek odpowiedział.',
'conversations.toolFailure.approvalExpired.next':
'Poproś ponownie, aby ją uruchomić — OpenHuman nie ponowi próby samodzielnie.',
'conversations.toolFailure.unknown.cause': 'Coś poszło nie tak z tą czynnością.',
'conversations.toolFailure.unknown.next':
'Spróbuj ponownie; jeśli nadal się nie udaje, uruchom diagnostykę w Ustawieniach.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,13 @@ const messages: TranslationMap = {
'conversations.toolFailure.timeout.cause': 'A ação demorou demais e foi interrompida.',
'conversations.toolFailure.timeout.next':
'O OpenHuman tentará novamente, ou você pode tentar manualmente.',
'conversations.toolFailure.denied.cause': 'Você recusou esta ação.',
'conversations.toolFailure.denied.next':
'Nada a fazer — ela não foi executada. Peça novamente se mudar de ideia.',
'conversations.toolFailure.approvalExpired.cause':
'A solicitação de aprovação expirou antes que alguém respondesse.',
'conversations.toolFailure.approvalExpired.next':
'Peça novamente para executá-la — o OpenHuman não tentará de novo sozinho.',
'conversations.toolFailure.unknown.cause': 'Algo deu errado com esta ação.',
'conversations.toolFailure.unknown.next':
'Tente novamente; se continuar falhando, execute o diagnóstico nas Configurações.',
Expand Down
7 changes: 7 additions & 0 deletions app/src/lib/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ const messages: TranslationMap = {
'Действие заняло слишком много времени и было остановлено.',
'conversations.toolFailure.timeout.next':
'OpenHuman повторит попытку, или вы можете повторить её вручную.',
'conversations.toolFailure.denied.cause': 'Вы отклонили это действие.',
'conversations.toolFailure.denied.next':
'Ничего делать не нужно — оно не было выполнено. Попросите снова, если передумаете.',
'conversations.toolFailure.approvalExpired.cause':
'Срок запроса на подтверждение истёк, прежде чем кто-либо ответил.',
'conversations.toolFailure.approvalExpired.next':
'Попросите снова, чтобы выполнить его — OpenHuman не повторит попытку сам.',
'conversations.toolFailure.unknown.cause': 'С этим действием что-то пошло не так.',
'conversations.toolFailure.unknown.next':
'Повторите попытку; если ошибка повторяется, запустите диагностику в Настройках.',
Expand Down
5 changes: 5 additions & 0 deletions app/src/lib/i18n/zh-CN.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ const messages: TranslationMap = {
'请检查你的网络连接或模型设置;OpenHuman 将会重试。',
'conversations.toolFailure.timeout.cause': '操作耗时过长,已被停止。',
'conversations.toolFailure.timeout.next': 'OpenHuman 会重试,你也可以手动重试。',
'conversations.toolFailure.denied.cause': '你拒绝了此操作。',
'conversations.toolFailure.denied.next':
'无需任何操作——它没有被执行。如果你改变主意,请再次提出。',
'conversations.toolFailure.approvalExpired.cause': '在有人响应之前,审批请求已过期。',
'conversations.toolFailure.approvalExpired.next': '再次提出以执行它——OpenHuman 不会自行重试。',
'conversations.toolFailure.unknown.cause': '此操作出现了问题。',
'conversations.toolFailure.unknown.next': '请重试;如果持续失败,请在设置中运行诊断。',
'conversations.backgroundTasks.title': 'Background tasks',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ function ToolGroupBlock({ summary, entries }: { summary: string; entries: ToolTi
}

/**
* The 8 failure classes the UI has localized copy for (#4254), keyed by the
* The failure classes the UI has localized copy for (#4254 / #4459), keyed by the
* camelCase form of the wire's PascalCase `class`. Any class not in this set
* falls back to the English `causePlain` / `nextAction` carried on the payload.
*/
Expand All @@ -126,6 +126,8 @@ const LOCALIZED_FAILURE_CLASSES: ReadonlySet<string> = new Set([
'blockedByPolicy',
'modelConnection',
'timeout',
'denied',
'approvalExpired',
'unknown',
]);

Expand Down
5 changes: 5 additions & 0 deletions app/src/store/chatRuntimeSlice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,9 @@ export interface SubagentToolCallEntry {
displayName?: string;
/** Server-computed contextual detail (path / recipient / query). */
detail?: string;
/** Plain-language explanation for a FAILED child call (#4459). Mirrors the
* parent {@link ToolTimelineEntry.failure}; absent on successful rows. */
failure?: ToolFailureExplanation;
}

/**
Expand Down Expand Up @@ -677,6 +680,8 @@ function subagentToolCallFromPersisted(call: PersistedSubagentToolCall): Subagen
outputChars: call.outputChars,
displayName: call.displayName,
detail: call.detail,
// Carry the persisted failure explanation across the round-trip (#4459).
failure: parseToolFailure(call.failure),
};
}

Expand Down
4 changes: 4 additions & 0 deletions app/src/types/turnState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ export interface PersistedSubagentToolCall {
displayName?: string;
/** Server-computed contextual detail (path / recipient / query). */
detail?: string;
/** Plain-language failure explanation for a FAILED child call (#4459).
* Mirrors the parent {@link PersistedToolTimelineEntry.failure}; absent on
* successful rows and on snapshots written before this field. */
failure?: PersistedToolFailure;
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/bin/harness_subagent_audit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,7 @@ async fn drain_progress(
output: _,
elapsed_ms,
iteration,
failure: _,
} => {
eprintln!(
"[harness_subagent_audit] progress turn={} subagent_tool_completed agent_id={} task_id={} tool={} call_id={} success={} output_chars={} elapsed_ms={} iteration={}",
Expand Down
Loading
Loading