* fix: simplify chat rendering, persist drawer size, fix auth guard
- Simplify chat-messages.tsx: remove dual-path tailContent rendering,
always use AssistantMessage for both stream and committed states
- Remove dead code: chat-status-state.ts (ThinkingGroup/ToolGroup/StatusTimer)
- Remove dead exports: busyStartedAt, composerPlaceholder from use-chat-session
- Fix ThinkingBlock label: remove hardcoded label="Thinking" so defaults
work ("Thinking" shimmer → "Thought" static)
- Persist resizable drawer panel size in localStorage alongside open state
to eliminate layout shift on page refresh
- Add busy grace period in use-chat-session for smooth stream→committed transition
- Accumulate reasoning parts across multi-step tool use in durable-chat-run
- Fix auth-guard: remove localSandboxMode bypass so login always works
- Fix chatThreads.getMessages: return [] instead of throwing when unauthenticated
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: remove unnecessary busy grace period
Convex reactive queries handle data consistency — no need for a 600ms
grace period to bridge the stream→committed transition.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: remove dead shouldShowToolsForAssistantSnapshot
Greptile P1: function was exported and tested but never called.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: stabilize resizable drawer defaultSize to prevent drag breakage
The aside panel's defaultSize prop included state.activeSize, which
changed on every drag frame. In react-resizable-panels, changing
defaultSize triggers panel de-registration and re-registration, which
destroys the active drag's panel references and prevents resizing.
Use useState initializer to capture the size once on mount and keep it
stable. The existing useEffect handles all open/close/resize via
panelRef imperatively.
Also clean up context-chip: split active/inactive into distinct
render paths, remove unused Plus import.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: resolve ../ relative paths in file citations
Strip one leading ../ segment and resolve against rootPath's parent
instead of naively concatenating, which produced un-normalized routes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: simplify chat rendering, persist drawer size, fix auth guard
- Simplify chat-messages.tsx: remove dual-path tailContent rendering,
always use AssistantMessage for both stream and committed states
- Remove dead code: chat-status-state.ts (ThinkingGroup/ToolGroup/StatusTimer)
- Remove dead exports: busyStartedAt, composerPlaceholder from use-chat-session
- Fix ThinkingBlock label: remove hardcoded label="Thinking" so defaults
work ("Thinking" shimmer → "Thought" static)
- Persist resizable drawer panel size in localStorage alongside open state
to eliminate layout shift on page refresh
- Add busy grace period in use-chat-session for smooth stream→committed transition
- Accumulate reasoning parts across multi-step tool use in durable-chat-run
- Fix auth-guard: remove localSandboxMode bypass so login always works
- Fix chatThreads.getMessages: return [] instead of throwing when unauthenticated
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: remove unnecessary busy grace period
Convex reactive queries handle data consistency — no need for a 600ms
grace period to bridge the stream→committed transition.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: remove dead shouldShowToolsForAssistantSnapshot
Greptile P1: function was exported and tested but never called.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extends GatewayEvent union with structured_part variants, adds matching
HistoryPart types, wires SSE emission in runtime handleChat, and maps
agent-core content parts to history in session-state.
- reject unsafe snapshot ids in the TypeScript wrapper before spawning the helper
- reject unsafe snapshot ids in agent-computer before loading snapshot files
- add regression coverage for wrapper and helper traversal attempts
Co-authored-by: Codex <noreply@openai.com>
- remove the unimplemented accessibility observe mode from the public contract
- refuse unmatched app_open requests instead of shelling out
- add direct helper tests for both review findings
Co-authored-by: Codex <noreply@openai.com>
Complete the remaining pi-to-companion rename across companion-os, web, vm-orchestrator, docker, and archived fixtures.
Verification:
- semantic rg sweeps for Pi/piConfig/getPi/.pi runtime references
- npm run check in apps/companion-os (fails in this worktree: biome not found)
Co-authored-by: Codex <noreply@openai.com>
Expose deterministic Slack and Telegram channel status from the current pi-channels config, remove one-click connect from the dashboard dialog, and enable the chat bridge when users save channel tokens so messages reach the agent.
Co-authored-by: Codex <noreply@openai.com>
Flush final text before closing each AI SDK text block, surface event-processing failures to chat callers, and clear the remaining Companion OS check blockers.
fixes#273
Co-authored-by: Codex <noreply@openai.com>
Restore the bedrock provider import through an explicit workspace path mapping, align pi-grind package metadata with the existing package manifests, remove the unused controller-failure state path, and parse bare ISO dates in local time.
Co-authored-by: Codex <noreply@openai.com>
Replace the old project-scoped file memory plumbing with runtime-native conversational memory and remove obsolete pi-memory-md shipping/wiring.
Co-authored-by: Codex <noreply@openai.com>