feat(tui): support session deletion

This commit is contained in:
Dax Raad
2026-07-06 19:19:22 -04:00
parent 96717c1a8c
commit c0ea1a43f9
18 changed files with 569 additions and 279 deletions
+117 -111
View File
@@ -74,192 +74,198 @@ export type Endpoint4_3Input = { readonly sessionID: Endpoint4_3Request["params"
export type Endpoint4_3Output = EffectValue<ReturnType<RawClient["server.session"]["session.get"]>>["data"] export type Endpoint4_3Output = EffectValue<ReturnType<RawClient["server.session"]["session.get"]>>["data"]
export type SessionGetOperation<E = never> = (input: Endpoint4_3Input) => Effect.Effect<Endpoint4_3Output, E> export type SessionGetOperation<E = never> = (input: Endpoint4_3Input) => Effect.Effect<Endpoint4_3Output, E>
type Endpoint4_4Request = Parameters<RawClient["server.session"]["session.fork"]>[0] type Endpoint4_4Request = Parameters<RawClient["server.session"]["session.remove"]>[0]
export type Endpoint4_4Input = { export type Endpoint4_4Input = { readonly sessionID: Endpoint4_4Request["params"]["sessionID"] }
readonly sessionID: Endpoint4_4Request["params"]["sessionID"] export type Endpoint4_4Output = EffectValue<ReturnType<RawClient["server.session"]["session.remove"]>>
readonly messageID?: Endpoint4_4Request["payload"]["messageID"] export type SessionRemoveOperation<E = never> = (input: Endpoint4_4Input) => Effect.Effect<Endpoint4_4Output, E>
}
export type Endpoint4_4Output = EffectValue<ReturnType<RawClient["server.session"]["session.fork"]>>["data"]
export type SessionForkOperation<E = never> = (input: Endpoint4_4Input) => Effect.Effect<Endpoint4_4Output, E>
type Endpoint4_5Request = Parameters<RawClient["server.session"]["session.switchAgent"]>[0] type Endpoint4_5Request = Parameters<RawClient["server.session"]["session.fork"]>[0]
export type Endpoint4_5Input = { export type Endpoint4_5Input = {
readonly sessionID: Endpoint4_5Request["params"]["sessionID"] readonly sessionID: Endpoint4_5Request["params"]["sessionID"]
readonly agent: Endpoint4_5Request["payload"]["agent"] readonly messageID?: Endpoint4_5Request["payload"]["messageID"]
} }
export type Endpoint4_5Output = EffectValue<ReturnType<RawClient["server.session"]["session.switchAgent"]>> export type Endpoint4_5Output = EffectValue<ReturnType<RawClient["server.session"]["session.fork"]>>["data"]
export type SessionSwitchAgentOperation<E = never> = (input: Endpoint4_5Input) => Effect.Effect<Endpoint4_5Output, E> export type SessionForkOperation<E = never> = (input: Endpoint4_5Input) => Effect.Effect<Endpoint4_5Output, E>
type Endpoint4_6Request = Parameters<RawClient["server.session"]["session.switchModel"]>[0] type Endpoint4_6Request = Parameters<RawClient["server.session"]["session.switchAgent"]>[0]
export type Endpoint4_6Input = { export type Endpoint4_6Input = {
readonly sessionID: Endpoint4_6Request["params"]["sessionID"] readonly sessionID: Endpoint4_6Request["params"]["sessionID"]
readonly model: Endpoint4_6Request["payload"]["model"] readonly agent: Endpoint4_6Request["payload"]["agent"]
} }
export type Endpoint4_6Output = EffectValue<ReturnType<RawClient["server.session"]["session.switchModel"]>> export type Endpoint4_6Output = EffectValue<ReturnType<RawClient["server.session"]["session.switchAgent"]>>
export type SessionSwitchModelOperation<E = never> = (input: Endpoint4_6Input) => Effect.Effect<Endpoint4_6Output, E> export type SessionSwitchAgentOperation<E = never> = (input: Endpoint4_6Input) => Effect.Effect<Endpoint4_6Output, E>
type Endpoint4_7Request = Parameters<RawClient["server.session"]["session.rename"]>[0] type Endpoint4_7Request = Parameters<RawClient["server.session"]["session.switchModel"]>[0]
export type Endpoint4_7Input = { export type Endpoint4_7Input = {
readonly sessionID: Endpoint4_7Request["params"]["sessionID"] readonly sessionID: Endpoint4_7Request["params"]["sessionID"]
readonly title: Endpoint4_7Request["payload"]["title"] readonly model: Endpoint4_7Request["payload"]["model"]
} }
export type Endpoint4_7Output = EffectValue<ReturnType<RawClient["server.session"]["session.rename"]>> export type Endpoint4_7Output = EffectValue<ReturnType<RawClient["server.session"]["session.switchModel"]>>
export type SessionRenameOperation<E = never> = (input: Endpoint4_7Input) => Effect.Effect<Endpoint4_7Output, E> export type SessionSwitchModelOperation<E = never> = (input: Endpoint4_7Input) => Effect.Effect<Endpoint4_7Output, E>
type Endpoint4_8Request = Parameters<RawClient["server.session"]["session.prompt"]>[0] type Endpoint4_8Request = Parameters<RawClient["server.session"]["session.rename"]>[0]
export type Endpoint4_8Input = { export type Endpoint4_8Input = {
readonly sessionID: Endpoint4_8Request["params"]["sessionID"] readonly sessionID: Endpoint4_8Request["params"]["sessionID"]
readonly id?: Endpoint4_8Request["payload"]["id"] readonly title: Endpoint4_8Request["payload"]["title"]
readonly prompt: Endpoint4_8Request["payload"]["prompt"]
readonly delivery?: Endpoint4_8Request["payload"]["delivery"]
readonly resume?: Endpoint4_8Request["payload"]["resume"]
} }
export type Endpoint4_8Output = EffectValue<ReturnType<RawClient["server.session"]["session.prompt"]>>["data"] export type Endpoint4_8Output = EffectValue<ReturnType<RawClient["server.session"]["session.rename"]>>
export type SessionPromptOperation<E = never> = (input: Endpoint4_8Input) => Effect.Effect<Endpoint4_8Output, E> export type SessionRenameOperation<E = never> = (input: Endpoint4_8Input) => Effect.Effect<Endpoint4_8Output, E>
type Endpoint4_9Request = Parameters<RawClient["server.session"]["session.command"]>[0] type Endpoint4_9Request = Parameters<RawClient["server.session"]["session.prompt"]>[0]
export type Endpoint4_9Input = { export type Endpoint4_9Input = {
readonly sessionID: Endpoint4_9Request["params"]["sessionID"] readonly sessionID: Endpoint4_9Request["params"]["sessionID"]
readonly id?: Endpoint4_9Request["payload"]["id"] readonly id?: Endpoint4_9Request["payload"]["id"]
readonly command: Endpoint4_9Request["payload"]["command"] readonly prompt: Endpoint4_9Request["payload"]["prompt"]
readonly arguments?: Endpoint4_9Request["payload"]["arguments"]
readonly agent?: Endpoint4_9Request["payload"]["agent"]
readonly model?: Endpoint4_9Request["payload"]["model"]
readonly files?: Endpoint4_9Request["payload"]["files"]
readonly agents?: Endpoint4_9Request["payload"]["agents"]
readonly delivery?: Endpoint4_9Request["payload"]["delivery"] readonly delivery?: Endpoint4_9Request["payload"]["delivery"]
readonly resume?: Endpoint4_9Request["payload"]["resume"] readonly resume?: Endpoint4_9Request["payload"]["resume"]
} }
export type Endpoint4_9Output = EffectValue<ReturnType<RawClient["server.session"]["session.command"]>>["data"] export type Endpoint4_9Output = EffectValue<ReturnType<RawClient["server.session"]["session.prompt"]>>["data"]
export type SessionCommandOperation<E = never> = (input: Endpoint4_9Input) => Effect.Effect<Endpoint4_9Output, E> export type SessionPromptOperation<E = never> = (input: Endpoint4_9Input) => Effect.Effect<Endpoint4_9Output, E>
type Endpoint4_10Request = Parameters<RawClient["server.session"]["session.skill"]>[0] type Endpoint4_10Request = Parameters<RawClient["server.session"]["session.command"]>[0]
export type Endpoint4_10Input = { export type Endpoint4_10Input = {
readonly sessionID: Endpoint4_10Request["params"]["sessionID"] readonly sessionID: Endpoint4_10Request["params"]["sessionID"]
readonly id?: Endpoint4_10Request["payload"]["id"] readonly id?: Endpoint4_10Request["payload"]["id"]
readonly skill: Endpoint4_10Request["payload"]["skill"] readonly command: Endpoint4_10Request["payload"]["command"]
readonly arguments?: Endpoint4_10Request["payload"]["arguments"]
readonly agent?: Endpoint4_10Request["payload"]["agent"]
readonly model?: Endpoint4_10Request["payload"]["model"]
readonly files?: Endpoint4_10Request["payload"]["files"]
readonly agents?: Endpoint4_10Request["payload"]["agents"]
readonly delivery?: Endpoint4_10Request["payload"]["delivery"]
readonly resume?: Endpoint4_10Request["payload"]["resume"] readonly resume?: Endpoint4_10Request["payload"]["resume"]
} }
export type Endpoint4_10Output = EffectValue<ReturnType<RawClient["server.session"]["session.skill"]>> export type Endpoint4_10Output = EffectValue<ReturnType<RawClient["server.session"]["session.command"]>>["data"]
export type SessionSkillOperation<E = never> = (input: Endpoint4_10Input) => Effect.Effect<Endpoint4_10Output, E> export type SessionCommandOperation<E = never> = (input: Endpoint4_10Input) => Effect.Effect<Endpoint4_10Output, E>
type Endpoint4_11Request = Parameters<RawClient["server.session"]["session.synthetic"]>[0] type Endpoint4_11Request = Parameters<RawClient["server.session"]["session.skill"]>[0]
export type Endpoint4_11Input = { export type Endpoint4_11Input = {
readonly sessionID: Endpoint4_11Request["params"]["sessionID"] readonly sessionID: Endpoint4_11Request["params"]["sessionID"]
readonly text: Endpoint4_11Request["payload"]["text"] readonly id?: Endpoint4_11Request["payload"]["id"]
readonly description?: Endpoint4_11Request["payload"]["description"] readonly skill: Endpoint4_11Request["payload"]["skill"]
readonly metadata?: Endpoint4_11Request["payload"]["metadata"] readonly resume?: Endpoint4_11Request["payload"]["resume"]
} }
export type Endpoint4_11Output = EffectValue<ReturnType<RawClient["server.session"]["session.synthetic"]>> export type Endpoint4_11Output = EffectValue<ReturnType<RawClient["server.session"]["session.skill"]>>
export type SessionSyntheticOperation<E = never> = (input: Endpoint4_11Input) => Effect.Effect<Endpoint4_11Output, E> export type SessionSkillOperation<E = never> = (input: Endpoint4_11Input) => Effect.Effect<Endpoint4_11Output, E>
type Endpoint4_12Request = Parameters<RawClient["server.session"]["session.shell"]>[0] type Endpoint4_12Request = Parameters<RawClient["server.session"]["session.synthetic"]>[0]
export type Endpoint4_12Input = { export type Endpoint4_12Input = {
readonly sessionID: Endpoint4_12Request["params"]["sessionID"] readonly sessionID: Endpoint4_12Request["params"]["sessionID"]
readonly id?: Endpoint4_12Request["payload"]["id"] readonly text: Endpoint4_12Request["payload"]["text"]
readonly command: Endpoint4_12Request["payload"]["command"] readonly description?: Endpoint4_12Request["payload"]["description"]
readonly metadata?: Endpoint4_12Request["payload"]["metadata"]
} }
export type Endpoint4_12Output = EffectValue<ReturnType<RawClient["server.session"]["session.shell"]>> export type Endpoint4_12Output = EffectValue<ReturnType<RawClient["server.session"]["session.synthetic"]>>
export type SessionShellOperation<E = never> = (input: Endpoint4_12Input) => Effect.Effect<Endpoint4_12Output, E> export type SessionSyntheticOperation<E = never> = (input: Endpoint4_12Input) => Effect.Effect<Endpoint4_12Output, E>
type Endpoint4_13Request = Parameters<RawClient["server.session"]["session.compact"]>[0] type Endpoint4_13Request = Parameters<RawClient["server.session"]["session.shell"]>[0]
export type Endpoint4_13Input = { readonly sessionID: Endpoint4_13Request["params"]["sessionID"] } export type Endpoint4_13Input = {
export type Endpoint4_13Output = EffectValue<ReturnType<RawClient["server.session"]["session.compact"]>> readonly sessionID: Endpoint4_13Request["params"]["sessionID"]
export type SessionCompactOperation<E = never> = (input: Endpoint4_13Input) => Effect.Effect<Endpoint4_13Output, E> readonly id?: Endpoint4_13Request["payload"]["id"]
readonly command: Endpoint4_13Request["payload"]["command"]
}
export type Endpoint4_13Output = EffectValue<ReturnType<RawClient["server.session"]["session.shell"]>>
export type SessionShellOperation<E = never> = (input: Endpoint4_13Input) => Effect.Effect<Endpoint4_13Output, E>
type Endpoint4_14Request = Parameters<RawClient["server.session"]["session.wait"]>[0] type Endpoint4_14Request = Parameters<RawClient["server.session"]["session.compact"]>[0]
export type Endpoint4_14Input = { readonly sessionID: Endpoint4_14Request["params"]["sessionID"] } export type Endpoint4_14Input = { readonly sessionID: Endpoint4_14Request["params"]["sessionID"] }
export type Endpoint4_14Output = EffectValue<ReturnType<RawClient["server.session"]["session.wait"]>> export type Endpoint4_14Output = EffectValue<ReturnType<RawClient["server.session"]["session.compact"]>>
export type SessionWaitOperation<E = never> = (input: Endpoint4_14Input) => Effect.Effect<Endpoint4_14Output, E> export type SessionCompactOperation<E = never> = (input: Endpoint4_14Input) => Effect.Effect<Endpoint4_14Output, E>
type Endpoint4_15Request = Parameters<RawClient["server.session"]["session.revert.stage"]>[0] type Endpoint4_15Request = Parameters<RawClient["server.session"]["session.wait"]>[0]
export type Endpoint4_15Input = { export type Endpoint4_15Input = { readonly sessionID: Endpoint4_15Request["params"]["sessionID"] }
readonly sessionID: Endpoint4_15Request["params"]["sessionID"] export type Endpoint4_15Output = EffectValue<ReturnType<RawClient["server.session"]["session.wait"]>>
readonly messageID: Endpoint4_15Request["payload"]["messageID"] export type SessionWaitOperation<E = never> = (input: Endpoint4_15Input) => Effect.Effect<Endpoint4_15Output, E>
readonly files?: Endpoint4_15Request["payload"]["files"]
type Endpoint4_16Request = Parameters<RawClient["server.session"]["session.revert.stage"]>[0]
export type Endpoint4_16Input = {
readonly sessionID: Endpoint4_16Request["params"]["sessionID"]
readonly messageID: Endpoint4_16Request["payload"]["messageID"]
readonly files?: Endpoint4_16Request["payload"]["files"]
} }
export type Endpoint4_15Output = EffectValue<ReturnType<RawClient["server.session"]["session.revert.stage"]>>["data"] export type Endpoint4_16Output = EffectValue<ReturnType<RawClient["server.session"]["session.revert.stage"]>>["data"]
export type SessionRevertStageOperation<E = never> = (input: Endpoint4_15Input) => Effect.Effect<Endpoint4_15Output, E> export type SessionRevertStageOperation<E = never> = (input: Endpoint4_16Input) => Effect.Effect<Endpoint4_16Output, E>
type Endpoint4_16Request = Parameters<RawClient["server.session"]["session.revert.clear"]>[0] type Endpoint4_17Request = Parameters<RawClient["server.session"]["session.revert.clear"]>[0]
export type Endpoint4_16Input = { readonly sessionID: Endpoint4_16Request["params"]["sessionID"] }
export type Endpoint4_16Output = EffectValue<ReturnType<RawClient["server.session"]["session.revert.clear"]>>
export type SessionRevertClearOperation<E = never> = (input: Endpoint4_16Input) => Effect.Effect<Endpoint4_16Output, E>
type Endpoint4_17Request = Parameters<RawClient["server.session"]["session.revert.commit"]>[0]
export type Endpoint4_17Input = { readonly sessionID: Endpoint4_17Request["params"]["sessionID"] } export type Endpoint4_17Input = { readonly sessionID: Endpoint4_17Request["params"]["sessionID"] }
export type Endpoint4_17Output = EffectValue<ReturnType<RawClient["server.session"]["session.revert.commit"]>> export type Endpoint4_17Output = EffectValue<ReturnType<RawClient["server.session"]["session.revert.clear"]>>
export type SessionRevertCommitOperation<E = never> = (input: Endpoint4_17Input) => Effect.Effect<Endpoint4_17Output, E> export type SessionRevertClearOperation<E = never> = (input: Endpoint4_17Input) => Effect.Effect<Endpoint4_17Output, E>
type Endpoint4_18Request = Parameters<RawClient["server.session"]["session.context"]>[0] type Endpoint4_18Request = Parameters<RawClient["server.session"]["session.revert.commit"]>[0]
export type Endpoint4_18Input = { readonly sessionID: Endpoint4_18Request["params"]["sessionID"] } export type Endpoint4_18Input = { readonly sessionID: Endpoint4_18Request["params"]["sessionID"] }
export type Endpoint4_18Output = EffectValue<ReturnType<RawClient["server.session"]["session.context"]>>["data"] export type Endpoint4_18Output = EffectValue<ReturnType<RawClient["server.session"]["session.revert.commit"]>>
export type SessionContextOperation<E = never> = (input: Endpoint4_18Input) => Effect.Effect<Endpoint4_18Output, E> export type SessionRevertCommitOperation<E = never> = (input: Endpoint4_18Input) => Effect.Effect<Endpoint4_18Output, E>
type Endpoint4_19Request = Parameters<RawClient["server.session"]["session.instructions.entry.list"]>[0] type Endpoint4_19Request = Parameters<RawClient["server.session"]["session.context"]>[0]
export type Endpoint4_19Input = { readonly sessionID: Endpoint4_19Request["params"]["sessionID"] } export type Endpoint4_19Input = { readonly sessionID: Endpoint4_19Request["params"]["sessionID"] }
export type Endpoint4_19Output = EffectValue< export type Endpoint4_19Output = EffectValue<ReturnType<RawClient["server.session"]["session.context"]>>["data"]
export type SessionContextOperation<E = never> = (input: Endpoint4_19Input) => Effect.Effect<Endpoint4_19Output, E>
type Endpoint4_20Request = Parameters<RawClient["server.session"]["session.instructions.entry.list"]>[0]
export type Endpoint4_20Input = { readonly sessionID: Endpoint4_20Request["params"]["sessionID"] }
export type Endpoint4_20Output = EffectValue<
ReturnType<RawClient["server.session"]["session.instructions.entry.list"]> ReturnType<RawClient["server.session"]["session.instructions.entry.list"]>
>["data"] >["data"]
export type SessionInstructionsEntryListOperation<E = never> = ( export type SessionInstructionsEntryListOperation<E = never> = (
input: Endpoint4_19Input,
) => Effect.Effect<Endpoint4_19Output, E>
type Endpoint4_20Request = Parameters<RawClient["server.session"]["session.instructions.entry.put"]>[0]
export type Endpoint4_20Input = {
readonly sessionID: Endpoint4_20Request["params"]["sessionID"]
readonly key: Endpoint4_20Request["params"]["key"]
readonly value: Endpoint4_20Request["payload"]["value"]
}
export type Endpoint4_20Output = EffectValue<ReturnType<RawClient["server.session"]["session.instructions.entry.put"]>>
export type SessionInstructionsEntryPutOperation<E = never> = (
input: Endpoint4_20Input, input: Endpoint4_20Input,
) => Effect.Effect<Endpoint4_20Output, E> ) => Effect.Effect<Endpoint4_20Output, E>
type Endpoint4_21Request = Parameters<RawClient["server.session"]["session.instructions.entry.remove"]>[0] type Endpoint4_21Request = Parameters<RawClient["server.session"]["session.instructions.entry.put"]>[0]
export type Endpoint4_21Input = { export type Endpoint4_21Input = {
readonly sessionID: Endpoint4_21Request["params"]["sessionID"] readonly sessionID: Endpoint4_21Request["params"]["sessionID"]
readonly key: Endpoint4_21Request["params"]["key"] readonly key: Endpoint4_21Request["params"]["key"]
readonly value: Endpoint4_21Request["payload"]["value"]
} }
export type Endpoint4_21Output = EffectValue< export type Endpoint4_21Output = EffectValue<ReturnType<RawClient["server.session"]["session.instructions.entry.put"]>>
ReturnType<RawClient["server.session"]["session.instructions.entry.remove"]> export type SessionInstructionsEntryPutOperation<E = never> = (
>
export type SessionInstructionsEntryRemoveOperation<E = never> = (
input: Endpoint4_21Input, input: Endpoint4_21Input,
) => Effect.Effect<Endpoint4_21Output, E> ) => Effect.Effect<Endpoint4_21Output, E>
type Endpoint4_22Request = Parameters<RawClient["server.session"]["session.log"]>[0] type Endpoint4_22Request = Parameters<RawClient["server.session"]["session.instructions.entry.remove"]>[0]
export type Endpoint4_22Input = { export type Endpoint4_22Input = {
readonly sessionID: Endpoint4_22Request["params"]["sessionID"] readonly sessionID: Endpoint4_22Request["params"]["sessionID"]
readonly after?: Endpoint4_22Request["query"]["after"] readonly key: Endpoint4_22Request["params"]["key"]
readonly follow?: Endpoint4_22Request["query"]["follow"]
} }
export type Endpoint4_22Output = StreamValue<EffectValue<ReturnType<RawClient["server.session"]["session.log"]>>> export type Endpoint4_22Output = EffectValue<
export type SessionLogOperation<E = never> = (input: Endpoint4_22Input) => Stream.Stream<Endpoint4_22Output, E> ReturnType<RawClient["server.session"]["session.instructions.entry.remove"]>
>
export type SessionInstructionsEntryRemoveOperation<E = never> = (
input: Endpoint4_22Input,
) => Effect.Effect<Endpoint4_22Output, E>
type Endpoint4_23Request = Parameters<RawClient["server.session"]["session.interrupt"]>[0] type Endpoint4_23Request = Parameters<RawClient["server.session"]["session.log"]>[0]
export type Endpoint4_23Input = { readonly sessionID: Endpoint4_23Request["params"]["sessionID"] } export type Endpoint4_23Input = {
export type Endpoint4_23Output = EffectValue<ReturnType<RawClient["server.session"]["session.interrupt"]>> readonly sessionID: Endpoint4_23Request["params"]["sessionID"]
export type SessionInterruptOperation<E = never> = (input: Endpoint4_23Input) => Effect.Effect<Endpoint4_23Output, E> readonly after?: Endpoint4_23Request["query"]["after"]
readonly follow?: Endpoint4_23Request["query"]["follow"]
}
export type Endpoint4_23Output = StreamValue<EffectValue<ReturnType<RawClient["server.session"]["session.log"]>>>
export type SessionLogOperation<E = never> = (input: Endpoint4_23Input) => Stream.Stream<Endpoint4_23Output, E>
type Endpoint4_24Request = Parameters<RawClient["server.session"]["session.background"]>[0] type Endpoint4_24Request = Parameters<RawClient["server.session"]["session.interrupt"]>[0]
export type Endpoint4_24Input = { readonly sessionID: Endpoint4_24Request["params"]["sessionID"] } export type Endpoint4_24Input = { readonly sessionID: Endpoint4_24Request["params"]["sessionID"] }
export type Endpoint4_24Output = EffectValue<ReturnType<RawClient["server.session"]["session.background"]>> export type Endpoint4_24Output = EffectValue<ReturnType<RawClient["server.session"]["session.interrupt"]>>
export type SessionBackgroundOperation<E = never> = (input: Endpoint4_24Input) => Effect.Effect<Endpoint4_24Output, E> export type SessionInterruptOperation<E = never> = (input: Endpoint4_24Input) => Effect.Effect<Endpoint4_24Output, E>
type Endpoint4_25Request = Parameters<RawClient["server.session"]["session.message"]>[0] type Endpoint4_25Request = Parameters<RawClient["server.session"]["session.background"]>[0]
export type Endpoint4_25Input = { export type Endpoint4_25Input = { readonly sessionID: Endpoint4_25Request["params"]["sessionID"] }
readonly sessionID: Endpoint4_25Request["params"]["sessionID"] export type Endpoint4_25Output = EffectValue<ReturnType<RawClient["server.session"]["session.background"]>>
readonly messageID: Endpoint4_25Request["params"]["messageID"] export type SessionBackgroundOperation<E = never> = (input: Endpoint4_25Input) => Effect.Effect<Endpoint4_25Output, E>
type Endpoint4_26Request = Parameters<RawClient["server.session"]["session.message"]>[0]
export type Endpoint4_26Input = {
readonly sessionID: Endpoint4_26Request["params"]["sessionID"]
readonly messageID: Endpoint4_26Request["params"]["messageID"]
} }
export type Endpoint4_25Output = EffectValue<ReturnType<RawClient["server.session"]["session.message"]>>["data"] export type Endpoint4_26Output = EffectValue<ReturnType<RawClient["server.session"]["session.message"]>>["data"]
export type SessionMessageOperation<E = never> = (input: Endpoint4_25Input) => Effect.Effect<Endpoint4_25Output, E> export type SessionMessageOperation<E = never> = (input: Endpoint4_26Input) => Effect.Effect<Endpoint4_26Output, E>
export interface SessionApi<E = never> { export interface SessionApi<E = never> {
readonly list: SessionListOperation<E> readonly list: SessionListOperation<E>
readonly create: SessionCreateOperation<E> readonly create: SessionCreateOperation<E>
readonly active: SessionActiveOperation<E> readonly active: SessionActiveOperation<E>
readonly get: SessionGetOperation<E> readonly get: SessionGetOperation<E>
readonly remove: SessionRemoveOperation<E>
readonly fork: SessionForkOperation<E> readonly fork: SessionForkOperation<E>
readonly switchAgent: SessionSwitchAgentOperation<E> readonly switchAgent: SessionSwitchAgentOperation<E>
readonly switchModel: SessionSwitchModelOperation<E> readonly switchModel: SessionSwitchModelOperation<E>
+138 -132
View File
@@ -95,56 +95,61 @@ const Endpoint4_3 = (raw: RawClient["server.session"]) => (input: Endpoint4_3Inp
Effect.map((value) => value.data), Effect.map((value) => value.data),
) )
type Endpoint4_4Request = Parameters<RawClient["server.session"]["session.fork"]>[0] type Endpoint4_4Request = Parameters<RawClient["server.session"]["session.remove"]>[0]
type Endpoint4_4Input = { type Endpoint4_4Input = { readonly sessionID: Endpoint4_4Request["params"]["sessionID"] }
readonly sessionID: Endpoint4_4Request["params"]["sessionID"]
readonly messageID?: Endpoint4_4Request["payload"]["messageID"]
}
const Endpoint4_4 = (raw: RawClient["server.session"]) => (input: Endpoint4_4Input) => const Endpoint4_4 = (raw: RawClient["server.session"]) => (input: Endpoint4_4Input) =>
raw["session.remove"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_5Request = Parameters<RawClient["server.session"]["session.fork"]>[0]
type Endpoint4_5Input = {
readonly sessionID: Endpoint4_5Request["params"]["sessionID"]
readonly messageID?: Endpoint4_5Request["payload"]["messageID"]
}
const Endpoint4_5 = (raw: RawClient["server.session"]) => (input: Endpoint4_5Input) =>
raw["session.fork"]({ params: { sessionID: input["sessionID"] }, payload: { messageID: input["messageID"] } }).pipe( raw["session.fork"]({ params: { sessionID: input["sessionID"] }, payload: { messageID: input["messageID"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
Effect.map((value) => value.data), Effect.map((value) => value.data),
) )
type Endpoint4_5Request = Parameters<RawClient["server.session"]["session.switchAgent"]>[0] type Endpoint4_6Request = Parameters<RawClient["server.session"]["session.switchAgent"]>[0]
type Endpoint4_5Input = { type Endpoint4_6Input = {
readonly sessionID: Endpoint4_5Request["params"]["sessionID"] readonly sessionID: Endpoint4_6Request["params"]["sessionID"]
readonly agent: Endpoint4_5Request["payload"]["agent"] readonly agent: Endpoint4_6Request["payload"]["agent"]
} }
const Endpoint4_5 = (raw: RawClient["server.session"]) => (input: Endpoint4_5Input) => const Endpoint4_6 = (raw: RawClient["server.session"]) => (input: Endpoint4_6Input) =>
raw["session.switchAgent"]({ params: { sessionID: input["sessionID"] }, payload: { agent: input["agent"] } }).pipe( raw["session.switchAgent"]({ params: { sessionID: input["sessionID"] }, payload: { agent: input["agent"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
) )
type Endpoint4_6Request = Parameters<RawClient["server.session"]["session.switchModel"]>[0] type Endpoint4_7Request = Parameters<RawClient["server.session"]["session.switchModel"]>[0]
type Endpoint4_6Input = { type Endpoint4_7Input = {
readonly sessionID: Endpoint4_6Request["params"]["sessionID"] readonly sessionID: Endpoint4_7Request["params"]["sessionID"]
readonly model: Endpoint4_6Request["payload"]["model"] readonly model: Endpoint4_7Request["payload"]["model"]
} }
const Endpoint4_6 = (raw: RawClient["server.session"]) => (input: Endpoint4_6Input) => const Endpoint4_7 = (raw: RawClient["server.session"]) => (input: Endpoint4_7Input) =>
raw["session.switchModel"]({ params: { sessionID: input["sessionID"] }, payload: { model: input["model"] } }).pipe( raw["session.switchModel"]({ params: { sessionID: input["sessionID"] }, payload: { model: input["model"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
) )
type Endpoint4_7Request = Parameters<RawClient["server.session"]["session.rename"]>[0] type Endpoint4_8Request = Parameters<RawClient["server.session"]["session.rename"]>[0]
type Endpoint4_7Input = { type Endpoint4_8Input = {
readonly sessionID: Endpoint4_7Request["params"]["sessionID"] readonly sessionID: Endpoint4_8Request["params"]["sessionID"]
readonly title: Endpoint4_7Request["payload"]["title"] readonly title: Endpoint4_8Request["payload"]["title"]
} }
const Endpoint4_7 = (raw: RawClient["server.session"]) => (input: Endpoint4_7Input) => const Endpoint4_8 = (raw: RawClient["server.session"]) => (input: Endpoint4_8Input) =>
raw["session.rename"]({ params: { sessionID: input["sessionID"] }, payload: { title: input["title"] } }).pipe( raw["session.rename"]({ params: { sessionID: input["sessionID"] }, payload: { title: input["title"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
) )
type Endpoint4_8Request = Parameters<RawClient["server.session"]["session.prompt"]>[0] type Endpoint4_9Request = Parameters<RawClient["server.session"]["session.prompt"]>[0]
type Endpoint4_8Input = { type Endpoint4_9Input = {
readonly sessionID: Endpoint4_8Request["params"]["sessionID"] readonly sessionID: Endpoint4_9Request["params"]["sessionID"]
readonly id?: Endpoint4_8Request["payload"]["id"] readonly id?: Endpoint4_9Request["payload"]["id"]
readonly prompt: Endpoint4_8Request["payload"]["prompt"] readonly prompt: Endpoint4_9Request["payload"]["prompt"]
readonly delivery?: Endpoint4_8Request["payload"]["delivery"] readonly delivery?: Endpoint4_9Request["payload"]["delivery"]
readonly resume?: Endpoint4_8Request["payload"]["resume"] readonly resume?: Endpoint4_9Request["payload"]["resume"]
} }
const Endpoint4_8 = (raw: RawClient["server.session"]) => (input: Endpoint4_8Input) => const Endpoint4_9 = (raw: RawClient["server.session"]) => (input: Endpoint4_9Input) =>
raw["session.prompt"]({ raw["session.prompt"]({
params: { sessionID: input["sessionID"] }, params: { sessionID: input["sessionID"] },
payload: { id: input["id"], prompt: input["prompt"], delivery: input["delivery"], resume: input["resume"] }, payload: { id: input["id"], prompt: input["prompt"], delivery: input["delivery"], resume: input["resume"] },
@@ -153,20 +158,20 @@ const Endpoint4_8 = (raw: RawClient["server.session"]) => (input: Endpoint4_8Inp
Effect.map((value) => value.data), Effect.map((value) => value.data),
) )
type Endpoint4_9Request = Parameters<RawClient["server.session"]["session.command"]>[0] type Endpoint4_10Request = Parameters<RawClient["server.session"]["session.command"]>[0]
type Endpoint4_9Input = { type Endpoint4_10Input = {
readonly sessionID: Endpoint4_9Request["params"]["sessionID"] readonly sessionID: Endpoint4_10Request["params"]["sessionID"]
readonly id?: Endpoint4_9Request["payload"]["id"] readonly id?: Endpoint4_10Request["payload"]["id"]
readonly command: Endpoint4_9Request["payload"]["command"] readonly command: Endpoint4_10Request["payload"]["command"]
readonly arguments?: Endpoint4_9Request["payload"]["arguments"] readonly arguments?: Endpoint4_10Request["payload"]["arguments"]
readonly agent?: Endpoint4_9Request["payload"]["agent"] readonly agent?: Endpoint4_10Request["payload"]["agent"]
readonly model?: Endpoint4_9Request["payload"]["model"] readonly model?: Endpoint4_10Request["payload"]["model"]
readonly files?: Endpoint4_9Request["payload"]["files"] readonly files?: Endpoint4_10Request["payload"]["files"]
readonly agents?: Endpoint4_9Request["payload"]["agents"] readonly agents?: Endpoint4_10Request["payload"]["agents"]
readonly delivery?: Endpoint4_9Request["payload"]["delivery"] readonly delivery?: Endpoint4_10Request["payload"]["delivery"]
readonly resume?: Endpoint4_9Request["payload"]["resume"] readonly resume?: Endpoint4_10Request["payload"]["resume"]
} }
const Endpoint4_9 = (raw: RawClient["server.session"]) => (input: Endpoint4_9Input) => const Endpoint4_10 = (raw: RawClient["server.session"]) => (input: Endpoint4_10Input) =>
raw["session.command"]({ raw["session.command"]({
params: { sessionID: input["sessionID"] }, params: { sessionID: input["sessionID"] },
payload: { payload: {
@@ -185,61 +190,61 @@ const Endpoint4_9 = (raw: RawClient["server.session"]) => (input: Endpoint4_9Inp
Effect.map((value) => value.data), Effect.map((value) => value.data),
) )
type Endpoint4_10Request = Parameters<RawClient["server.session"]["session.skill"]>[0] type Endpoint4_11Request = Parameters<RawClient["server.session"]["session.skill"]>[0]
type Endpoint4_10Input = { type Endpoint4_11Input = {
readonly sessionID: Endpoint4_10Request["params"]["sessionID"] readonly sessionID: Endpoint4_11Request["params"]["sessionID"]
readonly id?: Endpoint4_10Request["payload"]["id"] readonly id?: Endpoint4_11Request["payload"]["id"]
readonly skill: Endpoint4_10Request["payload"]["skill"] readonly skill: Endpoint4_11Request["payload"]["skill"]
readonly resume?: Endpoint4_10Request["payload"]["resume"] readonly resume?: Endpoint4_11Request["payload"]["resume"]
} }
const Endpoint4_10 = (raw: RawClient["server.session"]) => (input: Endpoint4_10Input) => const Endpoint4_11 = (raw: RawClient["server.session"]) => (input: Endpoint4_11Input) =>
raw["session.skill"]({ raw["session.skill"]({
params: { sessionID: input["sessionID"] }, params: { sessionID: input["sessionID"] },
payload: { id: input["id"], skill: input["skill"], resume: input["resume"] }, payload: { id: input["id"], skill: input["skill"], resume: input["resume"] },
}).pipe(Effect.mapError(mapClientError)) }).pipe(Effect.mapError(mapClientError))
type Endpoint4_11Request = Parameters<RawClient["server.session"]["session.synthetic"]>[0] type Endpoint4_12Request = Parameters<RawClient["server.session"]["session.synthetic"]>[0]
type Endpoint4_11Input = { type Endpoint4_12Input = {
readonly sessionID: Endpoint4_11Request["params"]["sessionID"] readonly sessionID: Endpoint4_12Request["params"]["sessionID"]
readonly text: Endpoint4_11Request["payload"]["text"] readonly text: Endpoint4_12Request["payload"]["text"]
readonly description?: Endpoint4_11Request["payload"]["description"] readonly description?: Endpoint4_12Request["payload"]["description"]
readonly metadata?: Endpoint4_11Request["payload"]["metadata"] readonly metadata?: Endpoint4_12Request["payload"]["metadata"]
} }
const Endpoint4_11 = (raw: RawClient["server.session"]) => (input: Endpoint4_11Input) => const Endpoint4_12 = (raw: RawClient["server.session"]) => (input: Endpoint4_12Input) =>
raw["session.synthetic"]({ raw["session.synthetic"]({
params: { sessionID: input["sessionID"] }, params: { sessionID: input["sessionID"] },
payload: { text: input["text"], description: input["description"], metadata: input["metadata"] }, payload: { text: input["text"], description: input["description"], metadata: input["metadata"] },
}).pipe(Effect.mapError(mapClientError)) }).pipe(Effect.mapError(mapClientError))
type Endpoint4_12Request = Parameters<RawClient["server.session"]["session.shell"]>[0] type Endpoint4_13Request = Parameters<RawClient["server.session"]["session.shell"]>[0]
type Endpoint4_12Input = { type Endpoint4_13Input = {
readonly sessionID: Endpoint4_12Request["params"]["sessionID"] readonly sessionID: Endpoint4_13Request["params"]["sessionID"]
readonly id?: Endpoint4_12Request["payload"]["id"] readonly id?: Endpoint4_13Request["payload"]["id"]
readonly command: Endpoint4_12Request["payload"]["command"] readonly command: Endpoint4_13Request["payload"]["command"]
} }
const Endpoint4_12 = (raw: RawClient["server.session"]) => (input: Endpoint4_12Input) => const Endpoint4_13 = (raw: RawClient["server.session"]) => (input: Endpoint4_13Input) =>
raw["session.shell"]({ raw["session.shell"]({
params: { sessionID: input["sessionID"] }, params: { sessionID: input["sessionID"] },
payload: { id: input["id"], command: input["command"] }, payload: { id: input["id"], command: input["command"] },
}).pipe(Effect.mapError(mapClientError)) }).pipe(Effect.mapError(mapClientError))
type Endpoint4_13Request = Parameters<RawClient["server.session"]["session.compact"]>[0] type Endpoint4_14Request = Parameters<RawClient["server.session"]["session.compact"]>[0]
type Endpoint4_13Input = { readonly sessionID: Endpoint4_13Request["params"]["sessionID"] }
const Endpoint4_13 = (raw: RawClient["server.session"]) => (input: Endpoint4_13Input) =>
raw["session.compact"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_14Request = Parameters<RawClient["server.session"]["session.wait"]>[0]
type Endpoint4_14Input = { readonly sessionID: Endpoint4_14Request["params"]["sessionID"] } type Endpoint4_14Input = { readonly sessionID: Endpoint4_14Request["params"]["sessionID"] }
const Endpoint4_14 = (raw: RawClient["server.session"]) => (input: Endpoint4_14Input) => const Endpoint4_14 = (raw: RawClient["server.session"]) => (input: Endpoint4_14Input) =>
raw["session.compact"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_15Request = Parameters<RawClient["server.session"]["session.wait"]>[0]
type Endpoint4_15Input = { readonly sessionID: Endpoint4_15Request["params"]["sessionID"] }
const Endpoint4_15 = (raw: RawClient["server.session"]) => (input: Endpoint4_15Input) =>
raw["session.wait"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError)) raw["session.wait"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_15Request = Parameters<RawClient["server.session"]["session.revert.stage"]>[0] type Endpoint4_16Request = Parameters<RawClient["server.session"]["session.revert.stage"]>[0]
type Endpoint4_15Input = { type Endpoint4_16Input = {
readonly sessionID: Endpoint4_15Request["params"]["sessionID"] readonly sessionID: Endpoint4_16Request["params"]["sessionID"]
readonly messageID: Endpoint4_15Request["payload"]["messageID"] readonly messageID: Endpoint4_16Request["payload"]["messageID"]
readonly files?: Endpoint4_15Request["payload"]["files"] readonly files?: Endpoint4_16Request["payload"]["files"]
} }
const Endpoint4_15 = (raw: RawClient["server.session"]) => (input: Endpoint4_15Input) => const Endpoint4_16 = (raw: RawClient["server.session"]) => (input: Endpoint4_16Input) =>
raw["session.revert.stage"]({ raw["session.revert.stage"]({
params: { sessionID: input["sessionID"] }, params: { sessionID: input["sessionID"] },
payload: { messageID: input["messageID"], files: input["files"] }, payload: { messageID: input["messageID"], files: input["files"] },
@@ -248,61 +253,61 @@ const Endpoint4_15 = (raw: RawClient["server.session"]) => (input: Endpoint4_15I
Effect.map((value) => value.data), Effect.map((value) => value.data),
) )
type Endpoint4_16Request = Parameters<RawClient["server.session"]["session.revert.clear"]>[0] type Endpoint4_17Request = Parameters<RawClient["server.session"]["session.revert.clear"]>[0]
type Endpoint4_16Input = { readonly sessionID: Endpoint4_16Request["params"]["sessionID"] }
const Endpoint4_16 = (raw: RawClient["server.session"]) => (input: Endpoint4_16Input) =>
raw["session.revert.clear"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_17Request = Parameters<RawClient["server.session"]["session.revert.commit"]>[0]
type Endpoint4_17Input = { readonly sessionID: Endpoint4_17Request["params"]["sessionID"] } type Endpoint4_17Input = { readonly sessionID: Endpoint4_17Request["params"]["sessionID"] }
const Endpoint4_17 = (raw: RawClient["server.session"]) => (input: Endpoint4_17Input) => const Endpoint4_17 = (raw: RawClient["server.session"]) => (input: Endpoint4_17Input) =>
raw["session.revert.commit"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError)) raw["session.revert.clear"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_18Request = Parameters<RawClient["server.session"]["session.context"]>[0] type Endpoint4_18Request = Parameters<RawClient["server.session"]["session.revert.commit"]>[0]
type Endpoint4_18Input = { readonly sessionID: Endpoint4_18Request["params"]["sessionID"] } type Endpoint4_18Input = { readonly sessionID: Endpoint4_18Request["params"]["sessionID"] }
const Endpoint4_18 = (raw: RawClient["server.session"]) => (input: Endpoint4_18Input) => const Endpoint4_18 = (raw: RawClient["server.session"]) => (input: Endpoint4_18Input) =>
raw["session.revert.commit"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_19Request = Parameters<RawClient["server.session"]["session.context"]>[0]
type Endpoint4_19Input = { readonly sessionID: Endpoint4_19Request["params"]["sessionID"] }
const Endpoint4_19 = (raw: RawClient["server.session"]) => (input: Endpoint4_19Input) =>
raw["session.context"]({ params: { sessionID: input["sessionID"] } }).pipe( raw["session.context"]({ params: { sessionID: input["sessionID"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
Effect.map((value) => value.data), Effect.map((value) => value.data),
) )
type Endpoint4_19Request = Parameters<RawClient["server.session"]["session.instructions.entry.list"]>[0] type Endpoint4_20Request = Parameters<RawClient["server.session"]["session.instructions.entry.list"]>[0]
type Endpoint4_19Input = { readonly sessionID: Endpoint4_19Request["params"]["sessionID"] } type Endpoint4_20Input = { readonly sessionID: Endpoint4_20Request["params"]["sessionID"] }
const Endpoint4_19 = (raw: RawClient["server.session"]) => (input: Endpoint4_19Input) => const Endpoint4_20 = (raw: RawClient["server.session"]) => (input: Endpoint4_20Input) =>
raw["session.instructions.entry.list"]({ params: { sessionID: input["sessionID"] } }).pipe( raw["session.instructions.entry.list"]({ params: { sessionID: input["sessionID"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
Effect.map((value) => value.data), Effect.map((value) => value.data),
) )
type Endpoint4_20Request = Parameters<RawClient["server.session"]["session.instructions.entry.put"]>[0] type Endpoint4_21Request = Parameters<RawClient["server.session"]["session.instructions.entry.put"]>[0]
type Endpoint4_20Input = { type Endpoint4_21Input = {
readonly sessionID: Endpoint4_20Request["params"]["sessionID"] readonly sessionID: Endpoint4_21Request["params"]["sessionID"]
readonly key: Endpoint4_20Request["params"]["key"] readonly key: Endpoint4_21Request["params"]["key"]
readonly value: Endpoint4_20Request["payload"]["value"] readonly value: Endpoint4_21Request["payload"]["value"]
} }
const Endpoint4_20 = (raw: RawClient["server.session"]) => (input: Endpoint4_20Input) => const Endpoint4_21 = (raw: RawClient["server.session"]) => (input: Endpoint4_21Input) =>
raw["session.instructions.entry.put"]({ raw["session.instructions.entry.put"]({
params: { sessionID: input["sessionID"], key: input["key"] }, params: { sessionID: input["sessionID"], key: input["key"] },
payload: { value: input["value"] }, payload: { value: input["value"] },
}).pipe(Effect.mapError(mapClientError)) }).pipe(Effect.mapError(mapClientError))
type Endpoint4_21Request = Parameters<RawClient["server.session"]["session.instructions.entry.remove"]>[0] type Endpoint4_22Request = Parameters<RawClient["server.session"]["session.instructions.entry.remove"]>[0]
type Endpoint4_21Input = { type Endpoint4_22Input = {
readonly sessionID: Endpoint4_21Request["params"]["sessionID"] readonly sessionID: Endpoint4_22Request["params"]["sessionID"]
readonly key: Endpoint4_21Request["params"]["key"] readonly key: Endpoint4_22Request["params"]["key"]
} }
const Endpoint4_21 = (raw: RawClient["server.session"]) => (input: Endpoint4_21Input) => const Endpoint4_22 = (raw: RawClient["server.session"]) => (input: Endpoint4_22Input) =>
raw["session.instructions.entry.remove"]({ params: { sessionID: input["sessionID"], key: input["key"] } }).pipe( raw["session.instructions.entry.remove"]({ params: { sessionID: input["sessionID"], key: input["key"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
) )
type Endpoint4_22Request = Parameters<RawClient["server.session"]["session.log"]>[0] type Endpoint4_23Request = Parameters<RawClient["server.session"]["session.log"]>[0]
type Endpoint4_22Input = { type Endpoint4_23Input = {
readonly sessionID: Endpoint4_22Request["params"]["sessionID"] readonly sessionID: Endpoint4_23Request["params"]["sessionID"]
readonly after?: Endpoint4_22Request["query"]["after"] readonly after?: Endpoint4_23Request["query"]["after"]
readonly follow?: Endpoint4_22Request["query"]["follow"] readonly follow?: Endpoint4_23Request["query"]["follow"]
} }
const Endpoint4_22 = (raw: RawClient["server.session"]) => (input: Endpoint4_22Input) => const Endpoint4_23 = (raw: RawClient["server.session"]) => (input: Endpoint4_23Input) =>
Stream.unwrap( Stream.unwrap(
raw["session.log"]({ raw["session.log"]({
params: { sessionID: input["sessionID"] }, params: { sessionID: input["sessionID"] },
@@ -313,22 +318,22 @@ const Endpoint4_22 = (raw: RawClient["server.session"]) => (input: Endpoint4_22I
), ),
) )
type Endpoint4_23Request = Parameters<RawClient["server.session"]["session.interrupt"]>[0] type Endpoint4_24Request = Parameters<RawClient["server.session"]["session.interrupt"]>[0]
type Endpoint4_23Input = { readonly sessionID: Endpoint4_23Request["params"]["sessionID"] }
const Endpoint4_23 = (raw: RawClient["server.session"]) => (input: Endpoint4_23Input) =>
raw["session.interrupt"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_24Request = Parameters<RawClient["server.session"]["session.background"]>[0]
type Endpoint4_24Input = { readonly sessionID: Endpoint4_24Request["params"]["sessionID"] } type Endpoint4_24Input = { readonly sessionID: Endpoint4_24Request["params"]["sessionID"] }
const Endpoint4_24 = (raw: RawClient["server.session"]) => (input: Endpoint4_24Input) => const Endpoint4_24 = (raw: RawClient["server.session"]) => (input: Endpoint4_24Input) =>
raw["session.interrupt"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_25Request = Parameters<RawClient["server.session"]["session.background"]>[0]
type Endpoint4_25Input = { readonly sessionID: Endpoint4_25Request["params"]["sessionID"] }
const Endpoint4_25 = (raw: RawClient["server.session"]) => (input: Endpoint4_25Input) =>
raw["session.background"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError)) raw["session.background"]({ params: { sessionID: input["sessionID"] } }).pipe(Effect.mapError(mapClientError))
type Endpoint4_25Request = Parameters<RawClient["server.session"]["session.message"]>[0] type Endpoint4_26Request = Parameters<RawClient["server.session"]["session.message"]>[0]
type Endpoint4_25Input = { type Endpoint4_26Input = {
readonly sessionID: Endpoint4_25Request["params"]["sessionID"] readonly sessionID: Endpoint4_26Request["params"]["sessionID"]
readonly messageID: Endpoint4_25Request["params"]["messageID"] readonly messageID: Endpoint4_26Request["params"]["messageID"]
} }
const Endpoint4_25 = (raw: RawClient["server.session"]) => (input: Endpoint4_25Input) => const Endpoint4_26 = (raw: RawClient["server.session"]) => (input: Endpoint4_26Input) =>
raw["session.message"]({ params: { sessionID: input["sessionID"], messageID: input["messageID"] } }).pipe( raw["session.message"]({ params: { sessionID: input["sessionID"], messageID: input["messageID"] } }).pipe(
Effect.mapError(mapClientError), Effect.mapError(mapClientError),
Effect.map((value) => value.data), Effect.map((value) => value.data),
@@ -339,26 +344,27 @@ const adaptGroup4 = (raw: RawClient["server.session"]) => ({
create: Endpoint4_1(raw), create: Endpoint4_1(raw),
active: Endpoint4_2(raw), active: Endpoint4_2(raw),
get: Endpoint4_3(raw), get: Endpoint4_3(raw),
fork: Endpoint4_4(raw), remove: Endpoint4_4(raw),
switchAgent: Endpoint4_5(raw), fork: Endpoint4_5(raw),
switchModel: Endpoint4_6(raw), switchAgent: Endpoint4_6(raw),
rename: Endpoint4_7(raw), switchModel: Endpoint4_7(raw),
prompt: Endpoint4_8(raw), rename: Endpoint4_8(raw),
command: Endpoint4_9(raw), prompt: Endpoint4_9(raw),
skill: Endpoint4_10(raw), command: Endpoint4_10(raw),
synthetic: Endpoint4_11(raw), skill: Endpoint4_11(raw),
shell: Endpoint4_12(raw), synthetic: Endpoint4_12(raw),
compact: Endpoint4_13(raw), shell: Endpoint4_13(raw),
wait: Endpoint4_14(raw), compact: Endpoint4_14(raw),
revertStage: Endpoint4_15(raw), wait: Endpoint4_15(raw),
revertClear: Endpoint4_16(raw), revertStage: Endpoint4_16(raw),
revertCommit: Endpoint4_17(raw), revertClear: Endpoint4_17(raw),
context: Endpoint4_18(raw), revertCommit: Endpoint4_18(raw),
instructions: { entry: { list: Endpoint4_19(raw), put: Endpoint4_20(raw), remove: Endpoint4_21(raw) } }, context: Endpoint4_19(raw),
log: Endpoint4_22(raw), instructions: { entry: { list: Endpoint4_20(raw), put: Endpoint4_21(raw), remove: Endpoint4_22(raw) } },
interrupt: Endpoint4_23(raw), log: Endpoint4_23(raw),
background: Endpoint4_24(raw), interrupt: Endpoint4_24(raw),
message: Endpoint4_25(raw), background: Endpoint4_25(raw),
message: Endpoint4_26(raw),
}) })
type Endpoint5_0Request = Parameters<RawClient["server.message"]["session.messages"]>[0] type Endpoint5_0Request = Parameters<RawClient["server.message"]["session.messages"]>[0]
@@ -13,6 +13,8 @@ import type {
SessionActiveOutput, SessionActiveOutput,
SessionGetInput, SessionGetInput,
SessionGetOutput, SessionGetOutput,
SessionRemoveInput,
SessionRemoveOutput,
SessionForkInput, SessionForkInput,
SessionForkOutput, SessionForkOutput,
SessionSwitchAgentInput, SessionSwitchAgentInput,
@@ -422,6 +424,17 @@ export function make(options: ClientOptions) {
}, },
requestOptions, requestOptions,
).then((value) => value.data), ).then((value) => value.data),
remove: (input: SessionRemoveInput, requestOptions?: RequestOptions) =>
request<SessionRemoveOutput>(
{
method: "DELETE",
path: `/api/session/${encodeURIComponent(input.sessionID)}`,
successStatus: 204,
declaredStatuses: [404, 400, 401],
empty: true,
},
requestOptions,
),
fork: (input: SessionForkInput, requestOptions?: RequestOptions) => fork: (input: SessionForkInput, requestOptions?: RequestOptions) =>
request<{ readonly data: SessionForkOutput }>( request<{ readonly data: SessionForkOutput }>(
{ {
@@ -459,6 +459,10 @@ export type SessionGetOutput = {
} }
}["data"] }["data"]
export type SessionRemoveInput = { readonly sessionID: { readonly sessionID: string }["sessionID"] }
export type SessionRemoveOutput = void
export type SessionForkInput = { export type SessionForkInput = {
readonly sessionID: { readonly sessionID: string }["sessionID"] readonly sessionID: { readonly sessionID: string }["sessionID"]
readonly messageID?: { readonly messageID?: string | undefined }["messageID"] readonly messageID?: { readonly messageID?: string | undefined }["messageID"]
@@ -1173,6 +1177,15 @@ export type SessionLogOutput =
readonly location?: { readonly directory: string; readonly workspaceID?: string } readonly location?: { readonly directory: string; readonly workspaceID?: string }
readonly data: { readonly sessionID: string; readonly title: string } readonly data: { readonly sessionID: string; readonly title: string }
} }
| {
readonly id: string
readonly created: number
readonly metadata?: { readonly [x: string]: unknown }
readonly type: "session.deleted"
readonly durable: { readonly aggregateID: string; readonly seq: number; readonly version: number }
readonly location?: { readonly directory: string; readonly workspaceID?: string }
readonly data: { readonly sessionID: string }
}
| { | {
readonly id: string readonly id: string
readonly created: number readonly created: number
@@ -4443,6 +4456,15 @@ export type EventSubscribeOutput =
readonly location?: { readonly directory: string; readonly workspaceID?: string } readonly location?: { readonly directory: string; readonly workspaceID?: string }
readonly data: { readonly sessionID: string; readonly title: string } readonly data: { readonly sessionID: string; readonly title: string }
} }
| {
readonly id: string
readonly created: number
readonly metadata?: { readonly [x: string]: unknown }
readonly type: "session.deleted"
readonly durable: { readonly aggregateID: string; readonly seq: number; readonly version: number }
readonly location?: { readonly directory: string; readonly workspaceID?: string }
readonly data: { readonly sessionID: string }
}
| { | {
readonly id: string readonly id: string
readonly created: number readonly created: number
+10
View File
@@ -153,6 +153,7 @@ export interface Interface {
readonly create: (input: CreateInput) => Effect.Effect<SessionSchema.Info, NotFoundError> readonly create: (input: CreateInput) => Effect.Effect<SessionSchema.Info, NotFoundError>
readonly fork: (input: ForkInput) => Effect.Effect<SessionSchema.Info, NotFoundError | MessageNotFoundError> readonly fork: (input: ForkInput) => Effect.Effect<SessionSchema.Info, NotFoundError | MessageNotFoundError>
readonly get: (sessionID: SessionSchema.ID) => Effect.Effect<SessionSchema.Info, NotFoundError> readonly get: (sessionID: SessionSchema.ID) => Effect.Effect<SessionSchema.Info, NotFoundError>
readonly remove: (sessionID: SessionSchema.ID) => Effect.Effect<void, NotFoundError>
readonly messages: (input: { readonly messages: (input: {
sessionID: SessionSchema.ID sessionID: SessionSchema.ID
limit?: number limit?: number
@@ -363,6 +364,15 @@ const layer = Layer.effect(
if (!session) return yield* new NotFoundError({ sessionID }) if (!session) return yield* new NotFoundError({ sessionID })
return session return session
}), }),
remove: Effect.fn("V2Session.remove")(function* (sessionID) {
yield* result.get(sessionID)
yield* execution.interrupt(sessionID)
yield* execution.awaitIdle(sessionID)
const children = yield* result.list({ parentID: sessionID })
yield* Effect.forEach(children.data, (child) => result.remove(child.id), { concurrency: 1, discard: true })
yield* events.publish(SessionEvent.Deleted, { sessionID })
yield* events.remove(sessionID)
}),
list: Effect.fn("V2Session.list")(function* (input = {}) { list: Effect.fn("V2Session.list")(function* (input = {}) {
const direction = input.anchor?.direction ?? "next" const direction = input.anchor?.direction ?? "next"
const requestedOrder = input.order ?? "desc" const requestedOrder = input.order ?? "desc"
+1 -1
View File
@@ -152,6 +152,7 @@ export function update(adapter: Adapter, event: SessionEvent.Event) {
}, },
"session.moved": () => Effect.void, "session.moved": () => Effect.void,
"session.renamed": () => Effect.void, "session.renamed": () => Effect.void,
"session.deleted": () => Effect.void,
"session.forked": () => Effect.void, "session.forked": () => Effect.void,
"session.prompt.promoted": () => Effect.void, "session.prompt.promoted": () => Effect.void,
"session.prompt.admitted": () => Effect.void, "session.prompt.admitted": () => Effect.void,
@@ -168,7 +169,6 @@ export function update(adapter: Adapter, event: SessionEvent.Event) {
time: { created: event.created }, time: { created: event.created },
}), }),
), ),
"session.instructions.discovered": () => Effect.void,
"session.synthetic": (event) => { "session.synthetic": (event) => {
return adapter.appendMessage( return adapter.appendMessage(
SessionMessage.Synthetic.make({ SessionMessage.Synthetic.make({
+7 -1
View File
@@ -26,7 +26,10 @@ import type { DeepMutable } from "../schema"
import { Slug } from "../util/slug" import { Slug } from "../util/slug"
type DatabaseService = Database.Interface["db"] type DatabaseService = Database.Interface["db"]
type MessageEvent = Exclude<SessionEvent.DurableEvent, typeof SessionEvent.Forked.Type> type MessageEvent = Exclude<
SessionEvent.DurableEvent,
typeof SessionEvent.Forked.Type | typeof SessionEvent.Deleted.Type
>
const decodeMessage = Schema.decodeUnknownSync(SessionMessage.Message) const decodeMessage = Schema.decodeUnknownSync(SessionMessage.Message)
const encodeMessage = Schema.encodeSync(SessionMessage.Message) const encodeMessage = Schema.encodeSync(SessionMessage.Message)
@@ -505,6 +508,9 @@ const layer = Layer.effectDiscard(
yield* events.project(SessionV1.Event.Deleted, (event) => yield* events.project(SessionV1.Event.Deleted, (event) =>
db.delete(SessionTable).where(eq(SessionTable.id, event.data.sessionID)).run().pipe(Effect.orDie), db.delete(SessionTable).where(eq(SessionTable.id, event.data.sessionID)).run().pipe(Effect.orDie),
) )
yield* events.project(SessionEvent.Deleted, (event) =>
db.delete(SessionTable).where(eq(SessionTable.id, event.data.sessionID)).run().pipe(Effect.orDie),
)
yield* events.project(SessionV1.Event.MessageUpdated, (event) => yield* events.project(SessionV1.Event.MessageUpdated, (event) =>
Effect.gen(function* () { Effect.gen(function* () {
const time_created = event.data.info.time.created const time_created = event.data.info.time.created
+62
View File
@@ -0,0 +1,62 @@
import { describe, expect } from "bun:test"
import { Effect, Layer } from "effect"
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
import { Database } from "@opencode-ai/core/database/database"
import { EventV2 } from "@opencode-ai/core/event"
import { Location } from "@opencode-ai/core/location"
import { ProjectV2 } from "@opencode-ai/core/project"
import { AbsolutePath } from "@opencode-ai/core/schema"
import { SessionV2 } from "@opencode-ai/core/session"
import { SessionExecution } from "@opencode-ai/core/session/execution"
import { SessionProjector } from "@opencode-ai/core/session/projector"
import { SessionStore } from "@opencode-ai/core/session/store"
import { testEffect } from "./lib/effect"
const projects = Layer.succeed(
ProjectV2.Service,
ProjectV2.Service.of({
list: () => Effect.succeed([]),
resolve: (directory) => Effect.succeed({ id: ProjectV2.ID.global, directory }),
directories: () => Effect.succeed([]),
commit: () => Effect.void,
}),
)
const it = testEffect(
AppNodeBuilder.build(
LayerNode.group([Database.node, EventV2.node, SessionProjector.node, SessionStore.node, SessionV2.node]),
[
[ProjectV2.node, projects],
[SessionExecution.node, SessionExecution.noopLayer],
],
),
)
const location = Location.Ref.make({ directory: AbsolutePath.make("/project") })
describe("SessionV2.remove", () => {
it.effect("removes a session and its children", () =>
Effect.gen(function* () {
const session = yield* SessionV2.Service
const parent = yield* session.create({ location })
const child = yield* session.create({ parentID: parent.id })
yield* session.remove(parent.id)
expect((yield* session.list()).data).toEqual([])
expect(yield* Effect.result(session.get(parent.id))).toMatchObject({ _tag: "Failure" })
expect(yield* Effect.result(session.get(child.id))).toMatchObject({ _tag: "Failure" })
}),
)
it.effect("fails when the session does not exist", () =>
Effect.gen(function* () {
const session = yield* SessionV2.Service
const sessionID = SessionV2.ID.make("ses_missing")
expect(yield* Effect.result(session.remove(sessionID))).toMatchObject({
_tag: "Failure",
failure: { _tag: "Session.NotFoundError", sessionID },
})
}),
)
})
+15
View File
@@ -189,6 +189,21 @@ export const makeSessionGroup = <I extends HttpApiMiddleware.AnyId, S>(sessionLo
}), }),
), ),
) )
.add(
HttpApiEndpoint.delete("session.remove", "/api/session/:sessionID", {
params: { sessionID: Session.ID },
success: HttpApiSchema.NoContent,
error: SessionNotFoundError,
})
.middleware(sessionLocationMiddleware)
.annotateMerge(
OpenApi.annotations({
identifier: "v2.session.remove",
summary: "Delete session",
description: "Delete a session and its child sessions.",
}),
),
)
.add( .add(
HttpApiEndpoint.post("session.fork", "/api/session/:sessionID/fork", { HttpApiEndpoint.post("session.fork", "/api/session/:sessionID/fork", {
params: { sessionID: Session.ID }, params: { sessionID: Session.ID },
+11
View File
@@ -84,6 +84,16 @@ export const Renamed = Event.durable({
}) })
export type Renamed = typeof Renamed.Type export type Renamed = typeof Renamed.Type
export const Deleted = Event.durable({
type: "session.deleted",
durable: {
aggregate: "sessionID",
version: 2,
},
schema: Base,
})
export type Deleted = typeof Deleted.Type
export const Forked = Event.durable({ export const Forked = Event.durable({
type: "session.forked", type: "session.forked",
...options, ...options,
@@ -477,6 +487,7 @@ export const Definitions = Event.inventory(
ModelSelected, ModelSelected,
Moved, Moved,
Renamed, Renamed,
Deleted,
Forked, Forked,
PromptPromoted, PromptPromoted,
PromptAdmitted, PromptAdmitted,
+10 -1
View File
@@ -46,11 +46,12 @@ describe("public event manifest", () => {
SessionV1.Event.Error, SessionV1.Event.Error,
]) ])
expect(Array.from(EventManifest.Latest.keys())).toEqual( expect(Array.from(EventManifest.Latest.keys())).toEqual(
EventManifest.Definitions.map((definition) => definition.type), Array.from(new Set(EventManifest.Definitions.map((definition) => definition.type))),
) )
expect(EventManifest.Latest.get("agent.updated")).toBe(Agent.Event.Updated) expect(EventManifest.Latest.get("agent.updated")).toBe(Agent.Event.Updated)
expect(EventManifest.Latest.get("plugin.updated")).toBe(Plugin.Event.Updated) expect(EventManifest.Latest.get("plugin.updated")).toBe(Plugin.Event.Updated)
expect(EventManifest.Server.get("mcp.status.changed")).toBe(McpEvent.StatusChanged) expect(EventManifest.Server.get("mcp.status.changed")).toBe(McpEvent.StatusChanged)
expect(EventManifest.Server.get("session.deleted")).toBe(SessionEvent.Deleted)
expect(EventManifest.Server.has("mcp.tools.changed")).toBe(false) expect(EventManifest.Server.has("mcp.tools.changed")).toBe(false)
expect(Agent.Event.Updated.durable).toBeUndefined() expect(Agent.Event.Updated.durable).toBeUndefined()
expect(EventManifest.Durable.has("agent.updated")).toBe(false) expect(EventManifest.Durable.has("agent.updated")).toBe(false)
@@ -95,6 +96,7 @@ describe("public event manifest", () => {
"session.created.1", "session.created.1",
"session.updated.1", "session.updated.1",
"session.deleted.1", "session.deleted.1",
"session.deleted.2",
"message.updated.1", "message.updated.1",
"message.removed.1", "message.removed.1",
"message.part.updated.1", "message.part.updated.1",
@@ -170,4 +172,11 @@ describe("public event manifest", () => {
expect(SessionEvent.Text.Started.durable?.version).toBe(1) expect(SessionEvent.Text.Started.durable?.version).toBe(1)
expect(SessionEvent.Tool.Called.durable?.version).toBe(1) expect(SessionEvent.Tool.Called.durable?.version).toBe(1)
}) })
test("keeps current session deletion minimal", () => {
const sessionID = SessionID.make("ses_test")
expect(SessionEvent.Deleted.data.make({ sessionID })).toEqual({ sessionID })
expect(SessionEvent.Deleted.durable?.version).toBe(2)
})
}) })
+21
View File
@@ -416,6 +416,8 @@ import type {
V2SessionQuestionRejectResponses, V2SessionQuestionRejectResponses,
V2SessionQuestionReplyErrors, V2SessionQuestionReplyErrors,
V2SessionQuestionReplyResponses, V2SessionQuestionReplyResponses,
V2SessionRemoveErrors,
V2SessionRemoveResponses,
V2SessionRenameErrors, V2SessionRenameErrors,
V2SessionRenameResponses, V2SessionRenameResponses,
V2SessionRevertClearErrors, V2SessionRevertClearErrors,
@@ -5905,6 +5907,25 @@ export class Session3 extends HeyApiClient {
}) })
} }
/**
* Delete session
*
* Delete a session and its child sessions.
*/
public remove<ThrowOnError extends boolean = false>(
parameters: {
sessionID: string
},
options?: Options<never, ThrowOnError>,
) {
const params = buildClientParams([parameters], [{ args: [{ in: "path", key: "sessionID" }] }])
return (options?.client ?? this.client).delete<V2SessionRemoveResponses, V2SessionRemoveErrors, ThrowOnError>({
url: "/api/session/{sessionID}",
...options,
...params,
})
}
/** /**
* Get session * Get session
* *
+76 -25
View File
@@ -824,7 +824,6 @@ export type GlobalEvent = {
type: "session.deleted" type: "session.deleted"
properties: { properties: {
sessionID: string sessionID: string
info: Session
} }
} }
| { | {
@@ -2914,6 +2913,7 @@ export type SessionDurableEvent =
| SessionModelSelected | SessionModelSelected
| SessionMoved | SessionMoved
| SessionRenamed | SessionRenamed
| SessionDeleted
| SessionForked | SessionForked
| SessionPromptPromoted | SessionPromptPromoted
| SessionPromptAdmitted | SessionPromptAdmitted
@@ -3576,13 +3576,12 @@ export type SyncEventSessionDeleted = {
type: "sync" type: "sync"
id: string id: string
syncEvent: { syncEvent: {
type: "session.deleted.1" type: "session.deleted.2"
id: string id: string
seq: number seq: number
aggregateID: string aggregateID: string
data: { data: {
sessionID: string sessionID: string
info: Session
} }
} }
} }
@@ -4698,6 +4697,24 @@ export type SessionRenamed = {
} }
} }
export type SessionDeleted = {
id: string
created: number
metadata?: {
[key: string]: unknown
}
type: "session.deleted"
durable: {
aggregateID: string
seq: number
version: number
}
location?: LocationRef
data: {
sessionID: string
}
}
export type SessionForked = { export type SessionForked = {
id: string id: string
created: number created: number
@@ -5761,25 +5778,6 @@ export type SessionUpdated = {
} }
} }
export type SessionDeleted = {
id: string
created: number
metadata?: {
[key: string]: unknown
}
type: "session.deleted"
durable: {
aggregateID: string
seq: number
version: number
}
location?: LocationRef
data: {
sessionID: string
info: Session
}
}
export type MessageUpdated = { export type MessageUpdated = {
id: string id: string
created: number created: number
@@ -6835,7 +6833,6 @@ export type EventSessionDeleted = {
type: "session.deleted" type: "session.deleted"
properties: { properties: {
sessionID: string sessionID: string
info: Session
} }
} }
@@ -8403,7 +8400,7 @@ export type V2EventV2 =
| AgentUpdatedV2 | AgentUpdatedV2
| SessionCreatedV2 | SessionCreatedV2
| SessionUpdatedV2 | SessionUpdatedV2
| SessionDeletedV2 | SessionDeleted1
| MessageUpdatedV2 | MessageUpdatedV2
| MessageRemovedV2 | MessageRemovedV2
| MessagePartUpdatedV2 | MessagePartUpdatedV2
@@ -8412,6 +8409,7 @@ export type V2EventV2 =
| SessionModelSelectedV2 | SessionModelSelectedV2
| SessionMovedV2 | SessionMovedV2
| SessionRenamedV2 | SessionRenamedV2
| SessionDeletedV2
| SessionForkedV2 | SessionForkedV2
| SessionPromptPromotedV2 | SessionPromptPromotedV2
| SessionPromptAdmittedV2 | SessionPromptAdmittedV2
@@ -8817,6 +8815,24 @@ export type SessionRenamedV2 = {
} }
} }
export type SessionDeletedV2 = {
id: string
created: number
metadata?: {
[key: string]: unknown
}
type: "session.deleted"
durable: {
aggregateID: string
seq: number
version: number
}
location?: LocationRefV2
data: {
sessionID: string
}
}
export type SessionForkedV2 = { export type SessionForkedV2 = {
id: string id: string
created: number created: number
@@ -9718,7 +9734,7 @@ export type SessionUpdatedV2 = {
} }
} }
export type SessionDeletedV2 = { export type SessionDeleted1 = {
id: string id: string
created: number created: number
metadata?: { metadata?: {
@@ -14968,6 +14984,41 @@ export type V2SessionActiveResponses = {
export type V2SessionActiveResponse = V2SessionActiveResponses[keyof V2SessionActiveResponses] export type V2SessionActiveResponse = V2SessionActiveResponses[keyof V2SessionActiveResponses]
export type V2SessionRemoveData = {
body?: never
path: {
sessionID: string
}
query?: never
url: "/api/session/{sessionID}"
}
export type V2SessionRemoveErrors = {
/**
* InvalidRequestError
*/
400: InvalidRequestErrorV2
/**
* UnauthorizedError
*/
401: UnauthorizedError
/**
* SessionNotFoundError
*/
404: SessionNotFoundError
}
export type V2SessionRemoveError = V2SessionRemoveErrors[keyof V2SessionRemoveErrors]
export type V2SessionRemoveResponses = {
/**
* <No Content>
*/
204: void
}
export type V2SessionRemoveResponse = V2SessionRemoveResponses[keyof V2SessionRemoveResponses]
export type V2SessionGetData = { export type V2SessionGetData = {
body?: never body?: never
path: { path: {
+16
View File
@@ -111,6 +111,22 @@ export const SessionHandler = HttpApiBuilder.group(Api, "server.session", (handl
} }
}), }),
) )
.handle(
"session.remove",
Effect.fn(function* (ctx) {
yield* session.remove(ctx.params.sessionID).pipe(
Effect.catchTag(
"Session.NotFoundError",
(error) =>
new SessionNotFoundError({
sessionID: error.sessionID,
message: `Session not found: ${error.sessionID}`,
}),
),
)
return HttpApiSchema.NoContent.make()
}),
)
.handle( .handle(
"session.fork", "session.fork",
Effect.fn(function* (ctx) { Effect.fn(function* (ctx) {
+1 -1
View File
@@ -1068,7 +1068,7 @@ function App(props: { onSnapshot?: () => Promise<string[]>; pluginHost: TuiPlugi
}) })
event.on("session.deleted", (evt) => { event.on("session.deleted", (evt) => {
if (route.data.type === "session" && route.data.sessionID === evt.data.info.id) { if (route.data.type === "session" && route.data.sessionID === evt.data.sessionID) {
route.navigate({ type: "home" }) route.navigate({ type: "home" })
toast.show({ toast.show({
variant: "info", variant: "info",
@@ -1,4 +1,4 @@
import { createMemo, createResource, onMount } from "solid-js" import { createMemo, createResource, createSignal, onMount } from "solid-js"
import path from "path" import path from "path"
import type { SessionV2Info } from "@opencode-ai/sdk/v2" import type { SessionV2Info } from "@opencode-ai/sdk/v2"
import { useDialog } from "../ui/dialog" import { useDialog } from "../ui/dialog"
@@ -15,6 +15,7 @@ import { useToast } from "../ui/toast"
import { useCommandShortcut } from "../keymap" import { useCommandShortcut } from "../keymap"
import { DialogSessionRename } from "./dialog-session-rename" import { DialogSessionRename } from "./dialog-session-rename"
import { Spinner } from "./spinner" import { Spinner } from "./spinner"
import { errorMessage } from "../util/error"
export function DialogSessionList() { export function DialogSessionList() {
const dialog = useDialog() const dialog = useDialog()
@@ -26,8 +27,10 @@ export function DialogSessionList() {
const local = useLocal() const local = useLocal()
const toast = useToast() const toast = useToast()
const [search, setSearch] = createDebouncedSignal("", 150) const [search, setSearch] = createDebouncedSignal("", 150)
const [toDelete, setToDelete] = createSignal<string>()
const quickSwitch1 = useCommandShortcut("session.quick_switch.1") const quickSwitch1 = useCommandShortcut("session.quick_switch.1")
const quickSwitch9 = useCommandShortcut("session.quick_switch.9") const quickSwitch9 = useCommandShortcut("session.quick_switch.9")
const deleteHint = useCommandShortcut("session.delete")
const [searchResults] = createResource(search, async (query) => { const [searchResults] = createResource(search, async (query) => {
if (!query) return if (!query) return
@@ -78,11 +81,13 @@ export function DialogSessionList() {
const directory = session.location.directory const directory = session.location.directory
const footer = directory !== project.data.project.mainDir ? Locale.truncate(path.basename(directory), 20) : "" const footer = directory !== project.data.project.mainDir ? Locale.truncate(path.basename(directory), 20) : ""
const slot = slotByID.get(session.id) const slot = slotByID.get(session.id)
const deleting = toDelete() === session.id
return { return {
title: session.title, title: deleting ? `Press ${deleteHint()} again to confirm` : session.title,
value: session.id, value: session.id,
category, category,
footer, footer,
bg: deleting ? theme.error : undefined,
gutter: gutter:
data.session.family(session.id).some((id) => data.session.status(id) === "running") data.session.family(session.id).some((id) => data.session.status(id) === "running")
? () => <Spinner /> ? () => <Spinner />
@@ -104,9 +109,6 @@ export function DialogSessionList() {
onMount(() => dialog.setSize("large")) onMount(() => dialog.setSize("large"))
const unavailable = (feature: string) =>
toast.show({ message: `${feature} is not implemented for V2 sessions yet`, variant: "error", duration: 5000 })
return ( return (
<DialogSelect <DialogSelect
title="Sessions" title="Sessions"
@@ -114,6 +116,7 @@ export function DialogSessionList() {
skipFilter={true} skipFilter={true}
current={currentSessionID()} current={currentSessionID()}
onFilter={setSearch} onFilter={setSearch}
onMove={() => setToDelete(undefined)}
onSelect={(option) => { onSelect={(option) => {
route.navigate({ type: "session", sessionID: option.value }) route.navigate({ type: "session", sessionID: option.value })
dialog.clear() dialog.clear()
@@ -127,7 +130,22 @@ export function DialogSessionList() {
{ {
command: "session.delete", command: "session.delete",
title: "delete", title: "delete",
onTrigger: () => unavailable("Deleting"), onTrigger: (option: { value: string }) => {
if (toDelete() !== option.value) {
setToDelete(option.value)
return
}
void sdk.client.v2.session
.remove({ sessionID: option.value }, { throwOnError: true })
.catch((error) => {
setToDelete(undefined)
toast.show({
message: `Failed to delete session: ${errorMessage(error)}`,
variant: "error",
duration: 5000,
})
})
},
}, },
{ {
command: "session.rename", command: "session.rename",
+24
View File
@@ -213,11 +213,35 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
) )
} }
function removeSession(sessionID: string) {
messageIndex.delete(sessionID)
setStore(
"session",
produce((draft) => {
delete draft.info[sessionID]
delete draft.status[sessionID]
delete draft.compaction[sessionID]
delete draft.message[sessionID]
delete draft.input[sessionID]
delete draft.permission[sessionID]
delete draft.form[sessionID]
for (const [rootID, family] of Object.entries(draft.family)) {
const next = family.filter((id) => id !== sessionID)
if (next.length === 0) delete draft.family[rootID]
else draft.family[rootID] = next
}
}),
)
}
function handleEvent(event: V2Event) { function handleEvent(event: V2Event) {
switch (event.type) { switch (event.type) {
case "session.created": case "session.created":
void result.session.refresh(event.data.sessionID) void result.session.refresh(event.data.sessionID)
break break
case "session.deleted":
removeSession(event.data.sessionID)
break
case "catalog.updated": case "catalog.updated":
void Promise.all([ void Promise.all([
result.location.model.refresh(event.location), result.location.model.refresh(event.location),
+1 -1
View File
@@ -470,7 +470,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
} }
event.on("session.deleted", (evt) => { event.on("session.deleted", (evt) => {
prune(evt.data.info.id) prune(evt.data.sessionID)
}) })
return { return {