Instead of full chat history, we'll implement a focused Question History system that allows users to:
- Save and revisit their spiritual questions
- Categorize questions by type (spiritual, practical, metaphysical)
- Search and filter past questions
- Bookmark favorite questions
- Export question collections
interface QuestionHistory {
id: string;
question: string;
category: 'spiritual' | 'practical' | 'metaphysical' | 'personal' | 'general';
timestamp: Date;
isBookmarked: boolean;
tags: string[];
responsePreview?: string; // First 100 chars of response
source?: string; // Which Holmes text was referenced
}
interface QuestionFilters {
category?: string;
dateRange?: { start: Date; end: Date };
searchTerm?: string;
bookmarkedOnly?: boolean;
}// localStorage keys
const STORAGE_KEYS = {
QUESTIONS: 'holmes_questions',
SETTINGS: 'holmes_settings',
CATEGORIES: 'holmes_categories'
};
// Data structure in localStorage
{
"holmes_questions": [
{
"id": "q_1234567890",
"question": "How can I apply the Science of Mind to my daily challenges?",
"category": "practical",
"timestamp": "2025-07-28T10:30:00Z",
"isBookmarked": true,
"tags": ["daily practice", "challenges", "application"],
"responsePreview": "Dear friend, the Science of Mind teaches us that every challenge...",
"source": "The Science of Mind"
}
]
}<!-- Component: src/lib/components/QuestionHistory.svelte -->
<div class="question-history-panel">
<!-- Header -->
<div class="history-header">
<h3>Your Spiritual Questions</h3>
<button class="export-btn">Export</button>
</div>
<!-- Filters -->
<div class="filters">
<select bind:value={selectedCategory}>
<option value="">All Categories</option>
<option value="spiritual">Spiritual</option>
<option value="practical">Practical</option>
<option value="metaphysical">Metaphysical</option>
<option value="personal">Personal</option>
</select>
<input
type="text"
placeholder="Search questions..."
bind:value={searchTerm}
/>
<label>
<input type="checkbox" bind:checked={bookmarkedOnly} />
Bookmarked only
</label>
</div>
<!-- Question List -->
<div class="question-list">
{#each filteredQuestions as question}
<div class="question-item" class:bookmarked={question.isBookmarked}>
<div class="question-header">
<span class="category-badge">{question.category}</span>
<span class="timestamp">{formatDate(question.timestamp)}</span>
<button
class="bookmark-btn"
on:click={() => toggleBookmark(question.id)}
>
{question.isBookmarked ? '★' : '☆'}
</button>
</div>
<div class="question-text" on:click={() => loadQuestion(question)}>
{question.question}
</div>
{#if question.responsePreview}
<div class="response-preview">
"{question.responsePreview}..."
</div>
{/if}
{#if question.source}
<div class="source-info">
Source: {question.source}
</div>
{/if}
</div>
{/each}
</div>
</div><!-- Enhanced MessageInput.svelte -->
<div class="message-input-container">
<div class="input-header">
<button class="history-btn" on:click={toggleHistory}>
📚 Question History
</button>
<span class="question-count">
{questionCount} questions saved
</span>
</div>
<div class="input-area">
<textarea
bind:value={message}
placeholder="Ask Ernest Holmes a spiritual question..."
/>
<div class="input-actions">
<select bind:value={selectedCategory}>
<option value="general">General</option>
<option value="spiritual">Spiritual</option>
<option value="practical">Practical</option>
<option value="metaphysical">Metaphysical</option>
<option value="personal">Personal</option>
</select>
<button class="send-btn" on:click={handleSend}>
Send
</button>
</div>
</div>
</div>// File: src/lib/utils/questionStorage.ts
export class QuestionStorage {
private static STORAGE_KEY = 'holmes_questions';
static saveQuestion(question: Omit<QuestionHistory, 'id' | 'timestamp'>): void {
const questions = this.getQuestions();
const newQuestion: QuestionHistory = {
...question,
id: this.generateId(),
timestamp: new Date()
};
questions.unshift(newQuestion); // Add to beginning
this.saveQuestions(questions);
}
static getQuestions(): QuestionHistory[] {
const stored = localStorage.getItem(this.STORAGE_KEY);
return stored ? JSON.parse(stored) : [];
}
static searchQuestions(filters: QuestionFilters): QuestionHistory[] {
let questions = this.getQuestions();
if (filters.category) {
questions = questions.filter(q => q.category === filters.category);
}
if (filters.searchTerm) {
const term = filters.searchTerm.toLowerCase();
questions = questions.filter(q =>
q.question.toLowerCase().includes(term) ||
q.tags.some(tag => tag.toLowerCase().includes(term))
);
}
if (filters.bookmarkedOnly) {
questions = questions.filter(q => q.isBookmarked);
}
return questions;
}
static toggleBookmark(questionId: string): void {
const questions = this.getQuestions();
const question = questions.find(q => q.id === questionId);
if (question) {
question.isBookmarked = !question.isBookmarked;
this.saveQuestions(questions);
}
}
static exportQuestions(): string {
const questions = this.getQuestions();
return JSON.stringify(questions, null, 2);
}
private static generateId(): string {
return 'q_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
}
private static saveQuestions(questions: QuestionHistory[]): void {
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(questions));
}
}// File: src/routes/+page.svelte
import { QuestionStorage } from '$lib/utils/questionStorage';
// Add to existing script
let showHistory = false;
let selectedCategory = 'general';
async function handleSendMessage(content: string) {
if (!content.trim()) return;
// Save question to history
QuestionStorage.saveQuestion({
question: content,
category: selectedCategory,
isBookmarked: false,
tags: extractTags(content) // Simple tag extraction
});
// ... existing send logic
}
function extractTags(question: string): string[] {
const tags = [];
const lowerQuestion = question.toLowerCase();
if (lowerQuestion.includes('principle')) tags.push('principle');
if (lowerQuestion.includes('meditation')) tags.push('meditation');
if (lowerQuestion.includes('prayer')) tags.push('prayer');
if (lowerQuestion.includes('healing')) tags.push('healing');
if (lowerQuestion.includes('success')) tags.push('success');
return tags;
}<!-- File: src/lib/components/QuestionHistory.svelte -->
<script lang="ts">
import { QuestionStorage } from '$lib/utils/questionStorage';
import { formatDistanceToNow } from 'date-fns';
export let onQuestionSelect: (question: string) => void;
let questions: QuestionHistory[] = [];
let selectedCategory = '';
let searchTerm = '';
let bookmarkedOnly = false;
$: filteredQuestions = QuestionStorage.searchQuestions({
category: selectedCategory || undefined,
searchTerm: searchTerm || undefined,
bookmarkedOnly
});
function loadQuestion(question: QuestionHistory) {
onQuestionSelect(question.question);
}
function toggleBookmark(questionId: string) {
QuestionStorage.toggleBookmark(questionId);
questions = QuestionStorage.getQuestions();
}
function exportQuestions() {
const data = QuestionStorage.exportQuestions();
const blob = new Blob([data], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'holmes-questions.json';
a.click();
}
function formatDate(date: Date): string {
return formatDistanceToNow(new Date(date), { addSuffix: true });
}
</script>
<!-- Template from above -->- Automatic tagging based on question content
- Category suggestions as user types
- Smart search across questions and tags
- Most asked questions tracking
- Spiritual growth patterns over time
- Favorite topics identification
- JSON export for backup
- CSV export for analysis
- Question collections for sharing
interface QuestionAnalytics {
totalQuestions: number;
questionsByCategory: Record<string, number>;
mostCommonTags: Array<{ tag: string; count: number }>;
questionsByTime: Array<{ date: string; count: number }>;
averageQuestionsPerDay: number;
}- Questions asked per week/month
- Category preferences over time
- Spiritual topic evolution
- Engagement patterns
- Question templates for common spiritual topics
- Question scheduling for daily practice
- Question sharing with spiritual community
- AI-powered question suggestions
- Calendar integration for question reminders
- Journal integration for spiritual reflection
- Community features for shared questions
- Progress tracking for spiritual development
- Create QuestionStorage utility class
- Implement basic save/load functionality
- Add question categorization
- Create QuestionHistory component
- Integrate with existing chat interface
- Add search and filtering
- Implement bookmarking
- Add export functionality
- Create question analytics
- Add smart tagging
- Mobile responsiveness
- Performance optimization
- User testing
- Bug fixes
- Documentation
This focused approach on question history will provide much more value than full chat history, allowing users to build a personal library of spiritual inquiries and track their spiritual journey over time.