Commit Graph
100 Commits
Author SHA1 Message Date
Mario Zechner 676de103e1 Update models/package-lock.json after adding deps 2026-01-25 19:29:02 +01:00
Mario Zechner b1211261be docs(coding-agent): add changelog entry for extension shortcut fix (#947) 2026-01-25 19:21:18 +01:00
Mario Zechner 62209c4a0f docs: add tmux testing instructions to AGENTS.md 2026-01-25 19:20:14 +01:00
Mario Zechner 0faba293e6 fix(coding-agent): truncate bash hint line to terminal width
Fixes TUI crash on narrow terminals (< 40 chars) when displaying
collapsed bash output with 'earlier lines' hint.

fixes #941
2026-01-25 19:19:41 +01:00
Mario Zechner b0c050582a fix(coding-agent): update test expectations for trailing period in read tool messages 2026-01-25 19:08:52 +01:00
Mario Zechner c94e8a122e Merge pull request #945 from Perlence/fix/editor-multiline-insert
fix(tui): handle multiline text in insertTextAtCursor()
2026-01-25 15:55:12 +01:00
Mario Zechner b9d8b99c76 Merge pull request #942 from haoqixu/http-proxy
feat(ai): Support HTTP proxy through environment variables
2026-01-25 15:52:14 +01:00
Mario Zechner 3635e45ffd feat(ai): add OpenRouter provider routing support (#859) 2026-01-25 03:34:52 +01:00
Mario Zechner a6d878e804 fix(ai): default tool call arguments to empty object for Google providers
When Google providers return tool calls without an args field (common for
no-argument tools), the arguments field was undefined. This breaks
subsequent API calls that require tool_use.input to be present.

Now defaults to {} when args is missing.

Related: clawdbot/clawdbot#1509
2026-01-25 03:18:02 +01:00
Mario Zechner d74fd82673 docs(coding-agent): add pi config to CLI Reference 2026-01-25 03:13:58 +01:00
Mario Zechner 150128fd2c feat(coding-agent): add pi config TUI to manage resources
Adds a new 'pi config' command with a TUI to list and toggle package
resources (extensions, skills, prompts, themes).

- Displays resources grouped by source (packages, user, project)
- Subgroups by resource type (Extensions, Skills, Prompts, Themes)
- Toggle enabled/disabled state with space
- Filter resources by typing
- Supports +pattern for force-include, !pattern for exclude
- Properly reads exclusion patterns from settings.json

fixes #938
2026-01-25 03:12:21 +01:00
Mario Zechner ef5149fdf6 Fixes #933 2026-01-25 02:51:05 +01:00
Mario Zechner 6b4188fa0b Fixes #933 2026-01-25 02:47:17 +01:00
Mario Zechner 349c6420c7 fix(coding-agent): setWorkingMessage() now works in agent_start handlers
Extensions calling setWorkingMessage() in agent_start handlers previously
had no effect because the loading animation didn't exist yet. Now the
message is queued and applied once the loader is created.

Fixes #935
2026-01-25 02:37:12 +01:00
Mario Zechner 3e8eb956b3 feat(coding-agent): resolve resources with enabled state 2026-01-25 02:13:24 +01:00
Mario Zechner 9dc2b9b163 docs(coding-agent): document pi-package keyword for npm discoverability 2026-01-25 01:40:26 +01:00
Mario Zechner 353ac792eb chore(gitlab-duo): use pi's own GitLab OAuth client ID 2026-01-25 01:12:50 +01:00
Mario Zechner 7b920f27d2 fix(coding-agent): check npm package version before using cached copy
For temporary npm extensions (-e npm:...):
- Unpinned packages: fetch latest version from registry and reinstall if newer
- Pinned packages: reinstall if cached version doesn't match
2026-01-25 00:57:58 +01:00
Mario Zechner 0d24ddbb03 fix(ai): use model.api instead of hardcoding api type in streaming functions
- anthropic.ts: use model.api instead of hardcoding 'anthropic-messages'
- openai-responses.ts: use model.api instead of hardcoding 'openai-responses'
- gitlab-duo: simplify to use actual model IDs, export MODELS array
2026-01-25 00:52:34 +01:00
Mario Zechner 7019fdb92b fix(gitlab-duo): use Responses API for all GPT models
Ensures consistent tool call ID format when switching between models.
2026-01-25 00:29:05 +01:00
Mario Zechner 758baa9fec refactor: rename custom provider examples
- custom-provider -> custom-provider-anthropic
- gitlab-duo -> custom-provider-gitlab-duo
- Update READMEs with custom provider section
2026-01-25 00:18:13 +01:00
Mario Zechner 7caa08999e fix: use template literal in test.ts 2026-01-25 00:13:44 +01:00
Mario Zechner 7a5cfdaed0 fix: apply extension provider registrations before model resolution
- Extensions register providers via pendingProviderRegistrations
- These were only applied in bindCore() during AgentSession creation
- But model resolution in main.ts happens before session creation
- Fix: apply pending registrations immediately after loading extensions
- Also fix gitlab-duo to pass Authorization header instead of apiKey
2026-01-25 00:13:20 +01:00
Mario Zechner dd01d83e64 fix: use opencode's OAuth client ID for localhost redirects 2026-01-24 23:53:56 +01:00
Mario Zechner 639d706156 fix: use correct GitLab OAuth redirect URI with port 8080 2026-01-24 23:52:04 +01:00
Mario Zechner 3e6d8dc72a feat: add GitLab Duo provider extension example
- Delegates to pi-ai's built-in Anthropic/OpenAI streaming
- OAuth support with GitLab's bundled client ID
- Direct access token caching (25 min TTL)
- Models: duo-chat-opus/sonnet/haiku-4-5, duo-chat-gpt-5-1/mini/codex
- No external dependencies beyond pi-ai
2026-01-24 23:51:17 +01:00
Mario Zechner 2c5d202778 chore: add custom-provider to workspaces for auto-install 2026-01-24 23:22:33 +01:00
Mario Zechner 6aad6e30ce refactor: convert custom-provider example to package with deps
- Move custom-provider.ts to custom-provider/index.ts
- Add package.json with @anthropic-ai/sdk dependency
- Extension now requires npm install before use
2026-01-24 23:21:19 +01:00
Mario Zechner d4bd1a956b docs: rewrite custom-provider.md with actual stream pattern
- Document stream.push/end pattern instead of yield
- Link to existing provider implementations on GitHub
- Add testing section with list of test files to run
- Include proper content block and tool call examples
2026-01-24 23:18:36 +01:00
Mario Zechner 177c694406 feat: custom provider support with streamSimple
- Add resetApiProviders() to clear and re-register built-in providers
- Add createAssistantMessageEventStream() factory for extensions
- Add streamSimple support in ProviderConfig for custom API implementations
- Call resetApiProviders() on /reload to clean up extension providers
- Add custom-provider.md documentation
- Add custom-provider.ts example with full Anthropic implementation
- Update extensions.md with streamSimple config option
2026-01-24 23:15:11 +01:00
Mario Zechner c06163bc59 docs(ai): document api registry 2026-01-24 23:15:11 +01:00
Mario Zechner c725135a76 refactor(ai): register api providers 2026-01-24 23:15:11 +01:00
Mario Zechner 3256d3c083 refactor(oauth): add provider registry 2026-01-24 23:15:11 +01:00
Mario Zechner 89636cfe6e fix(coding-agent): improve read tool description for full file reads 2026-01-24 23:15:11 +01:00
Mario Zechner 79ded84d46 Merge pull request #936 from Perlence/fix/extension-editor-padding-x
fix(coding-agent): propagate paddingX to custom editors
2026-01-24 20:48:41 +01:00
Mario Zechner 39b94ad7be Merge pull request #930 from Perlence/fix/document-missing-hotkeys
docs(coding-agent): document missing hotkeys in README and /hotkeys
2026-01-24 20:48:22 +01:00
Mario Zechner 4ab9b769e6 Merge pull request #934 from Perlence/fix/reserve-col-for-cursor
fix(tui): reserve 1 column for the cursor in word wrap width
2026-01-24 20:47:46 +01:00
Mario Zechner 2d5b0c636f Merge pull request #937 from mitsuhiko/defer-gitignore
Defer create .pi/*/.gitignore
2026-01-24 20:46:30 +01:00
Mario Zechner 951fb953ed feat(coding-agent): support disable-model-invocation frontmatter for skills
When set to true, the skill is hidden from the system prompt, preventing
agentic invocation. Users can still invoke explicitly via /skill:name.

Also fixes pre-existing test bug where source expectation was wrong.

Fixes #927
2026-01-24 03:34:40 +01:00
Mario Zechner 3235926eed fix(coding-agent): off-by-one error in bash output 'earlier lines' count
fixes #921
2026-01-24 03:25:55 +01:00
Mario Zechner 48fc57f321 feat(coding-agent): expose copyToClipboard for extensions
fixes #926
2026-01-24 03:17:04 +01:00
Mario Zechner 3a57f1259b feat(coding-agent): surface extension shortcut conflicts 2026-01-24 03:17:04 +01:00
Mario Zechner 72de8f26a1 Merge pull request #917 from williballenthin/fix-call-arguments-done
fix(ai): handle call arguments done on OpenAI-compatible endpoints
2026-01-24 03:14:02 +01:00
Mario Zechner cd8ce452c7 Merge pull request #924 from Perlence/fix/wrap-whitespace
fix(tui): rewrite word wrap to not strip whitespace
2026-01-24 03:02:48 +01:00
Mario Zechner 25bdfb0b8e Merge pull request #925 from dannote/feat/update-changelog-link
feat(coding-agent): add changelog link to update notification
2026-01-24 02:58:06 +01:00
Mario Zechner cdb0400347 Merge pull request #928 from ferologics/feat/reload-full-scrollback
feat(coding-agent): /reload now re-renders entire scrollback
2026-01-24 02:53:57 +01:00
Mario Zechner ab8d44d696 feat(coding-agent): tune resource list colors 2026-01-24 02:51:27 +01:00
Mario Zechner 725d6bbf35 feat(coding-agent): refine resource metadata and display 2026-01-24 02:46:08 +01:00
Mario Zechner 79ab767beb test(coding-agent): update settings and extension tests 2026-01-24 01:43:34 +01:00
Mario Zechner f9eb190ef9 refactor(coding-agent): simplify AgentSession 2026-01-24 01:38:58 +01:00
Mario Zechner 254c00b788 refactor(coding-agent): centralize git url detection 2026-01-24 01:02:16 +01:00
Mario Zechner 4719929f6a refactor(coding-agent): unify SkillWarning and ResourceDiagnostic
- Create shared diagnostics.ts with ResourceCollision and ResourceDiagnostic types
- Update loadSkills() to return diagnostics instead of warnings
- Remove SkillWarning type and skillWarningsToDiagnostics() conversion
- Update skills.test.ts to use diagnostics
2026-01-24 00:45:01 +01:00
Mario Zechner 6d0d434d8c Add /diff extension for VS Code diff view 2026-01-24 00:35:33 +01:00
Mario Zechner 50c8323590 feat(coding-agent): package deduplication and collision detection
- Package deduplication: same package in global+project, project wins
- Collision detection for skills, prompts, and themes with ResourceCollision type
- PathMetadata tracking with parent directory lookup for file paths
- Display improvements: section headers, sorted groups, accent colors for packages
- pi list shows full paths below package names
- Extension loader discovers files in directories without index.ts
- In-memory SettingsManager properly tracks project settings

fixes #645
2026-01-24 00:35:19 +01:00
Mario Zechner c5c515f560 remove chalk-logger example (breaks TUI by using console.log directly)
The with-deps example demonstrates npm dependency resolution properly.
2026-01-23 21:04:15 +01:00
Mario Zechner e8fadb7333 docs(coding-agent): document layered filtering behavior 2026-01-23 20:59:31 +01:00
Mario Zechner 375d0bc4d6 fix(coding-agent): user filters now layer on top of manifest filters
Previously, user filters completely replaced manifest filtering. Now:
1. Manifest patterns are applied first (defines what package provides)
2. User patterns are applied on top (narrows down further)

This means if a manifest excludes 10 extensions and user adds one more
exclusion, all 11 are excluded (not just the user's one).
2026-01-23 20:58:17 +01:00
Mario Zechner f63a353779 docs(coding-agent): document bundling other pi packages with bundledDependencies 2026-01-23 20:40:15 +01:00
Mario Zechner 23fd73e558 docs(coding-agent): document glob pattern support in pi manifest 2026-01-23 20:34:25 +01:00
Mario Zechner ed75a8320b feat(coding-agent): support glob patterns in pi manifest arrays
- Manifest extensions/skills/prompts/themes arrays now support glob patterns
- Use !pattern for exclusions (e.g., '!**/deprecated/*')
- Enables packages to bundle dependencies and selectively include resources
2026-01-23 20:33:16 +01:00
Mario Zechner 6beeafed17 docs(coding-agent): document pattern precedence (exclusions always win) 2026-01-23 20:28:47 +01:00
Mario Zechner 6d475e5035 docs(coding-agent): document glob pattern support for resource filtering 2026-01-23 20:26:50 +01:00
Mario Zechner ac4dab4085 feat(coding-agent): add minimatch pattern support for resource filtering
- Support glob patterns and ! exclusions in package filter arrays
- Support glob patterns and ! exclusions in top-level settings arrays
- Add helper functions: isPattern, hasPatterns, collectFiles, collectSkillEntries, applyPatterns
- Add resolveLocalEntries for pattern-aware resolution of top-level arrays
- Add applyPackageFilter and collectAllPackageFiles for package filter patterns
- Add comprehensive tests for both top-level and package filter patterns
2026-01-23 20:26:11 +01:00
Mario Zechner 75eb841bb2 fix(coding-agent): register themes from resource loader
Themes loaded from packages were not appearing in theme selector because
setRegisteredThemes was never called. Now register themes:
- On startup before initTheme
- After /reload completes
2026-01-23 20:00:32 +01:00
Mario Zechner ef1fc3103e feat(coding-agent): add packages array with filtering support
- Add PackageSource type for npm/git sources with optional filtering
- Migrate npm:/git: sources from extensions to packages array
- Add getPackages(), setPackages(), setProjectPackages() methods
- Update package-manager to resolve from packages array
- Support selective loading: extensions, skills, prompts, themes per package
- Update pi list to show packages
- Add migration tests for settings

closes #645
2026-01-23 19:51:23 +01:00
Mario Zechner 5ffe51b38b Merge pull request #923 from aliou/fix-alt-up-compaction-queue
fix(coding-agent): restore compaction-queued messages on Alt-Up
2026-01-23 18:19:50 +01:00
Mario Zechner 3629f64de8 Merge pull request #920 from enisdenjo/selected-provider
Show provider alongside the model in footer if multiple
2026-01-23 17:41:19 +01:00
Mario Zechner 2cdf608d51 fix: Bun compatibility for build scripts and runtime detection (#922) 2026-01-23 17:38:46 +01:00
Mario Zechner 73734a23a1 fix(coding-agent): only list built-in tools in system prompt
Extension tools are already described via API tool definitions.
Removes redundant 'Custom tool' fallback.
2026-01-23 00:54:30 +01:00
Mario Zechner 7a2e71bb50 chore: add pi working dir gitignores 2026-01-22 23:21:01 +01:00
Mario Zechner e13d97f765 Merge branch 'fix/slash-menu-trigger-clean' 2026-01-22 23:12:42 +01:00
Mario Zechner f42deae13e fix(tui): gate slash menu to empty input 2026-01-22 23:12:33 +01:00
Mario Zechner 0f0c54b812 fix(coding-agent): expand paste markers in follow-up queue
fixes #912
2026-01-22 22:35:46 +01:00
Mario Zechner 7868b25a2b feat(coding-agent): make skill invocation messages collapsible
- Add ParsedSkillBlock interface and parseSkillBlock() function
- Change skill expansion to use XML-style <skill> tags
- Add SkillInvocationMessageComponent for collapsible display
- Collapsed: single line with skill name and expand hint
- User message rendered separately after skill block

Fixes #894
2026-01-22 22:29:24 +01:00
Mario Zechner f54e71999f fix(coding-agent): simplify extension error listener to single instance
There's only ever one bindings instance per session, so the Set/Array
approach was unnecessary. Changed from Set<ExtensionErrorListener> to
optional single listener.
2026-01-22 22:03:17 +01:00
Mario Zechner e0742d8217 feat(coding-agent): support env vars and shell commands in headers
Header values in models.json now resolve using the same logic as apiKey:
- Environment variable names are resolved to their values
- Shell commands prefixed with ! are executed
- Literal values are used directly

This is a minor breaking change: if a header value accidentally matches
an env var name, it will now resolve to that env var's value.

Fixes #909
2026-01-22 21:50:22 +01:00
Mario Zechner 7af1919d31 fix: use portable shebang in shell scripts
Change #!/bin/bash to #!/usr/bin/env bash for better portability
on systems like NixOS where /bin/bash doesn't exist.

Fixes #910
2026-01-22 21:44:39 +01:00
Mario Zechner 9b84857b83 fix(coding-agent): add 'terminated' to retryable error patterns
Codex API can send 'terminated' error mid-stream, which should be
retried like other transient server errors.
2026-01-22 21:32:56 +01:00
Mario Zechner 5e079e2ea8 fix(coding-agent): use specific terminology in reload messages instead of 'resources' 2026-01-22 19:32:14 +01:00
Mario Zechner 7d2255ddc2 fix(coding-agent): reset terminal title and working message in resetExtensionUI 2026-01-22 19:18:51 +01:00
Mario Zechner b35950c5bd chore(coding-agent): minor cleanup in rpc-mode and shell utils 2026-01-22 14:37:17 +01:00
Mario Zechner 79268f92d0 fix(coding-agent): add missing required colors to theme-schema.json 2026-01-22 14:28:00 +01:00
Mario Zechner d89f6e08ce fix(coding-agent): normalize raw git URLs in extension source matching
- Handle https://github.com/... URLs as git sources (not local)
- Strip .git suffix for consistent matching
2026-01-22 14:19:04 +01:00
Mario Zechner d99b7057ca feat(coding-agent): extension package management and hot reload
Implements #645:
- ResourceLoader/PackageManager system replacing legacy discovery
- CLI commands: pi install, pi remove, pi update, pi list
- /reload command for hot reload in interactive mode
- session.reload() and session.bindExtensions() APIs
- CLI flags: --skill, --theme, --prompt-template, --no-themes, --no-prompt-templates
- Extension conflict detection with filtering
- Support for npm:, git:, local paths, and raw git URLs
- Auto npm install for git repos with package.json

closes #645
2026-01-22 13:52:09 +01:00
Mario Zechner 2b656c266b feat(coding-agent): add .gitignore to package manager install roots 2026-01-22 13:49:38 +01:00
Mario Zechner f832a96bda docs(coding-agent): add pi list to changelog 2026-01-22 13:49:38 +01:00
Mario Zechner ca7be6929d feat(coding-agent): run npm install after cloning git repos with package.json 2026-01-22 13:49:38 +01:00
Mario Zechner 5c047c351d fix(coding-agent): filter out conflicting extensions from loaded list 2026-01-22 13:49:38 +01:00
Mario Zechner 1faaccc5c7 fix(coding-agent): format display paths with ~ and shorten temp paths 2026-01-22 13:49:38 +01:00
Mario Zechner 8ec7d6867a fix(coding-agent): git temp path resolution, add pi list command (#645)
- Fix getGitInstallPath to check scope === 'temporary' directly
- Remove redundant temporary parameter from git methods
- Add 'pi list' command to show installed extensions from settings
2026-01-22 13:49:38 +01:00
Mario Zechner 4058680d22 feat(coding-agent): progress callbacks, conflict detection, URL parsing, tests (#645)
- Add progress callbacks to PackageManager for TUI status during install/remove/update
- Add extension conflict detection (tools, commands, flags with same names)
- Accept raw GitHub/GitLab URLs without git: prefix
- Add tests for package-manager.ts and resource-loader.ts
- Add empty fixture directories for skills tests
2026-01-22 13:49:38 +01:00
Mario Zechner b846a4bfcf 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
2026-01-22 13:49:38 +01:00
Mario Zechner 866d21c252 chore: move pi-dosbox to separate repo
Moved to https://github.com/badlogic/pi-dosbox
2026-01-22 13:19:54 +01:00
Mario Zechner c083e195ad Revert "fix(pi-dosbox): force image re-render to prevent ghosting during streaming"
This reverts commit 1668a59bff.
2026-01-22 05:36:00 +01:00
Mario Zechner 1668a59bff fix(pi-dosbox): force image re-render to prevent ghosting during streaming
The TUI only re-renders changed lines. During agent streaming, the
conversation lines above DOSBox change but DOSBox lines stay the same.
This caused the image to stay at its old position while text scrolled.

Fix: Add invisible timestamp to image line to force TUI to see it as
changed every render, ensuring the image is always re-rendered at the
correct position.
2026-01-22 05:30:57 +01:00
Mario Zechner 29e6c13c03 fix(pi-dosbox): use post-init FS mounting instead of bundle.extract
bundle.extract() uses XMLHttpRequest which doesn't exist in Node.js.
Reverted to writing files directly to Emscripten FS after DOSBox init.
jsdos mounts C: to /home/web_user by default.
2026-01-22 05:11:57 +01:00
Mario Zechner 935417cff1 fix(pi-dosbox): include QBasic files in jsdos bundle
The previous approach of writing files to Emscripten FS after DOSBox
started didn't work because the C: drive mount was pointing elsewhere.

Now we create a proper zip archive of QBasic files and include it in
the jsdos bundle using the extract() API with a data URL. The bundle
extracts to the C: drive root on startup.
2026-01-22 05:09:32 +01:00
Mario Zechner 4f343f39b9 feat(pi-dosbox): persistent DOSBox with QBasic and agent tool
- DOSBox now starts at session_start and persists in background
- /dosbox command attaches UI to running instance (Ctrl+Q detaches)
- Added dosbox tool with actions: send_keys, screenshot, read_text
- Bundled QuickBASIC 4.5 files, mounted at C:\QB on startup
- Agent can interact with DOSBox programmatically via tool

Use: pi -e ./examples/extensions/pi-dosbox
Then: /dosbox to view, or let agent use the dosbox tool
2026-01-22 05:03:39 +01:00
Mario Zechner fbd6b7f9ba fix(tui): prevent image ID collisions between modules
- allocateImageId() now returns random IDs instead of sequential
- Static images no longer auto-allocate IDs (transient display)
- Only explicit imageId usage (like DOSBox) gets tracked IDs
- Suppress emulators exit logging in DOSBox dispose

Fixes image replacement bug when extension and main app both
allocated sequential IDs starting at 1.
2026-01-22 04:52:55 +01:00
Mario Zechner df1d5c40ea fix(tui): proper Kitty image ID management and cleanup
- Add allocateImageId() to generate unique image IDs
- Add deleteKittyImage() and deleteAllKittyImages() functions
- Image component now tracks its ID and has dispose() method
- renderImage() returns imageId for tracking
- DOSBox: reuse single image ID for all frames, delete on dispose

Fixes image accumulation hitting terminal quota and lingering
images after component close.
2026-01-22 04:39:58 +01:00