3.6 KiB
3.6 KiB
Phase 1: Core Type System Foundation - Detailed Fix Guide
1.1 Message Type System Fix
Problem Analysis
The Message type union has inconsistent property access. Some code expects a message property that doesn't exist on all union members.
Fix Location: src/messages.ts
// Current problematic union
export type Message = AssistantMessage | UserMessage | ProgressMessage
// The issue: Code in query.ts accesses .message property which doesn't exist on ProgressMessage
Solution
// Option 1: Add message property to ProgressMessage
export interface ProgressMessage {
type: 'progress'
message?: any // Add this
// ... existing properties
}
// Option 2: Fix access pattern in query.ts
// Instead of directly accessing .message, use type guards:
if (msg.type !== 'progress' && 'message' in msg) {
// Safe to access msg.message
}
Fix in src/utils/messageContextManager.ts (line 136)
// Current
return {
type: "assistant",
message: { role: "assistant", content: [...] }
}
// Fixed
return {
type: "assistant",
message: { role: "assistant", content: [...] },
costUSD: 0, // Add required property
durationMs: 0, // Add required property
uuid: crypto.randomUUID() as UUID // Add required property
}
1.2 Tool Interface Alignment
Problem Analysis
The Tool interface expects specific return types, but implementations return different types.
Fix Location: src/Tool.ts
// Current interface (approximate)
export interface Tool<TInput, TOutput> {
renderResultForAssistant(output: TOutput): string
renderToolUseRejectedMessage(): React.ReactElement
// ...
}
// Fixed interface
export interface Tool<TInput, TOutput> {
renderResultForAssistant(output: TOutput): string | any[] // Allow arrays
renderToolUseRejectedMessage(...args: any[]): React.ReactElement // Allow optional params
// ...
}
Add to ToolUseContext
// In src/types.ts or wherever ToolUseContext is defined
export interface ToolUseContext {
// ... existing properties
setToolJSX?: (jsx: React.ReactElement) => void // Add as optional
}
export interface ExtendedToolUseContext extends ToolUseContext {
setToolJSX: (jsx: React.ReactElement) => void // Required in extended version
}
1.3 Key Type Extensions
Problem Analysis
The Key type from Ink doesn't have all properties that the code expects.
Fix Location: Create src/types/ink-augmentation.d.ts
// Type augmentation for ink
declare module 'ink' {
interface Key {
fn?: boolean
home?: boolean
end?: boolean
space?: boolean
}
}
Alternative: Create wrapper type
// In src/types/input.ts
import { Key as InkKey } from 'ink'
export interface ExtendedKey extends InkKey {
fn?: boolean
home?: boolean
end?: boolean
space?: boolean
}
// Then update all usages from Key to ExtendedKey
Verification Steps
After each fix:
- Run
npx tsc --noEmitto check error count - Verify no runtime errors with
bun run dev - Test affected functionality
Expected Outcome
After Phase 1 completion:
- Message type errors in query.ts resolved
- Tool interface matches all implementations
- Key type has all required properties
- Error count reduced by approximately 40-50 errors
Commands to Run
# After each file change
npx tsc --noEmit 2>&1 | grep -c "error TS"
# Check specific file errors
npx tsc --noEmit 2>&1 | grep "src/query.ts"
npx tsc --noEmit 2>&1 | grep "src/messages.ts"
npx tsc --noEmit 2>&1 | grep "Tool.ts"
# Test runtime
bun run dev