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
1 change: 1 addition & 0 deletions docs/feature-map/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ check cannot see it and the pages-dir half can.
| Subagents | Background agent runs spawned from a session. A wave that is accepted but waiting shows why (`pages/chat/subagentQueuedReason.ts` renders the gate's `reason` from `subagent_queued`: a memory floor, macOS memory pressure or a paused adaptive cap; a bare count keeps the concurrency text) | Chat activity viewer; rail badge | `pages/chat/ActivityViewer.tsx`, `pages/chat/subagentQueuedReason.ts` | `handlers/messaging.py` | `GET,POST /api/spawn`, `POST /api/spawn/stop-all`, `GET /api/spawn/{agent_id}`, `DELETE /api/spawn/{agent_id}` (dismiss, including disk-only cards), `POST /api/spawn/{agent_id}/steer` |
| Dynamic Dashboard | Template-based dashboards from one shared built-in catalog, for crewmates and root sessions alike, plus questions and one-shot tool approvals. The chat side panel's Dashboard view draws a header (title, help, permission mode), the Overview / Questions / Approvals segments with their counts, and notices; its Overview is the ROOT session's own Dynamic Dashboard (`CrewDynamicDashboard` with a session target), every field folded from that session's own work ledger and crew log. A dispatched or adopted session (`created_by` or a session-tree parent) gets no Overview and opens on Questions. Questions and Approvals stay host-rendered `AttentionCard`s. No status tiles are drawn above the composer. The + menu entry, a persisted Dashboard tab and the All Dashboards menu item are offered to every reader. The Crew chat's permanent Dashboard tab is the crewmate's own page. The gallery cards the sessions that have a card to show, by the same `canCarryCard` predicate the card frame fetches on (not private, not remote, no session-tree parent), with their saved summaries and decisions first; a dispatched session keeps its card because the card route serves it a derived board, while an adopted, incognito or remote session gets none and its questions and approvals still reach the gallery's Needs you inbox. The page's description names what an entry carries, since only a root session owns the dashboard PACKAGE. Optional automatic session cards update from session events under a shared model budget; unchanged layouts accept text-data updates. Only a root session (no `created_by`, no session-tree parent) gets one, and every number on it is folded from that session's crew log by `build_crew_main`, and the card frame renders those numbers in the dashboard's language from the phrases sent beside them (`crewMainPhrases.ts`): the model designs the layout and writes only `lede`/`you`/`notes`, and a card whose model part carries a digit is refused at publish. The pipeline conductor's work board is a DERIVED card instead: the panel publish route and the member-panel read assemble it from the typed board contract and the work fold with no model call, so it needs no budget and is not gated on the automatic-cards opt-in. The dashboard MCP tools write a crewmate's page or a root session's own page, never another's. Content publication time is separate from live host status. Isolated iframes cannot answer or approve. Native controls retain exact session/request routing and never change approval mode | Chat side panel + → **Dashboard** (root sessions get the Overview); Crew chat → its permanent **Dashboard** tab; Sessions three-dot menu → **All Dashboards** (`/session-dashboards`). **Automatic session cards** starts off and is enabled from its own card in Settings > Developer (a gateway-wide server setting) | `pages/members/MembersPageSidePanel.tsx`, `pages/chat/command-center/SessionDashboardsPage.tsx`, `pages/chat/command-center/CommandCenterPanel.tsx`, `pages/members/CrewDynamicDashboard.tsx`, `pages/chat/command-center/SessionStatusFrame.tsx`, `pages/chat/command-center/crewMainPhrases.ts`, `pages/chat/command-center/AutomaticCardSetting.tsx` (mounted by `pages/settings/DeveloperPanel.tsx`), `pages/chat/SidePanel.tsx` | `crew_main_contract.py`, `dashboard/card_lifecycle.py`, `dashboard/dynamic_cards.py`, `dashboard/handlers/agent_panel.py`, `dashboard/handlers/member_dashboard.py`, `dashboard_templates/instance.py`, `pipeline_board_contract.py`, `dashboard_card_pages/pipeline_board.html`; existing artifact, session, question, approval and workflow handlers | `GET /api/chat/slots/{slot}/dashboard`, `GET /api/members/{slug}/dashboard`, `GET /api/chat/slots/{slot}/dashboard-card`, `GET /api/members/{slug}/panel`, `POST /api/agent-panel/publish`, `GET /api/chat/slots/{slot}/summary`, `GET /api/sessions/{id}/crew-log/projection/work`, `GET /api/workflows/runs`, `GET /api/ask-question/pending`, `GET /api/approvals`, `POST /api/chat/slots/{slot}/approve`, `POST /api/approvals/{id}/{action}`, `PATCH /api/config/kirocrew` |
| Worktrees | Create a git worktree for a follow-up session | Chat follow-up card → new worktree | `pages/ChatPage.tsx`, `pages/useChatPageSlotSwitches.ts`, `pages/chat/page/followupCardActions.ts` | `handlers/worktree.py` | `POST /api/worktree/create` |
| Branch switcher | Switch the project's local branch, check out a remote-only branch as a tracking branch, or create a branch at the current commit, from one searchable picker; off while the chat's response runs | Chat side panel → **Git** → the branch name in the panel header; or the branch segment of the project chip under the chat box (opens upward) | `components/BranchSwitcher.tsx`, `components/GitPanel.tsx`, `components/ChatInput.tsx`, `pages/chat/ActivityViewer.tsx` | `handlers/git_branches.py` | `GET /api/project/git/branches`, `POST /api/project/git/switch` |
| Crew board | One conductor's work items as a board a human can scan — items waiting on a decision lifted into a band at the top, everything still open next, finished items collapsed behind an expander; each row carries the worker's `status` and the conductor's `state` as separate chips. An orphaned item (its conductor's session gone while the item is open) offers **Stop current turn** (the delegate cancels the turn that worker is running and leaves its session open, so the label promises only what the server delivers), with one dim line stating either why it cannot run or what stopping keeps; **Take over** renders no control at all while the server reports it unavailable, which is every gateway until a server-side primitive for it exists. Polls every 10 s; no payload carries a worker session key, so actions are keyed by item and resolved server-side | `/crew-board?conductor=<session key>`, reached from a session's overflow menu (**Crew board**, shown only for a session that owns a work ledger) | `pages/CrewBoardPage.tsx`, `pages/crewBoardRows.ts`, `components/CrewBoardMenuItem.tsx` | `handlers/work_ledger_board.py` | `GET /api/crew-board`, `POST /api/crew-board/action` |

## Settings
Expand Down
Loading
Loading