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 "Донирајте Реактивном Резимеу"
#: 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 "Експортујте свој животопис у ПДФ одмах,
msgid "Exported pipeline-flow.png"
msgstr "Извезен пипелине-флов.пнг"
#: 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 "Отворени рутер"
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 "Реактивни резиме v4 (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 "Зулу"