fix(core): enforce one step settlement

This commit is contained in:
Kit Langton 2026-06-25 23:25:08 -04:00
commit db664db5f3
8 changed files with 71 additions and 43 deletions

View file

@ -165,7 +165,7 @@ export namespace Step {
schema: {
...Base,
assistantMessageID: SessionMessage.ID,
finish: Schema.String,
finish: SessionMessage.Finish,
cost: Schema.Finite,
tokens: Schema.Struct({
input: Schema.Finite,
@ -195,7 +195,7 @@ export namespace Step {
export const Interrupted = Event.define({
type: "session.next.step.interrupted",
...options,
...stepSettlementOptions,
schema: {
...Base,
assistantMessageID: SessionMessage.ID,

View file

@ -21,6 +21,17 @@ export const UnknownError = Schema.Struct({
message: Schema.String,
}).annotate({ identifier: "Session.Error.Unknown" })
export const Finish = Schema.Literals([
"stop",
"length",
"tool-calls",
"content-filter",
"error",
"unknown",
"interrupted",
])
export type Finish = typeof Finish.Type
const Base = {
id: ID,
metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),
@ -169,7 +180,7 @@ export const Assistant = Schema.Struct({
end: Schema.String.pipe(optional),
files: Schema.Array(RelativePath).pipe(optional),
}).pipe(optional),
finish: Schema.String.pipe(optional),
finish: Finish.pipe(optional),
cost: Schema.Finite.pipe(optional),
tokens: Schema.Struct({
input: Schema.Finite,

View file

@ -42,11 +42,14 @@ describe("public event manifest", () => {
expect(Reference.Event.Definitions).toEqual([Reference.Event.Updated])
expect(EventManifest.Latest.has("ide.installed")).toBe(false)
expect(IdeEvent.Definitions).toEqual([IdeEvent.Installed])
expect(EventManifest.Definitions.slice(44, 47)).toEqual([
const partDelta = EventManifest.Definitions.indexOf(SessionV1.Event.PartDelta)
expect(partDelta).toBeGreaterThanOrEqual(0)
expect(EventManifest.Definitions.slice(partDelta, partDelta + 3)).toEqual([
SessionV1.Event.PartDelta,
SessionV1.Event.Diff,
SessionV1.Event.Error,
])
expect(EventManifest.Latest.get("session.next.step.interrupted")).toBe(SessionEvent.Step.Interrupted)
expect(EventManifest.Durable.has("session.next.step.ended.1")).toBe(false)
expect(EventManifest.Durable.get("session.next.step.ended.2")).toBe(SessionEvent.Step.Ended)
})