8.8 KiB
Story 2.5: Create AI Server Actions Stub
Status: review
Story
As a developer, I want a stub foundation file for AI server actions, so that all AI-related server actions are organized in one centralized location following consistent patterns.
Acceptance Criteria
- Given the existing AI server actions pattern in the codebase,
- When I create the AI server actions stub file,
- Then the stub should:
- Be located at
keep-notes/app/actions/ai-actions.ts(NEW) - Export TypeScript interfaces for all AI action request/response types
- Include placeholder functions with JSDoc comments for future AI features
- Follow the established server action pattern (
'use server', auth checks, error handling) - Be importable from client components
- NOT break existing AI server actions (they remain functional)
- Be located at
Tasks / Subtasks
- Create
app/actions/ai-actions.tsstub file (AC: 3)- Add
'use server'directive at top - Import dependencies (auth, prisma, revalidatePath, AI services)
- Define TypeScript interfaces for request/response types
- Add placeholder functions with JSDoc comments for:
- Title suggestions (already exists in title-suggestions.ts - reference it)
- Semantic search (already exists in semantic-search.ts - reference it)
- Paragraph reformulation (already exists in paragraph-refactor.ts - reference it)
- Memory Echo (to be implemented)
- Language detection (already exists in detect-language.ts - reference it)
- AI settings (already exists in ai-settings.ts - reference it)
- Add TODO comments indicating which features are stubs vs implemented
- Ensure file compiles without TypeScript errors
- Add
- Verify existing AI server actions still work (AC: 4)
- Test that title-suggestions.ts still functions
- Test that semantic-search.ts still functions
- Confirm no breaking changes to existing functionality
Dev Notes
Architecture Context
Current State:
- AI server actions already exist as separate files:
app/actions/title-suggestions.tsapp/actions/semantic-search.tsapp/actions/paragraph-refactor.tsapp/actions/detect-language.tsapp/actions/ai-settings.ts
Existing Pattern (from notes.ts:1-8):
'use server'
import { auth } from '@/auth'
import { prisma } from '@/lib/prisma'
import { revalidatePath } from 'next/cache'
export async function actionName(params: ParamType): Promise<ResponseType> {
const session = await auth()
if (!session?.user?.id) {
throw new Error('Unauthorized')
}
try {
// ... implementation
} catch (error) {
console.error('Error description:', error)
throw error
}
}
Purpose of This Story:
This story creates a stub/placeholder file (ai-actions.ts) that:
- Establishes the TypeScript interfaces for all AI action types
- Documents the expected server action signatures for future AI features
- Provides a centralized location for AI-related server actions
- Serves as documentation for the AI server action architecture
- Does NOT replace or break existing AI server actions
Note: The actual implementations of Memory Echo and other features will be done in separate stories (Epic 5: Contextual AI Features). This story is about creating the structural foundation.
Technical Requirements
File Structure:
keep-notes/app/actions/
├── ai-actions.ts # NEW: Stub file with interfaces and placeholders
├── title-suggestions.ts # EXISTING: Keep unchanged
├── semantic-search.ts # EXISTING: Keep unchanged
├── paragraph-refactor.ts # EXISTING: Keep unchanged
├── detect-language.ts # EXISTING: Keep unchanged
├── ai-settings.ts # EXISTING: Keep unchanged
└── notes.ts # EXISTING: Core note CRUD
TypeScript Interfaces to Define:
// Title Suggestions
export interface GenerateTitlesRequest {
noteId: string
}
export interface GenerateTitlesResponse {
suggestions: Array<{
title: string
confidence: number
reasoning?: string
}>
noteId: string
}
// Semantic Search
export interface SemanticSearchRequest {
query: string
options?: {
limit?: number
threshold?: number
notebookId?: string
}
}
export interface SemanticSearchResponse {
results: SearchResult[]
query: string
totalResults: number
}
// Paragraph Reformulation
export interface RefactorParagraphRequest {
noteId: string
selectedText: string
option: 'clarify' | 'shorten' | 'improve'
}
export interface RefactorParagraphResponse {
originalText: string
refactoredText: string
}
// Memory Echo (STUB - to be implemented in Epic 5)
export interface GenerateMemoryEchoRequest {
// No params - uses current user session
}
export interface GenerateMemoryEchoResponse {
success: boolean
insight: {
note1Id: string
note2Id: string
similarityScore: number
} | null
}
// Language Detection
export interface DetectLanguageRequest {
content: string
}
export interface DetectLanguageResponse {
language: string
confidence: number
method: 'tinyld' | 'ai'
}
// AI Settings
export interface UpdateAISettingsRequest {
settings: Partial<{
titleSuggestions: boolean
semanticSearch: boolean
paragraphRefactor: boolean
memoryEcho: boolean
aiProvider: 'auto' | 'openai' | 'ollama'
}>
}
export interface UpdateAISettingsResponse {
success: boolean
}
Stub Function Pattern:
/**
* Generate Memory Echo insights
* STUB: To be implemented in Epic 5 (Story 5-1)
*
* This will analyze all user notes with embeddings to find
* connections with cosine similarity > 0.75
*/
export async function generateMemoryEcho(): Promise<GenerateMemoryEchoResponse> {
// TODO: Implement Memory Echo background processing
// - Fetch all user notes with embeddings
// - Calculate pairwise cosine similarities
// - Find top connection with similarity > 0.75
// - Store in MemoryEchoInsight table
// - Return insight or null if none found
throw new Error('Not implemented: See Epic 5 Story 5-1')
}
Project Structure Notes
Alignment with unified project structure:
- Path:
app/actions/ai-actions.ts(follows Next.js App Router conventions) - Naming: kebab-case filename (
ai-actions.ts), PascalCase interfaces - Imports: Use
@/alias for all imports - Directives:
'use server'at line 1 - No conflicts: Existing AI server actions remain in separate files
Detected conflicts or variances: None
Testing Requirements
Verification Steps:
- Create
ai-actions.tsfile - Verify TypeScript compilation:
npx tsc --noEmit - Confirm no errors in existing AI server action files
- Test that imports work:
import { GenerateTitlesRequest } from '@/app/actions/ai-actions' - Verify existing features still work:
- Title suggestions still functional
- Semantic search still functional
- No breaking changes to UI
No E2E tests required - This is a stub/placeholder file with no actual implementation
References
- Server Action Pattern:
keep-notes/app/actions/notes.ts:1-8 - Existing AI Actions:
keep-notes/app/actions/title-suggestions.ts(reference for pattern)keep-notes/app/actions/semantic-search.ts(reference for pattern)
- Architecture:
_bmad-output/planning-artifacts/architecture.md(Decision 2: Memory Echo Architecture) - Project Context:
_bmad-output/planning-artifacts/project-context.md(Server Actions Pattern section) - Epic Definition:
_bmad-output/planning-artifacts/epics.md(Epic 5: Contextual AI Features)
Dev Agent Record
Agent Model Used
claude-sonnet-4-5-20250929
Debug Log References
None (stub creation story)
Completion Notes List
- Created story file with comprehensive context
- Documented existing AI server action patterns
- Defined TypeScript interfaces for all AI actions
- Specified stub file structure and location
- Identified references to existing implementations
- Implemented ai-actions.ts stub file with all interfaces
- Added comprehensive JSDoc comments and TODO markers
- Verified no breaking changes to existing actions
- All acceptance criteria satisfied
File List
Files Created:
keep-notes/app/actions/ai-actions.ts✅
Files Referenced (NOT MODIFIED):
keep-notes/app/actions/title-suggestions.ts(reference for pattern)keep-notes/app/actions/semantic-search.ts(reference for pattern)keep-notes/app/actions/paragraph-refactor.ts(reference for pattern)keep-notes/app/actions/detect-language.ts(reference for pattern)keep-notes/app/actions/ai-settings.ts(reference for pattern)