mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-11 21:45:04 +10:00
Add application tracker REST and MCP parity
Add comprehensive Application Tracker REST and MCP coverage, document the MCP workflow, add Markdown/ActionLint checks, bump the release version, and fill all extracted translations.
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
config:
|
||||
default: true
|
||||
MD007: false
|
||||
MD009: false
|
||||
MD010: false
|
||||
MD012: false
|
||||
MD013: false
|
||||
MD001: false
|
||||
MD022: false
|
||||
MD024: false
|
||||
MD025: false
|
||||
MD028: false
|
||||
MD031: false
|
||||
MD032: false
|
||||
MD033: false
|
||||
MD034: false
|
||||
MD036: false
|
||||
MD040: false
|
||||
MD041: false
|
||||
MD046: false
|
||||
MD060: false
|
||||
|
||||
frontMatter: "^---[\\s\\S]*?---"
|
||||
gitignore: true
|
||||
globs:
|
||||
- "**/*.{md,mdx}"
|
||||
ignores:
|
||||
- ".design-sync/**"
|
||||
- "node_modules/**"
|
||||
- ".turbo/**"
|
||||
- "dist/**"
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japanees"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Werk"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Werksoekpyplyn"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Werksgeleenthede"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Laai tans KI-verskaffers. Probeer asseblief weer oor 'n oomblik."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Aansoeke laai…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Netwerk"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nuwe aansoek"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nuwe draad"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nuwe draad"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zoem uit"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zoeloe"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "ጃፓንኛ"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "ስራ"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "የሥራ ፍለጋ ሂደት"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "ስራዎች"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "የAI አቅራቢዎችን በመጫን ላይ። እባክዎ ከአ
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "ማመልከቻዎች በመጫን ላይ…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "ኔትዎርክ"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "አዲስ ማመልከቻ"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "አዲስ ክር"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "አዲስ ውይይት"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "አጉር"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ዙሉ"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "اليابانية"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "وظيفة"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "مسار البحث عن وظيفة"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "وظائف"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "جارٍ تحميل مزودي خدمات الذكاء الاصطناع
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "جارٍ تحميل طلبات التقديم…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "الشبكة"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "طلب تقديم جديد"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "موضوع جديد"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "موضوع جديد"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "تصغير"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "الزولو"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Yapon"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "İş"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "İş axtarışı prosesi"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "İşlər"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Süni intellekt provayderləri yüklənir. Zəhmət olmasa, bir az sonra
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Müraciətlər yüklənir…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Şəbəkə"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Yeni müraciət"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Yeni mövzu"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Yeni mövzu"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Uzaqlaşdır"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Японски"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Работа"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Поток за търсене на работа"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Работни позиции"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Зареждане на доставчици на ИИ. Моля, опи
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Зареждане на кандидатури…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Мрежа"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Нова кандидатура"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Нова тема"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Нова нишка"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Намаляване"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулуски"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "জাপানি"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "চাকরি"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "চাকরি খোঁজার পাইপলাইন"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "চাকরিসমূহ"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "এআই প্রোভাইডার লোড করা হচ্
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "আবেদন লোড হচ্ছে…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "নেটওয়ার্ক"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "নতুন আবেদন"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "নতুন থ্রেড"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "নতুন থ্রেড"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "জুম আউট"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "জুলু"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonès"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Feina"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Procés de cerca de feina"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Feines"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "S'estan carregant els proveïdors d'IA. Si us plau, torneu-ho a provar d
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "S'estan carregant les candidatures…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Xarxa"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nova candidatura"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nou fil"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Fil nou"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Allunya"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulú"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonština"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Práce"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Proces hledání práce"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Pracovní místa"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Načítání poskytovatelů umělé inteligence. Zkuste to prosím znovu
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Načítají se žádosti…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Síť"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nová žádost"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nové vlákno"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nové vlákno"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Oddálit"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japansk"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Job"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Jobsøgningspipeline"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Jobs"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Indlæser AI-udbydere. Prøv igen om et øjeblik."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Indlæser ansøgninger…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Netværk"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Ny ansøgning"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Ny tråd"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Ny tråd"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zoom ud"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japanisch"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Job"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Bewerbungspipeline"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Jobs"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "KI-Anbieter werden geladen. Bitte versuchen Sie es in einem Moment erneu
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Bewerbungen werden geladen…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Netzwerk"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Neue Bewerbung"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Neuer Thread"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Neuer Thread"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Herauszoomen"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Ιαπωνικά"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Θέση εργασίας"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Ροή αναζήτησης εργασίας"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Θέσεις εργασίας"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Φόρτωση παρόχων τεχνητής νοημοσύνης. Δ
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Φόρτωση αιτήσεων…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Δίκτυο"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Νέα αίτηση"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Νέο νήμα"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Νέο νήμα"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Σμίκρυνση"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Ζουλού"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japanese"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Job"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Job search pipeline"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Jobs"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Loading AI providers. Please try again in a moment."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Loading applications…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Network"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "New Application"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "New thread"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "New Thread"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zoom out"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nuevo hilo"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nuevo hilo"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Alejar"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulú"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "ژاپنی"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "شغل"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "فرایند جستجوی شغل"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "شغلها"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "در حال بارگذاری ارائه دهندگان هوش مصنوع
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "در حال بارگذاری درخواستها…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "شبکه"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "درخواست جدید"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "تاپیک جدید"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "گفتوگوی جدید"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "کوچکنمایی"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "زولو"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "japani"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Työpaikka"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Työnhaun eteneminen"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Työpaikat"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Ladataan tekoälypalveluntarjoajia. Yritä uudelleen hetken kuluttua."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Ladataan hakemuksia…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Verkosto"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Uusi hakemus"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Uusi viestiketju"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Uusi ketju"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Loitonna"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nouveau sujet"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nouveau fil"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zoom arrière"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zoulou"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "יפנית"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "משרה"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "תהליך חיפוש עבודה"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "משרות"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "טוען ספקי בינה מלאכותית. אנא נסה שוב בעו
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "טוען מועמדויות…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "רשת"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "מועמדות חדשה"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "שרשור חדש"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "שרשור חדש"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "התרחקות"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "זולו"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "जापानी"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "नौकरी"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "नौकरी खोज पाइपलाइन"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "नौकरियाँ"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "एआई प्रदाताओं को लोड किया ज
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "आवेदन लोड हो रहे हैं…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "नेटवर्क"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "नया आवेदन"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "नया थ्रेड"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "नया थ्रेड"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "ज़ूम आउट"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ज़ुलु"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "japán"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Állás"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Álláskeresési folyamat"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Állások"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "MI-szolgáltatók betöltése folyamatban. Kérjük, próbálja újra eg
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Jelentkezések betöltése…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Hálózat"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Új jelentkezés"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Új téma"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Új szál"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Kicsinyítés"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Jepang"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Pekerjaan"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Alur pencarian kerja"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Pekerjaan"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Sedang memuat penyedia AI. Silakan coba lagi sebentar lagi."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Memuat lamaran…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Jaringan"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Lamaran baru"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Utas baru"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Utas baru"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Perkecil"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Giapponese"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Lavoro"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Pipeline di ricerca lavoro"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Lavori"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Caricamento dei provider di intelligenza artificiale. Riprova tra un att
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Caricamento candidature…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Rete"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nuova candidatura"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nuovo thread"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nuovo thread"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Rimpicciolisci"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "日本語"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "求人"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "求人応募パイプライン"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "求人"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AIプロバイダーを読み込んでいます。しばらくしてか
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "応募を読み込み中…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "ネットワーク"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "新しい応募"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "新しいスレッド"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "新しいスレッド"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "ズームアウト"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ズールー語"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japanese"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "ការងារ"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "ដំណើរការស្វែងរកការងារ"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "ការងារ"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "កំពុងផ្ទុកអ្នកផ្តល់សេវា AI
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "កំពុងផ្ទុកពាក្យសុំ…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "បណ្ដាញ"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "ពាក្យសុំថ្មី"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "ខ្សែស្រឡាយថ្មី"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "ខ្សែសន្ទនាថ្មី"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "បង្រួម"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "ಜಾಪನೀಸ್"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "ಉದ್ಯೋಗ"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "ಉದ್ಯೋಗ ಹುಡುಕಾಟ ಪೈಪ್ಲೈನ್"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "ಉದ್ಯೋಗಗಳು"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AI ಪೂರೈಕೆದಾರರನ್ನು ಲೋಡ್ ಮಾಡಲ
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "ಅರ್ಜಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "ನೆಟ್ವರ್ಕ್"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "ಹೊಸ ಅರ್ಜಿ"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "ಹೊಸ ಥ್ರೆಡ್"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "ಹೊಸ ಥ್ರೆಡ್"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "ಗಾತ್ರ ಕುಗ್ಗಿಸಿ"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ಜೂಲೂ"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "일본어"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "채용 공고"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "구직 파이프라인"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "채용 공고"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AI 제공업체를 불러오는 중입니다. 잠시 후 다시 시도
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "지원서를 불러오는 중…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "네트워크"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "새 지원서"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "새 스레드"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "새 스레드"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "축소"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "줄루어"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonų"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Darbas"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Darbo paieškos eiga"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Darbai"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Įkeliami dirbtinio intelekto teikėjai. Bandykite dar kartą po akimirk
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Įkeliamos paraiškos…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Tinklas"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nauja paraiška"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nauja tema"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nauja gija"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Tolinti"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulų"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japāņu"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Darbs"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Darba meklēšanas process"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Darbi"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Notiek mākslīgā intelekta pakalpojumu sniedzēju ielāde. Lūdzu, mē
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Notiek pieteikumu ielāde…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Tīkls"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Jauns pieteikums"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Jauna tēma"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Jauns pavediens"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Tālināt"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "ജാപ്പനീസ്"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "ജോലി"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "ജോലി തിരച്ചിൽ പൈപ്പ്ലൈൻ"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "ജോലികൾ"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AI ദാതാക്കളെ ലോഡ് ചെയ്യുന്ന
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "അപേക്ഷകൾ ലോഡ് ചെയ്യുന്നു…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "നെറ്റ്വർക്ക്"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "പുതിയ അപേക്ഷ"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "പുതിയ ത്രെഡ്"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "പുതിയ ത്രെഡ്"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "സൂം ഔട്ട് ചെയ്യുക"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "സൂളു"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "जपानी"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "नोकरी"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "नोकरी शोध पाइपलाइन"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "नोकऱ्या"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "एआय प्रोव्हायडर्स लोड होत
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "अर्ज लोड होत आहेत…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "नेटवर्क"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "नवीन अर्ज"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "नवीन धागा"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "नवीन थ्रेड"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "बाहेर झूम करा"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "झुलू"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Jepun"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Pekerjaan"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Saluran carian kerja"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Pekerjaan"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Memuatkan penyedia AI. Sila cuba lagi sebentar lagi."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Memuatkan permohonan…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Rangkaian"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Permohonan baharu"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Benang baharu"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Utas baharu"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zum keluar"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "जापानी"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "जागिर"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "रोजगार खोज पाइपलाइन"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "जागिरहरू"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AI प्रदायकहरू लोड गर्दै। कृप
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "आवेदनहरू लोड हुँदैछन्…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "नेटवर्क"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "नयाँ आवेदन"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "नयाँ थ्रेड"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "नयाँ थ्रेड"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "जूम आउट"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "जुलु"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japans"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Baan"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Sollicitatiepijplijn"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Banen"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AI-providers worden geladen. Probeer het over een moment opnieuw."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Sollicitaties laden…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Netwerk"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nieuwe sollicitatie"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nieuw topic"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nieuwe thread"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Uitzoomen"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japansk"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Jobb"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Jobbsøkpipeline"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Jobber"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Laster inn AI-leverandører. Prøv igjen om et øyeblikk."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Laster søknader…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Nettverk"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Ny søknad"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Ny tråd"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Ny tråd"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zoom ut"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "ଜାପାନୀ"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "ଚାକିରି"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "ଚାକିରି ଖୋଜ ପାଇପଲାଇନ୍"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "ଚାକିରିଗୁଡ଼ିକ"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AI ପ୍ରଦାନକାରୀଙ୍କୁ ଲୋଡ୍ କରାଯ
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "ଆବେଦନଗୁଡ଼ିକ ଲୋଡ୍ ହେଉଛି…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "ନେଟୱର୍କ"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "ନୂତନ ଆବେଦନ"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "ନୂଆ ଥ୍ରେଡ୍"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "ନୂତନ ଥ୍ରେଡ୍"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "ଜୁମ୍ ଆଉଟ୍ କରନ୍ତୁ"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ଜୁଲୁ"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japoński"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Praca"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Proces szukania pracy"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Oferty pracy"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Ładowanie dostawców sztucznej inteligencji. Spróbuj ponownie za chwil
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Ładowanie aplikacji…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Sieć"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nowa aplikacja"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nowy wątek"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nowy wątek"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Pomniejsz"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonês"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Vaga"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Pipeline de busca de emprego"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Vagas"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Carregando provedores de IA. Tente novamente em instantes."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Carregando candidaturas…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Rede"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nova candidatura"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Novo tópico"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Novo tópico"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Diminuir zoom"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonês"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Vaga"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Fluxo de procura de emprego"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Vagas"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Carregando fornecedores de IA. Tente novamente dentro de instantes."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "A carregar candidaturas…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Rede social"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nova candidatura"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Novo tópico"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Novo tópico"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Afastar"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Fir nou"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Fir nou"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Micșorează"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Японский"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Вакансия"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Воронка поиска работы"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Вакансии"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Загрузка поставщиков ИИ. Пожалуйста, по
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Загрузка откликов…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Сеть"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Новый отклик"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Новая тема"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Новая тема"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Уменьшить"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулу"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japončina"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Práca"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Proces hľadania práce"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Pracovné miesta"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Načítavajú sa poskytovatelia umelej inteligencie. Skúste to znova o
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Načítavajú sa žiadosti…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Sieť"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nová žiadosť"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nové vlákno"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nové vlákno"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Oddialiť"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonščina"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Zaposlitev"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Potek iskanja zaposlitve"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Zaposlitve"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Nalaganje ponudnikov umetne inteligence. Poskusite znova čez trenutek."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Nalaganje prijav…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Omrežje"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Nova prijava"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Nova nit"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Nova nit"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Oddalji"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zuluščina"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonisht"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Punë"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Procesi i kërkimit të punës"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Punë"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Duke ngarkuar ofruesit e inteligjencës artificiale. Ju lutemi provoni p
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Duke ngarkuar aplikimet…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Rrjeti"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Aplikim i ri"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Fije e re"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Fill i ri"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zvogëlo"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Јапански"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Посао"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Процес тражења посла"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Послови"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Учитавање добављача вештачке интелиге
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Учитавање пријава…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Мрежа"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Нова пријава"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Нова тема"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Нова тема"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Умањи"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулу"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japanska"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Jobb"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Jobbsökningsflöde"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Jobb"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Laddar AI-leverantörer. Försök igen om en stund."
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Läser in ansökningar…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Nätverk"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Ny ansökan"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Ny tråd"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Ny tråd"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Zooma ut"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "ஜப்பானியம்"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "வேலை"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "வேலை தேடல் நிலைவரிசை"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "வேலைகள்"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "செயற்கை நுண்ணறிவு வழங்குந
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "விண்ணப்பங்கள் ஏற்றப்படுகின்றன…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "நெட்வொர்க்"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "புதிய விண்ணப்பம்"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "புதிய இழை"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "புதிய இழை"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "சிறிதாக்கு"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ஜூலு"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "జపానీస్"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "ఉద్యోగం"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "ఉద్యోగ శోధన పైప్లైన్"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "ఉద్యోగాలు"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "AI ప్రొవైడర్లు లోడ్ అవుతున్
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "దరఖాస్తులు లోడ్ అవుతున్నాయి…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "నెట్వర్క్"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "కొత్త దరఖాస్తు"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "కొత్త థ్రెడ్"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "కొత్త థ్రెడ్"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "జూమ్ అవుట్ చేయండి"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "జులు"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "ญี่ปุ่น"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "งาน"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "ไปป์ไลน์ค้นหางาน"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "งาน"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "กำลังโหลดผู้ให้บริการ AI โ
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "กำลังโหลดใบสมัคร…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "ชื่อเว็บไซต์"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "ใบสมัครใหม่"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "กระทู้ใหม่"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "เธรดใหม่"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "ซูมออก"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ซูลู"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Japonca"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "İş"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "İş arama hattı"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "İşler"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Yapay zeka sağlayıcıları yükleniyor. Lütfen bir süre sonra tekrar
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Başvurular yükleniyor…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Sosyal Ağ"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Yeni başvuru"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Yeni konu"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Yeni konu"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Uzaklaştır"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Японська"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Вакансія"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Воронка пошуку роботи"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Вакансії"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Завантаження постачальників ШІ. Будь л
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Завантаження заявок…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Мережа"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Нова заявка"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Нова тема"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Нова тема"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Зменшити"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулу"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Yapon tili"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Ish"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Ish qidirish jarayoni"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Ishlar"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Sun'iy intellekt provayderlari yuklanmoqda. Iltimos, bir zumda qayta uri
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Arizalar yuklanmoqda…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Tarmoq"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Yangi ariza"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Yangi mavzu"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Yangi mavzu"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Kichraytirish"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "Tiếng Nhật"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "Công việc"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "Quy trình tìm việc"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "Công việc"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "Đang tải các nhà cung cấp AI. Vui lòng thử lại sau một lá
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "Đang tải hồ sơ ứng tuyển…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "Mạng"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "Hồ sơ ứng tuyển mới"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "Chủ đề mới"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "Chủ đề mới"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "Thu nhỏ"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "日语"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "职位"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "求职流程"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "职位"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "正在加载人工智能提供商。请稍后再试。"
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "正在加载申请…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "网络"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "新申请"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "新帖"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "新帖"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "缩小"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "祖鲁语"
|
||||
|
||||
|
||||
@@ -2341,7 +2341,7 @@ msgstr "日文"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
msgstr "職缺"
|
||||
|
||||
#: src/features/applications/components/application-form-sheet.tsx
|
||||
msgid "Job description"
|
||||
@@ -2357,7 +2357,7 @@ msgstr "求職流程"
|
||||
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
msgid "Jobs"
|
||||
msgstr ""
|
||||
msgstr "職缺"
|
||||
|
||||
#. Example full name placeholder on profile settings form
|
||||
#. Example full name placeholder on registration form
|
||||
@@ -2585,7 +2585,7 @@ msgstr "正在加載人工智慧提供者。請稍後再試。"
|
||||
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "Loading applications…"
|
||||
msgstr ""
|
||||
msgstr "正在載入應徵紀錄…"
|
||||
|
||||
#: src/features/settings/integrations/components/ai-section.tsx
|
||||
#: src/routes/agent/-components/new-thread-setup.tsx
|
||||
@@ -2752,7 +2752,7 @@ msgstr "網路"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Application"
|
||||
msgstr ""
|
||||
msgstr "新增應徵紀錄"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "New features are constantly being added and improved, so be sure to check back often."
|
||||
@@ -2789,7 +2789,7 @@ msgstr "新帖"
|
||||
#: src/features/command-palette/pages/navigation.tsx
|
||||
#: src/features/command-palette/pages/resumes.tsx
|
||||
msgid "New Thread"
|
||||
msgstr ""
|
||||
msgstr "新帖"
|
||||
|
||||
#: src/routes/_home/-sections/features.tsx
|
||||
msgid "No Advertising, No Tracking"
|
||||
@@ -4984,4 +4984,3 @@ msgstr "縮小"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "祖魯語"
|
||||
|
||||
|
||||
@@ -4,6 +4,35 @@ description: "Release notes for Reactive Resume covering new features, resume bu
|
||||
rss: true
|
||||
---
|
||||
|
||||
<Update label="v5.2.2" description="7th July 2026">
|
||||
## Highlights
|
||||
|
||||
- **Application Tracker REST and MCP parity.** The job application pipeline is now available outside the web app through authenticated REST endpoints and MCP tools, so agents can create records, import rows, move stages, add notes, manage follow-ups, attach sent PDFs, and inspect pipeline health. [2dad27da5](https://github.com/amruthpillai/reactive-resume/commit/2dad27da5), [bf2dc5bbd](https://github.com/amruthpillai/reactive-resume/commit/bf2dc5bbd)
|
||||
- **Agent-only application tracking.** MCP clients can now operate the Application Tracker end to end, including Application Copilot actions for job auto-fill, match scoring, tailored resume copies, cover letters, and recruiter follow-ups. [bf2dc5bbd](https://github.com/amruthpillai/reactive-resume/commit/bf2dc5bbd), [93abb1102](https://github.com/amruthpillai/reactive-resume/commit/93abb1102)
|
||||
- **New application MCP guide.** The docs now include a dedicated guide with practical prompts for using Reactive Resume MCP to manage applications from an AI client.
|
||||
|
||||
## Application Tracker API
|
||||
|
||||
- Added public REST coverage for listing, reading, creating, updating, importing, bulk-updating, bulk-deleting, tagging, and summarizing job applications. [2dad27da5](https://github.com/amruthpillai/reactive-resume/commit/2dad27da5)
|
||||
- Added authenticated document endpoints for attaching and removing the resume or cover-letter PDF sent with an application. [2dad27da5](https://github.com/amruthpillai/reactive-resume/commit/2dad27da5), [fb3f40244](https://github.com/amruthpillai/reactive-resume/commit/fb3f40244)
|
||||
- Added REST endpoints for Application Copilot actions: job posting auto-fill, resume match scoring, tailored resume creation, and message drafting. [2dad27da5](https://github.com/amruthpillai/reactive-resume/commit/2dad27da5)
|
||||
- Updated the OpenAPI reference so application endpoints, multipart document uploads, statistics, and tags are visible in the docs. [fb3f40244](https://github.com/amruthpillai/reactive-resume/commit/fb3f40244)
|
||||
|
||||
## MCP & Agent Workflows
|
||||
|
||||
- Added MCP tools for every Application Tracker workflow available in the app, including create, update, note, import, bulk action, archive, delete, document attachment, document removal, tag, statistics, and Application Copilot tools. [bf2dc5bbd](https://github.com/amruthpillai/reactive-resume/commit/bf2dc5bbd)
|
||||
- Improved MCP tool metadata so clients can distinguish safe reads, mutating actions, destructive actions, and AI-powered workflows more reliably. [93abb1102](https://github.com/amruthpillai/reactive-resume/commit/93abb1102)
|
||||
- Updated the resume-builder skill instructions so agents are told that Reactive Resume MCP can also manage job applications, not only resumes. [ac8734be3](https://github.com/amruthpillai/reactive-resume/commit/ac8734be3)
|
||||
|
||||
## Documentation & Reliability
|
||||
|
||||
- Added a parity design note for the Application Tracker REST and MCP surfaces. [3868429ce](https://github.com/amruthpillai/reactive-resume/commit/3868429ce)
|
||||
- Documented application MCP automation in the MCP guide, including available tools, prompt examples, and troubleshooting for PDF attachments. [ed83a3f5e](https://github.com/amruthpillai/reactive-resume/commit/ed83a3f5e)
|
||||
- Preserved shared application documents when one application removes or replaces a file also referenced by another application. [3c9c5c8c2](https://github.com/amruthpillai/reactive-resume/commit/3c9c5c8c2)
|
||||
|
||||
**Full Changelog**: [v5.2.1...v5.2.2](https://github.com/amruthpillai/reactive-resume/compare/v5.2.1...v5.2.2)
|
||||
</Update>
|
||||
|
||||
<Update label="v5.2.1" description="5th July 2026">
|
||||
## Highlights
|
||||
|
||||
|
||||
+8
-2
@@ -53,8 +53,6 @@
|
||||
"pages": [
|
||||
"guides/creating-your-first-resume",
|
||||
"guides/managing-resumes-from-the-dashboard",
|
||||
"guides/tracking-job-applications",
|
||||
"guides/importing-applications-from-csv",
|
||||
"guides/importing-resumes",
|
||||
"guides/choosing-a-template",
|
||||
"guides/selecting-page-format",
|
||||
@@ -72,6 +70,14 @@
|
||||
"guides/sharing-your-resume-publicly"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Application Tracker",
|
||||
"pages": [
|
||||
"guides/tracking-job-applications",
|
||||
"guides/importing-applications-from-csv",
|
||||
"guides/managing-applications-with-mcp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Security",
|
||||
"pages": ["guides/setting-up-two-factor-authentication", "guides/setting-up-passkeys"]
|
||||
|
||||
@@ -91,6 +91,10 @@ Reactive Resume imports up to 500 applications at a time. If your CSV has more t
|
||||
Import first, then use the table view to select multiple applications and apply tags, move stages, archive rows, or delete rows in bulk.
|
||||
</Tip>
|
||||
|
||||
<Tip>
|
||||
MCP clients can also import application rows directly with `import_applications`. See [Managing applications with MCP](/guides/managing-applications-with-mcp) for agent prompt examples.
|
||||
</Tip>
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Some rows were skipped
|
||||
|
||||
@@ -0,0 +1,286 @@
|
||||
---
|
||||
title: "Managing applications with MCP"
|
||||
description: "Use a connected MCP client to track job applications, attach sent PDFs, run Application Copilot, and manage your pipeline with natural-language prompts."
|
||||
---
|
||||
|
||||
Use this guide when you want an AI client to manage the **Application Tracker** for you. After the Reactive Resume MCP server is connected, the agent can use tools for the same application workflows available in the app: listing applications, creating records, importing rows, updating stages, adding notes, managing follow-ups, attaching documents, and running Application Copilot.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
<Steps>
|
||||
<Step title="Connect the MCP server">
|
||||
Follow [Using the MCP Server](/guides/using-the-mcp-server) to connect your MCP client with OAuth or an API key.
|
||||
</Step>
|
||||
|
||||
<Step title="Confirm the application tools are visible">
|
||||
Ask your client to list the Reactive Resume tools. You should see tools such as `list_applications`, `create_application`, `update_application`, `attach_application_document`, and `draft_application_message`.
|
||||
</Step>
|
||||
|
||||
<Step title="Decide how destructive actions should be handled">
|
||||
Tell your agent to ask before deleting applications, bulk-updating many records, or replacing attached documents.
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
<Info>
|
||||
Application Copilot tools require the same AI provider setup used by the app. Match scoring and resume tailoring work best when the application has a linked Reactive Resume and a job description.
|
||||
</Info>
|
||||
|
||||
## Start with a pipeline review
|
||||
|
||||
Begin by asking the agent to inspect your current pipeline. This gives the agent valid application IDs and avoids duplicate records.
|
||||
|
||||
```text
|
||||
List my active applications grouped by stage. Include company, role, tags, follow-up date, linked resume name, and whether a resume or cover-letter PDF is attached.
|
||||
```
|
||||
|
||||
Useful review prompts:
|
||||
|
||||
```text
|
||||
Show me applications that need follow-up this week.
|
||||
```
|
||||
|
||||
```text
|
||||
Find applications tagged remote that are still in saved or applied stage.
|
||||
```
|
||||
|
||||
```text
|
||||
Summarize my pipeline stats by stage and source, then point out stale applications.
|
||||
```
|
||||
|
||||
```text
|
||||
List archived applications from the last 90 days.
|
||||
```
|
||||
|
||||
## Create applications
|
||||
|
||||
Use `create_application` when you already know the role details.
|
||||
|
||||
```text
|
||||
Create an application for Senior Product Engineer at Acme. Stage: saved. Location: Berlin or remote. Source: LinkedIn. Tags: remote, typescript, senior. Add a note that I want to tailor my platform resume before applying.
|
||||
```
|
||||
|
||||
If you have a job posting, ask the agent to extract details first.
|
||||
|
||||
```text
|
||||
Use the Reactive Resume application auto-fill tool on this job posting URL, then create a saved application from the extracted company, role, location, salary, and job description. Tag it with remote and backend.
|
||||
```
|
||||
|
||||
If the posting is private, paste the description into your prompt:
|
||||
|
||||
```text
|
||||
Create an application from this pasted job description. Use auto-fill if available, keep the stage as saved, and tag it with ai, platform, and high-priority.
|
||||
|
||||
[Paste the job description here]
|
||||
```
|
||||
|
||||
## Import applications
|
||||
|
||||
Use `import_applications` when you already have spreadsheet rows. The Application Tracker accepts up to 500 imported rows at a time.
|
||||
|
||||
```text
|
||||
Import these application rows into Reactive Resume. Normalize the stages to saved, applied, screening, interview, offer, or rejected. Skip rows that do not have both a company and role, and tell me what was skipped.
|
||||
|
||||
Company,Role,Stage,Location,Source,Tags
|
||||
Acme,Frontend Engineer,applied,Remote,LinkedIn,remote;react
|
||||
Globex,Staff Engineer,interview,Berlin,Referral,staff;platform
|
||||
```
|
||||
|
||||
```text
|
||||
I am pasting rows from my spreadsheet. Import them, tag every imported application with migrated-2026, and leave archived as false.
|
||||
```
|
||||
|
||||
```text
|
||||
Import these rejected applications and mark them as archived after import.
|
||||
```
|
||||
|
||||
## Update stages and notes
|
||||
|
||||
Use `update_application` for structured changes and `add_application_note` when you want an activity timeline entry without changing other fields.
|
||||
|
||||
```text
|
||||
Move my Acme Senior Product Engineer application to interview and add a note: Recruiter screen scheduled for July 12 at 10:00.
|
||||
```
|
||||
|
||||
```text
|
||||
Add a note to the Globex application: Submitted take-home assignment and waiting for review.
|
||||
```
|
||||
|
||||
```text
|
||||
Set a follow-up date for the Stripe application to next Monday, with the note: Ask whether they need more portfolio examples.
|
||||
```
|
||||
|
||||
```text
|
||||
Update the contacts on the Acme application. Recruiter: Priya Shah, priya@example.com. Hiring manager: Jordan Lee, LinkedIn URL https://www.linkedin.com/in/example.
|
||||
```
|
||||
|
||||
```text
|
||||
Archive every rejected application older than 30 days, but show me the list and ask for confirmation before applying the bulk update.
|
||||
```
|
||||
|
||||
## Attach sent documents
|
||||
|
||||
Use document attachment when you want the tracker to store the exact resume PDF or cover-letter PDF you sent for an application.
|
||||
|
||||
```text
|
||||
Attach this PDF as the sent resume for the Acme application, then confirm the application now has a resume document.
|
||||
```
|
||||
|
||||
```text
|
||||
Attach this cover letter PDF to the Globex Staff Engineer application.
|
||||
```
|
||||
|
||||
```text
|
||||
Replace the resume PDF on the Stripe application with this updated PDF. Add a note that I resent the revised resume.
|
||||
```
|
||||
|
||||
```text
|
||||
Remove the cover-letter PDF from the Acme application, but keep the application record and timeline.
|
||||
```
|
||||
|
||||
<Info>
|
||||
`attach_application_document` accepts base64-encoded PDF bytes and `contentType: "application/pdf"`. Some MCP clients hide that detail when they can read local files. If your client cannot read local files, upload the PDF from the web app instead.
|
||||
</Info>
|
||||
|
||||
## Run Application Copilot
|
||||
|
||||
Application Copilot tools let an agent use the same AI workflows available in the application detail panel.
|
||||
|
||||
```text
|
||||
Score the resume linked to my Acme application against the saved job description. Summarize the biggest match gaps and do not change my resume.
|
||||
```
|
||||
|
||||
```text
|
||||
Create a tailored resume copy for the Globex Staff Engineer application. Keep the original resume unchanged, link the tailored copy back to the application, and tell me the new resume name.
|
||||
```
|
||||
|
||||
```text
|
||||
Draft a cover letter for the Stripe application using the linked resume and job description. Keep it concise and specific to the role.
|
||||
```
|
||||
|
||||
```text
|
||||
Draft a follow-up email for the recruiter on the Acme application. Mention that I enjoyed the technical screen and ask about next steps. Do not mark the email as sent.
|
||||
```
|
||||
|
||||
```text
|
||||
Review all interview-stage applications with linked resumes. For each one, score the match and list the top three tailoring opportunities.
|
||||
```
|
||||
|
||||
<Warning>
|
||||
Review AI-generated resumes, cover letters, and messages before sending them. MCP tools can draft and save context, but you are responsible for the final content.
|
||||
</Warning>
|
||||
|
||||
## Maintain your pipeline
|
||||
|
||||
Ask the agent to do periodic cleanup with explicit confirmation before broad changes.
|
||||
|
||||
```text
|
||||
Find applications that have not changed in 21 days. Group them by stage and recommend which ones need a follow-up, archive, or no action.
|
||||
```
|
||||
|
||||
```text
|
||||
Add the tag needs-follow-up to every active application with a follow-up date before today. Show me the list before updating.
|
||||
```
|
||||
|
||||
```text
|
||||
Move all applications tagged offer to offer stage, unless they are already archived.
|
||||
```
|
||||
|
||||
```text
|
||||
Archive rejected applications older than 60 days. Ask for confirmation before making changes.
|
||||
```
|
||||
|
||||
```text
|
||||
Delete these duplicate application records after confirming which one has the most complete timeline and documents.
|
||||
```
|
||||
|
||||
## Prompt library
|
||||
|
||||
Use these prompts as starting points. Replace company names, roles, tags, dates, and file references with your own details.
|
||||
|
||||
### Daily review
|
||||
|
||||
```text
|
||||
Give me a daily application tracker brief. Include applications needing follow-up today, interviews coming up, stale saved roles, and any applications missing a linked resume.
|
||||
```
|
||||
|
||||
```text
|
||||
Show my active applications in table form with company, role, stage, source, tags, follow-up date, and last updated time.
|
||||
```
|
||||
|
||||
```text
|
||||
Which applications are missing job descriptions, contacts, sent resume PDFs, or cover-letter PDFs?
|
||||
```
|
||||
|
||||
### Research and capture
|
||||
|
||||
```text
|
||||
Create a saved application from this job post. Extract company, role, location, salary, source URL, and job description. Add tags for the main technologies mentioned.
|
||||
```
|
||||
|
||||
```text
|
||||
I am considering this role but have not applied. Add it as saved, link my backend resume, and add a note with the three reasons it looks relevant.
|
||||
```
|
||||
|
||||
```text
|
||||
Add this recruiter contact to the matching application and note that they reached out on LinkedIn today.
|
||||
```
|
||||
|
||||
### Applying
|
||||
|
||||
```text
|
||||
Move the Acme application from saved to applied. Set applied date to today, attach the resume PDF I sent, and add a note with the application portal confirmation number.
|
||||
```
|
||||
|
||||
```text
|
||||
I just applied to three roles. Create applications for each one, tag them applied-today, and remind me to follow up in one week.
|
||||
```
|
||||
|
||||
```text
|
||||
Find the best resume to link to this application based on role title and tags. Ask me before updating the application.
|
||||
```
|
||||
|
||||
### Interviews and follow-ups
|
||||
|
||||
```text
|
||||
Move the Globex application to screening and add a recruiter screen contact with the recruiter's name and email.
|
||||
```
|
||||
|
||||
```text
|
||||
Add a note that the onsite interview is scheduled for July 18. Set the follow-up date to July 19.
|
||||
```
|
||||
|
||||
```text
|
||||
Draft a short follow-up after my interview. Use the application's company, role, recruiter contact, and timeline notes.
|
||||
```
|
||||
|
||||
### Reporting
|
||||
|
||||
```text
|
||||
Summarize my job search this month: number applied, interviews, offers, rejections, top sources, and response rate.
|
||||
```
|
||||
|
||||
```text
|
||||
Which sources are producing interviews? Compare LinkedIn, referrals, company sites, recruiters, and other sources.
|
||||
```
|
||||
|
||||
```text
|
||||
Show applications by stage and tell me where the pipeline is blocked.
|
||||
```
|
||||
|
||||
## Suggested agent instruction
|
||||
|
||||
Add this to your MCP client's project or session instructions when you want the agent to manage applications safely:
|
||||
|
||||
```text
|
||||
Use Reactive Resume MCP for application tracking. Start by calling list_applications before creating a new record so you do not duplicate existing applications. Confirm before delete_application, bulk_delete_applications, bulk_update_applications, replacing attached documents, or archiving more than five applications. Prefer add_application_note for timeline updates. Use Application Copilot tools only when the application has enough context, and never present AI-generated cover letters or follow-ups as sent messages.
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Issue | What to do |
|
||||
| --- | --- |
|
||||
| The agent cannot see application tools | Reconnect the MCP server and ask the client to refresh tool discovery. Confirm you are connected to Reactive Resume v5.2.2 or later. |
|
||||
| The agent creates duplicates | Ask it to run `list_applications` first and match by company, role, and source URL before creating records. |
|
||||
| Document attachment fails | Attach only PDFs. If your MCP client cannot read local files, upload the document from the web app. |
|
||||
| Match scoring or tailoring fails | Link a Reactive Resume to the application and add a job description. Confirm your AI provider is configured. |
|
||||
| A bulk action changed too much | Use the application list and timeline to inspect what changed. For future sessions, require confirmation before bulk actions. |
|
||||
@@ -148,6 +148,12 @@ Match scoring and resume tailoring require both a linked Reactive Resume and a j
|
||||
Review AI-generated content before sending it. You are responsible for the final resume, cover letter, and follow-up message.
|
||||
</Warning>
|
||||
|
||||
## Manage applications from an MCP client
|
||||
|
||||
You can also manage the Application Tracker from an MCP-compatible AI client. This lets an agent list applications, create new records, move stages, add notes, attach the PDFs you sent, and run Application Copilot without opening the web app.
|
||||
|
||||
For setup and prompt examples, see [Managing applications with MCP](/guides/managing-applications-with-mcp).
|
||||
|
||||
## Archive or delete applications
|
||||
|
||||
Archive applications you want to hide from the active board without deleting their history. Use the **Archived** toggle to view archived applications and unarchive them later.
|
||||
|
||||
@@ -3,7 +3,7 @@ title: "Using the MCP Server"
|
||||
description: "Connect Reactive Resume to AI tools like Claude Desktop, Cursor, and Codex using the Model Context Protocol"
|
||||
---
|
||||
|
||||
The Reactive Resume MCP server lets you manage and modify your resumes through any MCP-compatible AI tool — Claude Desktop, Cursor, Codex, and more. It connects to the Reactive Resume API and exposes tools for listing, reading, and patching resumes using natural language.
|
||||
The Reactive Resume MCP server lets you manage and modify your resumes and job applications through any MCP-compatible AI tool - Claude Desktop, Cursor, Codex, and more. It connects to the Reactive Resume API and exposes tools for resume editing, Application Tracker workflows, and AI-assisted job application tasks using natural language.
|
||||
|
||||
## What is MCP?
|
||||
|
||||
@@ -224,6 +224,23 @@ Tool names use canonical unprefixed `snake_case` names.
|
||||
| `lock_resume` | Lock a resume to prevent edits, patches, and deletion |
|
||||
| `unlock_resume` | Unlock a previously locked resume to re-enable editing |
|
||||
| `get_resume_statistics` | Get view and download statistics for a resume |
|
||||
| `list_applications` | List tracked job applications. Supports stage, tag, and archived filters |
|
||||
| `read_application` | Read one full application record with contacts, follow-up details, documents, and timeline |
|
||||
| `list_application_tags` | List every distinct tag used across applications |
|
||||
| `get_application_stats` | Get aggregate application counts by stage and source |
|
||||
| `create_application` | Create a tracked job application |
|
||||
| `update_application` | Update fields, move stage, archive/unarchive, edit contacts/follow-ups/tags, or link a resume |
|
||||
| `add_application_note` | Append a note to an application's activity timeline |
|
||||
| `delete_application` | Permanently delete one application and its owned uploaded documents |
|
||||
| `bulk_update_applications` | Move, archive/unarchive, or add tags to multiple applications |
|
||||
| `bulk_delete_applications` | Permanently delete multiple applications |
|
||||
| `import_applications` | Bulk-create parsed application rows, up to 500 items |
|
||||
| `attach_application_document` | Attach a sent resume or cover-letter PDF from base64-encoded PDF bytes |
|
||||
| `remove_application_document` | Remove a sent resume or cover-letter PDF |
|
||||
| `autofill_application_from_job` | Use AI to extract job details from a URL or pasted job description |
|
||||
| `score_application_match` | Score the linked resume against the application job description |
|
||||
| `tailor_resume_for_application` | Create and link a tailored resume copy for an application |
|
||||
| `draft_application_message` | Draft a cover letter or recruiter follow-up from application and resume context |
|
||||
|
||||
### Breaking change (tool names)
|
||||
|
||||
@@ -273,6 +290,18 @@ Once your MCP client is connected, you can use natural language to interact with
|
||||
- "What skills are listed on my resume?"
|
||||
- "Show me the stats for my resume"
|
||||
|
||||
### Tracking Applications
|
||||
|
||||
- "Create an application for Senior Frontend Engineer at Acme, stage saved, source LinkedIn."
|
||||
- "List my archived applications tagged remote."
|
||||
- "Move my Acme application to interview and add a note that the technical screen is next Tuesday."
|
||||
- "Attach this resume PDF to the Acme application."
|
||||
- "Score the resume linked to this application against the job description."
|
||||
- "Create a tailored resume copy for this application."
|
||||
- "Draft a follow-up message for the recruiter."
|
||||
|
||||
For a complete workflow and prompt library, see [Managing applications with MCP](/guides/managing-applications-with-mcp).
|
||||
|
||||
### Creating & Managing
|
||||
|
||||
- "Create a new resume called 'Frontend Engineer 2026'"
|
||||
@@ -320,3 +349,4 @@ Once your MCP client is connected, you can use natural language to interact with
|
||||
| "API error (403)" | The resume is locked. Unlock it in the Reactive Resume dashboard |
|
||||
| Connection refused | Check that the URL is correct and the instance is running |
|
||||
| "ReferenceError: File is not defined" when using `mcp-remote` | You're running Node.js 18. `mcp-remote` requires **Node.js 20 or later** — upgrade with `nvm use 20` or `nvm alias default 20` |
|
||||
| "Application documents must be PDF files" | `attach_application_document` only accepts `contentType: "application/pdf"` and base64-encoded PDF bytes |
|
||||
|
||||
+6430
-474
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,215 @@
|
||||
# Application Tracker REST and MCP Parity
|
||||
|
||||
## Status
|
||||
|
||||
Approved design for implementation planning. Campaign tracking is out of scope because the current app, database schema, changelog, guides, and tests do not ship a campaign field or campaign endpoint.
|
||||
|
||||
## Goal
|
||||
|
||||
Make every shipped Application Tracker capability available outside the web UI through:
|
||||
|
||||
- the public REST/OpenAPI surface under `/api/openapi`;
|
||||
- Reactive Resume MCP tools for agent-only workflows;
|
||||
- the bundled `resume-builder` skill, so agents know the application tracker tools exist.
|
||||
|
||||
The result should let a user track applications through an MCP client alone: create records, import existing rows, move stages, log notes, manage contacts and follow-ups, attach sent documents, run AI copilot actions, and inspect pipeline health.
|
||||
|
||||
## Current Shipped Capabilities
|
||||
|
||||
The current application tracker supports:
|
||||
|
||||
- application records with company, role, location, salary, source, source URL, job description, notes, tags, status, archive state, linked resume, sent resume PDF, cover-letter PDF, contacts, follow-up date/note, applied date, and activity timeline;
|
||||
- fixed stages: `saved`, `applied`, `screening`, `interview`, `offer`, `rejected`;
|
||||
- create, edit, archive/unarchive, mark rejected, move stage, delete;
|
||||
- board, table, search, sort, tag filter, archived toggle, and command-palette open/create shortcuts;
|
||||
- bulk table actions: move stage, add tag, archive, delete;
|
||||
- CSV import with header mapping and a 500-row cap;
|
||||
- insights from aggregate stage/source counts plus client-derived weekly application velocity;
|
||||
- timeline notes and automatic created/stage activity entries;
|
||||
- contacts embedded on each application;
|
||||
- Application Copilot actions: job-posting autofill, resume match score, tailored resume copy, cover-letter draft, follow-up draft;
|
||||
- PDF upload/remove for resume file and cover letter through the generic storage route.
|
||||
|
||||
## Existing API Coverage
|
||||
|
||||
The app already routes most behavior through `packages/api/src/features/applications`:
|
||||
|
||||
- `list`, `getById`, `create`, `import`, `update`, `addNote`, `delete`;
|
||||
- `bulkUpdate`, `bulkDelete`, `stats`, `tags`;
|
||||
- `ai.autofill`, `ai.matchScore`, `ai.draftMessage`, `ai.tailorResume`.
|
||||
|
||||
These procedures are already authenticated and user-scoped through `protectedProcedure` and `applicationService`. The implementation should reuse them instead of adding a parallel controller or new business layer.
|
||||
|
||||
## REST Design
|
||||
|
||||
Keep the existing application procedures and improve parity with the public OpenAPI surface.
|
||||
|
||||
### Public Application Endpoints
|
||||
|
||||
Existing endpoints remain:
|
||||
|
||||
- `GET /applications`
|
||||
- `GET /applications/{id}`
|
||||
- `POST /applications`
|
||||
- `POST /applications/import`
|
||||
- `PUT /applications/{id}`
|
||||
- `POST /applications/{id}/notes`
|
||||
- `DELETE /applications/{id}`
|
||||
- `POST /applications/bulk-update`
|
||||
- `POST /applications/bulk-delete`
|
||||
- `GET /applications/stats`
|
||||
- `GET /applications/tags`
|
||||
- `POST /applications/ai/autofill`
|
||||
- `POST /applications/{id}/ai/match-score`
|
||||
- `POST /applications/{id}/ai/draft-message`
|
||||
- `POST /applications/{id}/ai/tailor-resume`
|
||||
|
||||
Add public document endpoints under the Applications tag:
|
||||
|
||||
- `POST /applications/{id}/documents/{kind}` where `kind` is `resume` or `cover-letter`.
|
||||
- Accept a PDF file via OpenAPI file upload.
|
||||
- Store through the existing storage service.
|
||||
- Update only the matching application fields:
|
||||
- resume: `resumeFileUrl`, `resumeFileName`;
|
||||
- cover letter: `coverLetterUrl`, `coverLetterName`.
|
||||
- Return the updated application.
|
||||
- `DELETE /applications/{id}/documents/{kind}`.
|
||||
- Delete the owned storage object best-effort.
|
||||
- Clear only the matching application fields.
|
||||
- Return the updated application.
|
||||
|
||||
This makes the document upload/remove UI available through public REST without exposing the generic storage route, which remains tagged `Internal` because it also serves profile-picture use cases.
|
||||
|
||||
### REST Behavior Details
|
||||
|
||||
- Use existing ownership checks: every application mutation must be scoped by `userId`.
|
||||
- Reject non-PDF document uploads, matching the UI.
|
||||
- Keep file size at the existing storage limit: 10MB.
|
||||
- Preserve existing delete cleanup for uploaded documents when an application is deleted.
|
||||
- Do not add server-side search/sort endpoints for board/table parity. The UI derives search and sort from `list`, and external clients can do the same. `list` already exposes status, tags, and archive filtering.
|
||||
- Do not add campaign fields or endpoints.
|
||||
- Regenerate or update `docs/spec.json` so the public API reference includes all application endpoints.
|
||||
|
||||
## MCP Design
|
||||
|
||||
Add application tools to `packages/mcp` using the existing metadata pattern:
|
||||
|
||||
- add names to `MCP_TOOL_NAME`;
|
||||
- add schemas/descriptions to `TOOL_META`;
|
||||
- add behavior hints to `TOOL_ANNOTATIONS`;
|
||||
- register handlers in `registerTools`;
|
||||
- let `buildMcpServerCard` derive tool entries from `TOOL_META`;
|
||||
- add focused tests so tool registration, annotations, and server card stay synchronized.
|
||||
|
||||
All MCP handlers should call the injected in-process oRPC `RouterClient`. They should not import database code or reimplement ownership checks.
|
||||
|
||||
### MCP Tools
|
||||
|
||||
Read/discovery:
|
||||
|
||||
- `list_applications`: list applications, with optional `status`, `tags`, and `includeArchived`.
|
||||
- `read_application`: read one full application by ID.
|
||||
- `list_application_tags`: list distinct tags.
|
||||
- `get_application_stats`: return aggregate stage/source counts.
|
||||
|
||||
Write:
|
||||
|
||||
- `create_application`: create an application.
|
||||
- `update_application`: update editable fields, including stage, archive state, contacts, follow-up, tags, linked resume, source URL, job description, notes, and document URLs.
|
||||
- `add_application_note`: append a timeline note.
|
||||
- `delete_application`: permanently delete one application.
|
||||
- `bulk_update_applications`: move, archive/unarchive, or add tags to multiple applications.
|
||||
- `bulk_delete_applications`: permanently delete multiple applications.
|
||||
- `import_applications`: bulk-create parsed application rows, matching the REST `import` shape.
|
||||
- `attach_application_document`: attach a sent resume or cover letter PDF.
|
||||
- `remove_application_document`: remove a sent resume or cover letter PDF.
|
||||
|
||||
AI:
|
||||
|
||||
- `autofill_application_from_job`: extract company, role, location, salary, and job description from a job posting URL or pasted job description.
|
||||
- `score_application_match`: score the linked resume against the job description and persist match metadata.
|
||||
- `tailor_resume_for_application`: create and link a tailored resume copy.
|
||||
- `draft_application_message`: draft either a cover letter or follow-up message.
|
||||
|
||||
### MCP Attachment Input
|
||||
|
||||
`attach_application_document` should support agent-only use. The tool should accept:
|
||||
|
||||
- `id`;
|
||||
- `kind`: `resume` or `cover-letter`;
|
||||
- `fileName`;
|
||||
- `contentType`: `application/pdf`;
|
||||
- `dataBase64`: PDF bytes encoded as base64.
|
||||
|
||||
The handler can decode the base64 and call the same shared application-document service used by the public REST file upload. This avoids forcing MCP clients to provide browser `File` objects while still giving agents the same document capability as the UI.
|
||||
|
||||
### MCP Output Shape
|
||||
|
||||
Prefer JSON text outputs for data-bearing tools. Human-readable success strings are fine for destructive/simple tools only when no structured data is useful. For create/update/read/list/stats/AI tools, return JSON so agents can chain calls reliably.
|
||||
|
||||
### Tool Annotations
|
||||
|
||||
- Read tools: read-only, idempotent, non-destructive.
|
||||
- AI generation tools:
|
||||
- `autofill_application_from_job` is read-only but non-idempotent if it fetches a URL or calls AI.
|
||||
- `draft_application_message` is read-only but non-idempotent.
|
||||
- `score_application_match` and `tailor_resume_for_application` are write, non-idempotent.
|
||||
- Delete tools are destructive.
|
||||
- `update_application`, `bulk_update_applications`, and document remove are write/idempotent when the same input repeats, except tag append remains effectively idempotent because the service de-duplicates tags.
|
||||
- `create_application`, `import_applications`, note append, and document attach are write/non-idempotent.
|
||||
- `openWorldHint` should be `false` for closed account data tools and `true` only for job-posting autofill because it can fetch an external URL.
|
||||
|
||||
## Skill Update
|
||||
|
||||
Update `skills/resume-builder/SKILL.md` in place.
|
||||
|
||||
Add concise guidance that Reactive Resume MCP can manage applications as well as resumes. The skill should tell agents:
|
||||
|
||||
- use application tools when the user wants to track job applications, import a spreadsheet, move an opportunity through stages, add notes/contacts/follow-ups, attach sent documents, or use Application Copilot;
|
||||
- use `list_applications` before acting on existing records;
|
||||
- use `create_application` or `import_applications` for new records;
|
||||
- use `tailor_resume_for_application` after a linked resume and job description exist;
|
||||
- review AI-generated cover letters and follow-ups before sending.
|
||||
|
||||
Do not turn the skill into a full API reference. Keep it short and point agents at MCP tools by name.
|
||||
|
||||
## Documentation Updates
|
||||
|
||||
Update:
|
||||
|
||||
- `docs/guides/using-the-mcp-server.mdx`: add Application Tracker tools, examples, and troubleshooting notes.
|
||||
- `docs/use-cases/api-mcp-resume-automation.mdx`: expand scope from resume-only automation to resume plus application tracking.
|
||||
- `docs/spec.json`: refresh the public OpenAPI spec so docs show application routes.
|
||||
|
||||
The existing job application and CSV guides already describe the UI behavior accurately and should not need broad rewrites.
|
||||
|
||||
## Testing Plan
|
||||
|
||||
Focused tests:
|
||||
|
||||
- API/service tests for attaching/removing resume and cover-letter documents, including ownership and storage cleanup.
|
||||
- DTO/router tests for application document upload constraints if the route logic is not already covered through service tests.
|
||||
- MCP tests that:
|
||||
- every `MCP_TOOL_NAME` has metadata and annotations;
|
||||
- server card includes the new tools;
|
||||
- `registerTools` registers application tools;
|
||||
- one read handler and one write handler call the expected oRPC client procedure;
|
||||
- base64 document attachment rejects non-PDF input.
|
||||
|
||||
Validation commands:
|
||||
|
||||
- `pnpm --filter @reactive-resume/api test`
|
||||
- `pnpm --filter @reactive-resume/mcp test`
|
||||
- `pnpm --filter @reactive-resume/api typecheck`
|
||||
- `pnpm --filter @reactive-resume/mcp typecheck`
|
||||
- `pnpm exec turbo boundaries`
|
||||
- a focused Biome check on touched files; use a non-mutating check first unless formatting edits are intentionally being applied.
|
||||
|
||||
## Non-Goals
|
||||
|
||||
- Custom stages.
|
||||
- Campaign tracking.
|
||||
- Server-side board/search/sort endpoints.
|
||||
- A standalone application schema resource in MCP.
|
||||
- New dependencies.
|
||||
- Refactoring the application tracker UI.
|
||||
@@ -3,7 +3,7 @@ title: "API and MCP Resume Automation"
|
||||
description: "Automate resume workflows in Reactive Resume with API keys, the Patch API, the MCP server, AI agent tools, and the JSON resume schema."
|
||||
---
|
||||
|
||||
Reactive Resume supports resume automation through authenticated API access and an MCP server that lets compatible tools list, read, create, import, duplicate, and patch resumes.
|
||||
Reactive Resume supports automation through authenticated API access and an MCP server that lets compatible tools work with resumes and job applications. Agents can list, read, create, import, duplicate, and patch resumes, then track applications, move opportunities through stages, add notes and follow-ups, attach sent documents, and run Application Copilot actions.
|
||||
|
||||
## Automation options
|
||||
|
||||
@@ -26,6 +26,12 @@ You can build workflows that:
|
||||
- Read resume data for review or transformation.
|
||||
- Patch targeted fields without replacing the whole resume.
|
||||
- Connect an MCP-compatible client to operate on resumes with authenticated tools.
|
||||
- Track job applications end to end from an MCP client.
|
||||
- Import existing application rows from a spreadsheet parser.
|
||||
- Move applications through stages and log timeline notes.
|
||||
- Attach the resume or cover-letter PDF sent for an application.
|
||||
- Score a linked resume against a job description and create a tailored resume copy.
|
||||
- Draft cover letters and recruiter follow-ups from saved application context.
|
||||
|
||||
The Patch API is the safest starting point for targeted resume updates because it is designed around explicit changes to existing resume data.
|
||||
|
||||
|
||||
+8
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "reactive-resume",
|
||||
"description": "Reactive Resume is a free and open-source resume builder that simplifies the process of creating, updating, and sharing your resume.",
|
||||
"version": "5.2.1",
|
||||
"version": "5.2.2",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
@@ -22,11 +22,15 @@
|
||||
"scripts": {
|
||||
"build": "turbo run build",
|
||||
"doctor": "turbo run doctor",
|
||||
"check": "biome check --write --unsafe .",
|
||||
"check": "biome check --write --unsafe . && pnpm lint:docs:fix && pnpm lint:actions",
|
||||
"db:generate": "turbo run db:generate --filter=@reactive-resume/db",
|
||||
"db:migrate": "turbo run db:migrate --filter=@reactive-resume/db",
|
||||
"db:studio": "turbo run db:studio --filter=@reactive-resume/db",
|
||||
"lingui:extract": "turbo run lingui:extract --filter=web",
|
||||
"lint": "pnpm lint:docs && pnpm lint:actions",
|
||||
"lint:actions": "github-actionlint -shellcheck= -pyflakes=",
|
||||
"lint:docs": "markdownlint-cli2",
|
||||
"lint:docs:fix": "markdownlint-cli2 --fix",
|
||||
"dev": "turbo run dev",
|
||||
"dev:web": "turbo run dev --filter=web",
|
||||
"knip": "knip",
|
||||
@@ -53,9 +57,11 @@
|
||||
"@types/node": "^26.1.0",
|
||||
"@types/pg": "^8.20.0",
|
||||
"@vitest/coverage-v8": "^4.1.9",
|
||||
"github-actionlint": "1.7.12",
|
||||
"happy-dom": "^20.10.6",
|
||||
"knip": "^6.24.0",
|
||||
"lefthook": "^2.1.9",
|
||||
"markdownlint-cli2": "0.23.0",
|
||||
"pg": "^8.22.0",
|
||||
"turbo": "^2.10.3",
|
||||
"typescript": "^6.0.3",
|
||||
|
||||
@@ -34,3 +34,52 @@ describe("applicationDto jobDescription", () => {
|
||||
).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe("applicationDto document uploads", () => {
|
||||
it("accepts PDF application documents", () => {
|
||||
const file = new File(["%PDF-1.4"], "resume.pdf", { type: "application/pdf" });
|
||||
|
||||
const parsed = applicationDto.attachDocument.input.parse({
|
||||
id: "application-1",
|
||||
kind: "resume",
|
||||
file,
|
||||
});
|
||||
|
||||
expect(parsed.kind).toBe("resume");
|
||||
expect(parsed.file.name).toBe("resume.pdf");
|
||||
});
|
||||
|
||||
it("rejects non-PDF application documents", () => {
|
||||
const file = new File(["hello"], "cover.txt", { type: "text/plain" });
|
||||
|
||||
expect(() =>
|
||||
applicationDto.attachDocument.input.parse({
|
||||
id: "application-1",
|
||||
kind: "cover-letter",
|
||||
file,
|
||||
}),
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
it("rejects unknown application document kinds", () => {
|
||||
const file = new File(["%PDF-1.4"], "resume.pdf", { type: "application/pdf" });
|
||||
|
||||
expect(() =>
|
||||
applicationDto.attachDocument.input.parse({
|
||||
id: "application-1",
|
||||
kind: "portfolio",
|
||||
file,
|
||||
}),
|
||||
).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe("applicationDto zero-argument inputs", () => {
|
||||
it("normalizes stats input to an empty object", () => {
|
||||
expect(applicationDto.stats.input.parse(undefined)).toEqual({});
|
||||
});
|
||||
|
||||
it("normalizes tags input to an empty object", () => {
|
||||
expect(applicationDto.tags.input.parse(undefined)).toEqual({});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -9,6 +9,14 @@ import {
|
||||
} from "@reactive-resume/schema/applications/data";
|
||||
|
||||
const MAX_APPLICATION_JOB_DESCRIPTION_CHARS = 20_000;
|
||||
const MAX_APPLICATION_DOCUMENT_BYTES = 10 * 1024 * 1024;
|
||||
|
||||
const applicationDocumentKindSchema = z.enum(["resume", "cover-letter"]);
|
||||
|
||||
const applicationDocumentFileSchema = z
|
||||
.file()
|
||||
.max(MAX_APPLICATION_DOCUMENT_BYTES, "File size must be less than 10MB")
|
||||
.mime(["application/pdf"], "Application documents must be PDF files.");
|
||||
|
||||
const httpUrlSchema = z
|
||||
.string()
|
||||
@@ -124,6 +132,23 @@ export const applicationDto = {
|
||||
output: applicationSchema.omit({ userId: true }),
|
||||
},
|
||||
|
||||
attachDocument: {
|
||||
input: z.object({
|
||||
id: z.string(),
|
||||
kind: applicationDocumentKindSchema,
|
||||
file: applicationDocumentFileSchema,
|
||||
}),
|
||||
output: applicationSchema.omit({ userId: true }),
|
||||
},
|
||||
|
||||
removeDocument: {
|
||||
input: z.object({
|
||||
id: z.string(),
|
||||
kind: applicationDocumentKindSchema,
|
||||
}),
|
||||
output: applicationSchema.omit({ userId: true }),
|
||||
},
|
||||
|
||||
addNote: {
|
||||
input: z.object({ id: z.string(), text: z.string().trim().min(1) }),
|
||||
output: applicationSchema.omit({ userId: true }),
|
||||
@@ -153,7 +178,7 @@ export const applicationDto = {
|
||||
// Aggregates for the Insights view. Everything else (funnel, sankey, tiles) is derived
|
||||
// client-side from these raw counts via computeInsights().
|
||||
stats: {
|
||||
input: z.void(),
|
||||
input: z.object({}).optional().default({}),
|
||||
output: z.object({
|
||||
total: z.number(),
|
||||
byStage: z.array(z.object({ status: applicationStatusSchema, count: z.number() })),
|
||||
@@ -162,7 +187,9 @@ export const applicationDto = {
|
||||
},
|
||||
|
||||
tags: {
|
||||
input: z.void(),
|
||||
input: z.object({}).optional().default({}),
|
||||
output: z.array(z.string()),
|
||||
},
|
||||
};
|
||||
|
||||
export type ApplicationDocumentKind = z.infer<typeof applicationDocumentKindSchema>;
|
||||
|
||||
@@ -97,6 +97,66 @@ export const crudRouter = {
|
||||
return applicationService.update({ userId: context.user.id, ...input });
|
||||
}),
|
||||
|
||||
attachDocument: protectedProcedure
|
||||
.route({
|
||||
method: "POST",
|
||||
path: "/applications/{id}/documents/{kind}",
|
||||
tags: ["Applications"],
|
||||
operationId: "attachApplicationDocument",
|
||||
summary: "Attach an application document",
|
||||
description:
|
||||
"Uploads and attaches a PDF document to an application. Kind must be either resume or cover-letter. Requires authentication.",
|
||||
successDescription: "The updated application.",
|
||||
spec: (current) => {
|
||||
const requestBody = current.requestBody;
|
||||
if (!requestBody || "$ref" in requestBody) return current;
|
||||
|
||||
const multipart = requestBody.content?.["multipart/form-data"];
|
||||
if (!multipart) return current;
|
||||
|
||||
return {
|
||||
...current,
|
||||
requestBody: {
|
||||
...requestBody,
|
||||
content: { "multipart/form-data": multipart },
|
||||
},
|
||||
};
|
||||
},
|
||||
})
|
||||
.input(applicationDto.attachDocument.input)
|
||||
.use(resumeMutationRateLimit)
|
||||
.output(applicationDto.attachDocument.output)
|
||||
.handler(async ({ input, context }) => {
|
||||
const buffer = await input.file.arrayBuffer();
|
||||
|
||||
return applicationService.attachDocument({
|
||||
id: input.id,
|
||||
userId: context.user.id,
|
||||
kind: input.kind,
|
||||
fileName: input.file.name,
|
||||
contentType: input.file.type,
|
||||
data: new Uint8Array(buffer),
|
||||
});
|
||||
}),
|
||||
|
||||
removeDocument: protectedProcedure
|
||||
.route({
|
||||
method: "DELETE",
|
||||
path: "/applications/{id}/documents/{kind}",
|
||||
tags: ["Applications"],
|
||||
operationId: "removeApplicationDocument",
|
||||
summary: "Remove an application document",
|
||||
description:
|
||||
"Removes a resume or cover-letter PDF from an application and clears the stored document fields. Requires authentication.",
|
||||
successDescription: "The updated application.",
|
||||
})
|
||||
.input(applicationDto.removeDocument.input)
|
||||
.use(resumeMutationRateLimit)
|
||||
.output(applicationDto.removeDocument.output)
|
||||
.handler(async ({ input, context }) => {
|
||||
return applicationService.removeDocument({ id: input.id, userId: context.user.id, kind: input.kind });
|
||||
}),
|
||||
|
||||
addNote: protectedProcedure
|
||||
.route({
|
||||
method: "POST",
|
||||
|
||||
@@ -7,6 +7,8 @@ export const applicationsRouter = {
|
||||
create: crudRouter.create,
|
||||
import: crudRouter.import,
|
||||
update: crudRouter.update,
|
||||
attachDocument: crudRouter.attachDocument,
|
||||
removeDocument: crudRouter.removeDocument,
|
||||
addNote: crudRouter.addNote,
|
||||
delete: crudRouter.delete,
|
||||
bulkUpdate: crudRouter.bulkUpdate,
|
||||
|
||||
@@ -9,6 +9,7 @@ const dbMock = vi.hoisted(() => ({
|
||||
}));
|
||||
const resumeGetByIdMock = vi.hoisted(() => vi.fn());
|
||||
const storageDeleteMock = vi.hoisted(() => vi.fn());
|
||||
const uploadFileMock = vi.hoisted(() => vi.fn());
|
||||
|
||||
vi.mock("@reactive-resume/db/client", () => ({ db: dbMock }));
|
||||
vi.mock("@reactive-resume/db/schema", () => ({
|
||||
@@ -36,6 +37,7 @@ vi.mock("../resume/service", () => ({
|
||||
}));
|
||||
vi.mock("../storage/service", () => ({
|
||||
getStorageService: () => ({ delete: storageDeleteMock }),
|
||||
uploadFile: uploadFileMock,
|
||||
}));
|
||||
|
||||
const { applicationService } = await import("./service");
|
||||
@@ -51,17 +53,34 @@ const existing = {
|
||||
coverLetterUrl: "/api/uploads/user-1/pictures/cover.pdf",
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
const createSelectChain = (rows: unknown[]) => ({
|
||||
from: () => ({
|
||||
where: () => Promise.resolve(rows),
|
||||
}),
|
||||
});
|
||||
|
||||
const setSelectResults = (...results: unknown[][]) => {
|
||||
dbMock.select.mockReset();
|
||||
for (const rows of results) {
|
||||
dbMock.select.mockReturnValueOnce(createSelectChain(rows));
|
||||
}
|
||||
dbMock.select.mockReturnValue(createSelectChain([]));
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
dbMock.insert.mockReset();
|
||||
dbMock.update.mockReset();
|
||||
dbMock.delete.mockReset();
|
||||
resumeGetByIdMock.mockReset();
|
||||
storageDeleteMock.mockReset();
|
||||
uploadFileMock.mockReset();
|
||||
resumeGetByIdMock.mockResolvedValue({ id: "resume-1" });
|
||||
storageDeleteMock.mockResolvedValue(true);
|
||||
// requireOwned: db.select().from().where() resolves to [existing]
|
||||
dbMock.select.mockReturnValue({ from: () => ({ where: () => Promise.resolve([{ ...existing }]) }) });
|
||||
uploadFileMock.mockResolvedValue({
|
||||
url: "/api/uploads/user-1/pictures/new.pdf",
|
||||
key: "uploads/user-1/pictures/new.pdf",
|
||||
});
|
||||
setSelectResults([{ ...existing }]);
|
||||
});
|
||||
|
||||
describe("applicationService.create", () => {
|
||||
@@ -136,22 +155,129 @@ describe("applicationService.delete", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("applicationService.attachDocument", () => {
|
||||
it("uploads a PDF resume document and stores it on the application", async () => {
|
||||
setSelectResults([{ ...existing }], [{ ...existing }], []);
|
||||
const set = vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([{ ...existing }]) }) }));
|
||||
dbMock.update.mockReturnValue({ set });
|
||||
|
||||
await applicationService.attachDocument({
|
||||
id: "app-1",
|
||||
userId: "user-1",
|
||||
kind: "resume",
|
||||
fileName: "sent-resume.pdf",
|
||||
contentType: "application/pdf",
|
||||
data: new Uint8Array([1, 2, 3]),
|
||||
});
|
||||
|
||||
expect(uploadFileMock).toHaveBeenCalledWith({
|
||||
userId: "user-1",
|
||||
contentType: "application/pdf",
|
||||
data: new Uint8Array([1, 2, 3]),
|
||||
});
|
||||
expect(set).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
resumeFileUrl: "/api/uploads/user-1/pictures/new.pdf",
|
||||
resumeFileName: "sent-resume.pdf",
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
it("rejects non-PDF documents before upload", async () => {
|
||||
await expect(
|
||||
applicationService.attachDocument({
|
||||
id: "app-1",
|
||||
userId: "user-1",
|
||||
kind: "cover-letter",
|
||||
fileName: "cover.txt",
|
||||
contentType: "text/plain",
|
||||
data: new Uint8Array([1]),
|
||||
}),
|
||||
).rejects.toMatchObject({ code: "BAD_REQUEST" });
|
||||
|
||||
expect(uploadFileMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("does not delete the replaced upload when another application still references it", async () => {
|
||||
setSelectResults(
|
||||
[{ ...existing }],
|
||||
[{ ...existing }],
|
||||
[
|
||||
{
|
||||
id: "app-2",
|
||||
resumeFileUrl: existing.resumeFileUrl,
|
||||
coverLetterUrl: null,
|
||||
},
|
||||
],
|
||||
);
|
||||
const set = vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([{ ...existing }]) }) }));
|
||||
dbMock.update.mockReturnValue({ set });
|
||||
|
||||
await applicationService.attachDocument({
|
||||
id: "app-1",
|
||||
userId: "user-1",
|
||||
kind: "resume",
|
||||
fileName: "sent-resume.pdf",
|
||||
contentType: "application/pdf",
|
||||
data: new Uint8Array([1, 2, 3]),
|
||||
});
|
||||
|
||||
expect(storageDeleteMock).not.toHaveBeenCalledWith("uploads/user-1/pictures/resume.pdf");
|
||||
});
|
||||
});
|
||||
|
||||
describe("applicationService.removeDocument", () => {
|
||||
it("clears and deletes an owned cover letter document", async () => {
|
||||
setSelectResults([{ ...existing }], [{ ...existing }], []);
|
||||
const set = vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([{ ...existing }]) }) }));
|
||||
dbMock.update.mockReturnValue({ set });
|
||||
|
||||
await applicationService.removeDocument({ id: "app-1", userId: "user-1", kind: "cover-letter" });
|
||||
|
||||
expect(set).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
coverLetterUrl: null,
|
||||
coverLetterName: null,
|
||||
}),
|
||||
);
|
||||
expect(storageDeleteMock).toHaveBeenCalledWith("uploads/user-1/pictures/cover.pdf");
|
||||
});
|
||||
|
||||
it("does not delete a removed upload while another application still references it", async () => {
|
||||
setSelectResults(
|
||||
[{ ...existing }],
|
||||
[{ ...existing }],
|
||||
[
|
||||
{
|
||||
id: "app-2",
|
||||
resumeFileUrl: null,
|
||||
coverLetterUrl: existing.coverLetterUrl,
|
||||
},
|
||||
],
|
||||
);
|
||||
const set = vi.fn(() => ({ where: () => ({ returning: () => Promise.resolve([{ ...existing }]) }) }));
|
||||
dbMock.update.mockReturnValue({ set });
|
||||
|
||||
await applicationService.removeDocument({ id: "app-1", userId: "user-1", kind: "cover-letter" });
|
||||
|
||||
expect(storageDeleteMock).not.toHaveBeenCalledWith("uploads/user-1/pictures/cover.pdf");
|
||||
});
|
||||
});
|
||||
|
||||
describe("applicationService.bulkDelete", () => {
|
||||
it("deletes uploaded attachments for deleted owned applications", async () => {
|
||||
dbMock.select.mockReturnValue({
|
||||
from: () => ({
|
||||
where: () =>
|
||||
Promise.resolve([
|
||||
{ ...existing, id: "app-1" },
|
||||
{
|
||||
...existing,
|
||||
id: "app-2",
|
||||
resumeFileUrl: "http://localhost:3000/api/uploads/user-2/pictures/ignored.pdf",
|
||||
coverLetterUrl: null,
|
||||
},
|
||||
]),
|
||||
}),
|
||||
});
|
||||
setSelectResults(
|
||||
[
|
||||
{ ...existing, id: "app-1" },
|
||||
{
|
||||
...existing,
|
||||
id: "app-2",
|
||||
resumeFileUrl: "http://localhost:3000/api/uploads/user-2/pictures/ignored.pdf",
|
||||
coverLetterUrl: null,
|
||||
},
|
||||
],
|
||||
[],
|
||||
);
|
||||
dbMock.delete.mockReturnValue({
|
||||
where: () => ({ returning: () => Promise.resolve([{ id: "app-1" }, { id: "app-2" }]) }),
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { ActivityEvent, AiMetadata, ApplicationStatus, Contact } from "@reactive-resume/schema/applications/data";
|
||||
import type { ApplicationDocumentKind } from "../../dto/application";
|
||||
import { ORPCError } from "@orpc/client";
|
||||
import { and, arrayContains, desc, eq, inArray, sql } from "drizzle-orm";
|
||||
import { db } from "@reactive-resume/db/client";
|
||||
@@ -6,7 +7,7 @@ import * as schema from "@reactive-resume/db/schema";
|
||||
import { STAGES } from "@reactive-resume/schema/applications/data";
|
||||
import { generateId } from "@reactive-resume/utils/string";
|
||||
import { resumeService } from "../resume/service";
|
||||
import { getStorageService } from "../storage/service";
|
||||
import { getStorageService, uploadFile } from "../storage/service";
|
||||
|
||||
const stageLabel = (status: ApplicationStatus) => STAGES.find((s) => s.value === status)?.label ?? status;
|
||||
|
||||
@@ -79,7 +80,7 @@ async function deleteApplicationAttachments(
|
||||
userId: string,
|
||||
applications: { resumeFileUrl?: string | null; coverLetterUrl?: string | null }[],
|
||||
) {
|
||||
const keys = [
|
||||
const candidateKeys = [
|
||||
...new Set(
|
||||
applications.flatMap((application) => [
|
||||
storageKeyFromApplicationUrl(userId, application.resumeFileUrl),
|
||||
@@ -88,11 +89,41 @@ async function deleteApplicationAttachments(
|
||||
),
|
||||
].filter((key): key is string => !!key);
|
||||
|
||||
if (candidateKeys.length === 0) return;
|
||||
|
||||
const remainingApplications = await db
|
||||
.select({
|
||||
resumeFileUrl: schema.application.resumeFileUrl,
|
||||
coverLetterUrl: schema.application.coverLetterUrl,
|
||||
})
|
||||
.from(schema.application)
|
||||
.where(eq(schema.application.userId, userId));
|
||||
|
||||
const referencedKeys = new Set(
|
||||
remainingApplications.flatMap((application) => [
|
||||
storageKeyFromApplicationUrl(userId, application.resumeFileUrl),
|
||||
storageKeyFromApplicationUrl(userId, application.coverLetterUrl),
|
||||
]),
|
||||
);
|
||||
const keys = candidateKeys.filter((key) => !referencedKeys.has(key));
|
||||
|
||||
if (keys.length === 0) return;
|
||||
const storageService = getStorageService();
|
||||
await Promise.allSettled(keys.map((key) => storageService.delete(key)));
|
||||
}
|
||||
|
||||
function documentFields(kind: ApplicationDocumentKind) {
|
||||
return kind === "resume"
|
||||
? ({
|
||||
url: "resumeFileUrl",
|
||||
name: "resumeFileName",
|
||||
} as const)
|
||||
: ({
|
||||
url: "coverLetterUrl",
|
||||
name: "coverLetterName",
|
||||
} as const);
|
||||
}
|
||||
|
||||
const stripUserId = <T extends { userId: string }>(row: T) => {
|
||||
const { userId: _userId, ...rest } = row;
|
||||
return rest;
|
||||
@@ -197,6 +228,70 @@ export const applicationService = {
|
||||
return stripUserId(updated);
|
||||
},
|
||||
|
||||
attachDocument: async (input: {
|
||||
id: string;
|
||||
userId: string;
|
||||
kind: ApplicationDocumentKind;
|
||||
fileName: string;
|
||||
data: Uint8Array;
|
||||
contentType: string;
|
||||
}) => {
|
||||
if (input.contentType !== "application/pdf") {
|
||||
throw new ORPCError("BAD_REQUEST", { message: "Application documents must be PDF files." });
|
||||
}
|
||||
|
||||
const existing = await requireOwned(input.id, input.userId);
|
||||
const fields = documentFields(input.kind);
|
||||
const uploaded = await uploadFile({
|
||||
userId: input.userId,
|
||||
data: input.data,
|
||||
contentType: input.contentType,
|
||||
});
|
||||
|
||||
try {
|
||||
const updated = await applicationService.update({
|
||||
id: input.id,
|
||||
userId: input.userId,
|
||||
[fields.url]: uploaded.url,
|
||||
[fields.name]: input.fileName,
|
||||
});
|
||||
|
||||
await deleteApplicationAttachments(input.userId, [
|
||||
{
|
||||
resumeFileUrl: fields.url === "resumeFileUrl" ? existing.resumeFileUrl : null,
|
||||
coverLetterUrl: fields.url === "coverLetterUrl" ? existing.coverLetterUrl : null,
|
||||
},
|
||||
]);
|
||||
|
||||
return updated;
|
||||
} catch (error) {
|
||||
await getStorageService()
|
||||
.delete(uploaded.key)
|
||||
.catch(() => false);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
removeDocument: async (input: { id: string; userId: string; kind: ApplicationDocumentKind }) => {
|
||||
const existing = await requireOwned(input.id, input.userId);
|
||||
const fields = documentFields(input.kind);
|
||||
const updated = await applicationService.update({
|
||||
id: input.id,
|
||||
userId: input.userId,
|
||||
[fields.url]: null,
|
||||
[fields.name]: null,
|
||||
});
|
||||
|
||||
await deleteApplicationAttachments(input.userId, [
|
||||
{
|
||||
resumeFileUrl: fields.url === "resumeFileUrl" ? existing.resumeFileUrl : null,
|
||||
coverLetterUrl: fields.url === "coverLetterUrl" ? existing.coverLetterUrl : null,
|
||||
},
|
||||
]);
|
||||
|
||||
return updated;
|
||||
},
|
||||
|
||||
// Persist AI-owned enrichment (match score + freeform metadata). Separate from the editable
|
||||
// update path so these fields are only ever written by the AI procedures.
|
||||
setAiResult: async (input: {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { buildMcpServerCard } from "./mcp-server-card";
|
||||
import { MCP_TOOL_NAME } from "./mcp-tool-names";
|
||||
import { TOOL_META } from "./tool-meta";
|
||||
|
||||
describe("buildMcpServerCard", () => {
|
||||
const card = buildMcpServerCard("1.2.3");
|
||||
@@ -41,6 +42,15 @@ describe("buildMcpServerCard", () => {
|
||||
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
||||
});
|
||||
|
||||
it("advertises application tracker tools", () => {
|
||||
const names = card.tools.map((tool) => tool.name);
|
||||
|
||||
expect(names).toContain("list_applications");
|
||||
expect(names).toContain("create_application");
|
||||
expect(names).toContain("attach_application_document");
|
||||
expect(names).toContain("tailor_resume_for_application");
|
||||
});
|
||||
|
||||
it("declares a JSON Schema input for every tool", () => {
|
||||
for (const tool of card.tools) {
|
||||
expect(tool.inputSchema, tool.name).toBeDefined();
|
||||
@@ -71,4 +81,41 @@ describe("buildMcpServerCard", () => {
|
||||
const props = card.configurationSchema.properties as Record<string, unknown>;
|
||||
expect(props.apiKey).toBeDefined();
|
||||
});
|
||||
|
||||
it("matches the create/update application archived contract", () => {
|
||||
const create = TOOL_META[MCP_TOOL_NAME.createApplication].inputSchema;
|
||||
const update = TOOL_META[MCP_TOOL_NAME.updateApplication].inputSchema;
|
||||
|
||||
expect(create.safeParse({ company: "Acme", role: "Engineer", archived: true }).success).toBe(false);
|
||||
expect(update.safeParse({ id: "app-1", archived: true }).success).toBe(true);
|
||||
});
|
||||
|
||||
it("accepts only http/https application source URLs", () => {
|
||||
const create = TOOL_META[MCP_TOOL_NAME.createApplication].inputSchema;
|
||||
const autofill = TOOL_META[MCP_TOOL_NAME.autofillApplicationFromJob].inputSchema;
|
||||
|
||||
expect(create.safeParse({ company: "Acme", role: "Engineer", sourceUrl: "https://example.com/job" }).success).toBe(
|
||||
true,
|
||||
);
|
||||
expect(autofill.safeParse({ sourceUrl: "http://example.com/job" }).success).toBe(true);
|
||||
expect(create.safeParse({ company: "Acme", role: "Engineer", sourceUrl: "ftp://example.com/job" }).success).toBe(
|
||||
false,
|
||||
);
|
||||
expect(autofill.safeParse({ sourceUrl: "javascript:alert(1)" }).success).toBe(false);
|
||||
});
|
||||
|
||||
it("rejects application document payloads above 10MB decoded", () => {
|
||||
const schema = TOOL_META[MCP_TOOL_NAME.attachApplicationDocument].inputSchema;
|
||||
const tooLargePdf = Buffer.alloc(10 * 1024 * 1024 + 1, 0).toString("base64");
|
||||
|
||||
expect(
|
||||
schema.safeParse({
|
||||
id: "app-1",
|
||||
kind: "resume",
|
||||
fileName: "resume.pdf",
|
||||
contentType: "application/pdf",
|
||||
dataBase64: tooLargePdf,
|
||||
}).success,
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,4 +14,21 @@ export const MCP_TOOL_NAME = {
|
||||
lockResume: "lock_resume",
|
||||
unlockResume: "unlock_resume",
|
||||
getResumeStatistics: "get_resume_statistics",
|
||||
listApplications: "list_applications",
|
||||
readApplication: "read_application",
|
||||
listApplicationTags: "list_application_tags",
|
||||
getApplicationStats: "get_application_stats",
|
||||
createApplication: "create_application",
|
||||
updateApplication: "update_application",
|
||||
addApplicationNote: "add_application_note",
|
||||
deleteApplication: "delete_application",
|
||||
bulkUpdateApplications: "bulk_update_applications",
|
||||
bulkDeleteApplications: "bulk_delete_applications",
|
||||
importApplications: "import_applications",
|
||||
attachApplicationDocument: "attach_application_document",
|
||||
removeApplicationDocument: "remove_application_document",
|
||||
autofillApplicationFromJob: "autofill_application_from_job",
|
||||
scoreApplicationMatch: "score_application_match",
|
||||
tailorResumeForApplication: "tailor_resume_for_application",
|
||||
draftApplicationMessage: "draft_application_message",
|
||||
} as const;
|
||||
|
||||
@@ -15,6 +15,14 @@ describe("MCP_TOOL_NAME", () => {
|
||||
expect(MCP_TOOL_NAME.patchResume).toBe("apply_resume_patch");
|
||||
});
|
||||
|
||||
it("uses canonical application tool names", () => {
|
||||
expect(MCP_TOOL_NAME.listApplications).toBe("list_applications");
|
||||
expect(MCP_TOOL_NAME.readApplication).toBe("read_application");
|
||||
expect(MCP_TOOL_NAME.createApplication).toBe("create_application");
|
||||
expect(MCP_TOOL_NAME.attachApplicationDocument).toBe("attach_application_document");
|
||||
expect(MCP_TOOL_NAME.autofillApplicationFromJob).toBe("autofill_application_from_job");
|
||||
});
|
||||
|
||||
it("uses unique values for every tool", () => {
|
||||
const values = Object.values(MCP_TOOL_NAME);
|
||||
expect(new Set(values).size).toBe(values.length);
|
||||
@@ -35,6 +43,10 @@ describe("TOOL_ANNOTATIONS", () => {
|
||||
MCP_TOOL_NAME.getResume,
|
||||
MCP_TOOL_NAME.getResumeAnalysis,
|
||||
MCP_TOOL_NAME.getResumeStatistics,
|
||||
MCP_TOOL_NAME.listApplications,
|
||||
MCP_TOOL_NAME.readApplication,
|
||||
MCP_TOOL_NAME.listApplicationTags,
|
||||
MCP_TOOL_NAME.getApplicationStats,
|
||||
];
|
||||
for (const name of readOnlyTools) {
|
||||
const annotations = TOOL_ANNOTATIONS[name];
|
||||
@@ -58,6 +70,14 @@ describe("TOOL_ANNOTATIONS", () => {
|
||||
expect(annotations.readOnlyHint).toBe(false);
|
||||
});
|
||||
|
||||
it("marks application delete tools as destructive", () => {
|
||||
for (const name of [MCP_TOOL_NAME.deleteApplication, MCP_TOOL_NAME.bulkDeleteApplications]) {
|
||||
const annotations = TOOL_ANNOTATIONS[name];
|
||||
expect(annotations.readOnlyHint, name).toBe(false);
|
||||
expect(annotations.destructiveHint, name).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it("marks creation/import/duplicate as non-readonly and non-idempotent", () => {
|
||||
for (const name of [
|
||||
MCP_TOOL_NAME.createResume,
|
||||
@@ -82,8 +102,13 @@ describe("TOOL_ANNOTATIONS", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("marks only job-posting autofill as open-world", () => {
|
||||
expect(TOOL_ANNOTATIONS[MCP_TOOL_NAME.autofillApplicationFromJob].openWorldHint).toBe(true);
|
||||
});
|
||||
|
||||
it("declares no tools as open-world by default", () => {
|
||||
for (const annotations of Object.values(TOOL_ANNOTATIONS)) {
|
||||
for (const [name, annotations] of Object.entries(TOOL_ANNOTATIONS)) {
|
||||
if (name === MCP_TOOL_NAME.autofillApplicationFromJob) continue;
|
||||
expect(annotations.openWorldHint).toBe(false);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -16,6 +16,12 @@ const READ_NON_IDEMPOTENT: ToolAnnotations = {
|
||||
idempotentHint: false,
|
||||
openWorldHint: false,
|
||||
};
|
||||
const READ_OPEN_WORLD_NON_IDEMPOTENT: ToolAnnotations = {
|
||||
readOnlyHint: true,
|
||||
destructiveHint: false,
|
||||
idempotentHint: false,
|
||||
openWorldHint: true,
|
||||
};
|
||||
const WRITE_NON_IDEMPOTENT: ToolAnnotations = {
|
||||
readOnlyHint: false,
|
||||
destructiveHint: false,
|
||||
@@ -51,4 +57,21 @@ export const TOOL_ANNOTATIONS: Record<McpRegisteredToolName, ToolAnnotations> =
|
||||
[MCP_TOOL_NAME.lockResume]: WRITE_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.unlockResume]: WRITE_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.getResumeStatistics]: READ_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.listApplications]: READ_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.readApplication]: READ_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.listApplicationTags]: READ_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.getApplicationStats]: READ_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.createApplication]: WRITE_NON_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.updateApplication]: WRITE_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.addApplicationNote]: WRITE_NON_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.deleteApplication]: WRITE_DESTRUCTIVE,
|
||||
[MCP_TOOL_NAME.bulkUpdateApplications]: WRITE_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.bulkDeleteApplications]: WRITE_DESTRUCTIVE,
|
||||
[MCP_TOOL_NAME.importApplications]: WRITE_NON_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.attachApplicationDocument]: WRITE_NON_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.removeApplicationDocument]: WRITE_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.autofillApplicationFromJob]: READ_OPEN_WORLD_NON_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.scoreApplicationMatch]: WRITE_NON_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.tailorResumeForApplication]: WRITE_NON_IDEMPOTENT,
|
||||
[MCP_TOOL_NAME.draftApplicationMessage]: READ_NON_IDEMPOTENT,
|
||||
};
|
||||
|
||||
@@ -4,11 +4,71 @@
|
||||
*/
|
||||
import z from "zod";
|
||||
import { resumePatchOperationsSchema } from "@reactive-resume/ai/tools/resume-tool-contracts";
|
||||
import { applicationStatusSchema, contactSchema } from "@reactive-resume/schema/applications/data";
|
||||
import { MCP_TOOL_NAME as T } from "./mcp-tool-names";
|
||||
import { TOOL_ANNOTATIONS } from "./tool-annotations";
|
||||
|
||||
const MAX_APPLICATION_DOCUMENT_BYTES = 10 * 1024 * 1024;
|
||||
|
||||
// ponytail: shared schema fragment; exported so server-card can re-use without re-importing
|
||||
const resumeIdSchema = z.string().min(1).describe(`Resume ID. Use \`${T.listResumes}\` to find valid IDs.`);
|
||||
const applicationIdSchema = z
|
||||
.string()
|
||||
.min(1)
|
||||
.describe(`Application ID. Use \`${T.listApplications}\` to find valid IDs.`);
|
||||
const applicationDocumentKindSchema = z.enum(["resume", "cover-letter"]);
|
||||
const httpUrlSchema = z
|
||||
.string()
|
||||
.trim()
|
||||
.refine((value) => {
|
||||
try {
|
||||
const parsed = new URL(value);
|
||||
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}, "URL must use http or https.");
|
||||
const pdfBase64Schema = z
|
||||
.string()
|
||||
.min(1)
|
||||
.refine((value) => Buffer.from(value, "base64").byteLength <= MAX_APPLICATION_DOCUMENT_BYTES, {
|
||||
message: "Decoded PDF must be 10MB or smaller.",
|
||||
})
|
||||
.describe("Base64-encoded PDF bytes. Only application/pdf documents up to 10MB are accepted.");
|
||||
|
||||
const applicationMutableFieldsSchema = {
|
||||
company: z.string().min(1).optional().describe("Company name."),
|
||||
role: z.string().min(1).optional().describe("Role or job title."),
|
||||
status: applicationStatusSchema.optional().describe("Pipeline stage."),
|
||||
location: z.string().nullable().optional(),
|
||||
salary: z.string().nullable().optional(),
|
||||
source: z.string().nullable().optional(),
|
||||
sourceUrl: httpUrlSchema.nullable().optional(),
|
||||
jobDescription: z.string().max(20_000).nullable().optional(),
|
||||
notes: z.string().nullable().optional(),
|
||||
resumeId: z.string().nullable().optional(),
|
||||
resumeFileUrl: z.string().nullable().optional(),
|
||||
resumeFileName: z.string().nullable().optional(),
|
||||
coverLetterUrl: z.string().nullable().optional(),
|
||||
coverLetterName: z.string().nullable().optional(),
|
||||
followUpAt: z
|
||||
.string()
|
||||
.datetime({ offset: true })
|
||||
.nullable()
|
||||
.optional()
|
||||
.describe("Follow-up timestamp in ISO 8601 format."),
|
||||
followUpNote: z.string().nullable().optional(),
|
||||
contacts: z.array(contactSchema).optional(),
|
||||
tags: z.array(z.string()).optional(),
|
||||
} as const;
|
||||
|
||||
const createApplicationSchema = z
|
||||
.object({
|
||||
...applicationMutableFieldsSchema,
|
||||
company: z.string().min(1).describe("Company name."),
|
||||
role: z.string().min(1).describe("Role or job title."),
|
||||
})
|
||||
.strict();
|
||||
|
||||
export const TOOL_META = {
|
||||
[T.listResumes]: {
|
||||
@@ -234,4 +294,131 @@ export const TOOL_META = {
|
||||
inputSchema: z.object({ id: resumeIdSchema }),
|
||||
annotations: TOOL_ANNOTATIONS[T.getResumeStatistics],
|
||||
},
|
||||
[T.listApplications]: {
|
||||
title: "List Applications",
|
||||
description:
|
||||
"List job applications for the authenticated account. Use this before reading or updating existing applications.",
|
||||
inputSchema: z.object({
|
||||
status: applicationStatusSchema.optional(),
|
||||
tags: z.array(z.string()).optional().default([]),
|
||||
includeArchived: z.boolean().optional().default(false),
|
||||
}),
|
||||
annotations: TOOL_ANNOTATIONS[T.listApplications],
|
||||
},
|
||||
[T.readApplication]: {
|
||||
title: "Read Application",
|
||||
description: "Read one full job application, including contacts, document URLs, follow-up details, and timeline.",
|
||||
inputSchema: z.object({ id: applicationIdSchema }),
|
||||
annotations: TOOL_ANNOTATIONS[T.readApplication],
|
||||
},
|
||||
[T.listApplicationTags]: {
|
||||
title: "List Application Tags",
|
||||
description: "Return every distinct tag used across job applications.",
|
||||
inputSchema: z.object({}),
|
||||
annotations: TOOL_ANNOTATIONS[T.listApplicationTags],
|
||||
},
|
||||
[T.getApplicationStats]: {
|
||||
title: "Get Application Stats",
|
||||
description: "Return aggregate application counts by pipeline stage and source for insights.",
|
||||
inputSchema: z.object({}),
|
||||
annotations: TOOL_ANNOTATIONS[T.getApplicationStats],
|
||||
},
|
||||
[T.createApplication]: {
|
||||
title: "Create Application",
|
||||
description: "Create a tracked job application. Company and role are required.",
|
||||
inputSchema: createApplicationSchema,
|
||||
annotations: TOOL_ANNOTATIONS[T.createApplication],
|
||||
},
|
||||
[T.updateApplication]: {
|
||||
title: "Update Application",
|
||||
description:
|
||||
"Update application fields, move stages, archive/unarchive, edit contacts, follow-up, tags, or linked resume.",
|
||||
inputSchema: z.object({
|
||||
id: applicationIdSchema,
|
||||
...applicationMutableFieldsSchema,
|
||||
archived: z.boolean().optional().describe("Whether the application is hidden from active views."),
|
||||
}),
|
||||
annotations: TOOL_ANNOTATIONS[T.updateApplication],
|
||||
},
|
||||
[T.addApplicationNote]: {
|
||||
title: "Add Application Note",
|
||||
description: "Append a free-text note to an application's timeline.",
|
||||
inputSchema: z.object({ id: applicationIdSchema, text: z.string().min(1) }),
|
||||
annotations: TOOL_ANNOTATIONS[T.addApplicationNote],
|
||||
},
|
||||
[T.deleteApplication]: {
|
||||
title: "Delete Application",
|
||||
description: "Permanently delete one job application and its owned uploaded documents.",
|
||||
inputSchema: z.object({ id: applicationIdSchema }),
|
||||
annotations: TOOL_ANNOTATIONS[T.deleteApplication],
|
||||
},
|
||||
[T.bulkUpdateApplications]: {
|
||||
title: "Bulk Update Applications",
|
||||
description: "Move, archive/unarchive, or add tags to multiple applications.",
|
||||
inputSchema: z.object({
|
||||
ids: z.array(z.string()).min(1),
|
||||
status: applicationStatusSchema.optional(),
|
||||
archived: z.boolean().optional(),
|
||||
addTags: z.array(z.string()).optional(),
|
||||
}),
|
||||
annotations: TOOL_ANNOTATIONS[T.bulkUpdateApplications],
|
||||
},
|
||||
[T.bulkDeleteApplications]: {
|
||||
title: "Bulk Delete Applications",
|
||||
description: "Permanently delete multiple applications.",
|
||||
inputSchema: z.object({ ids: z.array(z.string()).min(1) }),
|
||||
annotations: TOOL_ANNOTATIONS[T.bulkDeleteApplications],
|
||||
},
|
||||
[T.importApplications]: {
|
||||
title: "Import Applications",
|
||||
description: "Bulk-create application rows parsed from CSV or another source. Maximum 500 items.",
|
||||
inputSchema: z.object({ items: z.array(createApplicationSchema).min(1).max(500) }),
|
||||
annotations: TOOL_ANNOTATIONS[T.importApplications],
|
||||
},
|
||||
[T.attachApplicationDocument]: {
|
||||
title: "Attach Application Document",
|
||||
description: "Attach a sent resume or cover-letter PDF to an application using base64-encoded PDF bytes.",
|
||||
inputSchema: z.object({
|
||||
id: applicationIdSchema,
|
||||
kind: applicationDocumentKindSchema,
|
||||
fileName: z.string().min(1),
|
||||
contentType: z.literal("application/pdf"),
|
||||
dataBase64: pdfBase64Schema,
|
||||
}),
|
||||
annotations: TOOL_ANNOTATIONS[T.attachApplicationDocument],
|
||||
},
|
||||
[T.removeApplicationDocument]: {
|
||||
title: "Remove Application Document",
|
||||
description: "Remove a sent resume or cover-letter PDF from an application.",
|
||||
inputSchema: z.object({ id: applicationIdSchema, kind: applicationDocumentKindSchema }),
|
||||
annotations: TOOL_ANNOTATIONS[T.removeApplicationDocument],
|
||||
},
|
||||
[T.autofillApplicationFromJob]: {
|
||||
title: "Autofill Application From Job",
|
||||
description:
|
||||
"Use AI to extract company, role, location, salary, and job description from a job URL or pasted posting.",
|
||||
inputSchema: z.object({
|
||||
sourceUrl: httpUrlSchema.optional(),
|
||||
jobDescription: z.string().max(20_000).optional(),
|
||||
}),
|
||||
annotations: TOOL_ANNOTATIONS[T.autofillApplicationFromJob],
|
||||
},
|
||||
[T.scoreApplicationMatch]: {
|
||||
title: "Score Application Match",
|
||||
description: "Score the linked resume against the application's job description and persist match metadata.",
|
||||
inputSchema: z.object({ id: applicationIdSchema }),
|
||||
annotations: TOOL_ANNOTATIONS[T.scoreApplicationMatch],
|
||||
},
|
||||
[T.tailorResumeForApplication]: {
|
||||
title: "Tailor Resume For Application",
|
||||
description: "Create and link a tailored copy of the application's linked resume.",
|
||||
inputSchema: z.object({ id: applicationIdSchema }),
|
||||
annotations: TOOL_ANNOTATIONS[T.tailorResumeForApplication],
|
||||
},
|
||||
[T.draftApplicationMessage]: {
|
||||
title: "Draft Application Message",
|
||||
description: "Draft either a cover letter or recruiter follow-up from application and resume context.",
|
||||
inputSchema: z.object({ id: applicationIdSchema, kind: z.enum(["cover-letter", "follow-up"]) }),
|
||||
annotations: TOOL_ANNOTATIONS[T.draftApplicationMessage],
|
||||
},
|
||||
} as const;
|
||||
|
||||
@@ -23,7 +23,7 @@ vi.mock("@reactive-resume/env/server", () => ({
|
||||
|
||||
const { MCP_TOOL_NAME, registerTools } = await import("./tools");
|
||||
|
||||
type ToolHandler = (input: { id: string }) => Promise<{
|
||||
type ToolHandler = (input: Record<string, unknown>) => Promise<{
|
||||
content: Array<{ type: "text"; text: string }>;
|
||||
isError?: boolean;
|
||||
}>;
|
||||
@@ -63,6 +63,27 @@ const clientMock = {
|
||||
setLocked: vi.fn(),
|
||||
statistics: { getById: vi.fn() },
|
||||
},
|
||||
applications: {
|
||||
list: vi.fn(),
|
||||
getById: vi.fn(),
|
||||
tags: vi.fn(),
|
||||
stats: vi.fn(),
|
||||
create: vi.fn(),
|
||||
update: vi.fn(),
|
||||
addNote: vi.fn(),
|
||||
delete: vi.fn(),
|
||||
bulkUpdate: vi.fn(),
|
||||
bulkDelete: vi.fn(),
|
||||
import: vi.fn(),
|
||||
attachDocument: vi.fn(),
|
||||
removeDocument: vi.fn(),
|
||||
ai: {
|
||||
autofill: vi.fn(),
|
||||
matchScore: vi.fn(),
|
||||
tailorResume: vi.fn(),
|
||||
draftMessage: vi.fn(),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
describe("registerTools", () => {
|
||||
@@ -104,4 +125,123 @@ describe("registerTools", () => {
|
||||
it("keeps the tool name stable", () => {
|
||||
expect(MCP_TOOL_NAME.downloadResumePdf).toBe("download_resume_pdf");
|
||||
});
|
||||
|
||||
it("registers application tracker tools", () => {
|
||||
const { server, registered } = makeFakeServer();
|
||||
registerTools(server as never, clientMock as never, new Headers());
|
||||
|
||||
const names = registered.map((item) => item.name);
|
||||
expect(names).toContain("list_applications");
|
||||
expect(names).toContain("create_application");
|
||||
expect(names).toContain("attach_application_document");
|
||||
expect(names).toContain("draft_application_message");
|
||||
});
|
||||
|
||||
it("lists applications as JSON", async () => {
|
||||
clientMock.applications.list.mockResolvedValueOnce([{ id: "app-1", company: "Acme", role: "Engineer" }]);
|
||||
const { server, registered } = makeFakeServer();
|
||||
registerTools(server as never, clientMock as never, new Headers());
|
||||
|
||||
const tool = registered.find((item) => item.name === "list_applications")!;
|
||||
const result = await tool.handler({ includeArchived: true, tags: ["remote"] });
|
||||
|
||||
expect(clientMock.applications.list).toHaveBeenCalledWith({ includeArchived: true, tags: ["remote"] });
|
||||
expect(JSON.parse(result.content[0]!.text)).toEqual([{ id: "app-1", company: "Acme", role: "Engineer" }]);
|
||||
});
|
||||
|
||||
it("creates applications through the router client", async () => {
|
||||
clientMock.applications.create.mockResolvedValueOnce("app-1");
|
||||
const { server, registered } = makeFakeServer();
|
||||
registerTools(server as never, clientMock as never, new Headers());
|
||||
|
||||
const tool = registered.find((item) => item.name === "create_application")!;
|
||||
const result = await tool.handler({
|
||||
company: "Acme",
|
||||
role: "Engineer",
|
||||
status: "saved",
|
||||
followUpAt: "2026-07-10T09:30:00.000Z",
|
||||
});
|
||||
|
||||
expect(clientMock.applications.create).toHaveBeenCalledWith({
|
||||
company: "Acme",
|
||||
role: "Engineer",
|
||||
status: "saved",
|
||||
followUpAt: new Date("2026-07-10T09:30:00.000Z"),
|
||||
});
|
||||
expect(JSON.parse(result.content[0]!.text)).toEqual({ id: "app-1" });
|
||||
});
|
||||
|
||||
it("updates applications with followUpAt coerced to Date", async () => {
|
||||
clientMock.applications.update.mockResolvedValueOnce({ id: "app-1", company: "Acme" });
|
||||
const { server, registered } = makeFakeServer();
|
||||
registerTools(server as never, clientMock as never, new Headers());
|
||||
|
||||
const tool = registered.find((item) => item.name === "update_application")!;
|
||||
await tool.handler({ id: "app-1", followUpAt: "2026-07-11T10:15:00.000Z" });
|
||||
|
||||
expect(clientMock.applications.update).toHaveBeenCalledWith({
|
||||
id: "app-1",
|
||||
followUpAt: new Date("2026-07-11T10:15:00.000Z"),
|
||||
});
|
||||
});
|
||||
|
||||
it("imports applications with followUpAt coerced to Date and null preserved", async () => {
|
||||
clientMock.applications.import.mockResolvedValueOnce({ imported: 2 });
|
||||
const { server, registered } = makeFakeServer();
|
||||
registerTools(server as never, clientMock as never, new Headers());
|
||||
|
||||
const tool = registered.find((item) => item.name === "import_applications")!;
|
||||
const result = await tool.handler({
|
||||
items: [
|
||||
{ company: "Acme", role: "Engineer", followUpAt: "2026-07-12T12:00:00.000Z" },
|
||||
{ company: "Beta", role: "Designer", followUpAt: null },
|
||||
],
|
||||
});
|
||||
|
||||
expect(clientMock.applications.import).toHaveBeenCalledWith({
|
||||
items: [
|
||||
{ company: "Acme", role: "Engineer", followUpAt: new Date("2026-07-12T12:00:00.000Z") },
|
||||
{ company: "Beta", role: "Designer", followUpAt: null },
|
||||
],
|
||||
});
|
||||
expect(JSON.parse(result.content[0]!.text)).toEqual({ imported: 2 });
|
||||
});
|
||||
|
||||
it("attaches a base64 PDF document through the router client", async () => {
|
||||
clientMock.applications.attachDocument.mockResolvedValueOnce({ id: "app-1", resumeFileName: "resume.pdf" });
|
||||
const { server, registered } = makeFakeServer();
|
||||
registerTools(server as never, clientMock as never, new Headers());
|
||||
|
||||
const tool = registered.find((item) => item.name === "attach_application_document")!;
|
||||
const result = await tool.handler({
|
||||
id: "app-1",
|
||||
kind: "resume",
|
||||
fileName: "resume.pdf",
|
||||
contentType: "application/pdf",
|
||||
dataBase64: Buffer.from("%PDF-1.4").toString("base64"),
|
||||
});
|
||||
|
||||
const call = clientMock.applications.attachDocument.mock.calls[0]?.[0] as { file: File };
|
||||
expect(call.file).toBeInstanceOf(File);
|
||||
expect(call.file.name).toBe("resume.pdf");
|
||||
expect(call.file.type).toBe("application/pdf");
|
||||
expect(JSON.parse(result.content[0]!.text)).toEqual({ id: "app-1", resumeFileName: "resume.pdf" });
|
||||
});
|
||||
|
||||
it("rejects non-PDF application document attachments before calling the client", async () => {
|
||||
const { server, registered } = makeFakeServer();
|
||||
registerTools(server as never, clientMock as never, new Headers());
|
||||
|
||||
const tool = registered.find((item) => item.name === "attach_application_document")!;
|
||||
const result = await tool.handler({
|
||||
id: "app-1",
|
||||
kind: "resume",
|
||||
fileName: "resume.txt",
|
||||
contentType: "text/plain",
|
||||
dataBase64: Buffer.from("hello").toString("base64"),
|
||||
});
|
||||
|
||||
expect(result.isError).toBe(true);
|
||||
expect(clientMock.applications.attachDocument).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,6 +4,7 @@ import type { RouterClient } from "@orpc/server";
|
||||
import type { resumePatchOperationsSchema } from "@reactive-resume/ai/tools/resume-tool-contracts";
|
||||
import type router from "@reactive-resume/api/routers";
|
||||
import type z from "zod";
|
||||
import { Buffer } from "node:buffer";
|
||||
import { resolveUserFromRequestHeaders } from "@reactive-resume/api/context";
|
||||
import { createResumePdfDownloadUrl } from "@reactive-resume/api/features/resume/export";
|
||||
import { env } from "@reactive-resume/env/server";
|
||||
@@ -57,6 +58,28 @@ function text(value: string): CallToolResult {
|
||||
return { content: [{ type: "text", text: value }] };
|
||||
}
|
||||
|
||||
function json(value: unknown): CallToolResult {
|
||||
return text(JSON.stringify(value, null, 2));
|
||||
}
|
||||
|
||||
function fileFromBase64(input: { fileName: string; contentType: string; dataBase64: string }): File {
|
||||
if (input.contentType !== "application/pdf") throw new Error("Application documents must be PDF files.");
|
||||
|
||||
const bytes = Buffer.from(input.dataBase64, "base64");
|
||||
if (bytes.length === 0) throw new Error("Application document cannot be empty.");
|
||||
|
||||
return new File([bytes], input.fileName, { type: input.contentType });
|
||||
}
|
||||
|
||||
function coerceFollowUpAt(input: Record<string, unknown>): Record<string, unknown> {
|
||||
if (!("followUpAt" in input)) return input;
|
||||
|
||||
const followUpAt = input.followUpAt;
|
||||
if (followUpAt === undefined || followUpAt === null || followUpAt instanceof Date) return input;
|
||||
|
||||
return { ...input, followUpAt: new Date(String(followUpAt)) };
|
||||
}
|
||||
|
||||
function buildResumeShareUrl(username: string, slug: string): string {
|
||||
const base = env.APP_URL.replace(/\/$/, "");
|
||||
return `${base}/${encodeURIComponent(username)}/${encodeURIComponent(slug)}`;
|
||||
@@ -339,4 +362,161 @@ export function registerTools(server: McpServer, client: RouterClient<typeof rou
|
||||
return text(JSON.stringify(stats, null, 2));
|
||||
}),
|
||||
);
|
||||
|
||||
// ── Applications ──────────────────────────────────────────────
|
||||
server.registerTool(
|
||||
T.listApplications,
|
||||
TOOL_META[T.listApplications],
|
||||
withErrorHandling("listing applications", async (params) => json(await client.applications.list(params as never))),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.readApplication,
|
||||
TOOL_META[T.readApplication],
|
||||
withErrorHandling("reading application", async ({ id }: { id: string }) =>
|
||||
json(await client.applications.getById({ id })),
|
||||
),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.listApplicationTags,
|
||||
TOOL_META[T.listApplicationTags],
|
||||
withErrorHandling("listing application tags", async () => json(await client.applications.tags())),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.getApplicationStats,
|
||||
TOOL_META[T.getApplicationStats],
|
||||
withErrorHandling("getting application stats", async () => json(await client.applications.stats())),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.createApplication,
|
||||
TOOL_META[T.createApplication],
|
||||
withErrorHandling("creating application", async (params) => {
|
||||
const id = await client.applications.create(coerceFollowUpAt(params as Record<string, unknown>) as never);
|
||||
return json({ id });
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.updateApplication,
|
||||
TOOL_META[T.updateApplication],
|
||||
withErrorHandling("updating application", async (params) => {
|
||||
return json(await client.applications.update(coerceFollowUpAt(params as Record<string, unknown>) as never));
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.addApplicationNote,
|
||||
TOOL_META[T.addApplicationNote],
|
||||
withErrorHandling("adding application note", async ({ id, text: noteText }: { id: string; text: string }) => {
|
||||
return json(await client.applications.addNote({ id, text: noteText }));
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.deleteApplication,
|
||||
TOOL_META[T.deleteApplication],
|
||||
withErrorHandling("deleting application", async ({ id }: { id: string }) => {
|
||||
await client.applications.delete({ id });
|
||||
return text(`Deleted application (${id}).`);
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.bulkUpdateApplications,
|
||||
TOOL_META[T.bulkUpdateApplications],
|
||||
withErrorHandling("bulk updating applications", async (params) =>
|
||||
json(await client.applications.bulkUpdate(params as never)),
|
||||
),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.bulkDeleteApplications,
|
||||
TOOL_META[T.bulkDeleteApplications],
|
||||
withErrorHandling("bulk deleting applications", async ({ ids }: { ids: string[] }) => {
|
||||
return json(await client.applications.bulkDelete({ ids }));
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.importApplications,
|
||||
TOOL_META[T.importApplications],
|
||||
withErrorHandling("importing applications", async (params) => {
|
||||
const input = params as { items: Array<Record<string, unknown>> };
|
||||
return json(
|
||||
await client.applications.import({ items: input.items.map((item) => coerceFollowUpAt(item)) } as never),
|
||||
);
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.attachApplicationDocument,
|
||||
TOOL_META[T.attachApplicationDocument],
|
||||
withErrorHandling(
|
||||
"attaching application document",
|
||||
async ({
|
||||
id,
|
||||
kind,
|
||||
fileName,
|
||||
contentType,
|
||||
dataBase64,
|
||||
}: {
|
||||
id: string;
|
||||
kind: "resume" | "cover-letter";
|
||||
fileName: string;
|
||||
contentType: string;
|
||||
dataBase64: string;
|
||||
}) => {
|
||||
const file = fileFromBase64({ fileName, contentType, dataBase64 });
|
||||
return json(await client.applications.attachDocument({ id, kind, file }));
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.removeApplicationDocument,
|
||||
TOOL_META[T.removeApplicationDocument],
|
||||
withErrorHandling(
|
||||
"removing application document",
|
||||
async ({ id, kind }: { id: string; kind: "resume" | "cover-letter" }) => {
|
||||
return json(await client.applications.removeDocument({ id, kind }));
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.autofillApplicationFromJob,
|
||||
TOOL_META[T.autofillApplicationFromJob],
|
||||
withErrorHandling("autofilling application from job", async (params) =>
|
||||
json(await client.applications.ai.autofill(params as never)),
|
||||
),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.scoreApplicationMatch,
|
||||
TOOL_META[T.scoreApplicationMatch],
|
||||
withErrorHandling("scoring application match", async ({ id }: { id: string }) => {
|
||||
return json(await client.applications.ai.matchScore({ id }));
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.tailorResumeForApplication,
|
||||
TOOL_META[T.tailorResumeForApplication],
|
||||
withErrorHandling("tailoring resume for application", async ({ id }: { id: string }) => {
|
||||
return json(await client.applications.ai.tailorResume({ id }));
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
T.draftApplicationMessage,
|
||||
TOOL_META[T.draftApplicationMessage],
|
||||
withErrorHandling(
|
||||
"drafting application message",
|
||||
async ({ id, kind }: { id: string; kind: "cover-letter" | "follow-up" }) =>
|
||||
json(await client.applications.ai.draftMessage({ id, kind })),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Generated
+245
@@ -54,6 +54,9 @@ importers:
|
||||
'@vitest/coverage-v8':
|
||||
specifier: ^4.1.9
|
||||
version: 4.1.9(vitest@4.1.9)
|
||||
github-actionlint:
|
||||
specifier: 1.7.12
|
||||
version: 1.7.12
|
||||
happy-dom:
|
||||
specifier: ^20.10.6
|
||||
version: 20.10.6
|
||||
@@ -63,6 +66,9 @@ importers:
|
||||
lefthook:
|
||||
specifier: ^2.1.9
|
||||
version: 2.1.9
|
||||
markdownlint-cli2:
|
||||
specifier: 0.23.0
|
||||
version: 0.23.0
|
||||
pg:
|
||||
specifier: ^8.22.0
|
||||
version: 8.22.0
|
||||
@@ -2390,6 +2396,10 @@ packages:
|
||||
'@ioredis/commands@1.10.0':
|
||||
resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==}
|
||||
|
||||
'@isaacs/fs-minipass@4.0.1':
|
||||
resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@jest/schemas@29.6.3':
|
||||
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
|
||||
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
||||
@@ -4229,6 +4239,9 @@ packages:
|
||||
'@types/jsesc@2.5.1':
|
||||
resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==}
|
||||
|
||||
'@types/katex@0.16.8':
|
||||
resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==}
|
||||
|
||||
'@types/mdast@4.0.4':
|
||||
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
|
||||
|
||||
@@ -4447,6 +4460,10 @@ packages:
|
||||
resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
adm-zip@0.5.18:
|
||||
resolution: {integrity: sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==}
|
||||
engines: {node: '>=12.0'}
|
||||
|
||||
ai@7.0.15:
|
||||
resolution: {integrity: sha512-7406MUy9O5sIhwOgxEWuoj+td3XUGgG96SBt6pmBU4t4sQ2fpnDx5UnHaXT2HUTXl5GorbWz/MfCrSPRz0QJqw==}
|
||||
engines: {node: '>=22'}
|
||||
@@ -4752,6 +4769,10 @@ packages:
|
||||
resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
|
||||
engines: {node: '>= 20.19.0'}
|
||||
|
||||
chownr@3.0.0:
|
||||
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
citty@0.2.2:
|
||||
resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==}
|
||||
|
||||
@@ -4848,6 +4869,10 @@ packages:
|
||||
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
commander@8.3.0:
|
||||
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
|
||||
engines: {node: '>= 12'}
|
||||
|
||||
conf@10.2.0:
|
||||
resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -5568,6 +5593,11 @@ packages:
|
||||
deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead.
|
||||
hasBin: true
|
||||
|
||||
github-actionlint@1.7.12:
|
||||
resolution: {integrity: sha512-kSVz5clt9voatp2Tdh1BETKNooT358/nPChYseaDC4M6f9Hc/sBRMbhagx2FTu2F/WHzDoxlNPh2EqwBngTYQg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
hasBin: true
|
||||
|
||||
glob-parent@5.1.2:
|
||||
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
||||
engines: {node: '>= 6'}
|
||||
@@ -5584,6 +5614,10 @@ packages:
|
||||
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
globby@16.2.0:
|
||||
resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
goober@2.1.19:
|
||||
resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==}
|
||||
peerDependencies:
|
||||
@@ -5681,6 +5715,10 @@ packages:
|
||||
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
|
||||
engines: {node: '>= 4'}
|
||||
|
||||
ignore@7.0.5:
|
||||
resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
|
||||
engines: {node: '>= 4'}
|
||||
|
||||
immediate@3.0.6:
|
||||
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
|
||||
|
||||
@@ -5793,6 +5831,10 @@ packages:
|
||||
resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
is-path-inside@4.0.0:
|
||||
resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
is-plain-obj@4.1.0:
|
||||
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -5902,6 +5944,10 @@ packages:
|
||||
resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==}
|
||||
hasBin: true
|
||||
|
||||
js-yaml@5.2.0:
|
||||
resolution: {integrity: sha512-YeLUMlvR4Ou1B119LIaM0r65JvbOBooJDc9yEu0dClb/uSC5P4FrLU8OCCz/HXWvtPoIrR0dRzABTjo1sTN9Bw==}
|
||||
hasBin: true
|
||||
|
||||
jsbi@4.3.2:
|
||||
resolution: {integrity: sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==}
|
||||
|
||||
@@ -5930,9 +5976,16 @@ packages:
|
||||
engines: {node: '>=6'}
|
||||
hasBin: true
|
||||
|
||||
jsonc-parser@3.3.1:
|
||||
resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
|
||||
|
||||
jsonfile@6.2.1:
|
||||
resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
|
||||
|
||||
jsonpointer@5.0.1:
|
||||
resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
jsonrepair@3.15.0:
|
||||
resolution: {integrity: sha512-wy8OTjwsJwQRnQJkKnMJJ9vcytRdBPAgIF/Hy6+s1dAj42BHMKiyL8JzEieIl3JY7idt8eyHwBWTO8mh/+mtwA==}
|
||||
hasBin: true
|
||||
@@ -5940,6 +5993,10 @@ packages:
|
||||
jszip@3.10.1:
|
||||
resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
|
||||
|
||||
katex@0.16.47:
|
||||
resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==}
|
||||
hasBin: true
|
||||
|
||||
kleur@3.0.3:
|
||||
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -6111,6 +6168,9 @@ packages:
|
||||
lines-and-columns@1.2.4:
|
||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||
|
||||
linkify-it@5.0.2:
|
||||
resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==}
|
||||
|
||||
linkifyjs@4.3.3:
|
||||
resolution: {integrity: sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==}
|
||||
|
||||
@@ -6157,9 +6217,27 @@ packages:
|
||||
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
markdown-it@14.2.0:
|
||||
resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==}
|
||||
hasBin: true
|
||||
|
||||
markdown-table@3.0.4:
|
||||
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
|
||||
|
||||
markdownlint-cli2-formatter-default@0.0.6:
|
||||
resolution: {integrity: sha512-VVDGKsq9sgzu378swJ0fcHfSicUnMxnL8gnLm/Q4J/xsNJ4e5bA6lvAz7PCzIl0/No0lHyaWdqVD2jotxOSFMQ==}
|
||||
peerDependencies:
|
||||
markdownlint-cli2: '>=0.0.4'
|
||||
|
||||
markdownlint-cli2@0.23.0:
|
||||
resolution: {integrity: sha512-1nmgQmU/ZTMRVwYCDs7i1HI3zfBISnT2NNRv+9V01oOLZbAtqL+a7tldpPhBWBVBten3FqhMCGV6EUh9McqutQ==}
|
||||
engines: {node: '>=22'}
|
||||
hasBin: true
|
||||
|
||||
markdownlint@0.41.0:
|
||||
resolution: {integrity: sha512-xMUI3ChBuRuxuLF4ENvCZyS8z/+Jly1coUcZwErKLIB3sDj7ojpaTBa1e9YVPhSN4jGEIjYGQCldbTJS/hqS+A==}
|
||||
engines: {node: '>=22'}
|
||||
|
||||
marked@15.0.12:
|
||||
resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==}
|
||||
engines: {node: '>= 18'}
|
||||
@@ -6220,6 +6298,9 @@ packages:
|
||||
mdn-data@2.27.1:
|
||||
resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
|
||||
|
||||
mdurl@2.0.0:
|
||||
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
|
||||
|
||||
media-engine@1.0.3:
|
||||
resolution: {integrity: sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==}
|
||||
|
||||
@@ -6249,6 +6330,9 @@ packages:
|
||||
micromark-core-commonmark@2.0.3:
|
||||
resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
|
||||
|
||||
micromark-extension-directive@4.0.0:
|
||||
resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==}
|
||||
|
||||
micromark-extension-gfm-autolink-literal@2.1.0:
|
||||
resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
|
||||
|
||||
@@ -6270,6 +6354,9 @@ packages:
|
||||
micromark-extension-gfm@3.0.0:
|
||||
resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
|
||||
|
||||
micromark-extension-math@3.1.0:
|
||||
resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==}
|
||||
|
||||
micromark-factory-destination@2.0.1:
|
||||
resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
|
||||
|
||||
@@ -6380,6 +6467,10 @@ packages:
|
||||
resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
minizlib@3.1.0:
|
||||
resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
moo@0.5.3:
|
||||
resolution: {integrity: sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==}
|
||||
|
||||
@@ -6876,6 +6967,10 @@ packages:
|
||||
engines: {node: '>=16.0.0'}
|
||||
hasBin: true
|
||||
|
||||
punycode.js@2.3.1:
|
||||
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
pvtsutils@1.3.6:
|
||||
resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==}
|
||||
|
||||
@@ -7260,6 +7355,10 @@ packages:
|
||||
sisteransi@1.0.5:
|
||||
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
|
||||
|
||||
slash@5.1.0:
|
||||
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
|
||||
engines: {node: '>=14.16'}
|
||||
|
||||
smol-toml@1.7.0:
|
||||
resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==}
|
||||
engines: {node: '>= 18'}
|
||||
@@ -7441,6 +7540,10 @@ packages:
|
||||
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
tar@7.5.19:
|
||||
resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
throttleit@2.1.0:
|
||||
resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -7578,6 +7681,9 @@ packages:
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
uc.micro@2.1.0:
|
||||
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
|
||||
|
||||
uint8array-extras@1.5.0:
|
||||
resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -7613,6 +7719,10 @@ packages:
|
||||
resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
unicorn-magic@0.4.0:
|
||||
resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
unified@11.0.5:
|
||||
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
|
||||
|
||||
@@ -7905,6 +8015,10 @@ packages:
|
||||
yallist@3.1.1:
|
||||
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
|
||||
|
||||
yallist@5.0.0:
|
||||
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
yaml@1.10.3:
|
||||
resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==}
|
||||
engines: {node: '>= 6'}
|
||||
@@ -9201,6 +9315,10 @@ snapshots:
|
||||
|
||||
'@ioredis/commands@1.10.0': {}
|
||||
|
||||
'@isaacs/fs-minipass@4.0.1':
|
||||
dependencies:
|
||||
minipass: 7.1.3
|
||||
|
||||
'@jest/schemas@29.6.3':
|
||||
dependencies:
|
||||
'@sinclair/typebox': 0.27.10
|
||||
@@ -11071,6 +11189,8 @@ snapshots:
|
||||
|
||||
'@types/jsesc@2.5.1': {}
|
||||
|
||||
'@types/katex@0.16.8': {}
|
||||
|
||||
'@types/mdast@4.0.4':
|
||||
dependencies:
|
||||
'@types/unist': 3.0.3
|
||||
@@ -11290,6 +11410,8 @@ snapshots:
|
||||
mime-types: 3.0.2
|
||||
negotiator: 1.0.0
|
||||
|
||||
adm-zip@0.5.18: {}
|
||||
|
||||
ai@7.0.15(zod@4.4.3):
|
||||
dependencies:
|
||||
'@ai-sdk/gateway': 4.0.12(zod@4.4.3)
|
||||
@@ -11550,6 +11672,8 @@ snapshots:
|
||||
dependencies:
|
||||
readdirp: 5.0.0
|
||||
|
||||
chownr@3.0.0: {}
|
||||
|
||||
citty@0.2.2: {}
|
||||
|
||||
cjk-regex@3.4.0:
|
||||
@@ -11635,6 +11759,8 @@ snapshots:
|
||||
|
||||
commander@14.0.3: {}
|
||||
|
||||
commander@8.3.0: {}
|
||||
|
||||
conf@10.2.0:
|
||||
dependencies:
|
||||
ajv: 8.20.0
|
||||
@@ -12243,6 +12369,11 @@ snapshots:
|
||||
- conventional-commits-filter
|
||||
- conventional-commits-parser
|
||||
|
||||
github-actionlint@1.7.12:
|
||||
dependencies:
|
||||
adm-zip: 0.5.18
|
||||
tar: 7.5.19
|
||||
|
||||
glob-parent@5.1.2:
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
@@ -12259,6 +12390,15 @@ snapshots:
|
||||
|
||||
globals@11.12.0: {}
|
||||
|
||||
globby@16.2.0:
|
||||
dependencies:
|
||||
'@sindresorhus/merge-streams': 4.0.0
|
||||
fast-glob: 3.3.3
|
||||
ignore: 7.0.5
|
||||
is-path-inside: 4.0.0
|
||||
slash: 5.1.0
|
||||
unicorn-magic: 0.4.0
|
||||
|
||||
goober@2.1.19(csstype@3.2.3):
|
||||
dependencies:
|
||||
csstype: 3.2.3
|
||||
@@ -12377,6 +12517,8 @@ snapshots:
|
||||
|
||||
ignore@5.3.2: {}
|
||||
|
||||
ignore@7.0.5: {}
|
||||
|
||||
immediate@3.0.6: {}
|
||||
|
||||
immer@11.1.11: {}
|
||||
@@ -12460,6 +12602,8 @@ snapshots:
|
||||
|
||||
is-obj@3.0.0: {}
|
||||
|
||||
is-path-inside@4.0.0: {}
|
||||
|
||||
is-plain-obj@4.1.0: {}
|
||||
|
||||
is-promise@4.0.0: {}
|
||||
@@ -12542,6 +12686,10 @@ snapshots:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
|
||||
js-yaml@5.2.0:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
|
||||
jsbi@4.3.2: {}
|
||||
|
||||
jsesc@3.1.0: {}
|
||||
@@ -12558,12 +12706,16 @@ snapshots:
|
||||
|
||||
json5@2.2.3: {}
|
||||
|
||||
jsonc-parser@3.3.1: {}
|
||||
|
||||
jsonfile@6.2.1:
|
||||
dependencies:
|
||||
universalify: 2.0.1
|
||||
optionalDependencies:
|
||||
graceful-fs: 4.2.11
|
||||
|
||||
jsonpointer@5.0.1: {}
|
||||
|
||||
jsonrepair@3.15.0: {}
|
||||
|
||||
jszip@3.10.1:
|
||||
@@ -12573,6 +12725,10 @@ snapshots:
|
||||
readable-stream: 2.3.8
|
||||
setimmediate: 1.0.5
|
||||
|
||||
katex@0.16.47:
|
||||
dependencies:
|
||||
commander: 8.3.0
|
||||
|
||||
kleur@3.0.3: {}
|
||||
|
||||
kleur@4.1.5: {}
|
||||
@@ -12711,6 +12867,10 @@ snapshots:
|
||||
|
||||
lines-and-columns@1.2.4: {}
|
||||
|
||||
linkify-it@5.0.2:
|
||||
dependencies:
|
||||
uc.micro: 2.1.0
|
||||
|
||||
linkifyjs@4.3.3: {}
|
||||
|
||||
locate-path@3.0.0:
|
||||
@@ -12758,8 +12918,49 @@ snapshots:
|
||||
dependencies:
|
||||
semver: 7.8.5
|
||||
|
||||
markdown-it@14.2.0:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
entities: 4.5.0
|
||||
linkify-it: 5.0.2
|
||||
mdurl: 2.0.0
|
||||
punycode.js: 2.3.1
|
||||
uc.micro: 2.1.0
|
||||
|
||||
markdown-table@3.0.4: {}
|
||||
|
||||
markdownlint-cli2-formatter-default@0.0.6(markdownlint-cli2@0.23.0):
|
||||
dependencies:
|
||||
markdownlint-cli2: 0.23.0
|
||||
|
||||
markdownlint-cli2@0.23.0:
|
||||
dependencies:
|
||||
globby: 16.2.0
|
||||
js-yaml: 5.2.0
|
||||
jsonc-parser: 3.3.1
|
||||
jsonpointer: 5.0.1
|
||||
markdown-it: 14.2.0
|
||||
markdownlint: 0.41.0
|
||||
markdownlint-cli2-formatter-default: 0.0.6(markdownlint-cli2@0.23.0)
|
||||
micromatch: 4.0.8
|
||||
smol-toml: 1.7.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
markdownlint@0.41.0:
|
||||
dependencies:
|
||||
micromark: 4.0.2
|
||||
micromark-core-commonmark: 2.0.3
|
||||
micromark-extension-directive: 4.0.0
|
||||
micromark-extension-gfm-autolink-literal: 2.1.0
|
||||
micromark-extension-gfm-footnote: 2.1.0
|
||||
micromark-extension-gfm-table: 2.1.1
|
||||
micromark-extension-math: 3.1.0
|
||||
micromark-util-types: 2.0.2
|
||||
string-width: 8.2.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
marked@15.0.12: {}
|
||||
|
||||
math-intrinsics@1.1.0: {}
|
||||
@@ -12921,6 +13122,8 @@ snapshots:
|
||||
|
||||
mdn-data@2.27.1: {}
|
||||
|
||||
mdurl@2.0.0: {}
|
||||
|
||||
media-engine@1.0.3: {}
|
||||
|
||||
media-typer@1.1.0: {}
|
||||
@@ -12954,6 +13157,16 @@ snapshots:
|
||||
micromark-util-symbol: 2.0.1
|
||||
micromark-util-types: 2.0.2
|
||||
|
||||
micromark-extension-directive@4.0.0:
|
||||
dependencies:
|
||||
devlop: 1.1.0
|
||||
micromark-factory-space: 2.0.1
|
||||
micromark-factory-whitespace: 2.0.1
|
||||
micromark-util-character: 2.1.1
|
||||
micromark-util-symbol: 2.0.1
|
||||
micromark-util-types: 2.0.2
|
||||
parse-entities: 4.0.2
|
||||
|
||||
micromark-extension-gfm-autolink-literal@2.1.0:
|
||||
dependencies:
|
||||
micromark-util-character: 2.1.1
|
||||
@@ -13012,6 +13225,16 @@ snapshots:
|
||||
micromark-util-combine-extensions: 2.0.1
|
||||
micromark-util-types: 2.0.2
|
||||
|
||||
micromark-extension-math@3.1.0:
|
||||
dependencies:
|
||||
'@types/katex': 0.16.8
|
||||
devlop: 1.1.0
|
||||
katex: 0.16.47
|
||||
micromark-factory-space: 2.0.1
|
||||
micromark-util-character: 2.1.1
|
||||
micromark-util-symbol: 2.0.1
|
||||
micromark-util-types: 2.0.2
|
||||
|
||||
micromark-factory-destination@2.0.1:
|
||||
dependencies:
|
||||
micromark-util-character: 2.1.1
|
||||
@@ -13161,6 +13384,10 @@ snapshots:
|
||||
|
||||
minipass@7.1.3: {}
|
||||
|
||||
minizlib@3.1.0:
|
||||
dependencies:
|
||||
minipass: 7.1.3
|
||||
|
||||
moo@0.5.3: {}
|
||||
|
||||
motion-dom@12.42.2:
|
||||
@@ -13740,6 +13967,8 @@ snapshots:
|
||||
dependencies:
|
||||
commander: 10.0.1
|
||||
|
||||
punycode.js@2.3.1: {}
|
||||
|
||||
pvtsutils@1.3.6:
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
@@ -14265,6 +14494,8 @@ snapshots:
|
||||
|
||||
sisteransi@1.0.5: {}
|
||||
|
||||
slash@5.1.0: {}
|
||||
|
||||
smol-toml@1.7.0: {}
|
||||
|
||||
socket.io-adapter@2.5.8:
|
||||
@@ -14435,6 +14666,14 @@ snapshots:
|
||||
|
||||
tapable@2.3.3: {}
|
||||
|
||||
tar@7.5.19:
|
||||
dependencies:
|
||||
'@isaacs/fs-minipass': 4.0.1
|
||||
chownr: 3.0.0
|
||||
minipass: 7.1.3
|
||||
minizlib: 3.1.0
|
||||
yallist: 5.0.0
|
||||
|
||||
throttleit@2.1.0: {}
|
||||
|
||||
tiny-inflate@1.0.3: {}
|
||||
@@ -14555,6 +14794,8 @@ snapshots:
|
||||
|
||||
typescript@6.0.3: {}
|
||||
|
||||
uc.micro@2.1.0: {}
|
||||
|
||||
uint8array-extras@1.5.0: {}
|
||||
|
||||
unbash@4.0.2: {}
|
||||
@@ -14586,6 +14827,8 @@ snapshots:
|
||||
|
||||
unicorn-magic@0.3.0: {}
|
||||
|
||||
unicorn-magic@0.4.0: {}
|
||||
|
||||
unified@11.0.5:
|
||||
dependencies:
|
||||
'@types/unist': 3.0.3
|
||||
@@ -14796,6 +15039,8 @@ snapshots:
|
||||
|
||||
yallist@3.1.1: {}
|
||||
|
||||
yallist@5.0.0: {}
|
||||
|
||||
yaml@1.10.3: {}
|
||||
|
||||
yaml@2.9.0: {}
|
||||
|
||||
@@ -16,6 +16,18 @@ Build professional resumes through conversational AI for [Reactive Resume](https
|
||||
|
||||
## Workflow
|
||||
|
||||
### MCP Application Tracking
|
||||
|
||||
Reactive Resume MCP can manage job applications as well as resumes. When the user wants to track applications through an agent, use the application tools instead of asking them to open the web UI.
|
||||
|
||||
- Use `list_applications` before changing existing records.
|
||||
- Use `create_application` for one new opportunity or `import_applications` for spreadsheet/CSV rows.
|
||||
- Use `update_application` to move stages, archive/unarchive, edit contacts, set follow-ups, link a resume, or update job details.
|
||||
- Use `add_application_note` to log timeline activity.
|
||||
- Use `attach_application_document` and `remove_application_document` for sent resume or cover-letter PDFs.
|
||||
- Use `score_application_match`, `tailor_resume_for_application`, and `draft_application_message` for Application Copilot workflows after a linked resume and job description exist.
|
||||
- Review AI-generated cover letters and follow-ups before sending them.
|
||||
|
||||
### Step 1: Gather Basic Information
|
||||
|
||||
Ask for essential details first, unless the user has already provided them:
|
||||
|
||||
Reference in New Issue
Block a user