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 "הוגש"
msgid "Applied on"
msgstr "הוגש בתאריך"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Approve"
msgstr "אישור"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Approved — waiting for the agent…"
msgstr "אושר — ממתין לסוכן…"
#: src/libs/locale.ts
msgid "Arabic"
msgstr "ערבית"
@@ -1462,6 +1470,14 @@ msgstr "מוחק את מפתח ה־API שלך..."
msgid "Deleting your resume..."
msgstr "מוחק את קורות החיים שלך..."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Denied — waiting for the agent…"
msgstr "נדחה — ממתין לסוכן…"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Deny"
msgstr "דחייה"
#: src/libs/resume/ats.ts
msgid "Describe what you did so the entry contributes keywords for matching."
msgstr "תאר מה עשית כדי שהרשומה תוסיף מילות מפתח להתאמה."
@@ -1530,6 +1546,10 @@ msgstr "לִתְרוֹם"
msgid "Donate to Reactive Resume"
msgstr "תרומה ל־Reactive Resume"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Done"
msgstr "הושלם"
#. 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 "ערוך תוכן במצב מסך מלא"
msgid "Edit date"
msgstr "עריכת תאריך"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Edit declined"
msgstr "העריכה נדחתה"
#. 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 "ייצא את קורות החיים שלך ל-PDF באופן מיידי,
msgid "Exported pipeline-flow.png"
msgstr "pipeline-flow.png יוצא"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Failed"
msgstr "נכשל"
#: src/routes/builder/$resumeId/-sidebar/right/sections/resume-analysis.tsx
msgid "Failed to analyze resume."
msgstr "לא ניתן לנתח את קורות החיים."
@@ -1967,6 +1995,10 @@ msgstr "לא הצליח לבטל את הקישור לספק. אנא נסה שו
msgid "Failed to update provider."
msgstr "עדכון הספק נכשל."
#: src/routes/agent/-components/agent-chat.tsx
msgid "Failed to update thread settings."
msgstr "עדכון הגדרות השרשור נכשל."
#. 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 "OpenRouter"
msgid "opens in new tab"
msgstr "נפתח בלשונית חדשה"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Optional note for the agent"
msgstr "הערה אופציונלית לסוכן"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Optional note for the agent…"
msgstr "הערה אופציונלית לסוכן…"
#: 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 "רשותך להגדיר סיסמה כך שרק מי שמכיר אותה יוכל לצפות בקורות החיים דרך הקישור."
@@ -3499,6 +3539,10 @@ msgstr "פרסומים"
msgid "Publisher"
msgstr "מוציא לאור"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Raw JSON"
msgstr "JSON גולמי"
#: src/features/applications/components/application-ai-copilot.tsx
msgid "Re-score"
msgstr "דרג מחדש"
@@ -3546,10 +3590,18 @@ msgstr "קורות חיים ריאקטיביים v<0>{__APP_VERSION__}</0>"
msgid "Reactive Resume v4 (JSON)"
msgstr "קורות חיים תגובתיים גרסה 4 (JSON)"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Read an attachment"
msgstr "קרא קובץ מצורף"
#: src/features/resume/stylesheet/editor.tsx
msgid "Read the Applying Custom Styles guide."
msgstr "קרא את המדריך להחלת סגנונות מותאמים אישית."
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Read the resume"
msgstr "קרא את קורות החיים"
#: src/features/applications/components/application-form-sheet.tsx
msgid "Reading the posting…"
msgstr "קורא את המודעה…"
@@ -3700,8 +3752,8 @@ msgid "Restore"
msgstr "לְשַׁחְזֵר"
#: 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 "לשחזר את קורות החיים למצב שלפני תיקון זה? פעולה זו תחזיר את התיקון הזה וכל תיקון שהוחל לאחריו."
msgid "Restore the resume to before this patch?"
msgstr "לשחזר את קורות החיים למצב שלפני התיקון הזה?"
#: src/routes/builder/$resumeId/-components/version-history.tsx
msgid "Restore this version?"
@@ -3726,6 +3778,10 @@ msgstr "ניתוח קורות החיים הושלם."
msgid "Resume content"
msgstr "תוכן קורות חיים"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Resume edit"
msgstr "עריכת קורות חיים"
#: src/features/applications/components/application-detail-sheet.tsx
msgid "Resume file"
msgstr "קובץ קורות חיים"
@@ -3754,10 +3810,18 @@ msgstr "מסמכי קורות חיים"
msgid "Retry"
msgstr "נסה שוב"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Review edits"
msgstr "סקירת עריכות"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Review the resume against a job description and ask me questions before changing uncertain sections."
msgstr "בדוק את קורות החיים מול תיאור התפקיד ושאל אותי שאלות לפני שינוי חלקים לא ודאיים."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Review this edit"
msgstr "סקירת העריכה הזו"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Rework the summary so it targets a senior engineering manager role without sounding generic."
msgstr "עבדו מחדש את הסיכום כך שיתמקד בתפקיד מנהל הנדסה בכיר מבלי להישמע כללי."
@@ -3798,6 +3862,10 @@ msgstr "סיבוב"
msgid "Run your first analysis to get a scorecard, strengths, and prioritized suggestions."
msgstr "בצע את הניתוח הראשון שלך כדי לקבל דוח ביצועים, נקודות חוזק והצעות מסודרות לפי סדר עדיפויות."
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Running…"
msgstr "פועל…"
#: src/libs/locale.ts
msgid "Russian"
msgstr "רוסית"
@@ -4253,6 +4321,15 @@ msgstr "מקור"
msgid "Source Code"
msgstr "קוד מקור"
#. placeholder {0}: operation.from
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Source: {0}"
msgstr "מקור: {0}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Sources"
msgstr "מקורות"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Spacing (Horizontal)"
msgstr "ריווח (אופקי)"
@@ -4604,6 +4681,10 @@ msgstr "לא ניתן היה לפתוח את העוזר הזה."
msgid "This date will not be read correctly."
msgstr "התאריך הזה לא ייקרא כראוי."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "This edit request can no longer be answered."
msgstr "לא ניתן עוד להשיב על בקשת העריכה הזו."
#: src/libs/resume/ats.ts
msgid "This email address will not be recognized."
msgstr "כתובת הדוא״ל הזו לא תזוהה."
@@ -4712,6 +4793,10 @@ msgstr "זה יעזור לך לזהות אותו בהמשך, אם אתה מתכ
msgid "This will remove all items from this section."
msgstr "פעולה זו תסיר את כל הפריטים מהקטע הזה."
#: src/routes/agent/-components/agent-chat.tsx
msgid "This will roll back this patch and any patches applied after it."
msgstr "פעולה זו תבטל את התיקון הזה ואת כל התיקונים שהוחלו אחריו."
#: src/routes/agent/-components/agent-chat.tsx
#: src/routes/agent/-components/thread-sidebar.tsx
msgid "Thread actions"
@@ -4794,6 +4879,18 @@ msgstr "הצג את הסרגל הצדדי הימני"
msgid "Toggle threads"
msgstr "החלף שרשורים"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {threadTokenTotal}"
msgstr "טוקנים: {threadTokenTotal}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {total}"
msgstr "טוקנים: {total}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {total} ({cached} cached)"
msgstr "טוקנים: {total} ({cached} מהמטמון)"
#: src/features/applications/components/application-form-sheet.tsx
msgid "Track a job you're applying to and link the resume you sent."
msgstr "עקוב אחר משרה שאליה אתה מגיש מועמדות וקשר את קורות החיים ששלחת."
@@ -5213,6 +5310,10 @@ msgstr "לא הצלחנו לזהות את הפורמט באופן אוטומטי
msgid "We couldn't find that page"
msgstr "לא הצלחנו למצוא את הדף הזה"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Web search"
msgstr "חיפוש באינטרנט"
#: src/dialogs/resume/sections/award.tsx
#: src/dialogs/resume/sections/certification.tsx
#: src/dialogs/resume/sections/education.tsx
@@ -5445,4 +5546,3 @@ msgstr "התרחקות"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "זולו"