refactor(schema): session shell payloads and event prefix restore (#35229)

This commit is contained in:
Kit Langton 2026-07-03 17:30:25 -04:00 committed by GitHub
commit 650d774372
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
49 changed files with 1521 additions and 1200 deletions

View file

@ -126,8 +126,8 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
const item = position === undefined ? undefined : messages[position]
return item?.type === "assistant" ? item : undefined
},
activeShell(messages: SessionMessage[], callID: string) {
const item = messages.findLast((item) => item.type === "shell" && item.callID === callID)
shell(messages: SessionMessage[], shellID: string) {
const item = messages.findLast((item) => item.type === "shell" && item.shell.id === shellID)
return item?.type === "shell" ? item : undefined
},
latestTool(assistant: SessionMessageAssistant | undefined, callID?: string) {
@ -220,7 +220,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
case "skill.updated":
void result.location.skill.refresh(event.location)
break
case "agent.selected":
case "session.agent.selected":
if (store.session.info[event.data.sessionID])
setStore("session", "info", event.data.sessionID, "agent", event.data.agent)
message.update(event.data.sessionID, (draft, index) => {
@ -232,7 +232,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "model.selected":
case "session.model.selected":
if (store.session.info[event.data.sessionID])
setStore("session", "info", event.data.sessionID, "model", event.data.model)
message.update(event.data.sessionID, (draft, index) => {
@ -244,11 +244,11 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "renamed":
case "session.renamed":
if (store.session.info[event.data.sessionID])
setStore("session", "info", event.data.sessionID, "title", event.data.title)
break
case "prompt.promoted": {
case "session.prompt.promoted": {
setStore("session", "status", event.data.sessionID, "running")
message.update(event.data.sessionID, (draft, index) => {
const position = index.get(event.data.inputID)
@ -264,7 +264,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
break
}
case "prompt.admitted":
case "session.prompt.admitted":
message.update(event.data.sessionID, (draft, index) => {
message.append(draft, index, {
id: event.data.inputID,
@ -287,7 +287,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "synthetic":
case "session.synthetic":
message.update(event.data.sessionID, (draft, index) => {
message.append(draft, index, {
id: messageIDFromEvent(event.id),
@ -299,29 +299,28 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "shell.started":
case "session.shell.started":
setStore("session", "status", event.data.sessionID, "running")
message.update(event.data.sessionID, (draft, index) => {
message.append(draft, index, {
id: messageIDFromEvent(event.id),
type: "shell",
callID: event.data.callID,
command: event.data.command,
output: "",
shell: event.data.shell,
time: { created: event.created },
})
})
break
case "shell.ended":
case "session.shell.ended":
setStore("session", "status", event.data.sessionID, "idle")
message.update(event.data.sessionID, (draft, index) => {
const match = message.activeShell(draft, event.data.callID)
message.update(event.data.sessionID, (draft) => {
const match = message.shell(draft, event.data.shell.id)
if (!match) return
match.shell = event.data.shell
match.output = event.data.output
match.time.completed = event.created
})
break
case "step.started":
case "session.step.started":
setStore("session", "status", event.data.sessionID, "running")
message.update(event.data.sessionID, (draft, index) => {
if (index.has(event.data.assistantMessageID)) return
@ -338,7 +337,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "step.ended":
case "session.step.ended":
setStore("session", "status", event.data.sessionID, "running")
message.update(event.data.sessionID, (draft, index) => {
const currentAssistant = message.assistant(draft, index, event.data.assistantMessageID)
@ -351,7 +350,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
currentAssistant.snapshot = { ...currentAssistant.snapshot, end: event.data.snapshot }
})
break
case "step.failed":
case "session.step.failed":
message.update(event.data.sessionID, (draft, index) => {
const currentAssistant = message.assistant(draft, index, event.data.assistantMessageID)
if (!currentAssistant) return
@ -360,7 +359,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
currentAssistant.error = event.data.error
})
break
case "text.started":
case "session.text.started":
message.update(event.data.sessionID, (draft, index) => {
message.assistant(draft, index, event.data.assistantMessageID)?.content.push({
type: "text",
@ -369,7 +368,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "text.delta":
case "session.text.delta":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestText(
message.assistant(draft, index, event.data.assistantMessageID),
@ -378,7 +377,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
if (match) match.text += event.data.delta
})
break
case "text.ended":
case "session.text.ended":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestText(
message.assistant(draft, index, event.data.assistantMessageID),
@ -387,7 +386,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
if (match) match.text = event.data.text
})
break
case "tool.input.started":
case "session.tool.input.started":
message.update(event.data.sessionID, (draft, index) => {
message.assistant(draft, index, event.data.assistantMessageID)?.content.push({
type: "tool",
@ -398,7 +397,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "tool.input.delta":
case "session.tool.input.delta":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestTool(
message.assistant(draft, index, event.data.assistantMessageID),
@ -407,7 +406,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
if (match?.state.status === "pending") match.state.input += event.data.delta
})
break
case "tool.input.ended":
case "session.tool.input.ended":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestTool(
message.assistant(draft, index, event.data.assistantMessageID),
@ -416,7 +415,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
if (match?.state.status === "pending") match.state.input = event.data.text
})
break
case "tool.called":
case "session.tool.called":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestTool(
message.assistant(draft, index, event.data.assistantMessageID),
@ -428,7 +427,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
match.state = { status: "running", input: event.data.input, structured: {}, content: [] }
})
break
case "tool.progress":
case "session.tool.progress":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestTool(
message.assistant(draft, index, event.data.assistantMessageID),
@ -439,7 +438,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
match.state.content = [...event.data.content]
})
break
case "tool.success":
case "session.tool.success":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestTool(
message.assistant(draft, index, event.data.assistantMessageID),
@ -461,7 +460,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
match.time.completed = event.created
})
break
case "tool.failed":
case "session.tool.failed":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestTool(
message.assistant(draft, index, event.data.assistantMessageID),
@ -484,7 +483,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
match.time.completed = event.created
})
break
case "reasoning.started":
case "session.reasoning.started":
message.update(event.data.sessionID, (draft, index) => {
message.assistant(draft, index, event.data.assistantMessageID)?.content.push({
type: "reasoning",
@ -495,7 +494,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
})
})
break
case "reasoning.delta":
case "session.reasoning.delta":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestReasoning(
message.assistant(draft, index, event.data.assistantMessageID),
@ -504,7 +503,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
if (match) match.text += event.data.delta
})
break
case "reasoning.ended":
case "session.reasoning.ended":
message.update(event.data.sessionID, (draft, index) => {
const match = message.latestReasoning(
message.assistant(draft, index, event.data.assistantMessageID),
@ -517,25 +516,25 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
}
})
break
case "retried":
case "compaction.started":
case "session.retried":
case "session.compaction.started":
setStore("session", "status", event.data.sessionID, "running")
break
case "execution.settled":
case "session.execution.settled":
setStore("session", "status", event.data.sessionID, "idle")
break
case "revert.staged":
case "session.revert.staged":
if (store.session.info[event.data.sessionID])
setStore("session", "info", event.data.sessionID, "revert", event.data.revert)
break
case "revert.cleared":
case "revert.committed":
case "session.revert.cleared":
case "session.revert.committed":
if (store.session.info[event.data.sessionID])
setStore("session", "info", event.data.sessionID, "revert", undefined)
break
case "compaction.delta":
case "session.compaction.delta":
break
case "compaction.ended":
case "session.compaction.ended":
message.update(event.data.sessionID, (draft, index) => {
message.append(draft, index, {
id: messageIDFromEvent(event.id),