Skip to content

Commit fedd254

Browse files
committed
feat: expose acp thinking variants (anomalyco#9064)
Apply commit fdd484d from opencode/dev: - Add variant support to ACPSessionState - Add getVariant/setVariant methods to ACPSessionManager - Update setSessionModel to handle variants and return _meta - Update setSessionMode to validate mode exists - Update loadSessionMode/newSession to return variant metadata
1 parent ffb298b commit fedd254

3 files changed

Lines changed: 47 additions & 8 deletions

File tree

packages/agent-core/src/acp/agent.ts

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const withDirectory = (
5757
})
5858

5959
const VARIANT_SEPARATOR = "#"
60+
const DEFAULT_VARIANT_VALUE = "default"
6061

6162
function parseModelId(modelId: string): { providerID: string; modelID: string; variant?: string } {
6263
const [base, variant] = modelId.split(VARIANT_SEPARATOR)
@@ -523,7 +524,7 @@ export namespace ACP {
523524
sessionId,
524525
models: load.models,
525526
modes: load.modes,
526-
_meta: {},
527+
_meta: load._meta,
527528
}
528529
} catch (e) {
529530
const error = MessageV2.fromError(e, {
@@ -981,6 +982,8 @@ export namespace ACP {
981982
})
982983
}, 0)
983984

985+
const currentVariant = this.sessionManager.getVariant(sessionId)
986+
984987
return {
985988
sessionId,
986989
models: {
@@ -991,7 +994,13 @@ export namespace ACP {
991994
availableModes,
992995
currentModeId,
993996
},
994-
_meta: {},
997+
_meta: {
998+
opencode: {
999+
modelId: `${currentModel.providerID}/${currentModel.modelID}`,
1000+
variant: currentVariant ?? null,
1001+
availableVariants: [],
1002+
},
1003+
},
9951004
}
9961005
}
9971006

@@ -1005,20 +1014,37 @@ export namespace ACP {
10051014
modelID: model.modelID,
10061015
variant: model.variant,
10071016
})
1017+
this.sessionManager.setVariant(session.id, model.variant)
10081018

10091019
return {
1010-
_meta: {},
1020+
_meta: {
1021+
opencode: {
1022+
modelId: `${model.providerID}/${model.modelID}`,
1023+
variant: model.variant ?? null,
1024+
availableVariants: [],
1025+
},
1026+
},
10111027
}
10121028
}
10131029

10141030
async setSessionMode(params: SetSessionModeRequest): Promise<SetSessionModeResponse | void> {
10151031
const session = this.sessionManager.get(params.sessionId)
1016-
await this.config.sdk.app
1032+
const agents = await this.config.sdk.app
10171033
.agents(withDirectory(session.cwd, { throwOnError: true }))
1018-
.then((x) => x.data)
1019-
.then((agent) => {
1020-
if (!agent) throw new Error(`Agent not found: ${params.modeId}`)
1021-
})
1034+
.then((resp) => resp.data!)
1035+
1036+
const availableModes = agents
1037+
.filter((agent) => agent.mode !== "subagent" && !agent.hidden)
1038+
.map((agent) => ({
1039+
id: agent.name,
1040+
name: agent.name,
1041+
description: agent.description,
1042+
}))
1043+
1044+
if (!availableModes.some((mode) => mode.id === params.modeId)) {
1045+
throw new Error(`Agent not found: ${params.modeId}`)
1046+
}
1047+
10221048
this.sessionManager.setMode(params.sessionId, params.modeId)
10231049
}
10241050

packages/agent-core/src/acp/session.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ export class ACPSessionManager {
105105
return session
106106
}
107107

108+
getVariant(sessionId: string) {
109+
const session = this.get(sessionId)
110+
return session.variant
111+
}
112+
113+
setVariant(sessionId: string, variant?: string) {
114+
const session = this.get(sessionId)
115+
session.variant = variant
116+
this.sessions.set(sessionId, session)
117+
return session
118+
}
119+
108120
setMode(sessionId: string, modeId: string) {
109121
const session = this.get(sessionId)
110122
session.modeId = modeId

packages/agent-core/src/acp/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface ACPSessionState {
1111
modelID: string
1212
variant?: string
1313
}
14+
variant?: string
1415
modeId?: string
1516
}
1617

0 commit comments

Comments
 (0)