|
@@ -68,15 +68,21 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
return Object.fromEntries(yield* statusSvc.list())
|
|
return Object.fromEntries(yield* statusSvc.list())
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+ const requireSession = Effect.fn("SessionHttpApi.requireSession")(function* (sessionID: SessionID) {
|
|
|
|
|
+ return yield* SessionError.mapStorageNotFound(session.get(sessionID))
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
const get = Effect.fn("SessionHttpApi.get")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
const get = Effect.fn("SessionHttpApi.get")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
|
- return yield* SessionError.mapStorageNotFound(session.get(ctx.params.sessionID))
|
|
|
|
|
|
|
+ return yield* requireSession(ctx.params.sessionID)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const children = Effect.fn("SessionHttpApi.children")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
const children = Effect.fn("SessionHttpApi.children")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
return yield* session.children(ctx.params.sessionID)
|
|
return yield* session.children(ctx.params.sessionID)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const todo = Effect.fn("SessionHttpApi.todo")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
const todo = Effect.fn("SessionHttpApi.todo")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
return yield* todoSvc.get(ctx.params.sessionID)
|
|
return yield* todoSvc.get(ctx.params.sessionID)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -99,7 +105,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
catch: () => new HttpApiError.BadRequest({}),
|
|
catch: () => new HttpApiError.BadRequest({}),
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
- yield* SessionError.mapStorageNotFound(session.get(ctx.params.sessionID))
|
|
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
if (ctx.query.limit === undefined || ctx.query.limit === 0) {
|
|
if (ctx.query.limit === undefined || ctx.query.limit === 0) {
|
|
|
return yield* SessionError.mapStorageNotFound(session.messages({ sessionID: ctx.params.sessionID }))
|
|
return yield* SessionError.mapStorageNotFound(session.messages({ sessionID: ctx.params.sessionID }))
|
|
|
}
|
|
}
|
|
@@ -165,7 +171,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof UpdatePayload.Type
|
|
payload: typeof UpdatePayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
- const current = yield* SessionError.mapStorageNotFound(session.get(ctx.params.sessionID))
|
|
|
|
|
|
|
+ const current = yield* requireSession(ctx.params.sessionID)
|
|
|
if (ctx.payload.title !== undefined) {
|
|
if (ctx.payload.title !== undefined) {
|
|
|
yield* session.setTitle({ sessionID: ctx.params.sessionID, title: ctx.payload.title })
|
|
yield* session.setTitle({ sessionID: ctx.params.sessionID, title: ctx.payload.title })
|
|
|
}
|
|
}
|
|
@@ -178,7 +184,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
if (ctx.payload.time?.archived !== undefined) {
|
|
if (ctx.payload.time?.archived !== undefined) {
|
|
|
yield* session.setArchived({ sessionID: ctx.params.sessionID, time: ctx.payload.time.archived })
|
|
yield* session.setArchived({ sessionID: ctx.params.sessionID, time: ctx.payload.time.archived })
|
|
|
}
|
|
}
|
|
|
- return yield* SessionError.mapStorageNotFound(session.get(ctx.params.sessionID))
|
|
|
|
|
|
|
+ return yield* requireSession(ctx.params.sessionID)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const fork = Effect.fn("SessionHttpApi.fork")(function* (ctx: {
|
|
const fork = Effect.fn("SessionHttpApi.fork")(function* (ctx: {
|
|
@@ -216,6 +222,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof InitPayload.Type
|
|
payload: typeof InitPayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
yield* promptSvc
|
|
yield* promptSvc
|
|
|
.command({
|
|
.command({
|
|
|
sessionID: ctx.params.sessionID,
|
|
sessionID: ctx.params.sessionID,
|
|
@@ -234,22 +241,24 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
// ErrorMiddleware → NamedError.Unknown 500) instead of blanket-mapping
|
|
// ErrorMiddleware → NamedError.Unknown 500) instead of blanket-mapping
|
|
|
// every failure to a 400 BadRequest.
|
|
// every failure to a 400 BadRequest.
|
|
|
const share = Effect.fn("SessionHttpApi.share")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
const share = Effect.fn("SessionHttpApi.share")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
yield* shareSvc.share(ctx.params.sessionID).pipe(Effect.mapError(() => new HttpApiError.InternalServerError({})))
|
|
yield* shareSvc.share(ctx.params.sessionID).pipe(Effect.mapError(() => new HttpApiError.InternalServerError({})))
|
|
|
- return yield* SessionError.mapStorageNotFound(session.get(ctx.params.sessionID))
|
|
|
|
|
|
|
+ return yield* requireSession(ctx.params.sessionID)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const unshare = Effect.fn("SessionHttpApi.unshare")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
const unshare = Effect.fn("SessionHttpApi.unshare")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
yield* shareSvc
|
|
yield* shareSvc
|
|
|
.unshare(ctx.params.sessionID)
|
|
.unshare(ctx.params.sessionID)
|
|
|
.pipe(Effect.mapError(() => new HttpApiError.InternalServerError({})))
|
|
.pipe(Effect.mapError(() => new HttpApiError.InternalServerError({})))
|
|
|
- return yield* SessionError.mapStorageNotFound(session.get(ctx.params.sessionID))
|
|
|
|
|
|
|
+ return yield* requireSession(ctx.params.sessionID)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const summarize = Effect.fn("SessionHttpApi.summarize")(function* (ctx: {
|
|
const summarize = Effect.fn("SessionHttpApi.summarize")(function* (ctx: {
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof SummarizePayload.Type
|
|
payload: typeof SummarizePayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
- yield* revertSvc.cleanup(yield* SessionError.mapStorageNotFound(session.get(ctx.params.sessionID)))
|
|
|
|
|
|
|
+ yield* revertSvc.cleanup(yield* requireSession(ctx.params.sessionID))
|
|
|
const messages = yield* SessionError.mapStorageNotFound(session.messages({ sessionID: ctx.params.sessionID }))
|
|
const messages = yield* SessionError.mapStorageNotFound(session.messages({ sessionID: ctx.params.sessionID }))
|
|
|
const defaultAgent = yield* agentSvc.defaultAgent()
|
|
const defaultAgent = yield* agentSvc.defaultAgent()
|
|
|
const currentAgent = messages.findLast((message) => message.info.role === "user")?.info.agent ?? defaultAgent
|
|
const currentAgent = messages.findLast((message) => message.info.role === "user")?.info.agent ?? defaultAgent
|
|
@@ -271,6 +280,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof PromptPayload.Type
|
|
payload: typeof PromptPayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
const message = yield* promptSvc
|
|
const message = yield* promptSvc
|
|
|
.prompt({
|
|
.prompt({
|
|
|
...ctx.payload,
|
|
...ctx.payload,
|
|
@@ -286,6 +296,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof PromptPayload.Type
|
|
payload: typeof PromptPayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
yield* promptSvc.prompt({ ...ctx.payload, sessionID: ctx.params.sessionID }).pipe(
|
|
yield* promptSvc.prompt({ ...ctx.payload, sessionID: ctx.params.sessionID }).pipe(
|
|
|
Effect.catchCause((cause) =>
|
|
Effect.catchCause((cause) =>
|
|
|
Effect.gen(function* () {
|
|
Effect.gen(function* () {
|
|
@@ -307,6 +318,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof CommandPayload.Type
|
|
payload: typeof CommandPayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
return yield* promptSvc
|
|
return yield* promptSvc
|
|
|
.command({ ...ctx.payload, sessionID: ctx.params.sessionID })
|
|
.command({ ...ctx.payload, sessionID: ctx.params.sessionID })
|
|
|
.pipe(Effect.mapError(() => new HttpApiError.BadRequest({})))
|
|
.pipe(Effect.mapError(() => new HttpApiError.BadRequest({})))
|
|
@@ -316,6 +328,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof ShellPayload.Type
|
|
payload: typeof ShellPayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
return yield* promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID })
|
|
return yield* promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID })
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -323,17 +336,20 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID }
|
|
params: { sessionID: SessionID }
|
|
|
payload: typeof RevertPayload.Type
|
|
payload: typeof RevertPayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
return yield* revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload })
|
|
return yield* revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload })
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const unrevert = Effect.fn("SessionHttpApi.unrevert")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
const unrevert = Effect.fn("SessionHttpApi.unrevert")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
return yield* revertSvc.unrevert({ sessionID: ctx.params.sessionID })
|
|
return yield* revertSvc.unrevert({ sessionID: ctx.params.sessionID })
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const permissionRespond = Effect.fn("SessionHttpApi.permissionRespond")(function* (ctx: {
|
|
const permissionRespond = Effect.fn("SessionHttpApi.permissionRespond")(function* (ctx: {
|
|
|
- params: { permissionID: PermissionID }
|
|
|
|
|
|
|
+ params: { sessionID: SessionID; permissionID: PermissionID }
|
|
|
payload: typeof PermissionResponsePayload.Type
|
|
payload: typeof PermissionResponsePayload.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
yield* permissionSvc.reply({ requestID: ctx.params.permissionID, reply: ctx.payload.response })
|
|
yield* permissionSvc.reply({ requestID: ctx.params.permissionID, reply: ctx.payload.response })
|
|
|
return true
|
|
return true
|
|
|
})
|
|
})
|
|
@@ -341,6 +357,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
const deleteMessage = Effect.fn("SessionHttpApi.deleteMessage")(function* (ctx: {
|
|
const deleteMessage = Effect.fn("SessionHttpApi.deleteMessage")(function* (ctx: {
|
|
|
params: { sessionID: SessionID; messageID: MessageID }
|
|
params: { sessionID: SessionID; messageID: MessageID }
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
yield* runState.assertNotBusy(ctx.params.sessionID)
|
|
yield* runState.assertNotBusy(ctx.params.sessionID)
|
|
|
yield* session.removeMessage(ctx.params)
|
|
yield* session.removeMessage(ctx.params)
|
|
|
return true
|
|
return true
|
|
@@ -349,6 +366,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
const deletePart = Effect.fn("SessionHttpApi.deletePart")(function* (ctx: {
|
|
const deletePart = Effect.fn("SessionHttpApi.deletePart")(function* (ctx: {
|
|
|
params: { sessionID: SessionID; messageID: MessageID; partID: PartID }
|
|
params: { sessionID: SessionID; messageID: MessageID; partID: PartID }
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
yield* session.removePart(ctx.params)
|
|
yield* session.removePart(ctx.params)
|
|
|
return true
|
|
return true
|
|
|
})
|
|
})
|
|
@@ -357,15 +375,14 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|
|
params: { sessionID: SessionID; messageID: MessageID; partID: PartID }
|
|
params: { sessionID: SessionID; messageID: MessageID; partID: PartID }
|
|
|
payload: typeof MessageV2.Part.Type
|
|
payload: typeof MessageV2.Part.Type
|
|
|
}) {
|
|
}) {
|
|
|
|
|
+ yield* requireSession(ctx.params.sessionID)
|
|
|
const payload = ctx.payload as MessageV2.Part
|
|
const payload = ctx.payload as MessageV2.Part
|
|
|
if (
|
|
if (
|
|
|
payload.id !== ctx.params.partID ||
|
|
payload.id !== ctx.params.partID ||
|
|
|
payload.messageID !== ctx.params.messageID ||
|
|
payload.messageID !== ctx.params.messageID ||
|
|
|
payload.sessionID !== ctx.params.sessionID
|
|
payload.sessionID !== ctx.params.sessionID
|
|
|
) {
|
|
) {
|
|
|
- throw new Error(
|
|
|
|
|
- `Part mismatch: body.id='${payload.id}' vs partID='${ctx.params.partID}', body.messageID='${payload.messageID}' vs messageID='${ctx.params.messageID}', body.sessionID='${payload.sessionID}' vs sessionID='${ctx.params.sessionID}'`,
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ return yield* new HttpApiError.BadRequest({})
|
|
|
}
|
|
}
|
|
|
return yield* session.updatePart(payload)
|
|
return yield* session.updatePart(payload)
|
|
|
})
|
|
})
|