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
extractionTargetYes—EntityDataEvent, 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
filterOriginUuidNo—Emit only records from this origin_uuid
filterOriginIndexNo—Emit only records for captureIdentity.origins[index]
filterEntityIdNo—Emit only records for this simulation entity id
filterEntityIndexNo—Emit only records for captureIdentity.entities[index] (lane)
filterEntityNameNo—Exact entity name match (case-sensitive)
entityNameRegexNo—Fullmatch regex on entity name (EntityState; events use registry name when known)
includeComponentTypesNo—Allow-list of Component oneof arms (EntityState / SimulationFrame)
excludeComponentTypesNo—Deny-list of component oneof arms (mutually exclusive with include)
dropEmptyEntitiesNotrueDrop entities with zero components after projection
includeDataEventTypesNo—Allow-list of EntityDataEvent event_data oneof arms
includeTrackingEventTypesNo—Allow-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.