diff --git a/.changeset/bulk-session-mutations.md b/.changeset/bulk-session-mutations.md new file mode 100644 index 0000000..ac5beb8 --- /dev/null +++ b/.changeset/bulk-session-mutations.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Improve bulk session archive and delete reliability by adding true bulk mutation support for large session selections. diff --git a/.changeset/federated-pi-packages.md b/.changeset/federated-pi-packages.md new file mode 100644 index 0000000..89153f5 --- /dev/null +++ b/.changeset/federated-pi-packages.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Manage Pi packages from Settings on the selected PI WEB machine, including federated remote machines, while keeping gateway-local Settings scopes clear. diff --git a/.changeset/fix-fish-doctor-version-check.md b/.changeset/fix-fish-doctor-version-check.md deleted file mode 100644 index 8163c01..0000000 --- a/.changeset/fix-fish-doctor-version-check.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@jmfederico/pi-web": patch ---- - -Fix `pi-web doctor` "can find npm/pi" checks on fish. The `--version` check -wrapped the version command in a POSIX subshell `(cmd --version 2>&1 || true)`, -which fish parses as a command substitution in command position and rejects -(`command substitutions not allowed in command position`), producing a false -negative. Emit fish's `begin; ...; end` grouping when the service shell is fish. diff --git a/.changeset/fuzzy-session-starts.md b/.changeset/fuzzy-session-starts.md new file mode 100644 index 0000000..48d9921 --- /dev/null +++ b/.changeset/fuzzy-session-starts.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Improve session-start feedback so concurrent new sessions stay visible without disrupting session-list navigation. diff --git a/.changeset/git-inline-diff-highlights.md b/.changeset/git-inline-diff-highlights.md deleted file mode 100644 index 26e3890..0000000 --- a/.changeset/git-inline-diff-highlights.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@jmfederico/pi-web": patch ---- - -Highlight within-line changes in the Git diff viewer. diff --git a/.changeset/horizontal-tool-targets.md b/.changeset/horizontal-tool-targets.md new file mode 100644 index 0000000..e57abff --- /dev/null +++ b/.changeset/horizontal-tool-targets.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Show full chat tool file paths and commands in horizontally scrollable headers, repeat them in expanded tool details, and keep result output horizontally scrollable. diff --git a/.changeset/inherit-dispatch-model-for-spawned-sessions.md b/.changeset/inherit-dispatch-model-for-spawned-sessions.md new file mode 100644 index 0000000..c2d9a4b --- /dev/null +++ b/.changeset/inherit-dispatch-model-for-spawned-sessions.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Make spawned and tracked subsessions inherit the dispatching session's current model instead of falling back to the last globally selected model. diff --git a/.changeset/manage-pi-packages.md b/.changeset/manage-pi-packages.md new file mode 100644 index 0000000..46bd28d --- /dev/null +++ b/.changeset/manage-pi-packages.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Add PI WEB settings for managing Pi packages separately from PI WEB plugin enablement, including install/remove/update flows and browser/session reload guidance. diff --git a/.changeset/manual-workspace-uploads.md b/.changeset/manual-workspace-uploads.md deleted file mode 100644 index 033fb63..0000000 --- a/.changeset/manual-workspace-uploads.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@jmfederico/pi-web": patch ---- - -Add manual Files panel uploads with direct drag/drop, an options flow from the Upload button, safe non-overwrite defaults, visible per-file progress/error reporting with clear failed/cancelled terminal states, and project-local default destinations. diff --git a/.changeset/persist-subsession-links.md b/.changeset/persist-subsession-links.md deleted file mode 100644 index 8199eaa..0000000 --- a/.changeset/persist-subsession-links.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@jmfederico/pi-web": patch ---- - -Persist tracked subsession links in session history so parents can list, check, and read child sessions after the session daemon restarts, and reopened children can resume parent notifications. diff --git a/.changeset/plugin-api-completeness.md b/.changeset/plugin-api-completeness.md deleted file mode 100644 index 5a3b3f3..0000000 --- a/.changeset/plugin-api-completeness.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@jmfederico/pi-web": patch ---- - -Add workspace file mutation (`files.writeFile`, `files.deleteFile`, `files.moveFile`) and prompt editor (`prompt.insertText`, `prompt.getText`, `prompt.getSelection`) APIs to the plugin system. File mutations work for local and federated machines, enforce workspace path safety, and auto-refresh the File Explorer. diff --git a/.changeset/plugin-panel-prompt-context.md b/.changeset/plugin-panel-prompt-context.md deleted file mode 100644 index e7ee9c2..0000000 --- a/.changeset/plugin-panel-prompt-context.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@jmfederico/pi-web": patch ---- - -Expose the plugin prompt editor helper in workspace panel contexts so panel interactions can insert text into the current prompt. diff --git a/.changeset/prompt-editor-stable-during-streaming.md b/.changeset/prompt-editor-stable-during-streaming.md new file mode 100644 index 0000000..a4bc709 --- /dev/null +++ b/.changeset/prompt-editor-stable-during-streaming.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Keep the chat prompt input stable during streaming so mobile touch gestures (such as the iOS long-press paste/edit callout) are no longer interrupted. Session status and activity updates are now coalesced into a single render per animation frame instead of one per token, the prompt editor ignores status changes that do not affect what it displays, and per-keystroke draft state no longer triggers surrounding re-renders. diff --git a/.changeset/quiet-ios-input-zoom.md b/.changeset/quiet-ios-input-zoom.md new file mode 100644 index 0000000..90adbfb --- /dev/null +++ b/.changeset/quiet-ios-input-zoom.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Prevent iOS Safari from zooming into small text inputs across the web UI. diff --git a/.changeset/raise-min-pi-version-0-80.md b/.changeset/raise-min-pi-version-0-80.md new file mode 100644 index 0000000..91a4e3a --- /dev/null +++ b/.changeset/raise-min-pi-version-0-80.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Raise the minimum supported Pi version to 0.80, removing reliance on Pi's deprecated `pi-ai` compat API for session-name generation in favor of the stable `pi-agent-core` streaming interface. diff --git a/.changeset/remove-updates-beta-badge.md b/.changeset/remove-updates-beta-badge.md new file mode 100644 index 0000000..31ebee3 --- /dev/null +++ b/.changeset/remove-updates-beta-badge.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Promote the Updates tab to stable by removing its beta label while keeping update message counts visible. diff --git a/.changeset/responsive-package-settings.md b/.changeset/responsive-package-settings.md new file mode 100644 index 0000000..d1f9e6d --- /dev/null +++ b/.changeset/responsive-package-settings.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Keep gateway Settings panels responsive while selected-machine Pi packages load or fail separately, report Pi package-management support through runtime capabilities, guide remote Pi package-management UI when support is known unavailable, and serialize Pi package mutations to avoid concurrent settings/install-root races within a PI WEB server process. diff --git a/.changeset/selected-machine-settings.md b/.changeset/selected-machine-settings.md new file mode 100644 index 0000000..0c8161b --- /dev/null +++ b/.changeset/selected-machine-settings.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Make Settings edit machine-scoped PI WEB config on the selected machine for session daemon tools, plugin enablement, external path access, and upload defaults while keeping gateway/browser-only settings local, and show those forms as unavailable when a remote machine does not advertise support. diff --git a/.changeset/session-id-suffix-labels.md b/.changeset/session-id-suffix-labels.md new file mode 100644 index 0000000..4474f2f --- /dev/null +++ b/.changeset/session-id-suffix-labels.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Show the random-looking suffix for unnamed sessions so newly created empty sessions are easier to distinguish. diff --git a/.changeset/session-runtime-reload-command.md b/.changeset/session-runtime-reload-command.md new file mode 100644 index 0000000..c352987 --- /dev/null +++ b/.changeset/session-runtime-reload-command.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Add `/reload` support for PI WEB sessions so installed Pi package resources can be refreshed in existing sessions without restarting the session daemon, while keeping browser plugin reload guidance separate. diff --git a/.changeset/session-start-persistence.md b/.changeset/session-start-persistence.md new file mode 100644 index 0000000..33e8be4 --- /dev/null +++ b/.changeset/session-start-persistence.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Create editable chats immediately when starting sessions, open the chat right away on mobile, queue sends until the backend session is ready, reconcile concurrent session-created broadcasts, and use server-backed persistence signals for session archive/delete/reload actions. diff --git a/.changeset/settings-panel-layout.md b/.changeset/settings-panel-layout.md new file mode 100644 index 0000000..0135be0 --- /dev/null +++ b/.changeset/settings-panel-layout.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Standardize Settings tabs so descriptions, notices, and controls render in a consistent order, with unavailable remote settings hiding blocked controls. diff --git a/CHANGELOG.md b/CHANGELOG.md index 7617ac9..6393e2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # @jmfederico/pi-web +## 1.202606.7 + +### Patch Changes + +- b17faeb: Improve chat, prompt, and session text rendering for RTL and mixed-direction content. +- 7e812aa: Allow chat composer attachments to save and mention general files while preserving native inline image delivery for supported image-only batches. +- 47c9b66: Fix `pi-web doctor` "can find npm/pi" checks on fish. The `--version` check + wrapped the version command in a POSIX subshell `(cmd --version 2>&1 || true)`, + which fish parses as a command substitution in command position and rejects + (`command substitutions not allowed in command position`), producing a false + negative. Emit fish's `begin; ...; end` grouping when the service shell is fish. +- b14205e: Highlight within-line changes in the Git diff viewer. +- cb13af4: Add a manual sessions cleanup flow that previews and confirms archiving idle sessions and deleting old archived sessions, with per-project selection and capability guidance for unsupported machines. Actions can now expose disabled reasons so unavailable remote-machine actions stay visible with an explanation. +- e46d9ec: Add manual Files panel uploads with direct drag/drop, an options flow from the Upload button, safe non-overwrite defaults, visible per-file progress/error reporting with clear failed/cancelled terminal states, and project-local default destinations. +- 32ea809: Add a Keyboard shortcuts setting for choosing whether Enter sends chat messages or inserts new lines in this browser, with Shift+Enter performing the opposite action when supported, while preserving the desktop-vs-mobile default (desktop Enter sends; mobile/coarse/narrow Enter inserts a new line). +- a99696b: Persist tracked subsession links in session history so parents can list, check, and read child sessions after the session daemon restarts, and reopened children can resume parent notifications. +- 27a3b2b: Add workspace file mutation (`files.writeFile`, `files.deleteFile`, `files.moveFile`) and prompt editor (`prompt.insertText`, `prompt.getText`, `prompt.getSelection`) APIs to the plugin system. File mutations work for local and federated machines, enforce workspace path safety, and auto-refresh the File Explorer. +- 9980027: Expose the plugin prompt editor helper in workspace panel contexts so panel interactions can insert text into the current prompt. + ## 1.202606.6 ### Patch Changes diff --git a/README.md b/README.md index c1b2f30..165d27d 100644 --- a/README.md +++ b/README.md @@ -111,13 +111,19 @@ Read more: [Remote-first development](https://pi-web.dev/remote-first) ## Machines and fleets -PI WEB can register other PI WEB runtimes as remote machines. One browser-facing PI WEB instance can proxy projects, files, git state, sessions, terminals, and activity from trusted remote machines. +PI WEB can register other PI WEB runtimes as remote machines. One browser-facing PI WEB instance can proxy projects, files, git state, sessions, terminals, activity, Pi package management, and selected-machine settings from trusted remote machines. + +When a remote machine is selected, Settings tabs label their target. Pi packages, PI WEB plugin enablement, session daemon toggles, external file access, and upload defaults target the selected machine. Gateway/server settings such as host, port, allowed hosts, registered machines/tokens, and keyboard shortcuts stay local to the gateway/browser. Read more: [Fleet and machines guide](https://pi-web.dev/machines) ## Plugins -PI WEB supports trusted local browser-side plugins that can add actions, workspace panels, and workspace metadata. +PI WEB supports trusted browser-side PI WEB plugins that can add actions, workspace panels, and workspace metadata. + +Pi packages are managed separately through Pi's package manager or **Settings → Pi packages**. In a federated setup, the Pi packages panel targets the selected machine and labels where installs, updates, or removals will run. Use **Settings → PI WEB plugins** to enable or disable discovered browser plugins on the selected machine. + +After installing, updating, or removing a Pi package, type `/reload` in each idle PI WEB session on that machine to refresh Pi runtime resources such as extensions, skills, prompt templates, themes, and context/system prompt files. Reload the browser page separately for newly discovered or changed PI WEB plugins. Read more: [Plugin API](https://pi-web.dev/plugins) @@ -136,7 +142,7 @@ Project-local PI WEB config lives at: /.pi-web/config.json ``` -Common configuration includes host/port, path access, uploads, plugins, shortcuts, and session daemon options. +Common configuration includes host/port, path access, uploads, PI WEB plugin enablement, shortcuts, and session daemon options. In Settings, machine-affecting config targets the selected machine; gateway host/port/allowed-hosts, remote machine registration, tokens, and keyboard shortcuts stay local. Read more: [Configuration reference](https://pi-web.dev/config) diff --git a/docs/config.html b/docs/config.html index 0062f9c..81a6443 100644 --- a/docs/config.html +++ b/docs/config.html @@ -3,10 +3,10 @@ - Configure PI WEB — config files, paths, and session tools + Configure PI WEB — config files, uploads, paths, and session tools @@ -14,7 +14,7 @@ @@ -23,7 +23,7 @@ @@ -80,8 +80,8 @@

Configure PI WEB where your agents work.

PI WEB configuration covers the machine-local and project-local settings you usually need: bind address, - trusted development-host settings, UI preferences, plugin enablement, file-explorer path access, upload - limits, and session-daemon tools. + trusted development-host settings, UI preferences, PI WEB plugin enablement, file-explorer path access, + manual upload defaults, upload limits, and session-daemon tools.

@@ -96,6 +96,7 @@ Project config Config matrix External path access + Manual uploads Session tools Completion tools @@ -109,8 +110,20 @@
  • Project config: <project>/.pi-web/config.json for commit-able project settings.
  • - Each PI WEB machine has its own config. When using Fleet/machine federation, edit a remote machine's - config by opening that machine directly or changing files on that machine. + Each PI WEB machine has its own config. When using Fleet/machine federation, Settings uses the selected + machine for config that affects work running there: session daemon tools, PI WEB plugin enablement, + external path access, and upload defaults. Gateway/browser-only settings stay local to the gateway: + keyboard shortcuts, remote machine registry/tokens, and gateway host/port/allowed-hosts. Remote servers + that do not advertise selected-machine settings support report those settings as unavailable instead of + silently falling back to the gateway. +

    +

    + Pi package settings are separate from PI WEB config. They live in Pi's package-manager settings on the + target machine and are managed by Pi (pi install, pi remove, pi update) or + Settings → Pi packages. In a federated setup, Settings → Pi packages + targets the currently selected machine. The PI WEB plugins config key only enables or + disables discovered PI WEB browser plugins on the machine whose config you are editing; it does not + install, remove, or update Pi packages.

    If you installed services with a custom config path, rerun @@ -122,21 +135,27 @@

    Precedence and reloads

    -

    Runtime values are resolved in this order:

    +

    Machine-global runtime values are resolved in this order:

    -
    defaults → config file → environment overrides
    +
    defaults → global config file → environment overrides
    +

    + Supported project-local settings are then applied for that project's workspaces. For upload defaults, + <project>/.pi-web/config.json overrides the global value. +

    Environment overrides include PI_WEB_HOST, PI_WEB_PORT / PORT, PI_WEB_ALLOWED_HOSTS, PI_WEB_MAX_UPLOAD_BYTES, PI_WEB_SPAWN_SESSIONS, and PI_WEB_SUBSESSIONS.

    @@ -144,9 +163,11 @@

    Global config example

    - pi-web install creates the initial file. You can also save settings from - Settings → General, Settings → Plugins, Settings → Keyboard, - and Settings → Session daemon. + pi-web install creates the initial file. You can also save PI WEB config settings from + Settings → General, Settings → PI WEB plugins, + Settings → Keyboard, and Settings → Session daemon. Machine-affecting + Settings fields target the selected machine; gateway host/port/allowed-hosts and keyboard shortcuts stay + local. Pi package operations live separately under Settings → Pi packages.

    @@ -159,6 +180,9 @@ "pathAccess": { "allowedPaths": ["~/SDKs", "/opt/reference"] }, + "uploads": { + "defaultFolder": ".pi-web/uploads" + }, "maxUploadBytes": 67108864, "spawnSessions": true, "subsessions": false, @@ -179,8 +203,7 @@

    Project-local config

    Project-local config lives at <project>/.pi-web/config.json. Use it for settings that should - follow a repository. When a project config defines pathAccess, PI WEB merges it after the - global path list. + follow a repository.

    @@ -191,13 +214,25 @@ "version": 1, "pathAccess": { "allowedPaths": ["~/SDKs", "/opt/reference"] + }, + "uploads": { + "defaultFolder": "manual/uploads" } }

    - Project-local pathAccess.allowedPaths entries must still be host-absolute or - ~-prefixed; relative roots are not supported. Plugins may own separate project files, such as - .pi-web/tasks.json for the built-in Workspace Tasks plugin. + Project-local pathAccess.allowedPaths entries are merged after the global list and deduplicated. + Paths must still be host-absolute or ~-prefixed; relative roots are not supported. +

    +

    + Project-local uploads.defaultFolder overrides the global upload destination for workspaces in + that project. Current PI WEB servers include this workspace-effective value on local and federated + workspace responses; older remote servers may omit it and the browser falls back to the global/default + upload folder. +

    +

    + Plugins may own separate project files, such as .pi-web/tasks.json for the built-in Workspace + Tasks plugin.

    @@ -206,7 +241,11 @@

    Use this table as the quick reference for where a setting can live, which environment variable overrides it, and whether project-local config overrides or merges with global config. Rows with JSON key - are runtime-only environment variables, not config-file keys. + are runtime-only environment variables, not config-file keys. Global means + machine-global. In Settings, selected-machine-safe global keys (pathAccess, uploads, + maxUploadBytes, spawnSessions, subsessions, and plugins) + are edited for the selected machine; gateway host/port/allowed-hosts, keyboard shortcuts, and machine + registry/tokens stay local.

    @@ -254,13 +293,21 @@ + + + + + + + + - + @@ -268,7 +315,7 @@ - + @@ -276,10 +323,10 @@ - + - + @@ -414,12 +461,41 @@ realpath, requires roots to be existing directories, and rejects symlink escapes outside the allowed roots.

    +

    + In Settings → General, external filesystem roots are saved on the selected machine. + Gateway host, port, and allowed-hosts fields stay on the gateway config. +

    This is not a sandbox for the underlying Pi Coding Agent or your OS user. It only controls PI WEB UI/API file exposure outside a workspace. Add only roots you trust PI WEB to list and read through the browser UI.
    +
    +

    Manual upload defaults

    +

    + The Files panel can upload files by dropping them onto the panel or by using the toolbar + Upload button. uploads.defaultFolder sets the workspace-effective default + destination. The built-in default is .pi-web/uploads; a project-local value overrides the + global value for workspaces in that project. +

    +

    + The value must be a non-empty workspace-relative folder. PI WEB normalizes repeated separators and + backslashes to /, and rejects absolute paths or .. traversal. In the upload + dialog only, clearing the destination field uploads that batch to the workspace root. +

    +

    + Manual uploads use the workspace file-write path: paths stay workspace-relative, parent folder creation is + enabled by default, and overwrite is disabled by default. Browser-owned XHR progress is shown per + batch/file, and conflicts or errors stay visible in the upload progress UI. +

    +

    + For machine federation, Settings saves the global upload default on the selected machine. Current remote + PI WEB servers also return workspace-effective upload defaults on workspace responses; older remote + servers may omit them and the browser falls back to the global/default upload folder. +

    +
    +

    Session daemon tools

    spawnSessions

    @@ -440,6 +516,10 @@ Tracked subsessions let an agent delegate work to child sessions, get notified when children stop working, and inspect their transcripts. Restart the session daemon after changing this setting.

    +

    + In Settings → Session daemon, these keys are saved on the selected machine. Restart the + session daemon on that machine after changing them. +

    Environment override: PI_WEB_SUBSESSIONS=0|1|true|false.

    diff --git a/docs/config.md b/docs/config.md index 2707a9c..61553c4 100644 --- a/docs/config.md +++ b/docs/config.md @@ -11,7 +11,9 @@ PI WEB uses two config files: - **Global PI WEB config:** `$PI_WEB_CONFIG`, or `$XDG_CONFIG_HOME/pi-web/config.json`, or `~/.config/pi-web/config.json`. - **Project-local PI WEB config:** `/.pi-web/config.json` for commit-able project settings. -Each PI WEB machine has its own config. When using Fleet/machine federation, edit a remote machine's config by opening that machine directly or changing files on that machine. +Each PI WEB machine has its own config. When using Fleet/machine federation, Settings uses the selected machine for config that affects work running there: session daemon tools, PI WEB plugin enablement, external path access, and upload defaults. Gateway/browser-only settings stay local to the gateway: keyboard shortcuts, remote machine registry/tokens, and gateway host/port/allowed-hosts. Remote servers that do not advertise selected-machine settings support report those settings as unavailable instead of silently falling back to the gateway. + +Pi package settings are separate from PI WEB config. They live in Pi's package-manager settings on the target machine and are managed by Pi (`pi install`, `pi remove`, `pi update`) or **Settings → Pi packages**. In a federated setup, **Settings → Pi packages** targets the currently selected machine. The PI WEB `plugins` config key only enables or disables discovered PI WEB browser plugins on the machine whose config you are editing; it does not install, remove, or update Pi packages. If you installed services with a custom config path, rerun `pi-web install --config /path/to/config.json` after changing that path or after upgrading from a version that only applied the custom path to the web service. This regenerates service files so the web/API and session daemon use the same `PI_WEB_CONFIG`. @@ -29,12 +31,13 @@ Environment overrides include `PI_WEB_HOST`, `PI_WEB_PORT` / `PORT`, `PI_WEB_ALL Process restarts depend on the key: -- `host` / `port`: restart the web/API service or process. -- `maxUploadBytes`: restart both the web/API process and the session daemon. -- `spawnSessions` / `subsessions`: restart the session daemon. +- `host` / `port`: restart the gateway web/API service or process. +- `maxUploadBytes`: restart both the web/API process and the session daemon on that machine. +- `spawnSessions` / `subsessions`: restart the session daemon on that machine. - `pathAccess`: applies on the next request; existing file views may need a browser refresh. - `uploads.defaultFolder`: applies to newly opened Files upload dialogs and new direct drag/drop batches after config/workspace refresh. -- `plugins`: reload the browser tab after changing plugin enablement. +- `plugins`: reload the browser tab after changing PI WEB plugin enablement. +- Pi package install/remove/update: not a PI WEB config key; after a mutation, type `/reload` in each idle PI WEB session on the target machine to refresh Pi runtime resources such as extensions, skills, prompt templates, themes, and context/system prompt files as supported by Pi. Reload the browser page separately for PI WEB browser plugin changes. A routine session daemon restart is not required. - `shortcuts`: saved settings apply in the browser after config refresh/save. ## Global config example @@ -88,7 +91,7 @@ Plugins may own separate project files, such as `.pi-web/tasks.json` for the bui ## Configuration matrix -Rows with JSON key `—` are runtime-only environment variables, not config-file keys. +Rows with JSON key `—` are runtime-only environment variables, not config-file keys. `Global` means machine-global. In Settings, selected-machine-safe global keys (`pathAccess`, `uploads`, `maxUploadBytes`, `spawnSessions`, `subsessions`, and `plugins`) are edited for the selected machine; gateway host/port/allowed-hosts, keyboard shortcuts, and machine registry/tokens stay local. | Config | JSON key | Env var | Scope | Project-local behavior | Applies / restart | | --- | --- | --- | --- | --- | --- | @@ -98,9 +101,9 @@ Rows with JSON key `—` are runtime-only environment variables, not config-file | Dev-server allowed hosts | `allowedHosts` | `PI_WEB_ALLOWED_HOSTS` | Global | Not supported locally | Restart dev web/UI | | External filesystem roots | `pathAccess.allowedPaths` | — | Global + project | **Merges**: global roots first, then project roots; duplicates removed | Next file request; refresh existing views if needed | | Manual file upload default folder | `uploads.defaultFolder` | — | Global + project | **Overrides**: project value wins for workspaces in that project; otherwise global/default applies | New Upload dialogs and direct drag/drop batches after config/workspace refresh | -| Upload/body limit | `maxUploadBytes` | `PI_WEB_MAX_UPLOAD_BYTES` | Global | Not supported locally | Restart web/API and session daemon | -| Agent can spawn sessions | `spawnSessions` | `PI_WEB_SPAWN_SESSIONS` | Global/session daemon | Not supported locally | Restart session daemon | -| Tracked subsessions (beta) | `subsessions` | `PI_WEB_SUBSESSIONS` | Global/session daemon | Not supported locally; also requires `spawnSessions` | Restart session daemon | +| Upload/body limit | `maxUploadBytes` | `PI_WEB_MAX_UPLOAD_BYTES` | Global | Not supported locally | Restart web/API and session daemon on that machine | +| Agent can spawn sessions | `spawnSessions` | `PI_WEB_SPAWN_SESSIONS` | Global/session daemon | Not supported locally | Restart session daemon on that machine | +| Tracked subsessions (beta) | `subsessions` | `PI_WEB_SUBSESSIONS` | Global/session daemon | Not supported locally; also requires `spawnSessions` | Restart session daemon on that machine | | Plugin enablement/settings | `plugins..enabled`, `plugins..settings` | — | Global | Not core local config; plugins may read their own project files | Reload browser tab | | Keyboard shortcuts | `shortcuts.` | — | Global | Not supported locally | Applies after settings save/config refresh | | Project config version | `version` | — | Project | Project-local only; must be `1` when present | Next project-config read | @@ -133,6 +136,8 @@ Accepted root forms: When an absolute request is served, PI WEB expands `~`, canonicalizes the configured roots with `realpath`, requires roots to be existing directories, and rejects symlink escapes outside the allowed roots. +In **Settings → General**, external filesystem roots are saved on the selected machine. Gateway host, port, and allowed-hosts fields stay on the gateway config. + This is not a sandbox for the underlying Pi Coding Agent or your OS user. It only controls PI WEB UI/API file exposure outside a workspace. ### Manual upload defaults @@ -156,9 +161,9 @@ The value must be a non-empty workspace-relative folder. PI WEB normalizes repea Manual uploads use the workspace file-write path: paths stay workspace-relative, parent folder creation is enabled by default, and overwrite is disabled by default. Direct drag/drop always keeps `overwrite` off; the review dialog lets you explicitly enable overwrite when needed. Browser-owned XHR progress is shown per batch/file, conflicts and errors stay visible in the upload progress UI, and the final file-write response is the source of truth. -For machine federation, current remote PI WEB servers return `workspace.effectiveConfig.uploads.defaultFolder` on the existing workspace-list response. Older remote servers can omit that optional field without breaking clients; the Files panel falls back to the global/default upload folder. +For machine federation, Settings saves the global upload default on the selected machine. Current remote PI WEB servers also return `workspace.effectiveConfig.uploads.defaultFolder` on the existing workspace-list response. Older remote servers can omit that optional field without breaking clients; the Files panel falls back to the global/default upload folder. -The per-request size limit is still controlled by `maxUploadBytes` / `PI_WEB_MAX_UPLOAD_BYTES`. +The per-request size limit is still controlled by `maxUploadBytes` / `PI_WEB_MAX_UPLOAD_BYTES` on the machine serving the upload. ### Session daemon tools @@ -168,9 +173,13 @@ The per-request size limit is still controlled by `maxUploadBytes` / `PI_WEB_MAX Tracked subsessions let an agent delegate work to child sessions, get notified when children stop working, and inspect their transcripts. +In **Settings → Session daemon**, these keys are saved on the selected machine. Restart the session daemon on that machine after changing them. + ### Plugin config -Plugins are enabled by default. Set `plugins..enabled` to `false` to remove a plugin from `/pi-web-plugins/manifest.json` before the browser imports it. +The `plugins` key is only for PI WEB browser plugin enablement/settings on the machine whose config you are editing. It does not install, remove, or update Pi packages; use **Settings → Pi packages** or Pi's package manager for package operations. In a federated setup, **Settings → PI WEB plugins** and **Settings → Pi packages** both target the currently selected machine, and each panel labels where changes will be saved or run. + +Plugins are enabled by default. Set `plugins..enabled` to `false` to remove a plugin from that machine's `/pi-web-plugins/manifest.json` before the browser imports it. Settings lists discovered plugins from the selected machine, including disabled entries exposed by that machine. ```json { diff --git a/docs/index.html b/docs/index.html index e17f81b..d1a1d31 100644 --- a/docs/index.html +++ b/docs/index.html @@ -251,7 +251,7 @@

    Your device is replaceable. The sessions are not. Move between laptop, phone, tablet, and desktop without moving the development environment. Under the hood, PI WEB coordinates the running sessions, - files, terminals, and remote machines like a browser-based control plane. + files, terminals, Pi package management, and remote machines like a browser-based control plane.

    diff --git a/docs/install.html b/docs/install.html index cb13cf0..9f20d7f 100644 --- a/docs/install.html +++ b/docs/install.html @@ -281,7 +281,8 @@

    Use Settings → General for host, port, and external filesystem roots; Settings → Session daemon - for agent-spawn tools; Settings → Plugins for plugin enablement; and Settings → Keyboard + for agent-spawn tools; Settings → Pi packages for Pi package install/remove/update; + Settings → PI WEB plugins for browser plugin enablement; and Settings → Keyboard for shortcut overrides.

    diff --git a/docs/machines.html b/docs/machines.html index 665f222..38099c1 100644 --- a/docs/machines.html +++ b/docs/machines.html @@ -6,7 +6,7 @@ PI WEB fleet — remote Pi web UI machines @@ -81,7 +81,7 @@

    Most PI WEB setups only need one runtime. When you do have more than one, machine federation lets the PI WEB instance you opened act as a gateway to other trusted runtimes while each machine keeps its own repositories, - credentials, sessions, and plugins. + credentials, sessions, Pi package settings, and plugins.

    @@ -111,7 +111,7 @@

    After registration, the browser keeps talking to the current PI WEB origin. The gateway contacts the selected remote PI WEB server and routes that machine's projects, workspaces, sessions, files, git state, - activity, and terminals to the browser UI. + activity, terminals, and Pi package-management operations to the browser UI.

    @@ -125,7 +125,7 @@ PI WEB gateway you opened │ ├─ [ Remote PI WEB runtime A ] │ ↓ selected machine - │ projects, workspaces, sessions, terminals, plugins + │ projects, workspaces, sessions, terminals, Pi packages, plugins │ └─ [ Remote PI WEB runtime B ]
    @@ -151,7 +151,7 @@ PI WEB gateway you opened

    Local ownership

    -

    Each target machine keeps its own Pi auth, sessions, worktrees, terminal state, and plugins.

    +

    Each target machine keeps its own Pi auth, sessions, worktrees, terminal state, Pi package settings, and plugins.

    @@ -213,6 +213,7 @@ PI WEB gateway you opened
  • Pi sessions, transcripts, prompts, model controls, and commands.
  • Activity indicators and realtime updates.
  • Terminals and terminal command runs.
  • +
  • Pi package listing, install, remove, and update from Settings → Pi packages when supported by the target PI WEB runtime.
  • Remote plugins from the selected machine.
  • @@ -220,8 +221,9 @@ PI WEB gateway you opened

    Credentials stay on the target machine

    - Model-provider credentials, Pi configuration, OAuth state, repositories, and active session runtimes stay - on the selected target machine. The gateway does not copy them into its own Pi configuration. + Model-provider credentials, Pi configuration, Pi package-manager settings, OAuth state, repositories, and + active session runtimes stay on the selected target machine. The gateway does not copy them into its own + Pi configuration.

    +
    +

    Pi packages vs PI WEB plugins

    +

    + Pi packages are packages managed by Pi (pi install, pi remove, + pi update). A Pi package can provide extensions, skills, prompt templates, themes, + context/system prompt files, and/or PI WEB browser plugins. Many Pi packages do not include a PI WEB plugin. +

    +

    + PI WEB plugins are browser-side UI modules discovered from bundled, local, dev, and + installed Pi-package sources. Enabling or disabling a PI WEB plugin is a PI WEB config task; installing, + removing, or updating a Pi package is a Pi package-manager task. +

    +

    + Use Settings → Pi packages to view configured Pi packages or install/remove/update a + package. Enter only the package source, such as npm:@scope/package, a git/URL source, or a + local path. PI WEB uses Pi's default package location, equivalent to pi install <source>, + and does not ask for an install location. +

    +

    + When machine federation is enabled, Settings → Pi packages targets the currently selected + machine. The panel labels whether changes will run on the local/gateway machine or on a selected remote + PI WEB machine. If an older or unavailable remote PI WEB server does not expose package-management routes, + PI WEB reports the package management operation as unsupported or unavailable instead of silently falling + back to the gateway. +

    +

    + Use Settings → PI WEB plugins to enable or disable discovered PI WEB browser plugins + before the browser imports them. In a federated setup, this plugin enablement surface targets the + currently selected machine and labels where changes are saved. If an older or unavailable remote PI WEB + server does not advertise selected-machine settings support, PI WEB reports the plugin settings as + unsupported or unavailable instead of silently falling back to the gateway. After installing, removing, or + updating a Pi package, type /reload in each idle PI WEB session on the target machine to + refresh Pi runtime resources such as extensions, skills, prompt templates, themes, and context/system + prompt files as supported by Pi. Reload the browser page separately for newly discovered or changed + PI WEB browser plugins. A routine session daemon restart is not required. +

    +
    +

    What to ask AI to build

    @@ -204,7 +243,7 @@ After editing, check the manifest endpoint and browser-console failure cases./pi-web-plugins/manifest.json.

    - Built-in plugins can be managed from Settings → Plugins or with the top-level + Built-in plugins can be managed from Settings → PI WEB plugins or with the top-level plugins config key.

    @@ -285,12 +324,20 @@ After editing, check the manifest endpoint and browser-console failure cases.
    -

    Manage plugins

    +

    Manage PI WEB plugins

    - Open Settings → Plugins to review discovered bundled, local, dev, and Pi package plugins - for the PI WEB gateway you opened. PI WEB can disable any discovered plugin before the browser imports - it. Core app contributions such as the command palette, base workspace tools, and themes are not managed - through this plugin list. + Open Settings → PI WEB plugins to review discovered bundled, local, dev, and Pi package + plugins for the selected PI WEB machine. When the local machine is selected, this is the gateway plugin + list; when a remote machine is selected, the list comes from that remote PI WEB server and includes + disabled discovered plugins it exposes. PI WEB can disable any discovered selected-machine plugin before + the browser imports it. Core app contributions such as the command palette, base workspace tools, and + themes are not managed through this plugin list. +

    +

    + This surface is only for PI WEB plugin enablement. To install, remove, or update Pi packages that may + provide plugins or other Pi resources, use Settings → Pi packages. In a federated setup, + both the Pi packages panel and the PI WEB plugins panel target the selected machine; plugin enablement + still writes the PI WEB plugins config key rather than changing Pi package-manager settings.

    @@ -336,7 +383,8 @@ After editing, check the manifest endpoint and browser-console failure cases.

    Remote plugin enablement is controlled by the remote machine's PI WEB plugin config. To edit or disable - one, open that machine directly or update its config file. + one, select that machine and use Settings → PI WEB plugins when the remote server exposes + selected-machine settings, or open that machine directly/update its config file.

    Plugin package metadata can set machineSpecific: true. Use it for plugins like Updates whose diff --git a/docs/plugins.md b/docs/plugins.md index ec133b9..dd08ba6 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -13,6 +13,18 @@ Plugins can currently: They do **not** run in the session daemon, do not get a server-side hook API, and are not sandboxed. +## Pi packages vs PI WEB plugins + +**Pi packages** are packages managed by Pi (`pi install`, `pi remove`, `pi update`). A Pi package can provide extensions, skills, prompt templates, themes, context/system prompt files, and/or PI WEB browser plugins. Many Pi packages do not include a PI WEB plugin. + +**PI WEB plugins** are browser-side PI WEB UI modules discovered from bundled, local, dev, and installed Pi-package sources. Enabling or disabling a PI WEB plugin is a PI WEB config task; installing, removing, or updating a Pi package is a Pi package-manager task. + +Use **Settings → Pi packages** to view configured Pi packages or install/remove/update a package. Enter only the package source, such as `npm:@scope/package`, a git/URL source, or a local path. PI WEB uses Pi's default package location, equivalent to `pi install `, and does not ask for an install location. + +When machine federation is enabled, **Settings → Pi packages** targets the currently selected machine. The panel labels whether changes will run on the local/gateway machine or on a selected remote PI WEB machine. If an older or unavailable remote PI WEB server does not expose package-management routes, PI WEB reports the package management operation as unsupported or unavailable instead of silently falling back to the gateway. + +Use **Settings → PI WEB plugins** to enable or disable discovered PI WEB browser plugins before the browser imports them. In a federated setup, this plugin enablement surface targets the currently selected machine and labels where changes are saved. If an older or unavailable remote PI WEB server does not advertise selected-machine settings support, PI WEB reports the plugin settings as unsupported or unavailable instead of silently falling back to the gateway. After installing, removing, or updating a Pi package, type `/reload` in each idle PI WEB session on the target machine to refresh Pi runtime resources such as extensions, skills, prompt templates, themes, and context/system prompt files as supported by Pi. Reload the browser page separately for newly discovered or changed PI WEB browser plugins. A routine session daemon restart is not required. + ## Trust model Plugins run as JavaScript in the browser app. Treat them as trusted code: @@ -140,7 +152,7 @@ When [machine federation](https://pi-web.dev/machines) is enabled, PI WEB also l - remote theme contributions are ignored for now because themes are app-wide; - mixed PI WEB versions across federated machines are best-effort and not guaranteed compatible. -Remote plugin enablement is controlled by the remote machine's PI WEB plugin config. To edit or disable a remote machine plugin, open that machine directly or update its config file. +Remote plugin enablement is controlled by the remote machine's PI WEB plugin config. To edit or disable a remote machine plugin, select that machine and use **Settings → PI WEB plugins** when the remote server exposes selected-machine settings, or open that machine directly/update its config file. Plugin package metadata may set `machineSpecific: true` when the plugin's meaning is tied to the selected PI WEB machine: @@ -155,9 +167,11 @@ const url = new URL("./asset.json", import.meta.url); If a remote plugin constructs absolute asset URLs, it should use the `pluginId` from `activate()` because PI WEB gives remote plugins a gateway-scoped runtime id. Hard-coded `/pi-web-plugins//...` URLs may point at the gateway instead of the remote machine. -## Manage plugins +## Manage PI WEB plugins -Open **Settings → Plugins** to review discovered bundled, local, dev, and Pi package plugins for the PI WEB gateway you opened. PI WEB can disable any discovered gateway plugin before the browser imports it. Core app contributions such as the built-in command palette, base workspace tools, and themes are not managed through this plugin list. +Open **Settings → PI WEB plugins** to review discovered bundled, local, dev, and Pi package plugins for the selected PI WEB machine. When the local machine is selected, this is the gateway plugin list; when a remote machine is selected, the list comes from that remote PI WEB server and includes disabled discovered plugins it exposes. PI WEB can disable any discovered selected-machine plugin before the browser imports it. Core app contributions such as the built-in command palette, base workspace tools, and themes are not managed through this plugin list. + +This surface is only for PI WEB plugin enablement. To install, remove, or update Pi packages that may provide plugins or other Pi resources, use **Settings → Pi packages**. In a federated setup, both the Pi packages panel and the PI WEB plugins panel target the selected machine; plugin enablement still writes the PI WEB `plugins` config key rather than changing Pi package-manager settings. Plugin preferences are stored under the top-level `plugins` config key in the PI WEB config file: @@ -183,14 +197,14 @@ After changing plugin enablement, reload the PI WEB browser tab. Already-loaded PI WEB ships core, discoverable plugins in the main `@jmfederico/pi-web` npm package. No separate `pi install` step is required: update PI WEB, reload the browser tab, and the bundled plugins appear in `/pi-web-plugins/manifest.json`. -Built-in plugins can be managed from **Settings → Plugins** or with the top-level `plugins` config key. +Built-in plugins can be managed from **Settings → PI WEB plugins** or with the top-level `plugins` config key. ### Updates **Plugin id:** `updates` **What it does:** adds a conditional **Updates** workspace tab with PI WEB update, restart, and installed-service guidance. -Updates is enabled by default. It declares `machineSpecific: true` so the gateway Updates tab only appears for the local machine; while a remote machine is selected, that remote machine's Updates plugin is used if available. To hide it, disable `updates` in **Settings → Plugins** or set: +Updates is enabled by default. It declares `machineSpecific: true` so the gateway Updates tab only appears for the local machine; while a remote machine is selected, that remote machine's Updates plugin is used if available. To hide it, disable `updates` in **Settings → PI WEB plugins** or set: ```json { @@ -206,7 +220,7 @@ Updates is enabled by default. It declares `machineSpecific: true` so the gatewa **Config file:** `.pi-web/tasks.json` **What it does:** adds a **Tasks** workspace tab for running configured shell commands in dedicated PI WEB terminals. -Workspace Tasks is enabled by default. To hide it, disable `workspace-tasks` in **Settings → Plugins** or set: +Workspace Tasks is enabled by default. To hide it, disable `workspace-tasks` in **Settings → PI WEB plugins** or set: ```json { @@ -273,7 +287,7 @@ PI WEB builds the gateway `/pi-web-plugins/manifest.json` from these sources: Entries may be real directories or symlinks. This is the recommended development workflow. -3. Installed Pi packages that expose PI WEB plugin metadata. Pi packages may be user or project scoped. +3. Installed Pi packages that expose PI WEB plugin metadata. Pi packages may be user or project scoped. Installing/removing/updating Pi packages is done from **Settings → Pi packages** (or Pi's package manager), not from the PI WEB plugin enable/disable list. Remote machines expose their own manifests through the gateway at `/api/machines//pi-web-plugins/manifest.json`. Those plugin modules are rewritten to gateway-scoped asset URLs and registered under machine-scoped runtime ids so duplicate plugin ids on different machines do not collide. @@ -426,10 +440,13 @@ interface PluginAction { shortcut?: string; group?: string; enabled?: (context: PluginRuntimeContext) => boolean; + disabledReason?: (context: PluginRuntimeContext) => string | undefined; run: (context: PluginRuntimeContext) => void | Promise; } ``` +If an action is disabled and returns `disabledReason`, PI WEB can keep it visible in the action palette with that explanation instead of hiding it. + Stable runtime context fields: ```ts diff --git a/package-lock.json b/package-lock.json index de4644b..90a46c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jmfederico/pi-web", - "version": "1.202606.6", + "version": "1.202606.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jmfederico/pi-web", - "version": "1.202606.6", + "version": "1.202606.7", "license": "MIT", "dependencies": { "@codemirror/commands": "^6.10.3", @@ -41,9 +41,9 @@ }, "devDependencies": { "@changesets/cli": "^2.31.0", - "@earendil-works/pi-agent-core": "^0.79.1", - "@earendil-works/pi-ai": "^0.79.1", - "@earendil-works/pi-coding-agent": "^0.79.1", + "@earendil-works/pi-agent-core": "^0.80.3", + "@earendil-works/pi-ai": "^0.80.3", + "@earendil-works/pi-coding-agent": "^0.80.3", "@eslint/js": "^10.0.1", "@types/node": "^24.10.1", "@types/ws": "^8.18.1", @@ -60,9 +60,9 @@ "node": ">=22" }, "peerDependencies": { - "@earendil-works/pi-agent-core": ">=0.78.0 <1", - "@earendil-works/pi-ai": ">=0.78.0 <1", - "@earendil-works/pi-coding-agent": ">=0.78.0 <1" + "@earendil-works/pi-agent-core": ">=0.80.0 <1", + "@earendil-works/pi-ai": ">=0.80.0 <1", + "@earendil-works/pi-coding-agent": ">=0.80.0 <1" } }, "node_modules/@anthropic-ai/sdk": { @@ -86,21 +86,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==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "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", @@ -181,18 +166,18 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.974.22", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.22.tgz", - "integrity": "sha512-YofH63shc6YRdXjz80BJkpJW+Bkn0Cuu2dn4Rv7s9G2Idt58tgtzQEWxrR2xVljlVfIBeUjPuULnSVYLke3sUQ==", + "version": "3.974.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.26.tgz", + "integrity": "sha512-wRj7Pthvjk3anees97pUWlxlTa0DUjeGrEQU5fKDZVdWZV0ekaprbof0df2uaE9g8u67t035v2j+ne2AW2UMkA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.13", - "@aws-sdk/xml-builder": "^3.972.30", + "@aws-sdk/types": "^3.973.15", + "@aws-sdk/xml-builder": "^3.972.33", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/core": "^3.24.6", - "@smithy/signature-v4": "^5.4.6", - "@smithy/types": "^4.14.3", + "@smithy/core": "^3.29.0", + "@smithy/signature-v4": "^5.6.1", + "@smithy/types": "^4.15.1", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -201,16 +186,16 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.48", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.48.tgz", - "integrity": "sha512-h6FEC95fbexUd6zxm4PdgS82bTcI2PRtUb2ZwMipb/Xr8bPwtf0G8rBo2jp7NA24Mbx2JA8/WingiYpA9RCCyw==", + "version": "3.972.52", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.52.tgz", + "integrity": "sha512-sxuaHZGHqOgKB8OdL3doXa1NJjqmO60FPfyTnYVKGjX9taRsIEGS9pd+2yALmo06hijZ8L94uSK0kfXZsRmVyA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -218,18 +203,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.50", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.50.tgz", - "integrity": "sha512-lJO3OLpjvz5m/RSBQmsG/CEUGsvCy5ruxKwPQaOCqxqCMuyYT2BZwQUTDZVVwqQ9LrZKuK24JSa6r31hL/tvkg==", + "version": "3.972.54", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.54.tgz", + "integrity": "sha512-e6yz52nq3SpR1oPLcvfsDM7H7k2gIYk/NSn/rwsFqzGXEwr3g0mRMlPbLaKCPCGNZJMU/gZg6/64B3eSam+gBw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/fetch-http-handler": "^5.4.6", - "@smithy/node-http-handler": "^4.7.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/fetch-http-handler": "^5.6.2", + "@smithy/node-http-handler": "^4.9.2", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -237,14 +222,14 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.8.1.tgz", - "integrity": "sha512-emtXvoky671puri18ETf64AFIQUGIEA093F2drXpBgB0OGnBLjcwNR3CA2mYu62IAqNsS56xa5lnTxAgPq7cjw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.2.tgz", + "integrity": "sha512-s0yAIRj6TVfHgl+QzVyqal1KMGZ9B5512IrxKc6+dOpw8fUmFL3CvuAhjv0J+aNjUPfVZ2IhqPEDvkB5Ncx9oA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.25.1", - "@smithy/types": "^4.15.0", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -252,24 +237,24 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.55", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.55.tgz", - "integrity": "sha512-TBoF4buBGYhXjdZAryayY2TrkQj2B2KfE/msG4V53XCt+w0EhEwM2JRjx8p2grJ2C6gtH5++SAwEvGMRdi0yyw==", + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.59.tgz", + "integrity": "sha512-9Um/UpruN76AdpiLnvwChVkJJwJ9Vx9ykk/2AeLxxSCM/YYRD8Kkq2towUk9fZQLV7dd9ATlsi87U7hKs0z/iQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/credential-provider-env": "^3.972.48", - "@aws-sdk/credential-provider-http": "^3.972.50", - "@aws-sdk/credential-provider-login": "^3.972.54", - "@aws-sdk/credential-provider-process": "^3.972.48", - "@aws-sdk/credential-provider-sso": "^3.972.54", - "@aws-sdk/credential-provider-web-identity": "^3.972.54", - "@aws-sdk/nested-clients": "^3.997.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/credential-provider-imds": "^4.3.7", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/credential-provider-env": "^3.972.52", + "@aws-sdk/credential-provider-http": "^3.972.54", + "@aws-sdk/credential-provider-login": "^3.972.58", + "@aws-sdk/credential-provider-process": "^3.972.52", + "@aws-sdk/credential-provider-sso": "^3.972.58", + "@aws-sdk/credential-provider-web-identity": "^3.972.58", + "@aws-sdk/nested-clients": "^3.997.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/credential-provider-imds": "^4.4.5", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -277,17 +262,17 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.54", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.54.tgz", - "integrity": "sha512-hBWI3wZTdTGiuMfmPts6AWbAjFfRniOQnqx68tc2cQvRKWawFbN9wkLOVPWM1FAOyowZU73mC6Fi+rHSHNyLFw==", + "version": "3.972.58", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.58.tgz", + "integrity": "sha512-H3q96qF8/DJsPsXMVtMRqSWOc85K5O4zos32untdw+vE5vw0f3a6qJo1YqbND4BsEIKd4iZmzzVUq9kV4LjbHg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/nested-clients": "^3.997.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/nested-clients": "^3.997.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -295,22 +280,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.57", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.57.tgz", - "integrity": "sha512-u6dClpzNdWf1HGWz4wwhdXi1wiOofCLniM9S4BQQGlLAN9TW7VB+ld5V533GdKrYMaFeBGFqKnj0JCYvynLqwQ==", + "version": "3.972.61", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.61.tgz", + "integrity": "sha512-2U2KHMRCt1dlZoLU3KZR5g5EL4b0h2HHw96SkaUBK7qvEXPZj5rGRO/3ZTeJmh37dIYQuCnA2273rZOQvmsiHw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.48", - "@aws-sdk/credential-provider-http": "^3.972.50", - "@aws-sdk/credential-provider-ini": "^3.972.55", - "@aws-sdk/credential-provider-process": "^3.972.48", - "@aws-sdk/credential-provider-sso": "^3.972.54", - "@aws-sdk/credential-provider-web-identity": "^3.972.54", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/credential-provider-imds": "^4.3.7", - "@smithy/types": "^4.14.3", + "@aws-sdk/credential-provider-env": "^3.972.52", + "@aws-sdk/credential-provider-http": "^3.972.54", + "@aws-sdk/credential-provider-ini": "^3.972.59", + "@aws-sdk/credential-provider-process": "^3.972.52", + "@aws-sdk/credential-provider-sso": "^3.972.58", + "@aws-sdk/credential-provider-web-identity": "^3.972.58", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/credential-provider-imds": "^4.4.5", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -318,16 +303,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.48", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.48.tgz", - "integrity": "sha512-w6VZwojPt12WnEkAUy6Nu4K6sWCbBmR7QX390b0nE6vRvkXbrYr9Lq9VySGkfjiMjpUA87op+J4EgvRmtWIDoQ==", + "version": "3.972.52", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.52.tgz", + "integrity": "sha512-Aff9Ebs42lz+Ep1wkS+Nlwh5S0eahakpyskPsuKGjiBJ6ExOjNtxbfKJTKovQtQNgJ7oG1BH6esJwGrbs7qgSA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -335,18 +320,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.54", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.54.tgz", - "integrity": "sha512-23uZpIpF2SIFDCa1fcWa202tK4gGeyvX6GIIAjiB8WBsvsVRBMnJ/7dCxHzxf7eZT7GToJg837LDIBnZsl/VUg==", + "version": "3.972.58", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.58.tgz", + "integrity": "sha512-syloC58mXOacUqM2toPNfwd7X3jT+tWj0F/cN7qdW1FQyI0q41J0tPf6DIZ56BF0x82iS9j3ALP45MoBz79YuQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/nested-clients": "^3.997.22", - "@aws-sdk/token-providers": "3.1071.0", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/nested-clients": "^3.997.26", + "@aws-sdk/token-providers": "3.1078.0", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -354,17 +339,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { - "version": "3.1071.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1071.0.tgz", - "integrity": "sha512-4LDW2Qob6LoLFuqYSYZq2AyTE9koSE9+i+n5UZcm10GpmQOK0zRD9L4uYlzItiTKksIWgC/qMFChAi3RvKYtMg==", + "version": "3.1078.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1078.0.tgz", + "integrity": "sha512-/uyXLBGu3Lw1GbBA2X66hcOMnKtMcqAIF+3/eHfxBQmUeXF2sdqozDPrTfEr/TnSd0D6deZar+eVyhEqqWu29w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/nested-clients": "^3.997.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/nested-clients": "^3.997.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -372,17 +357,17 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.54", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.54.tgz", - "integrity": "sha512-0Iv5QttS6wcATlodYKgvQj6B9Db51rx7NU9fqu0PoLeS4BIgdYMc/QK4smwLwpm5RFrs02V/eLyEFp3FklvlNQ==", + "version": "3.972.58", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.58.tgz", + "integrity": "sha512-pTBImKzcGK+pcMKjL0fAJbnYzzYd1c0UDc7BSIOGNQhF9Nuk66vWlIXfYTYyzNSs+w8Q/vfbbNDDU8zdrouwLg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/nested-clients": "^3.997.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/nested-clients": "^3.997.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -390,15 +375,15 @@ } }, "node_modules/@aws-sdk/eventstream-handler-node": { - "version": "3.972.22", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.22.tgz", - "integrity": "sha512-tqPJv0dz4+O0hWGm1a6YekcMZyPhDFs/zH73Von7icaVT5n0Jqvm86typ3jRrG+qoUdPhALOnboRLTmnWQTlYQ==", + "version": "3.972.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.25.tgz", + "integrity": "sha512-df7HN1ozwMrB9+59re9PM7tSLxLAcheMWc5u/KyfCPCAWtN/vP7y7RTUZOy48uT1K9MESisVeOPPzF3O1AW01A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -406,15 +391,15 @@ } }, "node_modules/@aws-sdk/middleware-eventstream": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.18.tgz", - "integrity": "sha512-OHpk8YoZi3yexPq8aFt1vN1IxA2zLKvsIR5GpWYylX/ve6kQmY7wxHNSFy/D3t2apMZ16rs76Co4dJWcDyIk3A==", + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.21.tgz", + "integrity": "sha512-HvLgDnxBLaHi9E5K++6Vuk+1+qqn7Pmn8zrlzd+NXH3jBzwujnuzZtAR9WHPkbUGPO92FkoQWj/M1IsdxTlBmQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -422,18 +407,18 @@ } }, "node_modules/@aws-sdk/middleware-websocket": { - "version": "3.972.30", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.30.tgz", - "integrity": "sha512-kH6N4f/Fzi9r/dYap8EQ+Zk4NOz8pl4AtWKhzAoG2C1/4YkIHok9APp/e+75woreWQq264n+LkrJsJVZ0Q+M1Q==", + "version": "3.972.34", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.34.tgz", + "integrity": "sha512-8dxKLu5bC74SLwwoYV8RIiCD48jMbMt1Ccl3m+xtQJKet6QsZ4xzJlK6UDg7QNEzm/ZCUknJfGsBHmhkgOfuIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/fetch-http-handler": "^5.4.6", - "@smithy/signature-v4": "^5.4.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/fetch-http-handler": "^5.6.2", + "@smithy/signature-v4": "^5.6.1", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -441,21 +426,19 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.997.22", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.22.tgz", - "integrity": "sha512-4IwtcYSxEIVw5hcp8ogq0CMbFNZFw7jJUetpfFUhFFeqsa1K8j2Ihg2hnxLyOp3stMZnXda6VzOmPi1AFZQXcg==", + "version": "3.997.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.26.tgz", + "integrity": "sha512-Lwe3F6K7bs+jEubp1LbrvzeMBYb5fMazJ1IxV9TtKWPF8CSh67Fmwyq9fLz3NL/k55Dfpuph5Dimw76JFgr+SA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.22", - "@aws-sdk/signature-v4-multi-region": "^3.996.35", - "@aws-sdk/types": "^3.973.13", - "@smithy/core": "^3.24.6", - "@smithy/fetch-http-handler": "^5.4.6", - "@smithy/node-http-handler": "^4.7.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/core": "^3.974.26", + "@aws-sdk/signature-v4-multi-region": "^3.996.38", + "@aws-sdk/types": "^3.973.15", + "@smithy/core": "^3.29.0", + "@smithy/fetch-http-handler": "^5.6.2", + "@smithy/node-http-handler": "^4.9.2", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -463,14 +446,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.8.1.tgz", - "integrity": "sha512-emtXvoky671puri18ETf64AFIQUGIEA093F2drXpBgB0OGnBLjcwNR3CA2mYu62IAqNsS56xa5lnTxAgPq7cjw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.2.tgz", + "integrity": "sha512-s0yAIRj6TVfHgl+QzVyqal1KMGZ9B5512IrxKc6+dOpw8fUmFL3CvuAhjv0J+aNjUPfVZ2IhqPEDvkB5Ncx9oA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.25.1", - "@smithy/types": "^4.15.0", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -478,15 +461,15 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.35", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.35.tgz", - "integrity": "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg==", + "version": "3.996.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.38.tgz", + "integrity": "sha512-C379Sk+MiFZCfWZphKlMyLHKxV22OjoGM5KJjj5IJNJcOCWL4IGIpnEGzv1FQiRwhYXfq55SJMfxlqPE08JJ9g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.13", - "@smithy/signature-v4": "^5.4.6", - "@smithy/types": "^4.14.3", + "@aws-sdk/types": "^3.973.15", + "@smithy/signature-v4": "^5.6.1", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -512,13 +495,13 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.973.13", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.13.tgz", - "integrity": "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg==", + "version": "3.973.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.15.tgz", + "integrity": "sha512-IULn8uBV/SMtmOIANsm4WHXIOtVPBWfOWs3WGL0j/sI+KhaYehvOw0ET+9urnn8MBpiijuU/0JOpuwKOE451PQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.3", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -539,14 +522,13 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.30", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.30.tgz", - "integrity": "sha512-StElZPEoBquWwNqw1AcfpzEyZqJvFxouG+mpDNYlcH6ZOrqd2CuIryv+8LV8gNHZUOyKyJF3Dq9vxaXEmDR9TQ==", + "version": "3.972.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.33.tgz", + "integrity": "sha512-ezbwz9WpuLctm6o7P2t2naDhVVPI5jFGrVefVybhcKGjU57VIyT46pQVO0RI2RYkUdhdj2Z9uSIlAzGZE9NW9A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.3", - "fast-xml-parser": "5.7.3", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -1001,13 +983,13 @@ } }, "node_modules/@earendil-works/pi-agent-core": { - "version": "0.79.8", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.79.8.tgz", - "integrity": "sha512-8m5fcqRpoGpq3QY0I/tFXROSTmPwBb1dAuzYZO3XYgjsdCokkRMAGRjA9P8s/UD6Jy9yy69lyE4H6sz/5A1TmQ==", + "version": "0.80.3", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.80.3.tgz", + "integrity": "sha512-3qw0/GeRQBU/nlGjDe5Yb7ePKTmoxefx2YxyKMFAviFUMXpFexBG/hS7mBtwFahFvzrrTPPoRT6sFIDjwoDWPQ==", "dev": true, "license": "MIT", "dependencies": { - "@earendil-works/pi-ai": "^0.79.8", + "@earendil-works/pi-ai": "^0.80.3", "ignore": "7.0.5", "typebox": "1.1.38", "yaml": "2.9.0" @@ -1017,9 +999,9 @@ } }, "node_modules/@earendil-works/pi-ai": { - "version": "0.79.8", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.79.8.tgz", - "integrity": "sha512-ZpSwaD7oNpsjn9vtEatZQNT9PSdDJXi6rFeY5Qv+OHQGFDKlmcrfJE4ypm4SAc/fBECPs4Rdi3l+YjVtXYrkKw==", + "version": "0.80.3", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.80.3.tgz", + "integrity": "sha512-jPZLMeGL5kkMSEAwAklfXTMHqZvfhsJtCCpKGIr5Duk7mc0n4skjB1dugk7y0z3z8ZHIUCmPAWHdyDqgUz5vdA==", "dev": true, "license": "MIT", "dependencies": { @@ -1043,16 +1025,16 @@ } }, "node_modules/@earendil-works/pi-coding-agent": { - "version": "0.79.8", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-coding-agent/-/pi-coding-agent-0.79.8.tgz", - "integrity": "sha512-wr9oTS/yrwURDXnYrONQgFgV7QDlwslXL/rvKU5X7TRtrGxIhippsRApXqYlRwSeMjb2YzgHMfZ/kAhOqrzoFQ==", + "version": "0.80.3", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-coding-agent/-/pi-coding-agent-0.80.3.tgz", + "integrity": "sha512-TIggw9gCXpA+Ph7OjdTA7ka2NPwTVuPmy39KDSyUzaKq8VvHfMGR7vtRz4JB7Um/RMRblmzhu4p9tUCk6MTgGA==", "dev": true, "hasShrinkwrap": true, "license": "MIT", "dependencies": { - "@earendil-works/pi-agent-core": "^0.79.8", - "@earendil-works/pi-ai": "^0.79.8", - "@earendil-works/pi-tui": "^0.79.8", + "@earendil-works/pi-agent-core": "^0.80.3", + "@earendil-works/pi-ai": "^0.80.3", + "@earendil-works/pi-tui": "^0.80.3", "@silvia-odwyer/photon-node": "0.3.4", "chalk": "5.6.2", "cross-spawn": "7.0.6", @@ -1542,12 +1524,12 @@ } }, "node_modules/@earendil-works/pi-coding-agent/node_modules/@earendil-works/pi-agent-core": { - "version": "0.79.8", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.79.8.tgz", + "version": "0.80.3", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.80.3.tgz", "dev": true, "license": "MIT", "dependencies": { - "@earendil-works/pi-ai": "^0.79.8", + "@earendil-works/pi-ai": "^0.80.3", "ignore": "7.0.5", "typebox": "1.1.38", "yaml": "2.9.0" @@ -1557,8 +1539,8 @@ } }, "node_modules/@earendil-works/pi-coding-agent/node_modules/@earendil-works/pi-ai": { - "version": "0.79.8", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.79.8.tgz", + "version": "0.80.3", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.80.3.tgz", "dev": true, "license": "MIT", "dependencies": { @@ -1575,15 +1557,15 @@ "typebox": "1.1.38" }, "bin": { - "pi-ai": "./dist/cli.js" + "pi-ai": "dist/cli.js" }, "engines": { "node": ">=22.19.0" } }, "node_modules/@earendil-works/pi-coding-agent/node_modules/@earendil-works/pi-tui": { - "version": "0.79.8", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.79.8.tgz", + "version": "0.80.3", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.80.3.tgz", "dev": true, "license": "MIT", "dependencies": { @@ -1698,6 +1680,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1715,6 +1700,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1732,6 +1720,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1749,6 +1740,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1766,6 +1760,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4194,19 +4191,6 @@ "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@nodable/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/nodable" - } - ], - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5345,14 +5329,13 @@ ] }, "node_modules/@smithy/core": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.25.1.tgz", - "integrity": "sha512-zpDbpXBCBsxfLtG2GEUyfgvHvSFrw5CwDZSNzL0v52gx/c3oPlPbm+7W7num8xs6vyiUBn+bvYPHcQDOXZynCQ==", + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.0.tgz", + "integrity": "sha512-sEvpvkBVoMxjoek35XyJFn2ZD3EJ1RpiZrT47WaZodxzAIWS44zkdvbqGE/ZlugtjiQp62cffYZ9ldyRkjAGnA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.15.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -5360,14 +5343,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.1.tgz", - "integrity": "sha512-TSAF5NHgxEsllbErYWbK8aLnl5L601NGc5VYJlSPsKnf3YlkhdoBN+geGcaU00oiw2OK3QO5LA3QNXiiWhCidQ==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.5.tgz", + "integrity": "sha512-LnjUTNG0GgQlKIq7IioeOrPaEmC5xOd1WtAz24TLSiYQnWX2uHr53GrFuQhkrJBktPYCMga/NbUOW7hFbSA2Cg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.25.1", - "@smithy/types": "^4.15.0", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -5375,14 +5358,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.5.1.tgz", - "integrity": "sha512-96JrD1q71anokymx9Iblb+zKmNQYNstlV/25A9ZYIJ2A0rp1r7/GZAIm0bDWSmVvz3DpNOCZuabzsiL+w0UHhw==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.2.tgz", + "integrity": "sha512-q96PSDOAGw+X+nuELd7Cjebps0SYr+YlPbviEX9sLVw+VM4M7VV8hn1nL1mGS6urDu33eQ5A7WhlphaDO6kUyQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.25.1", - "@smithy/types": "^4.15.0", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -5418,14 +5401,14 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.5.1.tgz", - "integrity": "sha512-X9rVls3En0z3NtrmguTmpRM0/NqtWUxBjal6fcAkwtsub+gOdLZ6kD+V7xhUgFMGdG14bHbZ7M5QjaRI1+DatQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.1.tgz", + "integrity": "sha512-SqvuP75p/DmgWWI7jv4kf/UW+V4LFmlUn19s604SgAcRuJRB1vDnWwzZMYCLUcmKxko9wDn6iLgGEIpTNgZbIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.25.1", - "@smithy/types": "^4.15.0", + "@smithy/core": "^3.29.0", + "@smithy/types": "^4.15.1", "tslib": "^2.6.2" }, "engines": { @@ -5433,9 +5416,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.15.0.tgz", - "integrity": "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.15.1.tgz", + "integrity": "sha512-x3L0XSACF6UYzKpa9biqiRMgvH5+wnFFew9Tm/grFYqgaupPwx/+ojDPpPJM8dZON3S9tjz5U+PQYsCBd1Mw5Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6026,19 +6009,6 @@ "node": ">=8" } }, - "node_modules/anynum": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", - "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6861,45 +6831,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fast-xml-builder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", - "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.5.0", - "xml-naming": "^0.1.0" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", - "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "@nodable/entities": "^2.1.0", - "fast-xml-builder": "^1.1.7", - "path-expression-matcher": "^1.5.0", - "strnum": "^2.2.3" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, "node_modules/fastify": { "version": "5.8.5", "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", @@ -7262,9 +7193,9 @@ } }, "node_modules/google-auth-library": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.7.0.tgz", - "integrity": "sha512-QpTAbNJ36TliZLx3TTtahR8HG0hN9RllL1e3FymOvQSIKK8JmgV58H924ub2wa2DsS3ANjjP1Aw1N+Ramc8hqQ==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.0.tgz", + "integrity": "sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8211,22 +8142,6 @@ "node": ">=8" } }, - "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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -8966,22 +8881,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strnum": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", - "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "anynum": "^1.0.1" - } - }, "node_modules/style-mod": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", @@ -9985,22 +9884,6 @@ } } }, - "node_modules/xml-naming": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", - "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/yaml": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", diff --git a/package.json b/package.json index ee6caef..9a9f18b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jmfederico/pi-web", - "version": "1.202606.6", + "version": "1.202606.7", "description": "Web UI for persistent Pi Coding Agent sessions in real workspaces.", "license": "MIT", "author": "Federico Jaramillo Martinez", @@ -78,9 +78,9 @@ }, "devDependencies": { "@changesets/cli": "^2.31.0", - "@earendil-works/pi-agent-core": "^0.79.1", - "@earendil-works/pi-ai": "^0.79.1", - "@earendil-works/pi-coding-agent": "^0.79.1", + "@earendil-works/pi-agent-core": "^0.80.3", + "@earendil-works/pi-ai": "^0.80.3", + "@earendil-works/pi-coding-agent": "^0.80.3", "@eslint/js": "^10.0.1", "@types/node": "^24.10.1", "@types/ws": "^8.18.1", @@ -109,9 +109,9 @@ "homepage": "https://pi-web.dev/", "packageManager": "npm@11.11.0", "peerDependencies": { - "@earendil-works/pi-agent-core": ">=0.78.0 <1", - "@earendil-works/pi-ai": ">=0.78.0 <1", - "@earendil-works/pi-coding-agent": ">=0.78.0 <1" + "@earendil-works/pi-agent-core": ">=0.80.0 <1", + "@earendil-works/pi-ai": ">=0.80.0 <1", + "@earendil-works/pi-coding-agent": ">=0.80.0 <1" }, "keywords": [ "pi-package", diff --git a/pi-web-plugins/updates/pi-web-plugin.ts b/pi-web-plugins/updates/pi-web-plugin.ts index 4734749..e2aa7f4 100644 --- a/pi-web-plugins/updates/pi-web-plugin.ts +++ b/pi-web-plugins/updates/pi-web-plugin.ts @@ -115,7 +115,7 @@ function renderUpdatesPanel(html: HtmlTemplateTag, terminal: WorkspacePanelTermi .updates-command > span { grid-column: 1 / -1; } } -

    Updatesbeta${messages.length > 0 ? html`${String(messages.length)}` : null}
    +
    Updates${messages.length > 0 ? html`${String(messages.length)}` : null}
    ${messages.length === 0 ? html`

    No PI WEB update or restart messages.

    ` : messages.map((message) => html` @@ -171,7 +171,7 @@ const plugin: PiWebPlugin = { visible: (context) => shouldShowUpdatesPanel(context.state, runtimeHint), badge: (context) => { const count = messageCount(context.state); - return html`beta${count > 0 ? html` · ${String(count)}` : null}`; + return count > 0 ? count : undefined; }, render: (context) => renderUpdatesPanel(html, context.terminal, context.state), }, diff --git a/src/client/index.html b/src/client/index.html index 59dfe94..578d7db 100644 --- a/src/client/index.html +++ b/src/client/index.html @@ -11,6 +11,9 @@
    Merges: global roots first, then project roots; duplicates removed Next file request; refresh existing views if needed
    Manual file upload default folderuploads.defaultFolderGlobal + projectOverrides: project value wins for workspaces in that project; otherwise global/default appliesNew Upload dialogs and direct drag/drop batches after config/workspace refresh
    Upload/body limit maxUploadBytes PI_WEB_MAX_UPLOAD_BYTES Global Not supported locallyRestart web/API and session daemonRestart web/API and session daemon on that machine
    Agent can spawn sessionsPI_WEB_SPAWN_SESSIONS Global/session daemon Not supported locallyRestart session daemonRestart session daemon on that machine
    Tracked subsessions (beta)PI_WEB_SUBSESSIONS Global/session daemon Not supported locally; also requires spawnSessionsRestart session daemonRestart session daemon on that machine
    Plugin enablement/settingsPI WEB plugin enablement/settings plugins.<id>.enabled, plugins.<id>.settings Global