mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-15 07:04:45 +00:00
Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
354c4c1f8c
27 changed files with 485 additions and 427 deletions
702
package-lock.json
generated
702
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.56.2] - 2026-03-05
|
||||||
|
|
||||||
## [0.56.1] - 2026-03-05
|
## [0.56.1] - 2026-03-05
|
||||||
|
|
||||||
## [0.56.0] - 2026-03-04
|
## [0.56.0] - 2026-03-04
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mariozechner/pi-agent-core",
|
"name": "@mariozechner/pi-agent-core",
|
||||||
"version": "0.56.1",
|
"version": "0.56.2",
|
||||||
"description": "General-purpose agent with transport abstraction, state management, and attachment support",
|
"description": "General-purpose agent with transport abstraction, state management, and attachment support",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
"prepublishOnly": "npm run clean && npm run build"
|
"prepublishOnly": "npm run clean && npm run build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mariozechner/pi-ai": "^0.56.1"
|
"@mariozechner/pi-ai": "^0.56.2"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"ai",
|
"ai",
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,17 @@
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.56.2] - 2026-03-05
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Added `gpt-5.4` model support for `openai`, `openai-codex`, `azure-openai-responses`, and `opencode` providers, with GPT-5.4 treated as xhigh-capable and capped to a 272000 context window in built-in metadata.
|
- Added `gpt-5.4` model support for `openai`, `openai-codex`, `azure-openai-responses`, and `opencode` providers, with GPT-5.4 treated as xhigh-capable and capped to a 272000 context window in built-in metadata.
|
||||||
|
- Added `gpt-5.3-codex` fallback model availability for `github-copilot` until upstream model catalogs include it ([#1853](https://github.com/badlogic/pi-mono/issues/1853)).
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Preserved OpenAI Responses assistant `phase` metadata (`commentary`, `final_answer`) across turns by encoding `id` and `phase` in `textSignature` for session persistence and replay, with backward compatibility for legacy plain signatures ([#1819](https://github.com/badlogic/pi-mono/issues/1819)).
|
- Preserved OpenAI Responses assistant `phase` metadata (`commentary`, `final_answer`) across turns by encoding `id` and `phase` in `textSignature` for session persistence and replay, with backward compatibility for legacy plain signatures ([#1819](https://github.com/badlogic/pi-mono/issues/1819)).
|
||||||
|
- Fixed OpenAI Responses replay to omit empty thinking blocks, avoiding invalid no-op reasoning items in follow-up turns.
|
||||||
- Switched the Mistral provider from the OpenAI-compatible completions path to Mistral's native SDK and conversations API, preserving native thinking blocks and Mistral-specific message semantics across turns ([#1716](https://github.com/badlogic/pi-mono/issues/1716)).
|
- Switched the Mistral provider from the OpenAI-compatible completions path to Mistral's native SDK and conversations API, preserving native thinking blocks and Mistral-specific message semantics across turns ([#1716](https://github.com/badlogic/pi-mono/issues/1716)).
|
||||||
- Fixed Antigravity endpoint fallback: 403/404 responses now cascade to the next endpoint instead of throwing immediately, added `autopush-cloudcode-pa.sandbox` endpoint to the fallback list, and removed extra fingerprint headers (`X-Goog-Api-Client`, `Client-Metadata`) from Antigravity requests ([#1830](https://github.com/badlogic/pi-mono/issues/1830)).
|
- Fixed Antigravity endpoint fallback: 403/404 responses now cascade to the next endpoint instead of throwing immediately, added `autopush-cloudcode-pa.sandbox` endpoint to the fallback list, and removed extra fingerprint headers (`X-Goog-Api-Client`, `Client-Metadata`) from Antigravity requests ([#1830](https://github.com/badlogic/pi-mono/issues/1830)).
|
||||||
- Fixed `@mariozechner/pi-ai/oauth` package exports to point directly at built `dist` files, avoiding broken TypeScript resolution through unpublished wrapper targets ([#1856](https://github.com/badlogic/pi-mono/issues/1856)).
|
- Fixed `@mariozechner/pi-ai/oauth` package exports to point directly at built `dist` files, avoiding broken TypeScript resolution through unpublished wrapper targets ([#1856](https://github.com/badlogic/pi-mono/issues/1856)).
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mariozechner/pi-ai",
|
"name": "@mariozechner/pi-ai",
|
||||||
"version": "0.56.1",
|
"version": "0.56.2",
|
||||||
"description": "Unified LLM API with automatic model discovery and provider configuration",
|
"description": "Unified LLM API with automatic model discovery and provider configuration",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
|
|
|
||||||
|
|
@ -6615,7 +6615,7 @@ export const MODELS = {
|
||||||
cacheRead: 0.3,
|
cacheRead: 0.3,
|
||||||
cacheWrite: 3.75,
|
cacheWrite: 3.75,
|
||||||
},
|
},
|
||||||
contextWindow: 1000000,
|
contextWindow: 200000,
|
||||||
maxTokens: 64000,
|
maxTokens: 64000,
|
||||||
} satisfies Model<"openai-completions">,
|
} satisfies Model<"openai-completions">,
|
||||||
"anthropic/claude-sonnet-4.5": {
|
"anthropic/claude-sonnet-4.5": {
|
||||||
|
|
@ -6884,11 +6884,11 @@ export const MODELS = {
|
||||||
cost: {
|
cost: {
|
||||||
input: 0.19999999999999998,
|
input: 0.19999999999999998,
|
||||||
output: 0.77,
|
output: 0.77,
|
||||||
cacheRead: 0.135,
|
cacheRead: 0.13,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 163840,
|
contextWindow: 163840,
|
||||||
maxTokens: 4096,
|
maxTokens: 163840,
|
||||||
} satisfies Model<"openai-completions">,
|
} satisfies Model<"openai-completions">,
|
||||||
"deepseek/deepseek-chat-v3.1": {
|
"deepseek/deepseek-chat-v3.1": {
|
||||||
id: "deepseek/deepseek-chat-v3.1",
|
id: "deepseek/deepseek-chat-v3.1",
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,20 @@
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.56.2] - 2026-03-05
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
- GPT-5.4 support across `openai`, `openai-codex`, `azure-openai-responses`, and `opencode`, with `gpt-5.4` now the default for `openai` and `openai-codex` ([README.md](README.md), [docs/providers.md](docs/providers.md)).
|
||||||
|
- `treeFilterMode` setting to choose the default `/tree` filter mode (`default`, `no-tools`, `user-only`, `labeled-only`, `all`) ([docs/settings.md](docs/settings.md), [#1852](https://github.com/badlogic/pi-mono/pull/1852) by [@lajarre](https://github.com/lajarre)).
|
||||||
|
- Mistral native conversations integration with SDK-backed provider behavior, preserving Mistral-specific thinking and replay semantics ([README.md](README.md), [docs/providers.md](docs/providers.md), [#1716](https://github.com/badlogic/pi-mono/issues/1716)).
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added `gpt-5.4` model availability for `openai`, `openai-codex`, `azure-openai-responses`, and `opencode` providers.
|
||||||
|
- Added `gpt-5.3-codex` fallback model availability for `github-copilot` until upstream model catalogs include it ([#1853](https://github.com/badlogic/pi-mono/issues/1853)).
|
||||||
|
- Added `treeFilterMode` setting to choose the default `/tree` filter mode (`default`, `no-tools`, `user-only`, `labeled-only`, `all`) ([#1852](https://github.com/badlogic/pi-mono/pull/1852) by [@lajarre](https://github.com/lajarre)).
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Updated the default models for the `openai` and `openai-codex` providers to `gpt-5.4`.
|
- Updated the default models for the `openai` and `openai-codex` providers to `gpt-5.4`.
|
||||||
|
|
@ -9,10 +23,12 @@
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Fixed GPT-5.3 Codex follow-up turns dropping OpenAI Responses assistant `phase` metadata by preserving replayable signatures in session history and forwarding `phase` back to the Responses API ([#1819](https://github.com/badlogic/pi-mono/issues/1819)).
|
- Fixed GPT-5.3 Codex follow-up turns dropping OpenAI Responses assistant `phase` metadata by preserving replayable signatures in session history and forwarding `phase` back to the Responses API ([#1819](https://github.com/badlogic/pi-mono/issues/1819)).
|
||||||
|
- Fixed OpenAI Responses replay to omit empty thinking blocks, avoiding invalid no-op reasoning items in follow-up turns.
|
||||||
- Updated Mistral integration to use the native SDK-backed provider and conversations API, including coding-agent model/provider wiring and Mistral setup documentation ([#1716](https://github.com/badlogic/pi-mono/issues/1716)).
|
- Updated Mistral integration to use the native SDK-backed provider and conversations API, including coding-agent model/provider wiring and Mistral setup documentation ([#1716](https://github.com/badlogic/pi-mono/issues/1716)).
|
||||||
- Fixed Antigravity reliability: endpoint cascade on 403/404, added autopush sandbox fallback, removed extra fingerprint headers ([#1830](https://github.com/badlogic/pi-mono/issues/1830)).
|
- Fixed Antigravity reliability: endpoint cascade on 403/404, added autopush sandbox fallback, removed extra fingerprint headers ([#1830](https://github.com/badlogic/pi-mono/issues/1830)).
|
||||||
- Fixed `@mariozechner/pi-ai/oauth` extension imports in published installs by resolving the subpath directly from built `dist` files instead of package-root wrapper shims ([#1856](https://github.com/badlogic/pi-mono/issues/1856)).
|
- Fixed `@mariozechner/pi-ai/oauth` extension imports in published installs by resolving the subpath directly from built `dist` files instead of package-root wrapper shims ([#1856](https://github.com/badlogic/pi-mono/issues/1856)).
|
||||||
- Fixed Gemini 3 multi-turn tool use losing structured context by using `skip_thought_signature_validator` sentinel for unsigned function calls instead of text fallback ([#1829](https://github.com/badlogic/pi-mono/issues/1829)).
|
- Fixed Gemini 3 multi-turn tool use losing structured context by using `skip_thought_signature_validator` sentinel for unsigned function calls instead of text fallback ([#1829](https://github.com/badlogic/pi-mono/issues/1829)).
|
||||||
|
- Fixed model selector filter not accepting typed characters in VS Code 1.110+ due to missing Kitty CSI-u printable decoding in the `Input` component ([#1857](https://github.com/badlogic/pi-mono/issues/1857))
|
||||||
- Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/badlogic/pi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)).
|
- Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/badlogic/pi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)).
|
||||||
- Fixed footer width truncation for wide Unicode text (session name, model, provider) to prevent TUI crashes from rendered lines exceeding terminal width ([#1833](https://github.com/badlogic/pi-mono/issues/1833)).
|
- Fixed footer width truncation for wide Unicode text (session name, model, provider) to prevent TUI crashes from rendered lines exceeding terminal width ([#1833](https://github.com/badlogic/pi-mono/issues/1833)).
|
||||||
- Fixed Windows write preview background artifacts by normalizing CRLF content (`\r\n`) to LF for display rendering in tool output previews ([#1854](https://github.com/badlogic/pi-mono/issues/1854)).
|
- Fixed Windows write preview background artifacts by normalizing CRLF content (`\r\n`) to LF for display rendering in tool output previews ([#1854](https://github.com/badlogic/pi-mono/issues/1854)).
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "pi-extension-custom-provider",
|
"name": "pi-extension-custom-provider",
|
||||||
"version": "1.7.1",
|
"version": "1.7.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pi-extension-custom-provider",
|
"name": "pi-extension-custom-provider",
|
||||||
"version": "1.7.1",
|
"version": "1.7.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@anthropic-ai/sdk": "^0.52.0"
|
"@anthropic-ai/sdk": "^0.52.0"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "pi-extension-custom-provider-anthropic",
|
"name": "pi-extension-custom-provider-anthropic",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.7.1",
|
"version": "1.7.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "echo 'nothing to clean'",
|
"clean": "echo 'nothing to clean'",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "pi-extension-custom-provider-gitlab-duo",
|
"name": "pi-extension-custom-provider-gitlab-duo",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.7.1",
|
"version": "1.7.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "echo 'nothing to clean'",
|
"clean": "echo 'nothing to clean'",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "pi-extension-custom-provider-qwen-cli",
|
"name": "pi-extension-custom-provider-qwen-cli",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "echo 'nothing to clean'",
|
"clean": "echo 'nothing to clean'",
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "pi-extension-with-deps",
|
"name": "pi-extension-with-deps",
|
||||||
"version": "1.20.1",
|
"version": "1.20.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pi-extension-with-deps",
|
"name": "pi-extension-with-deps",
|
||||||
"version": "1.20.1",
|
"version": "1.20.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "^2.1.3"
|
"ms": "^2.1.3"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "pi-extension-with-deps",
|
"name": "pi-extension-with-deps",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.20.1",
|
"version": "1.20.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "echo 'nothing to clean'",
|
"clean": "echo 'nothing to clean'",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mariozechner/pi-coding-agent",
|
"name": "@mariozechner/pi-coding-agent",
|
||||||
"version": "0.56.1",
|
"version": "0.56.2",
|
||||||
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"piConfig": {
|
"piConfig": {
|
||||||
|
|
@ -40,9 +40,9 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mariozechner/jiti": "^2.6.2",
|
"@mariozechner/jiti": "^2.6.2",
|
||||||
"@mariozechner/pi-agent-core": "^0.56.1",
|
"@mariozechner/pi-agent-core": "^0.56.2",
|
||||||
"@mariozechner/pi-ai": "^0.56.1",
|
"@mariozechner/pi-ai": "^0.56.2",
|
||||||
"@mariozechner/pi-tui": "^0.56.1",
|
"@mariozechner/pi-tui": "^0.56.2",
|
||||||
"@silvia-odwyer/photon-node": "^0.3.4",
|
"@silvia-odwyer/photon-node": "^0.3.4",
|
||||||
"chalk": "^5.5.0",
|
"chalk": "^5.5.0",
|
||||||
"cli-highlight": "^2.1.11",
|
"cli-highlight": "^2.1.11",
|
||||||
|
|
|
||||||
|
|
@ -75,10 +75,10 @@ function getAliases(): Record<string, string> {
|
||||||
|
|
||||||
_aliases = {
|
_aliases = {
|
||||||
"@mariozechner/pi-coding-agent": packageIndex,
|
"@mariozechner/pi-coding-agent": packageIndex,
|
||||||
"@mariozechner/pi-agent-core": resolveWorkspaceOrImport("agent/src/index.ts", "@mariozechner/pi-agent-core"),
|
"@mariozechner/pi-agent-core": resolveWorkspaceOrImport("agent/dist/index.js", "@mariozechner/pi-agent-core"),
|
||||||
"@mariozechner/pi-tui": resolveWorkspaceOrImport("tui/src/index.ts", "@mariozechner/pi-tui"),
|
"@mariozechner/pi-tui": resolveWorkspaceOrImport("tui/dist/index.js", "@mariozechner/pi-tui"),
|
||||||
"@mariozechner/pi-ai": resolveWorkspaceOrImport("ai/src/index.ts", "@mariozechner/pi-ai"),
|
"@mariozechner/pi-ai": resolveWorkspaceOrImport("ai/dist/index.js", "@mariozechner/pi-ai"),
|
||||||
"@mariozechner/pi-ai/oauth": resolveWorkspaceOrImport("ai/src/oauth.ts", "@mariozechner/pi-ai/oauth"),
|
"@mariozechner/pi-ai/oauth": resolveWorkspaceOrImport("ai/dist/oauth.js", "@mariozechner/pi-ai/oauth"),
|
||||||
"@sinclair/typebox": typeboxRoot,
|
"@sinclair/typebox": typeboxRoot,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.56.2] - 2026-03-05
|
||||||
|
|
||||||
## [0.56.1] - 2026-03-05
|
## [0.56.1] - 2026-03-05
|
||||||
|
|
||||||
## [0.56.0] - 2026-03-04
|
## [0.56.0] - 2026-03-04
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mariozechner/pi-mom",
|
"name": "@mariozechner/pi-mom",
|
||||||
"version": "0.56.1",
|
"version": "0.56.2",
|
||||||
"description": "Slack bot that delegates messages to the pi coding agent",
|
"description": "Slack bot that delegates messages to the pi coding agent",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|
@ -20,9 +20,9 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@anthropic-ai/sandbox-runtime": "^0.0.16",
|
"@anthropic-ai/sandbox-runtime": "^0.0.16",
|
||||||
"@mariozechner/pi-agent-core": "^0.56.1",
|
"@mariozechner/pi-agent-core": "^0.56.2",
|
||||||
"@mariozechner/pi-ai": "^0.56.1",
|
"@mariozechner/pi-ai": "^0.56.2",
|
||||||
"@mariozechner/pi-coding-agent": "^0.56.1",
|
"@mariozechner/pi-coding-agent": "^0.56.2",
|
||||||
"@sinclair/typebox": "^0.34.0",
|
"@sinclair/typebox": "^0.34.0",
|
||||||
"@slack/socket-mode": "^2.0.0",
|
"@slack/socket-mode": "^2.0.0",
|
||||||
"@slack/web-api": "^7.0.0",
|
"@slack/web-api": "^7.0.0",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mariozechner/pi",
|
"name": "@mariozechner/pi",
|
||||||
"version": "0.56.1",
|
"version": "0.56.2",
|
||||||
"description": "CLI tool for managing vLLM deployments on GPU pods",
|
"description": "CLI tool for managing vLLM deployments on GPU pods",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
"node": ">=20.0.0"
|
"node": ">=20.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mariozechner/pi-agent-core": "^0.56.1",
|
"@mariozechner/pi-agent-core": "^0.56.2",
|
||||||
"chalk": "^5.5.0"
|
"chalk": "^5.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {}
|
"devDependencies": {}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,15 @@
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.56.2] - 2026-03-05
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Exported `decodeKittyPrintable()` from `keys.ts` for decoding Kitty CSI-u sequences into printable characters
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed `Input` component not accepting typed characters when Kitty keyboard protocol is active (e.g., VS Code 1.110+), causing model selector filter to ignore keystrokes ([#1857](https://github.com/badlogic/pi-mono/issues/1857))
|
||||||
- Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/badlogic/pi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)).
|
- Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/badlogic/pi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)).
|
||||||
|
|
||||||
## [0.56.1] - 2026-03-05
|
## [0.56.1] - 2026-03-05
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mariozechner/pi-tui",
|
"name": "@mariozechner/pi-tui",
|
||||||
"version": "0.56.1",
|
"version": "0.56.2",
|
||||||
"description": "Terminal User Interface library with differential rendering for efficient text-based applications",
|
"description": "Terminal User Interface library with differential rendering for efficient text-based applications",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import type { AutocompleteProvider, CombinedAutocompleteProvider } from "../autocomplete.js";
|
import type { AutocompleteProvider, CombinedAutocompleteProvider } from "../autocomplete.js";
|
||||||
import { getEditorKeybindings } from "../keybindings.js";
|
import { getEditorKeybindings } from "../keybindings.js";
|
||||||
import { matchesKey } from "../keys.js";
|
import { decodeKittyPrintable, matchesKey } from "../keys.js";
|
||||||
import { KillRing } from "../kill-ring.js";
|
import { KillRing } from "../kill-ring.js";
|
||||||
import { type Component, CURSOR_MARKER, type Focusable, type TUI } from "../tui.js";
|
import { type Component, CURSOR_MARKER, type Focusable, type TUI } from "../tui.js";
|
||||||
import { UndoStack } from "../undo-stack.js";
|
import { UndoStack } from "../undo-stack.js";
|
||||||
|
|
@ -92,48 +92,6 @@ export function wordWrapLine(line: string, maxWidth: number): TextChunk[] {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kitty CSI-u sequences for printable keys, including optional shifted/base codepoints.
|
// Kitty CSI-u sequences for printable keys, including optional shifted/base codepoints.
|
||||||
const KITTY_CSI_U_REGEX = /^\x1b\[(\d+)(?::(\d*))?(?::(\d+))?(?:;(\d+))?(?::(\d+))?u$/;
|
|
||||||
const KITTY_MOD_SHIFT = 1;
|
|
||||||
const KITTY_MOD_ALT = 2;
|
|
||||||
const KITTY_MOD_CTRL = 4;
|
|
||||||
const KITTY_LOCK_MASK = 64 + 128; // Caps Lock + Num Lock
|
|
||||||
const KITTY_ALLOWED_MODIFIERS = KITTY_MOD_SHIFT | KITTY_LOCK_MASK;
|
|
||||||
|
|
||||||
// Decode a printable CSI-u sequence, preferring the shifted key when present.
|
|
||||||
function decodeKittyPrintable(data: string): string | undefined {
|
|
||||||
const match = data.match(KITTY_CSI_U_REGEX);
|
|
||||||
if (!match) return undefined;
|
|
||||||
|
|
||||||
// CSI-u groups: <codepoint>[:<shifted>[:<base>]];<mod>u
|
|
||||||
const codepoint = Number.parseInt(match[1] ?? "", 10);
|
|
||||||
if (!Number.isFinite(codepoint)) return undefined;
|
|
||||||
|
|
||||||
const shiftedKey = match[2] && match[2].length > 0 ? Number.parseInt(match[2], 10) : undefined;
|
|
||||||
const modValue = match[4] ? Number.parseInt(match[4], 10) : 1;
|
|
||||||
// Modifiers are 1-indexed in CSI-u; normalize to our bitmask.
|
|
||||||
const modifier = Number.isFinite(modValue) ? modValue - 1 : 0;
|
|
||||||
|
|
||||||
// Only accept printable CSI-u input for plain or Shift-modified text keys.
|
|
||||||
// Reject unsupported modifier bits (e.g. Super/Meta) to avoid inserting
|
|
||||||
// characters from modifier-only terminal events.
|
|
||||||
if ((modifier & ~KITTY_ALLOWED_MODIFIERS) !== 0) return undefined;
|
|
||||||
if (modifier & (KITTY_MOD_ALT | KITTY_MOD_CTRL)) return undefined;
|
|
||||||
|
|
||||||
// Prefer the shifted keycode when Shift is held.
|
|
||||||
let effectiveCodepoint = codepoint;
|
|
||||||
if (modifier & KITTY_MOD_SHIFT && typeof shiftedKey === "number") {
|
|
||||||
effectiveCodepoint = shiftedKey;
|
|
||||||
}
|
|
||||||
// Drop control characters or invalid codepoints.
|
|
||||||
if (!Number.isFinite(effectiveCodepoint) || effectiveCodepoint < 32) return undefined;
|
|
||||||
|
|
||||||
try {
|
|
||||||
return String.fromCodePoint(effectiveCodepoint);
|
|
||||||
} catch {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EditorState {
|
interface EditorState {
|
||||||
lines: string[];
|
lines: string[];
|
||||||
cursorLine: number;
|
cursorLine: number;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import { getEditorKeybindings } from "../keybindings.js";
|
import { getEditorKeybindings } from "../keybindings.js";
|
||||||
|
import { decodeKittyPrintable } from "../keys.js";
|
||||||
import { KillRing } from "../kill-ring.js";
|
import { KillRing } from "../kill-ring.js";
|
||||||
import { type Component, CURSOR_MARKER, type Focusable } from "../tui.js";
|
import { type Component, CURSOR_MARKER, type Focusable } from "../tui.js";
|
||||||
import { UndoStack } from "../undo-stack.js";
|
import { UndoStack } from "../undo-stack.js";
|
||||||
|
|
@ -187,6 +188,16 @@ export class Input implements Component, Focusable {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kitty CSI-u printable character (e.g. \x1b[97u for 'a').
|
||||||
|
// Terminals with Kitty protocol flag 1 (disambiguate) send CSI-u for all keys,
|
||||||
|
// including plain printable characters. Decode before the control-char check
|
||||||
|
// since CSI-u sequences contain \x1b which would be rejected.
|
||||||
|
const kittyPrintable = decodeKittyPrintable(data);
|
||||||
|
if (kittyPrintable !== undefined) {
|
||||||
|
this.insertCharacter(kittyPrintable);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Regular character input - accept printable characters including Unicode,
|
// Regular character input - accept printable characters including Unicode,
|
||||||
// but reject control characters (C0: 0x00-0x1F, DEL: 0x7F, C1: 0x80-0x9F)
|
// but reject control characters (C0: 0x00-0x1F, DEL: 0x7F, C1: 0x80-0x9F)
|
||||||
const hasControlChars = [...data].some((ch) => {
|
const hasControlChars = [...data].some((ch) => {
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ export {
|
||||||
} from "./keybindings.js";
|
} from "./keybindings.js";
|
||||||
// Keyboard input handling
|
// Keyboard input handling
|
||||||
export {
|
export {
|
||||||
|
decodeKittyPrintable,
|
||||||
isKeyRelease,
|
isKeyRelease,
|
||||||
isKeyRepeat,
|
isKeyRepeat,
|
||||||
isKittyProtocolActive,
|
isKittyProtocolActive,
|
||||||
|
|
|
||||||
|
|
@ -1152,3 +1152,58 @@ export function parseKey(data: string): string | undefined {
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =============================================================================
|
||||||
|
// Kitty CSI-u Printable Decoding
|
||||||
|
// =============================================================================
|
||||||
|
|
||||||
|
const KITTY_CSI_U_REGEX = /^\x1b\[(\d+)(?::(\d*))?(?::(\d+))?(?:;(\d+))?(?::(\d+))?u$/;
|
||||||
|
const KITTY_PRINTABLE_ALLOWED_MODIFIERS = MODIFIERS.shift | LOCK_MASK;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode a Kitty CSI-u sequence into a printable character, if applicable.
|
||||||
|
*
|
||||||
|
* When Kitty keyboard protocol flag 1 (disambiguate) is active, terminals send
|
||||||
|
* CSI-u sequences for all keys, including plain printable characters. This
|
||||||
|
* function extracts the printable character from such sequences.
|
||||||
|
*
|
||||||
|
* Only accepts plain or Shift-modified keys. Rejects Ctrl, Alt, and unsupported
|
||||||
|
* modifier combinations (those are handled by keybinding matching instead).
|
||||||
|
* Prefers the shifted keycode when Shift is held and a shifted key is reported.
|
||||||
|
*
|
||||||
|
* @param data - Raw input data from terminal
|
||||||
|
* @returns The printable character, or undefined if not a printable CSI-u sequence
|
||||||
|
*/
|
||||||
|
export function decodeKittyPrintable(data: string): string | undefined {
|
||||||
|
const match = data.match(KITTY_CSI_U_REGEX);
|
||||||
|
if (!match) return undefined;
|
||||||
|
|
||||||
|
// CSI-u groups: <codepoint>[:<shifted>[:<base>]];<mod>[:<event>]u
|
||||||
|
const codepoint = Number.parseInt(match[1] ?? "", 10);
|
||||||
|
if (!Number.isFinite(codepoint)) return undefined;
|
||||||
|
|
||||||
|
const shiftedKey = match[2] && match[2].length > 0 ? Number.parseInt(match[2], 10) : undefined;
|
||||||
|
const modValue = match[4] ? Number.parseInt(match[4], 10) : 1;
|
||||||
|
// Modifiers are 1-indexed in CSI-u; normalize to our bitmask.
|
||||||
|
const modifier = Number.isFinite(modValue) ? modValue - 1 : 0;
|
||||||
|
|
||||||
|
// Only accept printable CSI-u input for plain or Shift-modified text keys.
|
||||||
|
// Reject unsupported modifier bits (e.g. Super/Meta) to avoid inserting
|
||||||
|
// characters from modifier-only terminal events.
|
||||||
|
if ((modifier & ~KITTY_PRINTABLE_ALLOWED_MODIFIERS) !== 0) return undefined;
|
||||||
|
if (modifier & (MODIFIERS.alt | MODIFIERS.ctrl)) return undefined;
|
||||||
|
|
||||||
|
// Prefer the shifted keycode when Shift is held.
|
||||||
|
let effectiveCodepoint = codepoint;
|
||||||
|
if (modifier & MODIFIERS.shift && typeof shiftedKey === "number") {
|
||||||
|
effectiveCodepoint = shiftedKey;
|
||||||
|
}
|
||||||
|
// Drop control characters or invalid codepoints.
|
||||||
|
if (!Number.isFinite(effectiveCodepoint) || effectiveCodepoint < 32) return undefined;
|
||||||
|
|
||||||
|
try {
|
||||||
|
return String.fromCodePoint(effectiveCodepoint);
|
||||||
|
} catch {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.56.2] - 2026-03-05
|
||||||
|
|
||||||
## [0.56.1] - 2026-03-05
|
## [0.56.1] - 2026-03-05
|
||||||
|
|
||||||
## [0.56.0] - 2026-03-04
|
## [0.56.0] - 2026-03-04
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "pi-web-ui-example",
|
"name": "pi-web-ui-example",
|
||||||
"version": "1.44.1",
|
"version": "1.44.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mariozechner/pi-web-ui",
|
"name": "@mariozechner/pi-web-ui",
|
||||||
"version": "0.56.1",
|
"version": "0.56.2",
|
||||||
"description": "Reusable web UI components for AI chat interfaces powered by @mariozechner/pi-ai",
|
"description": "Reusable web UI components for AI chat interfaces powered by @mariozechner/pi-ai",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
|
|
@ -18,8 +18,8 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lmstudio/sdk": "^1.5.0",
|
"@lmstudio/sdk": "^1.5.0",
|
||||||
"@mariozechner/pi-ai": "^0.56.1",
|
"@mariozechner/pi-ai": "^0.56.2",
|
||||||
"@mariozechner/pi-tui": "^0.56.1",
|
"@mariozechner/pi-tui": "^0.56.2",
|
||||||
"docx-preview": "^0.3.7",
|
"docx-preview": "^0.3.7",
|
||||||
"jszip": "^3.10.1",
|
"jszip": "^3.10.1",
|
||||||
"lucide": "^0.544.0",
|
"lucide": "^0.544.0",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue