Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/feature-map/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ this area is reached from inside it unless stated otherwise.
| Tool approvals | Approve or deny a tool call the agent proposes | Inline card in the transcript | `components/ApprovalCard.tsx` | `handlers/sessions_parts/live_turn.py` | `GET /api/approvals`, `POST /api/approvals/{id}/{action}` |
| MCP elicitation | Answer a question an MCP server itself asks mid tool call: a small form built from the server's schema, or a link to visit and confirm. No trust setting answers it; the person does, or the wait runs out and the ask is cancelled | Inline card in the transcript | `pages/chat/ElicitationCard.tsx`, `pages/chat/page/transcriptRendering.tsx` | `dashboard/handlers/chat_elicitation.py`, `dashboard/chat_turn/elicitation_prompt.py`, `acp/elicitation.py` | `POST /api/chat/slots/{slot}/elicitation` |
| Question cards | Agent asks a multiple-choice question in chat and waits; the answers return as the tool result and show as a collapsible "N questions answered" card under the tool row | Pending: card above the composer. Answered: \"N questions answered\" card under the `ask_question` tool row in the transcript | `components/PendingQuestionCard.tsx`, `pages/chat/AskAnswersCard.tsx` | `handlers/ask_question.py` | `POST /api/ask-question`, `GET /api/ask-question/pending`, `POST /api/ask-question/dismiss`, `POST /api/ask-question/{ask_id}/answer`, `POST /api/agent-ask/open`, `POST /api/agent-ask/{ask_id}/wait`, `POST /api/agent-ask/{ask_id}/withdraw` |
| Files in chat | Browse, attach, and upload workspace files, including signature-verified audio containers; search the rail by file NAME or by file CONTENTS, including the text inside Word/PowerPoint/Excel documents; preview one in the side panel — a .docx renders its headings, lists, tables and bold/italic runs, falling back to extracted plaintext; right-click a file row → Download saves it to the machine running the browser through the credential-gated download endpoint; drag a file or folder row onto the composer to mention it where it is dropped, the same `@` mention the row's **Add to chat** inserts at the caret (a folder whose path holds a space or `@` has no folder reference, so the drop is refused with a note and the row menu shows **Add to chat** disabled with the same reason); complete a relative path in the composer by typing `./` or `../`, which lists one directory level of the project (never above its root); the header carries the per-project actions — reveal the project directory, and open a terminal already in it; the side-panel preview's ⋯ menu offers **Open in Files**, which opens the same file in the Files app's own tabbed tree through its `?path=` deep link (`/file-explorer?path=<absolute path>`): the file lands in the tab whose root already contains it with the folders between expanded, or in a new tab rooted at its folder, and the Files backend — not the link — decides whether the path may be shown; the row is offered only while the Files app is enabled at its native route and the path is absolute; a path named in the transcript becomes a clickable chip (and a diff block or tool line offers **Open**) only once the gateway confirms it is a file or folder on disk, every path a view shows being asked about in one request | Chat right panel → Files tab, Name/Content toggle below the search field; right-click a file row → **Download**; drag a tree row onto the composer; composer attach; composer `./` / `../` path token; Files tab header → reveal button and **Project actions** → **Open terminal in the project directory**, whose row carries a one-line note saying what a terminal is; side-panel file preview → ⋯ → **Open in Files**; a path chip, diff-block header or tool-call line in the transcript | `pages/chat/FileBrowserRail.tsx`, `pages/chat/FilesHomePanel.tsx`, `api/fileGrep.ts`, `components/FileRenderers.tsx`, `components/MarkdownPanelHeader.tsx` (`OverflowMenu` — the **Open in Files** row), `apps/file-explorer/deepLink.ts` + `apps/file-explorer/FileExplorerPage.tsx` (the `?path=` deep link's URL shape and its consumption), `pierre/PierreWorkspaceTreeImpl.tsx`, `lib/treeEntryDrag.ts`, `components/composerTreeDrop.ts`, `components/ChatInput.tsx`, `components/FilePickerMenu.tsx`, `components/composerTokens.ts`, `hooks/usePathKind.ts` (the shared existence cache and batch behind transcript path chips, `components/DiffBlock.tsx` and `pages/chat/ToolCallLine.tsx`) | `handlers/files.py`, `dashboard/file_api/pinned_io.py` (`api_file_kinds`), `src/kiro_crew/apps/routes_proxy.py` (`handle_app_api_proxy`), `src/kiro_crew/apps/builtins/file_explorer/server.py` (`_h_resolve`) | `GET /api/file-read`, `POST /api/file-kinds` (the batched path-kind probe), `GET /api/file-office-preview`, `GET /api/file-download`, `POST /api/file-grep`, `GET /api/file-search`, `GET /api/path-complete`, `POST /api/upload`, `POST /api/upload/file`, `GET /apps/file-explorer/api/resolve` (the deep link's one probe) |
| Files in chat | Browse, attach, and upload workspace files, including signature-verified audio containers; search the rail by file NAME or by file CONTENTS, including the text inside Word/PowerPoint/Excel documents; preview one in the side panel — a .docx renders its headings, lists, tables and bold/italic runs, falling back to extracted plaintext; right-click a file row → Download saves it to the machine running the browser through the credential-gated download endpoint; drag a file or folder row onto the composer to mention it where it is dropped, the same `@` mention the row's **Add to chat** inserts at the caret (a folder whose path holds a space or `@` has no folder reference, so the drop is refused with a note and the row menu shows **Add to chat** disabled with the same reason); complete a relative path in the composer by typing `./` or `../`, which lists one directory level of the project (never above its root); the header carries the per-project actions — reveal the project directory, and open a terminal already in it; the side-panel preview's ⋯ menu offers **Open in Files**, which opens the same file in the Files app's own tabbed tree through its `?path=` deep link (`/file-explorer?path=<absolute path>`): the file lands in the tab whose root already contains it with the folders between expanded, or in a new tab rooted at its folder, and the Files backend — not the link — decides whether the path may be shown; the row is offered only while the Files app is enabled at its native route and the path is absolute; an OS file dropped anywhere on the Files rail uploads into the project root, which the drop overlay names, and a directory row's menu → **Upload files…** picks files to upload into that directory; either refuses a name that already exists there with a notice instead of replacing the file; a path named in the transcript becomes a clickable chip (and a diff block or tool line offers **Open**) only once the gateway confirms it is a file or folder on disk, every path a view shows being asked about in one request | Chat right panel → Files tab, Name/Content toggle below the search field; right-click a file row → **Download**; drag a tree row onto the composer; composer attach; composer `./` / `../` path token; Files tab header → reveal button and **Project actions** → **Open terminal in the project directory**, whose row carries a one-line note saying what a terminal is; side-panel file preview → ⋯ → **Open in Files**; a path chip, diff-block header or tool-call line in the transcript; drag an OS file onto the Files rail (the drop overlay), or a directory row's menu → **Upload files…** | `pages/chat/FileBrowserRail.tsx`, `pages/chat/FilesHomePanel.tsx`, `api/fileGrep.ts`, `components/FileRenderers.tsx`, `components/MarkdownPanelHeader.tsx` (`OverflowMenu` — the **Open in Files** row), `apps/file-explorer/deepLink.ts` + `apps/file-explorer/FileExplorerPage.tsx` (the `?path=` deep link's URL shape and its consumption), `pierre/PierreWorkspaceTreeImpl.tsx`, `lib/treeEntryDrag.ts`, `components/composerTreeDrop.ts`, `components/ChatInput.tsx`, `components/FilePickerMenu.tsx`, `components/composerTokens.ts`, `pages/chat/useDirectoryUpload.tsx` (the upload and error-notice hook shared by the drop overlay and the picker; no new user-facing entry point), `hooks/usePathKind.ts` (the shared existence cache and batch behind transcript path chips, `components/DiffBlock.tsx` and `pages/chat/ToolCallLine.tsx`) | `handlers/files.py`, `dashboard/file_api/pinned_io.py` (`api_file_kinds`), `src/kiro_crew/apps/routes_proxy.py` (`handle_app_api_proxy`), `src/kiro_crew/apps/builtins/file_explorer/server.py` (`_h_resolve`) | `GET /api/file-read`, `POST /api/file-kinds` (the batched path-kind probe), `GET /api/file-office-preview`, `GET /api/file-download`, `POST /api/file-grep`, `GET /api/file-search`, `GET /api/path-complete`, `POST /api/upload`, `POST /api/upload/file`, `POST /api/directory-upload`, `GET /apps/file-explorer/api/resolve` (the deep link's one probe) |
| Git tab | Side-panel tab listing every Git repository the chat works in, one collapsible section per repository headed by its path: the chat's project folder first (tagged Project) when it is a repository, then each repository the agent's tool calls edited or ran commands in, most recent first; each section shows branch, uncommitted changes and recent commits | Chat right panel → **Git** tab | `pages/chat/ActivityViewer.tsx`, `components/GitReposPanel.tsx`, `components/GitPanel.tsx` | `dashboard/git_repo_touches.py`, `file_api/project_dirs.py`, `file_api/git_panel.py` | `GET /api/project/git/repos`, `GET /api/project/git/status`, `GET /api/project/git/log` |
| Slide preview for decks | Shows a `.pptx` / `.ppt` opened in the side panel as rendered slides (pager + thumbstrip) when LibreOffice is on the gateway host; without it, a row naming the install command (with an agent hand-off) over the `.pptx` text outline, or over the download card for `.ppt`, which has no text to extract; a deck whose visible text the credential screen would redact is not rendered and shows the redacted outline under a row saying so; on Windows (no descriptor-relative file operations to pin the render's staging) slides are not rendered and the outline is shown with the reason | Side panel → Files tab → click a deck; any deck chip in chat | `components/FileRenderers.tsx` (`OfficeSlidesRenderer`) | `handlers/office_slides.py` | `GET /api/file-office-slides`, `GET /api/file-office-slide`, `GET /api/file-office-preview` |
| Terminal panel | Two shells on the gateway host: an app-wide docked PTY, and a per-chat terminal whose tab lives in that chat's panel state (opens on the chat's working dir; switches with the session). A shell that exits on its own closes its tab in the window attached to it, and the docked panel with its last tab (another window still holding that tab is not told, and its next dial opens a fresh shell); a known non-zero exit leaves a Terminal note in the bell feed, Windows included. Both tab strips, the docked terminal's and the chat right panel's, carry a close menu — **Close**, **Close other tabs**, **Close tabs to the right** and **Close all tabs**, which the terminal strip names **Close other terminals**, **Close terminals to the right** and **Close all terminals** and the workspace strip follows with a note that the Changes, Artifacts and Files views stay open; closing a terminal tab stops its shell, a batch that stops more than one shell asks first, counting and naming the shells, and one that would discard unsaved file edits names the files before closing. With `dashboard.terminal.reuse_current` on, Run in terminal always COPIES the command to the clipboard for a manual paste and never runs it — so the confirm dialog, which promises a copy, cannot mislead. When a settled terminal tab exists it is also revealed (the docked panel opens and that tab is made active, and a popped-out terminal window is raised) so the shell to paste into is in front; when none is (no tab, or a restored tab still unconfirmed during hydration) the raw command is copied verbatim with no tab minted and nothing executed | Header terminal toggle (docked); chat right panel → **+** menu → **Terminal**, or Files tab header → **Project actions** → **Open terminal in the project directory** — both go through one `openProjectTerminal` callback, so they cannot disagree about the cwd (per-chat); workspace chat composer (main chat or shared pane) → `! <command>` → **Review terminal command** → review → **Run** (fresh docked terminal); right-click a tab, or on touch hold it and lift without moving, for the close menu | `components/BottomTerminalPanel.tsx`, `components/TabCloseMenu.tsx`, `pages/chat/SidePanel.tsx`, `pages/chat/SidePanelTabChip.tsx` (the right panel's tab chips, their close menu and a terminal tab's live title), `pages/chat/SidePanelTabBodies.tsx` (the per-chat terminal's tab body), `pages/chat/FilesHomePanel.tsx`, `pages/ChatPage.tsx` (run-in-terminal reuse), `components/ChatPane.tsx`, `components/ChatInput.tsx`, `components/RunInTerminalConfirm.tsx`, `hooks/useTerminalCommand.ts`, `hooks/useBottomTerminal.ts` (`reuseCurrentTab`), `utils/terminalExitClose.ts` | `handlers/terminal.py` | `POST /api/terminal/sessions`, `GET /api/ws/terminal/{session_id}` |
Expand Down
Loading
Loading