Skip to Content
This documentation is provided with the HEAT environment and is relevant for this HEAT instance only.
RunnersSystem Utilssystem-protobuf-extract

system-protobuf-extract (platform, system-utils)

Platform reserved. Decodes HEAT capture DataPacket / DataPacketBundle trees from a parent input-node and emits scoped JSON records. Subset of hydrate-protobuf-v2 targets without requiring core-utils, including the same projection filters where applicable.

Parent: single input-node.

Configuration

PropertyRequiredDefaultDescription
extractionTargetYesEntityDataEvent, EntityState, SimulationFrame, or TrackingEvent
outputFormatNojsonOnly json supported
lineDelimitedJsonNofalseOne record per line; forced true when incrementalHydration is on
incrementalHydrationNofalseAppend new parent outputs using watermark
enableUploadDeduplicationNofalseSkip upload when md5 matches prior output
readWindowBytesNo8388608Bounded read per parent blob
batchSizeNo100Max parent outputs per run
timeBudgetSecondsNo300Cooperative time budget
filterOriginUuidNoEmit only records from this origin_uuid
filterOriginIndexNoEmit only records for captureIdentity.origins[index]
filterEntityIdNoEmit only records for this simulation entity id
filterEntityIndexNoEmit only records for captureIdentity.entities[index] (lane)
filterEntityNameNoExact entity name match (case-sensitive)
entityNameRegexNoFullmatch regex on entity name (EntityState; events use registry name when known)
includeComponentTypesNoAllow-list of Component oneof arms (EntityState / SimulationFrame)
excludeComponentTypesNoDeny-list of component oneof arms (mutually exclusive with include)
dropEmptyEntitiesNotrueDrop entities with zero components after projection
includeDataEventTypesNoAllow-list of EntityDataEvent event_data oneof arms
includeTrackingEventTypesNoAllow-list of TrackingEventType enum names
updateSessionCaptureIdentityNosmart defaultMerge observed origins/entities into session captureIdentity. Default true without index filters; default false when filterOriginIndex or filterEntityIndex is set

Output shape

Wrapped JSON (default):

{ "records": [ { "parent_output_id": 1, "origin_uuid": "…", "origin_index": 0, "entity_id": 42, "entity_name": "Pilot-1", "entity_index": 0, "extraction_target": "EntityDataEvent" } ] }

NDJSON when lineDelimitedJson: true (required for incremental append).

Capture identity and lanes

For multi-user SIM templates, use one registry extract node plus parallel lane nodes. See Capture identity lanes.

{ "extractionTarget": "EntityDataEvent", "filterEntityIndex": 0, "updateSessionCaptureIdentity": false, "lineDelimitedJson": true, "incrementalHydration": true }

Domain tree example (world position only):

{ "extractionTarget": "EntityState", "includeComponentTypes": ["world_position", "dynamics"], "entityNameRegex": "^(Blue|Red)-.*", "dropEmptyEntities": true }

Authoring guidance

  • Prefer EntityDataEvent or TrackingEvent over SimulationFrame when possible.
  • Use component projection on EntityState to avoid oversized artefacts.
  • Run parallel branches per target or per lane instead of one deep hydrate chain.
  • Pair with system-arbex-js and heat-system-next-dimension for dashboards.

When core-utils is available, hydrate-protobuf-v2 remains an alternative with CSV output and merge ecosystem.

Shipped preset

heat-capture-mainline-scoped: discovery leaf, identity registry, two entity-index lanes, and scoped mainline. See Capture session templates.