feat(tui): render session forms (#35421)

This commit is contained in:
Aiden Cline 2026-07-05 19:35:30 -05:00 committed by GitHub
commit 5bcf8d5a0b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 1202 additions and 18 deletions

View file

@ -1,6 +1,8 @@
import type {
AgentV2Info,
CommandV2Info,
FormFormInfo,
FormUrlInfo,
IntegrationInfo,
LocationRef,
McpServer,
@ -29,6 +31,8 @@ export type DataSessionStatus = "idle" | "running"
const messageIDFromEvent = (eventID: string) => eventID.replace(/^evt_/, "msg_")
export type FormInfo = FormFormInfo | FormUrlInfo
type LocationData = {
agent?: AgentV2Info[]
command?: CommandV2Info[]
@ -54,6 +58,8 @@ type Data = {
message: Record<string, SessionMessage[]>
permission: Record<string, PermissionV2Request[]>
question: Record<string, QuestionV2Request[]>
// Pending forms keyed by session ID.
form: Record<string, FormInfo[]>
}
project: {
permission: Record<string, PermissionSavedInfo[]>
@ -88,6 +94,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
message: {},
permission: {},
question: {},
form: {},
},
project: {
permission: {},
@ -602,6 +609,22 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
),
)
break
case "form.created":
if (store.session.form[event.data.form.sessionID]?.some((form) => form.id === event.data.form.id)) break
setStore("session", "form", event.data.form.sessionID, [
...(store.session.form[event.data.form.sessionID] ?? []),
mutable(event.data.form),
])
break
case "form.replied":
case "form.cancelled":
setStore(
"session",
"form",
event.data.sessionID,
(store.session.form[event.data.sessionID] ?? []).filter((form) => form.id !== event.data.id),
)
break
case "shell.created":
setStore("location", locationKey(event.location ?? defaultLocation()), (data) => ({
...data,
@ -728,6 +751,14 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
setStore("session", "question", sessionID, mutable(await sdk.api.question.list({ sessionID })))
},
},
form: {
list(sessionID: string) {
return store.session.form[sessionID]
},
async refresh(sessionID: string) {
setStore("session", "form", sessionID, mutable(await sdk.api.form.list({ sessionID })))
},
},
},
project: {
permission: {