Commit Graph

12110 Commits

Author SHA1 Message Date
Jordan Ritter b43d64ea49 fix(showcase): tolerate per-service "ServiceInstance not found" in promote snapshot
build_snapshot enumerates every project service and queries each one's
serviceInstance. The only guard was `next if inst.nil?` — it handled a
NULL result but not a THROWN `GraphQL: ServiceInstance not found` error
(a half-deleted service that still appears in the project service list
but has no instance in the env). That error bubbled to Railway.run's
top-level `rescue GraphQL::Error` and aborted the ENTIRE promote with an
opaque exit 2 before any preflight/divergence logic ran (run 27144525566
killed the docs promote this way).

Scope the rescue narrowly to ONLY the per-service "ServiceInstance not
found" message — log+skip that one service exactly like the nil case —
so every other GraphQL failure (auth, rate-limit, schema drift) still
propagates fail-loud. Adds red-green coverage: a single thrown not-found
is skipped (healthy services still snapshot), while an unrelated GraphQL
error still raises.
2026-06-08 10:45:07 -07:00
Ran Shemtov 237671aaaa fix(showcase): render AgentCore deploy pages with framework-scoped tabs (#5319) 2026-06-08 19:04:29 +02:00
Ran Shemtov 523396de96 Merge branch 'main' into chore/fix-agentcore-docs 2026-06-08 18:58:14 +02:00
Ran Shem Tov c0ea5078f9 fix(showcase): render AgentCore deploy partial with framework-scoped command tabs
The /strands/deploy-agentcore and /langgraph/deploy-agentcore pages
rendered only their title — the body was empty. <Content> resolved to a
dead stub in the MDX component registry that rendered nothing, despite
the content being authored in the shared agentcore partial.

- mdx-registry.tsx: replace the dead Content stub with a dedicated
  component that renders the agentcore partial via PartialLoader and
  threads the page's framework into MDX scope.
- mdx-registry-loader.tsx: PartialLoader accepts an optional scope,
  forwarded to MDXRemote options.scope so partials can read bare scope
  identifiers (next-mdx-remote binds scope as module identifiers, not as
  the rendered component's props).
- agentcore/index.mdx: reference {framework} (bare scope var) instead of
  props.framework so AgentCoreCommandTabs collapses to the single
  relevant framework per page.
2026-06-08 17:18:44 +02:00
Ran Shemtov 37cdfe05ba feat: update all dependencies to use latest a2ui implementation features (#5314)
Upgrade of dependencies so the latest changes (mainly a2ui stuff) from
ag-ui are reflected here
2026-06-08 15:46:15 +02:00
Lukas Moschitz a22796a822 fix(react-core): render intelligence-indicator icon cross-browser
The icon geometry was defined via the Chrome-only CSS `d:` property, so
the spinner/checkmark rendered blank in Safari and Firefox. Move the
geometry into each path's `d` attribute and split the single morphing
path into two overlaid paths — a spinning arc that fades out and a
checkmark that draws itself in (stroke-dashoffset) upright.

Spin the arc with `transform-box: fill-box; transform-origin: center` so
it stays centered in WebKit (view-box is mis-resolved there; a SMIL
animateTransform stalls on first paint in Chrome). Both paths use
`pathLength="1"` so dashes read as fractions, and all motion is gated
behind `prefers-reduced-motion`.
2026-06-08 14:54:42 +02:00
Ran Shem Tov 5b821a44dc chore: fix showcase agentcore link per framework 2026-06-08 12:50:46 +02:00
Ran Shem Tov c85c140f05 feat: update all dependencies to use latest a2ui implementation features 2026-06-08 12:09:20 +02:00
Jordan Ritter 9111a1f2ac fix(showcase): flap-band — cold-start retry + honest fleet/dashboard surface-state (#5313)
## Summary

- **Cold-start retry before fast-fail (#71), gated to plain-fill turns**
— `conversation-runner` now performs a bounded turn-1 `page.reload()`
retry when an error banner appears on a cold start, recovering transient
boot flaps. The retry shares the single turn deadline (no ~2× budget
blowup, FF20) and is gated to plain-fill turns so it never masks a real
failure: a banner that survives the reload still fast-fails.
- **Fleet teardown surface-state honesty** — adds a
`worker-reclaimed-pending` comm-error kind, a control-plane SIGTERM
drain path that distinguishes graceful teardown from a crash (#70), and
pre-dispatch warm-up health pings (#72). Graceful Railway teardown is
now reported as pending, not as a red.
- **Dashboard pending-surface never masks a real red** — `cell-model`
decodes comm-errors severity-first, guards against stale `observedAt`,
and renders a dedicated pending chip. A pending surface can never
override a genuine red, while transient teardown noise resolves to
pending instead of flapping.

**Dashboard-green impact:** kills false flaps on Railway teardown
WITHOUT masking real reds, and bounds the cold-start retry so a
genuinely-broken cold start still surfaces.

## Test plan

- [x] harness `tsc --noEmit` (clean)
- [x] harness vitest — conversation-runner (46), fleet contracts +
control-plane/job-producer + queue-client (123 tests across 4 touched
suites, all passing)
- [x] shell-dashboard `tsc --noEmit` (clean)
- [x] shell-dashboard vitest — cell-model + depth-chip (148 tests, all
passing)
- [x] oxfmt `--check` clean on all changed files

## Known follow-ups

All pre-existing, tracked for a separate PR (not introduced by this
change):

- `priority` / `leaseSeconds` dead knobs in the fleet contracts
- `modelsEqual` does not compare `jobId`
- `DepthChip` switch is not exhaustiveness-checked
- unknown-state should map to a gray cell in `cell-model`
- `createRailwayAdapter` stale JSDoc
- no-reload-retry test-fake edge case

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-07 22:47:09 -07:00
Jordan Ritter 042e79e259 fix(showcase): dashboard pending-surface never masks a real red — severity-first comm-error decode, stale-observedAt guard, pending chip 2026-06-07 22:40:13 -07:00
Jordan Ritter d814fb816a fix(showcase): fleet teardown surface-state — worker-reclaimed-pending kind, control-plane SIGTERM drain, warm-up health pings 2026-06-07 22:40:13 -07:00
Jordan Ritter d0f2582842 fix(showcase): cold-start retry before fast-fail (#71), gated to plain-fill turns 2026-06-07 22:40:12 -07:00
Jordan Ritter 8f6f1b8f42 fix(showcase): backend-backlog — agno/forwarding/dotnet/spring-ai/mastra/built-in-agent (#5312)
## Summary

Backend-backlog integration branch consolidating dashboard-green fixes
across six showcase integration areas. Recommitted by area of concern (6
logical commits) for review.

- **agno** — Pairs HITL tool messages (orphan tool-results dropped,
paired retained, falsy-id messages preserved); surfaces reasoning
`RUN_ERROR` and forwards `TOOL_CALL_RESULT`; wires the reasoning route
via `attach_reasoning_route`; pins the asyncio event loop in
`entrypoint.sh` so the executor-ctxvar header-forwarding shim is
effective under uvloop (previously header forwarding silently no-op'd on
the uvloop policy). Repositions the 13 `@ts-expect-error` annotations
onto the erroring agent-entry lines in the route handlers. **This is the
core of the dashboard-green impact** — reasoning demos now emit
correctly and forwarded headers reach the secondary OpenAI call.
- **header-forwarding shims** — Hardens the `_header_forwarding.py` shim
across all 10 python integrations (agno, ag2, claude-sdk-python,
crewai-crews, google-adk, langroid, llamaindex, ms-agent-python,
pydantic-ai, strands): fails loud on hook-install failure (logged at
ERROR not INFO) instead of silently degrading, and uses greppable
async-client detection with a low-confidence name-match fallback
breadcrumb.
- **ms-agent-dotnet** — `A2uiSecondaryToolCaller` fails loud on a
missing API key, corrects error misclassification (proper error
mapping), and guards malformed secondary-tool responses.
- **spring-ai** — Hardens the controller error-path lifecycle across 8
controllers + `PropagatingLocalAgent`: emits `RUN_STARTED` before
`RUN_ERROR` (correct ordering) and finalizes the run on the error path.
- **mastra** — gen-a2ui tool now throws instead of silently returning,
adds a role normalizer, bumps cmdk; corrects probe-doc YAML comments (3
probe configs); enforces baseline tag invariants in the shell-dashboard
`validateCell` path.
- **built-in-agent** — Pins `@copilotkit/runtime` to `1.59.4` and drops
floating tanstack pins; removes the now-obsolete SSOT override from
`showcase-canonical-pins.json`.

## Test plan

- [x] agno typecheck (`tsc --noEmit`) — clean
- [x] agno pytest (3 backend test files, agno 2.6.12 venv) — 17/17
passed
- [x] shell-dashboard vitest (`baseline-types`) — 27/27 passed
- [x] mastra `next build` — success
- [x] built-in-agent `next build` — success
- [x] validate-pins ratchet — FAIL=63 == baseline, hash matches
committed `fail-baseline.json`
- [ ] .NET `dotnet test` (ms-agent-dotnet) — run in CI
- [ ] spring-ai `mvn test` — run in CI

## Known follow-ups

Deferred pre-existing items, tracked for a separate PR (not in scope
here):
- agno error-handling hardening (broader RUN_ERROR coverage beyond
reasoning)
- StreamingToolAgent tool-id / streamed-args handling (spring-ai)
- mastra A2UI flat-shape normalization
- reasoning double-render
- a2ui docstring loop-pin wording clarification
- spring-ai bridge `RUN_STARTED` double-emit edge (proper guard
deferred; the double-emit revert is included here, the guard is not)

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-07 22:35:28 -07:00
github-actions[bot] c023a03fac style: auto-fix formatting 2026-06-08 05:23:16 +00:00
Jordan Ritter b284d89615 fix(built-in-agent): pin @copilotkit/runtime 1.59.4 + tanstack; remove obsolete SSOT override 2026-06-07 22:19:51 -07:00
Jordan Ritter fe3af73086 fix(mastra): gen-a2ui throw + role normalizer + cmdk bump; probe-YAML comment fixes; dashboard validateCell tag enforcement 2026-06-07 22:19:47 -07:00
Jordan Ritter 54e426c2dd fix(spring-ai): controller error-path lifecycle (RUN_STARTED ordering, finalize) 2026-06-07 22:19:41 -07:00
Jordan Ritter e89581d12c fix(ms-agent-dotnet): A2uiSecondaryToolCaller fail-loud + error mapping + guards 2026-06-07 22:19:30 -07:00
Jordan Ritter 154c1cfab1 fix(showcase): harden header-forwarding shims (fail-loud, async-detect) across python integrations 2026-06-07 22:19:26 -07:00
Jordan Ritter f0fe456a43 fix(agno): HITL tool-pairing, reasoning RUN_ERROR/TOOL_CALL_RESULT, reasoning route wiring, uvloop loop-pin for header forwarding 2026-06-07 22:19:19 -07:00
Jordan Ritter ebe80e257e fix(showcase): dashboard-green follow-ups (byoc race, D4 probe, declarative, beautiful-chart) (#5310)
## Summary
Follow-ups to #5309 that further lower the d5/d6 dashboard red floor:
- **byoc browser-pool race:** guard `newContext()` against a
disconnected shared browser (the d5 contention source).
- **D4 probe:** `networkidle`→`load` — networkidle never settles on
CopilotKit's persistent-SSE demo pages, so D4 timed out locally and
gated every cell red on the local rig; staging unaffected but the fix is
correct and unblocks local==staging visual testing.
- **strands + spring-ai declarative-hashbrown/json-render:** dedicated
backend agents/controllers + tuned prompts + regenerated d6 fixtures +
manifest coherence (json-render is a real byoc-feature-type cell, at
parity with strands).
- **beautiful-chart:** port the pie/bar/scheduler generative-UI
renderers to built-in-agent + claude-sdk-python (backends already emit
the tool-calls).
- **cleanup:** remove the temporary x-diag-probe instrumentation (keeps
the permanent CVDIAG + the #5309 forwarding fixes).

Showcase-only; no package releases.

## Test plan
- [ ] CI rebuilds :latest; redeploy
- [ ] PB re-pivot:
byoc/declarative-hashbrown/json-render/beautiful-chart-chart cells green
on the fixed backends
- [ ] d5 contention sawtooth reduced (byoc guard)

## Deferred (separate follow-ups)
- Flap-band: decouple PB sampling from live run / detector cold-start
retry / warm+pool (the ±70 churn band)
- #67 backlog: harness accounting (d6 hung-teardown, d4 body-fallback
false-green), forwarding-shim hardening, spring-ai controller error-path
lifecycle (class-wide), built-in-agent @copilotkit/runtime pin
2026-06-07 14:13:01 -07:00
Jordan Ritter 29fc959052 chore(showcase): ratchet pin-drift baseline for mastra ai v5 bump 2026-06-07 14:07:06 -07:00
Jordan Ritter ca2bc2c152 fix(showcase): specialize strands + spring-ai declarative-hashbrown/json-render backends (+ fixtures, manifests, controller guards) 2026-06-07 13:53:28 -07:00
Jordan Ritter 8d9dc82606 fix(showcase): render beautiful-chat chart/scheduler generative-UI on built-in-agent and claude-sdk-python 2026-06-07 13:53:19 -07:00
Jordan Ritter ffa51c7ee8 chore(showcase): remove the temporary x-diag-probe instrumentation 2026-06-07 13:53:07 -07:00
Jordan Ritter 6b924a7a44 fix(showcase): use waitUntil:load for the D4 chat-roundtrip probe (networkidle never settles on persistent-SSE pages) 2026-06-07 13:53:07 -07:00
Jordan Ritter ebd5f53549 fix(showcase): guard browser-pool context acquisition against a disconnected shared browser (byoc) 2026-06-07 13:52:57 -07:00
Jordan Ritter 362b8c5793 fix(showcase): green the d5/d6 dashboard — forwarding, routes, LFS, harness (#5309)
## Summary
Greens the staging d5/d6 showcase dashboard, which was red across ~450
cells. Root causes were a small set of genuine code/CI bugs (not a
single regression — the 06-01/06-06 flap edges were a harness
error-banner detector turning on + D5 starting to run the already-broken
D6 pill set):

- **ASSET-404 (multimodal):** CI checked out Git LFS files as pointer
stubs (`lfs:false` + no `git lfs pull`), so images served 130-byte
pointers instead of real assets. Now pulls LFS during build.
- **ROUTE-404 (beautiful-chat / declarative-hashbrown /
declarative-json-render):** 5 backends shipped the demo pages but no
per-pill API route → 404. Routes added (mirrored from same-language
siblings; injectA2UITool set per whether the backend already owns the
tool).
- **Gen-UI header forwarding:** the secondary `generate_a2ui` LLM call
dropped `x-aimock-context` — in Python because it runs in a thread-pool
executor that doesn't propagate the ContextVar (ported ag2's
`install_executor_contextvar_propagation` to
agno/ms-agent-python/pydantic-ai/strands), and in .NET because the AG-UI
SSE pump runs on a non-inheriting ExecutionContext (moved AsyncLocal →
HttpContext.Items, removed a racing finally-wipe). pydantic-ai
additionally sent a system-only prompt (StateDeps.copilotkit was always
None → now reads the real conversation). mastra's gen-a2ui threw
AI_UnsupportedModelVersionError (ai v4 vs @ai-sdk/openai v2 → bumped ai
to v5).
- **Harness measurement:** the fleet worker ignored the YAML
`timeout_ms` (used a hardcoded 10-min default → slow backends
false-aborted); now conveyed. Stopped rendering
`ms-agent-harness-dotnet`, which was flipped deployed:true but excluded
from all probes → perpetual stale red.

Showcase-only; no package releases.

## Test plan
- [ ] CI rebuilds `:latest` images with LFS assets; staging redeploys
- [ ] PB re-pivot: multimodal / beautiful-chat / declarative-* / gen-ui
cells green across backends
- [ ] aimock journal: secondary gen-ui calls carry `x-aimock-context`
(no ctx-absent 503s on real-pill traffic)
- [ ] ms-agent-dotnet d5 no longer abort-cascades

## Deferred to follow-ups (out of this PR's subject)
- strands + spring-ai declarative-hashbrown/json-render need backend
prompt specialization (separate PR)
- pre-existing bucket-(c)/(d): diag-hop labeling (reverts with the
temporary x-diag-probe), harness deploy-churn/total-invariant
accounting, .NET secondary-caller error-mapping, forwarding-shim
hardening, baseline-only stale-render partners
2026-06-07 10:33:09 -07:00
github-actions[bot] b4b5f10d55 style: auto-fix formatting 2026-06-07 17:04:33 +00:00
Jordan Ritter f0edcd5d94 fix(showcase): convey timeout_ms to fleet worker and stop rendering unprobed ms-agent-harness-dotnet 2026-06-07 10:00:47 -07:00
Jordan Ritter 94f564a0f8 fix(showcase): align mastra to ai SDK v5 for the gen-a2ui secondary call 2026-06-07 10:00:40 -07:00
Jordan Ritter 6e34ea836e fix(showcase): pydantic-ai gen-ui forwards the real conversation to its secondary call 2026-06-07 10:00:40 -07:00
Jordan Ritter 4920128332 fix(showcase): forward x-aimock-context across the AG-UI SSE-pump boundary in ms-agent-dotnet 2026-06-07 10:00:35 -07:00
Jordan Ritter e1cf704e13 fix(showcase): propagate x-aimock-context to off-thread gen-ui secondary call across Python backends 2026-06-07 10:00:29 -07:00
Jordan Ritter 46e66d8d4b fix(showcase): add missing per-pill copilotkit routes for agno/langroid/llamaindex/spring-ai/strands 2026-06-07 10:00:24 -07:00
Jordan Ritter 7bde1eef3a ci(showcase): pull Git LFS assets during build so demo images ship real binaries 2026-06-07 10:00:16 -07:00
Jordan Ritter 79d61b68ee docs(shell-docs): add shared-state/prebuilt guides, sidebar wiring, css, model-selection, whats-new 2026-06-06 16:10:13 -07:00
Jordan Ritter aade9d0e86 docs(shell-docs): add troubleshooting, migration, and concepts guides 2026-06-06 16:10:09 -07:00
Jordan Ritter 1c33e99f49 docs(shell-docs): add reference hook pages and retire orphaned v2 useAgent 2026-06-06 16:10:04 -07:00
Jordan Ritter e529593650 docs(shell-docs): add MS Agent Framework + Mastra integration samples 2026-06-06 16:10:00 -07:00
Jordan Ritter 58887baeda docs(shell-docs): add backend runtime/runner/self-managed docs 2026-06-06 16:09:56 -07:00
Jordan Ritter 19f8ef89c8 fix(react-core): correct useCoAgent JSDoc link and stale run description 2026-06-06 16:09:52 -07:00
Jordan Ritter 6f360b9f66 diag(showcase): ungated x-diag-probe (thread+ctx) to localize native-tool context loss (#5305)
TEMPORARY DIAGNOSTIC (to be reverted after reading). Adds one ungated
header `x-diag-probe: thread=<name>;ctx=<present|EMPTY>;keys=<n>` on
every outbound LLM call (before the context gate) across the 7 backends
whose native tool calls drop x-aimock-context. The aimock journal
(HTTP-readable) will then show, per dropping call, which thread it ran
on and whether the forwarded-headers contextvar was empty — pinning the
context-losing run-path. Additive, try/except-wrapped (never throws), no
change to existing forwarding/injection/gating. py_compile clean.
2026-06-06 12:35:58 -07:00
github-actions[bot] c73afd1e3d style: auto-fix formatting 2026-06-06 19:26:25 +00:00
Jordan Ritter 469d79b029 diag(showcase): ungated x-diag-probe (thread+ctx) on outbound LLM calls to localize native-tool context loss 2026-06-06 12:24:44 -07:00
Jordan Ritter ffb8af32b0 fix(showcase): restore sandboxed-UI jsFunctions in D6 gen-ui-open-advanced fixtures (#5294)
## Summary

The `generateSandboxedUi` calculator (and the ping-host /
inline-evaluator pills) rendered static HTML with no interactivity — the
`=` and keypad buttons were no-ops — because the affected
per-integration fixtures omitted the `jsFunctions` key that the
`OpenGenerativeUIRenderer` injects into the iframe to wire click
handlers to the host bridge
(`Websandbox.connection.remote.evaluateExpression` / `notifyHost`).

This copies the `jsFunctions` VERBATIM from the canonical
langgraph-typescript fixture (apples-to-apples) into agno, crewai-crews,
langgraph-fastapi, and mastra, and creates the missing langgraph-python
advanced fixture (Calculator + Ping pills; the inline evaluator already
lives in `gen-ui-open.json`). Fixture-only change; the renderer is
correct.

## Verification

Proven in a prior session against the D6 path.
2026-06-06 12:09:42 -07:00
Jordan Ritter 23b6fef129 fix(showcase): gate LGP AAPL tool-rendering fixture on toolName not hasToolResult (#5292)
## Summary

The D6 cell `tool-rendering-custom-catchall` for langgraph-python
deterministically timed out (30s no-response). The probe sends two turns
in one thread: turn 1 "weather in Tokyo" -> `get_weather`, turn 2
"What's the price of AAPL?" -> `get_stock_price`. The AAPL first-leg
fixture was gated on `hasToolResult:false`, but aimock implements that
gate as `messages.some(m => m.role === "tool")` — i.e. ANY tool message
anywhere in the thread. Turn 1's `get_weather` leaves a tool result, so
on turn 2 `hasToolResult` is permanently true and the false gate can
never match -> `no_fixture_match` -> 503 -> 30s timeout.

This replaces the broken `hasToolResult:false` gate with
`toolName:"get_stock_price"` (the same pattern the sibling weather/chain
first-leg fixtures already use). A `toolName` gate fires whenever the
tool is registered, regardless of prior tool results; the `toolCallId`
follow-up fixture still wins on iteration 2.

Fixture-only change.

## Verification

Proven in a prior session via the D6 Docker path:
`tool-rendering-custom-catchall` now green (turn 1 `get_weather` + turn
2 `get_stock_price` both render, no 503/timeout);
`tool-rendering-default-catchall` still green (no regression).
2026-06-06 12:09:38 -07:00
Jordan Ritter 1b50eacc98 feat(showcase): CVDIAG diagnostic instrumentation for x-aimock-context / CV-rung propagation (#5304)
## Summary
Diagnostic instrumentation to localize **where `x-aimock-context` is
dropped on the CV/D5 rung** (sustained fleet-wide aimock 503
`no_fixture_match`). Adds a uniform, durable, HTTP-readable per-hop
trace. **Instrumentation-only** — on non-diagnostic traffic every
forwarder is byte-identical to before (verified across all 22 breadcrumb
sites).

- **Shared contract + sink:** single-line `CVDIAG` log format (12-char
redacted header prefix), `x-diag-run-id`/`x-diag-hops` correlation +
breadcrumb headers, and a best-effort PocketBase `diag_events`
collection (anonymously HTTP-readable, so it's queryable mid-incident
without Railway logs).
- **Harness:** mint a run_id per D5/D6 run, inject the correlation
headers alongside `x-aimock-context`, and a timeout-bounded post-run
aimock-journal join that records a `cv-verdict` row tagged
`harness-d5`/`harness-d6` (localizing whether the header reached
aimock). Plus claim/worker_id/snapshot/pool-condition breadcrumbs and
surfaced previously-swallowed catches.
- **Per-framework forwarders** (LangGraph py/ts/fastapi, google-adk,
self-contained Node + 9 Python shims, spring-ai Java, ms-agent .NET ×2):
CVDIAG at each hop + a `route-<fw>`/`backend-<fw>` `x-diag-hops`
breadcrumb, gated on diagnostic-header presence. Surfaces
previously-silent forwarding misses (empty LangGraph `configurable`,
missing httpx event-hooks target, swallowed hook-install errors).

## Why
CV/D5 has been red ~42h fleet-wide; the aimock journal shows ~95% of
503s arrive with **no** `x-aimock-context`. Forwarding is divergent per
framework (LangGraph `configurable` SPOF; `claude-sdk-python` middleware
not wired; google-adk async path uses aiohttp, bypassing the httpx
hook). This makes the drop point visible per hop and durable, so the fix
can be made once — and it preserves apples-to-apples by adding a
*uniform* trace layer rather than more bespoke per-framework code.

## Test plan
- [x] Harness typecheck green; 2105/2105 harness tests pass
- [x] 7-agent CR converged (2 fix rounds); instrumentation-only
invariant verified across every outbound forwarder
- [ ] CI green (integration builds incl. Java/.NET)
- [ ] Post-deploy: read `/__aimock/journal` + PB `diag_events` to
localize the drop hop per framework and settle the open D5-vs-D6
question with data

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-06 10:58:04 -07:00
github-actions[bot] 1e5a9b77cd style: auto-fix formatting 2026-06-06 17:44:07 +00:00
Jordan Ritter bd77954ab5 feat(showcase): instrument per-framework x-aimock-context forwarding with gated CVDIAG breadcrumb
Add CVDIAG logging + x-diag-hops breadcrumb (route-<fw>/backend-<fw>) at each forwarding hop across LangGraph (py/ts/fastapi), google-adk, the self-contained Node + Python shims, spring-ai (Java) and ms-agent (.NET). Breadcrumb append is gated on diagnostic-header presence so non-diagnostic traffic stays byte-identical; surfaces previously-silent forwarding misses (empty configurable, missing httpx event-hooks target, swallowed hook-install errors).
2026-06-06 10:40:25 -07:00