Commit Graph

26 Commits

  • feat(coding-agent): ResourceLoader, package management, and /reload command (#645)
    - Add ResourceLoader interface and DefaultResourceLoader implementation
    - Add PackageManager for npm/git extension sources with install/remove/update
    - Add session.reload() and session.bindExtensions() APIs
    - Add /reload command in interactive mode
    - Add CLI flags: --skill, --theme, --prompt-template, --no-themes, --no-prompt-templates
    - Add pi install/remove/update commands for extension management
    - Refactor settings.json to use arrays for skills, prompts, themes
    - Remove legacy SkillsSettings source flags and filters
    - Update SDK examples and documentation for ResourceLoader pattern
    - Add theme registration and loadThemeFromPath for dynamic themes
    - Add getShellEnv to include bin dir in PATH for bash commands
  • feat(coding-agent): add input event for extension input interception (#761)
    * feat(coding-agent): add input event for extension input interception
    
    Extensions can now intercept, transform, or handle user input before the
    agent processes it. Three result types: continue (pass through), transform
    (modify text/images), handled (respond without LLM). Handlers chain
    transforms and short-circuit on handled. Source field identifies origin.
    
    * fix: make source public, use if/else over ternary
    
    * fix: remove response field, extension handles own UI
  • feat(coding-agent): Custom tool export rendering in export (#702)
    * coding-agent: add ANSI-to-HTML converter for export
    
    * coding-agent: add getToolDefinition method to ExtensionRunner
    
    * coding-agent: add tool HTML renderer factory for custom tools
    
    * coding-agent: add custom tool pre-rendering to HTML export
    
    * coding-agent: render pre-rendered custom tools in HTML export
    
    * coding-agent: integrate tool renderer in exportToHtml
  • feat(coding-agent): add session naming via /name command and extension API
    - Add SessionInfoEntry type for session metadata
    - Add /name <name> command to set session display name
    - Add pi.setSessionName() and pi.getSessionName() extension API
    - Session selector shows name (in warning color) instead of first message when set
    - Session name included in fuzzy search
    - /session command displays name when set
    
    closes #650
  • Rename /branch command to /fork
    - RPC: branch -> fork, get_branch_messages -> get_fork_messages
    - SDK: branch() -> fork(), getBranchMessages() -> getForkMessages()
    - AgentSession: branch() -> fork(), getUserMessagesForBranching() -> getUserMessagesForForking()
    - Extension events: session_before_branch -> session_before_fork, session_branch -> session_fork
    - Settings: doubleEscapeAction 'branch' -> 'fork'
    
    fixes #641
  • feat: add ctx.ui.setWorkingMessage() extension API
    Allows extensions to customize the streaming loader message.
    Pass undefined to restore default.
  • feat(coding-agent): add user_bash event and theme API extensions
    - user_bash event for intercepting ! and !! commands (#528)
    - Extensions can return { operations } or { result } to redirect/replace
    - executeBashWithOperations() for custom BashOperations execution
    - session.recordBashResult() for extensions handling bash themselves
    - Theme API: getAllThemes(), getTheme(), setTheme() on ctx.ui
    - mac-system-theme.ts example: sync with macOS dark/light mode
    - Updated ssh.ts to use user_bash event
  • Allow extensions to modify system prompt in before_agent_start
    - Add systemPrompt to BeforeAgentStartEvent so extensions can see current prompt
    - Change systemPromptAppend to systemPrompt in BeforeAgentStartEventResult for full replacement
    - Extensions can now chain modifications (each sees the result of previous)
    - Update ssh.ts to replace local cwd with remote cwd in system prompt
    - Update pirate.ts, claude-rules.ts, preset.ts to use new API
    
    fixes #575
  • refactor(coding-agent): unify tool and event handler context creation
    Tools now use ExtensionRunner.createContext() instead of a separate
    inline context factory. This ensures tools and event handlers share
    the same context, fixing ctx.shutdown() and other context methods.
    
    - Made ExtensionRunner.createContext() public
    - Changed wrapRegisteredTools to accept ExtensionRunner instead of getContext callback
    - Create ExtensionRunner when SDK custom tools are present (not just extensions)
    - Removed redundant inline context factory from sdk.ts
  • fix(coding-agent): make ctx.shutdown() work from extension tools
    The tool execution context was created with a no-op shutdown handler.
    Now it delegates to ExtensionRunner.shutdown() which uses the handler
    set by the mode via initialize().
  • refactor(coding-agent): simplify extension runtime architecture
    - Replace per-extension closures with shared ExtensionRuntime
    - Split context actions: ExtensionContextActions (required) + ExtensionCommandContextActions (optional)
    - Rename LoadedExtension to Extension, remove setter methods
    - Change runner.initialize() from options object to positional params
    - Derive hasUI from uiContext presence (no separate param)
    - Add warning when extensions override built-in tools
    - RPC and print modes now provide full command context actions
    
    BREAKING CHANGE: Extension system types and initialization API changed.
    See CHANGELOG.md for migration details.
  • feat(coding-agent): add ctx.ui.setEditorComponent() extension API
    - Add setEditorComponent() to ctx.ui for custom editor components
    - Add CustomEditor base class for extensions (handles app keybindings)
    - Add keybindings parameter to ctx.ui.custom() factory (breaking change)
    - Add modal-editor.ts example (vim-like modes)
    - Add rainbow-editor.ts example (animated text highlighting)
    - Update docs: extensions.md, tui.md Pattern 7
    - Clean up terminal on TUI render errors
  • Add ExtensionAPI methods, preset example, and TUI documentation improvements
    - ExtensionAPI: setModel(), getThinkingLevel(), setThinkingLevel() methods
    - New preset.ts example with plan/implement presets for model/thinking/tools switching
    - Export all UI components from pi-coding-agent for extension use
    - docs/tui.md: Common Patterns section with copy-paste code for SelectList, BorderedLoader, SettingsList, setStatus, setWidget, setFooter
    - docs/tui.md: Key Rules section for extension UI development
    - docs/extensions.md: Exhaustive example links for all ExtensionAPI methods and events
    - System prompt now references docs/tui.md for TUI development
    
    Fixes #509, relates to #347
  • Extensions: add pi.sendUserMessage() for sending user messages
    Adds sendUserMessage() to the extension API, allowing extensions to send
    actual user messages (role: user) rather than custom messages. Unlike
    sendMessage(), this always triggers a turn and behaves as if the user
    typed the message.
    
    - Add SendUserMessageHandler type and sendUserMessage() to ExtensionAPI
    - Wire handler through loader, runner, and all modes
    - Implement via prompt() with expandPromptTemplates: false
    - Add send-user-message.ts example with /ask, /steer, /followup commands
    - Document in extensions.md
    
    fixes #483
  • Add ctx.ui.setFooter() for extensions to replace footer component
    Extensions can now replace the built-in footer with a custom component:
    - setFooter(factory) replaces with custom component
    - setFooter(undefined) restores built-in footer
    
    Includes example extension demonstrating context usage display.
    
    Closes #481
  • Add unified extensions system (not wired up yet)
    New src/core/extensions/ directory with:
    - types.ts: merged types from hooks and custom-tools
    - loader.ts: single loader for extensions
    - runner.ts: ExtensionRunner for event emission
    - wrapper.ts: tool wrapping utilities
    - index.ts: exports
    
    Key changes from old system:
    - Single ExtensionAPI with registerTool() for LLM-callable tools
    - Tools use ExtensionContext (has UI access)
    - No onSession callback on tools (use pi.on events instead)
    
    refs #454