@volter/supercode-frontend-vscode 0.1.54 → 0.1.56

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.
package/README.md CHANGED
@@ -88,6 +88,11 @@ the pinned workbench's [first-send materialization](https://github.com/volter-ai
88
88
  and [draft acceptance](https://github.com/volter-ai/code-oss/blob/f16dc165c0dffe701a7bbf59aefb1c662b206cee/src/vs/workbench/contrib/chat/browser/widget/chatWidget.ts#L3493)
89
89
  paths. A failed startup leaves the draft available to retry.
90
90
 
91
+ New Chat highlights the agent from the focused conversation (or an already
92
+ chosen draft) before opening the blank chat. With no matching choice it keeps
93
+ the host/native default. This is a source correction with
94
+ [real Chat qualification still open](../../docs/evidence/chat-agent-picker-focus-2026-10-09.md).
95
+
91
96
  The pending agent/model choice belongs to that blank chat's untitled resource
92
97
  and is retired when another conversation opens. Cancelling or opening sign-in
93
98
  does not choose an agent. Readiness polling continues to discover
@@ -403,7 +408,13 @@ request is resolved. Standalone requests use the explicit runtime-history marker
403
408
  instead of reopening an earlier answer. A new conversation sends its first input
404
409
  before trying to save its native identity: the harness creates its transcript
405
410
  from that input. Identity saves run after input acceptance, retry with later
406
- native events until one succeeds, and run again when a turn ends. After reload,
411
+ native events until one succeeds, and finish at the end of a turn. A successful
412
+ host save acknowledges that exact runtime connection, native id and catalogue
413
+ identity; completion skips another save while all three still match. A reload
414
+ or replacement connection must obtain its own acknowledgement. Completion
415
+ refreshes the host before that comparison; a changed/cleared binding or failed
416
+ refresh invalidates the local acknowledgement and retains the save attempt.
417
+ After reload,
407
418
  the exact runtime's user history/events recover that save obligation; restored
408
419
  snapshots, later events and response completion retry through the same host
409
420
  checks without sending input. A busy state or standalone request alone does
@@ -420,6 +431,9 @@ candidate reload and approval click remain unmeasured.
420
431
  The [first-input regression investigation](../../docs/evidence/chat-first-input-binding-2026-10-08.md)
421
432
  records the 0.1.52 binding-order failure, the correction and its outstanding
422
433
  product reading.
434
+ The [identity-save investigation](../../docs/evidence/chat-identity-save-acknowledgement-2026-10-08.md)
435
+ names the repeated host lookup removed at completion; candidate latency and
436
+ real-editor qualification remain open.
423
437
 
424
438
  The pinned Code-OSS host needs a resource-scoping repair in its input-state change
425
439
  routing: stock code broadcasts changes to all input states of a provider. The
package/dist/extension.js CHANGED
@@ -435,6 +435,14 @@ export async function activate(context) {
435
435
  || connection.session.replay.some(event => event.kind === 'user_message');
436
436
  return save;
437
437
  };
438
+ const identitySaved = (connection, nativeId) => {
439
+ const save = identitySave(connection);
440
+ save.remembered = true;
441
+ const identity = controls?.state.sessions.find(session => session.id === connection.id)?.identity;
442
+ // Only a successful host save acknowledges this runtime/native-id pair.
443
+ // A restored catalogue identity alone is not a save receipt for a new connection.
444
+ save.acknowledged = identity ? { nativeId, identity } : undefined;
445
+ };
438
446
  const rememberIdentity = (connection, submitted = false) => {
439
447
  const save = identitySave(connection);
440
448
  save.submitted ||= submitted;
@@ -453,7 +461,7 @@ export async function activate(context) {
453
461
  save.again = false;
454
462
  try {
455
463
  await controls.remember(connection.id, nativeId);
456
- save.remembered = true;
464
+ identitySaved(connection, nativeId);
457
465
  }
458
466
  catch (error) {
459
467
  log.warn(`Could not yet save conversation identity: ${String(error)}`);
@@ -468,10 +476,24 @@ export async function activate(context) {
468
476
  if (!controls || attachedIds.has(connection.id))
469
477
  return;
470
478
  await save.pending;
479
+ // The host may have cleared a binding since its last lifecycle reply.
480
+ // Read it before treating a local acknowledgement as satisfied.
481
+ const refreshed = await controls.refresh().then(() => true, error => {
482
+ log.warn(`Could not refresh chat identity: ${String(error)}`);
483
+ return false;
484
+ });
471
485
  const nativeId = connection.session.descriptor?.session_id;
472
- if (nativeId)
486
+ const identity = controls.state.sessions.find(session => session.id === connection.id)?.identity;
487
+ const acknowledged = save.acknowledged;
488
+ const satisfied = Boolean(refreshed && nativeId && acknowledged
489
+ && acknowledged.nativeId === nativeId && acknowledged.identity === identity);
490
+ if (!satisfied) {
491
+ save.acknowledged = undefined;
492
+ save.remembered = false;
493
+ }
494
+ if (nativeId && !satisfied)
473
495
  await controls.remember(connection.id, nativeId).then(() => {
474
- save.remembered = true;
496
+ identitySaved(connection, nativeId);
475
497
  }, error => {
476
498
  log.warn(`Could not save conversation identity: ${String(error)}`);
477
499
  if (save.submitted && !save.remembered && !save.warned
@@ -480,7 +502,6 @@ export async function activate(context) {
480
502
  void vscode.window.showWarningMessage('Your prompt was submitted, but Chat could not save this conversation for reopening. Keep this chat open; do not send the prompt again.');
481
503
  }
482
504
  });
483
- await controls.refresh().catch(error => log.warn(`Could not refresh chat identity: ${String(error)}`));
484
505
  controlsChanged.fire();
485
506
  };
486
507
  context.subscriptions.push(frontends.onDidChange(() => {
@@ -927,7 +948,9 @@ export async function activate(context) {
927
948
  quick.title = title;
928
949
  quick.placeholder = placeholder;
929
950
  quick.items = items;
930
- quick.activeItems = items.filter(item => item.id === currentId);
951
+ // Agent choices can also contain a model-configuration row with the same
952
+ // harness id. The ordinary agent row comes first; activate only that row.
953
+ quick.activeItems = items.filter(item => item.id === currentId).slice(0, 1);
931
954
  return new Promise(resolve => {
932
955
  quick.onDidAccept(() => resolve(quick.selectedItems[0]));
933
956
  quick.onDidHide(() => resolve(undefined));
@@ -1155,6 +1178,15 @@ export async function activate(context) {
1155
1178
  return;
1156
1179
  }
1157
1180
  await controls.refresh();
1181
+ // Capture the conversation's agent before opening the blank chat clears
1182
+ // focus. A saved conversation need not be the host's active runtime yet.
1183
+ const previousId = focusedResource ? boundId(focusedResource) : controls.state.activeSession;
1184
+ const previousAttachment = focusedResource && attachedIds.has(focusedResource.authority)
1185
+ ? frontends.get(focusedResource.authority) : undefined;
1186
+ const previousHarness = previousAttachment?.session.descriptor?.source_harness
1187
+ ?? draftSelection()?.harness
1188
+ ?? controls.state.sessions.find(session => session.id === previousId)?.selection.harness
1189
+ ?? controls.state.selection.harness;
1158
1190
  const agents = setupAgents(controls.state);
1159
1191
  const localChoices = agents.map(agent => ({ label: agent.name, id: agent.harness,
1160
1192
  description: agent.harness === 'codex' ? (agent.signedIn ? 'Signed in with ChatGPT' : 'Sign in with ChatGPT…')
@@ -1171,7 +1203,7 @@ export async function activate(context) {
1171
1203
  return;
1172
1204
  }
1173
1205
  await chooseNewChat(async () => {
1174
- const harness = await vscode.window.showQuickPick(choices, { title: 'New chat', placeHolder: 'Choose your coding agent' });
1206
+ const harness = await pickWithCurrent(choices, 'New chat', 'Choose your coding agent', previousHarness);
1175
1207
  if (!harness)
1176
1208
  return { kind: 'cancelled' };
1177
1209
  if (harness.configure) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@volter/supercode-frontend-vscode",
3
3
  "displayName": "Volter Harness",
4
- "version": "0.1.54",
4
+ "version": "0.1.56",
5
5
  "type": "module",
6
6
  "description": "VS Code chat-view frontend for an existing Volter Harness SDK runtime",
7
7
  "publisher": "volter-ai-dev",