Commit Graph

24 Commits

  • refactor: address PR feedback - merge setWidget, use KeyId for shortcuts
    1. Merge setWidget and setWidgetComponent into single overloaded method
       - Accepts either string[] or component factory function
       - Uses single Map<string, Component> internally
       - String arrays wrapped in Container with Text components
    
    2. Use KeyId type for registerShortcut instead of plain string
       - Import Key from @mariozechner/pi-tui
       - Update plan-mode example to use Key.shift('p')
       - Type-safe shortcut registration
    
    3. Fix tool API docs
       - Both built-in and custom tools can be enabled/disabled
       - Removed incorrect 'custom tools always active' statement
    
    4. Use matchesKey instead of matchShortcut (already done in rebase)
  • fix: use robust matchShortcut from TUI library
    - Add matchShortcut() function to @mariozechner/pi-tui
    - Handles Kitty protocol, legacy terminal sequences, and lock keys
    - Supports special keys (enter, tab, space, backspace, escape)
    - Replace custom implementation in interactive-mode.ts
    - Remove unused imports
  • fix: remove inline imports and debug logging
    - Convert all inline import() types to top-level imports
    - Remove debug console.error statements from plan-mode hook
  • fix(plan-mode): handle non-tool steps and clean up todo text
    - Non-tool turns (analysis, explanation) now mark step complete at turn_end
    - Clean up extracted step text: remove markdown, truncate to 50 chars
    - Remove redundant action words (Use, Run, Execute, etc.)
    - Track toolsCalledThisTurn flag to distinguish tool vs non-tool turns
  • fix(plan-mode): track step completion via tool_result events
    - No longer relies on agent outputting [STEP N DONE] tags
    - Each successful tool_result marks the next uncompleted step done
    - Much more reliable than expecting LLM to follow tag format
    - Simplified execution context (no special instructions needed)
  • fix(plan-mode): use step numbers instead of random IDs
    - Steps are numbered 1, 2, 3... which is easier for agent to track
    - Agent outputs [STEP 1 DONE], [STEP 2 DONE] instead of [DONE:abc123]
    - Clearer instructions in execution context
  • fix(plan-mode): make DONE tag instruction clearer
    - Number steps and show id=xxx format
    - Clearer instruction to output [DONE:id] after each step
  • fix(hooks): fix ContextEventResult.messages type to AgentMessage[]
    - Was incorrectly typed as Message[] which caused filtered messages to be ignored
    - Context event filter in plan-mode hook should now properly remove stale [PLAN MODE ACTIVE] messages
  • fix(plan-mode): use context event to filter stale plan mode messages
    - Filter out old [PLAN MODE ACTIVE] and [EXECUTING PLAN] messages
    - Fresh context injected via before_agent_start with current state
    - Agent now correctly sees tools are enabled when executing
    - Reverted to ID-based tracking with [DONE:id] tags
    - Simplified execution message (no need to override old context)
  • fix(plan-mode): make execution mode clearer to agent
    - Add explicit [PLAN MODE DISABLED - EXECUTE NOW] message
    - Emphasize FULL access to all tools in execution context
    - List remaining steps in execution context
    - Prevents agent from thinking it's still restricted
  • refactor(plan-mode): use smart keyword matching instead of IDs
    - Remove ugly [DONE:id] tags - users no longer see IDs
    - Track progress via keyword matching on tool results
    - Extract significant keywords from todo text
    - Match tool name + input against todo keywords
    - Sequential preference: first uncompleted item gets bonus score
    - Much cleaner UX - progress tracked silently in background
  • refactor(hooks): address PR feedback
    - Rename getTools/setTools to getActiveTools/setActiveTools
    - Add getAllTools to enumerate all configured tools
    - Remove text_delta event (use turn_end/agent_end instead)
    - Add shortcut conflict detection:
      - Skip shortcuts that conflict with built-in shortcuts (with warning)
      - Log warnings when hooks register same shortcut (last wins)
    - Add note about prompt cache invalidation in setActiveTools
    - Update plan-mode hook to use agent_end for [DONE:id] parsing
  • feat(plan-mode): show final completed list in chat when plan finishes
    Displays all completed items with strikethrough markdown when
    all todos are done.
  • fix(plan-mode): buffer text_delta to handle split [DONE:id] patterns
    The [DONE:id] pattern may be split across multiple streaming chunks.
    Now accumulates text in a buffer and scans for complete patterns.
  • feat(hooks): add text_delta event for streaming text monitoring
    - New text_delta hook event fires for each chunk of streaming text
    - Enables real-time monitoring of agent output
    - Plan-mode hook now updates todo progress as [DONE:id] tags stream in
    - Each todo item has unique ID for reliable tracking
  • feat(plan-mode): use ID-based todo tracking with [DONE:id] tags
    - Each todo item gets a unique ID (e.g., abc123)
    - Agent marks items complete by outputting [DONE:id]
    - IDs shown in chat and in execution context
    - Agent instructed to output [DONE:id] after each step
    - Removed unreliable tool-counting heuristics
  • feat(plan-mode): show todo list in chat after planning, widget during execution
    - After agent creates plan: show todo list as a message in chat
    - During execution: show widget under Working indicator with checkboxes
    - Check off items as they complete with strikethrough
  • fix(plan-mode): fix todo extraction from assistant messages
    - AssistantMessage.content is an array, not string
    - Handle markdown bold formatting in numbered lists
    - Extract text content blocks properly
  • feat(hooks): add setWidget API for multi-line status displays
    - ctx.ui.setWidget(key, lines) for multi-line displays above editor
    - Widgets appear below 'Working...' indicator, above editor
    - Supports ANSI styling including strikethrough
    - Added theme.strikethrough() method
    - Plan-mode hook now shows todo list with checkboxes
    - Completed items show checked box and strikethrough text
  • feat(plan-mode): add todo list extraction and progress tracking
    - Extract numbered steps from agent's plan response
    - Track progress during execution with footer indicator (📋 2/5)
    - /todos command to view current plan progress
    - State persists across sessions including todo progress
    - Agent prompted to format plans as numbered lists for tracking
  • feat(coding-agent): add hook API for CLI flags, shortcuts, and tool control
    Hook API additions:
    - pi.getTools() / pi.setTools(toolNames) - dynamically enable/disable tools
    - pi.registerFlag(name, options) / pi.getFlag(name) - register custom CLI flags
    - pi.registerShortcut(shortcut, options) - register keyboard shortcuts
    
    Plan mode hook (examples/hooks/plan-mode.ts):
    - /plan command or Shift+P shortcut to toggle
    - --plan CLI flag to start in plan mode
    - Read-only tools: read, bash, grep, find, ls
    - Bash restricted to non-destructive commands (blocks rm, mv, git commit, etc.)
    - Interactive prompt after each response: execute, stay, or refine
    - Shows plan indicator in footer when active
    - State persists across sessions
  • WIP: Add hook API for dynamic tool control with plan-mode hook example
    - Add pi.getTools() and pi.setTools(toolNames) to HookAPI
    - Hooks can now enable/disable tools dynamically
    - Changes take effect on next agent turn
    
    New example hook: plan-mode.ts
    - Claude Code-style read-only exploration mode
    - /plan command toggles plan mode on/off
    - Plan mode tools: read, bash, grep, find, ls
    - Edit/write tools disabled in plan mode
    - Injects context telling agent about restrictions
    - After each response, prompts to execute/stay/refine
    - State persists across sessions