fix(core,tui): resolve stuck compacting status with terminal compaction events

This commit is contained in:
Kit Langton 2026-07-02 08:48:25 -04:00
commit 4f4cb8cb36
10 changed files with 297 additions and 6 deletions

View file

@ -466,6 +466,18 @@ export namespace Compaction {
},
})
export type Ended = typeof Ended.Type
// Live-only: a failed compaction produces no durable message, but clients that
// reacted to Started need a terminal signal.
export const Failed = Event.define({
type: "session.next.compaction.failed",
schema: {
...Base,
messageID: SessionMessage.ID,
reason: Started.data.fields.reason,
},
})
export type Failed = typeof Failed.Type
}
export namespace RevertEvent {
@ -549,6 +561,7 @@ export const Definitions = Event.inventory(
Compaction.Started,
Compaction.Delta,
Compaction.Ended,
Compaction.Failed,
RevertEvent.Staged,
RevertEvent.Cleared,
RevertEvent.Committed,

View file

@ -9,11 +9,11 @@ import { WorkspaceEvent } from "../src/workspace-event.js"
describe("public event manifest", () => {
test("owns the complete public event surface", () => {
expect(EventManifest.ServerDefinitions.filter((definition) => definition.type !== "agent.updated").length).toBe(63)
expect(EventManifest.ServerDefinitions.filter((definition) => definition.type !== "agent.updated").length).toBe(66)
expect(EventManifest.ServerDefinitions.filter((definition) => definition.type === "agent.updated")).toEqual([
Agent.Event.Updated,
])
expect(EventManifest.Definitions.filter((definition) => definition.type !== "agent.updated").length).toBe(93)
expect(EventManifest.Definitions.filter((definition) => definition.type !== "agent.updated").length).toBe(97)
expect(EventManifest.Definitions.filter((definition) => definition.type === "agent.updated")).toEqual([
Agent.Event.Updated,
])
@ -29,7 +29,7 @@ describe("public event manifest", () => {
SessionV1.Event.Diff,
SessionV1.Event.Error,
])
expect(Array.from(EventManifest.Latest.keys()).filter((type) => type !== "agent.updated").length).toBe(93)
expect(Array.from(EventManifest.Latest.keys()).filter((type) => type !== "agent.updated").length).toBe(97)
expect(EventManifest.Latest.get("agent.updated")).toBe(Agent.Event.Updated)
expect(Agent.Event.Updated.durable).toBeUndefined()
expect(EventManifest.Durable.has("agent.updated")).toBe(false)