diff --git a/components/MessageInput.tsx b/components/MessageInput.tsx
index ddb92cb..fe6dc37 100644
--- a/components/MessageInput.tsx
+++ b/components/MessageInput.tsx
@@ -8,7 +8,7 @@ import type { Message } from '@/lib/api';
const MAX_RECORDING_SECONDS = 60;
export default function MessageInput() {
- const { currentId, setCurrentId, addMessage, setIsLoading, isLoading, setConversations } = useStore();
+ const { currentId, setCurrentId, addMessage, setIsLoading, isLoading, setConversations, settings } = useStore();
const [text, setText] = useState('');
const [recording, setRecording] = useState(false);
const [transcribing, setTranscribing] = useState(false);
@@ -55,7 +55,7 @@ export default function MessageInput() {
setIsLoading(true);
try {
- const data = await api.sendMessage(message, convId);
+ const data = await api.sendMessage(message, convId, settings.share_time ?? true);
setCurrentId(data.conversation_id);
addMessage({
role: 'assistant',
diff --git a/components/SettingsPanel.tsx b/components/SettingsPanel.tsx
index 08dce17..9f3f423 100644
--- a/components/SettingsPanel.tsx
+++ b/components/SettingsPanel.tsx
@@ -166,6 +166,9 @@ export default function SettingsPanel() {
updateSetting('show_sources', v)} />
+
+ updateSetting('share_time', v)} />
+
{/* Memory */}
@@ -323,6 +326,9 @@ export default function SettingsPanel() {
+ {status?.watcher_ingestion && (
+
+ )}
@@ -441,3 +447,16 @@ function StatusRow({ label, value, ok, yellow }: { label: string; value: string;
);
}
+
+function IngestionRow({ ingestion }: { ingestion: { status: string; message: string; file_count: number } }) {
+ const color = ingestion.status === 'ingesting' ? '#c8821a' : ingestion.status === 'error' ? '#a32d2d' : '#888780';
+ const label = ingestion.status === 'ingesting'
+ ? `Ingesting ${ingestion.file_count} file(s)...`
+ : ingestion.message || 'Idle';
+ return (
+
+
+ {label}
+
+ );
+}
diff --git a/lib/api.ts b/lib/api.ts
index ec00cea..ab8ff49 100644
--- a/lib/api.ts
+++ b/lib/api.ts
@@ -25,8 +25,15 @@ export const api = {
request<{ deleted: string }>(`/conversations/${id}`, { method: 'DELETE' }),
clearAllConversations: () =>
request<{ cleared: boolean }>('/conversations', { method: 'DELETE' }),
- sendMessage: (message: string, conversation_id: string) =>
- request('/chat', { method: 'POST', body: JSON.stringify({ message, conversation_id }) }),
+ sendMessage: (message: string, conversation_id: string, share_time = true) =>
+ request('/chat', {
+ method: 'POST',
+ body: JSON.stringify({
+ message,
+ conversation_id,
+ ...(share_time ? { client_time: new Date().toISOString() } : {}),
+ }),
+ }),
getMemory: () => request<{ content: string }>('/memory'),
updateMemory: (content: string) =>
request<{ saved: boolean }>('/memory', { method: 'POST', body: JSON.stringify({ content }) }),
@@ -73,6 +80,7 @@ export interface Settings {
font_size: 'small' | 'medium' | 'large';
web_search: boolean;
show_sources: boolean;
+ share_time: boolean;
dream_hour_utc: number;
dream_minute_utc: number;
dream_mode: string;
@@ -106,6 +114,7 @@ export interface DreamerStatus {
export interface Status {
aaron_ai: string;
watcher: string;
+ watcher_ingestion?: { status: string; message: string; file_count: number };
chunk_count: number;
file_count: number;
last_indexed: string;
diff --git a/lib/store.ts b/lib/store.ts
index c9c173b..d07662a 100644
--- a/lib/store.ts
+++ b/lib/store.ts
@@ -47,6 +47,7 @@ export const useStore = create()(
font_size: 'medium',
web_search: true,
show_sources: true,
+ share_time: true,
dream_hour_utc: 8,
dream_minute_utc: 0,
dream_mode: 'nrem',