[codex] Expose host-owned runtime IDs through core runtime flows#740
[codex] Expose host-owned runtime IDs through core runtime flows#740rahulkarajgikar wants to merge 4 commits intotruffle-ai:mainfrom
Conversation
|
@rahulkarajgikar is attempting to deploy a commit to the Shaunak's projects Team on Vercel. A member of the Team first needs to authorize it. |
📝 WalkthroughWalkthroughThis PR introduces first-class support for host-owned runtime IDs (e.g., Changes
Sequence DiagramsequenceDiagram
participant Host
participant Agent as DextoAgent
participant EventBus
participant Telemetry
participant Tools
Host->>Agent: createAgent(options.runtimeOverrides.hostRuntime)
Agent->>Agent: validateConfig() + normalizeHostRuntimeContext()
Agent->>Agent: store hostRuntime in private field
Note over Agent: During execution...
Agent->>EventBus: emit(event) with hostRuntime in config
EventBus->>EventBus: HostRuntimeTypedEventEmitter.emit()
EventBus->>EventBus: inject hostRuntime into payload
EventBus->>Host: event payload with hostRuntime { ids }
Agent->>Telemetry: stream() / generate()
Telemetry->>Telemetry: buildHostRuntimeBaggageEntries(hostRuntime)
Telemetry->>Telemetry: merge into baggage before sessionId
Agent->>Tools: setToolExecutionContextFactory()
Tools->>Tools: tool context includes hostRuntime.ids
Tools->>Host: toolContext { sessionId, hostRuntime }
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
# Conflicts: # packages/cli/src/cli/modes/cli.test.ts # packages/cli/src/cli/utils/config-validation.test.ts
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (3)
packages/core/src/index.ts (1)
92-93: Prefer explicit runtime re-exports at the package root.Adding another
export *here means anything later added topackages/core/src/runtime/index.tssilently becomes part of@dexto/core's public API. Re-export the intended host-runtime symbols explicitly so the root surface stays deliberate.As per coding guidelines: "Use selective barrel strategy: only add index.ts at real public module boundaries; prefer direct imports internally and avoid deep re-export chains" and "Avoid wildcard exports; prefer explicit named exports in all TypeScript files".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/core/src/index.ts` around lines 92 - 93, Replace the wildcard re-export "export * from './runtime/index.js'" with explicit named exports so the public surface is deliberate: open the runtime barrel (packages/core/src/runtime/index.ts) and list each host-runtime symbol to re-export (for example HostRuntime, RuntimeConfig, startRuntime, createHost — use the actual exported identifiers from that file), then update packages/core/src/index.ts to export those names instead of using "export *". Ensure you remove the wildcard export and only re-export the intended symbols so new additions to runtime/index.ts don't inadvertently become public API.packages/core/src/runtime/host-runtime.ts (1)
59-76: Potential duplicate baggage entries for well-known keys.When a well-known key (e.g.,
runId) is present, it's emitted twice: once with the prefix (hostRuntime.ids.runId) and once without (runId). This is intentional for compatibility, but consider documenting this behavior in a comment to clarify why both entries are created.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/core/src/runtime/host-runtime.ts` around lines 59 - 76, The getHostRuntimeBaggageEntries function currently emits two baggage entries for well-known keys (one prefixed with HOST_RUNTIME_ENTRY_PREFIX and one bare) which can look like duplicates; add a concise inline comment above the loop in getHostRuntimeBaggageEntries explaining that this duplication is intentional for backward compatibility (preserving both legacy bare keys and new prefixed keys), referencing HOST_RUNTIME_ENTRY_PREFIX, isWellKnownHostRuntimeIdKey and HostRuntimeContext so future readers understand why both entries (e.g., runId and hostRuntime.ids.runId) are created.packages/core/src/events/index.ts (1)
1033-1063: Consider adding explicit return type annotation for clarity.The
HostRuntimeTypedEventEmitterlogic is sound—it correctly guards against non-object payloads and avoids overwriting existinghostRuntimefields. However, the type assertion on lines 1057-1059 could be simplified.One minor observation: the
isEventPayloadObjectguard correctly excludes arrays and nulls but allowsDate,Error, and other object subclasses. This should be fine for event payloads in practice, but worth noting.♻️ Optional: Simplify the type assertion
- const argsWithHostRuntime = [ - { ...payload, hostRuntime: this.hostRuntime } as TEventMap[K], - ] as TEventMap[K] extends void ? [] : [TEventMap[K]]; + const augmentedPayload = { ...payload, hostRuntime: this.hostRuntime }; + return super.emit(event, augmentedPayload as TEventMap[K]);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/core/src/events/index.ts` around lines 1033 - 1063, The emit method in HostRuntimeTypedEventEmitter can avoid the noisy conditional assertion by creating a typed payload-with-host and explicitly typing the args tuple: after validating payload with isEventPayloadObject, build const payloadWithHost = { ...payload, hostRuntime: this.hostRuntime } as TEventMap[K] and then create const argsWithHostRuntime: TEventMap[K] extends void ? [] : [TEventMap[K]] = [payloadWithHost] as any; finally call return super.emit(event, ...argsWithHostRuntime); keep the emit return type as boolean and ensure the local constants reference HostRuntimeTypedEventEmitter.emit, isEventPayloadObject, payloadWithHost and argsWithHostRuntime for clarity.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/core/src/hooks/manager.ts`:
- Around line 171-173: runtimeConfig is returning a mutable hostRuntime object
from options.stateManager.getRuntimeConfig(options.sessionId) and you're passing
that reference into untrusted hook code; defensively clone hostRuntime (and its
ids array) before exposing it to hooks so hooks cannot mutate runtime
identifiers. Locate where runtimeConfig (and llmConfig) and hostRuntime are
retrieved in manager.ts (the call to options.stateManager.getRuntimeConfig) and
replace the direct reference with a cloned copy (e.g., a shallow clone of the
hostRuntime object plus a copy of hostRuntime.ids) and pass that clone into the
hook invocation instead of the original.
In `@packages/core/src/session/chat-session.ts`:
- Around line 156-158: The SessionEventBus is being constructed with a
non-session-scoped host runtime
(this.services.stateManager.getRuntimeConfig().hostRuntime), which can emit
events with incorrect correlation IDs; change the binding to use the
session-scoped runtime config instead (e.g.
this.services.stateManager.getSessionRuntimeConfig().hostRuntime or the
equivalent session-scoped accessor) when creating the SessionEventBus so events
carry the session's hostRuntime/correlation info.
In `@packages/core/src/telemetry/decorators.ts`:
- Around line 113-144: Compute a single resolved host-runtime context and runId
before setting span attributes instead of writing them from two separate
sources; e.g., create a resolvedHostRuntime by explicitly choosing precedence
between the incoming hostRuntime param and contextObj?.hostRuntime and derive a
single resolvedRunId (prefer resolvedHostRuntime.ids.runId if present, else
contextObj?.runId, else hostRuntime runId), then call
getHostRuntimeAttributes(resolvedHostRuntime) once and set both 'runId' and
'hostRuntime.ids.runId' (and their baggage keys) from resolvedRunId so
span.setAttribute and baggage keys remain consistent (affects code around
getHostRuntimeAttributes, contextObj, componentName, and runId usage).
---
Nitpick comments:
In `@packages/core/src/events/index.ts`:
- Around line 1033-1063: The emit method in HostRuntimeTypedEventEmitter can
avoid the noisy conditional assertion by creating a typed payload-with-host and
explicitly typing the args tuple: after validating payload with
isEventPayloadObject, build const payloadWithHost = { ...payload, hostRuntime:
this.hostRuntime } as TEventMap[K] and then create const argsWithHostRuntime:
TEventMap[K] extends void ? [] : [TEventMap[K]] = [payloadWithHost] as any;
finally call return super.emit(event, ...argsWithHostRuntime); keep the emit
return type as boolean and ensure the local constants reference
HostRuntimeTypedEventEmitter.emit, isEventPayloadObject, payloadWithHost and
argsWithHostRuntime for clarity.
In `@packages/core/src/index.ts`:
- Around line 92-93: Replace the wildcard re-export "export * from
'./runtime/index.js'" with explicit named exports so the public surface is
deliberate: open the runtime barrel (packages/core/src/runtime/index.ts) and
list each host-runtime symbol to re-export (for example HostRuntime,
RuntimeConfig, startRuntime, createHost — use the actual exported identifiers
from that file), then update packages/core/src/index.ts to export those names
instead of using "export *". Ensure you remove the wildcard export and only
re-export the intended symbols so new additions to runtime/index.ts don't
inadvertently become public API.
In `@packages/core/src/runtime/host-runtime.ts`:
- Around line 59-76: The getHostRuntimeBaggageEntries function currently emits
two baggage entries for well-known keys (one prefixed with
HOST_RUNTIME_ENTRY_PREFIX and one bare) which can look like duplicates; add a
concise inline comment above the loop in getHostRuntimeBaggageEntries explaining
that this duplication is intentional for backward compatibility (preserving both
legacy bare keys and new prefixed keys), referencing HOST_RUNTIME_ENTRY_PREFIX,
isWellKnownHostRuntimeIdKey and HostRuntimeContext so future readers understand
why both entries (e.g., runId and hostRuntime.ids.runId) are created.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 19c17ed5-3568-4526-80e8-9ec13860052d
📒 Files selected for processing (29)
docs/static/openapi/openapi.jsonpackages/agent-config/src/resolver/to-dexto-agent-options.test.tspackages/agent-config/src/resolver/to-dexto-agent-options.tspackages/agent-management/src/AgentFactory.tspackages/agent-management/src/agent-creation.tspackages/cli/src/cli/modes/cli.test.tspackages/cli/src/cli/utils/config-validation.test.tspackages/core/src/agent/DextoAgent.lifecycle.test.tspackages/core/src/agent/DextoAgent.tspackages/core/src/agent/index.tspackages/core/src/agent/runtime-config.tspackages/core/src/agent/types.tspackages/core/src/events/index.test.tspackages/core/src/events/index.tspackages/core/src/hooks/manager.test.tspackages/core/src/hooks/manager.tspackages/core/src/hooks/types.tspackages/core/src/index.browser.tspackages/core/src/index.tspackages/core/src/runtime/host-runtime.tspackages/core/src/runtime/index.tspackages/core/src/session/chat-session.tspackages/core/src/session/session-manager.test.tspackages/core/src/session/session-manager.tspackages/core/src/telemetry/decorators.tspackages/core/src/telemetry/utils.test.tspackages/core/src/telemetry/utils.tspackages/core/src/tools/types.tspackages/server/src/hono/__tests__/test-fixtures.ts
| const runtimeConfig = options.stateManager.getRuntimeConfig(options.sessionId); | ||
| const llmConfig = runtimeConfig.llm; | ||
|
|
There was a problem hiding this comment.
Defensively clone hostRuntime before exposing it to hooks.
Line 178 passes a mutable reference from runtime config into untrusted hook code. A hook can mutate hostRuntime.ids and corrupt correlation identifiers for later flows.
🔧 Proposed fix
- const context: HookExecutionContext = {
+ const hostRuntime =
+ runtimeConfig.hostRuntime === undefined
+ ? undefined
+ : {
+ ...runtimeConfig.hostRuntime,
+ ids: runtimeConfig.hostRuntime.ids
+ ? { ...runtimeConfig.hostRuntime.ids }
+ : undefined,
+ };
+
+ const context: HookExecutionContext = {
sessionId: options.sessionId ?? undefined,
userId: asyncCtx?.userId ?? undefined,
tenantId: asyncCtx?.tenantId ?? undefined,
- hostRuntime: runtimeConfig.hostRuntime,
+ hostRuntime,
llmConfig,
logger: this.logger,Also applies to: 178-178
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/core/src/hooks/manager.ts` around lines 171 - 173, runtimeConfig is
returning a mutable hostRuntime object from
options.stateManager.getRuntimeConfig(options.sessionId) and you're passing that
reference into untrusted hook code; defensively clone hostRuntime (and its ids
array) before exposing it to hooks so hooks cannot mutate runtime identifiers.
Locate where runtimeConfig (and llmConfig) and hostRuntime are retrieved in
manager.ts (the call to options.stateManager.getRuntimeConfig) and replace the
direct reference with a cloned copy (e.g., a shallow clone of the hostRuntime
object plus a copy of hostRuntime.ids) and pass that clone into the hook
invocation instead of the original.
| this.eventBus = new SessionEventBus( | ||
| this.services.stateManager.getRuntimeConfig().hostRuntime | ||
| ); |
There was a problem hiding this comment.
Use session-scoped runtime config when binding SessionEventBus host runtime.
This currently binds hostRuntime from non-session-scoped config. If session runtime differs, emitted events can carry incorrect correlation IDs.
Suggested fix
- this.eventBus = new SessionEventBus(
- this.services.stateManager.getRuntimeConfig().hostRuntime
- );
+ this.eventBus = new SessionEventBus(
+ this.services.stateManager.getRuntimeConfig(this.id).hostRuntime
+ );📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| this.eventBus = new SessionEventBus( | |
| this.services.stateManager.getRuntimeConfig().hostRuntime | |
| ); | |
| this.eventBus = new SessionEventBus( | |
| this.services.stateManager.getRuntimeConfig(this.id).hostRuntime | |
| ); |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/core/src/session/chat-session.ts` around lines 156 - 158, The
SessionEventBus is being constructed with a non-session-scoped host runtime
(this.services.stateManager.getRuntimeConfig().hostRuntime), which can emit
events with incorrect correlation IDs; change the binding to use the
session-scoped runtime config instead (e.g.
this.services.stateManager.getSessionRuntimeConfig().hostRuntime or the
equivalent session-scoped accessor) when creating the SessionEventBus so events
carry the session's hostRuntime/correlation info.
| for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) { | ||
| span.setAttribute(key, value); | ||
| } | ||
|
|
||
| const contextObj = | ||
| this && typeof this === 'object' | ||
| ? (this as { | ||
| name?: string; | ||
| runId?: string; | ||
| hostRuntime?: HostRuntimeContext | undefined; | ||
| constructor?: { name?: string }; | ||
| }) | ||
| : undefined; | ||
| const inferredName = contextObj?.name ?? contextObj?.constructor?.name; | ||
|
|
||
| if (componentName) { | ||
| span.setAttribute('componentName', componentName); | ||
| span.setAttribute('baggage.componentName', componentName); | ||
| } else if (this && typeof this === 'object') { | ||
| const contextObj = this as { | ||
| name?: string; | ||
| runId?: string; | ||
| constructor?: { name?: string }; | ||
| }; | ||
| // Prefer instance.name, fallback to constructor.name | ||
| const inferredName = contextObj.name ?? contextObj.constructor?.name; | ||
| if (inferredName) { | ||
| span.setAttribute('componentName', inferredName); | ||
| } | ||
| if (contextObj.runId) { | ||
| span.setAttribute('runId', contextObj.runId); | ||
| span.setAttribute('baggage.runId', contextObj.runId); | ||
| } | ||
| } else if (inferredName) { | ||
| span.setAttribute('componentName', inferredName); | ||
| } | ||
|
|
||
| // Merge with existing baggage to preserve parent context values | ||
| const existingBaggage = propagation.getBaggage(ctx); | ||
| const baggageEntries: Record<string, BaggageEntry> = {}; | ||
| if (contextObj?.runId) { | ||
| span.setAttribute('runId', contextObj.runId); | ||
| span.setAttribute('baggage.runId', contextObj.runId); | ||
| } | ||
|
|
||
| // Copy all existing baggage entries to preserve custom baggage | ||
| if (existingBaggage) { | ||
| existingBaggage.getAllEntries().forEach(([key, entry]) => { | ||
| baggageEntries[key] = entry; | ||
| }); | ||
| } | ||
| for (const [key, value] of Object.entries( | ||
| getHostRuntimeAttributes(contextObj?.hostRuntime) | ||
| )) { | ||
| span.setAttribute(key, value); | ||
| } |
There was a problem hiding this comment.
Resolve one effective host-runtime context before writing run IDs.
These branches can leave runId and hostRuntime.ids.runId out of sync. If parent baggage already contains hostRuntime.ids.runId and this instance only supplies runId, the bare runId gets overwritten but the prefixed host-runtime entry does not. Downstream getBaggageValues() will then return one run ID from runId and a different one inside hostRuntime.ids, which breaks correlation.
💡 Suggested direction
- for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) {
- span.setAttribute(key, value);
- }
-
const contextObj =
this && typeof this === 'object'
? (this as {
name?: string;
runId?: string;
hostRuntime?: HostRuntimeContext | undefined;
constructor?: { name?: string };
})
: undefined;
const inferredName = contextObj?.name ?? contextObj?.constructor?.name;
+ const effectiveHostRuntime =
+ contextObj?.hostRuntime ??
+ (contextObj?.runId !== undefined
+ ? { ids: { runId: String(contextObj.runId) } }
+ : hostRuntime);
+
+ for (const [key, value] of Object.entries(
+ getHostRuntimeAttributes(effectiveHostRuntime)
+ )) {
+ span.setAttribute(key, value);
+ }
if (componentName) {
span.setAttribute('componentName', componentName);
span.setAttribute('baggage.componentName', componentName);
} else if (inferredName) {
span.setAttribute('componentName', inferredName);
}
if (contextObj?.runId) {
span.setAttribute('runId', contextObj.runId);
span.setAttribute('baggage.runId', contextObj.runId);
}
-
- for (const [key, value] of Object.entries(
- getHostRuntimeAttributes(contextObj?.hostRuntime)
- )) {
- span.setAttribute(key, value);
- }
...
- if (contextObj?.runId !== undefined) {
- baggageEntries.runId = {
- ...baggageEntries.runId,
- value: String(contextObj.runId),
- };
- }
-
- Object.assign(baggageEntries, getHostRuntimeBaggageEntries(contextObj?.hostRuntime));
+ Object.assign(baggageEntries, getHostRuntimeBaggageEntries(effectiveHostRuntime));As per coding guidelines: "Avoid multi-source values encoded as optional + fallback + fallback chains; prefer a single source of truth with explicit resolver function" and "Do not mix multiple fields that can each be 'the name' / 'the title' / 'the config' without an explicit resolver + tests".
Also applies to: 186-193
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/core/src/telemetry/decorators.ts` around lines 113 - 144, Compute a
single resolved host-runtime context and runId before setting span attributes
instead of writing them from two separate sources; e.g., create a
resolvedHostRuntime by explicitly choosing precedence between the incoming
hostRuntime param and contextObj?.hostRuntime and derive a single resolvedRunId
(prefer resolvedHostRuntime.ids.runId if present, else contextObj?.runId, else
hostRuntime runId), then call getHostRuntimeAttributes(resolvedHostRuntime) once
and set both 'runId' and 'hostRuntime.ids.runId' (and their baggage keys) from
resolvedRunId so span.setAttribute and baggage keys remain consistent (affects
code around getHostRuntimeAttributes, contextObj, componentName, and runId
usage).
…runtime-id # Conflicts: # packages/cli/src/cli/utils/config-validation.test.ts
There was a problem hiding this comment.
♻️ Duplicate comments (1)
packages/core/src/session/chat-session.ts (1)
158-160:⚠️ Potential issue | 🟠 MajorUse session-scoped runtime config when binding
SessionEventBus.At Line 159,
getRuntimeConfig()is called withoutthis.id, so the event bus may capture non-sessionhostRuntimeand emit incorrect correlation IDs for this session.Suggested fix
- this.eventBus = new SessionEventBus( - this.services.stateManager.getRuntimeConfig().hostRuntime - ); + this.eventBus = new SessionEventBus( + this.services.stateManager.getRuntimeConfig(this.id).hostRuntime + );🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/core/src/session/chat-session.ts` around lines 158 - 160, SessionEventBus is being constructed with a global runtime config via this.services.stateManager.getRuntimeConfig() which omits the session id and can capture the wrong hostRuntime; change the call to use the session-scoped runtime config (e.g. this.services.stateManager.getRuntimeConfig(this.id)) and pass its hostRuntime into the SessionEventBus constructor so emitted events carry the correct session correlation IDs; update the instantiation of SessionEventBus accordingly in the chat session constructor where this.eventBus is set.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In `@packages/core/src/session/chat-session.ts`:
- Around line 158-160: SessionEventBus is being constructed with a global
runtime config via this.services.stateManager.getRuntimeConfig() which omits the
session id and can capture the wrong hostRuntime; change the call to use the
session-scoped runtime config (e.g.
this.services.stateManager.getRuntimeConfig(this.id)) and pass its hostRuntime
into the SessionEventBus constructor so emitted events carry the correct session
correlation IDs; update the instantiation of SessionEventBus accordingly in the
chat session constructor where this.eventBus is set.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 03275ae6-c88f-46da-b716-9af8f387752f
📒 Files selected for processing (13)
.changeset/host-runtime-ids-through-core.mdpackages/agent-config/src/resolver/to-dexto-agent-options.test.tspackages/agent-config/src/resolver/to-dexto-agent-options.tspackages/agent-management/src/AgentFactory.tspackages/agent-management/src/agent-creation.tspackages/cli/src/cli/modes/cli.test.tspackages/cli/src/cli/utils/config-validation.test.tspackages/core/src/agent/DextoAgent.lifecycle.test.tspackages/core/src/agent/DextoAgent.tspackages/core/src/session/chat-session.tspackages/core/src/session/session-manager.test.tspackages/core/src/session/session-manager.tspackages/server/src/hono/__tests__/test-fixtures.ts
✅ Files skipped from review due to trivial changes (4)
- .changeset/host-runtime-ids-through-core.md
- packages/core/src/agent/DextoAgent.lifecycle.test.ts
- packages/agent-config/src/resolver/to-dexto-agent-options.ts
- packages/cli/src/cli/modes/cli.test.ts
🚧 Files skipped from review as they are similar to previous changes (7)
- packages/cli/src/cli/utils/config-validation.test.ts
- packages/agent-config/src/resolver/to-dexto-agent-options.test.ts
- packages/agent-management/src/AgentFactory.ts
- packages/agent-management/src/agent-creation.ts
- packages/core/src/session/session-manager.test.ts
- packages/core/src/agent/DextoAgent.ts
- packages/core/src/session/session-manager.ts
Summary
hostRuntimeruntime surface for host-owned IDs and normalize/validate it in one placeWhy
Host-owned runtime IDs were not represented consistently across core runtime flows. That made it hard for hosts to attach their own runtime identifiers and have those IDs survive through events, telemetry, session logging, and related execution contexts.
Impact
Core consumers can now pass host-owned runtime IDs once and receive them back consistently in runtime-adjacent surfaces. Telemetry baggage/span attributes and emitted runtime events now carry the same normalized host runtime identifiers.
Root Cause
Core runtime flows did not have a single typed surface for host-provided runtime IDs, so propagation behavior had to be inferred or reimplemented at individual call sites.
Validation
bash scripts/quality-checks.sh build allbash scripts/quality-checks.sh openapi-docs allbash scripts/quality-checks.sh test allbash scripts/quality-checks.sh lint allbash scripts/quality-checks.sh typecheck allbash scripts/quality-checks.sh hono-inference allCloses #735.
Summary by CodeRabbit
Release Notes