picocode-core 0.9.153 → 0.9.154

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/controller.js +42 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "picocode-core",
3
- "version": "0.9.153",
3
+ "version": "0.9.154",
4
4
  "description": "The agent runtime behind pico: sessions, tools, subagents, MCP, memory, and model access",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/controller.js CHANGED
@@ -241,13 +241,19 @@ export function createController({ boot }) {
241
241
  rounds = options.rounds
242
242
  const existingIds = deliberationsFromEvents(state.events).map((item) => Number(item.deliberationId)).filter(Number.isFinite)
243
243
  const id = String(Math.max(0, ...existingIds) + 1)
244
- const modelName = boot.deliberationModel
245
- const worker = boot.models.find((m) => m.name === modelName)
246
- if (!worker || worker.available === false) throw new Error(`deliberation model unavailable: ${modelName}`)
247
- const auth = worker.provider === 'codex' ? await openaiCredentials() : null
244
+ const roleModel = (role) => (role === 'proposer' ? boot.proposerModel : role === 'reviewer' ? boot.reviewerModel : null) || boot.deliberationModel || boot.proposerModel || boot.reviewerModel
245
+ const roleWorkers = {}
246
+ const roleAuths = {}
247
+ for (const part of ['proposer', 'reviewer', 'synthesizer']) {
248
+ const name = roleModel(part)
249
+ const found = boot.models.find((m) => m.name === name)
250
+ if (!found || found.available === false) throw new Error(`deliberation model unavailable: ${name}`)
251
+ roleWorkers[part] = found
252
+ roleAuths[part] = found.provider === 'codex' ? await openaiCredentials() : null
253
+ }
248
254
  const sessionId = state.session?.id
249
255
  if (!sessionId) throw new Error('deliberation requires an active session')
250
- persist(makeEvent('deliberation_start', { deliberationId: id, brief, rounds, model: modelName }))
256
+ persist(makeEvent('deliberation_start', { deliberationId: id, brief, rounds, model: roleModel('synthesizer'), models: { proposer: roleModel('proposer'), reviewer: roleModel('reviewer') } }))
251
257
  bumpActivity()
252
258
  const live = { role: null, round: null, text: '' }
253
259
  liveDeliberations.set(id, live)
@@ -285,9 +291,9 @@ export function createController({ boot }) {
285
291
  history,
286
292
  tools: toolset.tools,
287
293
  recorder: toolset.recorder,
288
- modelName,
289
- effort: worker.effort ? 'low' : null,
290
- auth,
294
+ modelName: roleWorkers[role].name,
295
+ effort: roleWorkers[role].effort ? 'low' : null,
296
+ auth: roleAuths[role],
291
297
  system: participantSystemPrompt(scratchpad),
292
298
  signal,
293
299
  onStream,
@@ -602,7 +608,7 @@ export function createController({ boot }) {
602
608
  wakeups: boot.wakeups,
603
609
  memory: boot.memory,
604
610
  agents: boot.researchModel ? agents : null,
605
- deliberations: boot.deliberationModel ? deliberations : null,
611
+ deliberations: boot.deliberationModel || (boot.proposerModel && boot.reviewerModel) ? deliberations : null,
606
612
  onAgentsCollected: discardCollectedAgentNotes,
607
613
  askUser,
608
614
  dredge: boot.dredge,
@@ -1029,7 +1035,8 @@ export function createController({ boot }) {
1029
1035
  flash('usage: /deliberate <decision>')
1030
1036
  return true
1031
1037
  }
1032
- if (!modelAvailable(boot.deliberationModel)) return false
1038
+ if (!modelAvailable(boot.proposerModel || boot.deliberationModel)) return false
1039
+ if (!modelAvailable(boot.reviewerModel || boot.deliberationModel)) return false
1033
1040
  const n = Number(rounds)
1034
1041
  send(deliberatePrompt(decision, Number.isInteger(n) && n >= 1 && n <= MAX_DELIBERATION_ROUNDS ? n : null))
1035
1042
  return true
@@ -1065,6 +1072,28 @@ export function createController({ boot }) {
1065
1072
  changed()
1066
1073
  }
1067
1074
 
1075
+ async function setProposerModel(name) {
1076
+ if (name && !modelAvailable(name)) return flash(`${name} is not available`)
1077
+ boot.proposerModel = name || null
1078
+ await writeConfig({ models: { proposer: name || null } })
1079
+ changed()
1080
+ }
1081
+
1082
+ async function setReviewerModel(name) {
1083
+ if (name && !modelAvailable(name)) return flash(`${name} is not available`)
1084
+ boot.reviewerModel = name || null
1085
+ await writeConfig({ models: { reviewer: name || null } })
1086
+ changed()
1087
+ }
1088
+
1089
+ async function setDefaultModel(name) {
1090
+ const pick = boot.models.find((m) => m.name === name)
1091
+ if (!pick || pick.available === false) return flash(`${name || 'model'} is not available`)
1092
+ state.defaultModel = pick
1093
+ await writeConfig({ defaultModel: pick.name })
1094
+ changed()
1095
+ }
1096
+
1068
1097
  function sendInit(args) {
1069
1098
  send(initPrompt(args))
1070
1099
  }
@@ -1332,6 +1361,9 @@ export function createController({ boot }) {
1332
1361
  sendInit,
1333
1362
  setResearchModel,
1334
1363
  setDeliberationModel,
1364
+ setProposerModel,
1365
+ setReviewerModel,
1366
+ setDefaultModel,
1335
1367
  previewSteer,
1336
1368
  applySteer,
1337
1369
  rewind,