Commit Graph
313 Commits
Author SHA1 Message Date
Federico Jaramillo Martinez 73b169a768 test: close selected coverage gaps 2026-07-03 21:40:36 +02:00
Federico Jaramillo Martinez 8511604e83 test: close audit cleanup findings 2026-07-03 21:40:36 +02:00
Federico Jaramillo Martinez 1564f1cfc5 test: audit existing suite 2026-07-03 09:48:20 +02:00
Pi Web Agent a2bfd3657d Merge remote-tracking branch 'origin/main' into feat/docker-runtime-host-admin
# Conflicts:
#	src/client/src/api.ts
#	src/client/src/api/parsers.test.ts
#	src/shared/piWebStatusParsing.test.ts
2026-07-02 20:52:50 +00:00
Federico Jaramillo Martinez ad6285355d fix: show full tool details in chat 2026-07-02 22:18:15 +02:00
Federico Jaramillo Martinez 439520c3e4 fix: reconcile pending session starts 2026-07-02 19:05:23 +02:00
Federico Jaramillo Martinez 2665d1e4bc fix: handle session start persistence 2026-07-02 18:46:44 +02:00
Federico Jaramillo Martinez d2e10cd89a fix: use suffix for unnamed session labels 2026-07-02 14:27:21 +02:00
Federico Jaramillo Martinez 3cb81b1bcf fix: show pending session starts safely 2026-07-02 14:16:17 +02:00
Federico Jaramillo Martinez b61a9c0c54 feat(settings): unify settings panel layout 2026-07-02 13:28:03 +02:00
Federico Jaramillo Martinez 64b2b32705 feat: target settings to selected machine 2026-07-02 13:28:03 +02:00
Federico Jaramillo Martinez 95a0ad7509 fix: guide package settings by runtime capability 2026-07-01 22:24:06 +02:00
Federico Jaramillo Martinez 332db5faeb feat: expose package management capability 2026-07-01 22:13:02 +02:00
Federico Jaramillo Martinez 0a1b7f9699 fix: decouple settings package loading 2026-07-01 22:05:48 +02:00
Federico Jaramillo Martinez 3df4041bd7 feat: manage Pi packages on selected machines 2026-07-01 21:54:18 +02:00
Federico Jaramillo Martinez 889672ff53 feat: add session runtime reload command 2026-07-01 19:32:52 +02:00
Federico Jaramillo Martinez 8ade238228 feat: add Pi package management settings 2026-07-01 15:34:34 +02:00
Federico Jaramillo Martinez d165d69f73 feat: add bulk session mutations 2026-06-29 13:34:03 +02:00
Pi Web Agent bd28c93cfe feat: unify Docker entrypoint 2026-06-29 11:27:47 +00:00
Federico Jaramillo Martinez 7063c2c3b1 fix: prevent iOS input zoom 2026-06-28 16:11:18 +02:00
Federico Jaramillo Martinez 2009e6a883 fix: keep chat prompt input stable during streaming
Coalesce session status/activity updates into one render per animation
frame instead of one per token, ignore prompt-editor status changes that
do not affect what it displays, and stop per-keystroke draft state from
re-rendering the surrounding template. This prevents streaming-driven
re-renders from interrupting in-progress touch gestures such as the iOS
long-press paste/edit callout.
2026-06-27 08:12:01 +02:00
Federico Jaramillo Martinez cb13af4b88 feat: add manual session cleanup 2026-06-26 15:57:12 +02:00
Federico Jaramillo Martinez 7bcd807867 Merge branch 'main' into chat-bidi-rtl-support 2026-06-26 00:16:01 +02:00
Federico Jaramillo Martinez 58a7560e51 Merge pull request #35 from aromancev/fix/mobile-enter-newline
fix: keep Enter as newline in mobile chat composer
2026-06-26 00:15:12 +02:00
Federico Jaramillo Martinez a43c782043 feat: add configurable prompt Enter behavior 2026-06-25 23:34:41 +02:00
Federico Jaramillo Martinez fd386b2d6b feat: add prompt enter behavior setting 2026-06-25 22:55:09 +02:00
Federico Jaramillo Martinez 7e812aa7f5 feat: support general chat file attachments 2026-06-25 21:32:07 +02:00
Andrey Romantsev 32ea809adc fix: keep Enter as newline in mobile chat composer 2026-06-25 18:11:41 +02:00
Federico Jaramillo Martinez e46d9ecbf8 feat: add safe manual workspace uploads 2026-06-25 15:16:44 +02:00
Federico Jaramillo Martinez b14205e523 feat: add inline Git diff highlights 2026-06-25 10:57:28 +02:00
Federico Jaramillo Martinez 9980027cee feat: expose prompt helper to workspace panels 2026-06-24 23:59:39 +02:00
Federico Jaramillo Martinez a0dd9e1cd7 Merge branch 'main' into cleanup/plugin-api-scope 2026-06-24 08:49:49 +02:00
TheOneironaut 801428bc22 Add BiDi support to chat text 2026-06-24 00:07:12 +03:00
Federico Jaramillo Martinez 6933d3aa88 fix: guard stale mobile navigation focus 2026-06-23 15:01:05 +02:00
Federico Jaramillo Martinez 4f4c6fa794 fix: proxy remote session reloads 2026-06-23 14:44:24 +02:00
Federico Jaramillo Martinez 9cc20d65fb feat: add external path access allowlist 2026-06-23 12:30:30 +02:00
Federico Jaramillo Martinez 997b821717 feat: add check_subsession and an exploratory read_subsession transcript reader
Split subsession inspection into two tools: check_subsession gives a quick
glance (status + latest assistant output), while read_subsession reads through
a child's transcript with role/content filters, full-content substring search
(including tool-call args), optional per-value maxChars truncation that flags
clipped parts, includeToolArgs, and pagination.

Filtering and search run on full untruncated content; truncation is an explicit,
caller-owned final projection (no default) so a narrow read never silently hides
a match. Empty page-windows are distinguished from zero-match results.
2026-06-19 23:48:12 +02:00
Federico Jaramillo Martinez 62c2234b85 fix: avoid duplicate skill loading cards 2026-06-19 23:44:58 +02:00
Federico Jaramillo Martinez d93110135b fix: dead-key/IME input in terminal (e.g. Swedish ~) 2026-06-18 12:00:03 +02:00
Federico Jaramillo Martinez 355ebe8cf8 feat(sessions): add tracked subsessions behind a beta flag
Add spawn_subsession / list_subsessions / read_subsession tools that let an
agent start child sessions it stays attached to: the child records its parent
in the session tree, the parent is notified (as a system-authored custom
message that wakes an idle parent and queues behind in-flight work) when the
child stops working, and the parent can inspect children's status and result.

Gated behind a beta flag, off by default, mirroring spawnSessions: enable via
PI_WEB_SUBSESSIONS, the subsessions config key, or the Settings toggle. Also
requires spawnSessions.

Also fix the release skill so the version step resyncs package-lock.json
(npm install --package-lock-only) and the commit step refuses a release where
package.json and package-lock.json versions disagree.
2026-06-17 12:13:23 +02:00
Federico Jaramillo Martinez 32d11de38c Rename attachment folder from .pi-web/paste to .pi-web/attachments
Attachments can be pasted, dropped, or uploaded, so 'paste' was too
narrow. Rename the default folder and filename prefix accordingly and
update the changeset reference.
2026-06-17 01:02:33 +02:00
Federico Jaramillo Martinez 81dba2abc9 fix: remove 3px left border on chat bubbles 2026-06-17 00:57:17 +02:00
Federico Jaramillo Martinez 3930505450 Fix stuck "Catching up…" badge after session goes idle
The stream catch-up mode was represented by two fields that could drift:
the private catchupStreamSessionId guard (which suppresses live transcript
events while the in-flight message prefix is missing) and the public
isReceivingPartialStream flag (which drives the badge). The socket reconnect
path (refreshSelectedSession) set the flag from status without updating the
guard, so a later idle status.update was skipped by the guard check and the
badge never cleared.

Route every mutation of the mode through a single setStreamCatchup helper so
the guard and badge can't disagree, and clear the mode on any non-streaming
status for the selected session.
2026-06-17 00:43:53 +02:00
Federico Jaramillo Martinez e77ab98361 fix(sessions): stop duplicating user message for slash commands
A slash command sent as the first (or any idle) message showed the raw
command text twice until reload: once from the client's optimistic insert
and once from the server's message.append echo, neither of which converges
with the agent's canonical expanded message (e.g. a /skill:* block).

Make commands obey the same source-of-truth contract as prompts:
- client no longer inserts the raw command text optimistically; it shows
  the existing per-session sending indicator instead
- forwarded runtime/skill commands return a bare done result rather than a
  synthetic "Accepted ..." line
- server suppresses the raw message.append echo for command-forwarded
  prompts (threaded through the compaction queue too)

Result: pre-reload state matches reload, with no transient duplicate.
2026-06-17 00:02:04 +02:00
Federico Jaramillo Martinez dd23b3e054 fix(sessions): dedupe started session when created broadcast races
The session.created global event (added with spawn_session) could arrive
in the initiating tab before the start request's HTTP response resolved.
applyCreatedSession inserted a plain session row (archive/reload actions)
and then startSession unconditionally prepended the cached version (delete
action), leaving two badges with the same id.

Make the optimistic insert idempotent by filtering out any existing entry
with the same id before prepending the cached session, so the locally
cached session always wins regardless of event ordering.
2026-06-16 23:40:47 +02:00
Federico Jaramillo Martinez 95c151233a feat: let agents start new sessions via spawn_session tool
Add a project-scoped spawn_session tool so agents can dispatch new,
independent sessions (ralph loops, long-plan chaining). Spawned sessions
are constrained to a workspace/worktree of the same registered project,
appear in the session list immediately via a new session.created event,
and the capability is on by default with a Settings -> Session daemon
toggle (spawnSessions / PI_WEB_SPAWN_SESSIONS).

Note: adds a session daemon code path, so pi-web-sessiond.service must be
restarted manually for the server side to take effect.
2026-06-16 14:53:37 +02:00
Federico Jaramillo Martinez 61f0b79d63 fix: move session reload action last 2026-06-15 14:15:56 +02:00
Federico Jaramillo Martinez 3742bcc962 refactor(plugin-api): trim plugin API scope to grounded capabilities
Builds on marcus's plugin-api-completeness work. Narrows the new plugin
surface to capabilities that expose real, otherwise-unreachable pi-web
functionality, and drops invented/duplicative surfaces:

Kept:
- files.writeFile / deleteFile / moveFile (genuine workspace mutation,
  federated, path-safe)
- prompt.insertText / getText / getSelection (editor state access)

Dropped:
- attachments.* (insertFileReference/getAttachedFiles/removeFileReference):
  getAttachedFiles invented a structured-attachment notion pi-web does not
  have and duplicated prompt.getText() + a regex with a false email-safety
  claim; insert/removeFileReference were thin sugar over readFile +
  insertText that plugins can compose themselves.
- prompt.onPaste / onKeyDown: an incomplete two-event hook system shaped
  around a single use case, overlapping the editor's native image-paste
  handling. Deferred until a real editor event/hook surface is designed.
- prompt.focus: redundant and buggier duplicate of the existing
  focusPrompt() (silently no-ops when not on the chat view). Focus stays
  as focusPrompt().

Security fix:
- deleteWorkspaceFile now resolves the parent via realpath + ensureInside
  before lstat/unlink, closing a symlinked-parent-directory escape that
  allowed deleting files outside the workspace (write/move already did
  this). Final path component is still not resolved, so deleting a symlink
  removes the link, not its target. Adds a regression test.

Docs and the registry test mock updated to match the trimmed surface.
2026-06-14 23:16:37 +02:00
marcus dde8675454 fix(plugin-api): federate workspace file mutations and trim PR scope 2026-06-14 15:03:23 +02:00
marcus fd6c01067b fix(plugin-api): position cursor after insertions and removals in prompt/attachments API
Ensure prompt.insertText, attachments.insertFileReference, and
attachments.removeFileReference move the cursor to the correct
position after modifying the prompt editor. Previously the cursor
stayed at the start of inserted text, which broke the natural
flow for plugin-driven file attachments like screenshot-paste.
2026-06-14 15:03:23 +02:00