chore: generate

This commit is contained in:
opencode-agent[bot] 2026-05-29 20:06:03 +00:00
commit 8fe6cd9932
4 changed files with 52 additions and 65 deletions

View file

@ -1,12 +1,9 @@
import { RequestError } from "@agentclientprotocol/sdk" import { RequestError } from "@agentclientprotocol/sdk"
import { Schema } from "effect" import { Schema } from "effect"
export class SessionNotFoundError extends Schema.TaggedErrorClass<SessionNotFoundError>()( export class SessionNotFoundError extends Schema.TaggedErrorClass<SessionNotFoundError>()("ACPSessionNotFoundError", {
"ACPSessionNotFoundError", sessionId: Schema.String,
{ }) {}
sessionId: Schema.String,
},
) {}
export class InvalidConfigOptionError extends Schema.TaggedErrorClass<InvalidConfigOptionError>()( export class InvalidConfigOptionError extends Schema.TaggedErrorClass<InvalidConfigOptionError>()(
"ACPInvalidConfigOptionError", "ACPInvalidConfigOptionError",

View file

@ -615,56 +615,54 @@ function makeUsageService(sdk: OpencodeClient) {
}, },
) )
const sendUpdate: UsageService.Interface["sendUpdate"] = Effect.fn("ACP.promptUsage.sendUpdate")( const sendUpdate: UsageService.Interface["sendUpdate"] = Effect.fn("ACP.promptUsage.sendUpdate")(function* (params) {
function* (params) { const messages = yield* request(
const messages = yield* request( () =>
() => sdk.session.messages(
sdk.session.messages( {
{ sessionID: params.sessionID,
sessionID: params.sessionID, directory: params.directory,
directory: params.directory, },
}, { throwOnError: true },
{ throwOnError: true },
),
"session",
).pipe(
Effect.map((messages) => messages as readonly UsageService.SessionMessage[]),
Effect.catch((error) =>
Effect.sync(() => {
log.error("failed to fetch messages for usage update", { error })
return undefined
}),
), ),
) "session",
if (!messages) return ).pipe(
Effect.map((messages) => messages as readonly UsageService.SessionMessage[]),
Effect.catch((error) =>
Effect.sync(() => {
log.error("failed to fetch messages for usage update", { error })
return undefined
}),
),
)
if (!messages) return
const message = UsageService.latestAssistantMessage(messages) const message = UsageService.latestAssistantMessage(messages)
if (!message?.providerID || !message.modelID) return if (!message?.providerID || !message.modelID) return
const size = yield* contextLimit({ const size = yield* contextLimit({
directory: params.directory, directory: params.directory,
providerID: ProviderID.make(message.providerID), providerID: ProviderID.make(message.providerID),
modelID: ModelID.make(message.modelID), modelID: ModelID.make(message.modelID),
}) })
if (!size) return if (!size) return
yield* Effect.promise(() => yield* Effect.promise(() =>
params.connection params.connection
.sessionUpdate({ .sessionUpdate({
sessionId: params.sessionID, sessionId: params.sessionID,
update: { update: {
sessionUpdate: "usage_update", sessionUpdate: "usage_update",
used: message.tokens.input + message.tokens.cache.read, used: message.tokens.input + message.tokens.cache.read,
size, size,
cost: { amount: UsageService.totalSessionCost(messages), currency: "USD" }, cost: { amount: UsageService.totalSessionCost(messages), currency: "USD" },
}, },
}) })
.catch((error) => { .catch((error) => {
log.error("failed to send usage update", { error }) log.error("failed to send usage update", { error })
}), }),
) )
}, })
)
return UsageService.Service.of({ return UsageService.Service.of({
buildUsage: UsageService.buildUsage, buildUsage: UsageService.buildUsage,
@ -736,9 +734,7 @@ async function loadDirectorySnapshot(sdk: OpencodeClient, directory: string) {
ACPProfile.measure("acp.directory.mode.defaultAgent.load", () => ACPProfile.measure("acp.directory.mode.defaultAgent.load", () =>
sdk.app.agents({ directory }, { throwOnError: true }), sdk.app.agents({ directory }, { throwOnError: true }),
), ),
ACPProfile.measure("acp.directory.command.list", () => ACPProfile.measure("acp.directory.command.list", () => sdk.command.list({ directory }, { throwOnError: true })),
sdk.command.list({ directory }, { throwOnError: true }),
),
ACPProfile.measure("acp.directory.skill.list", () => sdk.app.skills({ directory }, { throwOnError: true })), ACPProfile.measure("acp.directory.skill.list", () => sdk.app.skills({ directory }, { throwOnError: true })),
ACPProfile.measure("acp.directory.defaultModel.config", () => ACPProfile.measure("acp.directory.defaultModel.config", () =>
sdk.config.get({ directory }, { throwOnError: true }).catch(() => undefined), sdk.config.get({ directory }, { throwOnError: true }).catch(() => undefined),

View file

@ -148,9 +148,7 @@ export const layer = Layer.effect(
update(sessionId, (session) => ({ ...session, modeId })), update(sessionId, (session) => ({ ...session, modeId })),
) )
const recordPartMetadata: Interface["recordPartMetadata"] = Effect.fn("ACP.Session.recordPartMetadata")(( const recordPartMetadata: Interface["recordPartMetadata"] = Effect.fn("ACP.Session.recordPartMetadata")((input) => {
input,
) => {
const metadata = { const metadata = {
messageId: input.messageId, messageId: input.messageId,
partId: input.partId, partId: input.partId,

View file

@ -12,9 +12,7 @@ describe("acp.error", () => {
new ACPError.InvalidModeError({ mode: "turbo" }), new ACPError.InvalidModeError({ mode: "turbo" }),
] ]
expect(cases.map((error) => ACPError.toRequestError(error).code)).toEqual([ expect(cases.map((error) => ACPError.toRequestError(error).code)).toEqual([-32602, -32602, -32602, -32602, -32602])
-32602, -32602, -32602, -32602, -32602,
])
}) })
test("includes safe validation details", () => { test("includes safe validation details", () => {
@ -38,9 +36,7 @@ describe("acp.error", () => {
}) })
test("maps unsupported operations to method not found", () => { test("maps unsupported operations to method not found", () => {
const requestError = ACPError.toRequestError( const requestError = ACPError.toRequestError(new ACPError.UnsupportedOperationError({ method: "session/new" }))
new ACPError.UnsupportedOperationError({ method: "session/new" }),
)
expect(requestError.code).toBe(-32601) expect(requestError.code).toBe(-32601)
expect(requestError.data).toEqual({ method: "session/new" }) expect(requestError.data).toEqual({ method: "session/new" })