refactor(agent): preserve compact voice contract in World Packet extraction

Reconcile #880 with current main. Delegate the view-state builder while keeping enabled-only layers, disabledLayerCount, provenance, context semantics, and existing voice behavior. Add parity and roster-read regressions; retain package export, boundaries and changelog fragment.

Preserve original GEV voice, layer and packet contributor credit.
This commit is contained in:
Kevin Rajan committed 2026-10-17 05:04:55 -05:00
commit cefbad3c2a
1069 files changed
+148145 -8587

No files matched your search

+19 -2
View File
@@ -1,8 +1,8 @@
import * as Cesium from 'cesium';
import {
feedProvenanceEnvelope,
layerSnapshot,
layerSnapshots,
viewStateLayerRow,
} from '../data/layerSnapshot.js';
import { contextModeWord } from '../contextModePolicy.js';
@@ -139,7 +139,10 @@ export function getWorldPacket({
const cartographic = Cesium.Cartographic.fromCartesian(
viewer.camera.positionWC,
);
// Read the roster once. Voice must not rewalk disabled layers: preserving the
// current enabled-only view keeps the model's context budget bounded.
const rows = dataManager.getAll();
const enabledRows = rows.filter((layer) => layer.enabled);
const contactsWindow = activeContactsWindow(dataManager);
const contextState =
typeof styleManager?.getContextModeState === 'function'
@@ -171,7 +174,21 @@ export function getWorldPacket({
: null,
scenePlayback: sceneDirector?.getPlaybackStatus?.() || null,
tracked: collectTrackedEntities(dataManager),
layers: rows.map((layer) => viewStateLayerRow(layer, { now })),
disabledLayerCount: rows.length - enabledRows.length,
// Preserve get_current_view_state's existing compact enabled-only shape.
layers: enabledRows.map((layer) => {
const snapshot = layerSnapshot(layer, { now });
return {
id: layer.id,
name: layer.name,
enabled: layer.enabled,
count: layer.stats?.count || 0,
error: layer.stats?.error || null,
feedState: snapshot.feedState,
source: snapshot.source,
lastUpdate: snapshot.lastUpdate,
};
}),
feedProvenance: feedProvenanceEnvelope(
layerSnapshots(rows, { now }).filter((layer) => layer.enabled),
{ now },
+43 -1
View File
@@ -94,7 +94,6 @@ test('World Packet keeps stale/unavailable feed semantics distinct from empty',
assert.match(packet.feedProvenance.note, /fixture unavailable/i);
});
test('semantic fingerprint ignores narration prose but changes with observed state', () => {
const { viewer, dataManager, styleManager } = harness();
const packet = getWorldPacket({ viewer, dataManager, styleManager });
@@ -108,3 +107,46 @@ test('semantic fingerprint ignores narration prose but changes with observed sta
changed.layers[0].count += 1;
assert.notEqual(semanticWorldPacketFingerprint(changed), original);
});
// The 2026-10 main voice contract omits disabled layers from the model payload.
test('World Packet and voice preserve enabled-only payload and count disabled layers', async () => {
const { viewer, dataManager, styleManager } = harness();
const rows = dataManager.getAll();
rows.push({
id: 'earthquakes',
name: 'Earthquakes',
enabled: false,
stats: { count: 99, source: 'fixture', error: 'stale' },
});
let reads = 0;
dataManager.getAll = () => {
reads += 1;
return rows;
};
const packet = getWorldPacket({ viewer, dataManager, styleManager });
assert.equal(reads, 1, 'collect the roster once rather than repeatedly');
assert.equal(packet.disabledLayerCount, 1);
assert.deepEqual(packet.layers.map((layer) => layer.id), ['traffic']);
assert.equal(packet.feedProvenance.overall, 'nominal');
const runner = createGevActionRunner({ viewer, dataManager, styleManager });
const voice = await runner('get_current_view_state');
assert.deepEqual(voice, packet);
});
test('World Packet fingerprints distinguish enabled state but ignore narrative churn', () => {
const { viewer, dataManager, styleManager } = harness();
const first = getWorldPacket({ viewer, dataManager, styleManager });
const prose = structuredClone(first);
prose.feedProvenance.note = 'new narration only';
assert.equal(
semanticWorldPacketFingerprint(first),
semanticWorldPacketFingerprint(prose),
);
const hidden = structuredClone(first);
hidden.disabledLayerCount += 1;
assert.notEqual(
semanticWorldPacketFingerprint(first),
semanticWorldPacketFingerprint(hidden),
);
});