fix(session): use typed message reads in tools (#27280)
This commit is contained in:
@@ -272,7 +272,7 @@ export const layer = Layer.effect(
|
|||||||
log.info("full sync", { sessionID })
|
log.info("full sync", { sessionID })
|
||||||
const info = yield* session.get(sessionID)
|
const info = yield* session.get(sessionID)
|
||||||
const diffs = yield* session.diff(sessionID)
|
const diffs = yield* session.diff(sessionID)
|
||||||
const messages = yield* Effect.sync(() => Array.from(MessageV2.stream(sessionID)))
|
const messages = yield* session.messages({ sessionID })
|
||||||
const models = yield* Effect.forEach(
|
const models = yield* Effect.forEach(
|
||||||
Array.from(
|
Array.from(
|
||||||
new Map(
|
new Map(
|
||||||
|
|||||||
@@ -6,16 +6,9 @@ import { Session } from "@/session/session"
|
|||||||
import { MessageV2 } from "../session/message-v2"
|
import { MessageV2 } from "../session/message-v2"
|
||||||
import { Provider } from "@/provider/provider"
|
import { Provider } from "@/provider/provider"
|
||||||
import { InstanceState } from "@/effect/instance-state"
|
import { InstanceState } from "@/effect/instance-state"
|
||||||
import { type SessionID, MessageID, PartID } from "../session/schema"
|
import { MessageID, PartID } from "../session/schema"
|
||||||
import EXIT_DESCRIPTION from "./plan-exit.txt"
|
import EXIT_DESCRIPTION from "./plan-exit.txt"
|
||||||
|
|
||||||
function getLastModel(sessionID: SessionID) {
|
|
||||||
for (const item of MessageV2.stream(sessionID)) {
|
|
||||||
if (item.info.role === "user" && item.info.model) return item.info.model
|
|
||||||
}
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Parameters = Schema.Struct({})
|
export const Parameters = Schema.Struct({})
|
||||||
|
|
||||||
export const PlanExitTool = Tool.define(
|
export const PlanExitTool = Tool.define(
|
||||||
@@ -51,7 +44,10 @@ export const PlanExitTool = Tool.define(
|
|||||||
|
|
||||||
if (answers[0]?.[0] === "No") yield* new Question.RejectedError()
|
if (answers[0]?.[0] === "No") yield* new Question.RejectedError()
|
||||||
|
|
||||||
const model = getLastModel(ctx.sessionID) ?? (yield* provider.defaultModel())
|
const messages = yield* session.messages({ sessionID: ctx.sessionID }).pipe(Effect.orDie)
|
||||||
|
const lastUser = messages.findLast((item) => item.info.role === "user" && item.info.model)
|
||||||
|
const model =
|
||||||
|
lastUser?.info.role === "user" && lastUser.info.model ? lastUser.info.model : yield* provider.defaultModel()
|
||||||
|
|
||||||
const msg: MessageV2.User = {
|
const msg: MessageV2.User = {
|
||||||
id: MessageID.ascending(),
|
id: MessageID.ascending(),
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export const TaskTool = Tool.define(
|
|||||||
],
|
],
|
||||||
}))
|
}))
|
||||||
|
|
||||||
const msg = yield* Effect.sync(() => MessageV2.get({ sessionID: ctx.sessionID, messageID: ctx.messageID }))
|
const msg = yield* MessageV2.getEffect({ sessionID: ctx.sessionID, messageID: ctx.messageID }).pipe(Effect.orDie)
|
||||||
if (msg.info.role !== "assistant") return yield* Effect.fail(new Error("Not an assistant message"))
|
if (msg.info.role !== "assistant") return yield* Effect.fail(new Error("Not an assistant message"))
|
||||||
|
|
||||||
const model = next.model ?? {
|
const model = next.model ?? {
|
||||||
|
|||||||
Reference in New Issue
Block a user