fix(assistant): green CI round, trip notes the assistant can keep, calmer change cards

- the assistant keeps facts for a trip (remember_for_trip) as a change card,
  applied into the user's trip notes; existing expenses can be changed
- change card fields as a few icon chips with the rest folded under Details,
  the day band marks only what changes, the week grid as compact tiles
- no map button on receipts of things that have no place on the map
- tests follow the composer's accessible name, the receipt's status icon and
  the GL map's container; the hanging stream helper honours an early abort
- Postgres probe: qualified columns in the upsert updates; entities restored
  to the generator's output; strict ratchet reads the SDK client as untyped
This commit is contained in:
Maurice
2026-10-21 21:22:12 +02:00
parent 26df56d76c
commit b6f7488591
63 changed files with 509 additions and 133 deletions
+3 -1
View File
@@ -63,8 +63,10 @@ export const ASSISTANT_CHANGE_VERB_KEYS = [
'updatePackingItem',
'addTodo',
'addBudgetItem',
'updateBudgetItem',
'addReservation',
'importBooking',
'rememberNote',
] as const;
export const assistantChangeVerbKeySchema = z.enum(ASSISTANT_CHANGE_VERB_KEYS);
export type AssistantChangeVerbKey = z.infer<typeof assistantChangeVerbKeySchema>;
@@ -271,7 +273,7 @@ export type AssistantChangePreview = z.infer<typeof assistantChangePreviewSchema
/** An applied change: what it touched, and until when it can be undone. */
export const assistantAppliedSchema = z.object({
toolCallId: z.string(),
entity: z.enum(['place', 'assignment', 'day_note', 'packing', 'todo', 'budget', 'reservation']),
entity: z.enum(['place', 'assignment', 'day_note', 'packing', 'todo', 'budget', 'reservation', 'memory']),
ids: z.array(idSchema),
dayId: idSchema.nullable(),
undoUntil: z.string().nullable(),
+4
View File
@@ -488,5 +488,9 @@ const assistant: TranslationStrings = {
'assistant.week.showAll.two': 'عرض التغييرين',
'assistant.week.showAll.few': 'عرض التغييرات الـ {count}',
'assistant.week.showAll.many': 'عرض التغييرات الـ {count}',
'assistant.change.verb.updateBudgetItem': 'تعديل المصروف',
'assistant.change.verb.rememberNote': 'تذكّر لهذه الرحلة',
'assistant.change.details': 'التفاصيل',
'assistant.change.detailsHide': 'إخفاء التفاصيل',
};
export default assistant;
+4
View File
@@ -396,5 +396,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} dəyişiklik',
'assistant.week.showAll': 'Bütün {count} dəyişikliyi göstər',
'assistant.week.showAll.one': '{count} dəyişikliyi göstər',
'assistant.change.verb.updateBudgetItem': 'Xərci dəyiş',
'assistant.change.verb.rememberNote': 'Bu səyahət üçün yadda saxla',
'assistant.change.details': 'Təfərrüatlar',
'assistant.change.detailsHide': 'Təfərrüatları gizlət',
};
export default assistant;
+4
View File
@@ -396,5 +396,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': "{count} c'hemm",
'assistant.week.showAll': 'Diskouez an {count} kemm',
'assistant.week.showAll.one': "Diskouez {count} c'hemm",
'assistant.change.verb.updateBudgetItem': 'Kemmañ an dispign',
'assistant.change.verb.rememberNote': 'Derc’hel soñj evit ar veaj-mañ',
'assistant.change.details': 'Munudoù',
'assistant.change.detailsHide': 'Kuzhat ar munudoù',
};
export default assistant;
+4
View File
@@ -399,5 +399,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} canvi',
'assistant.week.showAll': 'Mostra els {count} canvis',
'assistant.week.showAll.one': 'Mostra {count} canvi',
'assistant.change.verb.updateBudgetItem': 'Canvia la despesa',
'assistant.change.verb.rememberNote': 'Recorda per a aquest viatge',
'assistant.change.details': 'Detalls',
'assistant.change.detailsHide': 'Amaga els detalls',
};
export default assistant;
+4
View File
@@ -418,5 +418,9 @@ const assistant: TranslationStrings = {
'assistant.week.showAll': 'Zobrazit všech {count} změn',
'assistant.week.showAll.one': 'Zobrazit {count} změnu',
'assistant.week.showAll.few': 'Zobrazit všechny {count} změny',
'assistant.change.verb.updateBudgetItem': 'Změnit výdaj',
'assistant.change.verb.rememberNote': 'Zapamatovat pro tuto cestu',
'assistant.change.details': 'Podrobnosti',
'assistant.change.detailsHide': 'Skrýt podrobnosti',
};
export default assistant;
+4
View File
@@ -396,5 +396,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} Änderung',
'assistant.week.showAll': 'Alle {count} Änderungen zeigen',
'assistant.week.showAll.one': '{count} Änderung zeigen',
'assistant.change.verb.updateBudgetItem': 'Ausgabe ändern',
'assistant.change.verb.rememberNote': 'Für diese Reise merken',
'assistant.change.details': 'Details',
'assistant.change.detailsHide': 'Details ausblenden',
};
export default assistant;
+4
View File
@@ -391,5 +391,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} change',
'assistant.week.showAll': 'Show all {count} changes',
'assistant.week.showAll.one': 'Show {count} change',
'assistant.change.verb.updateBudgetItem': 'Change expense',
'assistant.change.verb.rememberNote': 'Remember for this trip',
'assistant.change.details': 'Details',
'assistant.change.detailsHide': 'Hide details',
};
export default assistant;
+4
View File
@@ -394,5 +394,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} cambio',
'assistant.week.showAll': 'Ver los {count} cambios',
'assistant.week.showAll.one': 'Ver {count} cambio',
'assistant.change.verb.updateBudgetItem': 'Cambiar gasto',
'assistant.change.verb.rememberNote': 'Recordar para este viaje',
'assistant.change.details': 'Detalles',
'assistant.change.detailsHide': 'Ocultar detalles',
};
export default assistant;
+4
View File
@@ -395,5 +395,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} muudatus',
'assistant.week.showAll': 'Näita kõiki {count} muudatust',
'assistant.week.showAll.one': 'Näita {count} muudatust',
'assistant.change.verb.updateBudgetItem': 'Muuda kulu',
'assistant.change.verb.rememberNote': 'Jäta selle reisi jaoks meelde',
'assistant.change.details': 'Üksikasjad',
'assistant.change.detailsHide': 'Peida üksikasjad',
};
export default assistant;
+4
View File
@@ -401,5 +401,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} modification',
'assistant.week.showAll': 'Afficher les {count} modifications',
'assistant.week.showAll.one': 'Afficher {count} modification',
'assistant.change.verb.updateBudgetItem': 'Modifier la dépense',
'assistant.change.verb.rememberNote': 'Retenir pour ce voyage',
'assistant.change.details': 'Détails',
'assistant.change.detailsHide': 'Masquer les détails',
};
export default assistant;
+4
View File
@@ -400,5 +400,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} αλλαγή',
'assistant.week.showAll': 'Εμφάνιση όλων των {count} αλλαγών',
'assistant.week.showAll.one': 'Εμφάνιση {count} αλλαγής',
'assistant.change.verb.updateBudgetItem': 'Αλλαγή εξόδου',
'assistant.change.verb.rememberNote': 'Απομνημόνευση για αυτό το ταξίδι',
'assistant.change.details': 'Λεπτομέρειες',
'assistant.change.detailsHide': 'Απόκρυψη λεπτομερειών',
};
export default assistant;
+4
View File
@@ -401,5 +401,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} módosítás',
'assistant.week.showAll': 'Mind a {count} módosítás mutatása',
'assistant.week.showAll.one': '{count} módosítás mutatása',
'assistant.change.verb.updateBudgetItem': 'Kiadás módosítása',
'assistant.change.verb.rememberNote': 'Megjegyezni ehhez az utazáshoz',
'assistant.change.details': 'Részletek',
'assistant.change.detailsHide': 'Részletek elrejtése',
};
export default assistant;
+4
View File
@@ -373,5 +373,9 @@ const assistant: TranslationStrings = {
'assistant.check.issues': '{count} hal perlu dicek',
'assistant.week.changes': '{count} perubahan',
'assistant.week.showAll': 'Tampilkan semua {count} perubahan',
'assistant.change.verb.updateBudgetItem': 'Ubah pengeluaran',
'assistant.change.verb.rememberNote': 'Ingat untuk perjalanan ini',
'assistant.change.details': 'Detail',
'assistant.change.detailsHide': 'Sembunyikan detail',
};
export default assistant;
+4
View File
@@ -402,5 +402,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} modifica',
'assistant.week.showAll': 'Mostra tutte le {count} modifiche',
'assistant.week.showAll.one': 'Mostra {count} modifica',
'assistant.change.verb.updateBudgetItem': 'Modifica spesa',
'assistant.change.verb.rememberNote': 'Ricorda per questo viaggio',
'assistant.change.details': 'Dettagli',
'assistant.change.detailsHide': 'Nascondi dettagli',
};
export default assistant;
+4
View File
@@ -368,5 +368,9 @@ const assistant: TranslationStrings = {
'assistant.check.issues': '確認事項 {count} 件',
'assistant.week.changes': '{count} 件の変更',
'assistant.week.showAll': '{count} 件の変更をすべて表示',
'assistant.change.verb.updateBudgetItem': '支出を変更',
'assistant.change.verb.rememberNote': 'この旅行のために覚えておく',
'assistant.change.details': '詳細',
'assistant.change.detailsHide': '詳細を隠す',
};
export default assistant;
+4
View File
@@ -365,5 +365,9 @@ const assistant: TranslationStrings = {
'assistant.check.issues': '확인할 점 {count}개',
'assistant.week.changes': '변경 {count}개',
'assistant.week.showAll': '변경 {count}개 모두 보기',
'assistant.change.verb.updateBudgetItem': '지출 변경',
'assistant.change.verb.rememberNote': '이 여행에 기억하기',
'assistant.change.details': '세부 정보',
'assistant.change.detailsHide': '세부 정보 숨기기',
};
export default assistant;
+4
View File
@@ -397,5 +397,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} wijziging',
'assistant.week.showAll': 'Alle {count} wijzigingen tonen',
'assistant.week.showAll.one': '{count} wijziging tonen',
'assistant.change.verb.updateBudgetItem': 'Uitgave wijzigen',
'assistant.change.verb.rememberNote': 'Onthouden voor deze reis',
'assistant.change.details': 'Details',
'assistant.change.detailsHide': 'Details verbergen',
};
export default assistant;
+4
View File
@@ -445,5 +445,9 @@ const assistant: TranslationStrings = {
'assistant.week.showAll.one': 'Pokaż {count} zmianę',
'assistant.week.showAll.few': 'Pokaż wszystkie {count} zmiany',
'assistant.week.showAll.many': 'Pokaż wszystkie {count} zmian',
'assistant.change.verb.updateBudgetItem': 'Zmień wydatek',
'assistant.change.verb.rememberNote': 'Zapamiętaj dla tej podróży',
'assistant.change.details': 'Szczegóły',
'assistant.change.detailsHide': 'Ukryj szczegóły',
};
export default assistant;
+4
View File
@@ -445,5 +445,9 @@ const assistant: TranslationStrings = {
'assistant.week.showAll.one': 'Показать {count} изменение',
'assistant.week.showAll.few': 'Показать все {count} изменения',
'assistant.week.showAll.many': 'Показать все {count} изменений',
'assistant.change.verb.updateBudgetItem': 'Изменить расход',
'assistant.change.verb.rememberNote': 'Запомнить для этой поездки',
'assistant.change.details': 'Подробности',
'assistant.change.detailsHide': 'Скрыть подробности',
};
export default assistant;
+4
View File
@@ -418,5 +418,9 @@ const assistant: TranslationStrings = {
'assistant.week.showAll': 'Zobraziť všetkých {count} zmien',
'assistant.week.showAll.one': 'Zobraziť {count} zmenu',
'assistant.week.showAll.few': 'Zobraziť všetky {count} zmeny',
'assistant.change.verb.updateBudgetItem': 'Zmeniť výdavok',
'assistant.change.verb.rememberNote': 'Zapamätať pre túto cestu',
'assistant.change.details': 'Podrobnosti',
'assistant.change.detailsHide': 'Skryť podrobnosti',
};
export default assistant;
+4
View File
@@ -395,5 +395,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} ändring',
'assistant.week.showAll': 'Visa alla {count} ändringar',
'assistant.week.showAll.one': 'Visa {count} ändring',
'assistant.change.verb.updateBudgetItem': 'Ändra utgift',
'assistant.change.verb.rememberNote': 'Kom ihåg för den här resan',
'assistant.change.details': 'Detaljer',
'assistant.change.detailsHide': 'Dölj detaljer',
};
export default assistant;
+4
View File
@@ -365,5 +365,9 @@ const assistant: TranslationStrings = {
'assistant.check.issues': 'มี {count} จุดที่ควรตรวจ',
'assistant.week.changes': 'การเปลี่ยนแปลง {count} รายการ',
'assistant.week.showAll': 'แสดงการเปลี่ยนแปลงทั้ง {count} รายการ',
'assistant.change.verb.updateBudgetItem': 'แก้ไขค่าใช้จ่าย',
'assistant.change.verb.rememberNote': 'จำไว้สำหรับทริปนี้',
'assistant.change.details': 'รายละเอียด',
'assistant.change.detailsHide': 'ซ่อนรายละเอียด',
};
export default assistant;
+4
View File
@@ -395,5 +395,9 @@ const assistant: TranslationStrings = {
'assistant.week.changes.one': '{count} değişiklik',
'assistant.week.showAll': '{count} değişikliğin tümünü göster',
'assistant.week.showAll.one': '{count} değişikliği göster',
'assistant.change.verb.updateBudgetItem': 'Harcamayı değiştir',
'assistant.change.verb.rememberNote': 'Bu gezi için hatırla',
'assistant.change.details': 'Ayrıntılar',
'assistant.change.detailsHide': 'Ayrıntıları gizle',
};
export default assistant;
+4
View File
@@ -443,5 +443,9 @@ const assistant: TranslationStrings = {
'assistant.week.showAll.one': 'Показати {count} зміну',
'assistant.week.showAll.few': 'Показати всі {count} зміни',
'assistant.week.showAll.many': 'Показати всі {count} змін',
'assistant.change.verb.updateBudgetItem': 'Змінити витрату',
'assistant.change.verb.rememberNote': 'Запам’ятати для цієї подорожі',
'assistant.change.details': 'Подробиці',
'assistant.change.detailsHide': 'Сховати подробиці',
};
export default assistant;
+4
View File
@@ -368,5 +368,9 @@ const assistant: TranslationStrings = {
'assistant.check.issues': '{count} điểm cần xem',
'assistant.week.changes': '{count} thay đổi',
'assistant.week.showAll': 'Hiện tất cả {count} thay đổi',
'assistant.change.verb.updateBudgetItem': 'Sửa khoản chi',
'assistant.change.verb.rememberNote': 'Ghi nhớ cho chuyến đi này',
'assistant.change.details': 'Chi tiết',
'assistant.change.detailsHide': 'Ẩn chi tiết',
};
export default assistant;
+4
View File
@@ -362,5 +362,9 @@ const assistant: TranslationStrings = {
'assistant.check.issues': '{count} 處需要注意',
'assistant.week.changes': '{count} 項變更',
'assistant.week.showAll': '顯示全部 {count} 項變更',
'assistant.change.verb.updateBudgetItem': '修改支出',
'assistant.change.verb.rememberNote': '為此行程記住',
'assistant.change.details': '詳細資料',
'assistant.change.detailsHide': '隱藏詳細資料',
};
export default assistant;
+4
View File
@@ -362,5 +362,9 @@ const assistant: TranslationStrings = {
'assistant.check.issues': '{count} 处需要注意',
'assistant.week.changes': '{count} 项更改',
'assistant.week.showAll': '显示全部 {count} 项更改',
'assistant.change.verb.updateBudgetItem': '修改支出',
'assistant.change.verb.rememberNote': '为此行程记住',
'assistant.change.details': '详情',
'assistant.change.detailsHide': '隐藏详情',
};
export default assistant;
+1 -9
View File
@@ -5,15 +5,7 @@
*/
export type PlaceKind =
| 'lodging'
| 'food'
| 'drinks'
| 'sight'
| 'shopping'
| 'transport'
| 'beach'
| 'nature'
| 'activity';
'lodging' | 'food' | 'drinks' | 'sight' | 'shopping' | 'transport' | 'beach' | 'nature' | 'activity';
/** A trip category as far as the guess reads it. */
export interface PlaceKindCategory {