Files
TREK/client/src/store/assistantChatKey.ts
T
Maurice 5d334d7ec8 feat(assistant): the assistant opens outside a trip, as a home chat about all trips
A third scope, home, next to trip and journey: threads that name neither a
trip nor a journey (the CHECK now only forbids both), reached under
/api/assistant by their owner only. A home turn reads the user's trips
through list_trips into a short card (under way, next, later, behind,
undated), offers every read (a trip's on the id the model names, checked by
the tool with the user's rights) and only the writes that take no trip or
journey (atlas, vacation planner, collections, tour library, settings), all
held as change cards. open_trip_chat answers with a card that goes on in
that trip's own chat with the question waiting in its composer.

On the desktop the window opens on the home chat outside a trip; its head
lists the trips to switch into and a switched trip chat has the way back.
On the phone the home chat opens full screen from the dashboard head and the
dock's More list, and the card opens the trip with its chat. Both run on
useAssistantHome.
2026-10-23 22:00:06 +02:00

39 lines
1.7 KiB
TypeScript

import { type AssistantScope, HOME_ASSISTANT_SCOPE } from '@trek/shared';
import type { AssistantTarget } from '../api/assistant';
/**
* The key the assistant store keeps a conversation under, and the one every
* part of the chat passes back to it: a trip's id for the planner's chat, the
* journey's id negated for the chat in TREK Studio, and 0 for the home chat
* outside any one trip (the dashboard, Vacay, Atlas, collections, settings).
* Trip ids are positive (a trip is never made offline with a temporary id), so
* the three never meet, and the parts that only make sense on a trip (the map,
* the day list, found places) find no trip under a journey's key or the home
* key and stay empty.
*
* A number rather than `assistantScopeKey`'s `journey:12`, so the trip chat
* keeps the key it always had and every part that reads it stays as it is.
*/
export type AssistantChatKey = number;
/** The key of the home chat. */
export const HOME_CHAT_KEY: AssistantChatKey = 0;
/** The key a scope's chat is kept under. */
export function assistantChatKey(scope: AssistantScope): AssistantChatKey {
if (scope.kind === 'home') return HOME_CHAT_KEY;
return scope.kind === 'trip' ? scope.tripId : -scope.journeyId;
}
/** What the chat under a key is about. */
export function assistantScopeOf(key: AssistantChatKey): AssistantScope {
if (key === HOME_CHAT_KEY) return HOME_ASSISTANT_SCOPE;
return key < 0 ? { kind: 'journey', journeyId: -key } : { kind: 'trip', tripId: key };
}
/** What the repo is called with for the chat under a key: a trip's id as it always was, any other scope as it is. */
export function assistantTargetOf(key: AssistantChatKey): AssistantTarget {
return key > 0 ? key : assistantScopeOf(key);
}