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 "Candidatura inviata"
msgid "Applied on"
msgstr "Candidatura inviata il"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Approve"
msgstr "Approva"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Approved — waiting for the agent…"
msgstr "Approvato — in attesa dell'agente…"
#: src/libs/locale.ts
msgid "Arabic"
msgstr "Arabo"
@@ -1462,6 +1470,14 @@ msgstr "Eliminazione della chiave API in corso..."
msgid "Deleting your resume..."
msgstr "Eliminazione del tuo curriculum in corso..."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Denied — waiting for the agent…"
msgstr "Rifiutato — in attesa dell'agente…"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Deny"
msgstr "Rifiuta"
#: src/libs/resume/ats.ts
msgid "Describe what you did so the entry contributes keywords for matching."
msgstr "Descrivi cosa hai fatto in modo che la voce fornisca parole chiave per la corrispondenza."
@@ -1530,6 +1546,10 @@ msgstr "Donare"
msgid "Donate to Reactive Resume"
msgstr "Fai una donazione a Reactive Resume"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Done"
msgstr "Completato"
#. 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 "Modifica dei contenuti in modalità fullscreen"
msgid "Edit date"
msgstr "Modifica data"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Edit declined"
msgstr "Modifica rifiutata"
#. 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 "Esporta il tuo curriculum in PDF all'istante, senza attese né ritardi."
msgid "Exported pipeline-flow.png"
msgstr "pipeline-flow.png esportato"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Failed"
msgstr "Non riuscito"
#: src/routes/builder/$resumeId/-sidebar/right/sections/resume-analysis.tsx
msgid "Failed to analyze resume."
msgstr "Non è riuscito ad analizzare il curriculum."
@@ -1967,6 +1995,10 @@ msgstr "Impossibile scollegare il provider. Provi di nuovo."
msgid "Failed to update provider."
msgstr "Impossibile aggiornare il provider."
#: src/routes/agent/-components/agent-chat.tsx
msgid "Failed to update thread settings."
msgstr "Impossibile aggiornare le impostazioni della discussione."
#. 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 "apre in una nuova scheda"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Optional note for the agent"
msgstr "Nota facoltativa per l'agente"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Optional note for the agent…"
msgstr "Nota facoltativa per l'agente…"
#: 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 "Facoltativamente, imposta una password affinché solo le persone che la conoscono possano visualizzare il tuo curriculum tramite il link."
@@ -3499,6 +3539,10 @@ msgstr "Pubblicazioni"
msgid "Publisher"
msgstr "Editore"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Raw JSON"
msgstr "JSON grezzo"
#: src/features/applications/components/application-ai-copilot.tsx
msgid "Re-score"
msgstr "Ricalcola punteggio"
@@ -3546,10 +3590,18 @@ msgstr "Ripresa reattiva v<0>{__APP_VERSION__}</0>"
msgid "Reactive Resume v4 (JSON)"
msgstr "Ripresa reattiva v4 (JSON)"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Read an attachment"
msgstr "Ha letto un allegato"
#: src/features/resume/stylesheet/editor.tsx
msgid "Read the Applying Custom Styles guide."
msgstr "Leggi la guida \"Applicazione di stili personalizzati\"."
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Read the resume"
msgstr "Ha letto il curriculum"
#: src/features/applications/components/application-form-sheet.tsx
msgid "Reading the posting…"
msgstr "Lettura dell'annuncio…"
@@ -3700,8 +3752,8 @@ msgid "Restore"
msgstr "Ripristinare"
#: 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 "Ripristinare il ripristino a prima di questa patch? Questa opzione annullerà questa patch e tutte le patch applicate successivamente."
msgid "Restore the resume to before this patch?"
msgstr "Ripristinare il curriculum allo stato precedente a questa patch?"
#: src/routes/builder/$resumeId/-components/version-history.tsx
msgid "Restore this version?"
@@ -3726,6 +3778,10 @@ msgstr "Analisi del curriculum completata."
msgid "Resume content"
msgstr "Contenuto del curriculum"
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Resume edit"
msgstr "Modifica al curriculum"
#: src/features/applications/components/application-detail-sheet.tsx
msgid "Resume file"
msgstr "File curriculum"
@@ -3754,10 +3810,18 @@ msgstr "Curriculum"
msgid "Retry"
msgstr "Riprova"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Review edits"
msgstr "Rivedi le modifiche"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Review the resume against a job description and ask me questions before changing uncertain sections."
msgstr "Esamina il curriculum confrontandolo con la descrizione del lavoro e fammi delle domande prima di modificare le sezioni in cui hai dei dubbi."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Review this edit"
msgstr "Rivedi questa modifica"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Rework the summary so it targets a senior engineering manager role without sounding generic."
msgstr "Rielabora il riepilogo in modo che si rivolga a un ruolo di responsabile senior dell'ingegneria senza risultare generico."
@@ -3798,6 +3862,10 @@ msgstr "Rotazione"
msgid "Run your first analysis to get a scorecard, strengths, and prioritized suggestions."
msgstr "Esegua la prima analisi per ottenere una scorecard, i punti di forza e i suggerimenti prioritari."
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Running…"
msgstr "In esecuzione…"
#: src/libs/locale.ts
msgid "Russian"
msgstr "Russo"
@@ -4253,6 +4321,15 @@ msgstr "Fonte"
msgid "Source Code"
msgstr "Codice sorgente"
#. placeholder {0}: operation.from
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "Source: {0}"
msgstr "Fonte: {0}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Sources"
msgstr "Fonti"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Spacing (Horizontal)"
msgstr "Spaziatura (orizzontale)"
@@ -4604,6 +4681,10 @@ msgstr "Impossibile aprire questo assistente."
msgid "This date will not be read correctly."
msgstr "Questa data non verrà letta correttamente."
#: src/routes/agent/-components/patch-approval-card.tsx
msgid "This edit request can no longer be answered."
msgstr "Non è più possibile rispondere a questa richiesta di modifica."
#: src/libs/resume/ats.ts
msgid "This email address will not be recognized."
msgstr "Questo indirizzo email non verrà riconosciuto."
@@ -4712,6 +4793,10 @@ msgstr "Questo la aiuterà a identificarlo in seguito, se prevede di avere più
msgid "This will remove all items from this section."
msgstr "Questo rimuoverà tutti gli elementi da questa sezione."
#: src/routes/agent/-components/agent-chat.tsx
msgid "This will roll back this patch and any patches applied after it."
msgstr "Questa operazione annullerà questa patch e tutte le patch applicate successivamente."
#: src/routes/agent/-components/agent-chat.tsx
#: src/routes/agent/-components/thread-sidebar.tsx
msgid "Thread actions"
@@ -4794,6 +4879,18 @@ msgstr "Alterna la barra laterale destra"
msgid "Toggle threads"
msgstr "Discussioni di attivazione/disattivazione"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {threadTokenTotal}"
msgstr "Token: {threadTokenTotal}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {total}"
msgstr "Token: {total}"
#: src/routes/agent/-components/agent-chat.tsx
msgid "Tokens: {total} ({cached} cached)"
msgstr "Token: {total} ({cached} in cache)"
#: src/features/applications/components/application-form-sheet.tsx
msgid "Track a job you're applying to and link the resume you sent."
msgstr "Tieni traccia di un lavoro per cui ti candidi e collega il curriculum inviato."
@@ -5213,6 +5310,10 @@ msgstr "Non siamo riusciti a rilevare automaticamente il formato: selezionalo qu
msgid "We couldn't find that page"
msgstr "Non siamo riusciti a trovare quella pagina"
#: src/routes/agent/-components/tool-part-card.tsx
msgid "Web search"
msgstr "Ricerca web"
#: src/dialogs/resume/sections/award.tsx
#: src/dialogs/resume/sections/certification.tsx
#: src/dialogs/resume/sections/education.tsx
@@ -5445,4 +5546,3 @@ msgstr "Rimpicciolisci"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"