feat(agent): adopt AI SDK v7 — crash safety, context pruning, HITL approvals (#3362)

* docs(adr): propose agent AI SDK v7 adoption plan

* fix(ai): bind analyzeResume through aiService in service test

The test destructured analyzeResume as a named export that does not exist; main was red.

* test(agent): keep pure ai helpers real via spread-actual mock factory

* feat(agent): add run guards, patch version guard, run wall-clock timeout

* feat(agent): validate UI messages at the send boundary

* feat(agent): crash-safe draft-row persistence and server-side cancellation

* feat(agent): reap stale run claims at boot, on send, and on thread open

* feat(agent): fresh-document patch output and tiered context pruning

* feat(ai): shared agent tool contracts and message metadata schema

* feat(agent): add per-thread review-patches setting with update endpoint

* feat(agent): gate resume patches behind hmac-signed tool approval

* feat(agent): merge question answers and approval decisions before run claim

* feat(agent): approval ui with composed auto-send and fixture-driven tests

* feat(agent): usage metadata, tool activity cards, smoother streaming

* feat(agent): tool-call repair, input examples, structured step logging

* chore(i18n): translate new agent workspace strings across all locales

* fix(agent): gate stale-run draft cancellation on winning the claim clear

Snapshot streaming drafts before the conditional clear and skip the flip entirely when another reaper or a replacement run already cleared the claim. Also address review nits in eleven locale catalogs.

* fix(agent): flip reaped drafts only when their snapshotted state is unchanged

* fix(agent): address review findings across run lifecycle, context budget, and approval flow

- bind patches to the revision the model read via signed baseUpdatedAt
- claim the run before consuming a continuation; recorded-but-unexecuted approvals retry as pending continuations
- keep run ownership on stop() until cancellation persists; preserve the claim for the reaper when final persistence fails
- estimate tokens without serializing binary attachments (tokenx) and enforce the budget by dropping oldest whole turns
- mark crash-recovered patch results as snapshot boundaries; strip /data prefixes at execution time
- retry failed continuations without regenerate; mount a single AgentChat; disable response controls on read-only threads; freeze review toggle during runs (client+server)
- accumulate usage across continuations and match the SDK's nested usage shape; label-form token strings; reorderable source label; accessible note field; state-neutral web-search label

* chore(i18n): translate revised agent strings across all locales

* fix(agent): harden baseUpdatedAt validation and address review follow-ups

- bundle tokenx in the server runtime dependencies (e2e boot failure)
- strict ISO schema for baseUpdatedAt plus loud executor rejection of unparseable values
- it-IT source label consistency (Fonte)
- prove penultimate-turn retention in the context pruning test

* chore(deps): exempt tokenx from knip for the externalized server bundle
This commit is contained in:
Amruth Pillai
2026-08-20 08:06:53 +02:00
committed by GitHub
parent dbbab6fd76
commit c8081ac2fe
95 changed files with 14919 additions and 497 deletions
+103 -3
View File
@@ -543,6 +543,14 @@ msgstr "Müraciət edildi"
msgid "Applied on"
msgstr "Tətbiq edildiyi tarix"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Approve"
msgstr "Təsdiqlə"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Approved — waiting for the agent…"
msgstr "Təsdiqləndi — agent gözlənilir…"
#: src/libs/locale.ts
msgid "Arabic"
msgstr "Ərəb"
@@ -1462,6 +1470,14 @@ msgstr "API açarınız silinir..."
msgid "Deleting your resume..."
msgstr "Özgeçmişiniz silinir..."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Denied — waiting for the agent…"
msgstr "Rədd edildi — agent gözlənilir…"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Deny"
msgstr "Rədd et"
#: src/libs/resume/ats.ts
msgid "Describe what you did so the entry contributes keywords for matching."
msgstr "Nə etdiyinizi təsvir edin ki, giriş uyğunluq üçün açar sözlərə kömək etsin."
@@ -1530,6 +1546,10 @@ msgstr "Bağışlayın"
msgid "Donate to Reactive Resume"
msgstr "Reactive Resumeyə ianə et"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Done"
msgstr "Tamamlandı"
#. Action button to download two-factor backup codes as a text file
#. Primary action in the builder header to open resume download options
#: src/dialogs/auth/enable-two-factor.tsx
@@ -1642,6 +1662,10 @@ msgstr "Məzmununu tam ekran rejimində redaktə edin"
msgid "Edit date"
msgstr "Tarixi redaktə et"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Edit declined"
msgstr "Redaktə rədd edildi"
#. Resume card context menu action to edit resume metadata
#. Resume card dropdown action to edit resume metadata
#: src/routes/builder/$resumeId/-components/header.tsx
@@ -1837,6 +1861,10 @@ msgstr "CV-nizi heç bir gözləmə və ya gecikmə olmadan dərhal PDF formatı
msgid "Exported pipeline-flow.png"
msgstr "İxrac edilmiş boru kəməri axını.png"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Failed"
msgstr "Uğursuz oldu"
#: src/routes/builder/$resumeId/-sidebar/right/sections/resume-analysis.tsx
msgid "Failed to analyze resume."
msgstr "Rezüməni təhlil etmək mümkün olmadı."
@@ -1967,6 +1995,10 @@ msgstr "Təchizatçını ayırmaq mümkün olmadı. Zəhmət olmasa yenidən cə
msgid "Failed to update provider."
msgstr "Provayderi yeniləmək alınmadı."
#: src/routes/agent/-components/agent-chat.tsx
msgid "Failed to update thread settings."
msgstr "Mövzu parametrlərini yeniləmək mümkün olmadı."
#. Fallback toast when changing account password fails
#: src/dialogs/auth/change-password.tsx
msgid "Failed to update your password. Please try again."
@@ -3153,6 +3185,14 @@ msgstr "AçıqRouter"
msgid "opens in new tab"
msgstr "yeni vərəqdə açılır"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Optional note for the agent"
msgstr "Agent üçün istəyə bağlı qeyd"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Optional note for the agent…"
msgstr "Agent üçün istəyə bağlı qeyd…"
#: src/routes/builder/$resumeId/-sidebar/right/sections/sharing.tsx
msgid "Optionally, set a password so that only people with the password can view your resume through the link."
msgstr "İstəyə görə parol təyin edin ki, link vasitəsilə yalnız parolu bilənlər özgeçmişinizə baxa bilsin."
@@ -3499,6 +3539,10 @@ msgstr "Nəşrlər"
msgid "Publisher"
msgstr "Nəşriyyatçı"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Raw JSON"
msgstr "Xam JSON"
#: src/features/applications/components/application-ai-copilot.tsx
msgid "Re-score"
msgstr "Yenidən hesablayın"
@@ -3546,10 +3590,18 @@ msgstr "Reaktiv CV v<0>{__APP_VERSION__}</0>"
msgid "Reactive Resume v4 (JSON)"
msgstr "Reaktiv Rezume v4 (JSON)"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Read an attachment"
msgstr "Əlavəni oxudu"
#: src/features/resume/stylesheet/editor.tsx
msgid "Read the Applying Custom Styles guide."
msgstr "Xüsusi Stillərin Tətbiqi təlimatını oxuyun."
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Read the resume"
msgstr "CV-ni oxudu"
#: src/features/applications/components/application-form-sheet.tsx
msgid "Reading the posting…"
msgstr "Elan oxunur…"
@@ -3700,8 +3752,8 @@ msgid "Restore"
msgstr "Bərpa et"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Restore the resume to before this patch? This will roll back this patch and any patches applied after it."
msgstr "CV-ni bu yamadan əvvəlki vəziyyətinə bərpa etsinlər? Bu, bu yamanı və ondan sonra tətbiq olunan bütün yamaları geri qaytaracaq."
msgid "Restore the resume to before this patch?"
msgstr "CV bu yamaqdan əvvəlki vəziyyətinə qaytarılsın?"
#: src/routes/builder/$resumeId/-components/version-history.tsx
msgid "Restore this version?"
@@ -3726,6 +3778,10 @@ msgstr "Təcrübə təhlili tamamlandı."
msgid "Resume content"
msgstr "CV məzmunu"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Resume edit"
msgstr "CV redaktəsi"
#: src/features/applications/components/application-detail-sheet.tsx
msgid "Resume file"
msgstr "CV faylı"
@@ -3754,10 +3810,18 @@ msgstr "Özgeçmişlər"
msgid "Retry"
msgstr "Təkrar cəhd edin"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Review edits"
msgstr "Redaktələri nəzərdən keçir"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Review the resume against a job description and ask me questions before changing uncertain sections."
msgstr "CV-ni iş təsviri ilə müqayisə edin və qeyri-müəyyən bölmələri dəyişdirməzdən əvvəl mənə suallar verin."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Review this edit"
msgstr "Bu redaktəni nəzərdən keçir"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Rework the summary so it targets a senior engineering manager role without sounding generic."
msgstr "Xülasəni ümumi səslənmədən baş mühəndislik meneceri vəzifəsini hədəf alacaq şəkildə yenidən işləyin."
@@ -3798,6 +3862,10 @@ msgstr "Döndürmə"
msgid "Run your first analysis to get a scorecard, strengths, and prioritized suggestions."
msgstr "İlk təhlilinizi işə salın, skor kartı, güclü tərəflər və prioritetləşdirilmiş təkliflər əldə edin."
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Running…"
msgstr "İcra olunur…"
#: src/libs/locale.ts
msgid "Russian"
msgstr "Rus"
@@ -4253,6 +4321,15 @@ msgstr "Mənbə"
msgid "Source Code"
msgstr "Mənbə Kodu"
#. placeholder {0}: operation.from
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Source: {0}"
msgstr "Mənbə: {0}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Sources"
msgstr "Mənbələr"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Spacing (Horizontal)"
msgstr "Aralıq (Üfüqi)"
@@ -4604,6 +4681,10 @@ msgstr "Bu köməkçi açıla bilmədi."
msgid "This date will not be read correctly."
msgstr "Bu tarix düzgün oxunmayacaq."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "This edit request can no longer be answered."
msgstr "Bu redaktə sorğusuna artıq cavab vermək mümkün deyil."
#: src/libs/resume/ats.ts
msgid "This email address will not be recognized."
msgstr "Bu e-poçt ünvanı tanınmayacaq."
@@ -4712,6 +4793,10 @@ msgstr "Əgər bir neçə keçid açarı planlaşdırırsınızsa, bu, sonradan
msgid "This will remove all items from this section."
msgstr "Bu, bu bölmədən bütün elementləri siləcək."
#: src/routes/agent/-components/agent-chat.tsx
msgid "This will roll back this patch and any patches applied after it."
msgstr "Bu, həmin yamağı və ondan sonra tətbiq edilən bütün yamaqları geri qaytaracaq."
#: src/routes/agent/-components/agent-chat.tsx
#: src/routes/agent/-components/thread-sidebar.tsx
msgid "Thread actions"
@@ -4794,6 +4879,18 @@ msgstr "Sağ yan menyunu aç/bağla"
msgid "Toggle threads"
msgstr "Mövzuları aç/bağla"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {threadTokenTotal}"
msgstr "Tokenlər: {threadTokenTotal}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {total}"
msgstr "Tokenlər: {total}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {total} ({cached} cached)"
msgstr "Tokenlər: {total} ({cached} keşlənmiş)"
#: src/features/applications/components/application-form-sheet.tsx
msgid "Track a job you're applying to and link the resume you sent."
msgstr "Müraciət etdiyiniz işi izləyin və göndərdiyiniz CV-ni əlaqələndirin."
@@ -5213,6 +5310,10 @@ msgstr "Formatı avtomatik olaraq aşkarlaya bilmədik — zəhmət olmasa, yuxa
msgid "We couldn't find that page"
msgstr "Həmin səhifəni tapa bilmədik"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Web search"
msgstr "Veb axtarışı"
#: src/dialogs/resume/sections/award.tsx
#: src/dialogs/resume/sections/certification.tsx
#: src/dialogs/resume/sections/education.tsx
@@ -5445,4 +5546,3 @@ msgstr "Uzaqlaşdır"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"