diff --git a/.github/APPROVED_CONTRIBUTORS b/.github/APPROVED_CONTRIBUTORS
index 5dcdd5343..83d84d83b 100644
--- a/.github/APPROVED_CONTRIBUTORS
+++ b/.github/APPROVED_CONTRIBUTORS
@@ -4,6 +4,7 @@
# issue future issues stay open
# pr future issues and PRs stay open
+herrnel pr
julien-c pr
barapa pr
alasano pr
diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml
index 147c64002..cf50ffdea 100644
--- a/.github/ISSUE_TEMPLATE/bug.yml
+++ b/.github/ISSUE_TEMPLATE/bug.yml
@@ -5,9 +5,9 @@ body:
- type: markdown
attributes:
value: |
- **Before you start:** Read [CONTRIBUTING.md](https://github.com/badlogic/pi-mono/blob/main/CONTRIBUTING.md).
+ **Before you start:** Read [CONTRIBUTING.md](https://github.com/earendil-works/pi-mono/blob/main/CONTRIBUTING.md).
- New issues from new contributors are auto-closed by default. Maintainers review auto-closed issues daily. Issues that do not meet the quality bar in [CONTRIBUTING.md](https://github.com/badlogic/pi-mono/blob/main/CONTRIBUTING.md) will not be reopened or receive a reply.
+ New issues from new contributors are auto-closed by default. Maintainers review auto-closed issues daily. Issues that do not meet the quality bar in [CONTRIBUTING.md](https://github.com/earendil-works/pi-mono/blob/main/CONTRIBUTING.md) will not be reopened or receive a reply.
Keep this short. If it doesn't fit on one screen, it's too long. Write in your own voice.
diff --git a/.github/ISSUE_TEMPLATE/contribution.yml b/.github/ISSUE_TEMPLATE/contribution.yml
index f0d9204ca..0cf6c5be4 100644
--- a/.github/ISSUE_TEMPLATE/contribution.yml
+++ b/.github/ISSUE_TEMPLATE/contribution.yml
@@ -5,9 +5,9 @@ body:
- type: markdown
attributes:
value: |
- **Before you start:** Read [CONTRIBUTING.md](https://github.com/badlogic/pi-mono/blob/main/CONTRIBUTING.md).
+ **Before you start:** Read [CONTRIBUTING.md](https://github.com/earendil-works/pi-mono/blob/main/CONTRIBUTING.md).
- New issues from new contributors are auto-closed by default. Maintainers review auto-closed issues daily. Issues that do not meet the quality bar in [CONTRIBUTING.md](https://github.com/badlogic/pi-mono/blob/main/CONTRIBUTING.md) will not be reopened or receive a reply.
+ New issues from new contributors are auto-closed by default. Maintainers review auto-closed issues daily. Issues that do not meet the quality bar in [CONTRIBUTING.md](https://github.com/earendil-works/pi-mono/blob/main/CONTRIBUTING.md) will not be reopened or receive a reply.
Keep this short. If it doesn't fit on one screen, it's too long. Write in your own voice.
diff --git a/.pi/extensions/prompt-url-widget.ts b/.pi/extensions/prompt-url-widget.ts
index 20406e937..835fce106 100644
--- a/.pi/extensions/prompt-url-widget.ts
+++ b/.pi/extensions/prompt-url-widget.ts
@@ -1,5 +1,5 @@
-import { DynamicBorder, type ExtensionAPI, type ExtensionContext } from "@mariozechner/pi-coding-agent";
-import { Container, Text } from "@mariozechner/pi-tui";
+import { DynamicBorder, type ExtensionAPI, type ExtensionContext } from "@earendil-works/pi-coding-agent";
+import { Container, Text } from "@earendil-works/pi-tui";
const PR_PROMPT_PATTERN = /^\s*You are given one or more GitHub PR URLs:\s*(\S+)/im;
const ISSUE_PROMPT_PATTERN = /^\s*Analyze GitHub issue\(s\):\s*(\S+)/im;
diff --git a/.pi/extensions/redraws.ts b/.pi/extensions/redraws.ts
index 2db0867f7..0f24a835d 100644
--- a/.pi/extensions/redraws.ts
+++ b/.pi/extensions/redraws.ts
@@ -4,8 +4,8 @@
* Exposes /tui to show TUI redraw stats.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { Text } from "@mariozechner/pi-tui";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { Text } from "@earendil-works/pi-tui";
export default function (pi: ExtensionAPI) {
pi.registerCommand("tui", {
diff --git a/.pi/extensions/tps.ts b/.pi/extensions/tps.ts
index 16bea8f6d..6ce88868e 100644
--- a/.pi/extensions/tps.ts
+++ b/.pi/extensions/tps.ts
@@ -1,5 +1,5 @@
-import type { AssistantMessage } from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { AssistantMessage } from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
function isAssistantMessage(message: unknown): message is AssistantMessage {
if (!message || typeof message !== "object") return false;
diff --git a/.pi/prompts/cl.md b/.pi/prompts/cl.md
index f71bfc745..592d2d67f 100644
--- a/.pi/prompts/cl.md
+++ b/.pi/prompts/cl.md
@@ -50,5 +50,5 @@ Sections (in order):
- `### Removed` - Removed features
Attribution:
-- Internal: `Fixed foo ([#123](https://github.com/badlogic/pi-mono/issues/123))`
-- External: `Added bar ([#456](https://github.com/badlogic/pi-mono/pull/456) by [@user](https://github.com/user))`
+- Internal: `Fixed foo ([#123](https://github.com/earendil-works/pi-mono/issues/123))`
+- External: `Added bar ([#456](https://github.com/earendil-works/pi-mono/pull/456) by [@user](https://github.com/user))`
diff --git a/.pi/prompts/pr.md b/.pi/prompts/pr.md
index b8ce2da6e..800d45245 100644
--- a/.pi/prompts/pr.md
+++ b/.pi/prompts/pr.md
@@ -11,7 +11,7 @@ For each PR URL, do the following in order:
4. Analyze the PR diff. Read all relevant code files in full with no truncation from the current main branch and compare against the diff. Do not fetch PR file blobs unless a file is missing on main or the diff context is insufficient. Include related code paths that are not in the diff but are required to validate behavior.
5. Check for a changelog entry in the relevant `packages/*/CHANGELOG.md` files. Report whether an entry exists. If missing, state that a changelog entry is required before merge and that you will add it if the user decides to merge. Follow the changelog format rules in AGENTS.md. Verify:
- Entry uses correct section (`### Breaking Changes`, `### Added`, `### Fixed`, etc.)
- - External contributions include PR link and author: `Fixed foo ([#123](https://github.com/badlogic/pi-mono/pull/123) by [@user](https://github.com/user))`
+ - External contributions include PR link and author: `Fixed foo ([#123](https://github.com/earendil-works/pi-mono/pull/123) by [@user](https://github.com/user))`
- Breaking changes are in `### Breaking Changes`, not just `### Fixed`
6. Check if packages/coding-agent/README.md, packages/coding-agent/docs/*.md, packages/coding-agent/examples/**/*.md require modification. This is usually the case when existing features have been changed, or new features have been added.
7. Provide a structured review with these sections:
diff --git a/AGENTS.md b/AGENTS.md
index f9ba16a5b..6c064ac7d 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -9,6 +9,7 @@
## Code Quality
+- Read files in full before making wide-ranging changes, before editing files you have not already fully inspected, and when the user asks you to investigate or audit something. Do not rely only on search snippets for broad changes.
- No `any` types unless absolutely necessary
- Check node_modules for external API type definitions instead of guessing
- **NEVER use inline imports** - no `await import("./foo.js")`, no `import("pkg").Type` in type positions, no dynamic imports for types. Always use standard top-level imports.
@@ -116,8 +117,8 @@ Use these sections under `## [Unreleased]`:
### Attribution
-- **Internal changes (from issues)**: `Fixed foo bar ([#123](https://github.com/badlogic/pi-mono/issues/123))`
-- **External contributions**: `Added feature X ([#456](https://github.com/badlogic/pi-mono/pull/456) by [@username](https://github.com/username))`
+- **Internal changes (from issues)**: `Fixed foo bar ([#123](https://github.com/earendil-works/pi-mono/issues/123))`
+- **External contributions**: `Added feature X ([#456](https://github.com/earendil-works/pi-mono/pull/456) by [@username](https://github.com/username))`
## Adding a New LLM Provider (packages/ai)
diff --git a/README.md b/README.md
index 327882d8e..90d9fc10b 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,10 @@
-
-
-
-
-
+
-
pi.dev domain graciously donated by
@@ -21,11 +16,18 @@
---
-# Pi Monorepo
+# Pi Agent Harness Mono Repo
-> **Looking for the pi coding agent?** See **[packages/coding-agent](packages/coding-agent)** for installation and usage.
+This is the home of the pi agent harness project including our self extensible coding agent.
-Tools for building AI agents.
+* **[@earendil-works/pi-coding-agent](packages/coding-agent)**: Interactive coding agent CLI
+* **[@earendil-works/pi-agent-core](packages/agent)**: Agent runtime with tool calling and state management
+* **[@earendil-works/pi-ai](packages/ai)**: Unified multi-provider LLM API (OpenAI, Anthropic, Google, …)
+
+To learn more about pi:
+
+* [Visit pi.dev](https://pi.dev), the project website with demos
+* [Read the documentation](https://pi.dev/docs/latest), but you can also ask the agent to explain itself
## Share your OSS coding agent sessions
@@ -43,19 +45,17 @@ I regularly publish my own `pi-mono` work sessions here:
- [badlogicgames/pi-mono on Hugging Face](https://huggingface.co/datasets/badlogicgames/pi-mono)
-## Packages
+## All Packages
| Package | Description |
|---------|-------------|
-| **[@mariozechner/pi-ai](packages/ai)** | Unified multi-provider LLM API (OpenAI, Anthropic, Google, etc.) |
-| **[@mariozechner/pi-agent-core](packages/agent)** | Agent runtime with tool calling and state management |
-| **[@mariozechner/pi-coding-agent](packages/coding-agent)** | Interactive coding agent CLI |
-| **[@mariozechner/pi-tui](packages/tui)** | Terminal UI library with differential rendering |
-| **[@mariozechner/pi-web-ui](packages/web-ui)** | Web components for AI chat interfaces |
+| **[@earendil-works/pi-ai](packages/ai)** | Unified multi-provider LLM API (OpenAI, Anthropic, Google, etc.) |
+| **[@earendil-works/pi-agent-core](packages/agent)** | Agent runtime with tool calling and state management |
+| **[@earendil-works/pi-coding-agent](packages/coding-agent)** | Interactive coding agent CLI |
+| **[@earendil-works/pi-tui](packages/tui)** | Terminal UI library with differential rendering |
+| **[@earendil-works/pi-web-ui](packages/web-ui)** | Web components for AI chat interfaces |
-## Chat bot workflows
-
-For Slack/chat automation, see [earendil-works/pi-chat](https://github.com/earendil-works/pi-chat).
+For Slack/chat automation and workflows see [earendil-works/pi-chat](https://github.com/earendil-works/pi-chat).
## Contributing
diff --git a/package-lock.json b/package-lock.json
index 8f0c371f6..824b8d98d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
"packages/coding-agent/examples/extensions/sandbox"
],
"dependencies": {
- "@mariozechner/pi-coding-agent": "^0.30.2",
+ "@earendil-works/pi-coding-agent": "^0.30.2",
"get-east-asian-width": "^1.4.0"
},
"devDependencies": {
@@ -37,8 +37,7 @@
},
"node_modules/@anthropic-ai/sandbox-runtime": {
"version": "0.0.26",
- "resolved": "https://registry.npmjs.org/@anthropic-ai/sandbox-runtime/-/sandbox-runtime-0.0.26.tgz",
- "integrity": "sha512-DYV5LSsVMnzq0lbfaYMSpxZPUMAx4+hy343dRss+pVCLIfF62qOhxpYfZ5TmOk1GTDQm5f9wPprMNSStmnsV4w==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@pondwader/socks5-server": "^1.0.10",
@@ -57,8 +56,7 @@
},
"node_modules/@anthropic-ai/sandbox-runtime/node_modules/zod": {
"version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
@@ -66,8 +64,6 @@
},
"node_modules/@anthropic-ai/sdk": {
"version": "0.91.1",
- "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz",
- "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==",
"license": "MIT",
"dependencies": {
"json-schema-to-ts": "^3.1.1"
@@ -86,8 +82,6 @@
},
"node_modules/@aws-crypto/crc32": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
- "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/util": "^5.2.0",
@@ -100,8 +94,6 @@
},
"node_modules/@aws-crypto/sha256-browser": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",
- "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
@@ -115,8 +107,6 @@
},
"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
- "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -127,8 +117,6 @@
},
"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
- "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/is-array-buffer": "^2.2.0",
@@ -140,8 +128,6 @@
},
"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
- "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/util-buffer-from": "^2.2.0",
@@ -153,8 +139,6 @@
},
"node_modules/@aws-crypto/sha256-js": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
- "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/util": "^5.2.0",
@@ -167,8 +151,6 @@
},
"node_modules/@aws-crypto/supports-web-crypto": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz",
- "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -176,8 +158,6 @@
},
"node_modules/@aws-crypto/util": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
- "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.222.0",
@@ -187,8 +167,6 @@
},
"node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
- "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -199,8 +177,6 @@
},
"node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
- "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/is-array-buffer": "^2.2.0",
@@ -212,8 +188,6 @@
},
"node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
- "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/util-buffer-from": "^2.2.0",
@@ -224,9 +198,7 @@
}
},
"node_modules/@aws-sdk/client-bedrock-runtime": {
- "version": "3.1041.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1041.0.tgz",
- "integrity": "sha512-1QehYO3jhdvNQ5mOKtwIiNV04y4aywaNZw9HzCp7SSYCX4yy+AGXc2hhYjCiMDUvQPIELuvbR8MXw81NGAj8ZQ==",
+ "version": "3.1044.0",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
@@ -241,7 +213,7 @@
"@aws-sdk/middleware-user-agent": "^3.972.38",
"@aws-sdk/middleware-websocket": "^3.972.16",
"@aws-sdk/region-config-resolver": "^3.972.13",
- "@aws-sdk/token-providers": "3.1041.0",
+ "@aws-sdk/token-providers": "3.1044.0",
"@aws-sdk/types": "^3.973.8",
"@aws-sdk/util-endpoints": "^3.996.8",
"@aws-sdk/util-user-agent-browser": "^3.972.10",
@@ -283,8 +255,6 @@
},
"node_modules/@aws-sdk/core": {
"version": "3.974.8",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.8.tgz",
- "integrity": "sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -308,8 +278,6 @@
},
"node_modules/@aws-sdk/credential-provider-env": {
"version": "3.972.34",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.34.tgz",
- "integrity": "sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -324,8 +292,6 @@
},
"node_modules/@aws-sdk/credential-provider-http": {
"version": "3.972.36",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.36.tgz",
- "integrity": "sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -345,8 +311,6 @@
},
"node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.972.38",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.38.tgz",
- "integrity": "sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -370,8 +334,6 @@
},
"node_modules/@aws-sdk/credential-provider-login": {
"version": "3.972.38",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.38.tgz",
- "integrity": "sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -389,8 +351,6 @@
},
"node_modules/@aws-sdk/credential-provider-node": {
"version": "3.972.39",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.39.tgz",
- "integrity": "sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/credential-provider-env": "^3.972.34",
@@ -412,8 +372,6 @@
},
"node_modules/@aws-sdk/credential-provider-process": {
"version": "3.972.34",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.34.tgz",
- "integrity": "sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -429,8 +387,6 @@
},
"node_modules/@aws-sdk/credential-provider-sso": {
"version": "3.972.38",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.38.tgz",
- "integrity": "sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -446,10 +402,24 @@
"node": ">=20.0.0"
}
},
+ "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": {
+ "version": "3.1041.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.974.8",
+ "@aws-sdk/nested-clients": "^3.997.6",
+ "@aws-sdk/types": "^3.973.8",
+ "@smithy/property-provider": "^4.2.14",
+ "@smithy/shared-ini-file-loader": "^4.4.9",
+ "@smithy/types": "^4.14.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
"node_modules/@aws-sdk/credential-provider-web-identity": {
"version": "3.972.38",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.38.tgz",
- "integrity": "sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -466,8 +436,6 @@
},
"node_modules/@aws-sdk/eventstream-handler-node": {
"version": "3.972.14",
- "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.14.tgz",
- "integrity": "sha512-m4X56gxG76/CKfxNVbOFuYwnAZcHgS6HOH8lgp15HoGHIAVTcZfZrXvcYzJFOMLEJgVn+JHBu6EiNV+xSNXXFg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -481,8 +449,6 @@
},
"node_modules/@aws-sdk/middleware-eventstream": {
"version": "3.972.10",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.10.tgz",
- "integrity": "sha512-QUqLs7Af1II9X4fCRAu+EGHG3KHyOp4RkuLhRKoA3NuFlh6TL8i+zXBl8w2LUxqm44B/Kom45hgSlwA1SpTsXQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -496,8 +462,6 @@
},
"node_modules/@aws-sdk/middleware-host-header": {
"version": "3.972.10",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz",
- "integrity": "sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -511,8 +475,6 @@
},
"node_modules/@aws-sdk/middleware-logger": {
"version": "3.972.10",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.10.tgz",
- "integrity": "sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -525,8 +487,6 @@
},
"node_modules/@aws-sdk/middleware-recursion-detection": {
"version": "3.972.11",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.11.tgz",
- "integrity": "sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -541,8 +501,6 @@
},
"node_modules/@aws-sdk/middleware-sdk-s3": {
"version": "3.972.37",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.37.tgz",
- "integrity": "sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -566,8 +524,6 @@
},
"node_modules/@aws-sdk/middleware-user-agent": {
"version": "3.972.38",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.38.tgz",
- "integrity": "sha512-iz+B29TXcAZsJpwB+AwG/TTGA5l/VnmMZ2UxtiySOZjI6gCdmviXPwdgzcmuazMy16rXoPY4mYCGe7zdNKfx5A==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -585,8 +541,6 @@
},
"node_modules/@aws-sdk/middleware-websocket": {
"version": "3.972.16",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.16.tgz",
- "integrity": "sha512-86+S9oCyRVGzoMRpQhxkArp7kD2K75GPmaNevd9B6EyNhWoNvnCZZ3WbgN4j7ZT+jvtvBCGZvI2XHsWZJ+BRIg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -608,8 +562,6 @@
},
"node_modules/@aws-sdk/nested-clients": {
"version": "3.997.6",
- "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.6.tgz",
- "integrity": "sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
@@ -658,8 +610,6 @@
},
"node_modules/@aws-sdk/region-config-resolver": {
"version": "3.972.13",
- "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.13.tgz",
- "integrity": "sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -674,8 +624,6 @@
},
"node_modules/@aws-sdk/signature-v4-multi-region": {
"version": "3.996.25",
- "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.25.tgz",
- "integrity": "sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/middleware-sdk-s3": "^3.972.37",
@@ -690,9 +638,7 @@
}
},
"node_modules/@aws-sdk/token-providers": {
- "version": "3.1041.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1041.0.tgz",
- "integrity": "sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw==",
+ "version": "3.1044.0",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "^3.974.8",
@@ -709,8 +655,6 @@
},
"node_modules/@aws-sdk/types": {
"version": "3.973.8",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz",
- "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -722,8 +666,6 @@
},
"node_modules/@aws-sdk/util-arn-parser": {
"version": "3.972.3",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz",
- "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -734,8 +676,6 @@
},
"node_modules/@aws-sdk/util-endpoints": {
"version": "3.996.8",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.8.tgz",
- "integrity": "sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -750,8 +690,6 @@
},
"node_modules/@aws-sdk/util-format-url": {
"version": "3.972.10",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.10.tgz",
- "integrity": "sha512-DEKiHNJVtNxdyTeQspzY+15Po/kHm6sF0Cs4HV9Q2+lplB63+DrvdeiSoOSdWEWAoO2RcY1veoXVDz2tWxWCgQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -765,8 +703,6 @@
},
"node_modules/@aws-sdk/util-locate-window": {
"version": "3.965.5",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz",
- "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -777,8 +713,6 @@
},
"node_modules/@aws-sdk/util-user-agent-browser": {
"version": "3.972.10",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.10.tgz",
- "integrity": "sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.8",
@@ -789,8 +723,6 @@
},
"node_modules/@aws-sdk/util-user-agent-node": {
"version": "3.973.24",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.24.tgz",
- "integrity": "sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/middleware-user-agent": "^3.972.38",
@@ -814,8 +746,6 @@
},
"node_modules/@aws-sdk/xml-builder": {
"version": "3.972.22",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz",
- "integrity": "sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==",
"license": "Apache-2.0",
"dependencies": {
"@nodable/entities": "2.1.0",
@@ -829,8 +759,6 @@
},
"node_modules/@aws/lambda-invoke-store": {
"version": "0.2.4",
- "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz",
- "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=18.0.0"
@@ -838,8 +766,6 @@
},
"node_modules/@babel/runtime": {
"version": "7.29.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
- "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -847,8 +773,6 @@
},
"node_modules/@biomejs/biome": {
"version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.5.tgz",
- "integrity": "sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg==",
"dev": true,
"license": "MIT OR Apache-2.0",
"bin": {
@@ -874,8 +798,6 @@
},
"node_modules/@biomejs/cli-darwin-arm64": {
"version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.5.tgz",
- "integrity": "sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw==",
"cpu": [
"arm64"
],
@@ -914,9 +836,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT OR Apache-2.0",
"optional": true,
"os": [
@@ -934,9 +853,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT OR Apache-2.0",
"optional": true,
"os": [
@@ -954,9 +870,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT OR Apache-2.0",
"optional": true,
"os": [
@@ -974,9 +887,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT OR Apache-2.0",
"optional": true,
"os": [
@@ -1022,14 +932,32 @@
},
"node_modules/@borewit/text-codec": {
"version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz",
- "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Borewit"
}
},
+ "node_modules/@earendil-works/pi-agent-core": {
+ "resolved": "packages/agent",
+ "link": true
+ },
+ "node_modules/@earendil-works/pi-ai": {
+ "resolved": "packages/ai",
+ "link": true
+ },
+ "node_modules/@earendil-works/pi-coding-agent": {
+ "resolved": "packages/coding-agent",
+ "link": true
+ },
+ "node_modules/@earendil-works/pi-tui": {
+ "resolved": "packages/tui",
+ "link": true
+ },
+ "node_modules/@earendil-works/pi-web-ui": {
+ "resolved": "packages/web-ui",
+ "link": true
+ },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.27.7",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
@@ -1096,8 +1024,6 @@
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
- "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
"cpu": [
"arm64"
],
@@ -1447,9 +1373,7 @@
}
},
"node_modules/@google/genai": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.51.0.tgz",
- "integrity": "sha512-vTZZF3CSimN7cn2zsLpW2p5WF0eZa5Gz69ITMPCNHpPrDlAstOfGifSfi0p/s9Z9400f7xJRkgvkQNrcM7pJ6w==",
+ "version": "1.52.0",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1472,8 +1396,6 @@
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -1482,8 +1404,6 @@
},
"node_modules/@jridgewell/remapping": {
"version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -1492,8 +1412,6 @@
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -1501,14 +1419,10 @@
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -1517,14 +1431,10 @@
},
"node_modules/@lit-labs/ssr-dom-shim": {
"version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz",
- "integrity": "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==",
"license": "BSD-3-Clause"
},
"node_modules/@lit/reactive-element": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz",
- "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==",
"license": "BSD-3-Clause",
"dependencies": {
"@lit-labs/ssr-dom-shim": "^1.5.0"
@@ -1532,8 +1442,6 @@
},
"node_modules/@lmstudio/lms-isomorphic": {
"version": "0.4.6",
- "resolved": "https://registry.npmjs.org/@lmstudio/lms-isomorphic/-/lms-isomorphic-0.4.6.tgz",
- "integrity": "sha512-v0LIjXKnDe3Ff3XZO5eQjlVxTjleUHXaom14MV7QU9bvwaoo3l5p71+xJ3mmSaqZq370CQ6pTKCn1Bb7Jf+VwQ==",
"license": "Apache-2.0",
"dependencies": {
"ws": "^8.16.0"
@@ -1541,8 +1449,6 @@
},
"node_modules/@lmstudio/sdk": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@lmstudio/sdk/-/sdk-1.5.0.tgz",
- "integrity": "sha512-fdY12x4hb14PEjYijh7YeCqT1ZDY5Ok6VR4l4+E/dI+F6NW8oB+P83Sxed5vqE4XgTzbgyPuSR2ZbMNxxF+6jA==",
"license": "Apache-2.0",
"dependencies": {
"@lmstudio/lms-isomorphic": "^0.4.6",
@@ -1554,8 +1460,6 @@
},
"node_modules/@lmstudio/sdk/node_modules/chalk": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
@@ -1570,8 +1474,6 @@
},
"node_modules/@lmstudio/sdk/node_modules/supports-color": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
@@ -1582,8 +1484,6 @@
},
"node_modules/@lmstudio/sdk/node_modules/zod": {
"version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
@@ -1591,8 +1491,6 @@
},
"node_modules/@mariozechner/clipboard": {
"version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@mariozechner/clipboard/-/clipboard-0.3.5.tgz",
- "integrity": "sha512-D3F+UrU9CR7roJt0zDLp6Oc+4/KlLDIrN4frH+6V90SJNW2KKUec1oCQIPaaDjCqeOsQyX9dyqYbImIQIM45PA==",
"license": "MIT",
"optional": true,
"engines": {
@@ -1613,8 +1511,6 @@
},
"node_modules/@mariozechner/clipboard-darwin-arm64": {
"version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-arm64/-/clipboard-darwin-arm64-0.3.2.tgz",
- "integrity": "sha512-uBf6K7Je1ihsgvmWxA8UCGCeI+nbRVRXoarZdLjl6slz94Zs1tNKFZqx7aCI5O1i3e0B6ja82zZ06BWrl0MCVw==",
"cpu": [
"arm64"
],
@@ -1629,8 +1525,6 @@
},
"node_modules/@mariozechner/clipboard-darwin-universal": {
"version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-universal/-/clipboard-darwin-universal-0.3.2.tgz",
- "integrity": "sha512-mxSheKTW2U9LsBdXy0SdmdCAE5HqNS9QUmpNHLnfJ+SsbFKALjEZc5oRrVMXxGQSirDvYf5bjmRyT0QYYonnlg==",
"license": "MIT",
"optional": true,
"os": [
@@ -1663,9 +1557,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1682,9 +1573,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1701,9 +1589,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1720,9 +1605,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1739,9 +1621,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1785,8 +1664,6 @@
},
"node_modules/@mariozechner/mini-lit": {
"version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@mariozechner/mini-lit/-/mini-lit-0.2.1.tgz",
- "integrity": "sha512-u300euLgCsDDlb8o2Wbz+55eSJga5X2vB58s9XBuFIr2Bi3iI+GMR7t/NYo/O6Vr6obXShXgYjR3SRUJVgo+kQ==",
"dependencies": {
"@preact/signals-core": "^1.12.1",
"class-variance-authority": "^0.7.1",
@@ -1806,8 +1683,6 @@
},
"node_modules/@mariozechner/mini-lit/node_modules/highlight.js": {
"version": "11.11.1",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
- "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=12.0.0"
@@ -1815,8 +1690,6 @@
},
"node_modules/@mariozechner/mini-lit/node_modules/marked": {
"version": "16.4.2",
- "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",
- "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
@@ -1825,30 +1698,8 @@
"node": ">= 20"
}
},
- "node_modules/@mariozechner/pi-agent-core": {
- "resolved": "packages/agent",
- "link": true
- },
- "node_modules/@mariozechner/pi-ai": {
- "resolved": "packages/ai",
- "link": true
- },
- "node_modules/@mariozechner/pi-coding-agent": {
- "resolved": "packages/coding-agent",
- "link": true
- },
- "node_modules/@mariozechner/pi-tui": {
- "resolved": "packages/tui",
- "link": true
- },
- "node_modules/@mariozechner/pi-web-ui": {
- "resolved": "packages/web-ui",
- "link": true
- },
"node_modules/@mistralai/mistralai": {
"version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz",
- "integrity": "sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==",
"license": "Apache-2.0",
"dependencies": {
"ws": "^8.18.0",
@@ -1858,8 +1709,6 @@
},
"node_modules/@napi-rs/canvas": {
"version": "0.1.100",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.100.tgz",
- "integrity": "sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==",
"license": "MIT",
"optional": true,
"workspaces": [
@@ -1908,8 +1757,6 @@
},
"node_modules/@napi-rs/canvas-darwin-arm64": {
"version": "0.1.100",
- "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.100.tgz",
- "integrity": "sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==",
"cpu": [
"arm64"
],
@@ -1973,9 +1820,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1996,9 +1840,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2019,9 +1860,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2042,9 +1880,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2065,9 +1900,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2123,8 +1955,6 @@
},
"node_modules/@nodable/entities": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz",
- "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==",
"funding": [
{
"type": "github",
@@ -2135,8 +1965,6 @@
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2149,8 +1977,6 @@
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2159,8 +1985,6 @@
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2173,8 +1997,6 @@
},
"node_modules/@parcel/watcher": {
"version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz",
- "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -2230,8 +2052,6 @@
},
"node_modules/@parcel/watcher-darwin-arm64": {
"version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz",
- "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==",
"cpu": [
"arm64"
],
@@ -2299,9 +2119,6 @@
"arm"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2323,9 +2140,6 @@
"arm"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2347,9 +2161,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2371,9 +2182,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2395,9 +2203,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2419,9 +2224,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2500,8 +2302,6 @@
},
"node_modules/@parcel/watcher/node_modules/picomatch": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2513,14 +2313,11 @@
},
"node_modules/@pondwader/socks5-server": {
"version": "1.0.10",
- "resolved": "https://registry.npmjs.org/@pondwader/socks5-server/-/socks5-server-1.0.10.tgz",
- "integrity": "sha512-bQY06wzzR8D2+vVCUoBsr5QS2U6UgPUQRmErNwtsuI6vLcyRKkafjkr3KxbtGFf9aBBIV2mcvlsKD1UYaIV+sg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@preact/signals-core": {
"version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.14.1.tgz",
- "integrity": "sha512-vxPpfXqrwUe9lpjqfYNjAF/0RF/eFGeLgdJzdmIIZjpOnTmGmAB4BjWone562mJGMRP4frU6iZ6ei3PDsu52Ng==",
"license": "MIT",
"funding": {
"type": "opencollective",
@@ -2529,32 +2326,22 @@
},
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/base64": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/codegen": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
- "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
- "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/fetch": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
- "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.1",
@@ -2563,32 +2350,22 @@
},
"node_modules/@protobufjs/float": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/inquire": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
- "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/path": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/pool": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/utf8": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
- "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
@@ -2619,8 +2396,6 @@
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.60.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz",
- "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==",
"cpu": [
"arm64"
],
@@ -2676,9 +2451,6 @@
"cpu": [
"arm"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2692,9 +2464,6 @@
"cpu": [
"arm"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2708,9 +2477,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2724,9 +2490,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2740,9 +2503,6 @@
"cpu": [
"loong64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2756,9 +2516,6 @@
"cpu": [
"loong64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2772,9 +2529,6 @@
"cpu": [
"ppc64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2788,9 +2542,6 @@
"cpu": [
"ppc64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2804,9 +2555,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2820,9 +2568,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2836,9 +2581,6 @@
"cpu": [
"s390x"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2852,9 +2594,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2868,9 +2607,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2957,14 +2693,10 @@
},
"node_modules/@silvia-odwyer/photon-node": {
"version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@silvia-odwyer/photon-node/-/photon-node-0.3.4.tgz",
- "integrity": "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==",
"license": "Apache-2.0"
},
"node_modules/@smithy/config-resolver": {
"version": "4.4.17",
- "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.17.tgz",
- "integrity": "sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/node-config-provider": "^4.3.14",
@@ -2980,8 +2712,6 @@
},
"node_modules/@smithy/core": {
"version": "3.23.17",
- "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.17.tgz",
- "integrity": "sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/protocol-http": "^5.3.14",
@@ -3001,8 +2731,6 @@
},
"node_modules/@smithy/credential-provider-imds": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.14.tgz",
- "integrity": "sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/node-config-provider": "^4.3.14",
@@ -3017,8 +2745,6 @@
},
"node_modules/@smithy/eventstream-codec": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.14.tgz",
- "integrity": "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/crc32": "5.2.0",
@@ -3032,8 +2758,6 @@
},
"node_modules/@smithy/eventstream-serde-browser": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.14.tgz",
- "integrity": "sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/eventstream-serde-universal": "^4.2.14",
@@ -3046,8 +2770,6 @@
},
"node_modules/@smithy/eventstream-serde-config-resolver": {
"version": "4.3.14",
- "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.14.tgz",
- "integrity": "sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3059,8 +2781,6 @@
},
"node_modules/@smithy/eventstream-serde-node": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.14.tgz",
- "integrity": "sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/eventstream-serde-universal": "^4.2.14",
@@ -3073,8 +2793,6 @@
},
"node_modules/@smithy/eventstream-serde-universal": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.14.tgz",
- "integrity": "sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/eventstream-codec": "^4.2.14",
@@ -3087,8 +2805,6 @@
},
"node_modules/@smithy/fetch-http-handler": {
"version": "5.3.17",
- "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.17.tgz",
- "integrity": "sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/protocol-http": "^5.3.14",
@@ -3103,8 +2819,6 @@
},
"node_modules/@smithy/hash-node": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.14.tgz",
- "integrity": "sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3118,8 +2832,6 @@
},
"node_modules/@smithy/invalid-dependency": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.14.tgz",
- "integrity": "sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3131,8 +2843,6 @@
},
"node_modules/@smithy/is-array-buffer": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz",
- "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3143,8 +2853,6 @@
},
"node_modules/@smithy/middleware-content-length": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.14.tgz",
- "integrity": "sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/protocol-http": "^5.3.14",
@@ -3157,8 +2865,6 @@
},
"node_modules/@smithy/middleware-endpoint": {
"version": "4.4.32",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.32.tgz",
- "integrity": "sha512-ZZkgyjnJppiZbIm6Qbx92pbXYi1uzenIvGhBSCDlc7NwuAkiqSgS75j1czAD25ZLs2FjMjYy1q7gyRVWG6JA0Q==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/core": "^3.23.17",
@@ -3176,8 +2882,6 @@
},
"node_modules/@smithy/middleware-retry": {
"version": "4.5.7",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.7.tgz",
- "integrity": "sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/core": "^3.23.17",
@@ -3197,8 +2901,6 @@
},
"node_modules/@smithy/middleware-serde": {
"version": "4.2.20",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.20.tgz",
- "integrity": "sha512-Lx9JMO9vArPtiChE3wbEZ5akMIDQpWQtlu90lhACQmNOXcGXRbaDywMHDzuDZ2OkZzP+9wQfZi3YJT9F67zTQQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/core": "^3.23.17",
@@ -3212,8 +2914,6 @@
},
"node_modules/@smithy/middleware-stack": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.14.tgz",
- "integrity": "sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3225,8 +2925,6 @@
},
"node_modules/@smithy/node-config-provider": {
"version": "4.3.14",
- "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.14.tgz",
- "integrity": "sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/property-provider": "^4.2.14",
@@ -3240,8 +2938,6 @@
},
"node_modules/@smithy/node-http-handler": {
"version": "4.6.1",
- "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.6.1.tgz",
- "integrity": "sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/protocol-http": "^5.3.14",
@@ -3255,8 +2951,6 @@
},
"node_modules/@smithy/property-provider": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.14.tgz",
- "integrity": "sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3268,8 +2962,6 @@
},
"node_modules/@smithy/protocol-http": {
"version": "5.3.14",
- "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.14.tgz",
- "integrity": "sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3281,8 +2973,6 @@
},
"node_modules/@smithy/querystring-builder": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.14.tgz",
- "integrity": "sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3295,8 +2985,6 @@
},
"node_modules/@smithy/querystring-parser": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.14.tgz",
- "integrity": "sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3308,8 +2996,6 @@
},
"node_modules/@smithy/service-error-classification": {
"version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.3.1.tgz",
- "integrity": "sha512-aUQuDGh760ts/8MU+APjIZhlLPKhIIfqyzZaJikLEIMrdxFvxuLYD0WxWzaYWpmLbQlXDe9p7EWM3HsBe0K6Gw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1"
@@ -3320,8 +3006,6 @@
},
"node_modules/@smithy/shared-ini-file-loader": {
"version": "4.4.9",
- "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.9.tgz",
- "integrity": "sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3333,8 +3017,6 @@
},
"node_modules/@smithy/signature-v4": {
"version": "5.3.14",
- "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.14.tgz",
- "integrity": "sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/is-array-buffer": "^4.2.2",
@@ -3352,8 +3034,6 @@
},
"node_modules/@smithy/smithy-client": {
"version": "4.12.13",
- "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.13.tgz",
- "integrity": "sha512-y/Pcj1V9+qG98gyu1gvftHB7rDpdh+7kIBIggs55yGm3JdtBV8GT8IFF3a1qxZ79QnaJHX9GXzvBG6tAd+czJA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/core": "^3.23.17",
@@ -3370,8 +3050,6 @@
},
"node_modules/@smithy/types": {
"version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz",
- "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3382,8 +3060,6 @@
},
"node_modules/@smithy/url-parser": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.14.tgz",
- "integrity": "sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/querystring-parser": "^4.2.14",
@@ -3396,8 +3072,6 @@
},
"node_modules/@smithy/util-base64": {
"version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz",
- "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/util-buffer-from": "^4.2.2",
@@ -3410,8 +3084,6 @@
},
"node_modules/@smithy/util-body-length-browser": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz",
- "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3422,8 +3094,6 @@
},
"node_modules/@smithy/util-body-length-node": {
"version": "4.2.3",
- "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz",
- "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3434,8 +3104,6 @@
},
"node_modules/@smithy/util-buffer-from": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz",
- "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/is-array-buffer": "^4.2.2",
@@ -3447,8 +3115,6 @@
},
"node_modules/@smithy/util-config-provider": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz",
- "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3459,8 +3125,6 @@
},
"node_modules/@smithy/util-defaults-mode-browser": {
"version": "4.3.49",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.49.tgz",
- "integrity": "sha512-a5bNrdiONYB/qE2BuKegvUMd/+ZDwdg4vsNuuSzYE8qs2EYAdK9CynL+Rzn29PbPiUqoz/cbpRbcLzD5lEevHw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/property-provider": "^4.2.14",
@@ -3474,8 +3138,6 @@
},
"node_modules/@smithy/util-defaults-mode-node": {
"version": "4.2.54",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.54.tgz",
- "integrity": "sha512-g1cvrJvOnzeJgEdf7AE4luI7gp6L8weE0y9a9wQUSGtjb8QRHDbCJYuE4Sy0SD9N8RrnNPFsPltAz/OSoBR9Zw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/config-resolver": "^4.4.17",
@@ -3492,8 +3154,6 @@
},
"node_modules/@smithy/util-endpoints": {
"version": "3.4.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.4.2.tgz",
- "integrity": "sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/node-config-provider": "^4.3.14",
@@ -3506,8 +3166,6 @@
},
"node_modules/@smithy/util-hex-encoding": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz",
- "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3518,8 +3176,6 @@
},
"node_modules/@smithy/util-middleware": {
"version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.14.tgz",
- "integrity": "sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.14.1",
@@ -3531,8 +3187,6 @@
},
"node_modules/@smithy/util-retry": {
"version": "4.3.8",
- "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.8.tgz",
- "integrity": "sha512-LUIxbTBi+OpvXpg91poGA6BdyoleMDLnfXjVDqyi2RvZmTveY5loE/FgYUBCR5LU2BThW2SoZRh8dTIIy38IPw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/service-error-classification": "^4.3.1",
@@ -3545,8 +3199,6 @@
},
"node_modules/@smithy/util-stream": {
"version": "4.5.25",
- "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.25.tgz",
- "integrity": "sha512-/PFpG4k8Ze8Ei+mMKj3oiPICYekthuzePZMgZbCqMiXIHHf4n2aZ4Ps0aSRShycFTGuj/J6XldmC0x0DwednIA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/fetch-http-handler": "^5.3.17",
@@ -3564,8 +3216,6 @@
},
"node_modules/@smithy/util-uri-escape": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz",
- "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3576,8 +3226,6 @@
},
"node_modules/@smithy/util-utf8": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz",
- "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/util-buffer-from": "^4.2.2",
@@ -3589,8 +3237,6 @@
},
"node_modules/@smithy/uuid": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz",
- "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -3601,8 +3247,6 @@
},
"node_modules/@tailwindcss/cli": {
"version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.2.4.tgz",
- "integrity": "sha512-e87GGhuXxnyQPyA0TS8an/3wNpj+OUmx8u0F4BicYr48TF72032AIu5917rRYaWm7HorXi3GSZ/uG+ohqP6AKA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3620,8 +3264,6 @@
},
"node_modules/@tailwindcss/node": {
"version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
- "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.5",
@@ -3635,8 +3277,6 @@
},
"node_modules/@tailwindcss/oxide": {
"version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
- "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
"license": "MIT",
"engines": {
"node": ">= 20"
@@ -3674,8 +3314,6 @@
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
"version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
- "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
"cpu": [
"arm64"
],
@@ -3743,9 +3381,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -3762,9 +3397,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -3781,9 +3413,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -3800,9 +3429,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -3841,6 +3467,64 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
+ "version": "1.8.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1",
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
+ "version": "2.8.1",
+ "inBundle": true,
+ "license": "0BSD",
+ "optional": true
+ },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
@@ -3875,8 +3559,6 @@
},
"node_modules/@tailwindcss/vite": {
"version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz",
- "integrity": "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==",
"license": "MIT",
"dependencies": {
"@tailwindcss/node": "4.2.4",
@@ -3889,8 +3571,6 @@
},
"node_modules/@tokenizer/inflate": {
"version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
- "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
"license": "MIT",
"dependencies": {
"debug": "^4.4.3",
@@ -3906,20 +3586,14 @@
},
"node_modules/@tokenizer/token": {
"version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
- "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
"license": "MIT"
},
"node_modules/@tootallnate/quickjs-emscripten": {
"version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
- "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
"license": "MIT"
},
"node_modules/@types/chai": {
"version": "5.2.3",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
- "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3929,41 +3603,32 @@
},
"node_modules/@types/deep-eql": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
- "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/diff": {
"version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@types/diff/-/diff-7.0.2.tgz",
- "integrity": "sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/estree": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
- "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "version": "1.0.9",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/hosted-git-info": {
"version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
- "integrity": "sha512-Dmngh7U003cOHPhKGyA7LWqrnvcTyILNgNPmNCxlx7j8MIi54iBliiT8XqVLIQ3GchoOjVAyBzNJVyuaJjqokg==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/lodash": {
"version": "4.17.24",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz",
- "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/lodash-es": {
"version": "4.17.12",
- "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
- "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/lodash": "*"
@@ -3971,21 +3636,15 @@
},
"node_modules/@types/mime-types": {
"version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz",
- "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==",
"license": "MIT"
},
"node_modules/@types/ms": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
- "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "22.19.17",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz",
- "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
@@ -3993,8 +3652,6 @@
},
"node_modules/@types/proper-lockfile": {
"version": "4.1.4",
- "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.4.tgz",
- "integrity": "sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4003,21 +3660,15 @@
},
"node_modules/@types/retry": {
"version": "0.12.5",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz",
- "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/trusted-types": {
"version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
- "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"license": "MIT"
},
"node_modules/@types/yauzl": {
"version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
"license": "MIT",
"optional": true,
"dependencies": {
@@ -4026,8 +3677,6 @@
},
"node_modules/@typescript/native-preview": {
"version": "7.0.0-dev.20260120.1",
- "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260120.1.tgz",
- "integrity": "sha512-nnEf37C9ue7OBRnF2zmV/OCBmV5Y7T/K4mCHa+nxgiXcF/1w8sA0cgdFl+gHQ0mysqUJ+Bu5btAMeWgpLyjrgg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -4045,8 +3694,6 @@
},
"node_modules/@typescript/native-preview-darwin-arm64": {
"version": "7.0.0-dev.20260120.1",
- "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260120.1.tgz",
- "integrity": "sha512-r3pWFuR2H7mn6ScwpH5jJljKQqKto0npVuJSk6pRwFwexpTyxOGmJTZJ1V0AWiisaNxU2+CNAqWFJSJYIE/QTg==",
"cpu": [
"arm64"
],
@@ -4143,8 +3790,6 @@
},
"node_modules/@vitest/expect": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
- "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4160,8 +3805,6 @@
},
"node_modules/@vitest/mocker": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
- "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4187,8 +3830,6 @@
},
"node_modules/@vitest/pretty-format": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
- "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4200,8 +3841,6 @@
},
"node_modules/@vitest/runner": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz",
- "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4215,8 +3854,6 @@
},
"node_modules/@vitest/snapshot": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz",
- "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4230,8 +3867,6 @@
},
"node_modules/@vitest/spy": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
- "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4243,8 +3878,6 @@
},
"node_modules/@vitest/utils": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
- "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4258,8 +3891,6 @@
},
"node_modules/@webreflection/alien-signals": {
"version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@webreflection/alien-signals/-/alien-signals-0.3.2.tgz",
- "integrity": "sha512-DmNjD8Kq5iM+Toirp3llS/izAiI3Dwav5nHRvKdR/YJBTgun3y4xK76rs9CFYD2bZwZJN/rP+HjEqKTteGK+Yw==",
"license": "MIT",
"dependencies": {
"alien-signals": "^2.0.6"
@@ -4267,22 +3898,16 @@
},
"node_modules/@xterm/headless": {
"version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@xterm/headless/-/headless-5.5.0.tgz",
- "integrity": "sha512-5xXB7kdQlFBP82ViMJTwwEc3gKCLGKR/eoxQm4zge7GPBl86tCdI0IdPJjoKd8mUSFXz5V7i/25sfsEkP4j46g==",
"dev": true,
"license": "MIT"
},
"node_modules/@xterm/xterm": {
"version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz",
- "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==",
"dev": true,
"license": "MIT"
},
"node_modules/agent-base": {
"version": "7.1.4",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
- "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
"license": "MIT",
"engines": {
"node": ">= 14"
@@ -4290,14 +3915,10 @@
},
"node_modules/alien-signals": {
"version": "2.0.8",
- "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-2.0.8.tgz",
- "integrity": "sha512-844G1VLkk0Pe2SJjY0J8vp8ADI73IM4KliNu2OGlYzWpO28NexEUvjHTcFjFX3VXoiUtwTbHxLNI9ImkcoBqzA==",
"license": "MIT"
},
"node_modules/ansi-regex": {
"version": "6.2.2",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
- "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -4308,8 +3929,6 @@
},
"node_modules/ansi-styles": {
"version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -4323,14 +3942,10 @@
},
"node_modules/any-promise": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
"license": "MIT"
},
"node_modules/assertion-error": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
- "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4339,8 +3954,6 @@
},
"node_modules/ast-types": {
"version": "0.13.4",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
- "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
"license": "MIT",
"dependencies": {
"tslib": "^2.0.1"
@@ -4351,8 +3964,6 @@
},
"node_modules/balanced-match": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
"license": "MIT",
"engines": {
"node": "18 || 20 || >=22"
@@ -4360,8 +3971,6 @@
},
"node_modules/base64-js": {
"version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"funding": [
{
"type": "github",
@@ -4380,8 +3989,6 @@
},
"node_modules/basic-ftp": {
"version": "5.3.1",
- "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz",
- "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -4389,8 +3996,6 @@
},
"node_modules/bignumber.js": {
"version": "9.3.1",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
- "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
"license": "MIT",
"engines": {
"node": "*"
@@ -4398,8 +4003,6 @@
},
"node_modules/bl": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4410,14 +4013,10 @@
},
"node_modules/bowser": {
"version": "2.14.1",
- "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz",
- "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==",
"license": "MIT"
},
"node_modules/brace-expansion": {
"version": "5.0.5",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
- "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^4.0.2"
@@ -4428,8 +4027,6 @@
},
"node_modules/braces": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4441,8 +4038,6 @@
},
"node_modules/buffer": {
"version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"funding": [
{
@@ -4466,8 +4061,6 @@
},
"node_modules/buffer-crc32": {
"version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"license": "MIT",
"engines": {
"node": "*"
@@ -4475,14 +4068,10 @@
},
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
"license": "BSD-3-Clause"
},
"node_modules/cac": {
"version": "6.7.14",
- "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
- "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4491,8 +4080,6 @@
},
"node_modules/canvas": {
"version": "3.2.3",
- "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.3.tgz",
- "integrity": "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -4506,8 +4093,6 @@
},
"node_modules/chai": {
"version": "5.3.3",
- "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
- "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4523,8 +4108,6 @@
},
"node_modules/chalk": {
"version": "5.6.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
- "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
@@ -4535,8 +4118,6 @@
},
"node_modules/check-error": {
"version": "2.1.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz",
- "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4545,15 +4126,11 @@
},
"node_modules/chownr": {
"version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"dev": true,
"license": "ISC"
},
"node_modules/class-variance-authority": {
"version": "0.7.1",
- "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
- "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
"license": "Apache-2.0",
"dependencies": {
"clsx": "^2.1.1"
@@ -4564,8 +4141,6 @@
},
"node_modules/cli-highlight": {
"version": "2.1.11",
- "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
- "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
"license": "ISC",
"dependencies": {
"chalk": "^4.0.0",
@@ -4585,8 +4160,6 @@
},
"node_modules/cli-highlight/node_modules/chalk": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
@@ -4601,8 +4174,6 @@
},
"node_modules/cli-highlight/node_modules/supports-color": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
@@ -4613,8 +4184,6 @@
},
"node_modules/cliui": {
"version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
@@ -4624,8 +4193,6 @@
},
"node_modules/cliui/node_modules/ansi-regex": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4633,8 +4200,6 @@
},
"node_modules/cliui/node_modules/strip-ansi": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -4645,8 +4210,6 @@
},
"node_modules/clsx": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"license": "MIT",
"engines": {
"node": ">=6"
@@ -4654,8 +4217,6 @@
},
"node_modules/color-convert": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
@@ -4666,14 +4227,11 @@
},
"node_modules/color-name": {
"version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
"node_modules/commander": {
"version": "12.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
- "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -4681,8 +4239,6 @@
},
"node_modules/concurrently": {
"version": "9.2.1",
- "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz",
- "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4706,8 +4262,6 @@
},
"node_modules/concurrently/node_modules/ansi-regex": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4716,8 +4270,6 @@
},
"node_modules/concurrently/node_modules/chalk": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4733,8 +4285,6 @@
},
"node_modules/concurrently/node_modules/chalk/node_modules/supports-color": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4746,8 +4296,6 @@
},
"node_modules/concurrently/node_modules/cliui": {
"version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -4761,8 +4309,6 @@
},
"node_modules/concurrently/node_modules/strip-ansi": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4774,8 +4320,6 @@
},
"node_modules/concurrently/node_modules/yargs": {
"version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4793,8 +4337,6 @@
},
"node_modules/concurrently/node_modules/yargs-parser": {
"version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
"license": "ISC",
"engines": {
@@ -4803,14 +4345,10 @@
},
"node_modules/core-util-is": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"license": "MIT"
},
"node_modules/cross-spawn": {
"version": "6.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
- "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4826,8 +4364,6 @@
},
"node_modules/cross-spawn/node_modules/semver": {
"version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"license": "ISC",
"bin": {
@@ -4836,8 +4372,6 @@
},
"node_modules/data-uri-to-buffer": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
- "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
"license": "MIT",
"engines": {
"node": ">= 12"
@@ -4845,8 +4379,6 @@
},
"node_modules/debug": {
"version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -4862,8 +4394,6 @@
},
"node_modules/decompress-response": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4878,8 +4408,6 @@
},
"node_modules/deep-eql": {
"version": "5.0.2",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
- "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4888,8 +4416,6 @@
},
"node_modules/deep-extend": {
"version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4898,8 +4424,6 @@
},
"node_modules/degenerator": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
- "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
"license": "MIT",
"dependencies": {
"ast-types": "^0.13.4",
@@ -4912,8 +4436,6 @@
},
"node_modules/detect-libc": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=8"
@@ -4921,8 +4443,6 @@
},
"node_modules/diff": {
"version": "8.0.4",
- "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
- "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
@@ -4930,8 +4450,6 @@
},
"node_modules/docx-preview": {
"version": "0.3.7",
- "resolved": "https://registry.npmjs.org/docx-preview/-/docx-preview-0.3.7.tgz",
- "integrity": "sha512-Lav69CTA/IYZPJTsKH7oYeoZjyg96N0wEJMNslGJnZJ+dMUZK85Lt5ASC79yUlD48ecWjuv+rkcmFt6EVPV0Xg==",
"license": "Apache-2.0",
"dependencies": {
"jszip": ">=3.0.0"
@@ -4939,8 +4457,6 @@
},
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
"license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
@@ -4948,14 +4464,10 @@
},
"node_modules/emoji-regex": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/end-of-stream": {
"version": "1.4.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
- "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
@@ -4963,8 +4475,6 @@
},
"node_modules/enhanced-resolve": {
"version": "5.21.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
- "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -4976,8 +4486,6 @@
},
"node_modules/es-errors": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4986,15 +4494,11 @@
},
"node_modules/es-module-lexer": {
"version": "1.7.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
- "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
"dev": true,
"license": "MIT"
},
"node_modules/esbuild": {
"version": "0.27.7",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
- "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -5034,8 +4538,6 @@
},
"node_modules/escalade": {
"version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"license": "MIT",
"engines": {
"node": ">=6"
@@ -5043,8 +4545,6 @@
},
"node_modules/escodegen": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"license": "BSD-2-Clause",
"dependencies": {
"esprima": "^4.0.1",
@@ -5064,8 +4564,6 @@
},
"node_modules/esprima": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"license": "BSD-2-Clause",
"bin": {
"esparse": "bin/esparse.js",
@@ -5077,8 +4575,6 @@
},
"node_modules/estraverse": {
"version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
@@ -5086,8 +4582,6 @@
},
"node_modules/estree-walker": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5096,8 +4590,6 @@
},
"node_modules/esutils": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
@@ -5105,8 +4597,6 @@
},
"node_modules/execa": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5124,8 +4614,6 @@
},
"node_modules/execa/node_modules/get-stream": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5137,8 +4625,6 @@
},
"node_modules/expand-template": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
- "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
"dev": true,
"license": "(MIT OR WTFPL)",
"engines": {
@@ -5147,8 +4633,6 @@
},
"node_modules/expect-type": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
- "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -5157,14 +4641,10 @@
},
"node_modules/extend": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"license": "MIT"
},
"node_modules/extract-zip": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"license": "BSD-2-Clause",
"dependencies": {
"debug": "^4.1.1",
@@ -5183,8 +4663,6 @@
},
"node_modules/fast-glob": {
"version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5199,9 +4677,7 @@
}
},
"node_modules/fast-xml-builder": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.7.tgz",
- "integrity": "sha512-Yh7/7rQuMXICNr0oMYDR2yHP6oUvmQsTToFeOWj/kIDhAwQ+c4Ol/lbcwOmEM5OHYQmh6S6EQSQ1sljCKP36bQ==",
+ "version": "1.1.9",
"funding": [
{
"type": "github",
@@ -5215,8 +4691,6 @@
},
"node_modules/fast-xml-parser": {
"version": "5.7.2",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz",
- "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==",
"funding": [
{
"type": "github",
@@ -5236,8 +4710,6 @@
},
"node_modules/fastq": {
"version": "1.20.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
- "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -5246,8 +4718,6 @@
},
"node_modules/fd-slicer": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"license": "MIT",
"dependencies": {
"pend": "~1.2.0"
@@ -5255,8 +4725,6 @@
},
"node_modules/fetch-blob": {
"version": "3.2.0",
- "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
- "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"funding": [
{
"type": "github",
@@ -5278,8 +4746,6 @@
},
"node_modules/file-type": {
"version": "21.3.4",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz",
- "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==",
"license": "MIT",
"dependencies": {
"@tokenizer/inflate": "^0.4.1",
@@ -5296,8 +4762,6 @@
},
"node_modules/fill-range": {
"version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5309,8 +4773,6 @@
},
"node_modules/formdata-polyfill": {
"version": "4.0.10",
- "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
- "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"license": "MIT",
"dependencies": {
"fetch-blob": "^3.1.2"
@@ -5321,8 +4783,6 @@
},
"node_modules/fs-constants": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true,
"license": "MIT"
},
@@ -5342,8 +4802,6 @@
},
"node_modules/function-bind": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5352,8 +4810,6 @@
},
"node_modules/gaxios": {
"version": "7.1.4",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
- "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
"license": "Apache-2.0",
"dependencies": {
"extend": "^3.0.2",
@@ -5366,8 +4822,6 @@
},
"node_modules/gcp-metadata": {
"version": "8.1.2",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
- "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
"license": "Apache-2.0",
"dependencies": {
"gaxios": "^7.0.0",
@@ -5380,8 +4834,6 @@
},
"node_modules/get-caller-file": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
@@ -5389,8 +4841,6 @@
},
"node_modules/get-east-asian-width": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
- "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
"license": "MIT",
"engines": {
"node": ">=18"
@@ -5401,8 +4851,6 @@
},
"node_modules/get-stream": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
@@ -5416,8 +4864,6 @@
},
"node_modules/get-tsconfig": {
"version": "4.14.0",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
- "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -5429,8 +4875,6 @@
},
"node_modules/get-uri": {
"version": "6.0.5",
- "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
- "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
"license": "MIT",
"dependencies": {
"basic-ftp": "^5.0.2",
@@ -5443,8 +4887,6 @@
},
"node_modules/get-uri/node_modules/data-uri-to-buffer": {
"version": "6.0.2",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
- "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
"license": "MIT",
"engines": {
"node": ">= 14"
@@ -5452,15 +4894,11 @@
},
"node_modules/github-from-package": {
"version": "0.0.0",
- "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
- "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"dev": true,
"license": "MIT"
},
"node_modules/glob": {
"version": "13.0.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
- "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
"license": "BlueOak-1.0.0",
"dependencies": {
"minimatch": "^10.2.2",
@@ -5476,8 +4914,6 @@
},
"node_modules/glob-parent": {
"version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -5489,8 +4925,6 @@
},
"node_modules/google-auth-library": {
"version": "10.6.2",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz",
- "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==",
"license": "Apache-2.0",
"dependencies": {
"base64-js": "^1.3.0",
@@ -5506,8 +4940,6 @@
},
"node_modules/google-logging-utils": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
- "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
"license": "Apache-2.0",
"engines": {
"node": ">=14"
@@ -5515,14 +4947,10 @@
},
"node_modules/graceful-fs": {
"version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
"node_modules/has-flag": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"license": "MIT",
"engines": {
"node": ">=8"
@@ -5530,8 +4958,6 @@
},
"node_modules/hasown": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
- "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5543,8 +4969,6 @@
},
"node_modules/highlight.js": {
"version": "10.7.3",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
- "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
"license": "BSD-3-Clause",
"engines": {
"node": "*"
@@ -5552,8 +4976,6 @@
},
"node_modules/hosted-git-info": {
"version": "9.0.3",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
- "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
"license": "ISC",
"dependencies": {
"lru-cache": "^11.1.0"
@@ -5564,14 +4986,10 @@
},
"node_modules/html-parse-string": {
"version": "0.0.9",
- "resolved": "https://registry.npmjs.org/html-parse-string/-/html-parse-string-0.0.9.tgz",
- "integrity": "sha512-wyGnsOolHbNrcb8N6bdJF4EHyzd3zVGCb9/mBxeNjAYBDOZqD7YkqLBz7kXtdgHwNnV8lN/BpSDpsI1zm8Sd8g==",
"license": "MIT"
},
"node_modules/http-proxy-agent": {
"version": "7.0.2",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.0",
@@ -5583,8 +5001,6 @@
},
"node_modules/https-proxy-agent": {
"version": "7.0.6",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
- "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
@@ -5596,8 +5012,6 @@
},
"node_modules/husky": {
"version": "9.1.7",
- "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
- "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
"dev": true,
"license": "MIT",
"bin": {
@@ -5612,8 +5026,6 @@
},
"node_modules/ieee754": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"funding": [
{
"type": "github",
@@ -5632,8 +5044,6 @@
},
"node_modules/ignore": {
"version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"license": "MIT",
"engines": {
"node": ">= 4"
@@ -5641,27 +5051,19 @@
},
"node_modules/immediate": {
"version": "3.0.6",
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
- "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
"license": "MIT"
},
"node_modules/inherits": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
"node_modules/ini": {
"version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true,
"license": "ISC"
},
"node_modules/interpret": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5670,21 +5072,17 @@
},
"node_modules/ip-address": {
"version": "10.2.0",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
- "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
"license": "MIT",
"engines": {
"node": ">= 12"
}
},
"node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "version": "2.16.2",
"dev": true,
"license": "MIT",
"dependencies": {
- "hasown": "^2.0.2"
+ "hasown": "^2.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -5695,8 +5093,6 @@
},
"node_modules/is-extglob": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5705,8 +5101,6 @@
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
@@ -5714,8 +5108,6 @@
},
"node_modules/is-glob": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5727,8 +5119,6 @@
},
"node_modules/is-number": {
"version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5737,8 +5127,6 @@
},
"node_modules/is-stream": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5747,21 +5135,15 @@
},
"node_modules/isarray": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT"
},
"node_modules/isexe": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
},
"node_modules/jiti": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
- "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
@@ -5769,15 +5151,11 @@
},
"node_modules/js-tokens": {
"version": "9.0.1",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
- "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
"dev": true,
"license": "MIT"
},
"node_modules/json-bigint": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
- "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"license": "MIT",
"dependencies": {
"bignumber.js": "^9.0.0"
@@ -5785,8 +5163,6 @@
},
"node_modules/json-schema-to-ts": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz",
- "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
@@ -5798,8 +5174,6 @@
},
"node_modules/jsonschema": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz",
- "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==",
"license": "MIT",
"engines": {
"node": "*"
@@ -5807,8 +5181,6 @@
},
"node_modules/jszip": {
"version": "3.10.1",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
- "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"license": "(MIT OR GPL-3.0-or-later)",
"dependencies": {
"lie": "~3.3.0",
@@ -5819,8 +5191,6 @@
},
"node_modules/jszip/node_modules/readable-stream": {
"version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
@@ -5834,14 +5204,10 @@
},
"node_modules/jszip/node_modules/safe-buffer": {
"version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"license": "MIT"
},
"node_modules/jszip/node_modules/string_decoder": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
@@ -5849,8 +5215,6 @@
},
"node_modules/jwa": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
- "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
"license": "MIT",
"dependencies": {
"buffer-equal-constant-time": "^1.0.1",
@@ -5860,8 +5224,6 @@
},
"node_modules/jws": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
- "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
"license": "MIT",
"dependencies": {
"jwa": "^2.0.1",
@@ -5870,8 +5232,6 @@
},
"node_modules/katex": {
"version": "0.16.45",
- "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz",
- "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==",
"funding": [
"https://opencollective.com/katex",
"https://github.com/sponsors/katex"
@@ -5886,17 +5246,13 @@
},
"node_modules/katex/node_modules/commander": {
"version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
"license": "MIT",
"engines": {
"node": ">= 12"
}
},
"node_modules/koffi": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.16.1.tgz",
- "integrity": "sha512-0Ie6CfD026dNfWSosDw9dPxPzO9Rlyo0N8m5r05S8YjytIpuilzMFDMY4IDy/8xQsTwpuVinhncD+S8n3bcYZQ==",
+ "version": "2.16.2",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
@@ -5906,8 +5262,6 @@
},
"node_modules/lie": {
"version": "3.3.0",
- "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
- "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"license": "MIT",
"dependencies": {
"immediate": "~3.0.5"
@@ -5915,8 +5269,6 @@
},
"node_modules/lightningcss": {
"version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
- "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
@@ -5964,8 +5316,6 @@
},
"node_modules/lightningcss-darwin-arm64": {
"version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
- "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
"cpu": [
"arm64"
],
@@ -6049,9 +5399,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6072,9 +5419,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6095,9 +5439,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6118,9 +5459,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6176,8 +5514,6 @@
},
"node_modules/lit": {
"version": "3.3.2",
- "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.2.tgz",
- "integrity": "sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==",
"license": "BSD-3-Clause",
"dependencies": {
"@lit/reactive-element": "^2.1.0",
@@ -6187,8 +5523,6 @@
},
"node_modules/lit-element": {
"version": "4.2.2",
- "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz",
- "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==",
"license": "BSD-3-Clause",
"dependencies": {
"@lit-labs/ssr-dom-shim": "^1.5.0",
@@ -6198,8 +5532,6 @@
},
"node_modules/lit-html": {
"version": "3.3.2",
- "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz",
- "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==",
"license": "BSD-3-Clause",
"dependencies": {
"@types/trusted-types": "^2.0.2"
@@ -6207,27 +5539,20 @@
},
"node_modules/lodash-es": {
"version": "4.18.1",
- "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
- "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/long": {
"version": "5.3.2",
- "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
- "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
"license": "Apache-2.0"
},
"node_modules/loupe": {
"version": "3.2.1",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
- "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
"dev": true,
"license": "MIT"
},
"node_modules/lru-cache": {
"version": "11.3.6",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz",
- "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==",
"license": "BlueOak-1.0.0",
"engines": {
"node": "20 || >=22"
@@ -6235,14 +5560,10 @@
},
"node_modules/lucide": {
"version": "0.544.0",
- "resolved": "https://registry.npmjs.org/lucide/-/lucide-0.544.0.tgz",
- "integrity": "sha512-U5ORwr5z9Sx7bNTDFaW55RbjVdQEnAcT3vws9uz3vRT1G4XXJUDAhRZdxhFoIyHEvjmTkzzlEhjSLYM5n4mb5w==",
"license": "ISC"
},
"node_modules/magic-string": {
"version": "0.30.21",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
- "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
@@ -6250,8 +5571,6 @@
},
"node_modules/marked": {
"version": "15.0.12",
- "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
- "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
@@ -6262,8 +5581,6 @@
},
"node_modules/merge2": {
"version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6272,8 +5589,6 @@
},
"node_modules/micromatch": {
"version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6286,8 +5601,6 @@
},
"node_modules/mime-db": {
"version": "1.54.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
- "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -6295,8 +5608,6 @@
},
"node_modules/mime-types": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
- "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
"license": "MIT",
"dependencies": {
"mime-db": "^1.54.0"
@@ -6311,8 +5622,6 @@
},
"node_modules/mimic-response": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6324,8 +5633,6 @@
},
"node_modules/minimatch": {
"version": "10.2.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
- "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"license": "BlueOak-1.0.0",
"dependencies": {
"brace-expansion": "^5.0.5"
@@ -6339,8 +5646,6 @@
},
"node_modules/minimist": {
"version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -6349,8 +5654,6 @@
},
"node_modules/minipass": {
"version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -6358,15 +5661,11 @@
},
"node_modules/mkdirp-classic": {
"version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"dev": true,
"license": "MIT"
},
"node_modules/mri": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
- "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6375,14 +5674,10 @@
},
"node_modules/ms": {
"version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/mz": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
@@ -6392,8 +5687,6 @@
},
"node_modules/nanoid": {
"version": "3.3.12",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
- "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
"funding": [
{
"type": "github",
@@ -6410,15 +5703,11 @@
},
"node_modules/napi-build-utils": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
- "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
"dev": true,
"license": "MIT"
},
"node_modules/netmask": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz",
- "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==",
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
@@ -6426,15 +5715,11 @@
},
"node_modules/nice-try": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true,
"license": "MIT"
},
"node_modules/node-abi": {
- "version": "3.90.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.90.0.tgz",
- "integrity": "sha512-pZNQT7UnYlMwMBy5N1lV5X/YLTbZM5ncytN3xL7CHEzhDN8uVe0u55yaPUJICIJjaCW8NrM5BFdqr7HLweStNA==",
+ "version": "3.92.0",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6446,16 +5731,11 @@
},
"node_modules/node-addon-api": {
"version": "7.1.1",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
- "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
"dev": true,
"license": "MIT"
},
"node_modules/node-domexception": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "deprecated": "Use your platform's native DOMException instead",
"funding": [
{
"type": "github",
@@ -6473,8 +5753,6 @@
},
"node_modules/node-fetch": {
"version": "3.3.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
- "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
"license": "MIT",
"dependencies": {
"data-uri-to-buffer": "^4.0.0",
@@ -6491,8 +5769,6 @@
},
"node_modules/npm-run-path": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6504,8 +5780,6 @@
},
"node_modules/object-assign": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -6513,8 +5787,6 @@
},
"node_modules/ollama": {
"version": "0.6.3",
- "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.6.3.tgz",
- "integrity": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==",
"license": "MIT",
"dependencies": {
"whatwg-fetch": "^3.6.20"
@@ -6522,8 +5794,6 @@
},
"node_modules/once": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"license": "ISC",
"dependencies": {
"wrappy": "1"
@@ -6531,8 +5801,6 @@
},
"node_modules/openai": {
"version": "6.26.0",
- "resolved": "https://registry.npmjs.org/openai/-/openai-6.26.0.tgz",
- "integrity": "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==",
"license": "Apache-2.0",
"bin": {
"openai": "bin/cli"
@@ -6552,8 +5820,6 @@
},
"node_modules/p-finally": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6562,8 +5828,6 @@
},
"node_modules/p-retry": {
"version": "4.6.2",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
- "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
"license": "MIT",
"dependencies": {
"@types/retry": "0.12.0",
@@ -6575,14 +5839,10 @@
},
"node_modules/p-retry/node_modules/@types/retry": {
"version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
"license": "MIT"
},
"node_modules/pac-proxy-agent": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
- "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
"license": "MIT",
"dependencies": {
"@tootallnate/quickjs-emscripten": "^0.23.0",
@@ -6600,8 +5860,6 @@
},
"node_modules/pac-resolver": {
"version": "7.0.1",
- "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
- "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
"license": "MIT",
"dependencies": {
"degenerator": "^5.0.0",
@@ -6613,20 +5871,14 @@
},
"node_modules/pako": {
"version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"license": "(MIT AND Zlib)"
},
"node_modules/parse5": {
"version": "5.1.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
- "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
"license": "MIT"
},
"node_modules/parse5-htmlparser2-tree-adapter": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
- "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
"license": "MIT",
"dependencies": {
"parse5": "^6.0.1"
@@ -6634,20 +5886,14 @@
},
"node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
"license": "MIT"
},
"node_modules/partial-json": {
"version": "0.1.7",
- "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz",
- "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==",
"license": "MIT"
},
"node_modules/path-expression-matcher": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz",
- "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==",
"funding": [
{
"type": "github",
@@ -6661,8 +5907,6 @@
},
"node_modules/path-key": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6671,15 +5915,11 @@
},
"node_modules/path-parse": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true,
"license": "MIT"
},
"node_modules/path-scurry": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
- "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^11.0.0",
@@ -6694,15 +5934,11 @@
},
"node_modules/pathe": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
"dev": true,
"license": "MIT"
},
"node_modules/pathval": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
- "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6711,8 +5947,6 @@
},
"node_modules/pdfjs-dist": {
"version": "5.4.394",
- "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.394.tgz",
- "integrity": "sha512-9ariAYGqUJzx+V/1W4jHyiyCep6IZALmDzoaTLZ6VNu8q9LWi1/ukhzHgE2Xsx96AZi0mbZuK4/ttIbqSbLypg==",
"license": "Apache-2.0",
"engines": {
"node": ">=20.16.0 || >=22.3.0"
@@ -6723,8 +5957,6 @@
},
"node_modules/pend": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"license": "MIT"
},
"node_modules/pi-extension-custom-provider-anthropic": {
@@ -6749,14 +5981,10 @@
},
"node_modules/picocolors": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6768,8 +5996,6 @@
},
"node_modules/postcss": {
"version": "8.5.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
- "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"funding": [
{
"type": "opencollective",
@@ -6796,9 +6022,6 @@
},
"node_modules/prebuild-install": {
"version": "7.1.3",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
- "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
- "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6824,14 +6047,10 @@
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"license": "MIT"
},
"node_modules/proper-lockfile": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
- "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -6841,8 +6060,6 @@
},
"node_modules/proper-lockfile/node_modules/retry": {
"version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
"license": "MIT",
"engines": {
"node": ">= 4"
@@ -6850,8 +6067,6 @@
},
"node_modules/protobufjs": {
"version": "7.5.6",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
- "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -6874,8 +6089,6 @@
},
"node_modules/proxy-agent": {
"version": "6.5.0",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
- "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
@@ -6893,8 +6106,6 @@
},
"node_modules/proxy-agent/node_modules/lru-cache": {
"version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
"license": "ISC",
"engines": {
"node": ">=12"
@@ -6902,14 +6113,10 @@
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/pump": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
- "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
@@ -6918,8 +6125,6 @@
},
"node_modules/queue-microtask": {
"version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
"funding": [
{
@@ -6939,8 +6144,6 @@
},
"node_modules/rc": {
"version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
"dependencies": {
@@ -6955,8 +6158,6 @@
},
"node_modules/readable-stream": {
"version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6970,8 +6171,6 @@
},
"node_modules/rechoir": {
"version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
"dev": true,
"dependencies": {
"resolve": "^1.1.6"
@@ -6982,8 +6181,6 @@
},
"node_modules/require-directory": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -6991,8 +6188,6 @@
},
"node_modules/resolve": {
"version": "1.22.12",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
- "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7013,8 +6208,6 @@
},
"node_modules/resolve-pkg-maps": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
- "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
"devOptional": true,
"license": "MIT",
"funding": {
@@ -7023,8 +6216,6 @@
},
"node_modules/retry": {
"version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
"license": "MIT",
"engines": {
"node": ">= 4"
@@ -7032,8 +6223,6 @@
},
"node_modules/reusify": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7043,8 +6232,6 @@
},
"node_modules/rollup": {
"version": "4.60.3",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz",
- "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==",
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.8"
@@ -7085,10 +6272,12 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/rollup/node_modules/@types/estree": {
+ "version": "1.0.8",
+ "license": "MIT"
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"funding": [
{
@@ -7111,8 +6300,6 @@
},
"node_modules/rxjs": {
"version": "7.8.2",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
- "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7121,8 +6308,6 @@
},
"node_modules/safe-buffer": {
"version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
@@ -7141,8 +6326,6 @@
},
"node_modules/semver": {
"version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -7154,14 +6337,10 @@
},
"node_modules/setimmediate": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
"license": "MIT"
},
"node_modules/shebang-command": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7173,8 +6352,6 @@
},
"node_modules/shebang-regex": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7183,8 +6360,7 @@
},
"node_modules/shell-quote": {
"version": "1.8.3",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
- "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -7195,8 +6371,6 @@
},
"node_modules/shelljs": {
"version": "0.9.2",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz",
- "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -7214,8 +6388,6 @@
},
"node_modules/shx": {
"version": "0.4.0",
- "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz",
- "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7231,21 +6403,15 @@
},
"node_modules/siginfo": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
- "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
"dev": true,
"license": "ISC"
},
"node_modules/signal-exit": {
"version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"license": "ISC"
},
"node_modules/simple-concat": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
"dev": true,
"funding": [
{
@@ -7265,8 +6431,6 @@
},
"node_modules/simple-get": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
- "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
"dev": true,
"funding": [
{
@@ -7291,8 +6455,6 @@
},
"node_modules/smart-buffer": {
"version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
"license": "MIT",
"engines": {
"node": ">= 6.0.0",
@@ -7301,8 +6463,6 @@
},
"node_modules/socks": {
"version": "2.8.8",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz",
- "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==",
"license": "MIT",
"dependencies": {
"ip-address": "^10.1.1",
@@ -7315,8 +6475,6 @@
},
"node_modules/socks-proxy-agent": {
"version": "8.0.5",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
- "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
@@ -7329,8 +6487,6 @@
},
"node_modules/source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"license": "BSD-3-Clause",
"optional": true,
"engines": {
@@ -7339,8 +6495,6 @@
},
"node_modules/source-map-js": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@@ -7348,22 +6502,16 @@
},
"node_modules/stackback": {
"version": "0.0.2",
- "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
- "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
"dev": true,
"license": "MIT"
},
"node_modules/std-env": {
"version": "3.10.0",
- "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
- "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
"dev": true,
"license": "MIT"
},
"node_modules/string_decoder": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7372,8 +6520,6 @@
},
"node_modules/string-width": {
"version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -7386,8 +6532,6 @@
},
"node_modules/string-width/node_modules/ansi-regex": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
@@ -7395,8 +6539,6 @@
},
"node_modules/string-width/node_modules/strip-ansi": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -7407,8 +6549,6 @@
},
"node_modules/strip-ansi": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.2.2"
@@ -7422,8 +6562,6 @@
},
"node_modules/strip-eof": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7432,8 +6570,6 @@
},
"node_modules/strip-json-comments": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7442,8 +6578,6 @@
},
"node_modules/strip-literal": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
- "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7454,9 +6588,7 @@
}
},
"node_modules/strnum": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz",
- "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==",
+ "version": "2.3.0",
"funding": [
{
"type": "github",
@@ -7467,8 +6599,6 @@
},
"node_modules/strtok3": {
"version": "10.3.5",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz",
- "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==",
"license": "MIT",
"dependencies": {
"@tokenizer/token": "^0.3.0"
@@ -7483,8 +6613,6 @@
},
"node_modules/supports-color": {
"version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7499,8 +6627,6 @@
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7512,8 +6638,6 @@
},
"node_modules/tailwind-merge": {
"version": "3.5.0",
- "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz",
- "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==",
"license": "MIT",
"funding": {
"type": "github",
@@ -7522,8 +6646,6 @@
},
"node_modules/tailwind-variants": {
"version": "3.2.2",
- "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz",
- "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==",
"license": "MIT",
"engines": {
"node": ">=16.x",
@@ -7541,14 +6663,10 @@
},
"node_modules/tailwindcss": {
"version": "4.2.4",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
- "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
"license": "MIT"
},
"node_modules/tapable": {
"version": "2.3.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
- "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"license": "MIT",
"engines": {
"node": ">=6"
@@ -7560,8 +6678,6 @@
},
"node_modules/tar-fs": {
"version": "2.1.4",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
- "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7573,8 +6689,6 @@
},
"node_modules/tar-stream": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7590,8 +6704,6 @@
},
"node_modules/thenify": {
"version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
@@ -7599,8 +6711,6 @@
},
"node_modules/thenify-all": {
"version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
@@ -7611,22 +6721,16 @@
},
"node_modules/tinybench": {
"version": "2.9.0",
- "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
- "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
"dev": true,
"license": "MIT"
},
"node_modules/tinyexec": {
"version": "0.3.2",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
- "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
"dev": true,
"license": "MIT"
},
"node_modules/tinyglobby": {
"version": "0.2.16",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
- "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
@@ -7641,8 +6745,6 @@
},
"node_modules/tinyglobby/node_modules/fdir": {
"version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"license": "MIT",
"engines": {
"node": ">=12.0.0"
@@ -7658,8 +6760,6 @@
},
"node_modules/tinyglobby/node_modules/picomatch": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -7670,8 +6770,6 @@
},
"node_modules/tinypool": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
- "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7680,8 +6778,6 @@
},
"node_modules/tinyrainbow": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
- "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7690,8 +6786,6 @@
},
"node_modules/tinyspy": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz",
- "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7700,8 +6794,6 @@
},
"node_modules/to-regex-range": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7713,8 +6805,6 @@
},
"node_modules/token-types": {
"version": "6.1.2",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
- "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
"license": "MIT",
"dependencies": {
"@borewit/text-codec": "^0.2.1",
@@ -7731,8 +6821,6 @@
},
"node_modules/tree-kill": {
"version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
"dev": true,
"license": "MIT",
"bin": {
@@ -7741,20 +6829,14 @@
},
"node_modules/ts-algebra": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz",
- "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==",
"license": "MIT"
},
"node_modules/tslib": {
"version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/tsx": {
"version": "4.21.0",
- "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",
- "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -7773,8 +6855,6 @@
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7785,15 +6865,11 @@
}
},
"node_modules/typebox": {
- "version": "1.1.37",
- "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.37.tgz",
- "integrity": "sha512-jb7jp6KvOvvy5sd+11AfJ0/e0F0AS9RcOXd55oGi2ZnRHIGmFvrTaNF+ZidRmGBmmNTkM5KKl0Z37KzxJ+owEQ==",
+ "version": "1.1.38",
"license": "MIT"
},
"node_modules/typescript": {
"version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -7806,8 +6882,6 @@
},
"node_modules/uhtml": {
"version": "5.0.9",
- "resolved": "https://registry.npmjs.org/uhtml/-/uhtml-5.0.9.tgz",
- "integrity": "sha512-qPyu3vGilaLe6zrjOCD/xezWEHLwdevxmbY3hzyhT25KBDF4F7YYW3YZcL3kylD/6dMoVISHjn8ggV3+9FY+5g==",
"license": "MIT",
"dependencies": {
"@webreflection/alien-signals": "^0.3.2"
@@ -7815,8 +6889,6 @@
},
"node_modules/uint8array-extras": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
- "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
"license": "MIT",
"engines": {
"node": ">=18"
@@ -7827,8 +6899,6 @@
},
"node_modules/undici": {
"version": "7.25.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz",
- "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==",
"license": "MIT",
"engines": {
"node": ">=20.18.1"
@@ -7836,20 +6906,14 @@
},
"node_modules/undici-types": {
"version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"license": "MIT"
},
"node_modules/util-deprecate": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/uuid": {
"version": "14.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz",
- "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -7860,9 +6924,7 @@
}
},
"node_modules/vite": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz",
- "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==",
+ "version": "7.3.3",
"license": "MIT",
"dependencies": {
"esbuild": "^0.27.0",
@@ -7935,8 +6997,6 @@
},
"node_modules/vite-node": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
- "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7958,8 +7018,6 @@
},
"node_modules/vite/node_modules/fdir": {
"version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"license": "MIT",
"engines": {
"node": ">=12.0.0"
@@ -7975,8 +7033,6 @@
},
"node_modules/vite/node_modules/picomatch": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -7987,8 +7043,6 @@
},
"node_modules/vitest": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
- "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8060,8 +7114,6 @@
},
"node_modules/vitest/node_modules/picomatch": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -8073,8 +7125,6 @@
},
"node_modules/web-streams-polyfill": {
"version": "3.3.3",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
- "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
"license": "MIT",
"engines": {
"node": ">= 8"
@@ -8082,14 +7132,10 @@
},
"node_modules/whatwg-fetch": {
"version": "3.6.20",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
- "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
"license": "MIT"
},
"node_modules/which": {
"version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -8101,8 +7147,6 @@
},
"node_modules/why-is-node-running": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
- "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8118,8 +7162,6 @@
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -8135,8 +7177,6 @@
},
"node_modules/wrap-ansi/node_modules/ansi-regex": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8144,8 +7184,6 @@
},
"node_modules/wrap-ansi/node_modules/strip-ansi": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -8156,14 +7194,10 @@
},
"node_modules/wrappy": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
"node_modules/ws": {
"version": "8.20.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
- "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -8195,8 +7229,6 @@
},
"node_modules/y18n": {
"version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"license": "ISC",
"engines": {
"node": ">=10"
@@ -8204,8 +7236,6 @@
},
"node_modules/yaml": {
"version": "2.8.4",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz",
- "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
@@ -8219,8 +7249,6 @@
},
"node_modules/yargs": {
"version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"license": "MIT",
"dependencies": {
"cliui": "^7.0.2",
@@ -8237,8 +7265,6 @@
},
"node_modules/yargs-parser": {
"version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"license": "ISC",
"engines": {
"node": ">=10"
@@ -8246,8 +7272,6 @@
},
"node_modules/yauzl": {
"version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
"license": "MIT",
"dependencies": {
"buffer-crc32": "~0.2.3",
@@ -8256,8 +7280,6 @@
},
"node_modules/zod": {
"version": "4.4.3",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
- "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
@@ -8265,19 +7287,17 @@
},
"node_modules/zod-to-json-schema": {
"version": "3.25.2",
- "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
- "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
"license": "ISC",
"peerDependencies": {
"zod": "^3.25.28 || ^4"
}
},
"packages/agent": {
- "name": "@mariozechner/pi-agent-core",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-agent-core",
+ "version": "0.74.0",
"license": "MIT",
"dependencies": {
- "@mariozechner/pi-ai": "^0.73.0",
+ "@earendil-works/pi-ai": "^0.74.0",
"ignore": "^7.0.5",
"typebox": "^1.1.24",
"yaml": "^2.8.2"
@@ -8293,8 +7313,6 @@
},
"packages/agent/node_modules/@types/node": {
"version": "24.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
- "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8303,14 +7321,12 @@
},
"packages/agent/node_modules/undici-types": {
"version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"dev": true,
"license": "MIT"
},
"packages/ai": {
- "name": "@mariozechner/pi-ai",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-ai",
+ "version": "0.74.0",
"license": "MIT",
"dependencies": {
"@anthropic-ai/sdk": "^0.91.1",
@@ -8339,8 +7355,6 @@
},
"packages/ai/node_modules/@types/node": {
"version": "24.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
- "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8349,19 +7363,17 @@
},
"packages/ai/node_modules/undici-types": {
"version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"dev": true,
"license": "MIT"
},
"packages/coding-agent": {
- "name": "@mariozechner/pi-coding-agent",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-coding-agent",
+ "version": "0.74.0",
"license": "MIT",
"dependencies": {
- "@mariozechner/pi-agent-core": "^0.73.0",
- "@mariozechner/pi-ai": "^0.73.0",
- "@mariozechner/pi-tui": "^0.73.0",
+ "@earendil-works/pi-agent-core": "^0.74.0",
+ "@earendil-works/pi-ai": "^0.74.0",
+ "@earendil-works/pi-tui": "^0.74.0",
"@silvia-odwyer/photon-node": "^0.3.4",
"chalk": "^5.5.0",
"cli-highlight": "^2.1.11",
@@ -8403,25 +7415,86 @@
},
"packages/coding-agent/examples/extensions/custom-provider-anthropic": {
"name": "pi-extension-custom-provider-anthropic",
- "version": "0.73.0",
+ "version": "0.74.0",
"dependencies": {
"@anthropic-ai/sdk": "^0.52.0"
}
},
"packages/coding-agent/examples/extensions/custom-provider-gitlab-duo": {
"name": "pi-extension-custom-provider-gitlab-duo",
- "version": "0.73.0"
+ "version": "0.74.0"
},
"packages/coding-agent/examples/extensions/sandbox": {
"name": "pi-extension-sandbox",
- "version": "1.3.0",
+ "version": "1.4.0",
"dependencies": {
"@anthropic-ai/sandbox-runtime": "^0.0.26"
}
},
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/@anthropic-ai/sandbox-runtime": {
+ "version": "0.0.26",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@pondwader/socks5-server": "^1.0.10",
+ "@types/lodash-es": "^4.17.12",
+ "commander": "^12.1.0",
+ "lodash-es": "^4.17.21",
+ "shell-quote": "^1.8.3",
+ "zod": "^3.24.1"
+ },
+ "bin": {
+ "srt": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/@pondwader/socks5-server": {
+ "version": "1.0.10",
+ "license": "MIT"
+ },
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/@types/lodash": {
+ "version": "4.17.23",
+ "license": "MIT"
+ },
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/@types/lodash-es": {
+ "version": "4.17.12",
+ "license": "MIT",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/commander": {
+ "version": "12.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/lodash-es": {
+ "version": "4.18.1",
+ "license": "MIT"
+ },
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/shell-quote": {
+ "version": "1.8.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "packages/coding-agent/examples/extensions/sandbox/node_modules/zod": {
+ "version": "3.25.76",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
"packages/coding-agent/examples/extensions/with-deps": {
"name": "pi-extension-with-deps",
- "version": "0.73.0",
+ "version": "0.74.0",
"dependencies": {
"ms": "^2.1.3"
},
@@ -8431,8 +7504,6 @@
},
"packages/coding-agent/node_modules/@anthropic-ai/sdk": {
"version": "0.52.0",
- "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.52.0.tgz",
- "integrity": "sha512-d4c+fg+xy9e46c8+YnrrgIQR45CZlAi7PwdzIfDXDM6ACxEZli1/fxhURsq30ZpMZy6LvSkr41jGq5aF5TD7rQ==",
"license": "MIT",
"bin": {
"anthropic-ai-sdk": "bin/cli"
@@ -8440,8 +7511,6 @@
},
"packages/coding-agent/node_modules/@types/node": {
"version": "24.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
- "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8450,14 +7519,12 @@
},
"packages/coding-agent/node_modules/undici-types": {
"version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"dev": true,
"license": "MIT"
},
"packages/tui": {
- "name": "@mariozechner/pi-tui",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-tui",
+ "version": "0.74.0",
"license": "MIT",
"dependencies": {
"@types/mime-types": "^2.1.4",
@@ -8478,13 +7545,13 @@
}
},
"packages/web-ui": {
- "name": "@mariozechner/pi-web-ui",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-web-ui",
+ "version": "0.74.0",
"license": "MIT",
"dependencies": {
+ "@earendil-works/pi-ai": "^0.74.0",
+ "@earendil-works/pi-tui": "^0.74.0",
"@lmstudio/sdk": "^1.5.0",
- "@mariozechner/pi-ai": "^0.73.0",
- "@mariozechner/pi-tui": "^0.73.0",
"docx-preview": "^0.3.7",
"jszip": "^3.10.1",
"lucide": "^0.544.0",
@@ -8506,11 +7573,11 @@
},
"packages/web-ui/example": {
"name": "pi-web-ui-example",
- "version": "0.73.0",
+ "version": "0.74.0",
"dependencies": {
+ "@earendil-works/pi-ai": "file:../../ai",
+ "@earendil-works/pi-web-ui": "file:../",
"@mariozechner/mini-lit": "^0.2.0",
- "@mariozechner/pi-ai": "file:../../ai",
- "@mariozechner/pi-web-ui": "file:../",
"@tailwindcss/vite": "^4.1.17",
"lit": "^3.3.1",
"lucide": "^0.544.0"
diff --git a/package.json b/package.json
index 6079c785b..2b5b8cae8 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
},
"version": "0.0.3",
"dependencies": {
- "@mariozechner/pi-coding-agent": "^0.30.2",
+ "@earendil-works/pi-coding-agent": "^0.30.2",
"get-east-asian-width": "^1.4.0"
},
"overrides": {
diff --git a/packages/agent/CHANGELOG.md b/packages/agent/CHANGELOG.md
index 972c0c51f..bcd8f2927 100644
--- a/packages/agent/CHANGELOG.md
+++ b/packages/agent/CHANGELOG.md
@@ -2,6 +2,10 @@
## [Unreleased]
+## [0.74.0] - 2026-05-07
+
+## [0.73.1] - 2026-05-07
+
## [0.73.0] - 2026-05-04
## [0.72.1] - 2026-05-02
diff --git a/packages/agent/README.md b/packages/agent/README.md
index 654347681..f0fedb810 100644
--- a/packages/agent/README.md
+++ b/packages/agent/README.md
@@ -1,18 +1,18 @@
-# @mariozechner/pi-agent-core
+# @earendil-works/pi-agent-core
-Stateful agent with tool execution and event streaming. Built on `@mariozechner/pi-ai`.
+Stateful agent with tool execution and event streaming. Built on `@earendil-works/pi-ai`.
## Installation
```bash
-npm install @mariozechner/pi-agent-core
+npm install @earendil-works/pi-agent-core
```
## Quick Start
```typescript
-import { Agent } from "@mariozechner/pi-agent-core";
-import { getModel } from "@mariozechner/pi-ai";
+import { Agent } from "@earendil-works/pi-agent-core";
+import { getModel } from "@earendil-works/pi-ai";
const agent = new Agent({
initialState: {
@@ -355,7 +355,7 @@ Follow-up messages are checked only when there are no more tool calls and no ste
Extend `AgentMessage` via declaration merging:
```typescript
-declare module "@mariozechner/pi-agent-core" {
+declare module "@earendil-works/pi-agent-core" {
interface CustomAgentMessages {
notification: { role: "notification"; text: string; timestamp: number };
}
@@ -436,7 +436,7 @@ Return `terminate: true` from `execute()` or `afterToolCall` to hint that the ag
For browser apps that proxy through a backend:
```typescript
-import { Agent, streamProxy } from "@mariozechner/pi-agent-core";
+import { Agent, streamProxy } from "@earendil-works/pi-agent-core";
const agent = new Agent({
streamFn: (model, context, options) =>
@@ -453,7 +453,7 @@ const agent = new Agent({
For direct control without the Agent class:
```typescript
-import { agentLoop, agentLoopContinue } from "@mariozechner/pi-agent-core";
+import { agentLoop, agentLoopContinue } from "@earendil-works/pi-agent-core";
const context: AgentContext = {
systemPrompt: "You are helpful.",
diff --git a/packages/agent/package.json b/packages/agent/package.json
index b42162b37..853b8180e 100644
--- a/packages/agent/package.json
+++ b/packages/agent/package.json
@@ -1,6 +1,6 @@
{
- "name": "@mariozechner/pi-agent-core",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-agent-core",
+ "version": "0.74.0",
"description": "General-purpose agent with transport abstraction, state management, and attachment support",
"type": "module",
"main": "./dist/index.js",
@@ -17,7 +17,7 @@
"prepublishOnly": "npm run clean && npm run build"
},
"dependencies": {
- "@mariozechner/pi-ai": "^0.73.0",
+ "@earendil-works/pi-ai": "^0.74.0",
"ignore": "^7.0.5",
"typebox": "^1.1.24",
"yaml": "^2.8.2"
@@ -33,7 +33,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "git+https://github.com/badlogic/pi-mono.git",
+ "url": "git+https://github.com/earendil-works/pi-mono.git",
"directory": "packages/agent"
},
"engines": {
diff --git a/packages/agent/src/agent-loop.ts b/packages/agent/src/agent-loop.ts
index 23af04df3..958aad151 100644
--- a/packages/agent/src/agent-loop.ts
+++ b/packages/agent/src/agent-loop.ts
@@ -10,7 +10,7 @@ import {
streamSimple,
type ToolResultMessage,
validateToolArguments,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import type {
AgentContext,
AgentEvent,
diff --git a/packages/agent/src/agent.ts b/packages/agent/src/agent.ts
index bffc88c77..12aa59111 100644
--- a/packages/agent/src/agent.ts
+++ b/packages/agent/src/agent.ts
@@ -7,7 +7,7 @@ import {
type TextContent,
type ThinkingBudgets,
type Transport,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { runAgentLoop, runAgentLoopContinue } from "./agent-loop.js";
import type {
AfterToolCallContext,
diff --git a/packages/agent/src/harness/agent-harness.ts b/packages/agent/src/harness/agent-harness.ts
index 4c042e1f6..f5e2b29f7 100644
--- a/packages/agent/src/harness/agent-harness.ts
+++ b/packages/agent/src/harness/agent-harness.ts
@@ -1,5 +1,5 @@
import { randomUUID } from "node:crypto";
-import type { AssistantMessage, ImageContent, Model } from "@mariozechner/pi-ai";
+import type { AssistantMessage, ImageContent, Model } from "@earendil-works/pi-ai";
import { Agent } from "../agent.js";
import type { AgentEvent, AgentMessage, AgentTool, ThinkingLevel } from "../types.js";
import { collectEntriesForBranchSummary, generateBranchSummary } from "./compaction/branch-summarization.js";
diff --git a/packages/agent/src/harness/compaction/branch-summarization.ts b/packages/agent/src/harness/compaction/branch-summarization.ts
index b1ff6fdfd..e44bf4580 100644
--- a/packages/agent/src/harness/compaction/branch-summarization.ts
+++ b/packages/agent/src/harness/compaction/branch-summarization.ts
@@ -5,8 +5,8 @@
* a summary of the branch being left so context isn't lost.
*/
-import type { ImageContent, Model, TextContent } from "@mariozechner/pi-ai";
-import { completeSimple } from "@mariozechner/pi-ai";
+import type { ImageContent, Model, TextContent } from "@earendil-works/pi-ai";
+import { completeSimple } from "@earendil-works/pi-ai";
import type { AgentMessage } from "../../types.js";
import {
convertToLlm,
diff --git a/packages/agent/src/harness/compaction/compaction.ts b/packages/agent/src/harness/compaction/compaction.ts
index 9ba9ac014..0776222b6 100644
--- a/packages/agent/src/harness/compaction/compaction.ts
+++ b/packages/agent/src/harness/compaction/compaction.ts
@@ -5,8 +5,8 @@
* and after compaction the session is reloaded.
*/
-import type { AssistantMessage, ImageContent, Model, TextContent, Usage } from "@mariozechner/pi-ai";
-import { completeSimple } from "@mariozechner/pi-ai";
+import type { AssistantMessage, ImageContent, Model, TextContent, Usage } from "@earendil-works/pi-ai";
+import { completeSimple } from "@earendil-works/pi-ai";
import type { AgentMessage, ThinkingLevel } from "../../types.js";
import {
convertToLlm,
diff --git a/packages/agent/src/harness/compaction/utils.ts b/packages/agent/src/harness/compaction/utils.ts
index a3aacd57c..35cd1938b 100644
--- a/packages/agent/src/harness/compaction/utils.ts
+++ b/packages/agent/src/harness/compaction/utils.ts
@@ -2,7 +2,7 @@
* Shared utilities for compaction and branch summarization.
*/
-import type { Message } from "@mariozechner/pi-ai";
+import type { Message } from "@earendil-works/pi-ai";
import type { AgentMessage } from "../../types.js";
// ============================================================================
diff --git a/packages/agent/src/harness/messages.ts b/packages/agent/src/harness/messages.ts
index 131ff5306..615bf1e42 100644
--- a/packages/agent/src/harness/messages.ts
+++ b/packages/agent/src/harness/messages.ts
@@ -1,4 +1,4 @@
-import type { ImageContent, Message, TextContent } from "@mariozechner/pi-ai";
+import type { ImageContent, Message, TextContent } from "@earendil-works/pi-ai";
import type { AgentMessage } from "../types.js";
export const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:
diff --git a/packages/agent/src/harness/session/session.ts b/packages/agent/src/harness/session/session.ts
index 889c6b58c..f0b42ecf8 100644
--- a/packages/agent/src/harness/session/session.ts
+++ b/packages/agent/src/harness/session/session.ts
@@ -1,4 +1,4 @@
-import type { ImageContent, TextContent } from "@mariozechner/pi-ai";
+import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
import type { AgentMessage } from "../../types.js";
import { createBranchSummaryMessage, createCompactionSummaryMessage, createCustomMessage } from "../messages.js";
import type {
diff --git a/packages/agent/src/harness/types.ts b/packages/agent/src/harness/types.ts
index ea222d979..c9a3bb6fc 100644
--- a/packages/agent/src/harness/types.ts
+++ b/packages/agent/src/harness/types.ts
@@ -1,4 +1,4 @@
-import type { ImageContent, Model, TextContent } from "@mariozechner/pi-ai";
+import type { ImageContent, Model, TextContent } from "@earendil-works/pi-ai";
import type { AgentEvent, AgentMessage, AgentTool, ThinkingLevel } from "../index.js";
import type { Session } from "./session/session.js";
diff --git a/packages/agent/src/proxy.ts b/packages/agent/src/proxy.ts
index a7830477c..5f0925c91 100644
--- a/packages/agent/src/proxy.ts
+++ b/packages/agent/src/proxy.ts
@@ -14,7 +14,7 @@ import {
type SimpleStreamOptions,
type StopReason,
type ToolCall,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
// Create stream class matching ProxyMessageEventStream
class ProxyMessageEventStream extends EventStream {
diff --git a/packages/agent/src/types.ts b/packages/agent/src/types.ts
index f7704b107..24b12e83b 100644
--- a/packages/agent/src/types.ts
+++ b/packages/agent/src/types.ts
@@ -9,7 +9,7 @@ import type {
TextContent,
Tool,
ToolResultMessage,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import type { Static, TSchema } from "typebox";
/**
@@ -250,7 +250,7 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
/**
* Thinking/reasoning level for models that support it.
* Note: "xhigh" is only supported by selected model families. Use model thinking-level metadata
- * from @mariozechner/pi-ai to detect support for a concrete model.
+ * from @earendil-works/pi-ai to detect support for a concrete model.
*/
export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
diff --git a/packages/agent/test/agent-loop.test.ts b/packages/agent/test/agent-loop.test.ts
index fd5ea73fa..26c4fcf76 100644
--- a/packages/agent/test/agent-loop.test.ts
+++ b/packages/agent/test/agent-loop.test.ts
@@ -5,7 +5,7 @@ import {
type Message,
type Model,
type UserMessage,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { describe, expect, it } from "vitest";
import { agentLoop, agentLoopContinue } from "../src/agent-loop.js";
diff --git a/packages/agent/test/agent.test.ts b/packages/agent/test/agent.test.ts
index bd59a41b5..9c38ae8c1 100644
--- a/packages/agent/test/agent.test.ts
+++ b/packages/agent/test/agent.test.ts
@@ -1,4 +1,4 @@
-import { type AssistantMessage, type AssistantMessageEvent, EventStream, getModel } from "@mariozechner/pi-ai";
+import { type AssistantMessage, type AssistantMessageEvent, EventStream, getModel } from "@earendil-works/pi-ai";
import { describe, expect, it } from "vitest";
import { Agent } from "../src/index.js";
diff --git a/packages/agent/test/e2e.test.ts b/packages/agent/test/e2e.test.ts
index f032555e2..b75645b06 100644
--- a/packages/agent/test/e2e.test.ts
+++ b/packages/agent/test/e2e.test.ts
@@ -9,7 +9,7 @@ import {
registerFauxProvider,
type ToolResultMessage,
type UserMessage,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it } from "vitest";
import { Agent, type AgentEvent } from "../src/index.js";
import { calculateTool } from "./utils/calculate.js";
diff --git a/packages/agent/test/harness/compaction.test.ts b/packages/agent/test/harness/compaction.test.ts
index 40585766e..d73517f07 100644
--- a/packages/agent/test/harness/compaction.test.ts
+++ b/packages/agent/test/harness/compaction.test.ts
@@ -5,7 +5,7 @@ import {
type Model,
registerFauxProvider,
type Usage,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import {
calculateContextTokens,
diff --git a/packages/agent/test/harness/factory.test.ts b/packages/agent/test/harness/factory.test.ts
index 6faa134e8..cac0e882e 100644
--- a/packages/agent/test/harness/factory.test.ts
+++ b/packages/agent/test/harness/factory.test.ts
@@ -1,4 +1,4 @@
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { describe, expect, it } from "vitest";
import { NodeExecutionEnv } from "../../src/harness/execution-env.js";
import { createAgentHarness, createSession } from "../../src/harness/factory.js";
diff --git a/packages/agent/test/harness/session-test-utils.ts b/packages/agent/test/harness/session-test-utils.ts
index b15319186..9a4f55a01 100644
--- a/packages/agent/test/harness/session-test-utils.ts
+++ b/packages/agent/test/harness/session-test-utils.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
import { afterEach } from "vitest";
export function createUserMessage(text: string): AgentMessage {
diff --git a/packages/agent/test/scratch/simple.ts b/packages/agent/test/scratch/simple.ts
index 4fb80d18f..01cec2ecf 100644
--- a/packages/agent/test/scratch/simple.ts
+++ b/packages/agent/test/scratch/simple.ts
@@ -1,6 +1,6 @@
import { homedir } from "node:os";
import { join } from "node:path";
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { InMemorySessionStorage } from "../../src/harness/session/storage/memory.js";
import {
createAgentHarness,
diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md
index aecc4c551..de94a9c3d 100644
--- a/packages/ai/CHANGELOG.md
+++ b/packages/ai/CHANGELOG.md
@@ -4,8 +4,23 @@
### Fixed
+- Fixed OpenAI Responses requests for models that support disabling reasoning to send `reasoning.effort: "none"` when thinking is off.
+
+## [0.74.0] - 2026-05-07
+
+## [0.73.1] - 2026-05-07
+
+### Added
+
+- Added OAuth login flow metadata so clients can present interactive provider choices during login ([#4190](https://github.com/earendil-works/pi-mono/pull/4190) by [@mitsuhiko](https://github.com/mitsuhiko)).
+
+### Fixed
+
- Fixed OpenAI Responses reasoning text streaming for LM Studio and other compatible providers that emit `response.reasoning_text.delta` events ([#4191](https://github.com/badlogic/pi-mono/pull/4191) by [@yaanfpv](https://github.com/yaanfpv)).
- Fixed OpenAI Codex OAuth refresh failures writing directly to stderr while the TUI is active ([#4141](https://github.com/badlogic/pi-mono/issues/4141)).
+- Fixed OpenAI-compatible chat completion streams that interleave content and tool-call deltas in the same choice.
+- Fixed the Kimi K2 P6 model alias to normalize to `kimi-for-coding` ([#4218](https://github.com/earendil-works/pi-mono/issues/4218)).
+- Fixed OpenAI Codex Responses requests to send a non-empty system prompt ([#4184](https://github.com/earendil-works/pi-mono/issues/4184)).
## [0.73.0] - 2026-05-04
diff --git a/packages/ai/README.md b/packages/ai/README.md
index df8136a4e..6bed1bbb6 100644
--- a/packages/ai/README.md
+++ b/packages/ai/README.md
@@ -1,4 +1,4 @@
-# @mariozechner/pi-ai
+# @earendil-works/pi-ai
Unified LLM API with automatic model discovery, provider configuration, token and cost tracking, and simple context persistence and hand-off to other models mid-session.
@@ -75,15 +75,15 @@ Unified LLM API with automatic model discovery, provider configuration, token an
## Installation
```bash
-npm install @mariozechner/pi-ai
+npm install @earendil-works/pi-ai
```
-TypeBox exports are re-exported from `@mariozechner/pi-ai`: `Type`, `Static`, and `TSchema`.
+TypeBox exports are re-exported from `@earendil-works/pi-ai`: `Type`, `Static`, and `TSchema`.
## Quick Start
```typescript
-import { Type, getModel, stream, complete, Context, Tool, StringEnum } from '@mariozechner/pi-ai';
+import { Type, getModel, stream, complete, Context, Tool, StringEnum } from '@earendil-works/pi-ai';
// Fully typed with auto-complete support for both providers and models
const model = getModel('openai', 'gpt-4o-mini');
@@ -209,7 +209,7 @@ Tools enable LLMs to interact with external systems. This library uses TypeBox s
### Defining Tools
```typescript
-import { Type, Tool, StringEnum } from '@mariozechner/pi-ai';
+import { Type, Tool, StringEnum } from '@earendil-works/pi-ai';
// Define tool parameters with TypeBox
const weatherTool: Tool = {
@@ -335,7 +335,7 @@ When using `agentLoop`, tool arguments are automatically validated against your
When implementing your own tool execution loop with `stream()` or `complete()`, use `validateToolCall` to validate arguments before passing them to your tools:
```typescript
-import { stream, validateToolCall, Tool } from '@mariozechner/pi-ai';
+import { stream, validateToolCall, Tool } from '@earendil-works/pi-ai';
const tools: Tool[] = [weatherTool, calculatorTool];
const s = stream(model, { messages, tools });
@@ -391,7 +391,7 @@ Models with vision capabilities can process images. You can check if a model sup
```typescript
import { readFileSync } from 'fs';
-import { getModel, complete } from '@mariozechner/pi-ai';
+import { getModel, complete } from '@earendil-works/pi-ai';
const model = getModel('openai', 'gpt-4o-mini');
@@ -428,7 +428,7 @@ Many models support thinking/reasoning capabilities where they can show their in
### Unified Interface (streamSimple/completeSimple)
```typescript
-import { getModel, streamSimple, completeSimple } from '@mariozechner/pi-ai';
+import { getModel, streamSimple, completeSimple } from '@earendil-works/pi-ai';
// Many models across providers support thinking/reasoning
const model = getModel('anthropic', 'claude-sonnet-4-20250514');
@@ -466,7 +466,7 @@ for (const block of response.content) {
For fine-grained control, use the provider-specific options:
```typescript
-import { getModel, complete } from '@mariozechner/pi-ai';
+import { getModel, complete } from '@earendil-works/pi-ai';
// OpenAI Reasoning (o1, o3, gpt-5)
const openaiModel = getModel('openai', 'gpt-5-mini');
@@ -555,7 +555,7 @@ if (message.stopReason === 'error' || message.stopReason === 'aborted') {
The abort signal allows you to cancel in-progress requests. Aborted requests have `stopReason === 'aborted'`:
```typescript
-import { getModel, stream } from '@mariozechner/pi-ai';
+import { getModel, stream } from '@earendil-works/pi-ai';
const model = getModel('openai', 'gpt-4o-mini');
const controller = new AbortController();
@@ -653,7 +653,7 @@ import {
fauxToolCall,
registerFauxProvider,
stream,
-} from '@mariozechner/pi-ai';
+} from '@earendil-works/pi-ai';
const registration = registerFauxProvider({
tokensPerSecond: 50 // optional
@@ -738,7 +738,7 @@ A **provider** offers models through a specific API. For example:
### Querying Providers and Models
```typescript
-import { getProviders, getModels, getModel } from '@mariozechner/pi-ai';
+import { getProviders, getModels, getModel } from '@earendil-works/pi-ai';
// Get all available providers
const providers = getProviders();
@@ -764,7 +764,7 @@ console.log(`Using ${model.name} via ${model.api} API`);
You can create custom models for local inference servers or custom endpoints:
```typescript
-import { Model, stream } from '@mariozechner/pi-ai';
+import { Model, stream } from '@earendil-works/pi-ai';
// Example: Ollama using OpenAI-compatible API
const ollamaModel: Model<'openai-completions'> = {
@@ -892,7 +892,7 @@ If `compat` is not set, the library falls back to URL-based detection. If `compa
Models are typed by their API, which keeps the model metadata accurate. Provider-specific option types are enforced when you call the provider functions directly. The generic `stream` and `complete` functions accept `StreamOptions` with additional provider fields.
```typescript
-import { streamAnthropic, type AnthropicOptions } from '@mariozechner/pi-ai';
+import { streamAnthropic, type AnthropicOptions } from '@earendil-works/pi-ai';
// TypeScript knows this is an Anthropic model
const claude = getModel('anthropic', 'claude-sonnet-4-20250514');
@@ -921,7 +921,7 @@ When messages from one provider are sent to a different provider, the library au
### Example: Multi-Provider Conversation
```typescript
-import { getModel, complete, Context } from '@mariozechner/pi-ai';
+import { getModel, complete, Context } from '@earendil-works/pi-ai';
// Start with Claude
const claude = getModel('anthropic', 'claude-sonnet-4-20250514');
@@ -966,7 +966,7 @@ This enables flexible workflows where you can:
The `Context` object can be easily serialized and deserialized using standard JSON methods, making it simple to persist conversations, implement chat history, or transfer contexts between services:
```typescript
-import { Context, getModel, complete } from '@mariozechner/pi-ai';
+import { Context, getModel, complete } from '@earendil-works/pi-ai';
// Create and use a context
const context: Context = {
@@ -1003,7 +1003,7 @@ const continuation = await complete(newModel, restored);
The library supports browser environments. You must pass the API key explicitly since environment variables are not available in browsers:
```typescript
-import { getModel, complete } from '@mariozechner/pi-ai';
+import { getModel, complete } from '@earendil-works/pi-ai';
// API key must be passed explicitly in browser
const model = getModel('anthropic', 'claude-3-5-haiku-20241022');
@@ -1020,7 +1020,7 @@ const response = await complete(model, {
### Browser Compatibility Notes
- Amazon Bedrock (`bedrock-converse-stream`) is not supported in browser environments.
-- OAuth login flows are not supported in browser environments. Use the `@mariozechner/pi-ai/oauth` entry point in Node.js.
+- OAuth login flows are not supported in browser environments. Use the `@earendil-works/pi-ai/oauth` entry point in Node.js.
- In browser builds, Bedrock can still appear in model lists. Calls to Bedrock models fail at runtime.
- Use a server-side proxy or backend service if you need Bedrock or OAuth-based auth from a web app.
@@ -1071,7 +1071,7 @@ const response = await complete(model, context, {
### Checking Environment Variables
```typescript
-import { getEnvApiKey } from '@mariozechner/pi-ai';
+import { getEnvApiKey } from '@earendil-works/pi-ai';
// Check if an API key is set in environment variables
const key = getEnvApiKey('openai'); // checks OPENAI_API_KEY
@@ -1110,7 +1110,7 @@ export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
```
```typescript
-import { getModel, complete } from '@mariozechner/pi-ai';
+import { getModel, complete } from '@earendil-works/pi-ai';
(async () => {
const model = getModel('google-vertex', 'gemini-2.5-flash');
@@ -1133,16 +1133,16 @@ Official docs: [Application Default Credentials](https://cloud.google.com/docs/a
The quickest way to authenticate:
```bash
-npx @mariozechner/pi-ai login # interactive provider selection
-npx @mariozechner/pi-ai login anthropic # login to specific provider
-npx @mariozechner/pi-ai list # list available providers
+npx @earendil-works/pi-ai login # interactive provider selection
+npx @earendil-works/pi-ai login anthropic # login to specific provider
+npx @earendil-works/pi-ai list # list available providers
```
Credentials are saved to `auth.json` in the current directory.
### Programmatic OAuth
-The library provides login and token refresh functions via the `@mariozechner/pi-ai/oauth` entry point. Credential storage is the caller's responsibility.
+The library provides login and token refresh functions via the `@earendil-works/pi-ai/oauth` entry point. Credential storage is the caller's responsibility.
```typescript
import {
@@ -1159,13 +1159,13 @@ import {
// Types
type OAuthProvider,
type OAuthCredentials,
-} from '@mariozechner/pi-ai/oauth';
+} from '@earendil-works/pi-ai/oauth';
```
### Login Flow Example
```typescript
-import { loginGitHubCopilot } from '@mariozechner/pi-ai/oauth';
+import { loginGitHubCopilot } from '@earendil-works/pi-ai/oauth';
import { writeFileSync } from 'fs';
const credentials = await loginGitHubCopilot({
@@ -1189,8 +1189,8 @@ writeFileSync('auth.json', JSON.stringify(auth, null, 2));
Use `getOAuthApiKey()` to get an API key, automatically refreshing if expired:
```typescript
-import { getModel, complete } from '@mariozechner/pi-ai';
-import { getOAuthApiKey } from '@mariozechner/pi-ai/oauth';
+import { getModel, complete } from '@earendil-works/pi-ai';
+import { getOAuthApiKey } from '@earendil-works/pi-ai/oauth';
import { readFileSync, writeFileSync } from 'fs';
// Load your stored credentials
@@ -1247,7 +1247,7 @@ Create a new provider file (for example `amazon-bedrock.ts`) that exports:
- Register the API with `registerApiProvider()`
- Add a package subpath export in `package.json` for the provider module (`./dist/providers/.js`)
- Add lazy loader wrappers in `src/providers/register-builtins.ts`, do not statically import provider implementation modules there
-- Add any root-level `export type` re-exports in `src/index.ts` that should remain available from `@mariozechner/pi-ai`
+- Add any root-level `export type` re-exports in `src/index.ts` that should remain available from `@earendil-works/pi-ai`
- Add credential detection in `env-api-keys.ts` for the new provider
- Ensure `streamSimple` handles auth lookup via `getEnvApiKey()` or provider-specific auth
diff --git a/packages/ai/package.json b/packages/ai/package.json
index f05b48cf6..79c8dc3c3 100644
--- a/packages/ai/package.json
+++ b/packages/ai/package.json
@@ -1,6 +1,6 @@
{
- "name": "@mariozechner/pi-ai",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-ai",
+ "version": "0.74.0",
"description": "Unified LLM API with automatic model discovery and provider configuration",
"type": "module",
"main": "./dist/index.js",
@@ -94,7 +94,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "git+https://github.com/badlogic/pi-mono.git",
+ "url": "git+https://github.com/earendil-works/pi-mono.git",
"directory": "packages/ai"
},
"engines": {
diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts
index ab4cdd19c..7ca0e4107 100644
--- a/packages/ai/scripts/generate-models.ts
+++ b/packages/ai/scripts/generate-models.ts
@@ -86,6 +86,16 @@ const DEEPSEEK_V4_THINKING_LEVEL_MAP = {
xhigh: "max",
} as const;
+const OPENAI_RESPONSES_NONE_REASONING_MODELS = new Set([
+ "gpt-5.1",
+ "gpt-5.2",
+ "gpt-5.3-codex",
+ "gpt-5.4",
+ "gpt-5.4-mini",
+ "gpt-5.4-nano",
+ "gpt-5.5",
+]);
+
function mergeThinkingLevelMap(model: Model, map: NonNullable["thinkingLevelMap"]>): void {
model.thinkingLevelMap = { ...model.thinkingLevelMap, ...map };
}
@@ -122,6 +132,13 @@ function applyThinkingLevelMetadata(model: Model): void {
) {
mergeThinkingLevelMap(model, { off: null });
}
+ if (
+ model.api === "openai-responses" &&
+ model.provider === "openai" &&
+ OPENAI_RESPONSES_NONE_REASONING_MODELS.has(model.id)
+ ) {
+ mergeThinkingLevelMap(model, { off: "none" });
+ }
if (supportsOpenAiXhigh(model.id)) {
mergeThinkingLevelMap(model, { xhigh: "xhigh" });
}
diff --git a/packages/ai/src/cli.ts b/packages/ai/src/cli.ts
index 12f3f2049..7a4ff1fd3 100644
--- a/packages/ai/src/cli.ts
+++ b/packages/ai/src/cli.ts
@@ -64,7 +64,7 @@ async function main(): Promise {
if (!command || command === "help" || command === "--help" || command === "-h") {
const providerList = PROVIDERS.map((p) => ` ${p.id.padEnd(20)} ${p.name}`).join("\n");
- console.log(`Usage: npx @mariozechner/pi-ai [provider]
+ console.log(`Usage: npx @earendil-works/pi-ai [provider]
Commands:
login [provider] Login to an OAuth provider
@@ -74,9 +74,9 @@ Providers:
${providerList}
Examples:
- npx @mariozechner/pi-ai login # interactive provider selection
- npx @mariozechner/pi-ai login anthropic # login to specific provider
- npx @mariozechner/pi-ai list # list providers
+ npx @earendil-works/pi-ai login # interactive provider selection
+ npx @earendil-works/pi-ai login anthropic # login to specific provider
+ npx @earendil-works/pi-ai list # list providers
`);
return;
}
@@ -113,7 +113,7 @@ Examples:
if (!PROVIDERS.some((p) => p.id === provider)) {
console.error(`Unknown provider: ${provider}`);
- console.error(`Use 'npx @mariozechner/pi-ai list' to see available providers`);
+ console.error(`Use 'npx @earendil-works/pi-ai list' to see available providers`);
process.exit(1);
}
@@ -123,7 +123,7 @@ Examples:
}
console.error(`Unknown command: ${command}`);
- console.error(`Use 'npx @mariozechner/pi-ai --help' for usage`);
+ console.error(`Use 'npx @earendil-works/pi-ai --help' for usage`);
process.exit(1);
}
diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts
index abca6a234..9ad5d97b5 100644
--- a/packages/ai/src/models.generated.ts
+++ b/packages/ai/src/models.generated.ts
@@ -4708,6 +4708,24 @@ export const MODELS = {
contextWindow: 1000000,
maxTokens: 64000,
} satisfies Model<"google-generative-ai">,
+ "gemini-3.1-flash-lite": {
+ id: "gemini-3.1-flash-lite",
+ name: "Gemini 3.1 Flash Lite",
+ api: "google-generative-ai",
+ provider: "google",
+ baseUrl: "https://generativelanguage.googleapis.com/v1beta",
+ reasoning: true,
+ thinkingLevelMap: {"off":null},
+ input: ["text", "image"],
+ cost: {
+ input: 0.25,
+ output: 1.5,
+ cacheRead: 0.025,
+ cacheWrite: 1,
+ },
+ contextWindow: 1048576,
+ maxTokens: 65536,
+ } satisfies Model<"google-generative-ai">,
"gemini-3.1-flash-lite-preview": {
id: "gemini-3.1-flash-lite-preview",
name: "Gemini 3.1 Flash Lite Preview",
@@ -6948,7 +6966,7 @@ export const MODELS = {
provider: "openai",
baseUrl: "https://api.openai.com/v1",
reasoning: true,
- thinkingLevelMap: {"off":null},
+ thinkingLevelMap: {"off":"none"},
input: ["text", "image"],
cost: {
input: 1.25,
@@ -7038,7 +7056,7 @@ export const MODELS = {
provider: "openai",
baseUrl: "https://api.openai.com/v1",
reasoning: true,
- thinkingLevelMap: {"off":null,"xhigh":"xhigh"},
+ thinkingLevelMap: {"off":"none","xhigh":"xhigh"},
input: ["text", "image"],
cost: {
input: 1.75,
@@ -7128,7 +7146,7 @@ export const MODELS = {
provider: "openai",
baseUrl: "https://api.openai.com/v1",
reasoning: true,
- thinkingLevelMap: {"off":null,"xhigh":"xhigh"},
+ thinkingLevelMap: {"off":"none","xhigh":"xhigh"},
input: ["text", "image"],
cost: {
input: 1.75,
@@ -7164,7 +7182,7 @@ export const MODELS = {
provider: "openai",
baseUrl: "https://api.openai.com/v1",
reasoning: true,
- thinkingLevelMap: {"off":null,"xhigh":"xhigh"},
+ thinkingLevelMap: {"off":"none","xhigh":"xhigh"},
input: ["text", "image"],
cost: {
input: 2.5,
@@ -7182,7 +7200,7 @@ export const MODELS = {
provider: "openai",
baseUrl: "https://api.openai.com/v1",
reasoning: true,
- thinkingLevelMap: {"off":null,"xhigh":"xhigh"},
+ thinkingLevelMap: {"off":"none","xhigh":"xhigh"},
input: ["text", "image"],
cost: {
input: 0.75,
@@ -7200,7 +7218,7 @@ export const MODELS = {
provider: "openai",
baseUrl: "https://api.openai.com/v1",
reasoning: true,
- thinkingLevelMap: {"off":null,"xhigh":"xhigh"},
+ thinkingLevelMap: {"off":"none","xhigh":"xhigh"},
input: ["text", "image"],
cost: {
input: 0.2,
@@ -7236,7 +7254,7 @@ export const MODELS = {
provider: "openai",
baseUrl: "https://api.openai.com/v1",
reasoning: true,
- thinkingLevelMap: {"off":null,"xhigh":"xhigh"},
+ thinkingLevelMap: {"off":"none","xhigh":"xhigh"},
input: ["text", "image"],
cost: {
input: 5,
@@ -7586,9 +7604,9 @@ export const MODELS = {
"big-pickle": {
id: "big-pickle",
name: "Big Pickle",
- api: "anthropic-messages",
+ api: "openai-completions",
provider: "opencode",
- baseUrl: "https://opencode.ai/zen",
+ baseUrl: "https://opencode.ai/zen/v1",
reasoning: true,
input: ["text"],
cost: {
@@ -7599,7 +7617,7 @@ export const MODELS = {
},
contextWindow: 200000,
maxTokens: 128000,
- } satisfies Model<"anthropic-messages">,
+ } satisfies Model<"openai-completions">,
"claude-haiku-4-5": {
id: "claude-haiku-4-5",
name: "Claude Haiku 4.5",
@@ -7854,9 +7872,9 @@ export const MODELS = {
thinkingLevelMap: {"off":null},
input: ["text", "image"],
cost: {
- input: 0,
- output: 0,
- cacheRead: 0,
+ input: 0.05,
+ output: 0.4,
+ cacheRead: 0.005,
cacheWrite: 0,
},
contextWindow: 400000,
@@ -8342,55 +8360,21 @@ export const MODELS = {
} satisfies Model<"openai-completions">,
"kimi-k2.6": {
id: "kimi-k2.6",
- name: "Kimi K2.6 (3x limits)",
+ name: "Kimi K2.6",
api: "openai-completions",
provider: "opencode-go",
baseUrl: "https://opencode.ai/zen/go/v1",
reasoning: true,
input: ["text", "image"],
cost: {
- input: 0.32,
- output: 1.34,
- cacheRead: 0.054,
+ input: 0.95,
+ output: 4,
+ cacheRead: 0.16,
cacheWrite: 0,
},
contextWindow: 262144,
maxTokens: 65536,
} satisfies Model<"openai-completions">,
- "mimo-v2-omni": {
- id: "mimo-v2-omni",
- name: "MiMo V2 Omni",
- api: "openai-completions",
- provider: "opencode-go",
- baseUrl: "https://opencode.ai/zen/go/v1",
- reasoning: true,
- input: ["text", "image"],
- cost: {
- input: 0.4,
- output: 2,
- cacheRead: 0.08,
- cacheWrite: 0,
- },
- contextWindow: 262144,
- maxTokens: 128000,
- } satisfies Model<"openai-completions">,
- "mimo-v2-pro": {
- id: "mimo-v2-pro",
- name: "MiMo V2 Pro",
- api: "openai-completions",
- provider: "opencode-go",
- baseUrl: "https://opencode.ai/zen/go/v1",
- reasoning: true,
- input: ["text"],
- cost: {
- input: 1,
- output: 3,
- cacheRead: 0.2,
- cacheWrite: 0,
- },
- contextWindow: 1048576,
- maxTokens: 128000,
- } satisfies Model<"openai-completions">,
"mimo-v2.5": {
id: "mimo-v2.5",
name: "MiMo V2.5",
@@ -8531,23 +8515,6 @@ export const MODELS = {
contextWindow: 131072,
maxTokens: 131072,
} satisfies Model<"openai-completions">,
- "allenai/olmo-3.1-32b-instruct": {
- id: "allenai/olmo-3.1-32b-instruct",
- name: "AllenAI: Olmo 3.1 32B Instruct",
- api: "openai-completions",
- provider: "openrouter",
- baseUrl: "https://openrouter.ai/api/v1",
- reasoning: false,
- input: ["text"],
- cost: {
- input: 0.19999999999999998,
- output: 0.6,
- cacheRead: 0,
- cacheWrite: 0,
- },
- contextWindow: 65536,
- maxTokens: 16384,
- } satisfies Model<"openai-completions">,
"amazon/nova-2-lite-v1": {
id: "amazon/nova-2-lite-v1",
name: "Amazon: Nova 2 Lite",
@@ -8682,7 +8649,7 @@ export const MODELS = {
cacheWrite: 3.75,
},
contextWindow: 200000,
- maxTokens: 128000,
+ maxTokens: 64000,
} satisfies Model<"openai-completions">,
"anthropic/claude-3.7-sonnet:thinking": {
id: "anthropic/claude-3.7-sonnet:thinking",
@@ -8959,6 +8926,23 @@ export const MODELS = {
contextWindow: 2000000,
maxTokens: 30000,
} satisfies Model<"openai-completions">,
+ "baidu/cobuddy:free": {
+ id: "baidu/cobuddy:free",
+ name: "Baidu Qianfan: CoBuddy (free)",
+ api: "openai-completions",
+ provider: "openrouter",
+ baseUrl: "https://openrouter.ai/api/v1",
+ reasoning: true,
+ input: ["text"],
+ cost: {
+ input: 0,
+ output: 0,
+ cacheRead: 0,
+ cacheWrite: 0,
+ },
+ contextWindow: 131072,
+ maxTokens: 65536,
+ } satisfies Model<"openai-completions">,
"baidu/ernie-4.5-21b-a3b": {
id: "baidu/ernie-4.5-21b-a3b",
name: "Baidu: ERNIE 4.5 21B A3B",
@@ -9261,13 +9245,13 @@ export const MODELS = {
thinkingLevelMap: {"minimal":null,"low":null,"medium":null,"high":"high","xhigh":"max"},
input: ["text"],
cost: {
- input: 0,
- output: 0,
- cacheRead: 0,
+ input: 0.435,
+ output: 0.87,
+ cacheRead: 0.003625,
cacheWrite: 0,
},
- contextWindow: 131000,
- maxTokens: 131000,
+ contextWindow: 1048576,
+ maxTokens: 384000,
} satisfies Model<"openai-completions">,
"essentialai/rnj-1-instruct": {
id: "essentialai/rnj-1-instruct",
@@ -9439,6 +9423,23 @@ export const MODELS = {
contextWindow: 1048576,
maxTokens: 65536,
} satisfies Model<"openai-completions">,
+ "google/gemini-3.1-flash-lite": {
+ id: "google/gemini-3.1-flash-lite",
+ name: "Google: Gemini 3.1 Flash Lite",
+ api: "openai-completions",
+ provider: "openrouter",
+ baseUrl: "https://openrouter.ai/api/v1",
+ reasoning: true,
+ input: ["text", "image"],
+ cost: {
+ input: 0.25,
+ output: 1.5,
+ cacheRead: 0.024999999999999998,
+ cacheWrite: 0.08333333333333334,
+ },
+ contextWindow: 1048576,
+ maxTokens: 65536,
+ } satisfies Model<"openai-completions">,
"google/gemini-3.1-flash-lite-preview": {
id: "google/gemini-3.1-flash-lite-preview",
name: "Google: Gemini 3.1 Flash Lite Preview",
@@ -9626,18 +9627,18 @@ export const MODELS = {
contextWindow: 128000,
maxTokens: 50000,
} satisfies Model<"openai-completions">,
- "inclusionai/ling-2.6-1t:free": {
- id: "inclusionai/ling-2.6-1t:free",
- name: "inclusionAI: Ling-2.6-1T (free)",
+ "inclusionai/ling-2.6-1t": {
+ id: "inclusionai/ling-2.6-1t",
+ name: "inclusionAI: Ling-2.6-1T",
api: "openai-completions",
provider: "openrouter",
baseUrl: "https://openrouter.ai/api/v1",
reasoning: false,
input: ["text"],
cost: {
- input: 0,
- output: 0,
- cacheRead: 0,
+ input: 0.3,
+ output: 2.5,
+ cacheRead: 0.06,
cacheWrite: 0,
},
contextWindow: 262144,
@@ -9677,23 +9678,6 @@ export const MODELS = {
contextWindow: 256000,
maxTokens: 80000,
} satisfies Model<"openai-completions">,
- "meta-llama/llama-3-8b-instruct": {
- id: "meta-llama/llama-3-8b-instruct",
- name: "Meta: Llama 3 8B Instruct",
- api: "openai-completions",
- provider: "openrouter",
- baseUrl: "https://openrouter.ai/api/v1",
- reasoning: false,
- input: ["text"],
- cost: {
- input: 0.03,
- output: 0.04,
- cacheRead: 0,
- cacheWrite: 0,
- },
- contextWindow: 8192,
- maxTokens: 16384,
- } satisfies Model<"openai-completions">,
"meta-llama/llama-3.1-70b-instruct": {
id: "meta-llama/llama-3.1-70b-instruct",
name: "Meta: Llama 3.1 70B Instruct",
@@ -10085,6 +10069,23 @@ export const MODELS = {
contextWindow: 131072,
maxTokens: 4096,
} satisfies Model<"openai-completions">,
+ "mistralai/mistral-medium-3-5": {
+ id: "mistralai/mistral-medium-3-5",
+ name: "Mistral: Mistral Medium 3.5",
+ api: "openai-completions",
+ provider: "openrouter",
+ baseUrl: "https://openrouter.ai/api/v1",
+ reasoning: true,
+ input: ["text", "image"],
+ cost: {
+ input: 1.5,
+ output: 7.5,
+ cacheRead: 0,
+ cacheWrite: 0,
+ },
+ contextWindow: 262144,
+ maxTokens: 4096,
+ } satisfies Model<"openai-completions">,
"mistralai/mistral-medium-3.1": {
id: "mistralai/mistral-medium-3.1",
name: "Mistral: Mistral Medium 3.1",
@@ -10315,13 +10316,13 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 0.74,
- output: 3.49,
- cacheRead: 0.14,
+ input: 0.75,
+ output: 3.5,
+ cacheRead: 0.15,
cacheWrite: 0,
},
- contextWindow: 262142,
- maxTokens: 262142,
+ contextWindow: 262144,
+ maxTokens: 16384,
} satisfies Model<"openai-completions">,
"nex-agi/deepseek-v3.1-nex-n1": {
id: "nex-agi/deepseek-v3.1-nex-n1",
@@ -11236,6 +11237,23 @@ export const MODELS = {
contextWindow: 128000,
maxTokens: 16384,
} satisfies Model<"openai-completions">,
+ "openai/gpt-chat-latest": {
+ id: "openai/gpt-chat-latest",
+ name: "OpenAI: GPT Chat Latest",
+ api: "openai-completions",
+ provider: "openrouter",
+ baseUrl: "https://openrouter.ai/api/v1",
+ reasoning: false,
+ input: ["text", "image"],
+ cost: {
+ input: 5,
+ output: 30,
+ cacheRead: 0.5,
+ cacheWrite: 0,
+ },
+ contextWindow: 400000,
+ maxTokens: 128000,
+ } satisfies Model<"openai-completions">,
"openai/gpt-oss-120b": {
id: "openai/gpt-oss-120b",
name: "OpenAI: gpt-oss-120b",
@@ -11925,7 +11943,7 @@ export const MODELS = {
reasoning: false,
input: ["text"],
cost: {
- input: 0.12,
+ input: 0.11,
output: 0.7999999999999999,
cacheRead: 0.07,
cacheWrite: 0,
@@ -12214,13 +12232,13 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 0.15,
+ input: 0.14,
output: 1,
cacheRead: 0.049999999999999996,
cacheWrite: 0,
},
contextWindow: 262144,
- maxTokens: 262144,
+ maxTokens: 81920,
} satisfies Model<"openai-completions">,
"qwen/qwen3.5-397b-a17b": {
id: "qwen/qwen3.5-397b-a17b",
@@ -12248,13 +12266,13 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 0.09999999999999999,
+ input: 0.04,
output: 0.15,
cacheRead: 0,
cacheWrite: 0,
},
contextWindow: 262144,
- maxTokens: 4096,
+ maxTokens: 81920,
} satisfies Model<"openai-completions">,
"qwen/qwen3.5-flash-02-23": {
id: "qwen/qwen3.5-flash-02-23",
@@ -12985,7 +13003,7 @@ export const MODELS = {
cacheWrite: 0,
},
contextWindow: 202752,
- maxTokens: 16384,
+ maxTokens: 4096,
} satisfies Model<"openai-completions">,
"z-ai/glm-5-turbo": {
id: "z-ai/glm-5-turbo",
@@ -13132,13 +13150,13 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 0.74,
- output: 3.49,
- cacheRead: 0.14,
+ input: 0.75,
+ output: 3.5,
+ cacheRead: 0.15,
cacheWrite: 0,
},
- contextWindow: 262142,
- maxTokens: 262142,
+ contextWindow: 262144,
+ maxTokens: 16384,
} satisfies Model<"openai-completions">,
"~openai/gpt-latest": {
id: "~openai/gpt-latest",
@@ -14011,6 +14029,23 @@ export const MODELS = {
contextWindow: 1000000,
maxTokens: 64000,
} satisfies Model<"anthropic-messages">,
+ "google/gemini-3.1-flash-lite": {
+ id: "google/gemini-3.1-flash-lite",
+ name: "Gemini 3.1 Flash Lite",
+ api: "anthropic-messages",
+ provider: "vercel-ai-gateway",
+ baseUrl: "https://ai-gateway.vercel.sh",
+ reasoning: true,
+ input: ["text", "image"],
+ cost: {
+ input: 0.25,
+ output: 1.5,
+ cacheRead: 0.03,
+ cacheWrite: 0,
+ },
+ contextWindow: 1000000,
+ maxTokens: 65000,
+ } satisfies Model<"anthropic-messages">,
"google/gemini-3.1-flash-lite-preview": {
id: "google/gemini-3.1-flash-lite-preview",
name: "Gemini 3.1 Flash Lite Preview",
@@ -15528,8 +15563,8 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 2,
- output: 6,
+ input: 1.25,
+ output: 2.5,
cacheRead: 0.19999999999999998,
cacheWrite: 0,
},
@@ -15545,8 +15580,8 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 2,
- output: 6,
+ input: 1.25,
+ output: 2.5,
cacheRead: 0.19999999999999998,
cacheWrite: 0,
},
@@ -15562,8 +15597,8 @@ export const MODELS = {
reasoning: false,
input: ["text", "image"],
cost: {
- input: 2,
- output: 6,
+ input: 1.25,
+ output: 2.5,
cacheRead: 0.19999999999999998,
cacheWrite: 0,
},
@@ -15579,8 +15614,8 @@ export const MODELS = {
reasoning: false,
input: ["text", "image"],
cost: {
- input: 2,
- output: 6,
+ input: 1.25,
+ output: 2.5,
cacheRead: 0.19999999999999998,
cacheWrite: 0,
},
@@ -15596,8 +15631,8 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 2,
- output: 6,
+ input: 1.25,
+ output: 2.5,
cacheRead: 0.19999999999999998,
cacheWrite: 0,
},
@@ -15613,8 +15648,8 @@ export const MODELS = {
reasoning: true,
input: ["text", "image"],
cost: {
- input: 2,
- output: 6,
+ input: 1.25,
+ output: 2.5,
cacheRead: 0.19999999999999998,
cacheWrite: 0,
},
@@ -16387,8 +16422,8 @@ export const MODELS = {
cacheRead: 0.01,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 64000,
+ contextWindow: 262144,
+ maxTokens: 65536,
} satisfies Model<"anthropic-messages">,
"mimo-v2-omni": {
id: "mimo-v2-omni",
@@ -16404,8 +16439,8 @@ export const MODELS = {
cacheRead: 0.08,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 128000,
+ contextWindow: 262144,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2-pro": {
id: "mimo-v2-pro",
@@ -16421,8 +16456,8 @@ export const MODELS = {
cacheRead: 0.2,
cacheWrite: 0,
},
- contextWindow: 1000000,
- maxTokens: 128000,
+ contextWindow: 1048576,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2.5": {
id: "mimo-v2.5",
@@ -16431,7 +16466,7 @@ export const MODELS = {
provider: "xiaomi",
baseUrl: "https://api.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text"],
+ input: ["text", "image"],
cost: {
input: 0.4,
output: 2,
@@ -16448,7 +16483,7 @@ export const MODELS = {
provider: "xiaomi",
baseUrl: "https://api.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text", "image"],
+ input: ["text"],
cost: {
input: 1,
output: 3,
@@ -16474,8 +16509,8 @@ export const MODELS = {
cacheRead: 0.01,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 64000,
+ contextWindow: 262144,
+ maxTokens: 65536,
} satisfies Model<"anthropic-messages">,
"mimo-v2-omni": {
id: "mimo-v2-omni",
@@ -16491,8 +16526,8 @@ export const MODELS = {
cacheRead: 0.08,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 128000,
+ contextWindow: 262144,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2-pro": {
id: "mimo-v2-pro",
@@ -16508,8 +16543,8 @@ export const MODELS = {
cacheRead: 0.2,
cacheWrite: 0,
},
- contextWindow: 1000000,
- maxTokens: 128000,
+ contextWindow: 1048576,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2.5": {
id: "mimo-v2.5",
@@ -16518,7 +16553,7 @@ export const MODELS = {
provider: "xiaomi-token-plan-ams",
baseUrl: "https://token-plan-ams.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text"],
+ input: ["text", "image"],
cost: {
input: 0.4,
output: 2,
@@ -16535,7 +16570,7 @@ export const MODELS = {
provider: "xiaomi-token-plan-ams",
baseUrl: "https://token-plan-ams.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text", "image"],
+ input: ["text"],
cost: {
input: 1,
output: 3,
@@ -16561,8 +16596,8 @@ export const MODELS = {
cacheRead: 0.01,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 64000,
+ contextWindow: 262144,
+ maxTokens: 65536,
} satisfies Model<"anthropic-messages">,
"mimo-v2-omni": {
id: "mimo-v2-omni",
@@ -16578,8 +16613,8 @@ export const MODELS = {
cacheRead: 0.08,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 128000,
+ contextWindow: 262144,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2-pro": {
id: "mimo-v2-pro",
@@ -16595,8 +16630,8 @@ export const MODELS = {
cacheRead: 0.2,
cacheWrite: 0,
},
- contextWindow: 1000000,
- maxTokens: 128000,
+ contextWindow: 1048576,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2.5": {
id: "mimo-v2.5",
@@ -16605,7 +16640,7 @@ export const MODELS = {
provider: "xiaomi-token-plan-cn",
baseUrl: "https://token-plan-cn.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text"],
+ input: ["text", "image"],
cost: {
input: 0.4,
output: 2,
@@ -16622,7 +16657,7 @@ export const MODELS = {
provider: "xiaomi-token-plan-cn",
baseUrl: "https://token-plan-cn.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text", "image"],
+ input: ["text"],
cost: {
input: 1,
output: 3,
@@ -16648,8 +16683,8 @@ export const MODELS = {
cacheRead: 0.01,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 64000,
+ contextWindow: 262144,
+ maxTokens: 65536,
} satisfies Model<"anthropic-messages">,
"mimo-v2-omni": {
id: "mimo-v2-omni",
@@ -16665,8 +16700,8 @@ export const MODELS = {
cacheRead: 0.08,
cacheWrite: 0,
},
- contextWindow: 256000,
- maxTokens: 128000,
+ contextWindow: 262144,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2-pro": {
id: "mimo-v2-pro",
@@ -16682,8 +16717,8 @@ export const MODELS = {
cacheRead: 0.2,
cacheWrite: 0,
},
- contextWindow: 1000000,
- maxTokens: 128000,
+ contextWindow: 1048576,
+ maxTokens: 131072,
} satisfies Model<"anthropic-messages">,
"mimo-v2.5": {
id: "mimo-v2.5",
@@ -16692,7 +16727,7 @@ export const MODELS = {
provider: "xiaomi-token-plan-sgp",
baseUrl: "https://token-plan-sgp.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text"],
+ input: ["text", "image"],
cost: {
input: 0.4,
output: 2,
@@ -16709,7 +16744,7 @@ export const MODELS = {
provider: "xiaomi-token-plan-sgp",
baseUrl: "https://token-plan-sgp.xiaomimimo.com/anthropic",
reasoning: true,
- input: ["text", "image"],
+ input: ["text"],
cost: {
input: 1,
output: 3,
diff --git a/packages/ai/test/openai-completions-empty-tools.test.ts b/packages/ai/test/openai-completions-empty-tools.test.ts
index 0c1209802..8197efb0a 100644
--- a/packages/ai/test/openai-completions-empty-tools.test.ts
+++ b/packages/ai/test/openai-completions-empty-tools.test.ts
@@ -5,7 +5,7 @@ import { streamSimple } from "../src/stream.js";
// Empty tools arrays must NOT be serialized as `tools: []` — some OpenAI-compatible
// backends (e.g. DashScope / Aliyun Qwen via compatible-mode) reject the request with
// `"[] is too short - 'tools'"` (HTTP 400) when `--no-tools` produces an empty array.
-// Regression for https://github.com/badlogic/pi-mono/issues/
+// Regression for https://github.com/earendil-works/pi-mono/issues/
const mockState = vi.hoisted(() => ({
lastParams: undefined as unknown,
diff --git a/packages/ai/test/openai-responses-copilot-provider.test.ts b/packages/ai/test/openai-responses-copilot-provider.test.ts
index fc1093b75..c4140a5c0 100644
--- a/packages/ai/test/openai-responses-copilot-provider.test.ts
+++ b/packages/ai/test/openai-responses-copilot-provider.test.ts
@@ -91,6 +91,80 @@ describe("openai-responses provider defaults", () => {
});
});
+ it.each(["gpt-5.1", "gpt-5.2", "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.5"] as const)(
+ "sends none reasoning effort for OpenAI %s when no reasoning is requested",
+ async (modelId) => {
+ const model = getModel("openai", modelId);
+ let capturedPayload: unknown;
+
+ vi.spyOn(globalThis, "fetch").mockResolvedValue(
+ new Response("data: [DONE]\n\n", {
+ status: 200,
+ headers: { "content-type": "text/event-stream" },
+ }),
+ );
+
+ const stream = streamOpenAIResponses(
+ model,
+ {
+ systemPrompt: "sys",
+ messages: [{ role: "user", content: "hi", timestamp: Date.now() }],
+ },
+ {
+ apiKey: "test-key",
+ onPayload: (payload) => {
+ capturedPayload = payload;
+ },
+ },
+ );
+
+ for await (const event of stream) {
+ if (event.type === "done" || event.type === "error") break;
+ }
+
+ expect(capturedPayload).toMatchObject({
+ reasoning: { effort: "none" },
+ });
+ },
+ );
+
+ it.each(["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.2-pro", "gpt-5.4-pro", "gpt-5.5-pro"] as const)(
+ "omits reasoning effort for OpenAI %s when off is unsupported",
+ async (modelId) => {
+ const model = getModel("openai", modelId);
+ let capturedPayload: unknown;
+
+ vi.spyOn(globalThis, "fetch").mockResolvedValue(
+ new Response("data: [DONE]\n\n", {
+ status: 200,
+ headers: { "content-type": "text/event-stream" },
+ }),
+ );
+
+ const stream = streamOpenAIResponses(
+ model,
+ {
+ systemPrompt: "sys",
+ messages: [{ role: "user", content: "hi", timestamp: Date.now() }],
+ },
+ {
+ apiKey: "test-key",
+ onPayload: (payload) => {
+ capturedPayload = payload;
+ },
+ },
+ );
+
+ for await (const event of stream) {
+ if (event.type === "done" || event.type === "error") break;
+ }
+
+ expect(capturedPayload).not.toMatchObject({
+ reasoning: expect.anything(),
+ });
+ },
+ );
+
it("sets cache-affinity headers for official OpenAI Responses requests with a sessionId", async () => {
const captured = await captureOpenAIResponseHeaders({ sessionId: "session-123" });
diff --git a/packages/ai/test/tool-call-id-normalization.test.ts b/packages/ai/test/tool-call-id-normalization.test.ts
index b6e739e7c..0655f7548 100644
--- a/packages/ai/test/tool-call-id-normalization.test.ts
+++ b/packages/ai/test/tool-call-id-normalization.test.ts
@@ -7,7 +7,7 @@
* OpenAI Responses API generates IDs in format: {call_id}|{id}
* where {id} can be 400+ chars with special characters (+, /, =).
*
- * Regression test for: https://github.com/badlogic/pi-mono/issues/1022
+ * Regression test for: https://github.com/earendil-works/pi-mono/issues/1022
*/
import { Type } from "typebox";
diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md
index 2f8621aa9..daf633647 100644
--- a/packages/coding-agent/CHANGELOG.md
+++ b/packages/coding-agent/CHANGELOG.md
@@ -2,11 +2,43 @@
## [Unreleased]
+## [0.74.0] - 2026-05-07
+
+### Changed
+
+- Updated repository links and package references for the move to `earendil-works/pi-mono` and `@earendil-works/*` package scopes.
+
+## [0.73.1] - 2026-05-07
+
+### New Features
+
+- **Self-update support for the npm scope migration**: `pi update --self` now supports the upcoming package rename from `@mariozechner/pi-coding-agent` to `@earendil-works/pi-coding-agent`. After the new package is published, existing global installs can update through the normal self-update flow; pi will uninstall the old global package and install the package name returned by the version check endpoint.
+- **Interactive OAuth login selection**: OAuth providers can now present multiple login choices in `/login`, enabling provider-specific interactive authentication flows. See [Providers](docs/providers.md).
+- **JSONC-style `models.json` parsing**: `models.json` now allows comments and trailing commas, making custom provider and model configuration easier to maintain. See [Providers](docs/providers.md) and [Custom Providers](docs/custom-provider.md).
+
+### Added
+
+- Added interactive login selection support so OAuth providers can present multiple login choices ([#4190](https://github.com/earendil-works/pi-mono/pull/4190) by [@mitsuhiko](https://github.com/mitsuhiko)).
+
+### Changed
+
+- Changed `pi update --self` to honor the active package name returned by the Pi version check endpoint, defaulting to the current package when omitted and uninstalling the old global package before installing a renamed package.
+- Changed extension loading to use upstream `jiti` 2.7 instead of the `@mariozechner/jiti` fork ([#4244](https://github.com/earendil-works/pi-mono/pull/4244) by [@pi0](https://github.com/pi0)).
+- Changed `models.json` parsing to allow comments and trailing commas ([#4162](https://github.com/earendil-works/pi-mono/pull/4162) by [@julien-c](https://github.com/julien-c)).
+
### Fixed
- Fixed `pi -p` treating prompts that start with YAML frontmatter as extension flags instead of user messages ([#4163](https://github.com/badlogic/pi-mono/issues/4163)).
- Fixed pending tool results not updating in the live TUI after toggling thinking block visibility while the tool is running ([#4167](https://github.com/badlogic/pi-mono/issues/4167)).
- Fixed `/copy` reporting success on Linux without writing the clipboard on Wayland-only compositors (Hyprland, Niri, ...) by skipping the X11-only native addon on Linux and routing through `wl-copy`/`xclip`/`xsel` instead ([#4177](https://github.com/badlogic/pi-mono/issues/4177)).
+- Fixed HTML session exports to strip skill wrapper XML from rendered user messages ([#4234](https://github.com/earendil-works/pi-mono/pull/4234) by [@aliou](https://github.com/aliou)).
+- Fixed OpenAI-compatible chat completion streams that interleave content and tool-call deltas in the same choice.
+- Fixed OpenAI Codex OAuth refresh failures writing directly to stderr while the TUI is active ([#4141](https://github.com/badlogic/pi-mono/issues/4141)).
+- Fixed OpenAI Codex Responses requests to send a non-empty system prompt ([#4184](https://github.com/earendil-works/pi-mono/issues/4184)).
+- Fixed Kimi For Coding model resolution for the Kimi K2 P6 alias ([#4218](https://github.com/earendil-works/pi-mono/issues/4218)).
+- Fixed Kitty inline image redraws to stay within TUI-owned terminal regions and avoid writing below the active viewport.
+- Fixed Kitty inline image rendering by letting the terminal allocate image ids and bounding parsed image ids to valid values.
+- Fixed inline image capability detection to disable inline images in cmux terminals.
## [0.73.0] - 2026-05-04
diff --git a/packages/coding-agent/README.md b/packages/coding-agent/README.md
index 4dd237868..0bc1dde8e 100644
--- a/packages/coding-agent/README.md
+++ b/packages/coding-agent/README.md
@@ -1,16 +1,11 @@
-
-
-
-
-
+
-
-
+
pi.dev domain graciously donated by
@@ -73,7 +68,13 @@ I regularly publish my own `pi-mono` work sessions here:
## Quick Start
```bash
-npm install -g @mariozechner/pi-coding-agent
+curl -fsSL https://pi.dev/install.sh | sh
+```
+
+Or with npm:
+
+```bash
+npm install -g @earendil-works/pi-coding-agent
```
Authenticate with an API key:
@@ -432,7 +433,7 @@ See [docs/packages.md](docs/packages.md).
### SDK
```typescript
-import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@mariozechner/pi-coding-agent";
+import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@earendil-works/pi-coding-agent";
const authStorage = AuthStorage.create();
const modelRegistry = ModelRegistry.create(authStorage);
@@ -646,6 +647,6 @@ MIT
## See Also
-- [@mariozechner/pi-ai](https://www.npmjs.com/package/@mariozechner/pi-ai): Core LLM toolkit
-- [@mariozechner/pi-agent-core](https://www.npmjs.com/package/@mariozechner/pi-agent-core): Agent framework
-- [@mariozechner/pi-tui](https://www.npmjs.com/package/@mariozechner/pi-tui): Terminal UI components
+- [@earendil-works/pi-ai](https://www.npmjs.com/package/@earendil-works/pi-ai): Core LLM toolkit
+- [@earendil-works/pi-agent-core](https://www.npmjs.com/package/@earendil-works/pi-agent-core): Agent framework
+- [@earendil-works/pi-tui](https://www.npmjs.com/package/@earendil-works/pi-tui): Terminal UI components
diff --git a/packages/coding-agent/docs/compaction.md b/packages/coding-agent/docs/compaction.md
index 7445be2ca..babcddc61 100644
--- a/packages/coding-agent/docs/compaction.md
+++ b/packages/coding-agent/docs/compaction.md
@@ -2,14 +2,14 @@
LLMs have limited context windows. When conversations grow too long, pi uses compaction to summarize older content while preserving recent work. This page covers both auto-compaction and branch summarization.
-**Source files** ([pi-mono](https://github.com/badlogic/pi-mono)):
-- [`packages/coding-agent/src/core/compaction/compaction.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/compaction.ts) - Auto-compaction logic
-- [`packages/coding-agent/src/core/compaction/branch-summarization.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts) - Branch summarization
-- [`packages/coding-agent/src/core/compaction/utils.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/utils.ts) - Shared utilities (file tracking, serialization)
-- [`packages/coding-agent/src/core/session-manager.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts) - Entry types (`CompactionEntry`, `BranchSummaryEntry`)
-- [`packages/coding-agent/src/core/extensions/types.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/extensions/types.ts) - Extension event types
+**Source files** ([pi-mono](https://github.com/earendil-works/pi-mono)):
+- [`packages/coding-agent/src/core/compaction/compaction.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/compaction.ts) - Auto-compaction logic
+- [`packages/coding-agent/src/core/compaction/branch-summarization.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts) - Branch summarization
+- [`packages/coding-agent/src/core/compaction/utils.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/utils.ts) - Shared utilities (file tracking, serialization)
+- [`packages/coding-agent/src/core/session-manager.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts) - Entry types (`CompactionEntry`, `BranchSummaryEntry`)
+- [`packages/coding-agent/src/core/extensions/types.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/extensions/types.ts) - Extension event types
-For TypeScript definitions in your project, inspect `node_modules/@mariozechner/pi-coding-agent/dist/`.
+For TypeScript definitions in your project, inspect `node_modules/@earendil-works/pi-coding-agent/dist/`.
## Overview
@@ -118,7 +118,7 @@ Never cut at tool results (they must stay with their tool call).
### CompactionEntry Structure
-Defined in [`session-manager.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts):
+Defined in [`session-manager.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts):
```typescript
interface CompactionEntry {
@@ -142,7 +142,7 @@ interface CompactionDetails {
Extensions can store any JSON-serializable data in `details`. The default compaction tracks file operations, but custom extension implementations can use their own structure.
-See [`prepareCompaction()`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/compaction.ts) and [`compact()`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/compaction.ts) for the implementation.
+See [`prepareCompaction()`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/compaction.ts) and [`compact()`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/compaction.ts) for the implementation.
## Branch Summarization
@@ -185,7 +185,7 @@ This means file tracking accumulates across multiple compactions or nested branc
### BranchSummaryEntry Structure
-Defined in [`session-manager.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts):
+Defined in [`session-manager.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts):
```typescript
interface BranchSummaryEntry {
@@ -208,7 +208,7 @@ interface BranchSummaryDetails {
Same as compaction, extensions can store custom data in `details`.
-See [`collectEntriesForBranchSummary()`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts), [`prepareBranchEntries()`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts), and [`generateBranchSummary()`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts) for the implementation.
+See [`collectEntriesForBranchSummary()`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts), [`prepareBranchEntries()`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts), and [`generateBranchSummary()`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/branch-summarization.ts) for the implementation.
## Summary Format
@@ -252,7 +252,7 @@ path/to/changed.ts
### Message Serialization
-Before summarization, messages are serialized to text via [`serializeConversation()`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/compaction/utils.ts):
+Before summarization, messages are serialized to text via [`serializeConversation()`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/compaction/utils.ts):
```
[User]: What they said
@@ -268,7 +268,7 @@ Tool results are truncated to 2000 characters during serialization. Content beyo
## Custom Summarization via Extensions
-Extensions can intercept and customize both compaction and branch summarization. See [`extensions/types.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/extensions/types.ts) for event type definitions.
+Extensions can intercept and customize both compaction and branch summarization. See [`extensions/types.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/extensions/types.ts) for event type definitions.
### session_before_compact
@@ -309,7 +309,7 @@ pi.on("session_before_compact", async (event, ctx) => {
To generate a summary with your own model, convert messages to text using `serializeConversation`:
```typescript
-import { convertToLlm, serializeConversation } from "@mariozechner/pi-coding-agent";
+import { convertToLlm, serializeConversation } from "@earendil-works/pi-coding-agent";
pi.on("session_before_compact", async (event, ctx) => {
const { preparation } = event;
diff --git a/packages/coding-agent/docs/custom-provider.md b/packages/coding-agent/docs/custom-provider.md
index 3e0b326fe..095bc1ca3 100644
--- a/packages/coding-agent/docs/custom-provider.md
+++ b/packages/coding-agent/docs/custom-provider.md
@@ -30,7 +30,7 @@ See these complete provider examples:
## Quick Reference
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
// Override baseUrl for existing provider
@@ -96,7 +96,7 @@ To add a completely new provider, specify `models` along with the required confi
If the model list comes from a remote endpoint, use an async extension factory:
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default async function (pi: ExtensionAPI) {
const response = await fetch("http://localhost:1234/v1/models");
@@ -252,7 +252,7 @@ pi.registerProvider("custom-api", {
Add OAuth/SSO authentication that integrates with `/login`:
```typescript
-import type { OAuthCredentials, OAuthLoginCallbacks } from "@mariozechner/pi-ai";
+import type { OAuthCredentials, OAuthLoginCallbacks } from "@earendil-works/pi-ai";
pi.registerProvider("corporate-ai", {
baseUrl: "https://ai.corp.com/v1",
@@ -345,12 +345,12 @@ interface OAuthCredentials {
For providers with non-standard APIs, implement `streamSimple`. Study the existing provider implementations before writing your own:
**Reference implementations:**
-- [anthropic.ts](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/providers/anthropic.ts) - Anthropic Messages API
-- [mistral.ts](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/providers/mistral.ts) - Mistral Conversations API
-- [openai-completions.ts](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/providers/openai-completions.ts) - OpenAI Chat Completions
-- [openai-responses.ts](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/providers/openai-responses.ts) - OpenAI Responses API
-- [google.ts](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/providers/google.ts) - Google Generative AI
-- [amazon-bedrock.ts](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/providers/amazon-bedrock.ts) - AWS Bedrock
+- [anthropic.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/providers/anthropic.ts) - Anthropic Messages API
+- [mistral.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/providers/mistral.ts) - Mistral Conversations API
+- [openai-completions.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/providers/openai-completions.ts) - OpenAI Chat Completions
+- [openai-responses.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/providers/openai-responses.ts) - OpenAI Responses API
+- [google.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/providers/google.ts) - Google Generative AI
+- [amazon-bedrock.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/providers/amazon-bedrock.ts) - AWS Bedrock
### Stream Pattern
@@ -365,7 +365,7 @@ import {
type SimpleStreamOptions,
calculateCost,
createAssistantMessageEventStream,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
function streamMyProvider(
model: Model,
@@ -522,7 +522,7 @@ pi.registerProvider("my-provider", {
## Testing Your Implementation
-Test your provider against the same test suites used by built-in providers. Copy and adapt these test files from [packages/ai/test/](https://github.com/badlogic/pi-mono/tree/main/packages/ai/test):
+Test your provider against the same test suites used by built-in providers. Copy and adapt these test files from [packages/ai/test/](https://github.com/earendil-works/pi-mono/tree/main/packages/ai/test):
| Test | Purpose |
|------|---------|
diff --git a/packages/coding-agent/docs/development.md b/packages/coding-agent/docs/development.md
index 304bbc400..35202a4a2 100644
--- a/packages/coding-agent/docs/development.md
+++ b/packages/coding-agent/docs/development.md
@@ -5,7 +5,7 @@ See [AGENTS.md](../../../AGENTS.md) for additional guidelines.
## Setup
```bash
-git clone https://github.com/badlogic/pi-mono
+git clone https://github.com/earendil-works/pi-mono
cd pi-mono
npm install
npm run build
diff --git a/packages/coding-agent/docs/extensions.md b/packages/coding-agent/docs/extensions.md
index ce8002f97..998a650d1 100644
--- a/packages/coding-agent/docs/extensions.md
+++ b/packages/coding-agent/docs/extensions.md
@@ -57,7 +57,7 @@ See [examples/extensions/](../examples/extensions/) for working implementations.
Create `~/.pi/agent/extensions/my-extension.ts`:
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function (pi: ExtensionAPI) {
@@ -139,10 +139,10 @@ To share extensions via npm or git as pi packages, see [packages.md](packages.md
| Package | Purpose |
|---------|---------|
-| `@mariozechner/pi-coding-agent` | Extension types (`ExtensionAPI`, `ExtensionContext`, events) |
+| `@earendil-works/pi-coding-agent` | Extension types (`ExtensionAPI`, `ExtensionContext`, events) |
| `typebox` | Schema definitions for tool parameters |
-| `@mariozechner/pi-ai` | AI utilities (`StringEnum` for Google-compatible enums) |
-| `@mariozechner/pi-tui` | TUI components for custom rendering |
+| `@earendil-works/pi-ai` | AI utilities (`StringEnum` for Google-compatible enums) |
+| `@earendil-works/pi-tui` | TUI components for custom rendering |
npm dependencies work too. Add a `package.json` next to your extension (or in a parent directory), run `npm install`, and imports from `node_modules/` are resolved automatically.
@@ -155,7 +155,7 @@ Node.js built-ins (`node:fs`, `node:path`, etc.) are also available.
An extension exports a default factory function that receives `ExtensionAPI`. The factory can be synchronous or asynchronous:
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
// Subscribe to events
@@ -184,7 +184,7 @@ If the factory returns a `Promise`, pi awaits it before continuing startup. That
Use an async factory for one-time startup work such as fetching remote configuration or dynamically discovering available models.
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default async function (pi: ExtensionAPI) {
const response = await fetch("http://localhost:1234/v1/models");
@@ -688,7 +688,7 @@ Behavior guarantees:
- Return values from `tool_call` only control blocking via `{ block: true, reason?: string }`
```typescript
-import { isToolCallEventType } from "@mariozechner/pi-coding-agent";
+import { isToolCallEventType } from "@earendil-works/pi-coding-agent";
pi.on("tool_call", async (event, ctx) => {
// event.toolName - "bash", "read", "write", "edit", etc.
@@ -724,7 +724,7 @@ export type MyToolInput = Static;
Use `isToolCallEventType` with explicit type parameters:
```typescript
-import { isToolCallEventType } from "@mariozechner/pi-coding-agent";
+import { isToolCallEventType } from "@earendil-works/pi-coding-agent";
import type { MyToolInput } from "my-extension";
pi.on("tool_call", (event) => {
@@ -748,7 +748,7 @@ In parallel tool mode, `tool_result` and `tool_execution_end` may interleave in
Use `ctx.signal` for nested async work inside the handler. This lets Esc cancel model calls, `fetch()`, and other abort-aware operations started by the extension.
```typescript
-import { isBashToolResult } from "@mariozechner/pi-coding-agent";
+import { isBashToolResult } from "@earendil-works/pi-coding-agent";
pi.on("tool_result", async (event, ctx) => {
// event.toolName, event.toolCallId, event.input
@@ -776,7 +776,7 @@ pi.on("tool_result", async (event, ctx) => {
Fired when user executes `!` or `!!` commands. **Can intercept.**
```typescript
-import { createLocalBashOperations } from "@mariozechner/pi-coding-agent";
+import { createLocalBashOperations } from "@earendil-works/pi-coding-agent";
pi.on("user_bash", (event, ctx) => {
// event.command - the bash command
@@ -1087,7 +1087,7 @@ Options:
To discover available sessions, use the static `SessionManager.list()` or `SessionManager.listAll()` methods:
```typescript
-import { SessionManager } from "@mariozechner/pi-coding-agent";
+import { SessionManager } from "@earendil-works/pi-coding-agent";
pi.registerCommand("switch", {
description: "Switch to another session",
@@ -1181,7 +1181,7 @@ Tools run with `ExtensionContext`, so they cannot call `ctx.reload()` directly.
Example tool the LLM can call to trigger reload:
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function (pi: ExtensionAPI) {
@@ -1230,7 +1230,7 @@ See [dynamic-tools.ts](../examples/extensions/dynamic-tools.ts) for a full examp
```typescript
import { Type } from "typebox";
-import { StringEnum } from "@mariozechner/pi-ai";
+import { StringEnum } from "@earendil-works/pi-ai";
pi.registerTool({
name: "my_tool",
@@ -1388,7 +1388,7 @@ pi.registerCommand("stats", {
Optional: add argument auto-completion for `/command ...`:
```typescript
-import type { AutocompleteItem } from "@mariozechner/pi-tui";
+import type { AutocompleteItem } from "@earendil-works/pi-tui";
pi.registerCommand("deploy", {
description: "Deploy to an environment",
@@ -1678,7 +1678,7 @@ Pass the real target file path to `withFileMutationQueue()`, not the raw user ar
Queue the entire mutation window on that target path. That includes read-modify-write logic, not just the final write.
```typescript
-import { withFileMutationQueue } from "@mariozechner/pi-coding-agent";
+import { withFileMutationQueue } from "@earendil-works/pi-coding-agent";
import { mkdir, readFile, writeFile } from "node:fs/promises";
import { dirname, resolve } from "node:path";
@@ -1703,8 +1703,8 @@ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
```typescript
import { Type } from "typebox";
-import { StringEnum } from "@mariozechner/pi-ai";
-import { Text } from "@mariozechner/pi-tui";
+import { StringEnum } from "@earendil-works/pi-ai";
+import { Text } from "@earendil-works/pi-tui";
pi.registerTool({
name: "my_tool",
@@ -1772,7 +1772,7 @@ async execute(toolCallId, params) {
}
```
-**Important:** Use `StringEnum` from `@mariozechner/pi-ai` for string enums. `Type.Union`/`Type.Literal` doesn't work with Google's API.
+**Important:** Use `StringEnum` from `@earendil-works/pi-ai` for string enums. `Type.Union`/`Type.Literal` doesn't work with Google's API.
**Argument preparation:** `prepareArguments(args)` is optional. If defined, it runs before schema validation and before `execute()`. Use it to mimic an older accepted input shape when pi resumes an older session whose stored tool call arguments no longer match the current schema. Return the object you want validated against `parameters`. Keep the public schema strict. Do not add deprecated compatibility fields to `parameters` just to keep old resumed sessions working.
@@ -1845,20 +1845,20 @@ See [examples/extensions/tool-override.ts](../examples/extensions/tool-override.
**Your implementation must match the exact result shape**, including the `details` type. The UI and session logic depend on these shapes for rendering and state tracking.
Built-in tool implementations:
-- [read.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/tools/read.ts) - `ReadToolDetails`
-- [bash.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/tools/bash.ts) - `BashToolDetails`
-- [edit.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/tools/edit.ts)
-- [write.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/tools/write.ts)
-- [grep.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/tools/grep.ts) - `GrepToolDetails`
-- [find.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/tools/find.ts) - `FindToolDetails`
-- [ls.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/tools/ls.ts) - `LsToolDetails`
+- [read.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/tools/read.ts) - `ReadToolDetails`
+- [bash.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/tools/bash.ts) - `BashToolDetails`
+- [edit.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/tools/edit.ts)
+- [write.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/tools/write.ts)
+- [grep.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/tools/grep.ts) - `GrepToolDetails`
+- [find.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/tools/find.ts) - `FindToolDetails`
+- [ls.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/tools/ls.ts) - `LsToolDetails`
### Remote Execution
Built-in tools support pluggable operations for delegating to remote systems (SSH, containers, etc.):
```typescript
-import { createReadTool, createBashTool, type ReadOperations } from "@mariozechner/pi-coding-agent";
+import { createReadTool, createBashTool, type ReadOperations } from "@earendil-works/pi-coding-agent";
// Create tool with custom operations
const remoteRead = createReadTool(cwd, {
@@ -1889,7 +1889,7 @@ For `user_bash`, extensions can reuse pi's local shell backend via `createLocalB
The bash tool also supports a spawn hook to adjust the command, cwd, or env before execution:
```typescript
-import { createBashTool } from "@mariozechner/pi-coding-agent";
+import { createBashTool } from "@earendil-works/pi-coding-agent";
const bashTool = createBashTool(cwd, {
spawnHook: ({ command, cwd, env }) => ({
@@ -1919,7 +1919,7 @@ import {
formatSize, // Human-readable size (e.g., "50KB", "1.5MB")
DEFAULT_MAX_BYTES, // 50KB
DEFAULT_MAX_LINES, // 2000
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
async execute(toolCallId, params, signal, onUpdate, ctx) {
const output = await runCommand();
@@ -1974,7 +1974,7 @@ export default function (pi: ExtensionAPI) {
### Custom Rendering
-Tools can provide `renderCall` and `renderResult` for custom TUI display. See [tui.md](tui.md) for the full component API and [tool-execution.ts](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/modes/interactive/components/tool-execution.ts) for how tool rows are composed.
+Tools can provide `renderCall` and `renderResult` for custom TUI display. See [tui.md](tui.md) for the full component API and [tool-execution.ts](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/modes/interactive/components/tool-execution.ts) for how tool rows are composed.
By default, tool output is wrapped in a `Box` that handles padding and background. A defined `renderCall` or `renderResult` must return a `Component`. If a slot renderer is not defined, `tool-execution.ts` uses fallback rendering for that slot.
@@ -2010,7 +2010,7 @@ Use `context.state` for cross-slot shared state. Keep slot-local caches on the r
Renders the tool call or header:
```typescript
-import { Text } from "@mariozechner/pi-tui";
+import { Text } from "@earendil-works/pi-tui";
renderCall(args, theme, context) {
const text = (context.lastComponent as Text | undefined) ?? new Text("", 0, 0);
@@ -2055,7 +2055,7 @@ If a slot intentionally has no visible content, return an empty `Component` such
Use `keyHint()` to display keybinding hints that respect the active keybinding configuration:
```typescript
-import { keyHint } from "@mariozechner/pi-coding-agent";
+import { keyHint } from "@earendil-works/pi-coding-agent";
renderResult(result, { expanded }, theme, context) {
let text = theme.fg("success", "✓ Done");
@@ -2329,7 +2329,7 @@ See [github-issue-autocomplete.ts](../examples/extensions/github-issue-autocompl
For complex UI, use `ctx.ui.custom()`. This temporarily replaces the editor with your component until `done()` is called:
```typescript
-import { Text, Component } from "@mariozechner/pi-tui";
+import { Text, Component } from "@earendil-works/pi-tui";
const result = await ctx.ui.custom((tui, theme, keybindings, done) => {
const text = new Text("Press Enter to confirm, Escape to cancel", 1, 1);
@@ -2387,8 +2387,8 @@ See [tui.md](tui.md) for the full `OverlayOptions` API and [overlay-qa-tests.ts]
Replace the main input editor with a custom implementation (vim mode, emacs mode, etc.):
```typescript
-import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { matchesKey } from "@mariozechner/pi-tui";
+import { CustomEditor, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { matchesKey } from "@earendil-works/pi-tui";
class VimEditor extends CustomEditor {
private mode: "normal" | "insert" = "insert";
@@ -2438,7 +2438,7 @@ See [tui.md](tui.md) Pattern 7 for a complete example with mode indicator.
Register a custom renderer for messages with your `customType`:
```typescript
-import { Text } from "@mariozechner/pi-tui";
+import { Text } from "@earendil-works/pi-tui";
pi.registerMessageRenderer("my-extension", (message, options, theme) => {
const { expanded } = options;
@@ -2487,7 +2487,7 @@ theme.strikethrough(text)
For syntax highlighting in custom tool renderers:
```typescript
-import { highlightCode, getLanguageFromPath } from "@mariozechner/pi-coding-agent";
+import { highlightCode, getLanguageFromPath } from "@earendil-works/pi-coding-agent";
// Highlight code with explicit language
const highlighted = highlightCode("const x = 1;", "typescript", theme);
diff --git a/packages/coding-agent/docs/index.md b/packages/coding-agent/docs/index.md
index d119c0abe..a4294d3aa 100644
--- a/packages/coding-agent/docs/index.md
+++ b/packages/coding-agent/docs/index.md
@@ -4,10 +4,16 @@ Pi is a minimal terminal coding harness. It is designed to stay small at the cor
## Quick start
-Install pi with npm:
+On linux or mac you can install Pi with curl:
```bash
-npm install -g @mariozechner/pi-coding-agent
+curl -fsSL https://pi.dev/install.sh | sh
+```
+
+Or alternatively with npm:
+
+```bash
+npm install -g @earendil-works/pi-coding-agent
```
Then run it in a project directory:
diff --git a/packages/coding-agent/docs/json.md b/packages/coding-agent/docs/json.md
index fbbc3f738..e9a48cbde 100644
--- a/packages/coding-agent/docs/json.md
+++ b/packages/coding-agent/docs/json.md
@@ -8,7 +8,7 @@ Outputs all session events as JSON lines to stdout. Useful for integrating pi in
## Event Types
-Events are defined in [`AgentSessionEvent`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/agent-session.ts#L102):
+Events are defined in [`AgentSessionEvent`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/agent-session.ts#L102):
```typescript
type AgentSessionEvent =
@@ -22,7 +22,7 @@ type AgentSessionEvent =
`queue_update` emits the full pending steering and follow-up queues whenever they change. `compaction_start` and `compaction_end` cover both manual and automatic compaction.
-Base events from [`AgentEvent`](https://github.com/badlogic/pi-mono/blob/main/packages/agent/src/types.ts#L179):
+Base events from [`AgentEvent`](https://github.com/earendil-works/pi-mono/blob/main/packages/agent/src/types.ts#L179):
```typescript
type AgentEvent =
@@ -44,12 +44,12 @@ type AgentEvent =
## Message Types
-Base messages from [`packages/ai/src/types.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/types.ts#L134):
+Base messages from [`packages/ai/src/types.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/types.ts#L134):
- `UserMessage` (line 134)
- `AssistantMessage` (line 140)
- `ToolResultMessage` (line 152)
-Extended messages from [`packages/coding-agent/src/core/messages.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/messages.ts#L29):
+Extended messages from [`packages/coding-agent/src/core/messages.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/messages.ts#L29):
- `BashExecutionMessage` (line 29)
- `CustomMessage` (line 46)
- `BranchSummaryMessage` (line 55)
diff --git a/packages/coding-agent/docs/packages.md b/packages/coding-agent/docs/packages.md
index 7face1e3b..e0a2f2c2b 100644
--- a/packages/coding-agent/docs/packages.md
+++ b/packages/coding-agent/docs/packages.md
@@ -163,7 +163,7 @@ If no `pi` manifest is present, pi auto-discovers resources from these directori
Third party runtime dependencies belong in `dependencies` in `package.json`. Dependencies that do not register extensions, skills, prompt templates, or themes also belong in `dependencies`. When pi installs a package from npm or git, it runs `npm install`, so those dependencies are installed automatically.
-Pi bundles core packages for extensions and skills. If you import any of these, list them in `peerDependencies` with a `"*"` range and do not bundle them: `@mariozechner/pi-ai`, `@mariozechner/pi-agent-core`, `@mariozechner/pi-coding-agent`, `@mariozechner/pi-tui`, `typebox`.
+Pi bundles core packages for extensions and skills. If you import any of these, list them in `peerDependencies` with a `"*"` range and do not bundle them: `@earendil-works/pi-ai`, `@earendil-works/pi-agent-core`, `@earendil-works/pi-coding-agent`, `@earendil-works/pi-tui`, `typebox`.
Other pi packages must be bundled in your tarball. Add them to `dependencies` and `bundledDependencies`, then reference their resources through `node_modules/` paths. Pi loads packages with separate module roots, so separate installs do not collide or share modules.
diff --git a/packages/coding-agent/docs/providers.md b/packages/coding-agent/docs/providers.md
index 23bb9b961..3e3e4cb82 100644
--- a/packages/coding-agent/docs/providers.md
+++ b/packages/coding-agent/docs/providers.md
@@ -74,7 +74,7 @@ pi
| Xiaomi MiMo Token Plan (Amsterdam) | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | `xiaomi-token-plan-ams` |
| Xiaomi MiMo Token Plan (Singapore) | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | `xiaomi-token-plan-sgp` |
-Reference for environment variables and `auth.json` keys: [`const envMap`](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/env-api-keys.ts) in [`packages/ai/src/env-api-keys.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/env-api-keys.ts).
+Reference for environment variables and `auth.json` keys: [`const envMap`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts) in [`packages/ai/src/env-api-keys.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts).
#### Auth File
diff --git a/packages/coding-agent/docs/quickstart.md b/packages/coding-agent/docs/quickstart.md
index 5ae2afac7..55c6e346d 100644
--- a/packages/coding-agent/docs/quickstart.md
+++ b/packages/coding-agent/docs/quickstart.md
@@ -7,7 +7,7 @@ This page gets you from install to a useful first pi session.
Pi is distributed as an npm package:
```bash
-npm install -g @mariozechner/pi-coding-agent
+npm install -g @earendil-works/pi-coding-agent
```
Then start pi in the project directory you want it to work on:
diff --git a/packages/coding-agent/docs/rpc.md b/packages/coding-agent/docs/rpc.md
index d348cad8b..7a284453a 100644
--- a/packages/coding-agent/docs/rpc.md
+++ b/packages/coding-agent/docs/rpc.md
@@ -2,7 +2,7 @@
RPC mode enables headless operation of the coding agent via a JSON protocol over stdin/stdout. This is useful for embedding the agent in other applications, IDEs, or custom UIs.
-**Note for Node.js/TypeScript users**: If you're building a Node.js application, consider using `AgentSession` directly from `@mariozechner/pi-coding-agent` instead of spawning a subprocess. See [`src/core/agent-session.ts`](../src/core/agent-session.ts) for the API. For a subprocess-based TypeScript client, see [`src/modes/rpc/rpc-client.ts`](../src/modes/rpc/rpc-client.ts).
+**Note for Node.js/TypeScript users**: If you're building a Node.js application, consider using `AgentSession` directly from `@earendil-works/pi-coding-agent` instead of spawning a subprocess. See [`src/core/agent-session.ts`](../src/core/agent-session.ts) for the API. For a subprocess-based TypeScript client, see [`src/modes/rpc/rpc-client.ts`](../src/modes/rpc/rpc-client.ts).
## Starting RPC Mode
diff --git a/packages/coding-agent/docs/sdk.md b/packages/coding-agent/docs/sdk.md
index 64d1374d6..6db72279c 100644
--- a/packages/coding-agent/docs/sdk.md
+++ b/packages/coding-agent/docs/sdk.md
@@ -16,7 +16,7 @@ See [examples/sdk/](../examples/sdk/) for working examples from minimal to full
## Quick Start
```typescript
-import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@mariozechner/pi-coding-agent";
+import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@earendil-works/pi-coding-agent";
// Set up credential storage and model registry
const authStorage = AuthStorage.create();
@@ -40,7 +40,7 @@ await session.prompt("What files are in the current directory?");
## Installation
```bash
-npm install @mariozechner/pi-coding-agent
+npm install @earendil-works/pi-coding-agent
```
The SDK is included in the main package. No separate installation needed.
@@ -54,7 +54,7 @@ The main factory function for a single `AgentSession`.
`createAgentSession()` uses a `ResourceLoader` to supply extensions, skills, prompt templates, themes, and context files. If you do not provide one, it uses `DefaultResourceLoader` with standard discovery.
```typescript
-import { createAgentSession } from "@mariozechner/pi-coding-agent";
+import { createAgentSession } from "@earendil-works/pi-coding-agent";
// Minimal: defaults with DefaultResourceLoader
const { session } = await createAgentSession();
@@ -132,7 +132,7 @@ import {
createAgentSessionServices,
getAgentDir,
SessionManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
const services = await createAgentSessionServices({ cwd });
@@ -239,7 +239,7 @@ Both `steer()` and `followUp()` expand file-based prompt templates but error on
### Agent and AgentState
-The `Agent` class (from `@mariozechner/pi-agent-core`) handles the core LLM interaction. Access it via `session.agent`.
+The `Agent` class (from `@earendil-works/pi-agent-core`) handles the core LLM interaction. Access it via `session.agent`.
```typescript
// Access current state
@@ -368,8 +368,8 @@ When you pass a custom `ResourceLoader`, `cwd` and `agentDir` no longer control
### Model
```typescript
-import { getModel } from "@mariozechner/pi-ai";
-import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent";
+import { getModel } from "@earendil-works/pi-ai";
+import { AuthStorage, ModelRegistry } from "@earendil-works/pi-coding-agent";
const authStorage = AuthStorage.create();
const modelRegistry = ModelRegistry.create(authStorage);
@@ -416,7 +416,7 @@ API key resolution priority (handled by AuthStorage):
4. Fallback resolver (for custom provider keys from `models.json`)
```typescript
-import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent";
+import { AuthStorage, ModelRegistry } from "@earendil-works/pi-coding-agent";
// Default: uses ~/.pi/agent/auth.json and ~/.pi/agent/models.json
const authStorage = AuthStorage.create();
@@ -452,7 +452,7 @@ const simpleRegistry = ModelRegistry.inMemory(authStorage);
Use a `ResourceLoader` to override the system prompt:
```typescript
-import { createAgentSession, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, DefaultResourceLoader } from "@earendil-works/pi-coding-agent";
const loader = new DefaultResourceLoader({
systemPromptOverride: () => "You are a helpful assistant.",
@@ -472,7 +472,7 @@ import {
readOnlyTools, // read, grep, find, ls
readTool, bashTool, editTool, writeTool,
grepTool, findTool, lsTool,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
// Use built-in tool set
const { session } = await createAgentSession({
@@ -500,7 +500,7 @@ import {
createGrepTool,
createFindTool,
createLsTool,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const cwd = "/path/to/project";
@@ -530,7 +530,7 @@ const { session } = await createAgentSession({
```typescript
import { Type } from "typebox";
-import { createAgentSession, defineTool } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, defineTool } from "@earendil-works/pi-coding-agent";
// Inline custom tool
const myTool = defineTool({
@@ -563,7 +563,7 @@ Custom tools passed via `customTools` are combined with extension-registered too
Extensions are loaded by the `ResourceLoader`. `DefaultResourceLoader` discovers extensions from `~/.pi/agent/extensions/`, `.pi/extensions/`, and settings.json extension sources.
```typescript
-import { createAgentSession, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, DefaultResourceLoader } from "@earendil-works/pi-coding-agent";
const loader = new DefaultResourceLoader({
additionalExtensionPaths: ["/path/to/my-extension.ts"],
@@ -585,7 +585,7 @@ Extensions can register tools, subscribe to events, add commands, and more. See
**Event Bus:** Extensions can communicate via `pi.events`. Pass a shared `eventBus` to `DefaultResourceLoader` if you need to emit or listen from outside:
```typescript
-import { createEventBus, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
+import { createEventBus, DefaultResourceLoader } from "@earendil-works/pi-coding-agent";
const eventBus = createEventBus();
const loader = new DefaultResourceLoader({
@@ -605,7 +605,7 @@ import {
createAgentSession,
DefaultResourceLoader,
type Skill,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const customSkill: Skill = {
name: "my-skill",
@@ -631,7 +631,7 @@ const { session } = await createAgentSession({ resourceLoader: loader });
### Context Files
```typescript
-import { createAgentSession, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, DefaultResourceLoader } from "@earendil-works/pi-coding-agent";
const loader = new DefaultResourceLoader({
agentsFilesOverride: (current) => ({
@@ -655,7 +655,7 @@ import {
createAgentSession,
DefaultResourceLoader,
type PromptTemplate,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const customCommand: PromptTemplate = {
name: "deploy",
@@ -690,7 +690,7 @@ import {
createAgentSessionServices,
getAgentDir,
SessionManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
// In-memory (no persistence)
const { session } = await createAgentSession({
@@ -784,7 +784,7 @@ sm.createBranchedSession(leafId); // Extract path to new file
### Settings Management
```typescript
-import { createAgentSession, SettingsManager, SessionManager } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, SettingsManager, SessionManager } from "@earendil-works/pi-coding-agent";
// Default: loads from files (global + project merged)
const { session } = await createAgentSession({
@@ -840,7 +840,7 @@ Use `DefaultResourceLoader` to discover extensions, skills, prompts, themes, and
import {
DefaultResourceLoader,
getAgentDir,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const loader = new DefaultResourceLoader({
cwd,
@@ -881,7 +881,7 @@ interface LoadExtensionsResult {
## Complete Example
```typescript
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import {
AuthStorage,
@@ -893,7 +893,7 @@ import {
readTool,
SessionManager,
SettingsManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
// Set up auth storage (custom location)
const authStorage = AuthStorage.create("/custom/agent/auth.json");
@@ -978,7 +978,7 @@ import {
getAgentDir,
InteractiveMode,
SessionManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
const services = await createAgentSessionServices({ cwd });
@@ -1018,7 +1018,7 @@ import {
getAgentDir,
runPrintMode,
SessionManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
const services = await createAgentSessionServices({ cwd });
@@ -1055,7 +1055,7 @@ import {
getAgentDir,
runRpcMode,
SessionManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
const services = await createAgentSessionServices({ cwd });
diff --git a/packages/coding-agent/docs/session-format.md b/packages/coding-agent/docs/session-format.md
index 22a9f8e13..848fc61ad 100644
--- a/packages/coding-agent/docs/session-format.md
+++ b/packages/coding-agent/docs/session-format.md
@@ -28,13 +28,13 @@ Existing sessions are automatically migrated to the current version (v3) when lo
## Source Files
-Source on GitHub ([pi-mono](https://github.com/badlogic/pi-mono)):
-- [`packages/coding-agent/src/core/session-manager.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts) - Session entry types and SessionManager
-- [`packages/coding-agent/src/core/messages.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/messages.ts) - Extended message types (BashExecutionMessage, CustomMessage, etc.)
-- [`packages/ai/src/types.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/types.ts) - Base message types (UserMessage, AssistantMessage, ToolResultMessage)
-- [`packages/agent/src/types.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/agent/src/types.ts) - AgentMessage union type
+Source on GitHub ([pi-mono](https://github.com/earendil-works/pi-mono)):
+- [`packages/coding-agent/src/core/session-manager.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts) - Session entry types and SessionManager
+- [`packages/coding-agent/src/core/messages.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/src/core/messages.ts) - Extended message types (BashExecutionMessage, CustomMessage, etc.)
+- [`packages/ai/src/types.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/types.ts) - Base message types (UserMessage, AssistantMessage, ToolResultMessage)
+- [`packages/agent/src/types.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/agent/src/types.ts) - AgentMessage union type
-For TypeScript definitions in your project, inspect `node_modules/@mariozechner/pi-coding-agent/dist/` and `node_modules/@mariozechner/pi-ai/dist/`.
+For TypeScript definitions in your project, inspect `node_modules/@earendil-works/pi-coding-agent/dist/` and `node_modules/@earendil-works/pi-ai/dist/`.
## Message Types
diff --git a/packages/coding-agent/docs/termux.md b/packages/coding-agent/docs/termux.md
index 200b00fe0..2e7a87a01 100644
--- a/packages/coding-agent/docs/termux.md
+++ b/packages/coding-agent/docs/termux.md
@@ -17,7 +17,7 @@ pkg update && pkg upgrade
pkg install nodejs termux-api git
# Install pi
-npm install -g @mariozechner/pi-coding-agent
+npm install -g @earendil-works/pi-coding-agent
# Create config directory
mkdir -p ~/.pi/agent
diff --git a/packages/coding-agent/docs/themes.md b/packages/coding-agent/docs/themes.md
index d831158f8..afe1a22e7 100644
--- a/packages/coding-agent/docs/themes.md
+++ b/packages/coding-agent/docs/themes.md
@@ -52,7 +52,7 @@ vim ~/.pi/agent/themes/my-theme.json
```json
{
- "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
"name": "my-theme",
"vars": {
"primary": "#00aaff",
@@ -122,7 +122,7 @@ vim ~/.pi/agent/themes/my-theme.json
```json
{
- "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
"name": "my-theme",
"vars": {
"blue": "#0066cc",
diff --git a/packages/coding-agent/docs/tui.md b/packages/coding-agent/docs/tui.md
index 12666af4f..bb78aab46 100644
--- a/packages/coding-agent/docs/tui.md
+++ b/packages/coding-agent/docs/tui.md
@@ -4,7 +4,7 @@
Extensions and custom tools can render custom TUI components for interactive user interfaces. This page covers the component system and available building blocks.
-**Source:** [`@mariozechner/pi-tui`](https://github.com/badlogic/pi-mono/tree/main/packages/tui)
+**Source:** [`@earendil-works/pi-tui`](https://github.com/earendil-works/pi-mono/tree/main/packages/tui)
## Component Interface
@@ -33,7 +33,7 @@ The TUI appends a full SGR reset and OSC 8 reset at the end of each rendered lin
Components that display a text cursor and need IME (Input Method Editor) support should implement the `Focusable` interface:
```typescript
-import { CURSOR_MARKER, type Component, type Focusable } from "@mariozechner/pi-tui";
+import { CURSOR_MARKER, type Component, type Focusable } from "@earendil-works/pi-tui";
class MyInput implements Component, Focusable {
focused: boolean = false; // Set by TUI when focus changes
@@ -59,7 +59,7 @@ This enables IME candidate windows to appear at the correct position for CJK inp
When a container component (dialog, selector, etc.) contains an `Input` or `Editor` child, the container must implement `Focusable` and propagate the focus state to the child. Otherwise, the hardware cursor won't be positioned correctly for IME input.
```typescript
-import { Container, type Focusable, Input } from "@mariozechner/pi-tui";
+import { Container, type Focusable, Input } from "@earendil-works/pi-tui";
class SearchDialog extends Container implements Focusable {
private searchInput: Input;
@@ -179,10 +179,10 @@ See [overlay-qa-tests.ts](../examples/extensions/overlay-qa-tests.ts) for compre
## Built-in Components
-Import from `@mariozechner/pi-tui`:
+Import from `@earendil-works/pi-tui`:
```typescript
-import { Text, Box, Container, Spacer, Markdown } from "@mariozechner/pi-tui";
+import { Text, Box, Container, Spacer, Markdown } from "@earendil-works/pi-tui";
```
### Text
@@ -264,7 +264,7 @@ const image = new Image(
Use `matchesKey()` for key detection:
```typescript
-import { matchesKey, Key } from "@mariozechner/pi-tui";
+import { matchesKey, Key } from "@earendil-works/pi-tui";
handleInput(data: string) {
if (matchesKey(data, Key.up)) {
@@ -290,7 +290,7 @@ handleInput(data: string) {
**Critical:** Each line from `render()` must not exceed the `width` parameter.
```typescript
-import { visibleWidth, truncateToWidth } from "@mariozechner/pi-tui";
+import { visibleWidth, truncateToWidth } from "@earendil-works/pi-tui";
render(width: number): string[] {
// Truncate long lines
@@ -311,7 +311,7 @@ Example: Interactive selector
import {
matchesKey, Key,
truncateToWidth, visibleWidth
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
class MySelector {
private items: string[];
@@ -425,8 +425,8 @@ renderResult(result, options, theme, context) {
**For Markdown**, use `getMarkdownTheme()`:
```typescript
-import { getMarkdownTheme } from "@mariozechner/pi-coding-agent";
-import { Markdown } from "@mariozechner/pi-tui";
+import { getMarkdownTheme } from "@earendil-works/pi-coding-agent";
+import { Markdown } from "@earendil-works/pi-tui";
renderResult(result, options, theme, context) {
const mdTheme = getMarkdownTheme();
@@ -587,12 +587,12 @@ These patterns cover the most common UI needs in extensions. **Copy these patter
### Pattern 1: Selection Dialog (SelectList)
-For letting users pick from a list of options. Use `SelectList` from `@mariozechner/pi-tui` with `DynamicBorder` for framing.
+For letting users pick from a list of options. Use `SelectList` from `@earendil-works/pi-tui` with `DynamicBorder` for framing.
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { DynamicBorder } from "@mariozechner/pi-coding-agent";
-import { Container, type SelectItem, SelectList, Text } from "@mariozechner/pi-tui";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { DynamicBorder } from "@earendil-works/pi-coding-agent";
+import { Container, type SelectItem, SelectList, Text } from "@earendil-works/pi-tui";
pi.registerCommand("pick", {
handler: async (_args, ctx) => {
@@ -650,7 +650,7 @@ pi.registerCommand("pick", {
For operations that take time and should be cancellable. `BorderedLoader` shows a spinner and handles escape to cancel.
```typescript
-import { BorderedLoader } from "@mariozechner/pi-coding-agent";
+import { BorderedLoader } from "@earendil-works/pi-coding-agent";
pi.registerCommand("fetch", {
handler: async (_args, ctx) => {
@@ -679,11 +679,11 @@ pi.registerCommand("fetch", {
### Pattern 3: Settings/Toggles (SettingsList)
-For toggling multiple settings. Use `SettingsList` from `@mariozechner/pi-tui` with `getSettingsListTheme()`.
+For toggling multiple settings. Use `SettingsList` from `@earendil-works/pi-tui` with `getSettingsListTheme()`.
```typescript
-import { getSettingsListTheme } from "@mariozechner/pi-coding-agent";
-import { Container, type SettingItem, SettingsList, Text } from "@mariozechner/pi-tui";
+import { getSettingsListTheme } from "@earendil-works/pi-coding-agent";
+import { Container, type SettingItem, SettingsList, Text } from "@earendil-works/pi-tui";
pi.registerCommand("settings", {
handler: async (_args, ctx) => {
@@ -822,8 +822,8 @@ Token stats available via `ctx.sessionManager.getBranch()` and `ctx.model`.
Replace the main input editor with a custom implementation. Useful for modal editing (vim), different keybindings (emacs), or specialized input handling.
```typescript
-import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { matchesKey, truncateToWidth } from "@mariozechner/pi-tui";
+import { CustomEditor, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { matchesKey, truncateToWidth } from "@earendil-works/pi-tui";
type Mode = "normal" | "insert";
diff --git a/packages/coding-agent/examples/extensions/README.md b/packages/coding-agent/examples/extensions/README.md
index 630708679..b7521df22 100644
--- a/packages/coding-agent/examples/extensions/README.md
+++ b/packages/coding-agent/examples/extensions/README.md
@@ -137,7 +137,7 @@ cp permission-gate.ts ~/.pi/agent/extensions/
See [docs/extensions.md](../../docs/extensions.md) for full documentation.
```typescript
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function (pi: ExtensionAPI) {
@@ -179,7 +179,7 @@ export default function (pi: ExtensionAPI) {
**Use StringEnum for string parameters** (required for Google API compatibility):
```typescript
-import { StringEnum } from "@mariozechner/pi-ai";
+import { StringEnum } from "@earendil-works/pi-ai";
// Good
action: StringEnum(["list", "add"] as const)
diff --git a/packages/coding-agent/examples/extensions/auto-commit-on-exit.ts b/packages/coding-agent/examples/extensions/auto-commit-on-exit.ts
index f82ef57cf..58063e95c 100644
--- a/packages/coding-agent/examples/extensions/auto-commit-on-exit.ts
+++ b/packages/coding-agent/examples/extensions/auto-commit-on-exit.ts
@@ -5,7 +5,7 @@
* Uses the last assistant message to generate a commit message.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("session_shutdown", async (_event, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/bash-spawn-hook.ts b/packages/coding-agent/examples/extensions/bash-spawn-hook.ts
index ae543fbaa..e4a1d0228 100644
--- a/packages/coding-agent/examples/extensions/bash-spawn-hook.ts
+++ b/packages/coding-agent/examples/extensions/bash-spawn-hook.ts
@@ -7,8 +7,8 @@
* pi -e ./bash-spawn-hook.ts
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { createBashTool } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { createBashTool } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
const cwd = process.cwd();
diff --git a/packages/coding-agent/examples/extensions/bookmark.ts b/packages/coding-agent/examples/extensions/bookmark.ts
index bd67fbd36..3854b86e0 100644
--- a/packages/coding-agent/examples/extensions/bookmark.ts
+++ b/packages/coding-agent/examples/extensions/bookmark.ts
@@ -7,7 +7,7 @@
* Usage: /bookmark [label] - bookmark the last assistant message
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.registerCommand("bookmark", {
diff --git a/packages/coding-agent/examples/extensions/border-status-editor.ts b/packages/coding-agent/examples/extensions/border-status-editor.ts
index e877d3eac..dce9e5959 100644
--- a/packages/coding-agent/examples/extensions/border-status-editor.ts
+++ b/packages/coding-agent/examples/extensions/border-status-editor.ts
@@ -3,9 +3,9 @@ import {
type ExtensionAPI,
type ExtensionContext,
type KeybindingsManager,
-} from "@mariozechner/pi-coding-agent";
-import type { Component, EditorTheme, TUI } from "@mariozechner/pi-tui";
-import { truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-coding-agent";
+import type { Component, EditorTheme, TUI } from "@earendil-works/pi-tui";
+import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
function fitBorder(
left: string,
diff --git a/packages/coding-agent/examples/extensions/built-in-tool-renderer.ts b/packages/coding-agent/examples/extensions/built-in-tool-renderer.ts
index afd41a965..3a9dc37c9 100644
--- a/packages/coding-agent/examples/extensions/built-in-tool-renderer.ts
+++ b/packages/coding-agent/examples/extensions/built-in-tool-renderer.ts
@@ -25,9 +25,9 @@
* pi -e ./built-in-tool-renderer.ts
*/
-import type { BashToolDetails, EditToolDetails, ExtensionAPI, ReadToolDetails } from "@mariozechner/pi-coding-agent";
-import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@mariozechner/pi-coding-agent";
-import { Text } from "@mariozechner/pi-tui";
+import type { BashToolDetails, EditToolDetails, ExtensionAPI, ReadToolDetails } from "@earendil-works/pi-coding-agent";
+import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@earendil-works/pi-coding-agent";
+import { Text } from "@earendil-works/pi-tui";
export default function (pi: ExtensionAPI) {
const cwd = process.cwd();
diff --git a/packages/coding-agent/examples/extensions/claude-rules.ts b/packages/coding-agent/examples/extensions/claude-rules.ts
index 285bed427..be361c582 100644
--- a/packages/coding-agent/examples/extensions/claude-rules.ts
+++ b/packages/coding-agent/examples/extensions/claude-rules.ts
@@ -19,7 +19,7 @@
import * as fs from "node:fs";
import * as path from "node:path";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
/**
* Recursively find all .md files in a directory
diff --git a/packages/coding-agent/examples/extensions/commands.ts b/packages/coding-agent/examples/extensions/commands.ts
index 0784c7a1e..346c5f21e 100644
--- a/packages/coding-agent/examples/extensions/commands.ts
+++ b/packages/coding-agent/examples/extensions/commands.ts
@@ -10,7 +10,7 @@
* 3. Use /commands extensions to filter by source
*/
-import type { ExtensionAPI, SlashCommandInfo } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, SlashCommandInfo } from "@earendil-works/pi-coding-agent";
export default function commandsExtension(pi: ExtensionAPI) {
pi.registerCommand("commands", {
diff --git a/packages/coding-agent/examples/extensions/confirm-destructive.ts b/packages/coding-agent/examples/extensions/confirm-destructive.ts
index 7a32df825..7d4201f75 100644
--- a/packages/coding-agent/examples/extensions/confirm-destructive.ts
+++ b/packages/coding-agent/examples/extensions/confirm-destructive.ts
@@ -5,7 +5,7 @@
* Demonstrates how to cancel session events using the before_* events.
*/
-import type { ExtensionAPI, SessionBeforeSwitchEvent, SessionMessageEntry } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, SessionBeforeSwitchEvent, SessionMessageEntry } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("session_before_switch", async (event: SessionBeforeSwitchEvent, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/custom-compaction.ts b/packages/coding-agent/examples/extensions/custom-compaction.ts
index f374839fa..02c6ceb3a 100644
--- a/packages/coding-agent/examples/extensions/custom-compaction.ts
+++ b/packages/coding-agent/examples/extensions/custom-compaction.ts
@@ -13,9 +13,9 @@
* pi --extension examples/extensions/custom-compaction.ts
*/
-import { complete } from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { convertToLlm, serializeConversation } from "@mariozechner/pi-coding-agent";
+import { complete } from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { convertToLlm, serializeConversation } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("session_before_compact", async (event, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/custom-footer.ts b/packages/coding-agent/examples/extensions/custom-footer.ts
index f35853df6..15e41e06f 100644
--- a/packages/coding-agent/examples/extensions/custom-footer.ts
+++ b/packages/coding-agent/examples/extensions/custom-footer.ts
@@ -8,9 +8,9 @@
* Token stats come from ctx.sessionManager/ctx.model (already accessible).
*/
-import type { AssistantMessage } from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
+import type { AssistantMessage } from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
export default function (pi: ExtensionAPI) {
let enabled = false;
diff --git a/packages/coding-agent/examples/extensions/custom-header.ts b/packages/coding-agent/examples/extensions/custom-header.ts
index 94ebb3d9c..e3aeb6561 100644
--- a/packages/coding-agent/examples/extensions/custom-header.ts
+++ b/packages/coding-agent/examples/extensions/custom-header.ts
@@ -5,8 +5,8 @@
* (logo + keybinding hints) with a custom component showing the pi mascot.
*/
-import type { ExtensionAPI, Theme } from "@mariozechner/pi-coding-agent";
-import { VERSION } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, Theme } from "@earendil-works/pi-coding-agent";
+import { VERSION } from "@earendil-works/pi-coding-agent";
// --- PI MASCOT ---
// Based on pi_mascot.ts - the pi agent character
diff --git a/packages/coding-agent/examples/extensions/custom-provider-anthropic/index.ts b/packages/coding-agent/examples/extensions/custom-provider-anthropic/index.ts
index c1227326c..69267f400 100644
--- a/packages/coding-agent/examples/extensions/custom-provider-anthropic/index.ts
+++ b/packages/coding-agent/examples/extensions/custom-provider-anthropic/index.ts
@@ -42,8 +42,8 @@ import {
type Tool,
type ToolCall,
type ToolResultMessage,
-} from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
// =============================================================================
// OAuth Implementation (copied from packages/ai/src/utils/oauth/anthropic.ts)
diff --git a/packages/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json b/packages/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json
index ac299123a..0b4792645 100644
--- a/packages/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json
+++ b/packages/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "pi-extension-custom-provider",
- "version": "0.73.0",
+ "version": "0.74.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pi-extension-custom-provider",
- "version": "0.73.0",
+ "version": "0.74.0",
"dependencies": {
"@anthropic-ai/sdk": "^0.52.0"
}
diff --git a/packages/coding-agent/examples/extensions/custom-provider-anthropic/package.json b/packages/coding-agent/examples/extensions/custom-provider-anthropic/package.json
index 7f1f00882..1c96be83f 100644
--- a/packages/coding-agent/examples/extensions/custom-provider-anthropic/package.json
+++ b/packages/coding-agent/examples/extensions/custom-provider-anthropic/package.json
@@ -1,7 +1,7 @@
{
"name": "pi-extension-custom-provider-anthropic",
"private": true,
- "version": "0.73.0",
+ "version": "0.74.0",
"type": "module",
"scripts": {
"clean": "echo 'nothing to clean'",
diff --git a/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts b/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts
index 673402b06..23d0a40a6 100644
--- a/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts
+++ b/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts
@@ -20,8 +20,8 @@ import {
type SimpleStreamOptions,
streamSimpleAnthropic,
streamSimpleOpenAIResponses,
-} from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
// =============================================================================
// Constants
diff --git a/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json b/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json
index b74591d2f..3f5084d91 100644
--- a/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json
+++ b/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json
@@ -1,7 +1,7 @@
{
"name": "pi-extension-custom-provider-gitlab-duo",
"private": true,
- "version": "0.73.0",
+ "version": "0.74.0",
"type": "module",
"scripts": {
"clean": "echo 'nothing to clean'",
diff --git a/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts b/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts
index 9731fcdc8..c79637325 100644
--- a/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts
+++ b/packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts
@@ -8,7 +8,7 @@
* npx tsx test.ts claude-sonnet-4-5-20250929 --thinking
*/
-import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@mariozechner/pi-ai";
+import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@earendil-works/pi-ai";
import { readFileSync } from "fs";
import { getAgentDir } from "packages/coding-agent/src/config.js";
import { join } from "path";
diff --git a/packages/coding-agent/examples/extensions/dirty-repo-guard.ts b/packages/coding-agent/examples/extensions/dirty-repo-guard.ts
index e6e2b5cc7..5357464ef 100644
--- a/packages/coding-agent/examples/extensions/dirty-repo-guard.ts
+++ b/packages/coding-agent/examples/extensions/dirty-repo-guard.ts
@@ -5,7 +5,7 @@
* Useful to ensure work is committed before switching context.
*/
-import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
async function checkDirtyRepo(
pi: ExtensionAPI,
diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts b/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts
index 86082a92b..dbc795b91 100644
--- a/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts
+++ b/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts
@@ -5,8 +5,8 @@
* Height is calculated from width to maintain DOOM's aspect ratio.
*/
-import type { Component } from "@mariozechner/pi-tui";
-import { isKeyRelease, type TUI } from "@mariozechner/pi-tui";
+import type { Component } from "@earendil-works/pi-tui";
+import { isKeyRelease, type TUI } from "@earendil-works/pi-tui";
import type { DoomEngine } from "./doom-engine.js";
import { DoomKeys, mapKeyToDoom } from "./doom-keys.js";
diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts b/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts
index 3a00eb285..cb71a44d8 100644
--- a/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts
+++ b/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts
@@ -34,7 +34,7 @@ export const DoomKeys = {
KEY_RALT: 0x80 + 0x38,
} as const;
-import { Key, matchesKey, parseKey } from "@mariozechner/pi-tui";
+import { Key, matchesKey, parseKey } from "@earendil-works/pi-tui";
/**
* Map terminal key input to DOOM key codes
diff --git a/packages/coding-agent/examples/extensions/doom-overlay/index.ts b/packages/coding-agent/examples/extensions/doom-overlay/index.ts
index 5ef08e6f2..434f0be1b 100644
--- a/packages/coding-agent/examples/extensions/doom-overlay/index.ts
+++ b/packages/coding-agent/examples/extensions/doom-overlay/index.ts
@@ -9,7 +9,7 @@
* This demonstrates that overlays can handle real-time game rendering at 35 FPS.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { DoomOverlayComponent } from "./doom-component.js";
import { DoomEngine } from "./doom-engine.js";
import { ensureWadFile } from "./wad-finder.js";
diff --git a/packages/coding-agent/examples/extensions/dynamic-resources/dynamic.json b/packages/coding-agent/examples/extensions/dynamic-resources/dynamic.json
index 73b8db3b0..9f2f760bc 100644
--- a/packages/coding-agent/examples/extensions/dynamic-resources/dynamic.json
+++ b/packages/coding-agent/examples/extensions/dynamic-resources/dynamic.json
@@ -1,5 +1,5 @@
{
- "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
"name": "dynamic-resources",
"vars": {
"cyan": "#00d7ff",
diff --git a/packages/coding-agent/examples/extensions/dynamic-resources/index.ts b/packages/coding-agent/examples/extensions/dynamic-resources/index.ts
index 684ad5b08..2f89f93e3 100644
--- a/packages/coding-agent/examples/extensions/dynamic-resources/index.ts
+++ b/packages/coding-agent/examples/extensions/dynamic-resources/index.ts
@@ -1,6 +1,6 @@
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
const baseDir = dirname(fileURLToPath(import.meta.url));
diff --git a/packages/coding-agent/examples/extensions/dynamic-tools.ts b/packages/coding-agent/examples/extensions/dynamic-tools.ts
index 0d8b83591..54ad13b42 100644
--- a/packages/coding-agent/examples/extensions/dynamic-tools.ts
+++ b/packages/coding-agent/examples/extensions/dynamic-tools.ts
@@ -7,7 +7,7 @@
* - Registers additional tools at runtime via /add-echo-tool
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
const ECHO_PARAMS = Type.Object({
diff --git a/packages/coding-agent/examples/extensions/event-bus.ts b/packages/coding-agent/examples/extensions/event-bus.ts
index 0a4b8c100..e63caa513 100644
--- a/packages/coding-agent/examples/extensions/event-bus.ts
+++ b/packages/coding-agent/examples/extensions/event-bus.ts
@@ -7,7 +7,7 @@
* Usage: /emit [event-name] [data] - emit an event on the bus
*/
-import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
// Store ctx for use in event handler
diff --git a/packages/coding-agent/examples/extensions/file-trigger.ts b/packages/coding-agent/examples/extensions/file-trigger.ts
index 76abcfeb9..8b9894c53 100644
--- a/packages/coding-agent/examples/extensions/file-trigger.ts
+++ b/packages/coding-agent/examples/extensions/file-trigger.ts
@@ -9,7 +9,7 @@
*/
import * as fs from "node:fs";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("session_start", async (_event, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/git-checkpoint.ts b/packages/coding-agent/examples/extensions/git-checkpoint.ts
index 54ec6546b..7ee5e6af8 100644
--- a/packages/coding-agent/examples/extensions/git-checkpoint.ts
+++ b/packages/coding-agent/examples/extensions/git-checkpoint.ts
@@ -5,7 +5,7 @@
* When forking, offers to restore code to that point in history.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
const checkpoints = new Map();
diff --git a/packages/coding-agent/examples/extensions/github-issue-autocomplete.ts b/packages/coding-agent/examples/extensions/github-issue-autocomplete.ts
index c5c55e88b..0fd1b7be4 100644
--- a/packages/coding-agent/examples/extensions/github-issue-autocomplete.ts
+++ b/packages/coding-agent/examples/extensions/github-issue-autocomplete.ts
@@ -1,13 +1,13 @@
// Requires GitHub CLI (`gh`) and a GitHub repository checkout.
// Preloads the latest open issues once per session, then filters them locally for fast `#...` completion.
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import {
type AutocompleteItem,
type AutocompleteProvider,
type AutocompleteSuggestions,
fuzzyFilter,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
type GitHubIssue = {
number: number;
diff --git a/packages/coding-agent/examples/extensions/handoff.ts b/packages/coding-agent/examples/extensions/handoff.ts
index 05f3c9952..10581dc6e 100644
--- a/packages/coding-agent/examples/extensions/handoff.ts
+++ b/packages/coding-agent/examples/extensions/handoff.ts
@@ -12,10 +12,10 @@
* The generated prompt appears as a draft in the editor for review/editing.
*/
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import { complete, type Message } from "@mariozechner/pi-ai";
-import type { ExtensionAPI, SessionEntry } from "@mariozechner/pi-coding-agent";
-import { BorderedLoader, convertToLlm, serializeConversation } from "@mariozechner/pi-coding-agent";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import { complete, type Message } from "@earendil-works/pi-ai";
+import type { ExtensionAPI, SessionEntry } from "@earendil-works/pi-coding-agent";
+import { BorderedLoader, convertToLlm, serializeConversation } from "@earendil-works/pi-coding-agent";
const SYSTEM_PROMPT = `You are a context transfer assistant. Given a conversation history and the user's goal for a new thread, generate a focused prompt that:
diff --git a/packages/coding-agent/examples/extensions/hello.ts b/packages/coding-agent/examples/extensions/hello.ts
index d56da6492..52da3910b 100644
--- a/packages/coding-agent/examples/extensions/hello.ts
+++ b/packages/coding-agent/examples/extensions/hello.ts
@@ -2,8 +2,8 @@
* Hello Tool - Minimal custom tool example
*/
-import { Type } from "@mariozechner/pi-ai";
-import { defineTool, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import { Type } from "@earendil-works/pi-ai";
+import { defineTool, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
const helloTool = defineTool({
name: "hello",
diff --git a/packages/coding-agent/examples/extensions/hidden-thinking-label.ts b/packages/coding-agent/examples/extensions/hidden-thinking-label.ts
index 77e45a8e4..bcdaab66a 100644
--- a/packages/coding-agent/examples/extensions/hidden-thinking-label.ts
+++ b/packages/coding-agent/examples/extensions/hidden-thinking-label.ts
@@ -18,7 +18,7 @@
* /thinking-label Reset to the default label
*/
-import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
const DEFAULT_LABEL = "Pondering...";
diff --git a/packages/coding-agent/examples/extensions/inline-bash.ts b/packages/coding-agent/examples/extensions/inline-bash.ts
index 07b56d00f..11849696d 100644
--- a/packages/coding-agent/examples/extensions/inline-bash.ts
+++ b/packages/coding-agent/examples/extensions/inline-bash.ts
@@ -14,7 +14,7 @@
*
* Note: Regular !command syntax (whole-line bash) is preserved and works as before.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
const PATTERN = /!\{([^}]+)\}/g;
diff --git a/packages/coding-agent/examples/extensions/input-transform.ts b/packages/coding-agent/examples/extensions/input-transform.ts
index af785b4da..e47c1af5d 100644
--- a/packages/coding-agent/examples/extensions/input-transform.ts
+++ b/packages/coding-agent/examples/extensions/input-transform.ts
@@ -9,7 +9,7 @@
* ping → "pong" (instant, no LLM)
* time → current time (instant, no LLM)
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("input", async (event, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/interactive-shell.ts b/packages/coding-agent/examples/extensions/interactive-shell.ts
index 87ed8d469..99a7f9632 100644
--- a/packages/coding-agent/examples/extensions/interactive-shell.ts
+++ b/packages/coding-agent/examples/extensions/interactive-shell.ts
@@ -21,7 +21,7 @@
*/
import { spawnSync } from "node:child_process";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
// Default interactive commands - editors, pagers, git ops, TUIs
const DEFAULT_INTERACTIVE_COMMANDS = [
diff --git a/packages/coding-agent/examples/extensions/mac-system-theme.ts b/packages/coding-agent/examples/extensions/mac-system-theme.ts
index e481b0e25..c2095cf78 100644
--- a/packages/coding-agent/examples/extensions/mac-system-theme.ts
+++ b/packages/coding-agent/examples/extensions/mac-system-theme.ts
@@ -7,7 +7,7 @@
import { exec } from "node:child_process";
import { promisify } from "node:util";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
const execAsync = promisify(exec);
diff --git a/packages/coding-agent/examples/extensions/message-renderer.ts b/packages/coding-agent/examples/extensions/message-renderer.ts
index 47a061d3d..9183d1ec6 100644
--- a/packages/coding-agent/examples/extensions/message-renderer.ts
+++ b/packages/coding-agent/examples/extensions/message-renderer.ts
@@ -7,8 +7,8 @@
* Usage: /status [message] - sends a status message with custom rendering
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { Box, Text } from "@mariozechner/pi-tui";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { Box, Text } from "@earendil-works/pi-tui";
export default function (pi: ExtensionAPI) {
// Register custom renderer for "status-update" messages
diff --git a/packages/coding-agent/examples/extensions/minimal-mode.ts b/packages/coding-agent/examples/extensions/minimal-mode.ts
index 591e2a351..6aef0c06e 100644
--- a/packages/coding-agent/examples/extensions/minimal-mode.ts
+++ b/packages/coding-agent/examples/extensions/minimal-mode.ts
@@ -16,7 +16,7 @@
* Then use ctrl+o to toggle between minimal (collapsed) and full (expanded) views.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import {
createBashTool,
createEditTool,
@@ -25,8 +25,8 @@ import {
createLsTool,
createReadTool,
createWriteTool,
-} from "@mariozechner/pi-coding-agent";
-import { Text } from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-coding-agent";
+import { Text } from "@earendil-works/pi-tui";
import { homedir } from "os";
/**
diff --git a/packages/coding-agent/examples/extensions/modal-editor.ts b/packages/coding-agent/examples/extensions/modal-editor.ts
index c1b9d73ff..01959dd39 100644
--- a/packages/coding-agent/examples/extensions/modal-editor.ts
+++ b/packages/coding-agent/examples/extensions/modal-editor.ts
@@ -9,8 +9,8 @@
* - ctrl+c, ctrl+d, etc. work in both modes
*/
-import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
+import { CustomEditor, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { matchesKey, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
// Normal mode key mappings: key -> escape sequence (or null for mode switch)
const NORMAL_KEYS: Record = {
diff --git a/packages/coding-agent/examples/extensions/model-status.ts b/packages/coding-agent/examples/extensions/model-status.ts
index bcbb733b2..7dfa18bbb 100644
--- a/packages/coding-agent/examples/extensions/model-status.ts
+++ b/packages/coding-agent/examples/extensions/model-status.ts
@@ -7,7 +7,7 @@
* Usage: pi -e ./model-status.ts
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("model_select", async (event, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/notify.ts b/packages/coding-agent/examples/extensions/notify.ts
index 472185349..f7b1f819a 100644
--- a/packages/coding-agent/examples/extensions/notify.ts
+++ b/packages/coding-agent/examples/extensions/notify.ts
@@ -8,7 +8,7 @@
* - Windows toast: Windows Terminal (WSL)
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
function windowsToastScript(title: string, body: string): string {
const type = "Windows.UI.Notifications";
diff --git a/packages/coding-agent/examples/extensions/overlay-qa-tests.ts b/packages/coding-agent/examples/extensions/overlay-qa-tests.ts
index 8ad4a32b7..b13f43a9f 100644
--- a/packages/coding-agent/examples/extensions/overlay-qa-tests.ts
+++ b/packages/coding-agent/examples/extensions/overlay-qa-tests.ts
@@ -19,9 +19,9 @@
* /overlay-streaming - Multiple input panels with simulated streaming (Tab to cycle focus)
*/
-import type { ExtensionAPI, ExtensionCommandContext, Theme } from "@mariozechner/pi-coding-agent";
-import type { Component, OverlayAnchor, OverlayHandle, OverlayOptions, TUI } from "@mariozechner/pi-tui";
-import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
+import type { ExtensionAPI, ExtensionCommandContext, Theme } from "@earendil-works/pi-coding-agent";
+import type { Component, OverlayAnchor, OverlayHandle, OverlayOptions, TUI } from "@earendil-works/pi-tui";
+import { matchesKey, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
import { spawn } from "child_process";
// Global handle for toggle demo (in real code, use a more elegant pattern)
diff --git a/packages/coding-agent/examples/extensions/overlay-test.ts b/packages/coding-agent/examples/extensions/overlay-test.ts
index 80aa20172..02f8204b1 100644
--- a/packages/coding-agent/examples/extensions/overlay-test.ts
+++ b/packages/coding-agent/examples/extensions/overlay-test.ts
@@ -8,8 +8,8 @@
* - Edge case tests (wide chars, styled text, emoji)
*/
-import type { ExtensionAPI, ExtensionCommandContext, Theme } from "@mariozechner/pi-coding-agent";
-import { CURSOR_MARKER, type Focusable, matchesKey, visibleWidth } from "@mariozechner/pi-tui";
+import type { ExtensionAPI, ExtensionCommandContext, Theme } from "@earendil-works/pi-coding-agent";
+import { CURSOR_MARKER, type Focusable, matchesKey, visibleWidth } from "@earendil-works/pi-tui";
export default function (pi: ExtensionAPI) {
pi.registerCommand("overlay-test", {
diff --git a/packages/coding-agent/examples/extensions/permission-gate.ts b/packages/coding-agent/examples/extensions/permission-gate.ts
index 0fc97c4d0..ce29f7eb5 100644
--- a/packages/coding-agent/examples/extensions/permission-gate.ts
+++ b/packages/coding-agent/examples/extensions/permission-gate.ts
@@ -5,7 +5,7 @@
* Patterns checked: rm -rf, sudo, chmod/chown 777
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
const dangerousPatterns = [/\brm\s+(-rf?|--recursive)/i, /\bsudo\b/i, /\b(chmod|chown)\b.*777/i];
diff --git a/packages/coding-agent/examples/extensions/pirate.ts b/packages/coding-agent/examples/extensions/pirate.ts
index 9231574b8..abde601db 100644
--- a/packages/coding-agent/examples/extensions/pirate.ts
+++ b/packages/coding-agent/examples/extensions/pirate.ts
@@ -10,7 +10,7 @@
* 3. When enabled, the agent will respond like a pirate
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function pirateExtension(pi: ExtensionAPI) {
let pirateMode = false;
diff --git a/packages/coding-agent/examples/extensions/plan-mode/index.ts b/packages/coding-agent/examples/extensions/plan-mode/index.ts
index 0c77b9bd6..709741d1e 100644
--- a/packages/coding-agent/examples/extensions/plan-mode/index.ts
+++ b/packages/coding-agent/examples/extensions/plan-mode/index.ts
@@ -12,10 +12,10 @@
* - Progress tracking widget during execution
*/
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { AssistantMessage, TextContent } from "@mariozechner/pi-ai";
-import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
-import { Key } from "@mariozechner/pi-tui";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { AssistantMessage, TextContent } from "@earendil-works/pi-ai";
+import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
+import { Key } from "@earendil-works/pi-tui";
import { extractTodoItems, isSafeCommand, markCompletedSteps, type TodoItem } from "./utils.js";
// Tools
diff --git a/packages/coding-agent/examples/extensions/preset.ts b/packages/coding-agent/examples/extensions/preset.ts
index a0cf663eb..92224ec2b 100644
--- a/packages/coding-agent/examples/extensions/preset.ts
+++ b/packages/coding-agent/examples/extensions/preset.ts
@@ -40,10 +40,10 @@
import { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
-import type { Api, Model } from "@mariozechner/pi-ai";
-import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
-import { DynamicBorder, getAgentDir } from "@mariozechner/pi-coding-agent";
-import { Container, Key, type SelectItem, SelectList, Text } from "@mariozechner/pi-tui";
+import type { Api, Model } from "@earendil-works/pi-ai";
+import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
+import { DynamicBorder, getAgentDir } from "@earendil-works/pi-coding-agent";
+import { Container, Key, type SelectItem, SelectList, Text } from "@earendil-works/pi-tui";
// Preset configuration
interface Preset {
diff --git a/packages/coding-agent/examples/extensions/prompt-customizer.ts b/packages/coding-agent/examples/extensions/prompt-customizer.ts
index 92b70feb9..5777dd5ec 100644
--- a/packages/coding-agent/examples/extensions/prompt-customizer.ts
+++ b/packages/coding-agent/examples/extensions/prompt-customizer.ts
@@ -12,7 +12,7 @@
* 2. Use the extension — it automatically adapts to your active tools and skills
*/
-import type { BuildSystemPromptOptions, ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { BuildSystemPromptOptions, ExtensionAPI } from "@earendil-works/pi-coding-agent";
/**
* Adds tool-specific guidance that adapts to the active tool set.
diff --git a/packages/coding-agent/examples/extensions/protected-paths.ts b/packages/coding-agent/examples/extensions/protected-paths.ts
index fbc1169cd..2cd9cd2bd 100644
--- a/packages/coding-agent/examples/extensions/protected-paths.ts
+++ b/packages/coding-agent/examples/extensions/protected-paths.ts
@@ -5,7 +5,7 @@
* Useful for preventing accidental modifications to sensitive files.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
const protectedPaths = [".env", ".git/", "node_modules/"];
diff --git a/packages/coding-agent/examples/extensions/provider-payload.ts b/packages/coding-agent/examples/extensions/provider-payload.ts
index 738a44125..860ddc00e 100644
--- a/packages/coding-agent/examples/extensions/provider-payload.ts
+++ b/packages/coding-agent/examples/extensions/provider-payload.ts
@@ -1,6 +1,6 @@
import { appendFileSync } from "node:fs";
import { join } from "node:path";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
const logFile = join(process.cwd(), ".pi", "provider-payload.log");
diff --git a/packages/coding-agent/examples/extensions/qna.ts b/packages/coding-agent/examples/extensions/qna.ts
index 04f14604e..2675b5d76 100644
--- a/packages/coding-agent/examples/extensions/qna.ts
+++ b/packages/coding-agent/examples/extensions/qna.ts
@@ -7,9 +7,9 @@
* 3. Loads the result into the editor for user to fill in answers
*/
-import { complete, type UserMessage } from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { BorderedLoader } from "@mariozechner/pi-coding-agent";
+import { complete, type UserMessage } from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { BorderedLoader } from "@earendil-works/pi-coding-agent";
const SYSTEM_PROMPT = `You are a question extractor. Given text from a conversation, extract any questions that need answering and format them for the user to fill in.
diff --git a/packages/coding-agent/examples/extensions/question.ts b/packages/coding-agent/examples/extensions/question.ts
index f23fc68ee..7aba1d709 100644
--- a/packages/coding-agent/examples/extensions/question.ts
+++ b/packages/coding-agent/examples/extensions/question.ts
@@ -4,8 +4,8 @@
* Escape in editor returns to options, Escape in options cancels
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { Editor, type EditorTheme, Key, matchesKey, Text, truncateToWidth } from "@mariozechner/pi-tui";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { Editor, type EditorTheme, Key, matchesKey, Text, truncateToWidth } from "@earendil-works/pi-tui";
import { Type } from "typebox";
interface OptionWithDesc {
diff --git a/packages/coding-agent/examples/extensions/questionnaire.ts b/packages/coding-agent/examples/extensions/questionnaire.ts
index b56b659b0..34fb666c1 100644
--- a/packages/coding-agent/examples/extensions/questionnaire.ts
+++ b/packages/coding-agent/examples/extensions/questionnaire.ts
@@ -5,8 +5,8 @@
* Multiple questions: tab bar navigation between questions
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { Editor, type EditorTheme, Key, matchesKey, Text, truncateToWidth } from "@mariozechner/pi-tui";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { Editor, type EditorTheme, Key, matchesKey, Text, truncateToWidth } from "@earendil-works/pi-tui";
import { Type } from "typebox";
// Types
diff --git a/packages/coding-agent/examples/extensions/rainbow-editor.ts b/packages/coding-agent/examples/extensions/rainbow-editor.ts
index f54c98882..20b7437c9 100644
--- a/packages/coding-agent/examples/extensions/rainbow-editor.ts
+++ b/packages/coding-agent/examples/extensions/rainbow-editor.ts
@@ -4,7 +4,7 @@
* Usage: pi --extension ./examples/extensions/rainbow-editor.ts
*/
-import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import { CustomEditor, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
// Base colors (coral → yellow → green → teal → blue → purple → pink)
const COLORS: [number, number, number][] = [
diff --git a/packages/coding-agent/examples/extensions/reload-runtime.ts b/packages/coding-agent/examples/extensions/reload-runtime.ts
index ecca96bd4..be46410f2 100644
--- a/packages/coding-agent/examples/extensions/reload-runtime.ts
+++ b/packages/coding-agent/examples/extensions/reload-runtime.ts
@@ -5,7 +5,7 @@
* tool that queues a follow-up command to trigger reload.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function (pi: ExtensionAPI) {
diff --git a/packages/coding-agent/examples/extensions/rpc-demo.ts b/packages/coding-agent/examples/extensions/rpc-demo.ts
index 08703d391..78789a13e 100644
--- a/packages/coding-agent/examples/extensions/rpc-demo.ts
+++ b/packages/coding-agent/examples/extensions/rpc-demo.ts
@@ -17,7 +17,7 @@
* - setEditorText() - via /rpc-prefill command
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
let turnCount = 0;
diff --git a/packages/coding-agent/examples/extensions/sandbox/index.ts b/packages/coding-agent/examples/extensions/sandbox/index.ts
index 25cad0861..94f8f1cf1 100644
--- a/packages/coding-agent/examples/extensions/sandbox/index.ts
+++ b/packages/coding-agent/examples/extensions/sandbox/index.ts
@@ -45,8 +45,8 @@ import { spawn } from "node:child_process";
import { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { SandboxManager, type SandboxRuntimeConfig } from "@anthropic-ai/sandbox-runtime";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { type BashOperations, createBashTool, getAgentDir } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { type BashOperations, createBashTool, getAgentDir } from "@earendil-works/pi-coding-agent";
interface SandboxConfig extends SandboxRuntimeConfig {
enabled?: boolean;
diff --git a/packages/coding-agent/examples/extensions/sandbox/package-lock.json b/packages/coding-agent/examples/extensions/sandbox/package-lock.json
index fbe7ec7c6..90ef1c2f5 100644
--- a/packages/coding-agent/examples/extensions/sandbox/package-lock.json
+++ b/packages/coding-agent/examples/extensions/sandbox/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "pi-extension-sandbox",
- "version": "1.3.0",
+ "version": "1.4.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pi-extension-sandbox",
- "version": "1.3.0",
+ "version": "1.4.0",
"dependencies": {
"@anthropic-ai/sandbox-runtime": "^0.0.26"
}
diff --git a/packages/coding-agent/examples/extensions/sandbox/package.json b/packages/coding-agent/examples/extensions/sandbox/package.json
index e9190db9b..688fe2240 100644
--- a/packages/coding-agent/examples/extensions/sandbox/package.json
+++ b/packages/coding-agent/examples/extensions/sandbox/package.json
@@ -1,7 +1,7 @@
{
"name": "pi-extension-sandbox",
"private": true,
- "version": "1.3.0",
+ "version": "1.4.0",
"type": "module",
"scripts": {
"clean": "echo 'nothing to clean'",
diff --git a/packages/coding-agent/examples/extensions/send-user-message.ts b/packages/coding-agent/examples/extensions/send-user-message.ts
index b2efbb7c9..cf4eb138c 100644
--- a/packages/coding-agent/examples/extensions/send-user-message.ts
+++ b/packages/coding-agent/examples/extensions/send-user-message.ts
@@ -11,7 +11,7 @@
* /followup And then? - Sends while streaming with followUp delivery
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
// Simple command that sends a user message
diff --git a/packages/coding-agent/examples/extensions/session-name.ts b/packages/coding-agent/examples/extensions/session-name.ts
index 8ff1c3783..48203dea9 100644
--- a/packages/coding-agent/examples/extensions/session-name.ts
+++ b/packages/coding-agent/examples/extensions/session-name.ts
@@ -7,7 +7,7 @@
* Usage: /session-name [name] - set or show session name
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.registerCommand("session-name", {
diff --git a/packages/coding-agent/examples/extensions/shutdown-command.ts b/packages/coding-agent/examples/extensions/shutdown-command.ts
index bb570b161..743f8807d 100644
--- a/packages/coding-agent/examples/extensions/shutdown-command.ts
+++ b/packages/coding-agent/examples/extensions/shutdown-command.ts
@@ -5,7 +5,7 @@
* Demonstrates how extensions can use ctx.shutdown() to exit pi cleanly.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function (pi: ExtensionAPI) {
diff --git a/packages/coding-agent/examples/extensions/snake.ts b/packages/coding-agent/examples/extensions/snake.ts
index 4378f758e..29995b36c 100644
--- a/packages/coding-agent/examples/extensions/snake.ts
+++ b/packages/coding-agent/examples/extensions/snake.ts
@@ -2,8 +2,8 @@
* Snake game extension - play snake with /snake command
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { matchesKey, visibleWidth } from "@mariozechner/pi-tui";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { matchesKey, visibleWidth } from "@earendil-works/pi-tui";
const GAME_WIDTH = 40;
const GAME_HEIGHT = 15;
diff --git a/packages/coding-agent/examples/extensions/space-invaders.ts b/packages/coding-agent/examples/extensions/space-invaders.ts
index 204a77290..c91071b88 100644
--- a/packages/coding-agent/examples/extensions/space-invaders.ts
+++ b/packages/coding-agent/examples/extensions/space-invaders.ts
@@ -3,8 +3,8 @@
* Uses Kitty keyboard protocol for smooth movement (press/release detection)
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { isKeyRelease, Key, matchesKey, visibleWidth } from "@mariozechner/pi-tui";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { isKeyRelease, Key, matchesKey, visibleWidth } from "@earendil-works/pi-tui";
const GAME_WIDTH = 60;
const GAME_HEIGHT = 24;
diff --git a/packages/coding-agent/examples/extensions/ssh.ts b/packages/coding-agent/examples/extensions/ssh.ts
index 73add6a53..6ca451103 100644
--- a/packages/coding-agent/examples/extensions/ssh.ts
+++ b/packages/coding-agent/examples/extensions/ssh.ts
@@ -14,7 +14,7 @@
*/
import { spawn } from "node:child_process";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import {
type BashOperations,
createBashTool,
@@ -24,7 +24,7 @@ import {
type EditOperations,
type ReadOperations,
type WriteOperations,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
function sshExec(remote: string, command: string): Promise {
return new Promise((resolve, reject) => {
diff --git a/packages/coding-agent/examples/extensions/status-line.ts b/packages/coding-agent/examples/extensions/status-line.ts
index d08884623..6c4a3a477 100644
--- a/packages/coding-agent/examples/extensions/status-line.ts
+++ b/packages/coding-agent/examples/extensions/status-line.ts
@@ -5,7 +5,7 @@
* Shows turn progress with themed colors.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
let turnCount = 0;
diff --git a/packages/coding-agent/examples/extensions/structured-output.ts b/packages/coding-agent/examples/extensions/structured-output.ts
index 17f19938d..13331377f 100644
--- a/packages/coding-agent/examples/extensions/structured-output.ts
+++ b/packages/coding-agent/examples/extensions/structured-output.ts
@@ -5,8 +5,8 @@
* without paying for an extra follow-up LLM turn.
*/
-import { defineTool, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
-import { Text } from "@mariozechner/pi-tui";
+import { defineTool, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
+import { Text } from "@earendil-works/pi-tui";
import { Type } from "typebox";
interface StructuredOutputDetails {
diff --git a/packages/coding-agent/examples/extensions/subagent/agents.ts b/packages/coding-agent/examples/extensions/subagent/agents.ts
index 2ae320342..eab6c6302 100644
--- a/packages/coding-agent/examples/extensions/subagent/agents.ts
+++ b/packages/coding-agent/examples/extensions/subagent/agents.ts
@@ -4,7 +4,7 @@
import * as fs from "node:fs";
import * as path from "node:path";
-import { getAgentDir, parseFrontmatter } from "@mariozechner/pi-coding-agent";
+import { getAgentDir, parseFrontmatter } from "@earendil-works/pi-coding-agent";
export type AgentScope = "user" | "project" | "both";
diff --git a/packages/coding-agent/examples/extensions/subagent/index.ts b/packages/coding-agent/examples/extensions/subagent/index.ts
index 24c524d9c..a9b6da425 100644
--- a/packages/coding-agent/examples/extensions/subagent/index.ts
+++ b/packages/coding-agent/examples/extensions/subagent/index.ts
@@ -16,11 +16,11 @@ import { spawn } from "node:child_process";
import * as fs from "node:fs";
import * as os from "node:os";
import * as path from "node:path";
-import type { AgentToolResult } from "@mariozechner/pi-agent-core";
-import type { Message } from "@mariozechner/pi-ai";
-import { StringEnum } from "@mariozechner/pi-ai";
-import { type ExtensionAPI, getMarkdownTheme, withFileMutationQueue } from "@mariozechner/pi-coding-agent";
-import { Container, Markdown, Spacer, Text } from "@mariozechner/pi-tui";
+import type { AgentToolResult } from "@earendil-works/pi-agent-core";
+import type { Message } from "@earendil-works/pi-ai";
+import { StringEnum } from "@earendil-works/pi-ai";
+import { type ExtensionAPI, getMarkdownTheme, withFileMutationQueue } from "@earendil-works/pi-coding-agent";
+import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
import { Type } from "typebox";
import { type AgentConfig, type AgentScope, discoverAgents } from "./agents.js";
diff --git a/packages/coding-agent/examples/extensions/summarize.ts b/packages/coding-agent/examples/extensions/summarize.ts
index 14c90b712..dd30c3504 100644
--- a/packages/coding-agent/examples/extensions/summarize.ts
+++ b/packages/coding-agent/examples/extensions/summarize.ts
@@ -1,7 +1,7 @@
-import { complete, getModel } from "@mariozechner/pi-ai";
-import type { ExtensionAPI, ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
-import { DynamicBorder, getMarkdownTheme } from "@mariozechner/pi-coding-agent";
-import { Container, Markdown, matchesKey, Text } from "@mariozechner/pi-tui";
+import { complete, getModel } from "@earendil-works/pi-ai";
+import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
+import { DynamicBorder, getMarkdownTheme } from "@earendil-works/pi-coding-agent";
+import { Container, Markdown, matchesKey, Text } from "@earendil-works/pi-tui";
type ContentBlock = {
type?: string;
diff --git a/packages/coding-agent/examples/extensions/system-prompt-header.ts b/packages/coding-agent/examples/extensions/system-prompt-header.ts
index 7ef77976e..c6845b2bc 100644
--- a/packages/coding-agent/examples/extensions/system-prompt-header.ts
+++ b/packages/coding-agent/examples/extensions/system-prompt-header.ts
@@ -3,7 +3,7 @@
*
* Demonstrates ctx.getSystemPrompt() for accessing the effective system prompt.
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("agent_start", (_event, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/tic-tac-toe.ts b/packages/coding-agent/examples/extensions/tic-tac-toe.ts
index 78e0ad658..8cbfdeabb 100644
--- a/packages/coding-agent/examples/extensions/tic-tac-toe.ts
+++ b/packages/coding-agent/examples/extensions/tic-tac-toe.ts
@@ -17,9 +17,9 @@
* separate variables. Only the agent cursor is ever exposed to the agent.
*/
-import { StringEnum } from "@mariozechner/pi-ai";
-import type { ExtensionAPI, ExtensionContext, Theme, ToolExecutionMode } from "@mariozechner/pi-coding-agent";
-import { type Component, matchesKey, Text, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
+import { StringEnum } from "@earendil-works/pi-ai";
+import type { ExtensionAPI, ExtensionContext, Theme, ToolExecutionMode } from "@earendil-works/pi-coding-agent";
+import { type Component, matchesKey, Text, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
import { Type } from "typebox";
// Thrown from the tool on illegal actions. The agent runtime surfaces thrown
diff --git a/packages/coding-agent/examples/extensions/timed-confirm.ts b/packages/coding-agent/examples/extensions/timed-confirm.ts
index 465d6c605..1ab86e55b 100644
--- a/packages/coding-agent/examples/extensions/timed-confirm.ts
+++ b/packages/coding-agent/examples/extensions/timed-confirm.ts
@@ -7,7 +7,7 @@
* - /timed-signal - Shows confirm using AbortSignal (manual approach)
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
// Simple approach: use timeout option (recommended)
diff --git a/packages/coding-agent/examples/extensions/titlebar-spinner.ts b/packages/coding-agent/examples/extensions/titlebar-spinner.ts
index 33f92fa9d..51467acb6 100644
--- a/packages/coding-agent/examples/extensions/titlebar-spinner.ts
+++ b/packages/coding-agent/examples/extensions/titlebar-spinner.ts
@@ -9,7 +9,7 @@
*/
import path from "node:path";
-import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
const BRAILLE_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
diff --git a/packages/coding-agent/examples/extensions/todo.ts b/packages/coding-agent/examples/extensions/todo.ts
index 47c84be90..89b147c84 100644
--- a/packages/coding-agent/examples/extensions/todo.ts
+++ b/packages/coding-agent/examples/extensions/todo.ts
@@ -10,9 +10,9 @@
* correct for that point in history.
*/
-import { StringEnum } from "@mariozechner/pi-ai";
-import type { ExtensionAPI, ExtensionContext, Theme } from "@mariozechner/pi-coding-agent";
-import { matchesKey, Text, truncateToWidth } from "@mariozechner/pi-tui";
+import { StringEnum } from "@earendil-works/pi-ai";
+import type { ExtensionAPI, ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
+import { matchesKey, Text, truncateToWidth } from "@earendil-works/pi-tui";
import { Type } from "typebox";
interface Todo {
diff --git a/packages/coding-agent/examples/extensions/tool-override.ts b/packages/coding-agent/examples/extensions/tool-override.ts
index e8a924797..59a89bafd 100644
--- a/packages/coding-agent/examples/extensions/tool-override.ts
+++ b/packages/coding-agent/examples/extensions/tool-override.ts
@@ -20,8 +20,8 @@
* pi -e ./tool-override.ts
*/
-import type { TextContent } from "@mariozechner/pi-ai";
-import { type ExtensionAPI, getAgentDir, withFileMutationQueue } from "@mariozechner/pi-coding-agent";
+import type { TextContent } from "@earendil-works/pi-ai";
+import { type ExtensionAPI, getAgentDir, withFileMutationQueue } from "@earendil-works/pi-coding-agent";
import { constants, readFileSync } from "fs";
import { access, appendFile, readFile } from "fs/promises";
import { join, resolve } from "path";
diff --git a/packages/coding-agent/examples/extensions/tools.ts b/packages/coding-agent/examples/extensions/tools.ts
index 6fe81ea1d..5e617ab36 100644
--- a/packages/coding-agent/examples/extensions/tools.ts
+++ b/packages/coding-agent/examples/extensions/tools.ts
@@ -9,9 +9,9 @@
* 2. Use /tools to open the tool selector
*/
-import type { ExtensionAPI, ExtensionContext, ToolInfo } from "@mariozechner/pi-coding-agent";
-import { getSettingsListTheme } from "@mariozechner/pi-coding-agent";
-import { Container, type SettingItem, SettingsList } from "@mariozechner/pi-tui";
+import type { ExtensionAPI, ExtensionContext, ToolInfo } from "@earendil-works/pi-coding-agent";
+import { getSettingsListTheme } from "@earendil-works/pi-coding-agent";
+import { Container, type SettingItem, SettingsList } from "@earendil-works/pi-tui";
// State persisted to session
interface ToolsState {
diff --git a/packages/coding-agent/examples/extensions/trigger-compact.ts b/packages/coding-agent/examples/extensions/trigger-compact.ts
index cd0b59952..fed578110 100644
--- a/packages/coding-agent/examples/extensions/trigger-compact.ts
+++ b/packages/coding-agent/examples/extensions/trigger-compact.ts
@@ -1,4 +1,4 @@
-import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
const COMPACT_THRESHOLD_TOKENS = 100_000;
diff --git a/packages/coding-agent/examples/extensions/truncated-tool.ts b/packages/coding-agent/examples/extensions/truncated-tool.ts
index bbf78b673..9373344ff 100644
--- a/packages/coding-agent/examples/extensions/truncated-tool.ts
+++ b/packages/coding-agent/examples/extensions/truncated-tool.ts
@@ -15,7 +15,7 @@
*/
import { mkdtemp, writeFile } from "node:fs/promises";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import {
DEFAULT_MAX_BYTES,
DEFAULT_MAX_LINES,
@@ -23,8 +23,8 @@ import {
type TruncationResult,
truncateHead,
withFileMutationQueue,
-} from "@mariozechner/pi-coding-agent";
-import { Text } from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-coding-agent";
+import { Text } from "@earendil-works/pi-tui";
import { execSync } from "child_process";
import { tmpdir } from "os";
import { join } from "path";
diff --git a/packages/coding-agent/examples/extensions/widget-placement.ts b/packages/coding-agent/examples/extensions/widget-placement.ts
index 30f50910f..44bf5b604 100644
--- a/packages/coding-agent/examples/extensions/widget-placement.ts
+++ b/packages/coding-agent/examples/extensions/widget-placement.ts
@@ -1,4 +1,4 @@
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function widgetPlacementExtension(pi: ExtensionAPI) {
pi.on("session_start", (_event, ctx) => {
diff --git a/packages/coding-agent/examples/extensions/with-deps/index.ts b/packages/coding-agent/examples/extensions/with-deps/index.ts
index 5413095c0..17be7da04 100644
--- a/packages/coding-agent/examples/extensions/with-deps/index.ts
+++ b/packages/coding-agent/examples/extensions/with-deps/index.ts
@@ -5,7 +5,7 @@
* Requires: npm install in this directory
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import ms from "ms";
import { Type } from "typebox";
diff --git a/packages/coding-agent/examples/extensions/with-deps/package-lock.json b/packages/coding-agent/examples/extensions/with-deps/package-lock.json
index 98a992922..89eab8ace 100644
--- a/packages/coding-agent/examples/extensions/with-deps/package-lock.json
+++ b/packages/coding-agent/examples/extensions/with-deps/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "pi-extension-with-deps",
- "version": "0.73.0",
+ "version": "0.74.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pi-extension-with-deps",
- "version": "0.73.0",
+ "version": "0.74.0",
"dependencies": {
"ms": "^2.1.3"
},
diff --git a/packages/coding-agent/examples/extensions/with-deps/package.json b/packages/coding-agent/examples/extensions/with-deps/package.json
index 5825a89a9..1a8fa142a 100644
--- a/packages/coding-agent/examples/extensions/with-deps/package.json
+++ b/packages/coding-agent/examples/extensions/with-deps/package.json
@@ -1,7 +1,7 @@
{
"name": "pi-extension-with-deps",
"private": true,
- "version": "0.73.0",
+ "version": "0.74.0",
"type": "module",
"scripts": {
"clean": "echo 'nothing to clean'",
diff --git a/packages/coding-agent/examples/extensions/working-indicator.ts b/packages/coding-agent/examples/extensions/working-indicator.ts
index 53ce1a735..1fb3dbd71 100644
--- a/packages/coding-agent/examples/extensions/working-indicator.ts
+++ b/packages/coding-agent/examples/extensions/working-indicator.ts
@@ -16,7 +16,7 @@
* /working-indicator reset Restore pi's default spinner
*/
-import type { ExtensionAPI, ExtensionContext, WorkingIndicatorOptions } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI, ExtensionContext, WorkingIndicatorOptions } from "@earendil-works/pi-coding-agent";
type WorkingIndicatorMode = "dot" | "none" | "pulse" | "spinner" | "default";
diff --git a/packages/coding-agent/examples/extensions/working-message-test.ts b/packages/coding-agent/examples/extensions/working-message-test.ts
index 064d39e8c..7c5a32f9e 100644
--- a/packages/coding-agent/examples/extensions/working-message-test.ts
+++ b/packages/coding-agent/examples/extensions/working-message-test.ts
@@ -12,7 +12,7 @@
* loader appears, not revert to the default gray "Working...".
*/
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
const CUSTOM_MESSAGE = "\x1b[38;2;155;86;63mWorking... (custom)\x1b[39m";
const CUSTOM_INDICATOR = { frames: ["\x1b[38;2;155;86;63m●\x1b[39m"] };
diff --git a/packages/coding-agent/examples/rpc-extension-ui.ts b/packages/coding-agent/examples/rpc-extension-ui.ts
index 93b982b51..bcbb6ec89 100644
--- a/packages/coding-agent/examples/rpc-extension-ui.ts
+++ b/packages/coding-agent/examples/rpc-extension-ui.ts
@@ -18,7 +18,7 @@ import { spawn } from "node:child_process";
import { dirname, join } from "node:path";
import * as readline from "node:readline";
import { fileURLToPath } from "node:url";
-import { type Component, Container, Input, matchesKey, ProcessTerminal, SelectList, TUI } from "@mariozechner/pi-tui";
+import { type Component, Container, Input, matchesKey, ProcessTerminal, SelectList, TUI } from "@earendil-works/pi-tui";
const __dirname = dirname(fileURLToPath(import.meta.url));
diff --git a/packages/coding-agent/examples/sdk/01-minimal.ts b/packages/coding-agent/examples/sdk/01-minimal.ts
index c3b241493..be35bab2b 100644
--- a/packages/coding-agent/examples/sdk/01-minimal.ts
+++ b/packages/coding-agent/examples/sdk/01-minimal.ts
@@ -5,7 +5,7 @@
* from cwd and ~/.pi/agent. Model chosen from settings or first available.
*/
-import { createAgentSession } from "@mariozechner/pi-coding-agent";
+import { createAgentSession } from "@earendil-works/pi-coding-agent";
const { session } = await createAgentSession();
diff --git a/packages/coding-agent/examples/sdk/02-custom-model.ts b/packages/coding-agent/examples/sdk/02-custom-model.ts
index 52c2b73e1..ff1b42878 100644
--- a/packages/coding-agent/examples/sdk/02-custom-model.ts
+++ b/packages/coding-agent/examples/sdk/02-custom-model.ts
@@ -4,8 +4,8 @@
* Shows how to select a specific model and thinking level.
*/
-import { getModel } from "@mariozechner/pi-ai";
-import { AuthStorage, createAgentSession, ModelRegistry } from "@mariozechner/pi-coding-agent";
+import { getModel } from "@earendil-works/pi-ai";
+import { AuthStorage, createAgentSession, ModelRegistry } from "@earendil-works/pi-coding-agent";
// Set up auth storage and model registry
const authStorage = AuthStorage.create();
diff --git a/packages/coding-agent/examples/sdk/03-custom-prompt.ts b/packages/coding-agent/examples/sdk/03-custom-prompt.ts
index eab00d842..7c3ea5ffa 100644
--- a/packages/coding-agent/examples/sdk/03-custom-prompt.ts
+++ b/packages/coding-agent/examples/sdk/03-custom-prompt.ts
@@ -4,7 +4,12 @@
* Shows how to replace or modify the default system prompt.
*/
-import { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } from "@mariozechner/pi-coding-agent";
+import {
+ createAgentSession,
+ DefaultResourceLoader,
+ getAgentDir,
+ SessionManager,
+} from "@earendil-works/pi-coding-agent";
const cwd = process.cwd();
const agentDir = getAgentDir();
diff --git a/packages/coding-agent/examples/sdk/04-skills.ts b/packages/coding-agent/examples/sdk/04-skills.ts
index 852c2c199..0aadc19e8 100644
--- a/packages/coding-agent/examples/sdk/04-skills.ts
+++ b/packages/coding-agent/examples/sdk/04-skills.ts
@@ -12,7 +12,7 @@ import {
getAgentDir,
SessionManager,
type Skill,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
// Or define custom skills inline
const customSkill: Skill = {
diff --git a/packages/coding-agent/examples/sdk/05-tools.ts b/packages/coding-agent/examples/sdk/05-tools.ts
index c24cb2a0d..4a2e49ce7 100644
--- a/packages/coding-agent/examples/sdk/05-tools.ts
+++ b/packages/coding-agent/examples/sdk/05-tools.ts
@@ -10,7 +10,7 @@
* extensions system using pi.registerTool().
*/
-import { createAgentSession, SessionManager } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent";
// Read-only mode (no edit/write)
await createAgentSession({
diff --git a/packages/coding-agent/examples/sdk/06-extensions.ts b/packages/coding-agent/examples/sdk/06-extensions.ts
index ddc0ee385..8e55a80ab 100644
--- a/packages/coding-agent/examples/sdk/06-extensions.ts
+++ b/packages/coding-agent/examples/sdk/06-extensions.ts
@@ -13,7 +13,12 @@
* export default function (pi: ExtensionAPI) { ... }
*/
-import { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } from "@mariozechner/pi-coding-agent";
+import {
+ createAgentSession,
+ DefaultResourceLoader,
+ getAgentDir,
+ SessionManager,
+} from "@earendil-works/pi-coding-agent";
// Extensions are discovered automatically from standard locations.
// You can also add paths via settings.json or DefaultResourceLoader options.
@@ -48,7 +53,7 @@ console.log();
// Example extension file (./my-logging-extension.ts):
/*
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("agent_start", async () => {
diff --git a/packages/coding-agent/examples/sdk/07-context-files.ts b/packages/coding-agent/examples/sdk/07-context-files.ts
index d49e32ecd..c8ce77a1f 100644
--- a/packages/coding-agent/examples/sdk/07-context-files.ts
+++ b/packages/coding-agent/examples/sdk/07-context-files.ts
@@ -4,7 +4,12 @@
* Context files provide project-specific instructions loaded into the system prompt.
*/
-import { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } from "@mariozechner/pi-coding-agent";
+import {
+ createAgentSession,
+ DefaultResourceLoader,
+ getAgentDir,
+ SessionManager,
+} from "@earendil-works/pi-coding-agent";
// Disable context files entirely by returning an empty list in agentsFilesOverride.
const loader = new DefaultResourceLoader({
diff --git a/packages/coding-agent/examples/sdk/08-prompt-templates.ts b/packages/coding-agent/examples/sdk/08-prompt-templates.ts
index 6aec91039..814e32306 100644
--- a/packages/coding-agent/examples/sdk/08-prompt-templates.ts
+++ b/packages/coding-agent/examples/sdk/08-prompt-templates.ts
@@ -11,7 +11,7 @@ import {
getAgentDir,
type PromptTemplate,
SessionManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
// Define custom templates
const deployTemplate: PromptTemplate = {
diff --git a/packages/coding-agent/examples/sdk/09-api-keys-and-oauth.ts b/packages/coding-agent/examples/sdk/09-api-keys-and-oauth.ts
index c735fd466..127e5933e 100644
--- a/packages/coding-agent/examples/sdk/09-api-keys-and-oauth.ts
+++ b/packages/coding-agent/examples/sdk/09-api-keys-and-oauth.ts
@@ -4,7 +4,7 @@
* Configure API key resolution via AuthStorage and ModelRegistry.
*/
-import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@mariozechner/pi-coding-agent";
+import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@earendil-works/pi-coding-agent";
// Default: AuthStorage uses ~/.pi/agent/auth.json
// ModelRegistry loads built-in + custom models from ~/.pi/agent/models.json
diff --git a/packages/coding-agent/examples/sdk/10-settings.ts b/packages/coding-agent/examples/sdk/10-settings.ts
index bbfdea9d1..9b6f93d8c 100644
--- a/packages/coding-agent/examples/sdk/10-settings.ts
+++ b/packages/coding-agent/examples/sdk/10-settings.ts
@@ -4,7 +4,7 @@
* Override settings using SettingsManager.
*/
-import { createAgentSession, SessionManager, SettingsManager } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, SessionManager, SettingsManager } from "@earendil-works/pi-coding-agent";
const cwd = process.cwd();
diff --git a/packages/coding-agent/examples/sdk/11-sessions.ts b/packages/coding-agent/examples/sdk/11-sessions.ts
index 9c32016d6..414db8b63 100644
--- a/packages/coding-agent/examples/sdk/11-sessions.ts
+++ b/packages/coding-agent/examples/sdk/11-sessions.ts
@@ -4,7 +4,7 @@
* Control session persistence: in-memory, new file, continue, or open specific.
*/
-import { createAgentSession, SessionManager } from "@mariozechner/pi-coding-agent";
+import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent";
// In-memory (no persistence)
const { session: inMemory } = await createAgentSession({
diff --git a/packages/coding-agent/examples/sdk/12-full-control.ts b/packages/coding-agent/examples/sdk/12-full-control.ts
index 55b019ed1..4bcc07267 100644
--- a/packages/coding-agent/examples/sdk/12-full-control.ts
+++ b/packages/coding-agent/examples/sdk/12-full-control.ts
@@ -4,7 +4,7 @@
* Replace everything - no discovery, explicit configuration.
*/
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import {
AuthStorage,
createAgentSession,
@@ -13,7 +13,7 @@ import {
type ResourceLoader,
SessionManager,
SettingsManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
// Custom auth storage location
const authStorage = AuthStorage.create("/tmp/my-agent/auth.json");
diff --git a/packages/coding-agent/examples/sdk/13-session-runtime.ts b/packages/coding-agent/examples/sdk/13-session-runtime.ts
index 1567ebb8e..52c7f244c 100644
--- a/packages/coding-agent/examples/sdk/13-session-runtime.ts
+++ b/packages/coding-agent/examples/sdk/13-session-runtime.ts
@@ -15,7 +15,7 @@ import {
createAgentSessionServices,
getAgentDir,
SessionManager,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
const services = await createAgentSessionServices({ cwd });
diff --git a/packages/coding-agent/examples/sdk/README.md b/packages/coding-agent/examples/sdk/README.md
index b28c4e67a..0fd95cf00 100644
--- a/packages/coding-agent/examples/sdk/README.md
+++ b/packages/coding-agent/examples/sdk/README.md
@@ -32,7 +32,7 @@ npx tsx examples/sdk/01-minimal.ts
## Quick Reference
```typescript
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import {
AuthStorage,
createAgentSession,
@@ -43,7 +43,7 @@ import {
codingTools,
readOnlyTools,
readTool, bashTool, editTool, writeTool,
-} from "@mariozechner/pi-coding-agent";
+} from "@earendil-works/pi-coding-agent";
// Auth and models setup
const authStorage = AuthStorage.create();
diff --git a/packages/coding-agent/package.json b/packages/coding-agent/package.json
index b4f3ba7f0..a046a3c92 100644
--- a/packages/coding-agent/package.json
+++ b/packages/coding-agent/package.json
@@ -1,6 +1,6 @@
{
- "name": "@mariozechner/pi-coding-agent",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-coding-agent",
+ "version": "0.74.0",
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
"type": "module",
"piConfig": {
@@ -38,9 +38,9 @@
"prepublishOnly": "npm run clean && npm run build"
},
"dependencies": {
- "@mariozechner/pi-agent-core": "^0.73.0",
- "@mariozechner/pi-ai": "^0.73.0",
- "@mariozechner/pi-tui": "^0.73.0",
+ "@earendil-works/pi-agent-core": "^0.74.0",
+ "@earendil-works/pi-ai": "^0.74.0",
+ "@earendil-works/pi-tui": "^0.74.0",
"@silvia-odwyer/photon-node": "^0.3.4",
"chalk": "^5.5.0",
"cli-highlight": "^2.1.11",
@@ -91,7 +91,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "git+https://github.com/badlogic/pi-mono.git",
+ "url": "git+https://github.com/earendil-works/pi-mono.git",
"directory": "packages/coding-agent"
},
"engines": {
diff --git a/packages/coding-agent/src/bun/register-bedrock.ts b/packages/coding-agent/src/bun/register-bedrock.ts
index 5becc44db..92af0dde2 100644
--- a/packages/coding-agent/src/bun/register-bedrock.ts
+++ b/packages/coding-agent/src/bun/register-bedrock.ts
@@ -1,4 +1,4 @@
-import { setBedrockProviderModule } from "@mariozechner/pi-ai";
-import { bedrockProviderModule } from "@mariozechner/pi-ai/bedrock-provider";
+import { setBedrockProviderModule } from "@earendil-works/pi-ai";
+import { bedrockProviderModule } from "@earendil-works/pi-ai/bedrock-provider";
setBedrockProviderModule(bedrockProviderModule);
diff --git a/packages/coding-agent/src/cli/args.ts b/packages/coding-agent/src/cli/args.ts
index ad66b9e25..d673b3951 100644
--- a/packages/coding-agent/src/cli/args.ts
+++ b/packages/coding-agent/src/cli/args.ts
@@ -2,7 +2,7 @@
* CLI argument parsing and help display
*/
-import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
+import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
import chalk from "chalk";
import { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR, ENV_SESSION_DIR } from "../config.js";
import type { ExtensionFlag } from "../core/extensions/types.js";
diff --git a/packages/coding-agent/src/cli/config-selector.ts b/packages/coding-agent/src/cli/config-selector.ts
index 93d591cd8..cfd825835 100644
--- a/packages/coding-agent/src/cli/config-selector.ts
+++ b/packages/coding-agent/src/cli/config-selector.ts
@@ -2,7 +2,7 @@
* TUI config selector for `pi config` command
*/
-import { ProcessTerminal, TUI } from "@mariozechner/pi-tui";
+import { ProcessTerminal, TUI } from "@earendil-works/pi-tui";
import type { ResolvedPaths } from "../core/package-manager.js";
import type { SettingsManager } from "../core/settings-manager.js";
import { ConfigSelectorComponent } from "../modes/interactive/components/config-selector.js";
diff --git a/packages/coding-agent/src/cli/file-processor.ts b/packages/coding-agent/src/cli/file-processor.ts
index 96a47c260..c9ab54950 100644
--- a/packages/coding-agent/src/cli/file-processor.ts
+++ b/packages/coding-agent/src/cli/file-processor.ts
@@ -3,7 +3,7 @@
*/
import { access, readFile, stat } from "node:fs/promises";
-import type { ImageContent } from "@mariozechner/pi-ai";
+import type { ImageContent } from "@earendil-works/pi-ai";
import chalk from "chalk";
import { resolve } from "path";
import { resolveReadPath } from "../core/tools/path-utils.js";
diff --git a/packages/coding-agent/src/cli/initial-message.ts b/packages/coding-agent/src/cli/initial-message.ts
index 5745985c0..a3a7f1b75 100644
--- a/packages/coding-agent/src/cli/initial-message.ts
+++ b/packages/coding-agent/src/cli/initial-message.ts
@@ -1,4 +1,4 @@
-import type { ImageContent } from "@mariozechner/pi-ai";
+import type { ImageContent } from "@earendil-works/pi-ai";
import type { Args } from "./args.js";
export interface InitialMessageInput {
diff --git a/packages/coding-agent/src/cli/list-models.ts b/packages/coding-agent/src/cli/list-models.ts
index 6155b822f..7d5385737 100644
--- a/packages/coding-agent/src/cli/list-models.ts
+++ b/packages/coding-agent/src/cli/list-models.ts
@@ -2,8 +2,8 @@
* List available models with optional fuzzy search
*/
-import type { Api, Model } from "@mariozechner/pi-ai";
-import { fuzzyFilter } from "@mariozechner/pi-tui";
+import type { Api, Model } from "@earendil-works/pi-ai";
+import { fuzzyFilter } from "@earendil-works/pi-tui";
import chalk from "chalk";
import { formatNoModelsAvailableMessage } from "../core/auth-guidance.js";
import type { ModelRegistry } from "../core/model-registry.js";
diff --git a/packages/coding-agent/src/cli/session-picker.ts b/packages/coding-agent/src/cli/session-picker.ts
index 8fa820c38..f84b6a086 100644
--- a/packages/coding-agent/src/cli/session-picker.ts
+++ b/packages/coding-agent/src/cli/session-picker.ts
@@ -2,7 +2,7 @@
* TUI session selector for --resume flag
*/
-import { ProcessTerminal, setKeybindings, TUI } from "@mariozechner/pi-tui";
+import { ProcessTerminal, setKeybindings, TUI } from "@earendil-works/pi-tui";
import { KeybindingsManager } from "../core/keybindings.js";
import type { SessionInfo, SessionListProgress } from "../core/session-manager.js";
import { SessionSelectorComponent } from "../modes/interactive/components/session-selector.js";
diff --git a/packages/coding-agent/src/config.ts b/packages/coding-agent/src/config.ts
index 0d9616558..bf268a77a 100644
--- a/packages/coding-agent/src/config.ts
+++ b/packages/coding-agent/src/config.ts
@@ -28,12 +28,36 @@ export const isBunRuntime = !!process.versions.bun;
export type InstallMethod = "bun-binary" | "npm" | "pnpm" | "yarn" | "bun" | "unknown";
-export interface SelfUpdateCommand {
+interface SelfUpdateCommandStep {
command: string;
args: string[];
display: string;
}
+export interface SelfUpdateCommand extends SelfUpdateCommandStep {
+ steps?: SelfUpdateCommandStep[];
+}
+
+function makeSelfUpdateCommand(
+ installStep: SelfUpdateCommandStep,
+ uninstallStep?: SelfUpdateCommandStep,
+): SelfUpdateCommand {
+ if (!uninstallStep) return installStep;
+ return {
+ ...installStep,
+ display: `${uninstallStep.display} && ${installStep.display}`,
+ steps: [uninstallStep, installStep],
+ };
+}
+
+function makeSelfUpdateCommandStep(command: string, args: string[]): SelfUpdateCommandStep {
+ return {
+ command,
+ args,
+ display: [command, ...args].map((arg) => (/\s/.test(arg) ? `"${arg}"` : arg)).join(" "),
+ };
+}
+
export function detectInstallMethod(): InstallMethod {
if (isBunBinary) {
return "bun-binary";
@@ -57,24 +81,19 @@ export function detectInstallMethod(): InstallMethod {
return "unknown";
}
-function getInferredNpmInstall(packageName: string): { root: string; prefix: string } | undefined {
+function getInferredNpmInstall(): { root: string; prefix: string } | undefined {
const packageDir = getPackageDir();
const path = process.platform === "win32" || packageDir.includes("\\") ? win32 : { basename, dirname };
- const [scope, name] = packageName.split("/");
+ const parent = path.dirname(packageDir);
let root: string | undefined;
- if (
- name &&
- scope?.startsWith("@") &&
- path.basename(path.dirname(packageDir)) === scope &&
- path.basename(packageDir) === name
- ) {
- root = path.dirname(path.dirname(packageDir));
- } else if (!name && path.basename(packageDir) === packageName) {
- root = path.dirname(packageDir);
+ if (path.basename(parent).startsWith("@") && path.basename(path.dirname(parent)) === "node_modules") {
+ root = path.dirname(parent);
+ } else if (path.basename(parent) === "node_modules") {
+ root = parent;
}
- if (!root || path.basename(root) !== "node_modules") return undefined;
- const parent = path.dirname(root);
- if (path.basename(parent) === "lib") return { root, prefix: path.dirname(parent) };
+ if (!root) return undefined;
+ const rootParent = path.dirname(root);
+ if (path.basename(rootParent) === "lib") return { root, prefix: path.dirname(rootParent) };
// Windows global npm prefixes use `\\node_modules`, which is
// indistinguishable from local project installs by path shape alone. Do not
// infer unsupported Windows custom prefixes without `npm root -g` evidence.
@@ -83,24 +102,44 @@ function getInferredNpmInstall(packageName: string): { root: string; prefix: str
function getSelfUpdateCommandForMethod(
method: InstallMethod,
- packageName: string,
+ installedPackageName: string,
+ updatePackageName = installedPackageName,
npmCommand?: string[],
): SelfUpdateCommand | undefined {
switch (method) {
case "bun-binary":
return undefined;
case "pnpm":
- return { command: "pnpm", args: ["install", "-g", packageName], display: `pnpm install -g ${packageName}` };
+ return makeSelfUpdateCommand(
+ makeSelfUpdateCommandStep("pnpm", ["install", "-g", updatePackageName]),
+ updatePackageName === installedPackageName
+ ? undefined
+ : makeSelfUpdateCommandStep("pnpm", ["remove", "-g", installedPackageName]),
+ );
case "yarn":
- return { command: "yarn", args: ["global", "add", packageName], display: `yarn global add ${packageName}` };
+ return makeSelfUpdateCommand(
+ makeSelfUpdateCommandStep("yarn", ["global", "add", updatePackageName]),
+ updatePackageName === installedPackageName
+ ? undefined
+ : makeSelfUpdateCommandStep("yarn", ["global", "remove", installedPackageName]),
+ );
case "bun":
- return { command: "bun", args: ["install", "-g", packageName], display: `bun install -g ${packageName}` };
+ return makeSelfUpdateCommand(
+ makeSelfUpdateCommandStep("bun", ["install", "-g", updatePackageName]),
+ updatePackageName === installedPackageName
+ ? undefined
+ : makeSelfUpdateCommandStep("bun", ["uninstall", "-g", installedPackageName]),
+ );
case "npm": {
const [command = "npm", ...npmArgs] = npmCommand ?? [];
- const inferred = npmCommand?.length ? undefined : getInferredNpmInstall(packageName);
- const args = [...npmArgs, ...(inferred ? ["--prefix", inferred.prefix] : []), "install", "-g", packageName];
- const display = [command, ...args].map((arg) => (/\s/.test(arg) ? `"${arg}"` : arg)).join(" ");
- return { command, args, display };
+ const inferred = npmCommand?.length ? undefined : getInferredNpmInstall();
+ const prefixArgs = [...npmArgs, ...(inferred ? ["--prefix", inferred.prefix] : [])];
+ const installStep = makeSelfUpdateCommandStep(command, [...prefixArgs, "install", "-g", updatePackageName]);
+ const uninstallStep =
+ updatePackageName === installedPackageName
+ ? undefined
+ : makeSelfUpdateCommandStep(command, [...prefixArgs, "uninstall", "-g", installedPackageName]);
+ return makeSelfUpdateCommand(installStep, uninstallStep);
}
case "unknown":
return undefined;
@@ -125,7 +164,7 @@ function readCommandOutput(
return undefined;
}
-function getGlobalPackageRoots(method: InstallMethod, packageName: string, npmCommand?: string[]): string[] {
+function getGlobalPackageRoots(method: InstallMethod, _packageName: string, npmCommand?: string[]): string[] {
switch (method) {
case "npm": {
const configured = !!npmCommand?.length;
@@ -143,7 +182,7 @@ function getGlobalPackageRoots(method: InstallMethod, packageName: string, npmCo
const root = readCommandOutput(command, [...npmArgs, "root", "-g"], {
requireSuccess: configured,
});
- const inferred = configured ? undefined : getInferredNpmInstall(packageName);
+ const inferred = configured ? undefined : getInferredNpmInstall();
return [root, inferred?.root].filter((x): x is string => !!x);
}
case "pnpm": {
@@ -210,28 +249,36 @@ function isManagedByGlobalPackageManager(method: InstallMethod, packageName: str
);
}
-export function getSelfUpdateCommand(packageName: string, npmCommand?: string[]): SelfUpdateCommand | undefined {
+export function getSelfUpdateCommand(
+ packageName: string,
+ npmCommand?: string[],
+ updatePackageName = packageName,
+): SelfUpdateCommand | undefined {
const method = detectInstallMethod();
- const command = getSelfUpdateCommandForMethod(method, packageName, npmCommand);
+ const command = getSelfUpdateCommandForMethod(method, packageName, updatePackageName, npmCommand);
if (!command || !isManagedByGlobalPackageManager(method, packageName, npmCommand) || !isSelfUpdatePathWritable()) {
return undefined;
}
return command;
}
-export function getSelfUpdateUnavailableInstruction(packageName: string, npmCommand?: string[]): string {
+export function getSelfUpdateUnavailableInstruction(
+ packageName: string,
+ npmCommand?: string[],
+ updatePackageName = packageName,
+): string {
const method = detectInstallMethod();
if (method === "bun-binary") {
- return `Download from: https://github.com/badlogic/pi-mono/releases/latest`;
+ return `Download from: https://github.com/earendil-works/pi-mono/releases/latest`;
}
- const command = getSelfUpdateCommandForMethod(method, packageName, npmCommand);
+ const command = getSelfUpdateCommandForMethod(method, packageName, updatePackageName, npmCommand);
if (command) {
if (isManagedByGlobalPackageManager(method, packageName, npmCommand) && !isSelfUpdatePathWritable()) {
return `This installation is managed by a global ${method} install, but the install path is not writable. Update it yourself with: ${command.display}`;
}
return `This installation is not managed by a global ${method} install. Update it with the package manager, wrapper, or source checkout that provides it.`;
}
- return `Update ${packageName} using the package manager, wrapper, or source checkout that provides this installation.`;
+ return `Update ${updatePackageName} using the package manager, wrapper, or source checkout that provides this installation.`;
}
export function getUpdateInstruction(packageName: string): string {
@@ -370,7 +417,7 @@ interface PackageJson {
const pkg = JSON.parse(readFileSync(getPackageJsonPath(), "utf-8")) as PackageJson;
const piConfigName: string | undefined = pkg.piConfig?.name;
-export const PACKAGE_NAME: string = pkg.name || "@mariozechner/pi-coding-agent";
+export const PACKAGE_NAME: string = pkg.name || "@earendil-works/pi-coding-agent";
export const APP_NAME: string = piConfigName || "pi";
export const APP_TITLE: string = piConfigName ? APP_NAME : "π";
export const CONFIG_DIR_NAME: string = pkg.piConfig?.configDir || ".pi";
diff --git a/packages/coding-agent/src/core/agent-session-services.ts b/packages/coding-agent/src/core/agent-session-services.ts
index a20386953..061399edb 100644
--- a/packages/coding-agent/src/core/agent-session-services.ts
+++ b/packages/coding-agent/src/core/agent-session-services.ts
@@ -1,6 +1,6 @@
import { join } from "node:path";
-import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
-import type { Model } from "@mariozechner/pi-ai";
+import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
+import type { Model } from "@earendil-works/pi-ai";
import { getAgentDir } from "../config.js";
import { AuthStorage } from "./auth-storage.js";
import type { SessionStartEvent, ToolDefinition } from "./extensions/index.js";
diff --git a/packages/coding-agent/src/core/agent-session.ts b/packages/coding-agent/src/core/agent-session.ts
index db2d6f0d3..4985779f7 100644
--- a/packages/coding-agent/src/core/agent-session.ts
+++ b/packages/coding-agent/src/core/agent-session.ts
@@ -22,8 +22,8 @@ import type {
AgentState,
AgentTool,
ThinkingLevel,
-} from "@mariozechner/pi-agent-core";
-import type { AssistantMessage, ImageContent, Message, Model, TextContent } from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-agent-core";
+import type { AssistantMessage, ImageContent, Message, Model, TextContent } from "@earendil-works/pi-ai";
import {
clampThinkingLevel,
cleanupSessionResources,
@@ -31,7 +31,7 @@ import {
isContextOverflow,
modelsAreEqual,
resetApiProviders,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { theme } from "../modes/interactive/theme/theme.js";
import { stripFrontmatter } from "../utils/frontmatter.js";
import { sleep } from "../utils/sleep.js";
diff --git a/packages/coding-agent/src/core/auth-storage.ts b/packages/coding-agent/src/core/auth-storage.ts
index dc8fabdac..5b57424e0 100644
--- a/packages/coding-agent/src/core/auth-storage.ts
+++ b/packages/coding-agent/src/core/auth-storage.ts
@@ -12,8 +12,8 @@ import {
type OAuthCredentials,
type OAuthLoginCallbacks,
type OAuthProviderId,
-} from "@mariozechner/pi-ai";
-import { getOAuthApiKey, getOAuthProvider, getOAuthProviders } from "@mariozechner/pi-ai/oauth";
+} from "@earendil-works/pi-ai";
+import { getOAuthApiKey, getOAuthProvider, getOAuthProviders } from "@earendil-works/pi-ai/oauth";
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
import { dirname, join } from "path";
import lockfile from "proper-lockfile";
diff --git a/packages/coding-agent/src/core/compaction/branch-summarization.ts b/packages/coding-agent/src/core/compaction/branch-summarization.ts
index 9152f1ef8..69925ddab 100644
--- a/packages/coding-agent/src/core/compaction/branch-summarization.ts
+++ b/packages/coding-agent/src/core/compaction/branch-summarization.ts
@@ -5,9 +5,9 @@
* a summary of the branch being left so context isn't lost.
*/
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { Model } from "@mariozechner/pi-ai";
-import { completeSimple } from "@mariozechner/pi-ai";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { Model } from "@earendil-works/pi-ai";
+import { completeSimple } from "@earendil-works/pi-ai";
import {
convertToLlm,
createBranchSummaryMessage,
diff --git a/packages/coding-agent/src/core/compaction/compaction.ts b/packages/coding-agent/src/core/compaction/compaction.ts
index 585042483..c11c02543 100644
--- a/packages/coding-agent/src/core/compaction/compaction.ts
+++ b/packages/coding-agent/src/core/compaction/compaction.ts
@@ -5,9 +5,9 @@
* and after compaction the session is reloaded.
*/
-import type { AgentMessage, ThinkingLevel } from "@mariozechner/pi-agent-core";
-import type { AssistantMessage, Model, Usage } from "@mariozechner/pi-ai";
-import { completeSimple } from "@mariozechner/pi-ai";
+import type { AgentMessage, ThinkingLevel } from "@earendil-works/pi-agent-core";
+import type { AssistantMessage, Model, Usage } from "@earendil-works/pi-ai";
+import { completeSimple } from "@earendil-works/pi-ai";
import {
convertToLlm,
createBranchSummaryMessage,
diff --git a/packages/coding-agent/src/core/compaction/utils.ts b/packages/coding-agent/src/core/compaction/utils.ts
index 38a68d5f7..64218b2a1 100644
--- a/packages/coding-agent/src/core/compaction/utils.ts
+++ b/packages/coding-agent/src/core/compaction/utils.ts
@@ -2,8 +2,8 @@
* Shared utilities for compaction and branch summarization.
*/
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { Message } from "@mariozechner/pi-ai";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { Message } from "@earendil-works/pi-ai";
// ============================================================================
// File Operation Tracking
diff --git a/packages/coding-agent/src/core/defaults.ts b/packages/coding-agent/src/core/defaults.ts
index 2d2391790..fddc7d14f 100644
--- a/packages/coding-agent/src/core/defaults.ts
+++ b/packages/coding-agent/src/core/defaults.ts
@@ -1,3 +1,3 @@
-import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
+import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
export const DEFAULT_THINKING_LEVEL: ThinkingLevel = "medium";
diff --git a/packages/coding-agent/src/core/export-html/index.ts b/packages/coding-agent/src/core/export-html/index.ts
index 8024eb391..6b5579b68 100644
--- a/packages/coding-agent/src/core/export-html/index.ts
+++ b/packages/coding-agent/src/core/export-html/index.ts
@@ -1,4 +1,4 @@
-import type { AgentState } from "@mariozechner/pi-agent-core";
+import type { AgentState } from "@earendil-works/pi-agent-core";
import { existsSync, readFileSync, writeFileSync } from "fs";
import { basename, join } from "path";
import { APP_NAME, getExportTemplateDir } from "../../config.js";
diff --git a/packages/coding-agent/src/core/export-html/tool-renderer.ts b/packages/coding-agent/src/core/export-html/tool-renderer.ts
index df1664596..ee4fcb865 100644
--- a/packages/coding-agent/src/core/export-html/tool-renderer.ts
+++ b/packages/coding-agent/src/core/export-html/tool-renderer.ts
@@ -5,8 +5,8 @@
* and converting the ANSI output to HTML.
*/
-import type { ImageContent, TextContent } from "@mariozechner/pi-ai";
-import type { Component } from "@mariozechner/pi-tui";
+import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
+import type { Component } from "@earendil-works/pi-tui";
import type { Theme } from "../../modes/interactive/theme/theme.js";
import type { ToolDefinition, ToolRenderContext } from "../extensions/types.js";
import { ansiLinesToHtml } from "./ansi-to-html.js";
diff --git a/packages/coding-agent/src/core/extensions/loader.ts b/packages/coding-agent/src/core/extensions/loader.ts
index c01252dcd..b2d7b2755 100644
--- a/packages/coding-agent/src/core/extensions/loader.ts
+++ b/packages/coding-agent/src/core/extensions/loader.ts
@@ -8,11 +8,11 @@ import { createRequire } from "node:module";
import * as os from "node:os";
import * as path from "node:path";
import { fileURLToPath } from "node:url";
-import * as _bundledPiAgentCore from "@mariozechner/pi-agent-core";
-import * as _bundledPiAi from "@mariozechner/pi-ai";
-import * as _bundledPiAiOauth from "@mariozechner/pi-ai/oauth";
-import type { KeyId } from "@mariozechner/pi-tui";
-import * as _bundledPiTui from "@mariozechner/pi-tui";
+import * as _bundledPiAgentCore from "@earendil-works/pi-agent-core";
+import * as _bundledPiAi from "@earendil-works/pi-ai";
+import * as _bundledPiAiOauth from "@earendil-works/pi-ai/oauth";
+import type { KeyId } from "@earendil-works/pi-tui";
+import * as _bundledPiTui from "@earendil-works/pi-tui";
import { createJiti } from "jiti/static";
// Static imports of packages that extensions may use.
// These MUST be static so Bun bundles them into the compiled binary.
@@ -22,7 +22,7 @@ import * as _bundledTypeboxCompile from "typebox/compile";
import * as _bundledTypeboxValue from "typebox/value";
import { CONFIG_DIR_NAME, getAgentDir, isBunBinary } from "../../config.js";
// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,
-// avoiding a circular dependency. Extensions can import from @mariozechner/pi-coding-agent.
+// avoiding a circular dependency. Extensions can import from @earendil-works/pi-coding-agent.
import * as _bundledPiCodingAgent from "../../index.js";
import { createEventBus, type EventBus } from "../event-bus.js";
import type { ExecOptions } from "../exec.js";
@@ -48,6 +48,11 @@ const VIRTUAL_MODULES: Record = {
"@sinclair/typebox": _bundledTypebox,
"@sinclair/typebox/compile": _bundledTypeboxCompile,
"@sinclair/typebox/value": _bundledTypeboxValue,
+ "@earendil-works/pi-agent-core": _bundledPiAgentCore,
+ "@earendil-works/pi-tui": _bundledPiTui,
+ "@earendil-works/pi-ai": _bundledPiAi,
+ "@earendil-works/pi-ai/oauth": _bundledPiAiOauth,
+ "@earendil-works/pi-coding-agent": _bundledPiCodingAgent,
"@mariozechner/pi-agent-core": _bundledPiAgentCore,
"@mariozechner/pi-tui": _bundledPiTui,
"@mariozechner/pi-ai": _bundledPiAi,
@@ -82,12 +87,23 @@ function getAliases(): Record {
return fileURLToPath(import.meta.resolve(specifier));
};
+ const piCodingAgentEntry = packageIndex;
+ const piAgentCoreEntry = resolveWorkspaceOrImport("agent/dist/index.js", "@earendil-works/pi-agent-core");
+ const piTuiEntry = resolveWorkspaceOrImport("tui/dist/index.js", "@earendil-works/pi-tui");
+ const piAiEntry = resolveWorkspaceOrImport("ai/dist/index.js", "@earendil-works/pi-ai");
+ const piAiOauthEntry = resolveWorkspaceOrImport("ai/dist/oauth.js", "@earendil-works/pi-ai/oauth");
+
_aliases = {
- "@mariozechner/pi-coding-agent": packageIndex,
- "@mariozechner/pi-agent-core": resolveWorkspaceOrImport("agent/dist/index.js", "@mariozechner/pi-agent-core"),
- "@mariozechner/pi-tui": resolveWorkspaceOrImport("tui/dist/index.js", "@mariozechner/pi-tui"),
- "@mariozechner/pi-ai": resolveWorkspaceOrImport("ai/dist/index.js", "@mariozechner/pi-ai"),
- "@mariozechner/pi-ai/oauth": resolveWorkspaceOrImport("ai/dist/oauth.js", "@mariozechner/pi-ai/oauth"),
+ "@earendil-works/pi-coding-agent": piCodingAgentEntry,
+ "@earendil-works/pi-agent-core": piAgentCoreEntry,
+ "@earendil-works/pi-tui": piTuiEntry,
+ "@earendil-works/pi-ai": piAiEntry,
+ "@earendil-works/pi-ai/oauth": piAiOauthEntry,
+ "@mariozechner/pi-coding-agent": piCodingAgentEntry,
+ "@mariozechner/pi-agent-core": piAgentCoreEntry,
+ "@mariozechner/pi-tui": piTuiEntry,
+ "@mariozechner/pi-ai": piAiEntry,
+ "@mariozechner/pi-ai/oauth": piAiOauthEntry,
typebox: typeboxEntry,
"typebox/compile": typeboxCompileEntry,
"typebox/value": typeboxValueEntry,
diff --git a/packages/coding-agent/src/core/extensions/runner.ts b/packages/coding-agent/src/core/extensions/runner.ts
index 9b7f2ddf2..c37a45884 100644
--- a/packages/coding-agent/src/core/extensions/runner.ts
+++ b/packages/coding-agent/src/core/extensions/runner.ts
@@ -2,9 +2,9 @@
* Extension runner - executes extensions and manages their lifecycle.
*/
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { ImageContent, Model } from "@mariozechner/pi-ai";
-import type { KeyId } from "@mariozechner/pi-tui";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { ImageContent, Model } from "@earendil-works/pi-ai";
+import type { KeyId } from "@earendil-works/pi-tui";
import { type Theme, theme } from "../../modes/interactive/theme/theme.js";
import type { ResourceDiagnostic } from "../diagnostics.js";
import type { KeybindingsConfig } from "../keybindings.js";
diff --git a/packages/coding-agent/src/core/extensions/types.ts b/packages/coding-agent/src/core/extensions/types.ts
index 50a102cb5..4c1b6fca1 100644
--- a/packages/coding-agent/src/core/extensions/types.ts
+++ b/packages/coding-agent/src/core/extensions/types.ts
@@ -14,7 +14,7 @@ import type {
AgentToolUpdateCallback,
ThinkingLevel,
ToolExecutionMode,
-} from "@mariozechner/pi-agent-core";
+} from "@earendil-works/pi-agent-core";
import type {
Api,
AssistantMessageEvent,
@@ -27,7 +27,7 @@ import type {
SimpleStreamOptions,
TextContent,
ToolResultMessage,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import type {
AutocompleteItem,
AutocompleteProvider,
@@ -38,7 +38,7 @@ import type {
OverlayHandle,
OverlayOptions,
TUI,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import type { Static, TSchema } from "typebox";
import type { Theme } from "../../modes/interactive/theme/theme.js";
import type { BashResult } from "../bash-executor.js";
@@ -226,12 +226,12 @@ export interface ExtensionUIContext {
* - `keybindings`: KeybindingsManager for app-level keybindings
*
* For full app keybinding support (escape, ctrl+d, model switching, etc.),
- * extend `CustomEditor` from `@mariozechner/pi-coding-agent` and call
+ * extend `CustomEditor` from `@earendil-works/pi-coding-agent` and call
* `super.handleInput(data)` for keys you don't handle.
*
* @example
* ```ts
- * import { CustomEditor } from "@mariozechner/pi-coding-agent";
+ * import { CustomEditor } from "@earendil-works/pi-coding-agent";
*
* class VimEditor extends CustomEditor {
* private mode: "normal" | "insert" = "insert";
diff --git a/packages/coding-agent/src/core/extensions/wrapper.ts b/packages/coding-agent/src/core/extensions/wrapper.ts
index 24d7da84b..9b9d281c4 100644
--- a/packages/coding-agent/src/core/extensions/wrapper.ts
+++ b/packages/coding-agent/src/core/extensions/wrapper.ts
@@ -5,7 +5,7 @@
* Tool call and tool result interception is handled by AgentSession via agent-core hooks.
*/
-import type { AgentTool } from "@mariozechner/pi-agent-core";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
import { wrapToolDefinition, wrapToolDefinitions } from "../tools/tool-definition-wrapper.js";
import type { ExtensionRunner } from "./runner.js";
import type { RegisteredTool } from "./types.js";
diff --git a/packages/coding-agent/src/core/keybindings.ts b/packages/coding-agent/src/core/keybindings.ts
index 925003ccd..f1663b1ad 100644
--- a/packages/coding-agent/src/core/keybindings.ts
+++ b/packages/coding-agent/src/core/keybindings.ts
@@ -5,7 +5,7 @@ import {
type KeyId,
TUI_KEYBINDINGS,
KeybindingsManager as TuiKeybindingsManager,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import { existsSync, readFileSync } from "fs";
import { join } from "path";
import { getAgentDir } from "../config.js";
@@ -56,7 +56,7 @@ export interface AppKeybindings {
export type AppKeybinding = keyof AppKeybindings;
-declare module "@mariozechner/pi-tui" {
+declare module "@earendil-works/pi-tui" {
interface Keybindings extends AppKeybindings {}
}
diff --git a/packages/coding-agent/src/core/messages.ts b/packages/coding-agent/src/core/messages.ts
index f5a645e66..81ffabb58 100644
--- a/packages/coding-agent/src/core/messages.ts
+++ b/packages/coding-agent/src/core/messages.ts
@@ -5,8 +5,8 @@
* and provides a transformer to convert them to LLM-compatible messages.
*/
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { ImageContent, Message, TextContent } from "@mariozechner/pi-ai";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { ImageContent, Message, TextContent } from "@earendil-works/pi-ai";
export const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:
@@ -67,7 +67,7 @@ export interface CompactionSummaryMessage {
}
// Extend CustomAgentMessages via declaration merging
-declare module "@mariozechner/pi-agent-core" {
+declare module "@earendil-works/pi-agent-core" {
interface CustomAgentMessages {
bashExecution: BashExecutionMessage;
custom: CustomMessage;
diff --git a/packages/coding-agent/src/core/model-registry.ts b/packages/coding-agent/src/core/model-registry.ts
index f2584aa9e..0ad16745d 100644
--- a/packages/coding-agent/src/core/model-registry.ts
+++ b/packages/coding-agent/src/core/model-registry.ts
@@ -17,8 +17,8 @@ import {
registerApiProvider,
resetApiProviders,
type SimpleStreamOptions,
-} from "@mariozechner/pi-ai";
-import { registerOAuthProvider, resetOAuthProviders } from "@mariozechner/pi-ai/oauth";
+} from "@earendil-works/pi-ai";
+import { registerOAuthProvider, resetOAuthProviders } from "@earendil-works/pi-ai/oauth";
import { existsSync, readFileSync } from "fs";
import { join } from "path";
import { type Static, Type } from "typebox";
diff --git a/packages/coding-agent/src/core/model-resolver.ts b/packages/coding-agent/src/core/model-resolver.ts
index 3619d17a4..028950553 100644
--- a/packages/coding-agent/src/core/model-resolver.ts
+++ b/packages/coding-agent/src/core/model-resolver.ts
@@ -2,8 +2,8 @@
* Model resolution, scoping, and initial selection
*/
-import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
-import { type Api, type KnownProvider, type Model, modelsAreEqual } from "@mariozechner/pi-ai";
+import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
+import { type Api, type KnownProvider, type Model, modelsAreEqual } from "@earendil-works/pi-ai";
import chalk from "chalk";
import { minimatch } from "minimatch";
import { isValidThinkingLevel } from "../cli/args.js";
diff --git a/packages/coding-agent/src/core/sdk.ts b/packages/coding-agent/src/core/sdk.ts
index e59c5ee04..8bc960729 100644
--- a/packages/coding-agent/src/core/sdk.ts
+++ b/packages/coding-agent/src/core/sdk.ts
@@ -1,6 +1,6 @@
import { join } from "node:path";
-import { Agent, type AgentMessage, type ThinkingLevel } from "@mariozechner/pi-agent-core";
-import { clampThinkingLevel, type Message, type Model, streamSimple } from "@mariozechner/pi-ai";
+import { Agent, type AgentMessage, type ThinkingLevel } from "@earendil-works/pi-agent-core";
+import { clampThinkingLevel, type Message, type Model, streamSimple } from "@earendil-works/pi-ai";
import { getAgentDir } from "../config.js";
import { AgentSession } from "./agent-session.js";
import { formatNoModelsAvailableMessage } from "./auth-guidance.js";
@@ -164,7 +164,7 @@ function getAttributionHeaders(
* const { session } = await createAgentSession();
*
* // With explicit model
- * import { getModel } from '@mariozechner/pi-ai';
+ * import { getModel } from '@earendil-works/pi-ai';
* const { session } = await createAgentSession({
* model: getModel('anthropic', 'claude-opus-4-5'),
* thinkingLevel: 'high',
diff --git a/packages/coding-agent/src/core/session-manager.ts b/packages/coding-agent/src/core/session-manager.ts
index f366274b7..8a0d286aa 100644
--- a/packages/coding-agent/src/core/session-manager.ts
+++ b/packages/coding-agent/src/core/session-manager.ts
@@ -1,5 +1,5 @@
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { ImageContent, Message, TextContent } from "@mariozechner/pi-ai";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { ImageContent, Message, TextContent } from "@earendil-works/pi-ai";
import { randomUUID } from "crypto";
import {
appendFileSync,
diff --git a/packages/coding-agent/src/core/settings-manager.ts b/packages/coding-agent/src/core/settings-manager.ts
index abedb9f24..4db920563 100644
--- a/packages/coding-agent/src/core/settings-manager.ts
+++ b/packages/coding-agent/src/core/settings-manager.ts
@@ -1,4 +1,4 @@
-import type { Transport } from "@mariozechner/pi-ai";
+import type { Transport } from "@earendil-works/pi-ai";
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
import { homedir } from "os";
import { dirname, join } from "path";
diff --git a/packages/coding-agent/src/core/tools/bash.ts b/packages/coding-agent/src/core/tools/bash.ts
index c49e8996a..1d6591d45 100644
--- a/packages/coding-agent/src/core/tools/bash.ts
+++ b/packages/coding-agent/src/core/tools/bash.ts
@@ -1,6 +1,6 @@
import { existsSync } from "node:fs";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { Container, Text, truncateToWidth } from "@mariozechner/pi-tui";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { Container, Text, truncateToWidth } from "@earendil-works/pi-tui";
import { spawn } from "child_process";
import { type Static, Type } from "typebox";
import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
diff --git a/packages/coding-agent/src/core/tools/edit.ts b/packages/coding-agent/src/core/tools/edit.ts
index 5fdd87060..6a5f960f5 100644
--- a/packages/coding-agent/src/core/tools/edit.ts
+++ b/packages/coding-agent/src/core/tools/edit.ts
@@ -1,5 +1,5 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { Box, Container, Spacer, Text } from "@mariozechner/pi-tui";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { Box, Container, Spacer, Text } from "@earendil-works/pi-tui";
import { constants } from "fs";
import { access as fsAccess, readFile as fsReadFile, writeFile as fsWriteFile } from "fs/promises";
import { type Static, Type } from "typebox";
diff --git a/packages/coding-agent/src/core/tools/find.ts b/packages/coding-agent/src/core/tools/find.ts
index d61c10b84..e2d552d4f 100644
--- a/packages/coding-agent/src/core/tools/find.ts
+++ b/packages/coding-agent/src/core/tools/find.ts
@@ -1,6 +1,6 @@
import { createInterface } from "node:readline";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { Text } from "@mariozechner/pi-tui";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { Text } from "@earendil-works/pi-tui";
import { spawn } from "child_process";
import { existsSync } from "fs";
import path from "path";
diff --git a/packages/coding-agent/src/core/tools/grep.ts b/packages/coding-agent/src/core/tools/grep.ts
index bb876ab70..4d441b180 100644
--- a/packages/coding-agent/src/core/tools/grep.ts
+++ b/packages/coding-agent/src/core/tools/grep.ts
@@ -1,6 +1,6 @@
import { createInterface } from "node:readline";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { Text } from "@mariozechner/pi-tui";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { Text } from "@earendil-works/pi-tui";
import { spawn } from "child_process";
import { readFileSync, statSync } from "fs";
import path from "path";
diff --git a/packages/coding-agent/src/core/tools/index.ts b/packages/coding-agent/src/core/tools/index.ts
index 1043cc853..659b5484b 100644
--- a/packages/coding-agent/src/core/tools/index.ts
+++ b/packages/coding-agent/src/core/tools/index.ts
@@ -68,7 +68,7 @@ export {
type WriteToolOptions,
} from "./write.js";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
import type { ToolDefinition } from "../extensions/types.js";
import { type BashToolOptions, createBashTool, createBashToolDefinition } from "./bash.js";
import { createEditTool, createEditToolDefinition, type EditToolOptions } from "./edit.js";
diff --git a/packages/coding-agent/src/core/tools/ls.ts b/packages/coding-agent/src/core/tools/ls.ts
index 460f75fef..e6ae22c75 100644
--- a/packages/coding-agent/src/core/tools/ls.ts
+++ b/packages/coding-agent/src/core/tools/ls.ts
@@ -1,5 +1,5 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { Text } from "@mariozechner/pi-tui";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { Text } from "@earendil-works/pi-tui";
import { existsSync, readdirSync, statSync } from "fs";
import nodePath from "path";
import { type Static, Type } from "typebox";
diff --git a/packages/coding-agent/src/core/tools/read.ts b/packages/coding-agent/src/core/tools/read.ts
index 193c7c389..867d04dcf 100644
--- a/packages/coding-agent/src/core/tools/read.ts
+++ b/packages/coding-agent/src/core/tools/read.ts
@@ -1,7 +1,7 @@
import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from "node:path";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import type { Api, ImageContent, Model, TextContent } from "@mariozechner/pi-ai";
-import { Text } from "@mariozechner/pi-tui";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import type { Api, ImageContent, Model, TextContent } from "@earendil-works/pi-ai";
+import { Text } from "@earendil-works/pi-tui";
import { constants } from "fs";
import { access as fsAccess, readFile as fsReadFile } from "fs/promises";
import { type Static, Type } from "typebox";
@@ -10,6 +10,7 @@ import { keyHint, keyText } from "../../modes/interactive/components/keybinding-
import { getLanguageFromPath, highlightCode, type Theme } from "../../modes/interactive/theme/theme.js";
import { formatDimensionNote, resizeImage } from "../../utils/image-resize.js";
import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
+import { formatPathRelativeToCwdOrAbsolute } from "../../utils/paths.js";
import type { ToolDefinition, ToolRenderResultOptions } from "../extensions/types.js";
import { resolveReadPath } from "./path-utils.js";
import { getTextOutput, invalidArgText, replaceTabs, shortenPath, str } from "./render-utils.js";
@@ -133,7 +134,7 @@ function getCompactReadClassification(
if (docsClassification) return docsClassification;
if (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {
- return { kind: "resource", label: fileName };
+ return { kind: "resource", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };
}
return undefined;
diff --git a/packages/coding-agent/src/core/tools/render-utils.ts b/packages/coding-agent/src/core/tools/render-utils.ts
index a71522a4c..8cdfc475f 100644
--- a/packages/coding-agent/src/core/tools/render-utils.ts
+++ b/packages/coding-agent/src/core/tools/render-utils.ts
@@ -1,6 +1,6 @@
import * as os from "node:os";
-import type { ImageContent, TextContent } from "@mariozechner/pi-ai";
-import { getCapabilities, getImageDimensions, imageFallback } from "@mariozechner/pi-tui";
+import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
+import { getCapabilities, getImageDimensions, imageFallback } from "@earendil-works/pi-tui";
import stripAnsi from "strip-ansi";
import { sanitizeBinaryOutput } from "../../utils/shell.js";
diff --git a/packages/coding-agent/src/core/tools/tool-definition-wrapper.ts b/packages/coding-agent/src/core/tools/tool-definition-wrapper.ts
index 65815fa6b..1aca3f309 100644
--- a/packages/coding-agent/src/core/tools/tool-definition-wrapper.ts
+++ b/packages/coding-agent/src/core/tools/tool-definition-wrapper.ts
@@ -1,4 +1,4 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
import type { ExtensionContext, ToolDefinition } from "../extensions/types.js";
/** Wrap a ToolDefinition into an AgentTool for the core runtime. */
diff --git a/packages/coding-agent/src/core/tools/write.ts b/packages/coding-agent/src/core/tools/write.ts
index e8eda9426..e1aa40aa5 100644
--- a/packages/coding-agent/src/core/tools/write.ts
+++ b/packages/coding-agent/src/core/tools/write.ts
@@ -1,5 +1,5 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { Container, Text } from "@mariozechner/pi-tui";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { Container, Text } from "@earendil-works/pi-tui";
import { mkdir as fsMkdir, writeFile as fsWriteFile } from "fs/promises";
import { dirname } from "path";
import { type Static, Type } from "typebox";
diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts
index d4cd1339a..5a29a1fca 100644
--- a/packages/coding-agent/src/main.ts
+++ b/packages/coding-agent/src/main.ts
@@ -7,8 +7,8 @@
import { resolve } from "node:path";
import { createInterface } from "node:readline";
-import { type ImageContent, modelsAreEqual } from "@mariozechner/pi-ai";
-import { ProcessTerminal, setKeybindings, TUI } from "@mariozechner/pi-tui";
+import { type ImageContent, modelsAreEqual } from "@earendil-works/pi-ai";
+import { ProcessTerminal, setKeybindings, TUI } from "@earendil-works/pi-tui";
import chalk from "chalk";
import { type Args, type Mode, parseArgs, printHelp } from "./cli/args.js";
import { processFileArguments } from "./cli/file-processor.js";
diff --git a/packages/coding-agent/src/migrations.ts b/packages/coding-agent/src/migrations.ts
index 5b6061aca..42851d083 100644
--- a/packages/coding-agent/src/migrations.ts
+++ b/packages/coding-agent/src/migrations.ts
@@ -9,8 +9,9 @@ import { CONFIG_DIR_NAME, getAgentDir, getBinDir } from "./config.js";
import { migrateKeybindingsConfig } from "./core/keybindings.js";
const MIGRATION_GUIDE_URL =
- "https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/CHANGELOG.md#extensions-migration";
-const EXTENSIONS_DOC_URL = "https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/extensions.md";
+ "https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/CHANGELOG.md#extensions-migration";
+const EXTENSIONS_DOC_URL =
+ "https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/docs/extensions.md";
/**
* Migrate legacy oauth.json and settings.json apiKeys to auth.json.
@@ -78,7 +79,7 @@ export function migrateAuthToAuthJson(): string[] {
* ~/.pi/agent/sessions//. This migration moves them
* to the correct location based on the cwd in their session header.
*
- * See: https://github.com/badlogic/pi-mono/issues/320
+ * See: https://github.com/earendil-works/pi-mono/issues/320
*/
export function migrateSessionsFromAgentRoot(): void {
const agentDir = getAgentDir();
diff --git a/packages/coding-agent/src/modes/interactive/components/armin.ts b/packages/coding-agent/src/modes/interactive/components/armin.ts
index aedfe61c5..794e5562a 100644
--- a/packages/coding-agent/src/modes/interactive/components/armin.ts
+++ b/packages/coding-agent/src/modes/interactive/components/armin.ts
@@ -2,7 +2,7 @@
* Armin says hi! A fun easter egg with animated XBM art.
*/
-import type { Component, TUI } from "@mariozechner/pi-tui";
+import type { Component, TUI } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
// XBM image: 31x36 pixels, LSB first, 1=background, 0=foreground
diff --git a/packages/coding-agent/src/modes/interactive/components/assistant-message.ts b/packages/coding-agent/src/modes/interactive/components/assistant-message.ts
index cdafdff2a..7eb7e3061 100644
--- a/packages/coding-agent/src/modes/interactive/components/assistant-message.ts
+++ b/packages/coding-agent/src/modes/interactive/components/assistant-message.ts
@@ -1,5 +1,5 @@
-import type { AssistantMessage } from "@mariozechner/pi-ai";
-import { Container, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
+import type { AssistantMessage } from "@earendil-works/pi-ai";
+import { Container, Markdown, type MarkdownTheme, Spacer, Text } from "@earendil-works/pi-tui";
import { getMarkdownTheme, theme } from "../theme/theme.js";
const OSC133_ZONE_START = "\x1b]133;A\x07";
diff --git a/packages/coding-agent/src/modes/interactive/components/bash-execution.ts b/packages/coding-agent/src/modes/interactive/components/bash-execution.ts
index 5f04daea4..bfe733f8a 100644
--- a/packages/coding-agent/src/modes/interactive/components/bash-execution.ts
+++ b/packages/coding-agent/src/modes/interactive/components/bash-execution.ts
@@ -2,7 +2,7 @@
* Component for displaying bash command execution with streaming output.
*/
-import { Container, Loader, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
+import { Container, Loader, Spacer, Text, type TUI } from "@earendil-works/pi-tui";
import stripAnsi from "strip-ansi";
import {
DEFAULT_MAX_BYTES,
diff --git a/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts b/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts
index f9913383b..e9b13919f 100644
--- a/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts
+++ b/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts
@@ -1,4 +1,4 @@
-import { CancellableLoader, Container, Loader, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
+import { CancellableLoader, Container, Loader, Spacer, Text, type TUI } from "@earendil-works/pi-tui";
import type { Theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
import { keyHint } from "./keybinding-hints.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts b/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts
index 798bb0a45..b140f4968 100644
--- a/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts
+++ b/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts
@@ -1,4 +1,4 @@
-import { Box, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
+import { Box, Markdown, type MarkdownTheme, Spacer, Text } from "@earendil-works/pi-tui";
import type { BranchSummaryMessage } from "../../../core/messages.js";
import { getMarkdownTheme, theme } from "../theme/theme.js";
import { keyText } from "./keybinding-hints.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts b/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts
index 7752093ab..e4b78f883 100644
--- a/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts
+++ b/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts
@@ -1,4 +1,4 @@
-import { Box, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
+import { Box, Markdown, type MarkdownTheme, Spacer, Text } from "@earendil-works/pi-tui";
import type { CompactionSummaryMessage } from "../../../core/messages.js";
import { getMarkdownTheme, theme } from "../theme/theme.js";
import { keyText } from "./keybinding-hints.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/config-selector.ts b/packages/coding-agent/src/modes/interactive/components/config-selector.ts
index c321dfe50..0d4c8aba2 100644
--- a/packages/coding-agent/src/modes/interactive/components/config-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/config-selector.ts
@@ -13,7 +13,7 @@ import {
Spacer,
truncateToWidth,
visibleWidth,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import { CONFIG_DIR_NAME } from "../../../config.js";
import type { PathMetadata, ResolvedPaths, ResolvedResource } from "../../../core/package-manager.js";
import type { PackageSource, SettingsManager } from "../../../core/settings-manager.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/countdown-timer.ts b/packages/coding-agent/src/modes/interactive/components/countdown-timer.ts
index aa7338868..ac730644e 100644
--- a/packages/coding-agent/src/modes/interactive/components/countdown-timer.ts
+++ b/packages/coding-agent/src/modes/interactive/components/countdown-timer.ts
@@ -2,7 +2,7 @@
* Reusable countdown timer for dialog components.
*/
-import type { TUI } from "@mariozechner/pi-tui";
+import type { TUI } from "@earendil-works/pi-tui";
export class CountdownTimer {
private intervalId: ReturnType | undefined;
diff --git a/packages/coding-agent/src/modes/interactive/components/custom-editor.ts b/packages/coding-agent/src/modes/interactive/components/custom-editor.ts
index 14513b9af..18f7d27af 100644
--- a/packages/coding-agent/src/modes/interactive/components/custom-editor.ts
+++ b/packages/coding-agent/src/modes/interactive/components/custom-editor.ts
@@ -1,4 +1,4 @@
-import { Editor, type EditorOptions, type EditorTheme, type TUI } from "@mariozechner/pi-tui";
+import { Editor, type EditorOptions, type EditorTheme, type TUI } from "@earendil-works/pi-tui";
import type { AppKeybinding, KeybindingsManager } from "../../../core/keybindings.js";
/**
diff --git a/packages/coding-agent/src/modes/interactive/components/custom-message.ts b/packages/coding-agent/src/modes/interactive/components/custom-message.ts
index b007dfcfc..5cf6bbe20 100644
--- a/packages/coding-agent/src/modes/interactive/components/custom-message.ts
+++ b/packages/coding-agent/src/modes/interactive/components/custom-message.ts
@@ -1,6 +1,6 @@
-import type { TextContent } from "@mariozechner/pi-ai";
-import type { Component } from "@mariozechner/pi-tui";
-import { Box, Container, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
+import type { TextContent } from "@earendil-works/pi-ai";
+import type { Component } from "@earendil-works/pi-tui";
+import { Box, Container, Markdown, type MarkdownTheme, Spacer, Text } from "@earendil-works/pi-tui";
import type { MessageRenderer } from "../../../core/extensions/types.js";
import type { CustomMessage } from "../../../core/messages.js";
import { getMarkdownTheme, theme } from "../theme/theme.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/daxnuts.ts b/packages/coding-agent/src/modes/interactive/components/daxnuts.ts
index 54170c275..bfc4dbaa2 100644
--- a/packages/coding-agent/src/modes/interactive/components/daxnuts.ts
+++ b/packages/coding-agent/src/modes/interactive/components/daxnuts.ts
@@ -4,7 +4,7 @@
* A heartfelt tribute to dax (@thdxr) for providing free Kimi K2.5 access via OpenCode.
*/
-import type { Component, TUI } from "@mariozechner/pi-tui";
+import type { Component, TUI } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
// 32x32 RGB image of dax, hex encoded (3 bytes per pixel)
diff --git a/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts b/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts
index 51c08bc12..d4fa67c40 100644
--- a/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts
+++ b/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts
@@ -1,4 +1,4 @@
-import type { Component } from "@mariozechner/pi-tui";
+import type { Component } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
/**
diff --git a/packages/coding-agent/src/modes/interactive/components/earendil-announcement.ts b/packages/coding-agent/src/modes/interactive/components/earendil-announcement.ts
index 874b07b56..59ec78f79 100644
--- a/packages/coding-agent/src/modes/interactive/components/earendil-announcement.ts
+++ b/packages/coding-agent/src/modes/interactive/components/earendil-announcement.ts
@@ -1,5 +1,5 @@
import * as fs from "node:fs";
-import { Container, Image, Spacer, Text } from "@mariozechner/pi-tui";
+import { Container, Image, Spacer, Text } from "@earendil-works/pi-tui";
import { getBundledInteractiveAssetPath } from "../../../config.js";
import { theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/extension-editor.ts b/packages/coding-agent/src/modes/interactive/components/extension-editor.ts
index be6a72578..e1134ce96 100644
--- a/packages/coding-agent/src/modes/interactive/components/extension-editor.ts
+++ b/packages/coding-agent/src/modes/interactive/components/extension-editor.ts
@@ -16,7 +16,7 @@ import {
Spacer,
Text,
type TUI,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import type { KeybindingsManager } from "../../../core/keybindings.js";
import { getEditorTheme, theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/extension-input.ts b/packages/coding-agent/src/modes/interactive/components/extension-input.ts
index 733a533bb..39f44f0fc 100644
--- a/packages/coding-agent/src/modes/interactive/components/extension-input.ts
+++ b/packages/coding-agent/src/modes/interactive/components/extension-input.ts
@@ -2,7 +2,7 @@
* Simple text input component for extensions.
*/
-import { Container, type Focusable, getKeybindings, Input, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
+import { Container, type Focusable, getKeybindings, Input, Spacer, Text, type TUI } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
import { CountdownTimer } from "./countdown-timer.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/extension-selector.ts b/packages/coding-agent/src/modes/interactive/components/extension-selector.ts
index b827dc5e6..c2fa547e7 100644
--- a/packages/coding-agent/src/modes/interactive/components/extension-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/extension-selector.ts
@@ -3,7 +3,7 @@
* Displays a list of string options with keyboard navigation.
*/
-import { Container, getKeybindings, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
+import { Container, getKeybindings, Spacer, Text, type TUI } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
import { CountdownTimer } from "./countdown-timer.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/footer.ts b/packages/coding-agent/src/modes/interactive/components/footer.ts
index 04afb70e2..8f0653e75 100644
--- a/packages/coding-agent/src/modes/interactive/components/footer.ts
+++ b/packages/coding-agent/src/modes/interactive/components/footer.ts
@@ -1,4 +1,4 @@
-import { type Component, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
+import { type Component, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
import type { AgentSession } from "../../../core/agent-session.js";
import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provider.js";
import { theme } from "../theme/theme.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/keybinding-hints.ts b/packages/coding-agent/src/modes/interactive/components/keybinding-hints.ts
index 580375e47..27371bdba 100644
--- a/packages/coding-agent/src/modes/interactive/components/keybinding-hints.ts
+++ b/packages/coding-agent/src/modes/interactive/components/keybinding-hints.ts
@@ -2,7 +2,7 @@
* Utilities for formatting keybinding hints in the UI.
*/
-import { getKeybindings, type Keybinding, type KeyId } from "@mariozechner/pi-tui";
+import { getKeybindings, type Keybinding, type KeyId } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
function formatKeys(keys: KeyId[]): string {
diff --git a/packages/coding-agent/src/modes/interactive/components/login-dialog.ts b/packages/coding-agent/src/modes/interactive/components/login-dialog.ts
index f12bd4171..737e8b27f 100644
--- a/packages/coding-agent/src/modes/interactive/components/login-dialog.ts
+++ b/packages/coding-agent/src/modes/interactive/components/login-dialog.ts
@@ -1,5 +1,5 @@
-import { getOAuthProviders } from "@mariozechner/pi-ai/oauth";
-import { Container, type Focusable, getKeybindings, Input, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
+import { getOAuthProviders } from "@earendil-works/pi-ai/oauth";
+import { Container, type Focusable, getKeybindings, Input, Spacer, Text, type TUI } from "@earendil-works/pi-tui";
import { exec } from "child_process";
import { theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/model-selector.ts b/packages/coding-agent/src/modes/interactive/components/model-selector.ts
index 711ac3a9e..613ca9e1c 100644
--- a/packages/coding-agent/src/modes/interactive/components/model-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/model-selector.ts
@@ -1,4 +1,4 @@
-import { type Model, modelsAreEqual } from "@mariozechner/pi-ai";
+import { type Model, modelsAreEqual } from "@earendil-works/pi-ai";
import {
Container,
type Focusable,
@@ -8,7 +8,7 @@ import {
Spacer,
Text,
type TUI,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import type { ModelRegistry } from "../../../core/model-registry.js";
import type { SettingsManager } from "../../../core/settings-manager.js";
import { theme } from "../theme/theme.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/oauth-selector.ts b/packages/coding-agent/src/modes/interactive/components/oauth-selector.ts
index 1925e206c..93ce0e93d 100644
--- a/packages/coding-agent/src/modes/interactive/components/oauth-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/oauth-selector.ts
@@ -6,7 +6,7 @@ import {
Input,
Spacer,
TruncatedText,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import type { AuthStatus, AuthStorage } from "../../../core/auth-storage.js";
import { theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/scoped-models-selector.ts b/packages/coding-agent/src/modes/interactive/components/scoped-models-selector.ts
index 8f9def8a1..c5a82d9ad 100644
--- a/packages/coding-agent/src/modes/interactive/components/scoped-models-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/scoped-models-selector.ts
@@ -1,4 +1,4 @@
-import type { Model } from "@mariozechner/pi-ai";
+import type { Model } from "@earendil-works/pi-ai";
import {
Container,
type Focusable,
@@ -9,7 +9,7 @@ import {
matchesKey,
Spacer,
Text,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
import { keyText } from "./keybinding-hints.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/session-selector-search.ts b/packages/coding-agent/src/modes/interactive/components/session-selector-search.ts
index 6eae410f8..e82a9c05e 100644
--- a/packages/coding-agent/src/modes/interactive/components/session-selector-search.ts
+++ b/packages/coding-agent/src/modes/interactive/components/session-selector-search.ts
@@ -1,4 +1,4 @@
-import { fuzzyMatch } from "@mariozechner/pi-tui";
+import { fuzzyMatch } from "@earendil-works/pi-tui";
import type { SessionInfo } from "../../../core/session-manager.js";
export type SortMode = "threaded" | "recent" | "relevance";
diff --git a/packages/coding-agent/src/modes/interactive/components/session-selector.ts b/packages/coding-agent/src/modes/interactive/components/session-selector.ts
index 83d38443c..e7c0b072d 100644
--- a/packages/coding-agent/src/modes/interactive/components/session-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/session-selector.ts
@@ -12,7 +12,7 @@ import {
Text,
truncateToWidth,
visibleWidth,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import { KeybindingsManager } from "../../../core/keybindings.js";
import type { SessionInfo, SessionListProgress } from "../../../core/session-manager.js";
import { canonicalizePath as _canonicalizePath } from "../../../utils/paths.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/settings-selector.ts b/packages/coding-agent/src/modes/interactive/components/settings-selector.ts
index dff07822c..8eb1b3f1b 100644
--- a/packages/coding-agent/src/modes/interactive/components/settings-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/settings-selector.ts
@@ -1,5 +1,5 @@
-import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
-import type { Transport } from "@mariozechner/pi-ai";
+import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
+import type { Transport } from "@earendil-works/pi-ai";
import {
Container,
getCapabilities,
@@ -10,7 +10,7 @@ import {
SettingsList,
Spacer,
Text,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import type { WarningSettings } from "../../../core/settings-manager.js";
import { getSelectListTheme, getSettingsListTheme, theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/show-images-selector.ts b/packages/coding-agent/src/modes/interactive/components/show-images-selector.ts
index 9163b0171..c0c7bc153 100644
--- a/packages/coding-agent/src/modes/interactive/components/show-images-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/show-images-selector.ts
@@ -1,4 +1,4 @@
-import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from "@mariozechner/pi-tui";
+import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from "@earendil-works/pi-tui";
import { getSelectListTheme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts b/packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts
index ff6eda2aa..8714edc2e 100644
--- a/packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts
+++ b/packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts
@@ -1,4 +1,4 @@
-import { Box, Markdown, type MarkdownTheme, Text } from "@mariozechner/pi-tui";
+import { Box, Markdown, type MarkdownTheme, Text } from "@earendil-works/pi-tui";
import type { ParsedSkillBlock } from "../../../core/agent-session.js";
import { getMarkdownTheme, theme } from "../theme/theme.js";
import { keyText } from "./keybinding-hints.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/theme-selector.ts b/packages/coding-agent/src/modes/interactive/components/theme-selector.ts
index 7a82caa66..29e6e7791 100644
--- a/packages/coding-agent/src/modes/interactive/components/theme-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/theme-selector.ts
@@ -1,4 +1,4 @@
-import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from "@mariozechner/pi-tui";
+import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from "@earendil-works/pi-tui";
import { getAvailableThemes, getSelectListTheme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/thinking-selector.ts b/packages/coding-agent/src/modes/interactive/components/thinking-selector.ts
index 9a01ef1e1..9eadb86f6 100644
--- a/packages/coding-agent/src/modes/interactive/components/thinking-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/thinking-selector.ts
@@ -1,5 +1,5 @@
-import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
-import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from "@mariozechner/pi-tui";
+import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
+import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from "@earendil-works/pi-tui";
import { getSelectListTheme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/tool-execution.ts b/packages/coding-agent/src/modes/interactive/components/tool-execution.ts
index 864a69382..867a0bb52 100644
--- a/packages/coding-agent/src/modes/interactive/components/tool-execution.ts
+++ b/packages/coding-agent/src/modes/interactive/components/tool-execution.ts
@@ -1,4 +1,4 @@
-import { Box, type Component, Container, getCapabilities, Image, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
+import { Box, type Component, Container, getCapabilities, Image, Spacer, Text, type TUI } from "@earendil-works/pi-tui";
import type { ToolDefinition, ToolRenderContext } from "../../../core/extensions/types.js";
import { createAllToolDefinitions, type ToolName } from "../../../core/tools/index.js";
import { getTextOutput as getRenderedTextOutput } from "../../../core/tools/render-utils.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/tree-selector.ts b/packages/coding-agent/src/modes/interactive/components/tree-selector.ts
index 17762af72..35c59d748 100644
--- a/packages/coding-agent/src/modes/interactive/components/tree-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/tree-selector.ts
@@ -8,7 +8,7 @@ import {
Text,
TruncatedText,
truncateToWidth,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import type { SessionTreeNode } from "../../../core/session-manager.js";
import { theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/user-message-selector.ts b/packages/coding-agent/src/modes/interactive/components/user-message-selector.ts
index cbe20ec80..6cf4223ab 100644
--- a/packages/coding-agent/src/modes/interactive/components/user-message-selector.ts
+++ b/packages/coding-agent/src/modes/interactive/components/user-message-selector.ts
@@ -1,4 +1,4 @@
-import { type Component, Container, getKeybindings, Spacer, Text, truncateToWidth } from "@mariozechner/pi-tui";
+import { type Component, Container, getKeybindings, Spacer, Text, truncateToWidth } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
diff --git a/packages/coding-agent/src/modes/interactive/components/user-message.ts b/packages/coding-agent/src/modes/interactive/components/user-message.ts
index 6917702da..969df02fd 100644
--- a/packages/coding-agent/src/modes/interactive/components/user-message.ts
+++ b/packages/coding-agent/src/modes/interactive/components/user-message.ts
@@ -1,4 +1,4 @@
-import { Box, Container, Markdown, type MarkdownTheme } from "@mariozechner/pi-tui";
+import { Box, Container, Markdown, type MarkdownTheme } from "@earendil-works/pi-tui";
import { getMarkdownTheme, theme } from "../theme/theme.js";
const OSC133_ZONE_START = "\x1b]133;A\x07";
diff --git a/packages/coding-agent/src/modes/interactive/components/visual-truncate.ts b/packages/coding-agent/src/modes/interactive/components/visual-truncate.ts
index c681d2ba7..827230416 100644
--- a/packages/coding-agent/src/modes/interactive/components/visual-truncate.ts
+++ b/packages/coding-agent/src/modes/interactive/components/visual-truncate.ts
@@ -3,7 +3,7 @@
* Used by both tool-execution.ts and bash-execution.ts for consistent behavior.
*/
-import { Text } from "@mariozechner/pi-tui";
+import { Text } from "@earendil-works/pi-tui";
export interface VisualTruncateResult {
/** The visual lines to display */
diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts
index 4eecad9f0..e1cf20379 100644
--- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts
+++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts
@@ -7,7 +7,7 @@ import * as crypto from "node:crypto";
import * as fs from "node:fs";
import * as os from "node:os";
import * as path from "node:path";
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
import {
type AssistantMessage,
getProviders,
@@ -16,7 +16,7 @@ import {
type Model,
type OAuthProviderId,
type OAuthSelectPrompt,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import type {
AutocompleteItem,
AutocompleteProvider,
@@ -27,7 +27,7 @@ import type {
OverlayHandle,
OverlayOptions,
SlashCommand,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import {
CombinedAutocompleteProvider,
type Component,
@@ -44,7 +44,7 @@ import {
TruncatedText,
TUI,
visibleWidth,
-} from "@mariozechner/pi-tui";
+} from "@earendil-works/pi-tui";
import { spawn, spawnSync } from "child_process";
import {
APP_NAME,
@@ -85,6 +85,7 @@ import { getChangelogPath, getNewEntries, parseChangelog } from "../../utils/cha
import { copyToClipboard } from "../../utils/clipboard.js";
import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
import { parseGitUrl } from "../../utils/git.js";
+import { getCwdRelativePath } from "../../utils/paths.js";
import { getPiUserAgent } from "../../utils/pi-user-agent.js";
import { killTrackedDetachedChildren } from "../../utils/shell.js";
import { ensureTool } from "../../utils/tools-manager.js";
@@ -911,15 +912,9 @@ export class InteractiveMode {
private formatContextPath(p: string): string {
const cwd = path.resolve(this.sessionManager.getCwd());
const absolutePath = path.isAbsolute(p) ? path.resolve(p) : path.resolve(cwd, p);
- const relativePath = path.relative(cwd, absolutePath);
- const isInsideCwd =
- relativePath === "" ||
- (!relativePath.startsWith("..") &&
- !relativePath.startsWith(`..${path.sep}`) &&
- !path.isAbsolute(relativePath));
-
- if (isInsideCwd) {
- return relativePath || ".";
+ const relativePath = getCwdRelativePath(absolutePath, cwd);
+ if (relativePath !== undefined) {
+ return relativePath;
}
return this.formatDisplayPath(absolutePath);
@@ -3522,7 +3517,7 @@ export class InteractiveMode {
const updateInstruction = theme.fg("muted", `New version ${newVersion} is available. Run `) + action;
const changelogUrl = theme.fg(
"accent",
- "https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/CHANGELOG.md",
+ "https://github.com/earendil-works/pi-mono/blob/main/packages/coding-agent/CHANGELOG.md",
);
const changelogLine = theme.fg("muted", "Changelog: ") + changelogUrl;
diff --git a/packages/coding-agent/src/modes/interactive/theme/dark.json b/packages/coding-agent/src/modes/interactive/theme/dark.json
index 0ca2af510..212e54f78 100644
--- a/packages/coding-agent/src/modes/interactive/theme/dark.json
+++ b/packages/coding-agent/src/modes/interactive/theme/dark.json
@@ -1,5 +1,5 @@
{
- "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
"name": "dark",
"vars": {
"cyan": "#00d7ff",
diff --git a/packages/coding-agent/src/modes/interactive/theme/light.json b/packages/coding-agent/src/modes/interactive/theme/light.json
index 58ab93e98..9b99deae6 100644
--- a/packages/coding-agent/src/modes/interactive/theme/light.json
+++ b/packages/coding-agent/src/modes/interactive/theme/light.json
@@ -1,5 +1,5 @@
{
- "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
"name": "light",
"vars": {
"teal": "#5a8080",
diff --git a/packages/coding-agent/src/modes/interactive/theme/theme.ts b/packages/coding-agent/src/modes/interactive/theme/theme.ts
index 451d39b96..955fa44a7 100644
--- a/packages/coding-agent/src/modes/interactive/theme/theme.ts
+++ b/packages/coding-agent/src/modes/interactive/theme/theme.ts
@@ -1,6 +1,6 @@
import * as fs from "node:fs";
import * as path from "node:path";
-import type { EditorTheme, MarkdownTheme, SelectListTheme } from "@mariozechner/pi-tui";
+import type { EditorTheme, MarkdownTheme, SelectListTheme } from "@earendil-works/pi-tui";
import chalk from "chalk";
import { highlight, supportsLanguage } from "cli-highlight";
import { type Static, Type } from "typebox";
@@ -657,7 +657,7 @@ function getDefaultTheme(): string {
// ============================================================================
// Use globalThis to share theme across module loaders (tsx + jiti in dev mode)
-const THEME_KEY = Symbol.for("@mariozechner/pi-coding-agent:theme");
+const THEME_KEY = Symbol.for("@earendil-works/pi-coding-agent:theme");
// Export theme as a getter that reads from globalThis
// This ensures all module instances (tsx, jiti) see the same theme
@@ -1130,7 +1130,7 @@ export function getEditorTheme(): EditorTheme {
};
}
-export function getSettingsListTheme(): import("@mariozechner/pi-tui").SettingsListTheme {
+export function getSettingsListTheme(): import("@earendil-works/pi-tui").SettingsListTheme {
return {
label: (text: string, selected: boolean) => (selected ? theme.fg("accent", text) : text),
value: (text: string, selected: boolean) => (selected ? theme.fg("accent", text) : theme.fg("muted", text)),
diff --git a/packages/coding-agent/src/modes/print-mode.ts b/packages/coding-agent/src/modes/print-mode.ts
index bee517daf..2f9fb048e 100644
--- a/packages/coding-agent/src/modes/print-mode.ts
+++ b/packages/coding-agent/src/modes/print-mode.ts
@@ -6,7 +6,7 @@
* - `pi --mode json "prompt"` - JSON event stream
*/
-import type { AssistantMessage, ImageContent } from "@mariozechner/pi-ai";
+import type { AssistantMessage, ImageContent } from "@earendil-works/pi-ai";
import type { AgentSessionRuntime } from "../core/agent-session-runtime.js";
import { flushRawStdout, writeRawStdout } from "../core/output-guard.js";
import { killTrackedDetachedChildren } from "../utils/shell.js";
diff --git a/packages/coding-agent/src/modes/rpc/rpc-client.ts b/packages/coding-agent/src/modes/rpc/rpc-client.ts
index 98fa05620..00fd3cd94 100644
--- a/packages/coding-agent/src/modes/rpc/rpc-client.ts
+++ b/packages/coding-agent/src/modes/rpc/rpc-client.ts
@@ -5,8 +5,8 @@
*/
import { type ChildProcess, spawn } from "node:child_process";
-import type { AgentEvent, AgentMessage, ThinkingLevel } from "@mariozechner/pi-agent-core";
-import type { ImageContent } from "@mariozechner/pi-ai";
+import type { AgentEvent, AgentMessage, ThinkingLevel } from "@earendil-works/pi-agent-core";
+import type { ImageContent } from "@earendil-works/pi-ai";
import type { SessionStats } from "../../core/agent-session.js";
import type { BashResult } from "../../core/bash-executor.js";
import type { CompactionResult } from "../../core/compaction/index.js";
diff --git a/packages/coding-agent/src/modes/rpc/rpc-types.ts b/packages/coding-agent/src/modes/rpc/rpc-types.ts
index 54e0b9dd9..43aeeeeb4 100644
--- a/packages/coding-agent/src/modes/rpc/rpc-types.ts
+++ b/packages/coding-agent/src/modes/rpc/rpc-types.ts
@@ -5,8 +5,8 @@
* Responses and events are emitted as JSON lines on stdout.
*/
-import type { AgentMessage, ThinkingLevel } from "@mariozechner/pi-agent-core";
-import type { ImageContent, Model } from "@mariozechner/pi-ai";
+import type { AgentMessage, ThinkingLevel } from "@earendil-works/pi-agent-core";
+import type { ImageContent, Model } from "@earendil-works/pi-ai";
import type { SessionStats } from "../../core/agent-session.js";
import type { BashResult } from "../../core/bash-executor.js";
import type { CompactionResult } from "../../core/compaction/index.js";
diff --git a/packages/coding-agent/src/package-manager-cli.ts b/packages/coding-agent/src/package-manager-cli.ts
index d9153ac70..a41fb7a6c 100644
--- a/packages/coding-agent/src/package-manager-cli.ts
+++ b/packages/coding-agent/src/package-manager-cli.ts
@@ -13,7 +13,7 @@ import {
import { DefaultPackageManager } from "./core/package-manager.js";
import { SettingsManager } from "./core/settings-manager.js";
import { shouldUseWindowsShell } from "./utils/child-process.js";
-import { getLatestPiVersion, isNewerPackageVersion } from "./utils/version-check.js";
+import { getLatestPiRelease, isNewerPackageVersion } from "./utils/version-check.js";
export type PackageCommand = "install" | "remove" | "update" | "list";
@@ -273,9 +273,9 @@ function updateTargetIncludesExtensions(target: UpdateTarget): boolean {
return target.type === "all" || target.type === "extensions";
}
-function printSelfUpdateUnavailable(npmCommand?: string[]): void {
+function printSelfUpdateUnavailable(npmCommand?: string[], updatePackageName = PACKAGE_NAME): void {
console.error(`error: ${APP_NAME} cannot self-update this installation.`);
- console.error(getSelfUpdateUnavailableInstruction(PACKAGE_NAME, npmCommand));
+ console.error(getSelfUpdateUnavailableInstruction(PACKAGE_NAME, npmCommand, updatePackageName));
const entrypoint = process.argv[1];
if (entrypoint) {
@@ -288,47 +288,53 @@ function printSelfUpdateFallback(command: SelfUpdateCommand): void {
console.error(chalk.dim(`If this keeps failing, run this command yourself: ${command.display}`));
}
-async function shouldRunSelfUpdate(force: boolean): Promise {
+interface SelfUpdatePlan {
+ packageName: string;
+ shouldRun: boolean;
+}
+
+async function getSelfUpdatePlan(force: boolean): Promise {
if (force) {
- return true;
+ return { packageName: PACKAGE_NAME, shouldRun: true };
}
- let latestVersion: string | undefined;
try {
- latestVersion = await getLatestPiVersion(VERSION);
+ const latestRelease = await getLatestPiRelease(VERSION);
+ const packageName = latestRelease?.packageName ?? PACKAGE_NAME;
+ if (!latestRelease || packageName !== PACKAGE_NAME || isNewerPackageVersion(latestRelease.version, VERSION)) {
+ return { packageName, shouldRun: true };
+ }
} catch {
- return true;
- }
-
- if (!latestVersion || isNewerPackageVersion(latestVersion, VERSION)) {
- return true;
+ return { packageName: PACKAGE_NAME, shouldRun: true };
}
console.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));
- return false;
+ return { packageName: PACKAGE_NAME, shouldRun: false };
}
async function runSelfUpdate(command: SelfUpdateCommand): Promise {
console.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));
- await new Promise((resolve, reject) => {
- // Windows package managers are commonly .cmd shims. Use the shell so Node can execute them.
- const child = spawn(command.command, command.args, {
- stdio: "inherit",
- shell: shouldUseWindowsShell(command.command),
+ for (const step of command.steps ?? [command]) {
+ await new Promise((resolve, reject) => {
+ // Windows package managers are commonly .cmd shims. Use the shell so Node can execute them.
+ const child = spawn(step.command, step.args, {
+ stdio: "inherit",
+ shell: shouldUseWindowsShell(step.command),
+ });
+ child.on("error", (error) => {
+ reject(error);
+ });
+ child.on("close", (code, signal) => {
+ if (code === 0) {
+ resolve();
+ } else if (signal) {
+ reject(new Error(`${step.display} terminated by signal ${signal}`));
+ } else {
+ reject(new Error(`${step.display} exited with code ${code ?? "unknown"}`));
+ }
+ });
});
- child.on("error", (error) => {
- reject(error);
- });
- child.on("close", (code, signal) => {
- if (code === 0) {
- resolve();
- } else if (signal) {
- reject(new Error(`${command.display} terminated by signal ${signal}`));
- } else {
- reject(new Error(`${command.display} exited with code ${code ?? "unknown"}`));
- }
- });
- });
+ }
}
export async function handleConfigCommand(args: string[]): Promise {
@@ -480,13 +486,18 @@ export async function handlePackageCommand(args: string[]): Promise {
}
}
if (updateTargetIncludesSelf(target)) {
- const selfUpdateCommand = getSelfUpdateCommand(PACKAGE_NAME, selfUpdateNpmCommand);
- if (!selfUpdateCommand) {
- printSelfUpdateUnavailable(selfUpdateNpmCommand);
- process.exitCode = 1;
+ const selfUpdatePlan = await getSelfUpdatePlan(options.force);
+ if (!selfUpdatePlan.shouldRun) {
return true;
}
- if (!(await shouldRunSelfUpdate(options.force))) {
+ const selfUpdateCommand = getSelfUpdateCommand(
+ PACKAGE_NAME,
+ selfUpdateNpmCommand,
+ selfUpdatePlan.packageName,
+ );
+ if (!selfUpdateCommand) {
+ printSelfUpdateUnavailable(selfUpdateNpmCommand, selfUpdatePlan.packageName);
+ process.exitCode = 1;
return true;
}
try {
diff --git a/packages/coding-agent/src/utils/image-resize.ts b/packages/coding-agent/src/utils/image-resize.ts
index 8c14d0b6e..84b4ac331 100644
--- a/packages/coding-agent/src/utils/image-resize.ts
+++ b/packages/coding-agent/src/utils/image-resize.ts
@@ -1,4 +1,4 @@
-import type { ImageContent } from "@mariozechner/pi-ai";
+import type { ImageContent } from "@earendil-works/pi-ai";
import { applyExifOrientation } from "./exif-orientation.js";
import { loadPhoton } from "./photon.js";
diff --git a/packages/coding-agent/src/utils/paths.ts b/packages/coding-agent/src/utils/paths.ts
index 212e4f5ea..ef36de7a9 100644
--- a/packages/coding-agent/src/utils/paths.ts
+++ b/packages/coding-agent/src/utils/paths.ts
@@ -1,4 +1,5 @@
import { realpathSync } from "node:fs";
+import { isAbsolute, relative, resolve as resolvePath, sep } from "node:path";
/**
* Resolve a path to its canonical (real) form, following symlinks.
@@ -34,3 +35,23 @@ export function isLocalPath(value: string): boolean {
}
return true;
}
+
+function resolveAgainstCwd(filePath: string, cwd: string): string {
+ return isAbsolute(filePath) ? resolvePath(filePath) : resolvePath(cwd, filePath);
+}
+
+export function getCwdRelativePath(filePath: string, cwd: string): string | undefined {
+ const resolvedCwd = resolvePath(cwd);
+ const resolvedPath = resolveAgainstCwd(filePath, resolvedCwd);
+ const relativePath = relative(resolvedCwd, resolvedPath);
+ const isInsideCwd =
+ relativePath === "" ||
+ (relativePath !== ".." && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath));
+
+ return isInsideCwd ? relativePath || "." : undefined;
+}
+
+export function formatPathRelativeToCwdOrAbsolute(filePath: string, cwd: string): string {
+ const absolutePath = resolveAgainstCwd(filePath, cwd);
+ return (getCwdRelativePath(absolutePath, cwd) ?? absolutePath).split(sep).join("/");
+}
diff --git a/packages/coding-agent/src/utils/version-check.ts b/packages/coding-agent/src/utils/version-check.ts
index e246dcd64..ec9694693 100644
--- a/packages/coding-agent/src/utils/version-check.ts
+++ b/packages/coding-agent/src/utils/version-check.ts
@@ -3,6 +3,11 @@ import { getPiUserAgent } from "./pi-user-agent.js";
const LATEST_VERSION_URL = "https://pi.dev/api/latest-version";
const DEFAULT_VERSION_CHECK_TIMEOUT_MS = 10000;
+export interface LatestPiRelease {
+ version: string;
+ packageName?: string;
+}
+
interface ParsedVersion {
major: number;
minor: number;
@@ -47,10 +52,10 @@ export function isNewerPackageVersion(candidateVersion: string, currentVersion:
return candidateVersion.trim() !== currentVersion.trim();
}
-export async function getLatestPiVersion(
+export async function getLatestPiRelease(
currentVersion: string,
options: { timeoutMs?: number } = {},
-): Promise {
+): Promise {
if (process.env.PI_SKIP_VERSION_CHECK || process.env.PI_OFFLINE) return undefined;
const response = await fetch(LATEST_VERSION_URL, {
@@ -62,8 +67,20 @@ export async function getLatestPiVersion(
});
if (!response.ok) return undefined;
- const data = (await response.json()) as { version?: unknown };
- return typeof data.version === "string" && data.version.trim() ? data.version.trim() : undefined;
+ const data = (await response.json()) as { packageName?: unknown; version?: unknown };
+ if (typeof data.version !== "string" || !data.version.trim()) {
+ return undefined;
+ }
+ const packageName =
+ typeof data.packageName === "string" && data.packageName.trim() ? data.packageName.trim() : undefined;
+ return { version: data.version.trim(), packageName };
+}
+
+export async function getLatestPiVersion(
+ currentVersion: string,
+ options: { timeoutMs?: number } = {},
+): Promise {
+ return (await getLatestPiRelease(currentVersion, options))?.version;
}
export async function checkForNewPiVersion(currentVersion: string): Promise {
diff --git a/packages/coding-agent/test/agent-session-auto-compaction-queue.test.ts b/packages/coding-agent/test/agent-session-auto-compaction-queue.test.ts
index 6a62452e0..f53431700 100644
--- a/packages/coding-agent/test/agent-session-auto-compaction-queue.test.ts
+++ b/packages/coding-agent/test/agent-session-auto-compaction-queue.test.ts
@@ -1,8 +1,8 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { Agent } from "@mariozechner/pi-agent-core";
-import { type AssistantMessage, getModel } from "@mariozechner/pi-ai";
+import { Agent } from "@earendil-works/pi-agent-core";
+import { type AssistantMessage, getModel } from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { AgentSession } from "../src/core/agent-session.js";
import { AuthStorage } from "../src/core/auth-storage.js";
diff --git a/packages/coding-agent/test/agent-session-branching.test.ts b/packages/coding-agent/test/agent-session-branching.test.ts
index 2d43b8b2d..8590ad746 100644
--- a/packages/coding-agent/test/agent-session-branching.test.ts
+++ b/packages/coding-agent/test/agent-session-branching.test.ts
@@ -10,7 +10,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import type { AgentSession } from "../src/core/agent-session.js";
import {
diff --git a/packages/coding-agent/test/agent-session-compaction.test.ts b/packages/coding-agent/test/agent-session-compaction.test.ts
index 307518f32..da52aecac 100644
--- a/packages/coding-agent/test/agent-session-compaction.test.ts
+++ b/packages/coding-agent/test/agent-session-compaction.test.ts
@@ -10,8 +10,8 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { Agent } from "@mariozechner/pi-agent-core";
-import { getModel } from "@mariozechner/pi-ai";
+import { Agent } from "@earendil-works/pi-agent-core";
+import { getModel } from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { AgentSession, type AgentSessionEvent } from "../src/core/agent-session.js";
import { AuthStorage } from "../src/core/auth-storage.js";
diff --git a/packages/coding-agent/test/agent-session-concurrent.test.ts b/packages/coding-agent/test/agent-session-concurrent.test.ts
index 719162985..876883f21 100644
--- a/packages/coding-agent/test/agent-session-concurrent.test.ts
+++ b/packages/coding-agent/test/agent-session-concurrent.test.ts
@@ -5,7 +5,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { Agent } from "@mariozechner/pi-agent-core";
+import { Agent } from "@earendil-works/pi-agent-core";
import {
type AssistantMessage,
type AssistantMessageEvent,
@@ -13,7 +13,7 @@ import {
getModel,
type ImageContent,
type TextContent,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { AgentSession } from "../src/core/agent-session.js";
diff --git a/packages/coding-agent/test/agent-session-dynamic-provider.test.ts b/packages/coding-agent/test/agent-session-dynamic-provider.test.ts
index 6c3b81352..e527ca35a 100644
--- a/packages/coding-agent/test/agent-session-dynamic-provider.test.ts
+++ b/packages/coding-agent/test/agent-session-dynamic-provider.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { AuthStorage } from "../src/core/auth-storage.js";
import { DefaultResourceLoader } from "../src/core/resource-loader.js";
diff --git a/packages/coding-agent/test/agent-session-dynamic-tools.test.ts b/packages/coding-agent/test/agent-session-dynamic-tools.test.ts
index c31c8e265..6c020defe 100644
--- a/packages/coding-agent/test/agent-session-dynamic-tools.test.ts
+++ b/packages/coding-agent/test/agent-session-dynamic-tools.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { DefaultResourceLoader } from "../src/core/resource-loader.js";
diff --git a/packages/coding-agent/test/agent-session-retry.test.ts b/packages/coding-agent/test/agent-session-retry.test.ts
index 4c4a69ac8..25dfd2092 100644
--- a/packages/coding-agent/test/agent-session-retry.test.ts
+++ b/packages/coding-agent/test/agent-session-retry.test.ts
@@ -1,8 +1,8 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { Agent, type AgentEvent, type AgentTool } from "@mariozechner/pi-agent-core";
-import { type AssistantMessage, type AssistantMessageEvent, EventStream, getModel } from "@mariozechner/pi-ai";
+import { Agent, type AgentEvent, type AgentTool } from "@earendil-works/pi-agent-core";
+import { type AssistantMessage, type AssistantMessageEvent, EventStream, getModel } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { AgentSession } from "../src/core/agent-session.js";
diff --git a/packages/coding-agent/test/agent-session-runtime-events.test.ts b/packages/coding-agent/test/agent-session-runtime-events.test.ts
index 94b770ea4..dcd705779 100644
--- a/packages/coding-agent/test/agent-session-runtime-events.test.ts
+++ b/packages/coding-agent/test/agent-session-runtime-events.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { fauxAssistantMessage, registerFauxProvider } from "@mariozechner/pi-ai";
+import { fauxAssistantMessage, registerFauxProvider } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it } from "vitest";
import {
type CreateAgentSessionRuntimeFactory,
diff --git a/packages/coding-agent/test/agent-session-stats.test.ts b/packages/coding-agent/test/agent-session-stats.test.ts
index 57b8633cb..27788b8f6 100644
--- a/packages/coding-agent/test/agent-session-stats.test.ts
+++ b/packages/coding-agent/test/agent-session-stats.test.ts
@@ -1,5 +1,5 @@
-import { Agent } from "@mariozechner/pi-agent-core";
-import { type AssistantMessage, getModel, type Usage } from "@mariozechner/pi-ai";
+import { Agent } from "@earendil-works/pi-agent-core";
+import { type AssistantMessage, getModel, type Usage } from "@earendil-works/pi-ai";
import { describe, expect, it } from "vitest";
import { AgentSession } from "../src/core/agent-session.js";
import { AuthStorage } from "../src/core/auth-storage.js";
diff --git a/packages/coding-agent/test/assistant-message.test.ts b/packages/coding-agent/test/assistant-message.test.ts
index 957152dae..9af2a4a2f 100644
--- a/packages/coding-agent/test/assistant-message.test.ts
+++ b/packages/coding-agent/test/assistant-message.test.ts
@@ -1,4 +1,4 @@
-import type { AssistantMessage } from "@mariozechner/pi-ai";
+import type { AssistantMessage } from "@earendil-works/pi-ai";
import { describe, expect, test } from "vitest";
import { AssistantMessageComponent } from "../src/modes/interactive/components/assistant-message.js";
import { initTheme } from "../src/modes/interactive/theme/theme.js";
diff --git a/packages/coding-agent/test/auth-storage.test.ts b/packages/coding-agent/test/auth-storage.test.ts
index d48be918b..ddaef67e8 100644
--- a/packages/coding-agent/test/auth-storage.test.ts
+++ b/packages/coding-agent/test/auth-storage.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { registerOAuthProvider } from "@mariozechner/pi-ai/oauth";
+import { registerOAuthProvider } from "@earendil-works/pi-ai/oauth";
import lockfile from "proper-lockfile";
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
import { AuthStorage } from "../src/core/auth-storage.js";
diff --git a/packages/coding-agent/test/bash-execution-width.test.ts b/packages/coding-agent/test/bash-execution-width.test.ts
index 8a40189c0..12a8bb518 100644
--- a/packages/coding-agent/test/bash-execution-width.test.ts
+++ b/packages/coding-agent/test/bash-execution-width.test.ts
@@ -2,7 +2,7 @@
* Test that BashExecutionComponent's collapsed output respects the render-time width,
* not a stale captured width. Regression test for #2569.
*/
-import { visibleWidth } from "@mariozechner/pi-tui";
+import { visibleWidth } from "@earendil-works/pi-tui";
import { beforeAll, describe, expect, it } from "vitest";
import { BashExecutionComponent } from "../src/modes/interactive/components/bash-execution.js";
import { initTheme } from "../src/modes/interactive/theme/theme.js";
diff --git a/packages/coding-agent/test/compaction-extensions.test.ts b/packages/coding-agent/test/compaction-extensions.test.ts
index 48d039390..1a134e7bf 100644
--- a/packages/coding-agent/test/compaction-extensions.test.ts
+++ b/packages/coding-agent/test/compaction-extensions.test.ts
@@ -5,8 +5,8 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { Agent } from "@mariozechner/pi-agent-core";
-import { getModel } from "@mariozechner/pi-ai";
+import { Agent } from "@earendil-works/pi-agent-core";
+import { getModel } from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { AgentSession } from "../src/core/agent-session.js";
import { AuthStorage } from "../src/core/auth-storage.js";
diff --git a/packages/coding-agent/test/compaction-serialization.test.ts b/packages/coding-agent/test/compaction-serialization.test.ts
index eada4df16..9b11bb0f1 100644
--- a/packages/coding-agent/test/compaction-serialization.test.ts
+++ b/packages/coding-agent/test/compaction-serialization.test.ts
@@ -1,4 +1,4 @@
-import type { Message } from "@mariozechner/pi-ai";
+import type { Message } from "@earendil-works/pi-ai";
import { describe, expect, it } from "vitest";
import { serializeConversation } from "../src/core/compaction/utils.js";
diff --git a/packages/coding-agent/test/compaction-summary-reasoning.test.ts b/packages/coding-agent/test/compaction-summary-reasoning.test.ts
index 4e56dbba1..c674ef1a7 100644
--- a/packages/coding-agent/test/compaction-summary-reasoning.test.ts
+++ b/packages/coding-agent/test/compaction-summary-reasoning.test.ts
@@ -1,5 +1,5 @@
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { AssistantMessage, Model } from "@mariozechner/pi-ai";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { AssistantMessage, Model } from "@earendil-works/pi-ai";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { generateSummary } from "../src/core/compaction/index.js";
@@ -7,8 +7,8 @@ const { completeSimpleMock } = vi.hoisted(() => ({
completeSimpleMock: vi.fn(),
}));
-vi.mock("@mariozechner/pi-ai", async (importOriginal) => {
- const actual = await importOriginal();
+vi.mock("@earendil-works/pi-ai", async (importOriginal) => {
+ const actual = await importOriginal();
return {
...actual,
completeSimple: completeSimpleMock,
diff --git a/packages/coding-agent/test/compaction.test.ts b/packages/coding-agent/test/compaction.test.ts
index 1a35f2980..ca665543c 100644
--- a/packages/coding-agent/test/compaction.test.ts
+++ b/packages/coding-agent/test/compaction.test.ts
@@ -1,6 +1,6 @@
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { AssistantMessage, Usage } from "@mariozechner/pi-ai";
-import { getModel } from "@mariozechner/pi-ai";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { AssistantMessage, Usage } from "@earendil-works/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { readFileSync } from "fs";
import { join } from "path";
import { beforeEach, describe, expect, it } from "vitest";
diff --git a/packages/coding-agent/test/config.test.ts b/packages/coding-agent/test/config.test.ts
index e0a556c5e..6516beb59 100644
--- a/packages/coding-agent/test/config.test.ts
+++ b/packages/coding-agent/test/config.test.ts
@@ -45,7 +45,7 @@ afterEach(() => {
function createNpmPrefixInstall(template = "pi-prefix-"): { prefix: string; packageDir: string } {
const prefix = mkdtempSync(join(tmpdir(), template));
const root = join(prefix, "lib", "node_modules");
- const scopeDir = join(root, "@mariozechner");
+ const scopeDir = join(root, "@earendil-works");
const packageDir = join(scopeDir, "pi-coding-agent");
mkdirSync(packageDir, { recursive: true });
tempDir = prefix;
@@ -54,12 +54,55 @@ function createNpmPrefixInstall(template = "pi-prefix-"): { prefix: string; pack
return { prefix, packageDir };
}
+function createPnpmGlobalInstall(): { root: string; packageDir: string } {
+ const temp = mkdtempSync(join(tmpdir(), "pi-pnpm-"));
+ const binDir = join(temp, "bin");
+ const root = join(temp, "pnpm", "global", "5", "node_modules");
+ const packageDir = join(root, "@mariozechner", "pi-coding-agent");
+ mkdirSync(packageDir, { recursive: true });
+ mkdirSync(binDir, { recursive: true });
+ writeFileSync(join(binDir, process.platform === "win32" ? "pnpm.cmd" : "pnpm"), createFakePnpmScript(root));
+ chmodSync(join(binDir, process.platform === "win32" ? "pnpm.cmd" : "pnpm"), 0o755);
+ tempDir = temp;
+ process.env.PATH = `${binDir}${delimiter}${originalPath ?? ""}`;
+ process.env.PI_PACKAGE_DIR = packageDir;
+ setExecPath(
+ join(
+ root,
+ ".pnpm",
+ "@mariozechner+pi-coding-agent@0.0.0",
+ "node_modules",
+ "@mariozechner",
+ "pi-coding-agent",
+ "dist",
+ "cli.js",
+ ),
+ );
+ return { root, packageDir };
+}
+
+function createYarnGlobalInstall(): { globalDir: string; packageDir: string } {
+ const temp = mkdtempSync(join(tmpdir(), "pi-yarn-"));
+ const binDir = join(temp, "bin");
+ const globalDir = join(temp, "yarn", "global");
+ const packageDir = join(globalDir, "node_modules", "@mariozechner", "pi-coding-agent");
+ mkdirSync(packageDir, { recursive: true });
+ mkdirSync(binDir, { recursive: true });
+ writeFileSync(join(binDir, process.platform === "win32" ? "yarn.cmd" : "yarn"), createFakeYarnScript(globalDir));
+ chmodSync(join(binDir, process.platform === "win32" ? "yarn.cmd" : "yarn"), 0o755);
+ tempDir = temp;
+ process.env.PATH = `${binDir}${delimiter}${originalPath ?? ""}`;
+ process.env.PI_PACKAGE_DIR = packageDir;
+ setExecPath(join(globalDir, ".yarn", "@mariozechner", "pi-coding-agent", "dist", "cli.js"));
+ return { globalDir, packageDir };
+}
+
function createBunGlobalInstall(): { packageDir: string } {
const temp = mkdtempSync(join(tmpdir(), "pi-bun-"));
const prefix = join(temp, ".bun");
const bunBin = join(prefix, "bin");
const root = join(prefix, "install", "global", "node_modules");
- const scopeDir = join(root, "@mariozechner");
+ const scopeDir = join(root, "@earendil-works");
const packageDir = join(scopeDir, "pi-coding-agent");
mkdirSync(packageDir, { recursive: true });
mkdirSync(bunBin, { recursive: true });
@@ -72,6 +115,22 @@ function createBunGlobalInstall(): { packageDir: string } {
return { packageDir };
}
+function createFakePnpmScript(root: string): string {
+ if (process.platform === "win32") {
+ return `@echo off\r\nif "%1"=="root" if "%2"=="-g" echo ${root}\r\n`;
+ }
+ const escapedRoot = root.replaceAll("'", "'\\''");
+ return `#!/bin/sh\nif [ "$1" = "root" ] && [ "$2" = "-g" ]; then\n\tprintf '%s\\n' '${escapedRoot}'\n\texit 0\nfi\nexit 1\n`;
+}
+
+function createFakeYarnScript(globalDir: string): string {
+ if (process.platform === "win32") {
+ return `@echo off\r\nif "%1"=="global" if "%2"=="dir" echo ${globalDir}\r\n`;
+ }
+ const escapedGlobalDir = globalDir.replaceAll("'", "'\\''");
+ return `#!/bin/sh\nif [ "$1" = "global" ] && [ "$2" = "dir" ]; then\n\tprintf '%s\\n' '${escapedGlobalDir}'\n\texit 0\nfi\nexit 1\n`;
+}
+
function createFakeBunScript(bunBin: string): string {
if (process.platform === "win32") {
return `@echo off\r\nif "%1"=="pm" if "%2"=="bin" if "%3"=="-g" echo ${bunBin}\r\n`;
@@ -83,12 +142,12 @@ function createFakeBunScript(bunBin: string): string {
describe("detectInstallMethod", () => {
test("detects pnpm from Windows .pnpm install paths", () => {
setExecPath(
- "C:\\Users\\Admin\\Documents\\pnpm-repository\\global\\5\\.pnpm\\@mariozechner+pi-coding-agent@0.67.68\\node_modules\\@mariozechner\\pi-coding-agent\\dist\\cli.js",
+ "C:\\Users\\Admin\\Documents\\pnpm-repository\\global\\5\\.pnpm\\@earendil-works+pi-coding-agent@0.67.68\\node_modules\\@earendil-works\\pi-coding-agent\\dist\\cli.js",
);
expect(detectInstallMethod()).toBe("pnpm");
- expect(getUpdateInstruction("@mariozechner/pi-coding-agent")).toBe(
- "Run: pnpm install -g @mariozechner/pi-coding-agent",
+ expect(getUpdateInstruction("@earendil-works/pi-coding-agent")).toBe(
+ "Run: pnpm install -g @earendil-works/pi-coding-agent",
);
});
@@ -96,74 +155,173 @@ describe("detectInstallMethod", () => {
setExecPath("/usr/local/bin/node");
expect(detectInstallMethod()).toBe("unknown");
- expect(getSelfUpdateCommand("@mariozechner/pi-coding-agent")).toBeUndefined();
- expect(getUpdateInstruction("@mariozechner/pi-coding-agent")).toBe(
- "Update @mariozechner/pi-coding-agent using the package manager, wrapper, or source checkout that provides this installation.",
+ expect(getSelfUpdateCommand("@earendil-works/pi-coding-agent")).toBeUndefined();
+ expect(getUpdateInstruction("@earendil-works/pi-coding-agent")).toBe(
+ "Update @earendil-works/pi-coding-agent using the package manager, wrapper, or source checkout that provides this installation.",
);
});
test("self-updates npm installs from custom prefixes", () => {
const { prefix } = createNpmPrefixInstall();
- const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent");
+ const command = getSelfUpdateCommand("@earendil-works/pi-coding-agent");
expect(detectInstallMethod()).toBe("npm");
expect(command).toEqual({
command: "npm",
- args: ["--prefix", prefix, "install", "-g", "@mariozechner/pi-coding-agent"],
- display: `npm --prefix ${prefix} install -g @mariozechner/pi-coding-agent`,
+ args: ["--prefix", prefix, "install", "-g", "@earendil-works/pi-coding-agent"],
+ display: `npm --prefix ${prefix} install -g @earendil-works/pi-coding-agent`,
+ });
+ });
+
+ test("self-updates renamed packages from the current install prefix", () => {
+ const { prefix } = createNpmPrefixInstall();
+
+ const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent", undefined, "@new-scope/pi");
+
+ expect(command).toEqual({
+ command: "npm",
+ args: ["--prefix", prefix, "install", "-g", "@new-scope/pi"],
+ display: `npm --prefix ${prefix} uninstall -g @mariozechner/pi-coding-agent && npm --prefix ${prefix} install -g @new-scope/pi`,
+ steps: [
+ {
+ command: "npm",
+ args: ["--prefix", prefix, "uninstall", "-g", "@mariozechner/pi-coding-agent"],
+ display: `npm --prefix ${prefix} uninstall -g @mariozechner/pi-coding-agent`,
+ },
+ {
+ command: "npm",
+ args: ["--prefix", prefix, "install", "-g", "@new-scope/pi"],
+ display: `npm --prefix ${prefix} install -g @new-scope/pi`,
+ },
+ ],
});
});
test("self-update respects configured npmCommand", () => {
const { prefix } = createNpmPrefixInstall();
- const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent", ["npm", "--prefix", prefix]);
+ const command = getSelfUpdateCommand("@earendil-works/pi-coding-agent", ["npm", "--prefix", prefix]);
expect(command).toEqual({
command: "npm",
- args: ["--prefix", prefix, "install", "-g", "@mariozechner/pi-coding-agent"],
- display: `npm --prefix ${prefix} install -g @mariozechner/pi-coding-agent`,
+ args: ["--prefix", prefix, "install", "-g", "@earendil-works/pi-coding-agent"],
+ display: `npm --prefix ${prefix} install -g @earendil-works/pi-coding-agent`,
});
});
test("self-update treats empty npmCommand as unset", () => {
const { prefix } = createNpmPrefixInstall();
- const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent", []);
+ const command = getSelfUpdateCommand("@earendil-works/pi-coding-agent", []);
- expect(command?.args).toEqual(["--prefix", prefix, "install", "-g", "@mariozechner/pi-coding-agent"]);
+ expect(command?.args).toEqual(["--prefix", prefix, "install", "-g", "@earendil-works/pi-coding-agent"]);
});
test("quotes npm self-update display paths", () => {
const { prefix } = createNpmPrefixInstall("pi prefix ");
- const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent");
+ const command = getSelfUpdateCommand("@earendil-works/pi-coding-agent");
- expect(command?.display).toBe(`npm --prefix "${prefix}" install -g @mariozechner/pi-coding-agent`);
+ expect(command?.display).toBe(`npm --prefix "${prefix}" install -g @earendil-works/pi-coding-agent`);
});
test("does not infer Windows npm custom prefixes from package paths", () => {
- const packageDir = "C:\\Users\\Admin\\npm prefix\\node_modules\\@mariozechner\\pi-coding-agent";
+ const packageDir = "C:\\Users\\Admin\\npm prefix\\node_modules\\@earendil-works\\pi-coding-agent";
process.env.PI_PACKAGE_DIR = packageDir;
setExecPath(`${packageDir}\\dist\\cli.js`);
expect(detectInstallMethod()).toBe("npm");
- expect(getUpdateInstruction("@mariozechner/pi-coding-agent")).toBe(
- "Run: npm install -g @mariozechner/pi-coding-agent",
+ expect(getUpdateInstruction("@earendil-works/pi-coding-agent")).toBe(
+ "Run: npm install -g @earendil-works/pi-coding-agent",
);
});
test("self-updates bun global installs from bun pm bin", () => {
createBunGlobalInstall();
- const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent");
+ const command = getSelfUpdateCommand("@earendil-works/pi-coding-agent");
expect(detectInstallMethod()).toBe("bun");
expect(command).toEqual({
command: "bun",
- args: ["install", "-g", "@mariozechner/pi-coding-agent"],
- display: "bun install -g @mariozechner/pi-coding-agent",
+ args: ["install", "-g", "@earendil-works/pi-coding-agent"],
+ display: "bun install -g @earendil-works/pi-coding-agent",
+ });
+ });
+
+ test("self-updates renamed pnpm global installs by removing the old package first", () => {
+ createPnpmGlobalInstall();
+
+ const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent", undefined, "@new-scope/pi");
+
+ expect(detectInstallMethod()).toBe("pnpm");
+ expect(command).toEqual({
+ command: "pnpm",
+ args: ["install", "-g", "@new-scope/pi"],
+ display: "pnpm remove -g @mariozechner/pi-coding-agent && pnpm install -g @new-scope/pi",
+ steps: [
+ {
+ command: "pnpm",
+ args: ["remove", "-g", "@mariozechner/pi-coding-agent"],
+ display: "pnpm remove -g @mariozechner/pi-coding-agent",
+ },
+ {
+ command: "pnpm",
+ args: ["install", "-g", "@new-scope/pi"],
+ display: "pnpm install -g @new-scope/pi",
+ },
+ ],
+ });
+ });
+
+ test("self-updates renamed yarn global installs by removing the old package first", () => {
+ createYarnGlobalInstall();
+
+ const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent", undefined, "@new-scope/pi");
+
+ expect(detectInstallMethod()).toBe("yarn");
+ expect(command).toEqual({
+ command: "yarn",
+ args: ["global", "add", "@new-scope/pi"],
+ display: "yarn global remove @mariozechner/pi-coding-agent && yarn global add @new-scope/pi",
+ steps: [
+ {
+ command: "yarn",
+ args: ["global", "remove", "@mariozechner/pi-coding-agent"],
+ display: "yarn global remove @mariozechner/pi-coding-agent",
+ },
+ {
+ command: "yarn",
+ args: ["global", "add", "@new-scope/pi"],
+ display: "yarn global add @new-scope/pi",
+ },
+ ],
+ });
+ });
+
+ test("self-updates renamed bun global installs by removing the old package first", () => {
+ createBunGlobalInstall();
+
+ const command = getSelfUpdateCommand("@mariozechner/pi-coding-agent", undefined, "@new-scope/pi");
+
+ expect(detectInstallMethod()).toBe("bun");
+ expect(command).toEqual({
+ command: "bun",
+ args: ["install", "-g", "@new-scope/pi"],
+ display: "bun uninstall -g @mariozechner/pi-coding-agent && bun install -g @new-scope/pi",
+ steps: [
+ {
+ command: "bun",
+ args: ["uninstall", "-g", "@mariozechner/pi-coding-agent"],
+ display: "bun uninstall -g @mariozechner/pi-coding-agent",
+ },
+ {
+ command: "bun",
+ args: ["install", "-g", "@new-scope/pi"],
+ display: "bun install -g @new-scope/pi",
+ },
+ ],
});
});
@@ -171,8 +329,8 @@ describe("detectInstallMethod", () => {
const { packageDir } = createNpmPrefixInstall();
chmodSync(packageDir, 0o500);
- expect(getSelfUpdateCommand("@mariozechner/pi-coding-agent")).toBeUndefined();
- expect(getSelfUpdateUnavailableInstruction("@mariozechner/pi-coding-agent")).toContain(
+ expect(getSelfUpdateCommand("@earendil-works/pi-coding-agent")).toBeUndefined();
+ expect(getSelfUpdateUnavailableInstruction("@earendil-works/pi-coding-agent")).toContain(
"the install path is not writable",
);
});
diff --git a/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts b/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts
index 47ead7a8a..21d4e7d58 100644
--- a/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts
+++ b/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts
@@ -1,7 +1,7 @@
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { Container, type Terminal, Text, TUI } from "@mariozechner/pi-tui";
+import { Container, type Terminal, Text, TUI } from "@earendil-works/pi-tui";
import { afterEach, beforeAll, describe, expect, it } from "vitest";
import { createEditToolDefinition } from "../src/core/tools/edit.js";
import { computeEditsDiff, type Edit } from "../src/core/tools/edit-diff.js";
diff --git a/packages/coding-agent/test/export-html-whitespace.test.ts b/packages/coding-agent/test/export-html-whitespace.test.ts
index 0f8720229..4336c63cb 100644
--- a/packages/coding-agent/test/export-html-whitespace.test.ts
+++ b/packages/coding-agent/test/export-html-whitespace.test.ts
@@ -1,4 +1,4 @@
-import type { Component } from "@mariozechner/pi-tui";
+import type { Component } from "@earendil-works/pi-tui";
import { readFileSync } from "fs";
import { describe, expect, it } from "vitest";
import { ansiLinesToHtml } from "../src/core/export-html/ansi-to-html.js";
diff --git a/packages/coding-agent/test/footer-width.test.ts b/packages/coding-agent/test/footer-width.test.ts
index 15962d221..dd158f365 100644
--- a/packages/coding-agent/test/footer-width.test.ts
+++ b/packages/coding-agent/test/footer-width.test.ts
@@ -1,4 +1,4 @@
-import { visibleWidth } from "@mariozechner/pi-tui";
+import { visibleWidth } from "@earendil-works/pi-tui";
import { beforeAll, describe, expect, it } from "vitest";
import type { AgentSession } from "../src/core/agent-session.js";
import type { ReadonlyFooterDataProvider } from "../src/core/footer-data-provider.js";
diff --git a/packages/coding-agent/test/interactive-mode-status.test.ts b/packages/coding-agent/test/interactive-mode-status.test.ts
index 6ac50c08f..ba2b46c5f 100644
--- a/packages/coding-agent/test/interactive-mode-status.test.ts
+++ b/packages/coding-agent/test/interactive-mode-status.test.ts
@@ -1,6 +1,6 @@
import { homedir } from "node:os";
import * as path from "node:path";
-import { type AutocompleteProvider, CombinedAutocompleteProvider, Container } from "@mariozechner/pi-tui";
+import { type AutocompleteProvider, CombinedAutocompleteProvider, Container } from "@earendil-works/pi-tui";
import { beforeAll, describe, expect, test, vi } from "vitest";
import type { AutocompleteProviderFactory } from "../src/core/extensions/types.js";
import type { SourceInfo } from "../src/core/source-info.js";
diff --git a/packages/coding-agent/test/model-registry.test.ts b/packages/coding-agent/test/model-registry.test.ts
index cd15b4dfb..03434ea81 100644
--- a/packages/coding-agent/test/model-registry.test.ts
+++ b/packages/coding-agent/test/model-registry.test.ts
@@ -1,9 +1,9 @@
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import type { AnthropicMessagesCompat, Api, Context, Model, OpenAICompletionsCompat } from "@mariozechner/pi-ai";
-import { getApiProvider } from "@mariozechner/pi-ai";
-import { getOAuthProvider } from "@mariozechner/pi-ai/oauth";
+import type { AnthropicMessagesCompat, Api, Context, Model, OpenAICompletionsCompat } from "@earendil-works/pi-ai";
+import { getApiProvider } from "@earendil-works/pi-ai";
+import { getOAuthProvider } from "@earendil-works/pi-ai/oauth";
import { afterEach, beforeEach, describe, expect, test } from "vitest";
import { AuthStorage } from "../src/core/auth-storage.js";
import { clearApiKeyCache, ModelRegistry, type ProviderConfigInput } from "../src/core/model-registry.js";
diff --git a/packages/coding-agent/test/model-resolver.test.ts b/packages/coding-agent/test/model-resolver.test.ts
index 946d78cb0..69afd7565 100644
--- a/packages/coding-agent/test/model-resolver.test.ts
+++ b/packages/coding-agent/test/model-resolver.test.ts
@@ -1,4 +1,4 @@
-import type { Model } from "@mariozechner/pi-ai";
+import type { Model } from "@earendil-works/pi-ai";
import { describe, expect, test } from "vitest";
import {
defaultModelPerProvider,
diff --git a/packages/coding-agent/test/oauth-selector.test.ts b/packages/coding-agent/test/oauth-selector.test.ts
index 4867f5b1f..9cd02eeb9 100644
--- a/packages/coding-agent/test/oauth-selector.test.ts
+++ b/packages/coding-agent/test/oauth-selector.test.ts
@@ -1,4 +1,4 @@
-import { setKeybindings } from "@mariozechner/pi-tui";
+import { setKeybindings } from "@earendil-works/pi-tui";
import stripAnsi from "strip-ansi";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { AuthStorage } from "../src/core/auth-storage.js";
diff --git a/packages/coding-agent/test/package-command-paths.test.ts b/packages/coding-agent/test/package-command-paths.test.ts
index 1c1ceab44..03c8f4ca4 100644
--- a/packages/coding-agent/test/package-command-paths.test.ts
+++ b/packages/coding-agent/test/package-command-paths.test.ts
@@ -2,7 +2,7 @@ import { mkdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from "no
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
-import { ENV_AGENT_DIR } from "../src/config.js";
+import { ENV_AGENT_DIR, PACKAGE_NAME, VERSION } from "../src/config.js";
import { main } from "../src/main.js";
describe("package commands", () => {
@@ -16,6 +16,11 @@ describe("package commands", () => {
let originalExitCode: typeof process.exitCode;
let originalExecPath: string;
+ function getNewerPatchVersion(): string {
+ const [major = "0", minor = "0", patch = "0"] = VERSION.split(".");
+ return `${major}.${minor}.${Number.parseInt(patch, 10) + 1}`;
+ }
+
beforeEach(() => {
tempDir = join(tmpdir(), `pi-package-commands-${Date.now()}-${Math.random().toString(36).slice(2)}`);
agentDir = join(tempDir, "agent");
@@ -36,6 +41,7 @@ describe("package commands", () => {
});
afterEach(() => {
+ vi.unstubAllGlobals();
process.chdir(originalCwd);
process.exitCode = originalExitCode;
if (originalAgentDir === undefined) {
@@ -128,10 +134,10 @@ describe("package commands", () => {
}
});
- it("uses global npmCommand for self updates", async () => {
+ it("uses global npmCommand and current package name for forced self updates without checking the api", async () => {
const globalPrefix = join(tempDir, "global-prefix");
const projectPrefix = join(tempDir, "project-prefix");
- const selfPackageDir = join(globalPrefix, "lib", "node_modules", "@mariozechner", "pi-coding-agent");
+ const selfPackageDir = join(globalPrefix, "lib", "node_modules", "@earendil-works", "pi-coding-agent");
const fakeNpmPath = join(tempDir, "fake-npm.cjs");
const recordPath = join(tempDir, "self-update.json");
mkdirSync(selfPackageDir, { recursive: true });
@@ -156,6 +162,8 @@ else fs.writeFileSync(${JSON.stringify(recordPath)},JSON.stringify(args));
value: join(selfPackageDir, "dist", "cli.js"),
configurable: true,
});
+ const fetchMock = vi.fn();
+ vi.stubGlobal("fetch", fetchMock);
const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
@@ -165,8 +173,10 @@ else fs.writeFileSync(${JSON.stringify(recordPath)},JSON.stringify(args));
expect(process.exitCode).toBeUndefined();
expect(errorSpy).not.toHaveBeenCalled();
+ expect(fetchMock).not.toHaveBeenCalled();
const recordedArgs = JSON.parse(readFileSync(recordPath, "utf-8")) as string[];
expect(recordedArgs).toContain(globalPrefix);
+ expect(recordedArgs).toContain(PACKAGE_NAME);
expect(recordedArgs).not.toContain(projectPrefix);
} finally {
logSpy.mockRestore();
@@ -174,6 +184,155 @@ else fs.writeFileSync(${JSON.stringify(recordPath)},JSON.stringify(args));
}
});
+ it("uses the current package name when the update check omits packageName", async () => {
+ const globalPrefix = join(tempDir, "global-prefix");
+ const selfPackageDir = join(globalPrefix, "lib", "node_modules", "@mariozechner", "pi-coding-agent");
+ const fakeNpmPath = join(tempDir, "fake-npm.cjs");
+ const recordPath = join(tempDir, "self-update.json");
+ mkdirSync(selfPackageDir, { recursive: true });
+ writeFileSync(
+ fakeNpmPath,
+ `const fs=require("node:fs"),path=require("node:path"),args=process.argv.slice(2),prefix=args[args.indexOf("--prefix")+1];
+if(args.includes("root")) console.log(path.join(prefix,"lib","node_modules"));
+else fs.writeFileSync(${JSON.stringify(recordPath)},JSON.stringify(args));
+`,
+ );
+ writeFileSync(
+ join(agentDir, "settings.json"),
+ JSON.stringify({ npmCommand: [originalExecPath, fakeNpmPath, "--prefix", globalPrefix] }, null, 2),
+ );
+ process.env.PI_PACKAGE_DIR = selfPackageDir;
+ Object.defineProperty(process, "execPath", {
+ value: join(selfPackageDir, "dist", "cli.js"),
+ configurable: true,
+ });
+ const fetchMock = vi.fn(async () => Response.json({ version: getNewerPatchVersion() }));
+ vi.stubGlobal("fetch", fetchMock);
+
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
+ const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
+
+ try {
+ await expect(main(["update", "--self"])).resolves.toBeUndefined();
+
+ expect(process.exitCode).toBeUndefined();
+ expect(errorSpy).not.toHaveBeenCalled();
+ expect(fetchMock).toHaveBeenCalledOnce();
+ const recordedArgs = JSON.parse(readFileSync(recordPath, "utf-8")) as string[];
+ expect(recordedArgs).toContain(PACKAGE_NAME);
+ } finally {
+ logSpy.mockRestore();
+ errorSpy.mockRestore();
+ }
+ });
+
+ it("installs the active package name from the update check during self-update", async () => {
+ const globalPrefix = join(tempDir, "global-prefix");
+ const selfPackageDir = join(globalPrefix, "lib", "node_modules", "@mariozechner", "pi-coding-agent");
+ const fakeNpmPath = join(tempDir, "fake-npm.cjs");
+ const recordPath = join(tempDir, "self-update.json");
+ mkdirSync(selfPackageDir, { recursive: true });
+ writeFileSync(
+ fakeNpmPath,
+ `const fs=require("node:fs"),path=require("node:path"),args=process.argv.slice(2),prefix=args[args.indexOf("--prefix")+1];
+if(args.includes("root")) console.log(path.join(prefix,"lib","node_modules"));
+else {
+ const records=fs.existsSync(${JSON.stringify(recordPath)})?JSON.parse(fs.readFileSync(${JSON.stringify(recordPath)},"utf-8")):[];
+ records.push(args);
+ fs.writeFileSync(${JSON.stringify(recordPath)},JSON.stringify(records));
+}
+`,
+ );
+ writeFileSync(
+ join(agentDir, "settings.json"),
+ JSON.stringify({ npmCommand: [originalExecPath, fakeNpmPath, "--prefix", globalPrefix] }, null, 2),
+ );
+ process.env.PI_PACKAGE_DIR = selfPackageDir;
+ Object.defineProperty(process, "execPath", {
+ value: join(selfPackageDir, "dist", "cli.js"),
+ configurable: true,
+ });
+ const activePackageName = PACKAGE_NAME === "@new-scope/pi" ? "@newer-scope/pi" : "@new-scope/pi";
+ vi.stubGlobal(
+ "fetch",
+ vi.fn(async () => Response.json({ packageName: activePackageName, version: "0.73.0" })),
+ );
+
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
+ const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
+
+ try {
+ await expect(main(["update", "--self"])).resolves.toBeUndefined();
+
+ expect(process.exitCode).toBeUndefined();
+ expect(errorSpy).not.toHaveBeenCalled();
+ const recordedCalls = JSON.parse(readFileSync(recordPath, "utf-8")) as string[][];
+ expect(recordedCalls).toEqual([
+ expect.arrayContaining(["uninstall", "-g", PACKAGE_NAME]),
+ expect.arrayContaining(["install", "-g", activePackageName]),
+ ]);
+ } finally {
+ logSpy.mockRestore();
+ errorSpy.mockRestore();
+ }
+ });
+
+ it("fails self-update when renamed npm package installation fails", async () => {
+ const globalPrefix = join(tempDir, "global-prefix");
+ const selfPackageDir = join(globalPrefix, "lib", "node_modules", "@mariozechner", "pi-coding-agent");
+ const fakeNpmPath = join(tempDir, "fake-npm-fail.cjs");
+ const recordPath = join(tempDir, "self-update-fail.json");
+ mkdirSync(selfPackageDir, { recursive: true });
+ writeFileSync(
+ fakeNpmPath,
+ `const fs=require("node:fs"),path=require("node:path"),args=process.argv.slice(2),prefix=args[args.indexOf("--prefix")+1];
+if(args.includes("root")) {
+ console.log(path.join(prefix,"lib","node_modules"));
+ process.exit(0);
+}
+const records=fs.existsSync(${JSON.stringify(recordPath)})?JSON.parse(fs.readFileSync(${JSON.stringify(recordPath)},"utf-8")):[];
+records.push(args);
+fs.writeFileSync(${JSON.stringify(recordPath)},JSON.stringify(records));
+if(args.includes("install")) process.exit(23);
+`,
+ );
+ writeFileSync(
+ join(agentDir, "settings.json"),
+ JSON.stringify({ npmCommand: [originalExecPath, fakeNpmPath, "--prefix", globalPrefix] }, null, 2),
+ );
+ process.env.PI_PACKAGE_DIR = selfPackageDir;
+ Object.defineProperty(process, "execPath", {
+ value: join(selfPackageDir, "dist", "cli.js"),
+ configurable: true,
+ });
+ const activePackageName = PACKAGE_NAME === "@new-scope/pi" ? "@newer-scope/pi" : "@new-scope/pi";
+ vi.stubGlobal(
+ "fetch",
+ vi.fn(async () => Response.json({ packageName: activePackageName, version: "0.73.0" })),
+ );
+
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
+ const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
+
+ try {
+ await expect(main(["update", "--self"])).resolves.toBeUndefined();
+
+ expect(process.exitCode).toBe(1);
+ const stdout = logSpy.mock.calls.map(([message]) => String(message)).join("\n");
+ const stderr = errorSpy.mock.calls.map(([message]) => String(message)).join("\n");
+ expect(stdout).not.toContain(`Updated pi`);
+ expect(stderr).toContain("exited with code 23");
+ const recordedCalls = JSON.parse(readFileSync(recordPath, "utf-8")) as string[][];
+ expect(recordedCalls).toEqual([
+ expect.arrayContaining(["uninstall", "-g", PACKAGE_NAME]),
+ expect.arrayContaining(["install", "-g", activePackageName]),
+ ]);
+ } finally {
+ logSpy.mockRestore();
+ errorSpy.mockRestore();
+ }
+ });
+
it("suggests the configured source when update input omits the npm prefix", async () => {
const settingsPath = join(agentDir, "settings.json");
writeFileSync(settingsPath, JSON.stringify({ packages: ["npm:pi-formatter"] }, null, 2));
diff --git a/packages/coding-agent/test/paths.test.ts b/packages/coding-agent/test/paths.test.ts
index 5f7c115da..208da3f91 100644
--- a/packages/coding-agent/test/paths.test.ts
+++ b/packages/coding-agent/test/paths.test.ts
@@ -2,7 +2,7 @@ import { mkdirSync, mkdtempSync, realpathSync, rmSync, symlinkSync, writeFileSyn
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, describe, expect, it } from "vitest";
-import { canonicalizePath, isLocalPath } from "../src/utils/paths.js";
+import { canonicalizePath, getCwdRelativePath, isLocalPath } from "../src/utils/paths.js";
let tempDir: string;
@@ -61,6 +61,18 @@ describe("canonicalizePath", () => {
});
});
+describe("getCwdRelativePath", () => {
+ it("keeps cwd-relative names that start with dots", () => {
+ const cwd = join(tmpdir(), "pi-paths-cwd");
+ expect(getCwdRelativePath(join(cwd, "..config", "AGENTS.md"), cwd)).toBe(join("..config", "AGENTS.md"));
+ });
+
+ it("rejects parent-directory traversals", () => {
+ const cwd = join(tmpdir(), "pi-paths-cwd");
+ expect(getCwdRelativePath(join(cwd, "..", "AGENTS.md"), cwd)).toBeUndefined();
+ });
+});
+
describe("isLocalPath", () => {
it("returns true for bare names", () => {
expect(isLocalPath("my-package")).toBe(true);
diff --git a/packages/coding-agent/test/print-mode.test.ts b/packages/coding-agent/test/print-mode.test.ts
index 1a4907d2c..bbf6756e0 100644
--- a/packages/coding-agent/test/print-mode.test.ts
+++ b/packages/coding-agent/test/print-mode.test.ts
@@ -1,4 +1,4 @@
-import type { AssistantMessage, ImageContent } from "@mariozechner/pi-ai";
+import type { AssistantMessage, ImageContent } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it, vi } from "vitest";
import type { SessionShutdownEvent } from "../src/index.js";
import { runPrintMode } from "../src/modes/print-mode.js";
diff --git a/packages/coding-agent/test/resource-loader.test.ts b/packages/coding-agent/test/resource-loader.test.ts
index 0794af3ad..01adc9b36 100644
--- a/packages/coding-agent/test/resource-loader.test.ts
+++ b/packages/coding-agent/test/resource-loader.test.ts
@@ -500,7 +500,7 @@ Content`,
writeFileSync(
join(ext1Dir, "index.ts"),
`
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function(pi: ExtensionAPI) {
pi.registerTool({
@@ -515,7 +515,7 @@ export default function(pi: ExtensionAPI) {
writeFileSync(
join(ext2Dir, "index.ts"),
`
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function(pi: ExtensionAPI) {
pi.registerTool({
@@ -542,7 +542,7 @@ export default function(pi: ExtensionAPI) {
writeFileSync(
join(globalExtDir, "global.ts"),
`
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function(pi: ExtensionAPI) {
pi.registerTool({
@@ -561,7 +561,7 @@ export default function(pi: ExtensionAPI) {
writeFileSync(
explicitExtPath,
`
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
export default function(pi: ExtensionAPI) {
pi.registerTool({
diff --git a/packages/coding-agent/test/rpc-prompt-response-semantics.test.ts b/packages/coding-agent/test/rpc-prompt-response-semantics.test.ts
index ec244bf07..07fac54d5 100644
--- a/packages/coding-agent/test/rpc-prompt-response-semantics.test.ts
+++ b/packages/coding-agent/test/rpc-prompt-response-semantics.test.ts
@@ -1,14 +1,14 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { Agent } from "@mariozechner/pi-agent-core";
+import { Agent } from "@earendil-works/pi-agent-core";
import {
type AssistantMessage,
type AssistantMessageEvent,
EventStream,
getModel,
type Model,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it, vi } from "vitest";
import { AgentSession } from "../src/core/agent-session.js";
import type { AgentSessionRuntime } from "../src/core/agent-session-runtime.js";
diff --git a/packages/coding-agent/test/rpc.test.ts b/packages/coding-agent/test/rpc.test.ts
index c98909d0c..9d4a97d49 100644
--- a/packages/coding-agent/test/rpc.test.ts
+++ b/packages/coding-agent/test/rpc.test.ts
@@ -2,7 +2,7 @@ import { existsSync, readdirSync, readFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
-import type { AgentEvent } from "@mariozechner/pi-agent-core";
+import type { AgentEvent } from "@earendil-works/pi-agent-core";
import { afterEach, beforeEach, describe, expect, test } from "vitest";
import { RpcClient } from "../src/modes/rpc/rpc-client.js";
diff --git a/packages/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts b/packages/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts
index 19aa1bacd..fe349646d 100644
--- a/packages/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts
+++ b/packages/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts
@@ -20,7 +20,7 @@ import {
type Model,
type SimpleStreamOptions,
Type,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import {
getOpenAICodexWebSocketDebugStats,
streamSimpleOpenAICodexResponses,
diff --git a/packages/coding-agent/test/sdk-openrouter-attribution.test.ts b/packages/coding-agent/test/sdk-openrouter-attribution.test.ts
index 7daa510d9..e667accf8 100644
--- a/packages/coding-agent/test/sdk-openrouter-attribution.test.ts
+++ b/packages/coding-agent/test/sdk-openrouter-attribution.test.ts
@@ -7,7 +7,7 @@ import {
createAssistantMessageEventStream,
type Model,
type SimpleStreamOptions,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { AuthStorage } from "../src/core/auth-storage.js";
import { ModelRegistry } from "../src/core/model-registry.js";
diff --git a/packages/coding-agent/test/sdk-session-manager.test.ts b/packages/coding-agent/test/sdk-session-manager.test.ts
index e0557ea70..51498f507 100644
--- a/packages/coding-agent/test/sdk-session-manager.test.ts
+++ b/packages/coding-agent/test/sdk-session-manager.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, realpathSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { createAgentSession } from "../src/core/sdk.js";
import { SessionManager } from "../src/core/session-manager.js";
diff --git a/packages/coding-agent/test/session-selector-path-delete.test.ts b/packages/coding-agent/test/session-selector-path-delete.test.ts
index ce287f513..618ceef75 100644
--- a/packages/coding-agent/test/session-selector-path-delete.test.ts
+++ b/packages/coding-agent/test/session-selector-path-delete.test.ts
@@ -1,7 +1,7 @@
import { mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { setKeybindings } from "@mariozechner/pi-tui";
+import { setKeybindings } from "@earendil-works/pi-tui";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { KeybindingsManager } from "../src/core/keybindings.js";
import type { SessionInfo } from "../src/core/session-manager.js";
diff --git a/packages/coding-agent/test/session-selector-rename.test.ts b/packages/coding-agent/test/session-selector-rename.test.ts
index b005fd6cd..f91d6ebf6 100644
--- a/packages/coding-agent/test/session-selector-rename.test.ts
+++ b/packages/coding-agent/test/session-selector-rename.test.ts
@@ -1,4 +1,4 @@
-import { setKeybindings } from "@mariozechner/pi-tui";
+import { setKeybindings } from "@earendil-works/pi-tui";
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { KeybindingsManager } from "../src/core/keybindings.js";
import type { SessionInfo } from "../src/core/session-manager.js";
diff --git a/packages/coding-agent/test/streaming-render-debug.ts b/packages/coding-agent/test/streaming-render-debug.ts
index 05f72e5c1..ffd4cc89b 100644
--- a/packages/coding-agent/test/streaming-render-debug.ts
+++ b/packages/coding-agent/test/streaming-render-debug.ts
@@ -4,8 +4,8 @@
* Run with: npx tsx test/streaming-render-debug.ts
*/
-import type { AssistantMessage } from "@mariozechner/pi-ai";
-import { ProcessTerminal, TUI } from "@mariozechner/pi-tui";
+import type { AssistantMessage } from "@earendil-works/pi-ai";
+import { ProcessTerminal, TUI } from "@earendil-works/pi-tui";
import { readFileSync } from "fs";
import { dirname, join } from "path";
import { fileURLToPath } from "url";
diff --git a/packages/coding-agent/test/suite/agent-session-bash-persistence.test.ts b/packages/coding-agent/test/suite/agent-session-bash-persistence.test.ts
index 389989b47..a597903c5 100644
--- a/packages/coding-agent/test/suite/agent-session-bash-persistence.test.ts
+++ b/packages/coding-agent/test/suite/agent-session-bash-persistence.test.ts
@@ -1,6 +1,6 @@
import { Buffer } from "node:buffer";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { fauxAssistantMessage, fauxToolCall } from "@mariozechner/pi-ai";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { fauxAssistantMessage, fauxToolCall } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, describe, expect, it } from "vitest";
import type { BashOperations } from "../../src/core/tools/bash.js";
diff --git a/packages/coding-agent/test/suite/agent-session-compaction.test.ts b/packages/coding-agent/test/suite/agent-session-compaction.test.ts
index 256fb380d..cb9f18080 100644
--- a/packages/coding-agent/test/suite/agent-session-compaction.test.ts
+++ b/packages/coding-agent/test/suite/agent-session-compaction.test.ts
@@ -1,4 +1,4 @@
-import { type AssistantMessage, fauxAssistantMessage, type Model } from "@mariozechner/pi-ai";
+import { type AssistantMessage, fauxAssistantMessage, type Model } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it, vi } from "vitest";
import { createHarness, type Harness } from "./harness.js";
diff --git a/packages/coding-agent/test/suite/agent-session-model-extension.test.ts b/packages/coding-agent/test/suite/agent-session-model-extension.test.ts
index a30783529..552711477 100644
--- a/packages/coding-agent/test/suite/agent-session-model-extension.test.ts
+++ b/packages/coding-agent/test/suite/agent-session-model-extension.test.ts
@@ -1,5 +1,5 @@
-import type { AgentTool, ThinkingLevel } from "@mariozechner/pi-agent-core";
-import { fauxAssistantMessage, fauxToolCall, type Model } from "@mariozechner/pi-ai";
+import type { AgentTool, ThinkingLevel } from "@earendil-works/pi-agent-core";
+import { fauxAssistantMessage, fauxToolCall, type Model } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, describe, expect, it } from "vitest";
import type { ExtensionAPI } from "../../src/index.js";
diff --git a/packages/coding-agent/test/suite/agent-session-prompt.test.ts b/packages/coding-agent/test/suite/agent-session-prompt.test.ts
index 059739c97..e40a4fe37 100644
--- a/packages/coding-agent/test/suite/agent-session-prompt.test.ts
+++ b/packages/coding-agent/test/suite/agent-session-prompt.test.ts
@@ -1,8 +1,8 @@
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { fauxAssistantMessage, fauxToolCall, type Model } from "@mariozechner/pi-ai";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { fauxAssistantMessage, fauxToolCall, type Model } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, describe, expect, it } from "vitest";
import type { PromptTemplate } from "../../src/core/prompt-templates.js";
diff --git a/packages/coding-agent/test/suite/agent-session-queue.test.ts b/packages/coding-agent/test/suite/agent-session-queue.test.ts
index f62169381..06aebcf87 100644
--- a/packages/coding-agent/test/suite/agent-session-queue.test.ts
+++ b/packages/coding-agent/test/suite/agent-session-queue.test.ts
@@ -1,6 +1,6 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { fauxAssistantMessage, fauxToolCall } from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { fauxAssistantMessage, fauxToolCall } from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
import { afterEach, describe, expect, it } from "vitest";
import { createHarness, getAssistantTexts, getMessageText, getUserTexts, type Harness } from "./harness.js";
diff --git a/packages/coding-agent/test/suite/agent-session-retry-events.test.ts b/packages/coding-agent/test/suite/agent-session-retry-events.test.ts
index 806d9c766..d10fe90c5 100644
--- a/packages/coding-agent/test/suite/agent-session-retry-events.test.ts
+++ b/packages/coding-agent/test/suite/agent-session-retry-events.test.ts
@@ -1,5 +1,5 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { fauxAssistantMessage, fauxThinking, fauxToolCall } from "@mariozechner/pi-ai";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { fauxAssistantMessage, fauxThinking, fauxToolCall } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, describe, expect, it } from "vitest";
import { createHarness, type Harness } from "./harness.js";
diff --git a/packages/coding-agent/test/suite/agent-session-runtime.test.ts b/packages/coding-agent/test/suite/agent-session-runtime.test.ts
index 2b99d3ad7..fb8b21679 100644
--- a/packages/coding-agent/test/suite/agent-session-runtime.test.ts
+++ b/packages/coding-agent/test/suite/agent-session-runtime.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, realpathSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { fauxAssistantMessage, registerFauxProvider } from "@mariozechner/pi-ai";
+import { fauxAssistantMessage, registerFauxProvider } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it } from "vitest";
import {
type CreateAgentSessionRuntimeFactory,
diff --git a/packages/coding-agent/test/suite/harness.ts b/packages/coding-agent/test/suite/harness.ts
index 865b8780e..16a8182ec 100644
--- a/packages/coding-agent/test/suite/harness.ts
+++ b/packages/coding-agent/test/suite/harness.ts
@@ -5,10 +5,10 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import type { AgentMessage, AgentTool } from "@mariozechner/pi-agent-core";
-import { Agent } from "@mariozechner/pi-agent-core";
-import type { FauxModelDefinition, FauxProviderRegistration, FauxResponseStep, Model } from "@mariozechner/pi-ai";
-import { registerFauxProvider } from "@mariozechner/pi-ai";
+import type { AgentMessage, AgentTool } from "@earendil-works/pi-agent-core";
+import { Agent } from "@earendil-works/pi-agent-core";
+import type { FauxModelDefinition, FauxProviderRegistration, FauxResponseStep, Model } from "@earendil-works/pi-ai";
+import { registerFauxProvider } from "@earendil-works/pi-ai";
import { AgentSession, type AgentSessionEvent } from "../../src/core/agent-session.js";
import { AuthStorage } from "../../src/core/auth-storage.js";
import type { ExtensionRunner } from "../../src/core/extensions/index.js";
diff --git a/packages/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts b/packages/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts
index 080e3d4a7..d4adadfaa 100644
--- a/packages/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts
+++ b/packages/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts
@@ -1,6 +1,6 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { fauxAssistantMessage, fauxToolCall } from "@mariozechner/pi-ai";
-import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { fauxAssistantMessage, fauxToolCall } from "@earendil-works/pi-ai";
+import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
import { afterEach, describe, expect, it } from "vitest";
import { createHarness, getAssistantTexts, getUserTexts, type Harness } from "../harness.js";
diff --git a/packages/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts b/packages/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts
index 387482158..a95dc7d07 100644
--- a/packages/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts
+++ b/packages/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { registerFauxProvider } from "@mariozechner/pi-ai";
+import { registerFauxProvider } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it } from "vitest";
import {
type CreateAgentSessionRuntimeFactory,
diff --git a/packages/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts b/packages/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts
index 3dfcb70af..007ba580f 100644
--- a/packages/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts
+++ b/packages/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts
@@ -5,7 +5,7 @@ import { join } from "node:path";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
/**
- * Regression test for https://github.com/badlogic/pi-mono/issues/2791
+ * Regression test for https://github.com/earendil-works/pi-mono/issues/2791
*
* fs.watch() returns an FSWatcher (EventEmitter). If the watcher emits an
* 'error' event after creation and no error handler is attached, Node.js
diff --git a/packages/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts b/packages/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts
index 358928362..7d69c2442 100644
--- a/packages/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts
+++ b/packages/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { DefaultResourceLoader } from "../../../src/core/resource-loader.js";
diff --git a/packages/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts b/packages/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts
index 626365c6a..21539919c 100644
--- a/packages/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts
+++ b/packages/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { fauxAssistantMessage, registerFauxProvider } from "@mariozechner/pi-ai";
+import { fauxAssistantMessage, registerFauxProvider } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it } from "vitest";
import type { AgentSession } from "../../../src/core/agent-session.js";
import {
diff --git a/packages/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts b/packages/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts
index da5411c8f..72df1d95d 100644
--- a/packages/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts
+++ b/packages/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts
@@ -1,4 +1,4 @@
-import { setKeybindings, type TUI } from "@mariozechner/pi-tui";
+import { setKeybindings, type TUI } from "@earendil-works/pi-tui";
import stripAnsi from "strip-ansi";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { KeybindingsManager } from "../../../src/core/keybindings.js";
diff --git a/packages/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts b/packages/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts
index 0f19cb14b..05cf80086 100644
--- a/packages/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts
+++ b/packages/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts
@@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { createFindToolDefinition } from "../../../src/core/tools/find.js";
/**
- * Regression test for https://github.com/badlogic/pi-mono/issues/3302
+ * Regression test for https://github.com/earendil-works/pi-mono/issues/3302
*
* The `find` tool advertises glob patterns like `src/**\/*.spec.ts`, but the
* default fd-backed implementation used `fd --glob ` without
diff --git a/packages/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts b/packages/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts
index 15c8658a8..d22b0c18f 100644
--- a/packages/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts
+++ b/packages/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts
@@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { createFindToolDefinition } from "../../../src/core/tools/find.js";
/**
- * Regression test for https://github.com/badlogic/pi-mono/issues/3303
+ * Regression test for https://github.com/earendil-works/pi-mono/issues/3303
*
* The `find` tool previously collected every `.gitignore` under the search
* path and passed them to `fd` via `--ignore-file`. fd treats `--ignore-file`
diff --git a/packages/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts b/packages/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts
index 14bd73018..74276253b 100644
--- a/packages/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts
+++ b/packages/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts
@@ -1,4 +1,4 @@
-import { fauxAssistantMessage } from "@mariozechner/pi-ai";
+import { fauxAssistantMessage } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it } from "vitest";
import { createHarness, getAssistantTexts, type Harness } from "../harness.js";
diff --git a/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts b/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts
index 4ea6af29b..27b186f7b 100644
--- a/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts
+++ b/packages/coding-agent/test/suite/regressions/3592-no-builtin-tools-keeps-extension-tools.test.ts
@@ -1,7 +1,7 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { getModel } from "@mariozechner/pi-ai";
+import { getModel } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import {
diff --git a/packages/coding-agent/test/suite/regressions/3982-message-end-cost-override.test.ts b/packages/coding-agent/test/suite/regressions/3982-message-end-cost-override.test.ts
index e2f4bd4f6..99a47b33c 100644
--- a/packages/coding-agent/test/suite/regressions/3982-message-end-cost-override.test.ts
+++ b/packages/coding-agent/test/suite/regressions/3982-message-end-cost-override.test.ts
@@ -1,4 +1,4 @@
-import { fauxAssistantMessage } from "@mariozechner/pi-ai";
+import { fauxAssistantMessage } from "@earendil-works/pi-ai";
import { afterEach, describe, expect, it } from "vitest";
import { createHarness, type Harness } from "../harness.js";
diff --git a/packages/coding-agent/test/suite/regressions/4167-thinking-toggle-pending-tool-render.test.ts b/packages/coding-agent/test/suite/regressions/4167-thinking-toggle-pending-tool-render.test.ts
index 21a0114ef..14f72f7bf 100644
--- a/packages/coding-agent/test/suite/regressions/4167-thinking-toggle-pending-tool-render.test.ts
+++ b/packages/coding-agent/test/suite/regressions/4167-thinking-toggle-pending-tool-render.test.ts
@@ -1,6 +1,6 @@
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { AssistantMessage, ToolResultMessage, Usage } from "@mariozechner/pi-ai";
-import { Container, Text, type TUI } from "@mariozechner/pi-tui";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { AssistantMessage, ToolResultMessage, Usage } from "@earendil-works/pi-ai";
+import { Container, Text, type TUI } from "@earendil-works/pi-tui";
import stripAnsi from "strip-ansi";
import { beforeAll, describe, expect, test, vi } from "vitest";
import type { AgentSessionEvent } from "../../../src/core/agent-session.js";
diff --git a/packages/coding-agent/test/test-harness.test.ts b/packages/coding-agent/test/test-harness.test.ts
index 7685cc0fd..f9cafa510 100644
--- a/packages/coding-agent/test/test-harness.test.ts
+++ b/packages/coding-agent/test/test-harness.test.ts
@@ -3,8 +3,8 @@
* Validates that the faux provider and session factory work correctly.
*/
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import type { AssistantMessage } from "@mariozechner/pi-ai";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import type { AssistantMessage } from "@earendil-works/pi-ai";
import { Type } from "typebox";
import { afterEach, describe, expect, it } from "vitest";
import { createHarness, createHarnessWithExtensions, type Harness } from "./test-harness.js";
diff --git a/packages/coding-agent/test/test-harness.ts b/packages/coding-agent/test/test-harness.ts
index 9b4672f19..269c51463 100644
--- a/packages/coding-agent/test/test-harness.ts
+++ b/packages/coding-agent/test/test-harness.ts
@@ -10,8 +10,8 @@
import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import { Agent } from "@mariozechner/pi-agent-core";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import { Agent } from "@earendil-works/pi-agent-core";
import type {
AssistantMessage,
AssistantMessageEvent,
@@ -24,8 +24,8 @@ import type {
ThinkingContent,
ToolCall,
Usage,
-} from "@mariozechner/pi-ai";
-import { createAssistantMessageEventStream } from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
+import { createAssistantMessageEventStream } from "@earendil-works/pi-ai";
import { AgentSession, type AgentSessionEvent } from "../src/core/agent-session.js";
import { AuthStorage } from "../src/core/auth-storage.js";
import { ModelRegistry } from "../src/core/model-registry.js";
diff --git a/packages/coding-agent/test/tool-execution-component.test.ts b/packages/coding-agent/test/tool-execution-component.test.ts
index 3c200bb10..1e5d4b00e 100644
--- a/packages/coding-agent/test/tool-execution-component.test.ts
+++ b/packages/coding-agent/test/tool-execution-component.test.ts
@@ -1,5 +1,5 @@
-import { join } from "node:path";
-import { Text, type TUI } from "@mariozechner/pi-tui";
+import { join, resolve } from "node:path";
+import { Text, type TUI } from "@earendil-works/pi-tui";
import stripAnsi from "strip-ansi";
import { Type } from "typebox";
import { beforeAll, describe, expect, test } from "vitest";
@@ -342,12 +342,20 @@ describe("ToolExecutionComponent parity", () => {
},
{
title: "AGENTS.md",
- path: join(process.cwd(), "AGENTS.md"),
+ path: join(process.cwd(), ".pi", "AGENTS.md"),
content: "Hidden resource instructions",
- compact: "read resource AGENTS.md",
+ compact: "read resource .pi/AGENTS.md",
hidden: "Hidden resource instructions",
absent: undefined,
},
+ {
+ title: "outside AGENTS.md",
+ path: resolve(process.cwd(), "..", "AGENTS.md"),
+ content: "Hidden outside resource instructions",
+ compact: `read resource ${resolve(process.cwd(), "..", "AGENTS.md").replace(/\\/g, "/")}`,
+ hidden: "Hidden outside resource instructions",
+ absent: undefined,
+ },
{
title: "Pi documentation",
path: getReadmePath(),
diff --git a/packages/coding-agent/test/tree-selector.test.ts b/packages/coding-agent/test/tree-selector.test.ts
index 0cb2f51b5..3b29d7e0f 100644
--- a/packages/coding-agent/test/tree-selector.test.ts
+++ b/packages/coding-agent/test/tree-selector.test.ts
@@ -1,4 +1,4 @@
-import { setKeybindings } from "@mariozechner/pi-tui";
+import { setKeybindings } from "@earendil-works/pi-tui";
import { beforeAll, beforeEach, describe, expect, test } from "vitest";
import { KeybindingsManager } from "../src/core/keybindings.js";
import type {
diff --git a/packages/coding-agent/test/truncate-to-width.test.ts b/packages/coding-agent/test/truncate-to-width.test.ts
index 4714c1d25..7be05e0b1 100644
--- a/packages/coding-agent/test/truncate-to-width.test.ts
+++ b/packages/coding-agent/test/truncate-to-width.test.ts
@@ -1,4 +1,4 @@
-import { truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
+import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
import { describe, expect, it } from "vitest";
/**
diff --git a/packages/coding-agent/test/utilities.ts b/packages/coding-agent/test/utilities.ts
index ea10fcb2a..058ce8891 100644
--- a/packages/coding-agent/test/utilities.ts
+++ b/packages/coding-agent/test/utilities.ts
@@ -5,9 +5,9 @@
import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { homedir, tmpdir } from "node:os";
import { dirname, join } from "node:path";
-import { Agent } from "@mariozechner/pi-agent-core";
-import { getModel, type OAuthCredentials, type OAuthProvider } from "@mariozechner/pi-ai";
-import { getOAuthApiKey } from "@mariozechner/pi-ai/oauth";
+import { Agent } from "@earendil-works/pi-agent-core";
+import { getModel, type OAuthCredentials, type OAuthProvider } from "@earendil-works/pi-ai";
+import { getOAuthApiKey } from "@earendil-works/pi-ai/oauth";
import { AgentSession } from "../src/core/agent-session.js";
import { AuthStorage } from "../src/core/auth-storage.js";
import { createEventBus } from "../src/core/event-bus.js";
diff --git a/packages/coding-agent/test/version-check.test.ts b/packages/coding-agent/test/version-check.test.ts
index 3e5bc8f28..c871718f5 100644
--- a/packages/coding-agent/test/version-check.test.ts
+++ b/packages/coding-agent/test/version-check.test.ts
@@ -2,6 +2,7 @@ import { afterEach, describe, expect, it, vi } from "vitest";
import {
checkForNewPiVersion,
comparePackageVersions,
+ getLatestPiRelease,
getLatestPiVersion,
isNewerPackageVersion,
} from "../src/utils/version-check.js";
@@ -56,6 +57,13 @@ describe("version checks", () => {
);
});
+ it("returns the active package name from the version check api", async () => {
+ const fetchMock = vi.fn(async () => Response.json({ packageName: "@new-scope/pi", version: "1.2.4" }));
+ vi.stubGlobal("fetch", fetchMock);
+
+ await expect(getLatestPiRelease("1.2.3")).resolves.toEqual({ packageName: "@new-scope/pi", version: "1.2.4" });
+ });
+
it("skips api calls when version checks are disabled", async () => {
process.env.PI_SKIP_VERSION_CHECK = "1";
const fetchMock = vi.fn();
diff --git a/packages/coding-agent/tsconfig.examples.json b/packages/coding-agent/tsconfig.examples.json
index 28fdaa293..a313c7c2e 100644
--- a/packages/coding-agent/tsconfig.examples.json
+++ b/packages/coding-agent/tsconfig.examples.json
@@ -3,10 +3,10 @@
"compilerOptions": {
"noEmit": true,
"paths": {
- "@mariozechner/pi-coding-agent": ["./src/index.ts"],
- "@mariozechner/pi-coding-agent/hooks": ["./src/core/hooks/index.ts"],
- "@mariozechner/pi-tui": ["../tui/src/index.ts"],
- "@mariozechner/pi-ai": ["../ai/src/index.ts"],
+ "@earendil-works/pi-coding-agent": ["./src/index.ts"],
+ "@earendil-works/pi-coding-agent/hooks": ["./src/core/hooks/index.ts"],
+ "@earendil-works/pi-tui": ["../tui/src/index.ts"],
+ "@earendil-works/pi-ai": ["../ai/src/index.ts"],
"typebox": ["../../node_modules/typebox"]
},
"skipLibCheck": true
diff --git a/packages/coding-agent/vitest.config.ts b/packages/coding-agent/vitest.config.ts
index 164b7e7d0..d3857107b 100644
--- a/packages/coding-agent/vitest.config.ts
+++ b/packages/coding-agent/vitest.config.ts
@@ -18,6 +18,9 @@ export default defineConfig({
},
resolve: {
alias: [
+ { find: /^@earendil-works\/pi-ai$/, replacement: aiSrcIndex },
+ { find: /^@earendil-works\/pi-ai\/oauth$/, replacement: aiSrcOAuth },
+ { find: /^@earendil-works\/pi-agent-core$/, replacement: agentSrcIndex },
{ find: /^@mariozechner\/pi-ai$/, replacement: aiSrcIndex },
{ find: /^@mariozechner\/pi-ai\/oauth$/, replacement: aiSrcOAuth },
{ find: /^@mariozechner\/pi-agent-core$/, replacement: agentSrcIndex },
diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md
index 1444bbffe..feeb9c8e4 100644
--- a/packages/tui/CHANGELOG.md
+++ b/packages/tui/CHANGELOG.md
@@ -2,9 +2,16 @@
## [Unreleased]
+## [0.74.0] - 2026-05-07
+
+## [0.73.1] - 2026-05-07
+
### Fixed
- Fixed wrapped OSC 8 hyperlinks to preserve BEL terminators so OAuth login URLs remain clickable on every wrapped line.
+- Fixed Kitty inline image redraws to stay within TUI-owned terminal regions and avoid writing below the active viewport.
+- Fixed Kitty inline image rendering by letting the terminal allocate image ids and bounding parsed image ids to valid values.
+- Fixed inline image capability detection to disable inline images in cmux terminals.
## [0.73.0] - 2026-05-04
diff --git a/packages/tui/README.md b/packages/tui/README.md
index 88210cc7f..5a151afb7 100644
--- a/packages/tui/README.md
+++ b/packages/tui/README.md
@@ -1,4 +1,4 @@
-# @mariozechner/pi-tui
+# @earendil-works/pi-tui
Minimal terminal UI framework with differential rendering and synchronized output for flicker-free interactive CLI applications.
@@ -16,7 +16,7 @@ Minimal terminal UI framework with differential rendering and synchronized outpu
## Quick Start
```typescript
-import { TUI, Text, Editor, ProcessTerminal, matchesKey } from "@mariozechner/pi-tui";
+import { TUI, Text, Editor, ProcessTerminal, matchesKey } from "@earendil-works/pi-tui";
// Create terminal
const terminal = new ProcessTerminal();
@@ -159,7 +159,7 @@ The TUI appends a full SGR reset and OSC 8 reset at the end of each rendered lin
Components that display a text cursor and need IME (Input Method Editor) support should implement the `Focusable` interface:
```typescript
-import { CURSOR_MARKER, type Component, type Focusable } from "@mariozechner/pi-tui";
+import { CURSOR_MARKER, type Component, type Focusable } from "@earendil-works/pi-tui";
class MyInput implements Component, Focusable {
focused: boolean = false; // Set by TUI when focus changes
@@ -183,7 +183,7 @@ This enables IME candidate windows to appear at the correct position for CJK inp
**Container components with embedded inputs:** When a container component (dialog, selector, etc.) contains an `Input` or `Editor` child, the container must implement `Focusable` and propagate the focus state to the child:
```typescript
-import { Container, type Focusable, Input } from "@mariozechner/pi-tui";
+import { Container, type Focusable, Input } from "@earendil-works/pi-tui";
class SearchDialog extends Container implements Focusable {
private searchInput: Input;
@@ -530,7 +530,7 @@ Supported formats: PNG, JPEG, GIF, WebP. Dimensions are parsed from the image he
Supports both slash commands and file paths.
```typescript
-import { CombinedAutocompleteProvider } from "@mariozechner/pi-tui";
+import { CombinedAutocompleteProvider } from "@earendil-works/pi-tui";
const provider = new CombinedAutocompleteProvider(
[
@@ -555,7 +555,7 @@ editor.setAutocompleteProvider(provider);
Use `matchesKey()` with the `Key` helper for detecting keyboard input (supports Kitty keyboard protocol):
```typescript
-import { matchesKey, Key } from "@mariozechner/pi-tui";
+import { matchesKey, Key } from "@earendil-works/pi-tui";
if (matchesKey(data, Key.ctrl("c"))) {
process.exit(0);
@@ -613,7 +613,7 @@ interface Terminal {
## Utilities
```typescript
-import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@mariozechner/pi-tui";
+import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
// Get visible width of string (ignoring ANSI codes)
const width = visibleWidth("\x1b[31mHello\x1b[0m"); // 5
@@ -638,8 +638,8 @@ When creating custom components, **each line returned by `render()` must not exc
Use `matchesKey()` with the `Key` helper for keyboard input:
```typescript
-import { matchesKey, Key, truncateToWidth } from "@mariozechner/pi-tui";
-import type { Component } from "@mariozechner/pi-tui";
+import { matchesKey, Key, truncateToWidth } from "@earendil-works/pi-tui";
+import type { Component } from "@earendil-works/pi-tui";
class MyInteractiveComponent implements Component {
private selectedIndex = 0;
@@ -674,8 +674,8 @@ class MyInteractiveComponent implements Component {
Use the provided utilities to ensure lines fit:
```typescript
-import { visibleWidth, truncateToWidth } from "@mariozechner/pi-tui";
-import type { Component } from "@mariozechner/pi-tui";
+import { visibleWidth, truncateToWidth } from "@earendil-works/pi-tui";
+import type { Component } from "@earendil-works/pi-tui";
class MyComponent implements Component {
private text: string;
diff --git a/packages/tui/package.json b/packages/tui/package.json
index bd7e17c83..af49435e0 100644
--- a/packages/tui/package.json
+++ b/packages/tui/package.json
@@ -1,6 +1,6 @@
{
- "name": "@mariozechner/pi-tui",
- "version": "0.73.0",
+ "name": "@earendil-works/pi-tui",
+ "version": "0.74.0",
"description": "Terminal User Interface library with differential rendering for efficient text-based applications",
"type": "module",
"main": "dist/index.js",
@@ -28,7 +28,7 @@
"license": "MIT",
"repository": {
"type": "git",
- "url": "git+https://github.com/badlogic/pi-mono.git",
+ "url": "git+https://github.com/earendil-works/pi-mono.git",
"directory": "packages/tui"
},
"engines": {
diff --git a/packages/web-ui/CHANGELOG.md b/packages/web-ui/CHANGELOG.md
index b03de5c93..932ed7b7b 100644
--- a/packages/web-ui/CHANGELOG.md
+++ b/packages/web-ui/CHANGELOG.md
@@ -2,6 +2,10 @@
## [Unreleased]
+## [0.74.0] - 2026-05-07
+
+## [0.73.1] - 2026-05-07
+
## [0.73.0] - 2026-05-04
## [0.72.1] - 2026-05-02
diff --git a/packages/web-ui/README.md b/packages/web-ui/README.md
index e601f3689..7482caeff 100644
--- a/packages/web-ui/README.md
+++ b/packages/web-ui/README.md
@@ -1,6 +1,6 @@
-# @mariozechner/pi-web-ui
+# @earendil-works/pi-web-ui
-Reusable web UI components for building AI chat interfaces powered by [@mariozechner/pi-ai](../ai) and [@mariozechner/pi-agent-core](../agent).
+Reusable web UI components for building AI chat interfaces powered by [@earendil-works/pi-ai](../ai) and [@earendil-works/pi-agent-core](../agent).
Built with [mini-lit](https://github.com/badlogic/mini-lit) web components and Tailwind CSS v4.
@@ -17,7 +17,7 @@ Built with [mini-lit](https://github.com/badlogic/mini-lit) web components and T
## Installation
```bash
-npm install @mariozechner/pi-web-ui @mariozechner/pi-agent-core @mariozechner/pi-ai
+npm install @earendil-works/pi-web-ui @earendil-works/pi-agent-core @earendil-works/pi-ai
```
## Quick Start
@@ -25,8 +25,8 @@ npm install @mariozechner/pi-web-ui @mariozechner/pi-agent-core @mariozechner/pi
See the [example](./example) directory for a complete working application.
```typescript
-import { Agent } from '@mariozechner/pi-agent-core';
-import { getModel } from '@mariozechner/pi-ai';
+import { Agent } from '@earendil-works/pi-agent-core';
+import { getModel } from '@earendil-works/pi-ai';
import {
ChatPanel,
AppStorage,
@@ -37,8 +37,8 @@ import {
setAppStorage,
defaultConvertToLlm,
ApiKeyPromptDialog,
-} from '@mariozechner/pi-web-ui';
-import '@mariozechner/pi-web-ui/app.css';
+} from '@earendil-works/pi-web-ui';
+import '@earendil-works/pi-web-ui/app.css';
// Set up storage
const settings = new SettingsStore();
@@ -169,7 +169,7 @@ Properties:
### Agent (from pi-agent-core)
```typescript
-import { Agent } from '@mariozechner/pi-agent-core';
+import { Agent } from '@earendil-works/pi-agent-core';
const agent = new Agent({
initialState: {
@@ -259,7 +259,7 @@ interface SystemNotification {
timestamp: string;
}
-declare module '@mariozechner/pi-agent-core' {
+declare module '@earendil-works/pi-agent-core' {
interface CustomAgentMessages {
'system-notification': SystemNotification;
}
@@ -287,7 +287,7 @@ function myConvertToLlm(messages: AgentMessage[]): Message[] {
`convertToLlm` transforms app messages to LLM-compatible format:
```typescript
-import { defaultConvertToLlm, convertAttachments } from '@mariozechner/pi-web-ui';
+import { defaultConvertToLlm, convertAttachments } from '@earendil-works/pi-web-ui';
// defaultConvertToLlm handles:
// - UserMessageWithAttachments → user message with image/text content blocks
@@ -302,7 +302,7 @@ import { defaultConvertToLlm, convertAttachments } from '@mariozechner/pi-web-ui
Execute JavaScript in a sandboxed browser environment:
```typescript
-import { createJavaScriptReplTool } from '@mariozechner/pi-web-ui';
+import { createJavaScriptReplTool } from '@earendil-works/pi-web-ui';
const replTool = createJavaScriptReplTool();
@@ -320,7 +320,7 @@ agent.state.tools = [replTool];
Extract text from documents at URLs:
```typescript
-import { createExtractDocumentTool } from '@mariozechner/pi-web-ui';
+import { createExtractDocumentTool } from '@earendil-works/pi-web-ui';
const extractTool = createExtractDocumentTool();
extractTool.corsProxyUrl = 'https://corsproxy.io/?';
@@ -343,7 +343,7 @@ agent.state.tools = [artifactsPanel.tool];
### Custom Tool Renderers
```typescript
-import { registerToolRenderer, type ToolRenderer } from '@mariozechner/pi-web-ui';
+import { registerToolRenderer, type ToolRenderer } from '@earendil-works/pi-web-ui';
const myRenderer: ToolRenderer = {
render(params, result, isStreaming) {
@@ -371,7 +371,7 @@ import {
CustomProvidersStore,
setAppStorage,
getAppStorage,
-} from '@mariozechner/pi-web-ui';
+} from '@earendil-works/pi-web-ui';
// Create stores
const settings = new SettingsStore();
@@ -466,7 +466,7 @@ const all = await storage.customProviders.getAll();
Load and process files:
```typescript
-import { loadAttachment, type Attachment } from '@mariozechner/pi-web-ui';
+import { loadAttachment, type Attachment } from '@earendil-works/pi-web-ui';
// From File input
const file = inputElement.files[0];
@@ -498,7 +498,7 @@ Supported formats: PDF, DOCX, XLSX, PPTX, images, text files.
For browser environments with CORS restrictions:
```typescript
-import { createStreamFn, shouldUseProxyForProvider, isCorsError } from '@mariozechner/pi-web-ui';
+import { createStreamFn, shouldUseProxyForProvider, isCorsError } from '@earendil-works/pi-web-ui';
// AgentInterface auto-configures proxy from settings
// For manual setup:
@@ -517,7 +517,7 @@ agent.streamFn = createStreamFn(async () => {
### SettingsDialog
```typescript
-import { SettingsDialog, ProvidersModelsTab, ProxyTab, ApiKeysTab } from '@mariozechner/pi-web-ui';
+import { SettingsDialog, ProvidersModelsTab, ProxyTab, ApiKeysTab } from '@earendil-works/pi-web-ui';
SettingsDialog.open([
new ProvidersModelsTab(), // Custom providers + model list
@@ -529,7 +529,7 @@ SettingsDialog.open([
### SessionListDialog
```typescript
-import { SessionListDialog } from '@mariozechner/pi-web-ui';
+import { SessionListDialog } from '@earendil-works/pi-web-ui';
SessionListDialog.open(
async (sessionId) => { /* load session */ },
@@ -540,7 +540,7 @@ SessionListDialog.open(
### ApiKeyPromptDialog
```typescript
-import { ApiKeyPromptDialog } from '@mariozechner/pi-web-ui';
+import { ApiKeyPromptDialog } from '@earendil-works/pi-web-ui';
const success = await ApiKeyPromptDialog.prompt('anthropic');
```
@@ -548,7 +548,7 @@ const success = await ApiKeyPromptDialog.prompt('anthropic');
### ModelSelector
```typescript
-import { ModelSelector } from '@mariozechner/pi-web-ui';
+import { ModelSelector } from '@earendil-works/pi-web-ui';
ModelSelector.open(currentModel, (selectedModel) => {
agent.state.model = selectedModel;
@@ -560,7 +560,7 @@ ModelSelector.open(currentModel, (selectedModel) => {
Import the pre-built CSS:
```typescript
-import '@mariozechner/pi-web-ui/app.css';
+import '@earendil-works/pi-web-ui/app.css';
```
Or use Tailwind with custom config:
@@ -575,7 +575,7 @@ Or use Tailwind with custom config:
## Internationalization
```typescript
-import { i18n, setLanguage, translations } from '@mariozechner/pi-web-ui';
+import { i18n, setLanguage, translations } from '@earendil-works/pi-web-ui';
// Add translations
translations.de = {
diff --git a/packages/web-ui/example/README.md b/packages/web-ui/example/README.md
index 475c3085a..e3d468cff 100644
--- a/packages/web-ui/example/README.md
+++ b/packages/web-ui/example/README.md
@@ -1,6 +1,6 @@
# Pi Web UI - Example
-This is a minimal example showing how to use `@mariozechner/pi-web-ui` in a web application.
+This is a minimal example showing how to use `@earendil-works/pi-web-ui` in a web application.
## Setup
diff --git a/packages/web-ui/example/index.html b/packages/web-ui/example/index.html
index e462448db..933f67a18 100644
--- a/packages/web-ui/example/index.html
+++ b/packages/web-ui/example/index.html
@@ -4,7 +4,7 @@
Pi Web UI - Example
-
+
diff --git a/packages/web-ui/example/package.json b/packages/web-ui/example/package.json
index afe8c076a..06497e478 100644
--- a/packages/web-ui/example/package.json
+++ b/packages/web-ui/example/package.json
@@ -1,6 +1,6 @@
{
"name": "pi-web-ui-example",
- "version": "0.73.0",
+ "version": "0.74.0",
"private": true,
"type": "module",
"scripts": {
@@ -12,8 +12,8 @@
},
"dependencies": {
"@mariozechner/mini-lit": "^0.2.0",
- "@mariozechner/pi-ai": "file:../../ai",
- "@mariozechner/pi-web-ui": "file:../",
+ "@earendil-works/pi-ai": "file:../../ai",
+ "@earendil-works/pi-web-ui": "file:../",
"@tailwindcss/vite": "^4.1.17",
"lit": "^3.3.1",
"lucide": "^0.544.0"
diff --git a/packages/web-ui/example/src/custom-messages.ts b/packages/web-ui/example/src/custom-messages.ts
index d5700b60d..93e07a777 100644
--- a/packages/web-ui/example/src/custom-messages.ts
+++ b/packages/web-ui/example/src/custom-messages.ts
@@ -1,7 +1,7 @@
+import type { Message } from "@earendil-works/pi-ai";
+import type { AgentMessage, MessageRenderer } from "@earendil-works/pi-web-ui";
+import { defaultConvertToLlm, registerMessageRenderer } from "@earendil-works/pi-web-ui";
import { Alert } from "@mariozechner/mini-lit/dist/Alert.js";
-import type { Message } from "@mariozechner/pi-ai";
-import type { AgentMessage, MessageRenderer } from "@mariozechner/pi-web-ui";
-import { defaultConvertToLlm, registerMessageRenderer } from "@mariozechner/pi-web-ui";
import { html } from "lit";
// ============================================================================
@@ -18,7 +18,7 @@ export interface SystemNotificationMessage {
// Extend CustomAgentMessages interface via declaration merging
// This must target pi-agent-core where CustomAgentMessages is defined
-declare module "@mariozechner/pi-agent-core" {
+declare module "@earendil-works/pi-agent-core" {
interface CustomAgentMessages {
"system-notification": SystemNotificationMessage;
}
diff --git a/packages/web-ui/example/src/main.ts b/packages/web-ui/example/src/main.ts
index ae7e2ed0a..3efcd73c4 100644
--- a/packages/web-ui/example/src/main.ts
+++ b/packages/web-ui/example/src/main.ts
@@ -1,6 +1,6 @@
import "@mariozechner/mini-lit/dist/ThemeToggle.js";
-import { Agent, type AgentMessage } from "@mariozechner/pi-agent-core";
-import { getModel } from "@mariozechner/pi-ai";
+import { Agent, type AgentMessage } from "@earendil-works/pi-agent-core";
+import { getModel, type TextContent } from "@earendil-works/pi-ai";
import {
type AgentState,
ApiKeyPromptDialog,
@@ -18,7 +18,7 @@ import {
SettingsDialog,
SettingsStore,
setAppStorage,
-} from "@mariozechner/pi-web-ui";
+} from "@earendil-works/pi-web-ui";
import { html, render } from "lit";
import { Bell, History, Plus, Settings } from "lucide";
import "./app.css";
@@ -70,8 +70,8 @@ let chatPanel: ChatPanel;
let agentUnsubscribe: (() => void) | undefined;
const generateTitle = (messages: AgentMessage[]): string => {
- const firstUserMsg = messages.find((m) => m.role === "user" || m.role === "user-with-attachments");
- if (!firstUserMsg || (firstUserMsg.role !== "user" && firstUserMsg.role !== "user-with-attachments")) return "";
+ const firstUserMsg = messages.find((m) => m.role === "user");
+ if (!firstUserMsg) return "";
let text = "";
const content = firstUserMsg.content;
@@ -79,8 +79,8 @@ const generateTitle = (messages: AgentMessage[]): string => {
if (typeof content === "string") {
text = content;
} else {
- const textBlocks = content.filter((c: any) => c.type === "text");
- text = textBlocks.map((c: any) => c.text || "").join(" ");
+ const textBlocks = content.filter((c): c is TextContent => c.type === "text");
+ text = textBlocks.map((c) => c.text || "").join(" ");
}
text = text.trim();
@@ -94,8 +94,8 @@ const generateTitle = (messages: AgentMessage[]): string => {
};
const shouldSaveSession = (messages: AgentMessage[]): boolean => {
- const hasUserMsg = messages.some((m: any) => m.role === "user" || m.role === "user-with-attachments");
- const hasAssistantMsg = messages.some((m: any) => m.role === "assistant");
+ const hasUserMsg = messages.some((m) => m.role === "user");
+ const hasAssistantMsg = messages.some((m) => m.role === "assistant");
return hasUserMsg && hasAssistantMsg;
};
diff --git a/packages/web-ui/example/tsconfig.json b/packages/web-ui/example/tsconfig.json
index e095a2797..9e8c43336 100644
--- a/packages/web-ui/example/tsconfig.json
+++ b/packages/web-ui/example/tsconfig.json
@@ -6,10 +6,10 @@
"moduleResolution": "bundler",
"paths": {
"*": ["./*"],
- "@mariozechner/pi-agent-core": ["../../agent/dist/index.d.ts"],
- "@mariozechner/pi-ai": ["../../ai/dist/index.d.ts"],
- "@mariozechner/pi-tui": ["../../tui/dist/index.d.ts"],
- "@mariozechner/pi-web-ui": ["../dist/index.d.ts"]
+ "@earendil-works/pi-agent-core": ["../../agent/dist/index.d.ts"],
+ "@earendil-works/pi-ai": ["../../ai/dist/index.d.ts"],
+ "@earendil-works/pi-tui": ["../../tui/dist/index.d.ts"],
+ "@earendil-works/pi-web-ui": ["../dist/index.d.ts"]
},
"strict": true,
"skipLibCheck": true,
diff --git a/packages/web-ui/package.json b/packages/web-ui/package.json
index 38e898710..e22b6a72b 100644
--- a/packages/web-ui/package.json
+++ b/packages/web-ui/package.json
@@ -1,7 +1,7 @@
{
- "name": "@mariozechner/pi-web-ui",
- "version": "0.73.0",
- "description": "Reusable web UI components for AI chat interfaces powered by @mariozechner/pi-ai",
+ "name": "@earendil-works/pi-web-ui",
+ "version": "0.74.0",
+ "description": "Reusable web UI components for AI chat interfaces powered by @earendil-works/pi-ai",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@@ -18,8 +18,8 @@
},
"dependencies": {
"@lmstudio/sdk": "^1.5.0",
- "@mariozechner/pi-ai": "^0.73.0",
- "@mariozechner/pi-tui": "^0.73.0",
+ "@earendil-works/pi-ai": "^0.74.0",
+ "@earendil-works/pi-tui": "^0.74.0",
"typebox": "^1.1.24",
"docx-preview": "^0.3.7",
"jszip": "^3.10.1",
diff --git a/packages/web-ui/src/ChatPanel.ts b/packages/web-ui/src/ChatPanel.ts
index 679e36a15..0a7a48238 100644
--- a/packages/web-ui/src/ChatPanel.ts
+++ b/packages/web-ui/src/ChatPanel.ts
@@ -2,7 +2,7 @@ import { Badge } from "@mariozechner/mini-lit/dist/Badge.js";
import { html, LitElement } from "lit";
import { customElement, state } from "lit/decorators.js";
import "./components/AgentInterface.js";
-import type { Agent, AgentTool } from "@mariozechner/pi-agent-core";
+import type { Agent, AgentTool } from "@earendil-works/pi-agent-core";
import type { AgentInterface } from "./components/AgentInterface.js";
import { ArtifactsRuntimeProvider } from "./components/sandbox/ArtifactsRuntimeProvider.js";
import { AttachmentsRuntimeProvider } from "./components/sandbox/AttachmentsRuntimeProvider.js";
diff --git a/packages/web-ui/src/components/AgentInterface.ts b/packages/web-ui/src/components/AgentInterface.ts
index 8e7af745e..0a536e96c 100644
--- a/packages/web-ui/src/components/AgentInterface.ts
+++ b/packages/web-ui/src/components/AgentInterface.ts
@@ -1,4 +1,4 @@
-import { streamSimple, type ToolResultMessage, type Usage } from "@mariozechner/pi-ai";
+import { streamSimple, type ToolResultMessage, type Usage } from "@earendil-works/pi-ai";
import { html, LitElement } from "lit";
import { customElement, property, query } from "lit/decorators.js";
import { ModelSelector } from "../dialogs/ModelSelector.js";
@@ -8,7 +8,7 @@ import "./MessageList.js";
import "./Messages.js"; // Import for side effects to register the custom elements
import { getAppStorage } from "../storage/app-storage.js";
import "./StreamingMessageContainer.js";
-import type { Agent, AgentEvent } from "@mariozechner/pi-agent-core";
+import type { Agent, AgentEvent } from "@earendil-works/pi-agent-core";
import type { Attachment } from "../utils/attachment-utils.js";
import { formatUsage } from "../utils/format.js";
import { i18n } from "../utils/i18n.js";
diff --git a/packages/web-ui/src/components/MessageEditor.ts b/packages/web-ui/src/components/MessageEditor.ts
index 9a12f1d02..e50d94019 100644
--- a/packages/web-ui/src/components/MessageEditor.ts
+++ b/packages/web-ui/src/components/MessageEditor.ts
@@ -1,7 +1,7 @@
+import type { Model } from "@earendil-works/pi-ai";
import { icon } from "@mariozechner/mini-lit";
import { Button } from "@mariozechner/mini-lit/dist/Button.js";
import { Select, type SelectOption } from "@mariozechner/mini-lit/dist/Select.js";
-import type { Model } from "@mariozechner/pi-ai";
import { html, LitElement } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { createRef, ref } from "lit/directives/ref.js";
@@ -9,7 +9,7 @@ import { Brain, Loader2, Paperclip, Send, Sparkles, Square } from "lucide";
import { type Attachment, loadAttachment } from "../utils/attachment-utils.js";
import { i18n } from "../utils/i18n.js";
import "./AttachmentTile.js";
-import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
+import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
@customElement("message-editor")
export class MessageEditor extends LitElement {
diff --git a/packages/web-ui/src/components/MessageList.ts b/packages/web-ui/src/components/MessageList.ts
index 25670b3ad..59cc69557 100644
--- a/packages/web-ui/src/components/MessageList.ts
+++ b/packages/web-ui/src/components/MessageList.ts
@@ -1,8 +1,8 @@
-import type { AgentMessage, AgentTool } from "@mariozechner/pi-agent-core";
+import type { AgentMessage, AgentTool } from "@earendil-works/pi-agent-core";
import type {
AssistantMessage as AssistantMessageType,
ToolResultMessage as ToolResultMessageType,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { html, LitElement, type TemplateResult } from "lit";
import { property } from "lit/decorators.js";
import { repeat } from "lit/directives/repeat.js";
diff --git a/packages/web-ui/src/components/Messages.ts b/packages/web-ui/src/components/Messages.ts
index 2843d563a..162375436 100644
--- a/packages/web-ui/src/components/Messages.ts
+++ b/packages/web-ui/src/components/Messages.ts
@@ -5,7 +5,7 @@ import type {
ToolCall,
ToolResultMessage as ToolResultMessageType,
UserMessage as UserMessageType,
-} from "@mariozechner/pi-ai";
+} from "@earendil-works/pi-ai";
import { html, LitElement, type TemplateResult } from "lit";
import { customElement, property } from "lit/decorators.js";
import { renderTool } from "../tools/index.js";
@@ -13,7 +13,7 @@ import type { Attachment } from "../utils/attachment-utils.js";
import { formatUsage } from "../utils/format.js";
import { i18n } from "../utils/i18n.js";
import "./ThinkingBlock.js";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
export type UserMessageWithAttachments = {
role: "user-with-attachments";
@@ -32,7 +32,7 @@ export interface ArtifactMessage {
timestamp: string;
}
-declare module "@mariozechner/pi-agent-core" {
+declare module "@earendil-works/pi-agent-core" {
interface CustomAgentMessages {
"user-with-attachments": UserMessageWithAttachments;
artifact: ArtifactMessage;
@@ -296,8 +296,8 @@ export class AbortedMessage extends LitElement {
// Default Message Transformer
// ============================================================================
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
-import type { Message } from "@mariozechner/pi-ai";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
+import type { Message } from "@earendil-works/pi-ai";
/**
* Convert attachments to content blocks for LLM.
diff --git a/packages/web-ui/src/components/ProviderKeyInput.ts b/packages/web-ui/src/components/ProviderKeyInput.ts
index 61dac6068..c43d72d05 100644
--- a/packages/web-ui/src/components/ProviderKeyInput.ts
+++ b/packages/web-ui/src/components/ProviderKeyInput.ts
@@ -1,7 +1,7 @@
+import { type Context, complete, getModel } from "@earendil-works/pi-ai";
import { i18n } from "@mariozechner/mini-lit";
import { Badge } from "@mariozechner/mini-lit/dist/Badge.js";
import { Button } from "@mariozechner/mini-lit/dist/Button.js";
-import { type Context, complete, getModel } from "@mariozechner/pi-ai";
import { html, LitElement } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { getAppStorage } from "../storage/app-storage.js";
diff --git a/packages/web-ui/src/components/StreamingMessageContainer.ts b/packages/web-ui/src/components/StreamingMessageContainer.ts
index 342dc7e6b..d3b090199 100644
--- a/packages/web-ui/src/components/StreamingMessageContainer.ts
+++ b/packages/web-ui/src/components/StreamingMessageContainer.ts
@@ -1,5 +1,5 @@
-import type { AgentMessage, AgentTool } from "@mariozechner/pi-agent-core";
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { AgentMessage, AgentTool } from "@earendil-works/pi-agent-core";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { html, LitElement } from "lit";
import { property, state } from "lit/decorators.js";
diff --git a/packages/web-ui/src/components/message-renderer-registry.ts b/packages/web-ui/src/components/message-renderer-registry.ts
index 51f84a48f..ed710b63e 100644
--- a/packages/web-ui/src/components/message-renderer-registry.ts
+++ b/packages/web-ui/src/components/message-renderer-registry.ts
@@ -1,4 +1,4 @@
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
import type { TemplateResult } from "lit";
// Extract role type from AppMessage union
diff --git a/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts b/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts
index 86de7826e..95366a183 100644
--- a/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts
+++ b/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts
@@ -1,4 +1,4 @@
-import type { AgentMessage } from "@mariozechner/pi-agent-core";
+import type { AgentMessage } from "@earendil-works/pi-agent-core";
import {
ARTIFACTS_RUNTIME_PROVIDER_DESCRIPTION_RO,
ARTIFACTS_RUNTIME_PROVIDER_DESCRIPTION_RW,
diff --git a/packages/web-ui/src/dialogs/CustomProviderDialog.ts b/packages/web-ui/src/dialogs/CustomProviderDialog.ts
index ff3ef9f05..2db0ce60a 100644
--- a/packages/web-ui/src/dialogs/CustomProviderDialog.ts
+++ b/packages/web-ui/src/dialogs/CustomProviderDialog.ts
@@ -1,10 +1,10 @@
+import type { Model } from "@earendil-works/pi-ai";
import { i18n } from "@mariozechner/mini-lit";
import { Button } from "@mariozechner/mini-lit/dist/Button.js";
import { DialogBase } from "@mariozechner/mini-lit/dist/DialogBase.js";
import { Input } from "@mariozechner/mini-lit/dist/Input.js";
import { Label } from "@mariozechner/mini-lit/dist/Label.js";
import { Select } from "@mariozechner/mini-lit/dist/Select.js";
-import type { Model } from "@mariozechner/pi-ai";
import { html, type TemplateResult } from "lit";
import { state } from "lit/decorators.js";
import { getAppStorage } from "../storage/app-storage.js";
diff --git a/packages/web-ui/src/dialogs/ModelSelector.ts b/packages/web-ui/src/dialogs/ModelSelector.ts
index 8c8644597..1884765f9 100644
--- a/packages/web-ui/src/dialogs/ModelSelector.ts
+++ b/packages/web-ui/src/dialogs/ModelSelector.ts
@@ -1,9 +1,9 @@
+import { getModels, getProviders, type Model, modelsAreEqual } from "@earendil-works/pi-ai";
import { icon } from "@mariozechner/mini-lit";
import { Badge } from "@mariozechner/mini-lit/dist/Badge.js";
import { Button } from "@mariozechner/mini-lit/dist/Button.js";
import { DialogHeader } from "@mariozechner/mini-lit/dist/Dialog.js";
import { DialogBase } from "@mariozechner/mini-lit/dist/DialogBase.js";
-import { getModels, getProviders, type Model, modelsAreEqual } from "@mariozechner/pi-ai";
import { html, type PropertyValues, type TemplateResult } from "lit";
import { customElement, state } from "lit/decorators.js";
import { createRef, ref } from "lit/directives/ref.js";
diff --git a/packages/web-ui/src/dialogs/ProvidersModelsTab.ts b/packages/web-ui/src/dialogs/ProvidersModelsTab.ts
index e2c21a029..440205c3d 100644
--- a/packages/web-ui/src/dialogs/ProvidersModelsTab.ts
+++ b/packages/web-ui/src/dialogs/ProvidersModelsTab.ts
@@ -1,6 +1,6 @@
+import { getProviders } from "@earendil-works/pi-ai";
import { i18n } from "@mariozechner/mini-lit";
import { Select } from "@mariozechner/mini-lit/dist/Select.js";
-import { getProviders } from "@mariozechner/pi-ai";
import { html, type TemplateResult } from "lit";
import { customElement, state } from "lit/decorators.js";
import "../components/CustomProviderCard.js";
diff --git a/packages/web-ui/src/dialogs/SettingsDialog.ts b/packages/web-ui/src/dialogs/SettingsDialog.ts
index 71620552e..7f671b0a1 100644
--- a/packages/web-ui/src/dialogs/SettingsDialog.ts
+++ b/packages/web-ui/src/dialogs/SettingsDialog.ts
@@ -1,9 +1,9 @@
+import { getProviders } from "@earendil-works/pi-ai";
import { i18n } from "@mariozechner/mini-lit";
import { Dialog, DialogContent, DialogHeader } from "@mariozechner/mini-lit/dist/Dialog.js";
import { Input } from "@mariozechner/mini-lit/dist/Input.js";
import { Label } from "@mariozechner/mini-lit/dist/Label.js";
import { Switch } from "@mariozechner/mini-lit/dist/Switch.js";
-import { getProviders } from "@mariozechner/pi-ai";
import { html, LitElement, type TemplateResult } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import "../components/ProviderKeyInput.js";
diff --git a/packages/web-ui/src/index.ts b/packages/web-ui/src/index.ts
index 48284c742..c808cde20 100644
--- a/packages/web-ui/src/index.ts
+++ b/packages/web-ui/src/index.ts
@@ -1,7 +1,7 @@
// Main chat interface
-export type { Agent, AgentMessage, AgentState, ThinkingLevel } from "@mariozechner/pi-agent-core";
-export type { Model } from "@mariozechner/pi-ai";
+export type { Agent, AgentMessage, AgentState, ThinkingLevel } from "@earendil-works/pi-agent-core";
+export type { Model } from "@earendil-works/pi-ai";
export { ChatPanel } from "./ChatPanel.js";
// Components
export { AgentInterface } from "./components/AgentInterface.js";
diff --git a/packages/web-ui/src/storage/stores/custom-providers-store.ts b/packages/web-ui/src/storage/stores/custom-providers-store.ts
index 38dfdd594..5a686b624 100644
--- a/packages/web-ui/src/storage/stores/custom-providers-store.ts
+++ b/packages/web-ui/src/storage/stores/custom-providers-store.ts
@@ -1,4 +1,4 @@
-import type { Model } from "@mariozechner/pi-ai";
+import type { Model } from "@earendil-works/pi-ai";
import { Store } from "../store.js";
import type { StoreConfig } from "../types.js";
diff --git a/packages/web-ui/src/storage/stores/sessions-store.ts b/packages/web-ui/src/storage/stores/sessions-store.ts
index b0084fdde..d244f9558 100644
--- a/packages/web-ui/src/storage/stores/sessions-store.ts
+++ b/packages/web-ui/src/storage/stores/sessions-store.ts
@@ -1,4 +1,4 @@
-import type { AgentState } from "@mariozechner/pi-agent-core";
+import type { AgentState } from "@earendil-works/pi-agent-core";
import { Store } from "../store.js";
import type { SessionData, SessionMetadata, StoreConfig } from "../types.js";
diff --git a/packages/web-ui/src/storage/types.ts b/packages/web-ui/src/storage/types.ts
index 3bbcf602c..7ed2bd0fe 100644
--- a/packages/web-ui/src/storage/types.ts
+++ b/packages/web-ui/src/storage/types.ts
@@ -1,5 +1,5 @@
-import type { AgentMessage, ThinkingLevel } from "@mariozechner/pi-agent-core";
-import type { Model } from "@mariozechner/pi-ai";
+import type { AgentMessage, ThinkingLevel } from "@earendil-works/pi-agent-core";
+import type { Model } from "@earendil-works/pi-ai";
/**
* Transaction interface for atomic operations across stores.
diff --git a/packages/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts b/packages/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts
index 68e1e452d..6767dcce7 100644
--- a/packages/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts
+++ b/packages/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts
@@ -1,5 +1,5 @@
import "@mariozechner/mini-lit/dist/CodeBlock.js";
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { createRef, ref } from "lit/directives/ref.js";
import { FileCode2 } from "lucide";
import "../../components/ConsoleBlock.js";
diff --git a/packages/web-ui/src/tools/artifacts/artifacts.ts b/packages/web-ui/src/tools/artifacts/artifacts.ts
index 041a96022..7f679eabb 100644
--- a/packages/web-ui/src/tools/artifacts/artifacts.ts
+++ b/packages/web-ui/src/tools/artifacts/artifacts.ts
@@ -1,8 +1,8 @@
import { icon } from "@mariozechner/mini-lit";
import "@mariozechner/mini-lit/dist/MarkdownBlock.js";
+import type { Agent, AgentMessage, AgentTool } from "@earendil-works/pi-agent-core";
+import { StringEnum, type ToolCall } from "@earendil-works/pi-ai";
import { Button } from "@mariozechner/mini-lit/dist/Button.js";
-import type { Agent, AgentMessage, AgentTool } from "@mariozechner/pi-agent-core";
-import { StringEnum, type ToolCall } from "@mariozechner/pi-ai";
import { html, LitElement, type TemplateResult } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { createRef, type Ref, ref } from "lit/directives/ref.js";
diff --git a/packages/web-ui/src/tools/extract-document.ts b/packages/web-ui/src/tools/extract-document.ts
index 8dad2b4dc..77f602387 100644
--- a/packages/web-ui/src/tools/extract-document.ts
+++ b/packages/web-ui/src/tools/extract-document.ts
@@ -1,5 +1,5 @@
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { html } from "lit";
import { createRef, ref } from "lit/directives/ref.js";
import { FileText } from "lucide";
diff --git a/packages/web-ui/src/tools/index.ts b/packages/web-ui/src/tools/index.ts
index 39968a779..762e62324 100644
--- a/packages/web-ui/src/tools/index.ts
+++ b/packages/web-ui/src/tools/index.ts
@@ -1,4 +1,4 @@
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import "./javascript-repl.js"; // Auto-registers the renderer
import "./extract-document.js"; // Auto-registers the renderer
import { getToolRenderer, registerToolRenderer } from "./renderer-registry.js";
diff --git a/packages/web-ui/src/tools/javascript-repl.ts b/packages/web-ui/src/tools/javascript-repl.ts
index c3358aca9..1ed4125f5 100644
--- a/packages/web-ui/src/tools/javascript-repl.ts
+++ b/packages/web-ui/src/tools/javascript-repl.ts
@@ -1,6 +1,6 @@
+import type { AgentTool } from "@earendil-works/pi-agent-core";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { i18n } from "@mariozechner/mini-lit";
-import type { AgentTool } from "@mariozechner/pi-agent-core";
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
import { html } from "lit";
import { createRef, ref } from "lit/directives/ref.js";
import { Code } from "lucide";
diff --git a/packages/web-ui/src/tools/renderers/BashRenderer.ts b/packages/web-ui/src/tools/renderers/BashRenderer.ts
index e4581d349..97633d7fc 100644
--- a/packages/web-ui/src/tools/renderers/BashRenderer.ts
+++ b/packages/web-ui/src/tools/renderers/BashRenderer.ts
@@ -1,4 +1,4 @@
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { html } from "lit";
import { SquareTerminal } from "lucide";
import { i18n } from "../../utils/i18n.js";
diff --git a/packages/web-ui/src/tools/renderers/CalculateRenderer.ts b/packages/web-ui/src/tools/renderers/CalculateRenderer.ts
index 01dadd192..0a2901476 100644
--- a/packages/web-ui/src/tools/renderers/CalculateRenderer.ts
+++ b/packages/web-ui/src/tools/renderers/CalculateRenderer.ts
@@ -1,4 +1,4 @@
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { html } from "lit";
import { Calculator } from "lucide";
import { i18n } from "../../utils/i18n.js";
diff --git a/packages/web-ui/src/tools/renderers/DefaultRenderer.ts b/packages/web-ui/src/tools/renderers/DefaultRenderer.ts
index fca094bf9..227649a9c 100644
--- a/packages/web-ui/src/tools/renderers/DefaultRenderer.ts
+++ b/packages/web-ui/src/tools/renderers/DefaultRenderer.ts
@@ -1,4 +1,4 @@
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { html } from "lit";
import { Code } from "lucide";
import { i18n } from "../../utils/i18n.js";
diff --git a/packages/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts b/packages/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts
index cbc34b4bc..0bd3664be 100644
--- a/packages/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts
+++ b/packages/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts
@@ -1,4 +1,4 @@
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import { html } from "lit";
import { Clock } from "lucide";
import { i18n } from "../../utils/i18n.js";
diff --git a/packages/web-ui/src/tools/types.ts b/packages/web-ui/src/tools/types.ts
index 9de5d1e62..379503646 100644
--- a/packages/web-ui/src/tools/types.ts
+++ b/packages/web-ui/src/tools/types.ts
@@ -1,4 +1,4 @@
-import type { ToolResultMessage } from "@mariozechner/pi-ai";
+import type { ToolResultMessage } from "@earendil-works/pi-ai";
import type { TemplateResult } from "lit";
export interface ToolRenderResult {
diff --git a/packages/web-ui/src/utils/format.ts b/packages/web-ui/src/utils/format.ts
index aaaa9387a..92119e882 100644
--- a/packages/web-ui/src/utils/format.ts
+++ b/packages/web-ui/src/utils/format.ts
@@ -1,5 +1,5 @@
+import type { Usage } from "@earendil-works/pi-ai";
import { i18n } from "@mariozechner/mini-lit";
-import type { Usage } from "@mariozechner/pi-ai";
export function formatCost(cost: number): string {
return `$${cost.toFixed(4)}`;
diff --git a/packages/web-ui/src/utils/model-discovery.ts b/packages/web-ui/src/utils/model-discovery.ts
index 299aa9aca..ecbf64673 100644
--- a/packages/web-ui/src/utils/model-discovery.ts
+++ b/packages/web-ui/src/utils/model-discovery.ts
@@ -1,5 +1,5 @@
+import type { Model } from "@earendil-works/pi-ai";
import { LMStudioClient } from "@lmstudio/sdk";
-import type { Model } from "@mariozechner/pi-ai";
import { Ollama } from "ollama/browser";
/**
diff --git a/packages/web-ui/src/utils/proxy-utils.ts b/packages/web-ui/src/utils/proxy-utils.ts
index 602820c93..0d6a112ff 100644
--- a/packages/web-ui/src/utils/proxy-utils.ts
+++ b/packages/web-ui/src/utils/proxy-utils.ts
@@ -1,5 +1,5 @@
-import type { Api, Context, Model, SimpleStreamOptions } from "@mariozechner/pi-ai";
-import { streamSimple } from "@mariozechner/pi-ai";
+import type { Api, Context, Model, SimpleStreamOptions } from "@earendil-works/pi-ai";
+import { streamSimple } from "@earendil-works/pi-ai";
/**
* Centralized proxy decision logic.
diff --git a/scripts/browser-smoke-entry.ts b/scripts/browser-smoke-entry.ts
index 3bd0dea31..a4057c930 100644
--- a/scripts/browser-smoke-entry.ts
+++ b/scripts/browser-smoke-entry.ts
@@ -1,4 +1,4 @@
-import { complete, getModel } from "@mariozechner/pi-ai";
+import { complete, getModel } from "@earendil-works/pi-ai";
const model = getModel("google", "gemini-2.5-flash");
console.log(model.id, typeof complete);
diff --git a/scripts/read-tool-stats.mjs b/scripts/read-tool-stats.mjs
new file mode 100755
index 000000000..07bedd8f9
--- /dev/null
+++ b/scripts/read-tool-stats.mjs
@@ -0,0 +1,505 @@
+#!/usr/bin/env node
+
+import { createReadStream } from "node:fs";
+import { promises as fs } from "node:fs";
+import { homedir } from "node:os";
+import path from "node:path";
+import { createInterface } from "node:readline";
+
+const DEFAULT_SESSIONS_DIR = path.join(homedir(), ".pi/agent/sessions");
+const DEFAULT_ACTIVE_READ_TOOL_PATH = path.join(process.cwd(), "packages/coding-agent/src/core/tools/read.ts");
+const DEFAULT_TOP = 20;
+const CHART_WIDTH = 40;
+const REPORT_TIME_ZONE = "Europe/Berlin";
+
+function parseArgs(argv) {
+ const options = {
+ sessionsDir: DEFAULT_SESSIONS_DIR,
+ json: false,
+ text: false,
+ includeRecords: false,
+ modelFilter: undefined,
+ top: DEFAULT_TOP,
+ help: false,
+ allSessions: false,
+ since: undefined,
+ autoSincePath: DEFAULT_ACTIVE_READ_TOOL_PATH,
+ bucket: "week",
+ };
+
+ for (let i = 0; i < argv.length; i++) {
+ const arg = argv[i];
+ if (arg === "--help" || arg === "-h") options.help = true;
+ else if (arg === "--json") options.json = true;
+ else if (arg === "--text") options.text = true;
+ else if (arg === "--include-records") options.includeRecords = true;
+ else if (arg === "--model") options.modelFilter = argv[++i];
+ else if (arg === "--top") {
+ const value = Number.parseInt(argv[++i] ?? "", 10);
+ if (!Number.isFinite(value) || value <= 0) throw new Error("--top must be a positive integer");
+ options.top = value;
+ } else if (arg === "--sessions-dir") options.sessionsDir = argv[++i];
+ else if (arg === "--all-sessions") options.allSessions = true;
+ else if (arg === "--since") options.since = argv[++i];
+ else if (arg === "--auto-since-path") options.autoSincePath = argv[++i];
+ else if (arg === "--bucket") {
+ const value = argv[++i];
+ if (value !== "day" && value !== "week") throw new Error("--bucket must be day or week");
+ options.bucket = value;
+ } else throw new Error(`Unknown argument: ${arg}`);
+ }
+
+ return options;
+}
+
+function printHelp() {
+ console.log(`Usage: node scripts/read-tool-stats.mjs [options]
+
+Options:
+ --sessions-dir Sessions directory (default: ~/.pi/agent/sessions)
+ --model Filter provider/model by substring
+ --top Number of examples to show (default: ${DEFAULT_TOP})
+ --since Only scan session files created at or after this ISO time
+ --all-sessions Disable the automatic since filter
+ --auto-since-path Use birth time of this file for the automatic since filter
+ --bucket Time bucket for trend chart (default: week)
+ --json Print JSON summary instead of HTML report
+ --text Print plain text report instead of HTML
+ --include-records Include raw records in JSON output
+ -h, --help Show this help
+`);
+}
+
+function parseSessionFileTimestamp(sessionFile) {
+ const base = path.basename(sessionFile);
+ const rawTimestamp = base.split("_")[0];
+ if (!rawTimestamp) return null;
+ const isoTimestamp = rawTimestamp.replace(/T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/, "T$1:$2:$3.$4Z");
+ const ms = Date.parse(isoTimestamp);
+ return Number.isFinite(ms) ? ms : null;
+}
+
+function formatIso(ms) {
+ return new Date(ms).toISOString();
+}
+
+function getTimeZoneParts(ms) {
+ const parts = new Intl.DateTimeFormat("en-CA", {
+ timeZone: REPORT_TIME_ZONE,
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ hourCycle: "h23",
+ weekday: "short",
+ }).formatToParts(new Date(ms));
+ return Object.fromEntries(parts.filter((part) => part.type !== "literal").map((part) => [part.type, part.value]));
+}
+
+function formatDay(ms) {
+ const parts = getTimeZoneParts(ms);
+ return `${parts.year}-${parts.month}-${parts.day}`;
+}
+
+function startOfReportTimeZoneWeek(ms) {
+ const parts = getTimeZoneParts(ms);
+ const dayIndex = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"].indexOf(parts.weekday ?? "Mon");
+ const localMidnightAsUtc = Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day));
+ return localMidnightAsUtc - Math.max(dayIndex, 0) * 24 * 60 * 60 * 1000;
+}
+
+function getTimeBucket(ms, bucket) {
+ if (!Number.isFinite(ms)) return "[unknown]";
+ if (bucket === "day") return formatDay(ms);
+ return formatDay(startOfReportTimeZoneWeek(ms));
+}
+
+function getHourOfDayBucket(ms) {
+ if (!Number.isFinite(ms)) return "[unknown]";
+ return `${getTimeZoneParts(ms).hour}:00`;
+}
+
+async function resolveAutoSinceMs(options) {
+ if (options.allSessions) return null;
+ if (options.since) {
+ const ms = Date.parse(options.since);
+ if (!Number.isFinite(ms)) throw new Error(`Invalid --since value: ${options.since}`);
+ return { ms, source: `--since ${options.since}` };
+ }
+ if (!options.autoSincePath) return null;
+ try {
+ const stats = await fs.stat(options.autoSincePath);
+ const ms = Number.isFinite(stats.birthtimeMs) && stats.birthtimeMs > 0 ? stats.birthtimeMs : stats.mtimeMs;
+ return Number.isFinite(ms) && ms > 0 ? { ms, source: `birth time of ${options.autoSincePath}` } : null;
+ } catch {
+ return null;
+ }
+}
+
+async function* walkJsonlFiles(dir) {
+ const entries = await fs.readdir(dir, { withFileTypes: true });
+ entries.sort((a, b) => a.name.localeCompare(b.name));
+ for (const entry of entries) {
+ const fullPath = path.join(dir, entry.name);
+ if (entry.isDirectory()) yield* walkJsonlFiles(fullPath);
+ else if (entry.isFile() && entry.name.endsWith(".jsonl")) yield fullPath;
+ }
+}
+
+function formatInt(value) {
+ return new Intl.NumberFormat("en-US").format(value);
+}
+
+function formatPercent(part, total) {
+ return total === 0 ? "n/a" : `${((part / total) * 100).toFixed(1)}%`;
+}
+
+function formatRate(value) {
+ return Number.isFinite(value) ? value.toFixed(2) : "n/a";
+}
+
+function median(numbers) {
+ const finite = numbers.filter((value) => Number.isFinite(value)).sort((a, b) => a - b);
+ if (finite.length === 0) return null;
+ const middle = Math.floor(finite.length / 2);
+ return finite.length % 2 === 0 ? (finite[middle - 1] + finite[middle]) / 2 : finite[middle];
+}
+
+function bar(part, total) {
+ const filled = total === 0 ? 0 : Math.round((part / total) * CHART_WIDTH);
+ return `${"█".repeat(filled)}${"░".repeat(CHART_WIDTH - filled)}`;
+}
+
+function extractTextContent(content) {
+ if (typeof content === "string") return content;
+ if (!Array.isArray(content)) return "";
+ return content
+ .filter((block) => block?.type === "text" && typeof block.text === "string")
+ .map((block) => block.text)
+ .join("\n");
+}
+
+function classifyRead(args) {
+ const normalizedArgs = args && typeof args === "object" ? args : {};
+ const hasOffset = Object.hasOwn(normalizedArgs, "offset") && normalizedArgs.offset !== undefined && normalizedArgs.offset !== null;
+ const hasLimit = Object.hasOwn(normalizedArgs, "limit") && normalizedArgs.limit !== undefined && normalizedArgs.limit !== null;
+ return {
+ path: typeof normalizedArgs.path === "string" ? normalizedArgs.path : "",
+ offset: hasOffset ? normalizedArgs.offset : null,
+ limit: hasLimit ? normalizedArgs.limit : null,
+ mode: hasOffset || hasLimit ? "partial" : "full",
+ };
+}
+
+function summarizeTimeBuckets(records, bucket) {
+ return summarizeGroups(records, (record) => getTimeBucket(record.timestampMs, bucket)).sort((a, b) => a.key.localeCompare(b.key));
+}
+
+function summarizeNormalizedTimeBuckets(records, bucket) {
+ return summarizeNormalizedTimeBucketsByKey(records, (record) => getTimeBucket(record.timestampMs, bucket));
+}
+
+function summarizeNormalizedTimeBucketsByKey(records, keyFn) {
+ const bucketGroups = new Map();
+ for (const record of records) {
+ const bucketKey = keyFn(record);
+ if (!bucketGroups.has(bucketKey)) bucketGroups.set(bucketKey, []);
+ bucketGroups.get(bucketKey).push(record);
+ }
+
+ return [...bucketGroups.entries()]
+ .map(([key, bucketRecords]) => {
+ const sessionGroups = new Map();
+ for (const record of bucketRecords) {
+ if (!sessionGroups.has(record.sessionFile)) sessionGroups.set(record.sessionFile, []);
+ sessionGroups.get(record.sessionFile).push(record);
+ }
+ const sessions = [...sessionGroups.values()].map((sessionRecords) => {
+ const full = sessionRecords.filter((record) => record.mode === "full").length;
+ const partial = sessionRecords.length - full;
+ return { reads: sessionRecords.length, full, partial, partialRate: sessionRecords.length === 0 ? null : partial / sessionRecords.length };
+ });
+ const reads = bucketRecords.length;
+ const full = bucketRecords.filter((record) => record.mode === "full").length;
+ const partial = reads - full;
+ const sessionCount = sessions.length;
+ const medianSessionPartialRate = median(sessions.map((session) => session.partialRate));
+ return {
+ key,
+ sessions: sessionCount,
+ reads,
+ full,
+ partial,
+ readsPerSession: sessionCount === 0 ? null : reads / sessionCount,
+ fullPerSession: sessionCount === 0 ? null : full / sessionCount,
+ partialPerSession: sessionCount === 0 ? null : partial / sessionCount,
+ medianSessionPartialRate,
+ };
+ })
+ .sort((a, b) => a.key.localeCompare(b.key));
+}
+
+function summarizeGroups(records, keyFn) {
+ const groups = new Map();
+ for (const record of records) {
+ const key = keyFn(record);
+ if (!groups.has(key)) groups.set(key, []);
+ groups.get(key).push(record);
+ }
+ return [...groups.entries()]
+ .map(([key, group]) => {
+ const full = group.filter((record) => record.mode === "full").length;
+ const partial = group.length - full;
+ const assistantMessages = new Set(group.map((record) => `${record.sessionFile}::${record.assistantEntryId}`)).size;
+ return { key, reads: group.length, assistantMessages, full, partial, fullRate: group.length === 0 ? null : full / group.length, partialRate: group.length === 0 ? null : partial / group.length };
+ })
+ .sort((a, b) => b.reads - a.reads || a.key.localeCompare(b.key));
+}
+
+function buildSummary(records, meta, options) {
+ const full = records.filter((record) => record.mode === "full").length;
+ const partial = records.length - full;
+ const providerStats = summarizeGroups(records, (record) => record.providerModel);
+ const timeStats = summarizeTimeBuckets(records, options.bucket);
+ const normalizedTimeStats = summarizeNormalizedTimeBuckets(records, options.bucket);
+ const timeOfDayStats = summarizeGroups(records, (record) => getHourOfDayBucket(record.timestampMs)).sort((a, b) => a.key.localeCompare(b.key));
+ const normalizedTimeOfDayStats = summarizeNormalizedTimeBucketsByKey(records, (record) => getHourOfDayBucket(record.timestampMs));
+ const timeStatsByProvider = providerStats.map((provider) => ({
+ providerModel: provider.key,
+ ...provider,
+ timeStats: summarizeTimeBuckets(
+ records.filter((record) => record.providerModel === provider.key),
+ options.bucket
+ ),
+ normalizedTimeStats: summarizeNormalizedTimeBuckets(
+ records.filter((record) => record.providerModel === provider.key),
+ options.bucket
+ ),
+ timeOfDayStats: summarizeGroups(
+ records.filter((record) => record.providerModel === provider.key),
+ (record) => getHourOfDayBucket(record.timestampMs)
+ ).sort((a, b) => a.key.localeCompare(b.key)),
+ normalizedTimeOfDayStats: summarizeNormalizedTimeBucketsByKey(
+ records.filter((record) => record.providerModel === provider.key),
+ (record) => getHourOfDayBucket(record.timestampMs)
+ ),
+ }));
+ return {
+ filters: { model: options.modelFilter ?? null, bucket: options.bucket },
+ scan: {
+ sessionsDir: meta.sessionsDir,
+ sessionFilesScanned: meta.sessionFilesScanned,
+ sessionFilesIncluded: meta.sessionFilesIncluded,
+ sessionFilesSkippedOlderThanSince: meta.sessionFilesSkippedOlderThanSince,
+ sessionFilesWithReadCalls: meta.sessionFilesWithReadCalls,
+ since: meta.since ? { ms: meta.since.ms, iso: formatIso(meta.since.ms), source: meta.since.source } : null,
+ malformedLines: meta.malformedLines,
+ },
+ counts: {
+ assistantMessagesWithReadCalls: new Set(records.map((record) => `${record.sessionFile}::${record.assistantEntryId}`)).size,
+ totalReadCalls: records.length,
+ full,
+ partial,
+ fullRate: records.length === 0 ? null : full / records.length,
+ partialRate: records.length === 0 ? null : partial / records.length,
+ },
+ providerStats,
+ timeStats,
+ normalizedTimeStats,
+ timeOfDayStats,
+ normalizedTimeOfDayStats,
+ timeStatsByProvider,
+ examples: records.slice(0, options.top),
+ };
+}
+
+function buildHumanReport(summary) {
+ const lines = [];
+ const originalLog = console.log;
+ console.log = (line = "") => lines.push(String(line));
+ try {
+ printHumanReport(summary);
+ } finally {
+ console.log = originalLog;
+ }
+ return lines.join("\n") + "\n";
+}
+
+function escapeHtml(text) {
+ return text.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
+}
+
+function printHtmlReport(summary) {
+ const text = buildHumanReport(summary);
+ console.log(`
+
+Read tool stats
+
+${escapeHtml(text)} `);
+}
+
+function printHumanReport(summary) {
+ const { scan, counts, timeStats, normalizedTimeStats, timeOfDayStats, normalizedTimeOfDayStats, timeStatsByProvider, filters } = summary;
+ console.log(`Scanned ${formatInt(scan.sessionFilesIncluded)} session files in ${scan.sessionsDir}`);
+ console.log(`Report timezone: ${REPORT_TIME_ZONE} (CET/CEST)`);
+ if (scan.since) {
+ console.log(`Session filter: files created at or after ${scan.since.iso} (${scan.since.source})`);
+ console.log(`Skipped older session files: ${formatInt(scan.sessionFilesSkippedOlderThanSince)} of ${formatInt(scan.sessionFilesScanned)}`);
+ }
+ console.log(`Found ${formatInt(counts.totalReadCalls)} read tool calls in ${formatInt(counts.assistantMessagesWithReadCalls)} assistant messages`);
+ if (filters.model) console.log(`Filters: model contains "${filters.model}"`);
+
+ console.log("\nFull vs partial reads");
+ console.log(` full: ${formatInt(counts.full).padStart(8)} ${formatPercent(counts.full, counts.totalReadCalls).padStart(6)} ${bar(counts.full, counts.totalReadCalls)}`);
+ console.log(` partial: ${formatInt(counts.partial).padStart(8)} ${formatPercent(counts.partial, counts.totalReadCalls).padStart(6)} ${bar(counts.partial, counts.totalReadCalls)}`);
+
+ console.log(`\nBy ${filters.bucket}`);
+ for (const group of timeStats) {
+ console.log(
+ ` ${group.key} reads=${formatInt(group.reads).padStart(5)} full=${formatPercent(group.full, group.reads).padStart(6)} partial=${formatPercent(group.partial, group.reads).padStart(6)} ${bar(group.partial, group.reads)}`
+ );
+ }
+
+ console.log("\nBy time of day");
+ for (const group of timeOfDayStats) {
+ console.log(
+ ` ${group.key} reads=${formatInt(group.reads).padStart(5)} full=${formatPercent(group.full, group.reads).padStart(6)} partial=${formatPercent(group.partial, group.reads).padStart(6)} ${bar(group.partial, group.reads)}`
+ );
+ }
+
+ console.log("\nBy time of day, session-normalized");
+ for (const group of normalizedTimeOfDayStats) {
+ console.log(
+ ` ${group.key} sessions=${formatInt(group.sessions).padStart(4)} reads/session=${formatRate(group.readsPerSession).padStart(5)} full/session=${formatRate(group.fullPerSession).padStart(5)} partial/session=${formatRate(group.partialPerSession).padStart(5)} medianSessionPartial=${group.medianSessionPartialRate === null ? "n/a" : formatPercent(group.medianSessionPartialRate, 1).padStart(6)} ${bar(group.medianSessionPartialRate ?? 0, 1)}`
+ );
+ }
+
+ console.log(`\nBy ${filters.bucket}, session-normalized`);
+ for (const group of normalizedTimeStats) {
+ console.log(
+ ` ${group.key} sessions=${formatInt(group.sessions).padStart(4)} reads/session=${formatRate(group.readsPerSession).padStart(5)} full/session=${formatRate(group.fullPerSession).padStart(5)} partial/session=${formatRate(group.partialPerSession).padStart(5)} medianSessionPartial=${group.medianSessionPartialRate === null ? "n/a" : formatPercent(group.medianSessionPartialRate, 1).padStart(6)} ${bar(group.medianSessionPartialRate ?? 0, 1)}`
+ );
+ }
+
+ console.log(`\nBy provider/model, then by ${filters.bucket}`);
+ for (const group of timeStatsByProvider) {
+ console.log(`\n${group.providerModel}`);
+ console.log(` total reads=${formatInt(group.reads)} assistantMessages=${formatInt(group.assistantMessages)}`);
+ console.log(` total full ${formatInt(group.full).padStart(8)} ${formatPercent(group.full, group.reads).padStart(6)} ${bar(group.full, group.reads)}`);
+ console.log(` total partial ${formatInt(group.partial).padStart(8)} ${formatPercent(group.partial, group.reads).padStart(6)} ${bar(group.partial, group.reads)}`);
+ console.log(` By ${filters.bucket}`);
+ for (const bucket of group.timeStats) {
+ console.log(
+ ` ${bucket.key} reads=${formatInt(bucket.reads).padStart(5)} full=${formatPercent(bucket.full, bucket.reads).padStart(6)} partial=${formatPercent(bucket.partial, bucket.reads).padStart(6)} ${bar(bucket.partial, bucket.reads)}`
+ );
+ }
+ console.log(` By ${filters.bucket}, session-normalized`);
+ for (const bucket of group.normalizedTimeStats) {
+ console.log(
+ ` ${bucket.key} sessions=${formatInt(bucket.sessions).padStart(4)} reads/session=${formatRate(bucket.readsPerSession).padStart(5)} full/session=${formatRate(bucket.fullPerSession).padStart(5)} partial/session=${formatRate(bucket.partialPerSession).padStart(5)} medianSessionPartial=${bucket.medianSessionPartialRate === null ? "n/a" : formatPercent(bucket.medianSessionPartialRate, 1).padStart(6)} ${bar(bucket.medianSessionPartialRate ?? 0, 1)}`
+ );
+ }
+ console.log(" By time of day");
+ for (const bucket of group.timeOfDayStats) {
+ console.log(
+ ` ${bucket.key} reads=${formatInt(bucket.reads).padStart(5)} full=${formatPercent(bucket.full, bucket.reads).padStart(6)} partial=${formatPercent(bucket.partial, bucket.reads).padStart(6)} ${bar(bucket.partial, bucket.reads)}`
+ );
+ }
+ console.log(" By time of day, session-normalized");
+ for (const bucket of group.normalizedTimeOfDayStats) {
+ console.log(
+ ` ${bucket.key} sessions=${formatInt(bucket.sessions).padStart(4)} reads/session=${formatRate(bucket.readsPerSession).padStart(5)} full/session=${formatRate(bucket.fullPerSession).padStart(5)} partial/session=${formatRate(bucket.partialPerSession).padStart(5)} medianSessionPartial=${bucket.medianSessionPartialRate === null ? "n/a" : formatPercent(bucket.medianSessionPartialRate, 1).padStart(6)} ${bar(bucket.medianSessionPartialRate ?? 0, 1)}`
+ );
+ }
+ }
+
+ if (scan.malformedLines > 0) {
+ console.log("\nParser notes");
+ console.log(` malformed lines skipped: ${formatInt(scan.malformedLines)}`);
+ }
+}
+
+async function scanSessions(sessionsDir, since) {
+ const records = [];
+ const meta = { sessionsDir, sessionFilesScanned: 0, sessionFilesIncluded: 0, sessionFilesSkippedOlderThanSince: 0, sessionFilesWithReadCalls: 0, since, malformedLines: 0 };
+
+ for await (const sessionFile of walkJsonlFiles(sessionsDir)) {
+ meta.sessionFilesScanned++;
+ const sessionTimestampMs = parseSessionFileTimestamp(sessionFile);
+ if (since && sessionTimestampMs !== null && sessionTimestampMs < since.ms) {
+ meta.sessionFilesSkippedOlderThanSince++;
+ continue;
+ }
+ meta.sessionFilesIncluded++;
+ let fileHadReadCall = false;
+ const input = createReadStream(sessionFile, { encoding: "utf8" });
+ const rl = createInterface({ input, crlfDelay: Infinity });
+
+ for await (const line of rl) {
+ if (!line.trim()) continue;
+ let entry;
+ try {
+ entry = JSON.parse(line);
+ } catch {
+ meta.malformedLines++;
+ continue;
+ }
+ if (entry?.type !== "message" || !entry.message) continue;
+ const message = entry.message;
+ if (message.role !== "assistant" || !Array.isArray(message.content)) continue;
+ for (const block of message.content) {
+ if (block?.type !== "toolCall" || block.name !== "read") continue;
+ fileHadReadCall = true;
+ records.push({
+ sessionFile,
+ assistantEntryId: entry.id,
+ toolCallId: typeof block.id === "string" ? block.id : "",
+ timestamp: entry.timestamp,
+ timestampMs: Date.parse(entry.timestamp) || sessionTimestampMs || 0,
+ api: typeof message.api === "string" ? message.api : null,
+ provider: typeof message.provider === "string" ? message.provider : "[unknown]",
+ model: typeof message.model === "string" ? message.model : "[unknown]",
+ providerModel: `${typeof message.provider === "string" ? message.provider : "[unknown]"}/${typeof message.model === "string" ? message.model : "[unknown]"}`,
+ ...classifyRead(block.arguments),
+ });
+ }
+ }
+ if (fileHadReadCall) meta.sessionFilesWithReadCalls++;
+ }
+ return { records, meta };
+}
+
+function applyFilters(records, options) {
+ return records.filter((record) => !options.modelFilter || record.providerModel.toLowerCase().includes(options.modelFilter.toLowerCase()));
+}
+
+async function main() {
+ const options = parseArgs(process.argv.slice(2));
+ if (options.help) {
+ printHelp();
+ return;
+ }
+ const sessionsDir = path.resolve(options.sessionsDir);
+ await fs.access(sessionsDir);
+ const since = await resolveAutoSinceMs(options);
+ const { records, meta } = await scanSessions(sessionsDir, since);
+ const filteredRecords = applyFilters(records, options);
+ const summary = buildSummary(filteredRecords, meta, options);
+ if (options.json) {
+ console.log(JSON.stringify(options.includeRecords ? { summary, records: filteredRecords } : { summary }, null, 2));
+ return;
+ }
+ if (options.text) {
+ printHumanReport(summary);
+ return;
+ }
+ printHtmlReport(summary);
+}
+
+main().catch((error) => {
+ console.error(error instanceof Error ? error.message : String(error));
+ process.exit(1);
+});
diff --git a/scripts/session-context-stats.mjs b/scripts/session-context-stats.mjs
new file mode 100755
index 000000000..e9ae425c3
--- /dev/null
+++ b/scripts/session-context-stats.mjs
@@ -0,0 +1,405 @@
+#!/usr/bin/env node
+
+import { createReadStream } from "node:fs";
+import { promises as fs } from "node:fs";
+import { homedir } from "node:os";
+import path from "node:path";
+import { createInterface } from "node:readline";
+
+const DEFAULT_SESSIONS_DIR = path.join(homedir(), ".pi/agent/sessions");
+const MODELS_GENERATED_PATH = path.join(process.cwd(), "packages/ai/src/models.generated.ts");
+const MODELS_CONFIG_PATH = path.join(homedir(), ".pi/agent/models.json");
+const REPORT_TIME_ZONE = "Europe/Berlin";
+const CHART_WIDTH = 40;
+
+function parseArgs(argv) {
+ const options = { sessionsDir: DEFAULT_SESSIONS_DIR, json: false, text: false, allSessions: false, since: undefined, modelFilter: undefined, modelPrefixes: [], bashContains: [], cwd: process.cwd(), help: false };
+ for (let i = 0; i < argv.length; i++) {
+ const arg = argv[i];
+ if (arg === "--help" || arg === "-h") options.help = true;
+ else if (arg === "--json") options.json = true;
+ else if (arg === "--text") options.text = true;
+ else if (arg === "--sessions-dir") options.sessionsDir = argv[++i];
+ else if (arg === "--since") options.since = argv[++i];
+ else if (arg === "--all-sessions") options.allSessions = true;
+ else if (arg === "--model") options.modelFilter = argv[++i];
+ else if (arg === "--model-prefix") options.modelPrefixes.push(argv[++i]);
+ else if (arg === "--bash-contains") options.bashContains.push(argv[++i]);
+ else if (arg === "--git-commit-or-push") options.bashContains.push("git commit", "git push");
+ else if (arg === "--cwd") options.cwd = argv[++i];
+ else if (arg === "--all-cwds") options.cwd = undefined;
+ else throw new Error(`Unknown argument: ${arg}`);
+ }
+ return options;
+}
+
+function printHelp() {
+ console.log(`Usage: node scripts/session-context-stats.mjs [options]
+
+Options:
+ --sessions-dir Sessions directory (default: ~/.pi/agent/sessions)
+ --model Filter provider/model by substring
+ --model-prefix Include provider/model prefixes, repeatable, e.g. openai-codex/
+ --bash-contains Include only sessions with bash tool calls containing text, repeatable
+ --git-commit-or-push Shortcut for --bash-contains "git commit" --bash-contains "git push"
+ --cwd Include only sessions whose cwd is this path (default: current cwd)
+ --all-cwds Include sessions from all cwd values
+ --since Only scan session files created at or after this ISO time
+ --all-sessions Scan all sessions (default already scans all)
+ --json Print JSON instead of HTML report
+ --text Print plain text instead of HTML report
+ -h, --help Show this help
+`);
+}
+
+function parseSessionFileTimestamp(sessionFile) {
+ const rawTimestamp = path.basename(sessionFile).split("_")[0];
+ if (!rawTimestamp) return null;
+ const ms = Date.parse(rawTimestamp.replace(/T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/, "T$1:$2:$3.$4Z"));
+ return Number.isFinite(ms) ? ms : null;
+}
+
+function getTimeZoneParts(ms) {
+ const parts = new Intl.DateTimeFormat("en-CA", {
+ timeZone: REPORT_TIME_ZONE,
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ }).formatToParts(new Date(ms));
+ return Object.fromEntries(parts.filter((part) => part.type !== "literal").map((part) => [part.type, part.value]));
+}
+
+function formatDay(ms) {
+ const parts = getTimeZoneParts(ms);
+ return `${parts.year}-${parts.month}-${parts.day}`;
+}
+
+function formatInt(value) {
+ return new Intl.NumberFormat("en-US").format(Math.round(value));
+}
+
+function formatNumber(value) {
+ return Number.isFinite(value) ? value.toFixed(2) : "n/a";
+}
+
+function formatPercent(value) {
+ return Number.isFinite(value) ? `${value.toFixed(1)}%` : "n/a";
+}
+
+function bar(percent) {
+ const clamped = Number.isFinite(percent) ? Math.max(0, Math.min(100, percent)) : 0;
+ const filled = Math.round((clamped / 100) * CHART_WIDTH);
+ return `${"█".repeat(filled)}${"░".repeat(CHART_WIDTH - filled)}`;
+}
+
+function median(values) {
+ const finite = values.filter((value) => Number.isFinite(value)).sort((a, b) => a - b);
+ if (finite.length === 0) return null;
+ const middle = Math.floor(finite.length / 2);
+ return finite.length % 2 === 0 ? (finite[middle - 1] + finite[middle]) / 2 : finite[middle];
+}
+
+async function* walkJsonlFiles(dir) {
+ const entries = await fs.readdir(dir, { withFileTypes: true });
+ entries.sort((a, b) => a.name.localeCompare(b.name));
+ for (const entry of entries) {
+ const fullPath = path.join(dir, entry.name);
+ if (entry.isDirectory()) yield* walkJsonlFiles(fullPath);
+ else if (entry.isFile() && entry.name.endsWith(".jsonl")) yield fullPath;
+ }
+}
+
+async function loadContextWindows() {
+ const windows = new Map();
+ const sources = [];
+ let text = "";
+ try {
+ text = await fs.readFile(MODELS_GENERATED_PATH, "utf8");
+ sources.push(MODELS_GENERATED_PATH);
+ } catch {
+ // Optional in non-repo usage.
+ }
+ const providerRegex = /\n\t"([^"]+)": \{([\s\S]*?\n\t)\},/g;
+ let providerMatch;
+ while ((providerMatch = providerRegex.exec(text)) !== null) {
+ const provider = providerMatch[1];
+ const body = providerMatch[2];
+ const modelRegex = /\n\t\t"([^"]+)": \{[\s\S]*?contextWindow: (\d+),/g;
+ let modelMatch;
+ while ((modelMatch = modelRegex.exec(body)) !== null) {
+ windows.set(`${provider}/${modelMatch[1]}`, Number(modelMatch[2]));
+ }
+ }
+
+ try {
+ const config = JSON.parse(await fs.readFile(MODELS_CONFIG_PATH, "utf8"));
+ sources.push(MODELS_CONFIG_PATH);
+ const providers = config?.providers && typeof config.providers === "object" ? config.providers : {};
+ for (const [providerName, provider] of Object.entries(providers)) {
+ const overrides = provider?.modelOverrides && typeof provider.modelOverrides === "object" ? provider.modelOverrides : {};
+ for (const [modelId, override] of Object.entries(overrides)) {
+ if (typeof override?.contextWindow === "number") windows.set(`${providerName}/${modelId}`, override.contextWindow);
+ }
+ if (Array.isArray(provider?.models)) {
+ for (const model of provider.models) {
+ if (typeof model?.id === "string" && typeof model.contextWindow === "number") windows.set(`${providerName}/${model.id}`, model.contextWindow);
+ }
+ }
+ }
+ } catch {
+ // Optional user config.
+ }
+
+ return { windows, sources };
+}
+
+function contextTokens(usage) {
+ if (!usage || typeof usage !== "object") return null;
+ const totalTokens = Number(usage.totalTokens ?? 0);
+ if (Number.isFinite(totalTokens) && totalTokens > 0) return totalTokens;
+ const input = Number(usage.input ?? 0);
+ const output = Number(usage.output ?? 0);
+ const cacheRead = Number(usage.cacheRead ?? 0);
+ const cacheWrite = Number(usage.cacheWrite ?? 0);
+ const value = input + output + cacheRead + cacheWrite;
+ return Number.isFinite(value) && value > 0 ? value : null;
+}
+
+async function scanSessions(sessionsDir, sinceMs, contextWindows, cwdFilter) {
+ const windows = contextWindows.windows;
+ const sessions = [];
+ const meta = { sessionsDir, sessionFilesScanned: 0, sessionFilesIncluded: 0, sessionFilesSkippedOlderThanSince: 0, malformedLines: 0 };
+ for await (const sessionFile of walkJsonlFiles(sessionsDir)) {
+ meta.sessionFilesScanned++;
+ const fileTimestampMs = parseSessionFileTimestamp(sessionFile);
+ if (sinceMs !== null && fileTimestampMs !== null && fileTimestampMs < sinceMs) {
+ meta.sessionFilesSkippedOlderThanSince++;
+ continue;
+ }
+ meta.sessionFilesIncluded++;
+ const session = {
+ sessionFile,
+ cwd: null,
+ startMs: fileTimestampMs ?? 0,
+ endMs: fileTimestampMs ?? 0,
+ providerModel: "[unknown]/[unknown]",
+ assistantMessages: 0,
+ userMessages: 0,
+ compactions: 0,
+ seenCompaction: false,
+ maxPromptTokens: null,
+ preFirstCompactionTokens: null,
+ maxContextUsagePercent: null,
+ preFirstCompactionUsagePercent: null,
+ contextWindow: null,
+ bashCommands: [],
+ over80: false,
+ over90: false,
+ over100: false,
+ };
+ const input = createReadStream(sessionFile, { encoding: "utf8" });
+ const rl = createInterface({ input, crlfDelay: Infinity });
+ for await (const line of rl) {
+ if (!line.trim()) continue;
+ let entry;
+ try {
+ entry = JSON.parse(line);
+ } catch {
+ meta.malformedLines++;
+ continue;
+ }
+ if (entry.type === "session" && typeof entry.cwd === "string") session.cwd = entry.cwd;
+ const entryMs = Date.parse(entry.timestamp ?? "");
+ if (Number.isFinite(entryMs)) {
+ if (!session.startMs || entryMs < session.startMs) session.startMs = entryMs;
+ if (!session.endMs || entryMs > session.endMs) session.endMs = entryMs;
+ }
+ if (entry.type === "compaction") {
+ session.compactions++;
+ if (typeof entry.tokensBefore === "number") {
+ session.maxPromptTokens = Math.max(session.maxPromptTokens ?? 0, entry.tokensBefore);
+ if (!session.seenCompaction) session.preFirstCompactionTokens = entry.tokensBefore;
+ }
+ session.seenCompaction = true;
+ continue;
+ }
+ if (entry.type !== "message" || !entry.message) continue;
+ const message = entry.message;
+ if (message.role === "assistant" && Array.isArray(message.content)) {
+ for (const block of message.content) {
+ if (block?.type !== "toolCall" || block.name !== "bash") continue;
+ const command = typeof block.arguments?.command === "string" ? block.arguments.command : "";
+ if (command) session.bashCommands.push(command);
+ }
+ }
+ if (message.role === "user") session.userMessages++;
+ if (message.role !== "assistant") continue;
+ session.assistantMessages++;
+ const provider = typeof message.provider === "string" ? message.provider : "[unknown]";
+ const model = typeof message.model === "string" ? message.model : "[unknown]";
+ session.providerModel = `${provider}/${model}`;
+ const contextWindow = windows.get(session.providerModel) ?? null;
+ if (contextWindow !== null) session.contextWindow = contextWindow;
+ const tokens = contextTokens(message.usage);
+ if (tokens !== null) {
+ session.maxPromptTokens = Math.max(session.maxPromptTokens ?? 0, tokens);
+ if (!session.seenCompaction) session.preFirstCompactionTokens = tokens;
+ }
+ }
+ if (session.maxPromptTokens !== null && session.contextWindow !== null) {
+ session.maxContextUsagePercent = (session.maxPromptTokens / session.contextWindow) * 100;
+ session.over80 = session.maxContextUsagePercent >= 80;
+ session.over90 = session.maxContextUsagePercent >= 90;
+ session.over100 = session.maxContextUsagePercent >= 100;
+ }
+ if (session.preFirstCompactionTokens !== null && session.contextWindow !== null) {
+ session.preFirstCompactionUsagePercent = (session.preFirstCompactionTokens / session.contextWindow) * 100;
+ }
+ if (!cwdFilter || path.resolve(session.cwd ?? "") === cwdFilter) sessions.push(session);
+ }
+ return { sessions, meta };
+}
+
+function summarizeGroups(sessions, keyFn) {
+ const groups = new Map();
+ for (const session of sessions) {
+ const key = keyFn(session);
+ if (!groups.has(key)) groups.set(key, []);
+ groups.get(key).push(session);
+ }
+ return [...groups.entries()].map(([key, group]) => summarizeSessionGroup(key, group)).sort((a, b) => a.key.localeCompare(b.key));
+}
+
+function summarizeSessionGroup(key, group) {
+ const withUsage = group.filter((session) => session.maxContextUsagePercent !== null);
+ const withTokens = group.filter((session) => session.maxPromptTokens !== null);
+ const withPreCompactionUsage = group.filter((session) => session.preFirstCompactionUsagePercent !== null);
+ const compactions = group.filter((session) => session.compactions > 0).length;
+ const totalCompactions = group.reduce((sum, session) => sum + session.compactions, 0);
+ const contextWindows = [...new Set(group.map((session) => session.contextWindow).filter((value) => value !== null))].sort((a, b) => a - b);
+ return {
+ key,
+ sessions: group.length,
+ contextWindows,
+ assistantMessages: group.reduce((sum, session) => sum + session.assistantMessages, 0),
+ avgTurns: group.reduce((sum, session) => sum + session.userMessages, 0) / group.length,
+ avgDurationMinutes: group.reduce((sum, session) => sum + Math.max(0, session.endMs - session.startMs) / 60000, 0) / group.length,
+ avgMaxPromptTokens: withTokens.length === 0 ? null : withTokens.reduce((sum, session) => sum + (session.maxPromptTokens ?? 0), 0) / withTokens.length,
+ medianMaxPromptTokens: median(withTokens.map((session) => session.maxPromptTokens)),
+ avgMaxContextUsagePercent: withUsage.length === 0 ? null : withUsage.reduce((sum, session) => sum + (session.maxContextUsagePercent ?? 0), 0) / withUsage.length,
+ medianMaxContextUsagePercent: median(withUsage.map((session) => session.maxContextUsagePercent)),
+ medianPreFirstCompactionUsagePercent: median(withPreCompactionUsage.map((session) => session.preFirstCompactionUsagePercent)),
+ contextKnownSessions: withUsage.length,
+ sessionsWithCompaction: compactions,
+ totalCompactions,
+ compactionRate: (compactions / group.length) * 100,
+ over80: group.filter((session) => session.over80).length,
+ over90: group.filter((session) => session.over90).length,
+ over100: group.filter((session) => session.over100).length,
+ };
+}
+
+function buildSummary(sessions, meta, options) {
+ const lowerPrefixes = options.modelPrefixes.map((prefix) => prefix.toLowerCase());
+ const bashContains = options.bashContains.map((text) => text.toLowerCase());
+ const filtered = sessions.filter((session) => {
+ const providerModel = session.providerModel.toLowerCase();
+ if (options.modelFilter && !providerModel.includes(options.modelFilter.toLowerCase())) return false;
+ if (lowerPrefixes.length > 0 && !lowerPrefixes.some((prefix) => providerModel.startsWith(prefix))) return false;
+ if (bashContains.length > 0) {
+ const commands = session.bashCommands.map((command) => command.toLowerCase());
+ if (!bashContains.some((text) => commands.some((command) => command.includes(text)))) return false;
+ }
+ return true;
+ });
+ return {
+ filters: { model: options.modelFilter ?? null, modelPrefixes: options.modelPrefixes, bashContains: options.bashContains, cwd: options.cwd ? path.resolve(options.cwd) : null },
+ scan: { ...meta, timezone: REPORT_TIME_ZONE },
+ totals: summarizeSessionGroup("total", filtered),
+ byDay: summarizeGroups(filtered, (session) => formatDay(session.startMs)),
+ byModel: summarizeGroups(filtered, (session) => session.providerModel).sort((a, b) => b.sessions - a.sessions || a.key.localeCompare(b.key)),
+ byModelDay: summarizeGroups(filtered, (session) => session.providerModel).sort((a, b) => b.sessions - a.sessions || a.key.localeCompare(b.key)).map((model) => ({
+ ...model,
+ byDay: summarizeGroups(
+ filtered.filter((session) => session.providerModel === model.key),
+ (session) => formatDay(session.startMs)
+ ),
+ })),
+ };
+}
+
+function lineForGroup(group, indent = " ") {
+ return `${indent}${group.key} sessions=${formatInt(group.sessions).padStart(4)} avgTurns=${formatNumber(group.avgTurns).padStart(5)} avgMin=${formatNumber(group.avgDurationMinutes).padStart(6)} avgMaxTok=${group.avgMaxPromptTokens === null ? "n/a" : formatInt(group.avgMaxPromptTokens).padStart(7)} medMaxCtx=${group.medianMaxContextUsagePercent === null ? "n/a" : formatPercent(group.medianMaxContextUsagePercent).padStart(6)} medPreCompactCtx=${group.medianPreFirstCompactionUsagePercent === null ? "n/a" : formatPercent(group.medianPreFirstCompactionUsagePercent).padStart(6)} avgCtx=${group.avgMaxContextUsagePercent === null ? "n/a" : formatPercent(group.avgMaxContextUsagePercent).padStart(6)} compact=${formatPercent(group.compactionRate).padStart(6)} over90=${formatInt(group.over90).padStart(3)} ${bar(group.medianMaxContextUsagePercent ?? 0)}`;
+}
+
+function buildTextReport(summary) {
+ const lines = [];
+ lines.push(`Scanned ${formatInt(summary.scan.sessionFilesIncluded)} session files in ${summary.scan.sessionsDir}`);
+ lines.push(`Report timezone: ${summary.scan.timezone} (CET/CEST)`);
+ lines.push(`Context window sources: ${summary.scan.contextWindowSources.join(", ") || "none"}`);
+ if (summary.filters.model) lines.push(`Filters: model contains "${summary.filters.model}"`);
+ if (summary.filters.modelPrefixes.length > 0) lines.push(`Filters: model prefixes = ${summary.filters.modelPrefixes.join(", ")}`);
+ if (summary.filters.bashContains.length > 0) lines.push(`Filters: bash contains any of = ${summary.filters.bashContains.join(", ")}`);
+ if (summary.filters.cwd) lines.push(`Filters: cwd = ${summary.filters.cwd}`);
+ lines.push("Context usage parses full session JSONL files. max context uses max assistant usage.totalTokens per session, falling back to input + output + cacheRead + cacheWrite, plus compaction tokensBefore. medPreCompactCtx uses the last assistant usage before the first compaction, or the first compaction tokensBefore when present, divided by model contextWindow from packages/ai/src/models.generated.ts when known.");
+ lines.push("");
+ lines.push("Totals");
+ lines.push(lineForGroup(summary.totals));
+ lines.push("");
+ lines.push("By day");
+ for (const group of summary.byDay) lines.push(lineForGroup(group));
+ lines.push("");
+ lines.push("By model");
+ for (const group of summary.byModel) lines.push(lineForGroup(group));
+ lines.push("");
+ lines.push("By model, then by day");
+ for (const model of summary.byModelDay) {
+ lines.push("");
+ const contextWindowLabel = model.contextWindows.length === 0 ? "unknown" : model.contextWindows.map((value) => formatInt(value)).join(", ");
+ lines.push(`${model.key} contextWindow=${contextWindowLabel}`);
+ lines.push(lineForGroup(model, " total "));
+ for (const group of model.byDay) lines.push(lineForGroup(group, " "));
+ }
+ if (summary.scan.malformedLines > 0) {
+ lines.push("");
+ lines.push(`Malformed lines skipped: ${formatInt(summary.scan.malformedLines)}`);
+ }
+ return `${lines.join("\n")}\n`;
+}
+
+function escapeHtml(text) {
+ return text.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
+}
+
+function printHtmlReport(summary) {
+ console.log(`
+
+Session context stats
+
+${escapeHtml(buildTextReport(summary))} `);
+}
+
+async function main() {
+ const options = parseArgs(process.argv.slice(2));
+ if (options.help) {
+ printHelp();
+ return;
+ }
+ const sinceMs = options.since ? Date.parse(options.since) : null;
+ if (options.since && !Number.isFinite(sinceMs)) throw new Error(`Invalid --since value: ${options.since}`);
+ const contextWindows = await loadContextWindows();
+ const cwdFilter = options.cwd ? path.resolve(options.cwd) : undefined;
+ const { sessions, meta } = await scanSessions(path.resolve(options.sessionsDir), sinceMs, contextWindows, cwdFilter);
+ const summary = buildSummary(sessions, { ...meta, contextWindowSources: contextWindows.sources }, options);
+ if (options.json) console.log(JSON.stringify(summary, null, 2));
+ else if (options.text) console.log(buildTextReport(summary));
+ else printHtmlReport(summary);
+}
+
+main().catch((error) => {
+ console.error(error instanceof Error ? error.message : String(error));
+ process.exit(1);
+});
diff --git a/scripts/sync-versions.js b/scripts/sync-versions.js
index 77d2d44ea..136ed088a 100644
--- a/scripts/sync-versions.js
+++ b/scripts/sync-versions.js
@@ -1,7 +1,7 @@
#!/usr/bin/env node
/**
- * Syncs ALL @mariozechner/* package dependency versions to match their current versions.
+ * Syncs all workspace package dependency versions to match their current versions.
* This ensures lockstep versioning across the monorepo.
*/
diff --git a/tsconfig.json b/tsconfig.json
index e30d1e633..ff748f9e2 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -4,22 +4,22 @@
"noEmit": true,
"paths": {
"*": ["./*"],
- "@mariozechner/pi-ai": ["./packages/ai/src/index.ts"],
- "@mariozechner/pi-ai/oauth": ["./packages/ai/src/oauth.ts"],
- "@mariozechner/pi-ai/*": ["./packages/ai/src/*.ts", "./packages/ai/src/providers/*.ts"],
- "@mariozechner/pi-ai/dist/*": ["./packages/ai/src/*"],
- "@mariozechner/pi-agent-core": ["./packages/agent/src/index.ts"],
- "@mariozechner/pi-agent-core/*": ["./packages/agent/src/*"],
- "@mariozechner/pi-coding-agent": ["./packages/coding-agent/src/index.ts"],
- "@mariozechner/pi-coding-agent/hooks": ["./packages/coding-agent/src/core/hooks/index.ts"],
- "@mariozechner/pi-coding-agent/*": ["./packages/coding-agent/src/*"],
+ "@earendil-works/pi-ai": ["./packages/ai/src/index.ts"],
+ "@earendil-works/pi-ai/oauth": ["./packages/ai/src/oauth.ts"],
+ "@earendil-works/pi-ai/*": ["./packages/ai/src/*.ts", "./packages/ai/src/providers/*.ts"],
+ "@earendil-works/pi-ai/dist/*": ["./packages/ai/src/*"],
+ "@earendil-works/pi-agent-core": ["./packages/agent/src/index.ts"],
+ "@earendil-works/pi-agent-core/*": ["./packages/agent/src/*"],
+ "@earendil-works/pi-coding-agent": ["./packages/coding-agent/src/index.ts"],
+ "@earendil-works/pi-coding-agent/hooks": ["./packages/coding-agent/src/core/hooks/index.ts"],
+ "@earendil-works/pi-coding-agent/*": ["./packages/coding-agent/src/*"],
"typebox": ["./node_modules/typebox"],
- "@mariozechner/pi-tui": ["./packages/tui/src/index.ts"],
- "@mariozechner/pi-tui/*": ["./packages/tui/src/*"],
- "@mariozechner/pi-web-ui": ["./packages/web-ui/src/index.ts"],
- "@mariozechner/pi-web-ui/*": ["./packages/web-ui/src/*"],
- "@mariozechner/pi-agent-old": ["./packages/agent-old/src/index.ts"],
- "@mariozechner/pi-agent-old/*": ["./packages/agent-old/src/*"]
+ "@earendil-works/pi-tui": ["./packages/tui/src/index.ts"],
+ "@earendil-works/pi-tui/*": ["./packages/tui/src/*"],
+ "@earendil-works/pi-web-ui": ["./packages/web-ui/src/index.ts"],
+ "@earendil-works/pi-web-ui/*": ["./packages/web-ui/src/*"],
+ "@earendil-works/pi-agent-old": ["./packages/agent-old/src/index.ts"],
+ "@earendil-works/pi-agent-old/*": ["./packages/agent-old/src/*"]
}
},
"include": ["packages/*/src/**/*", "packages/*/test/**/*", "packages/coding-agent/examples/**/*"],