diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json
index 1ddcee04..2bea69d8 100644
--- a/.claude-plugin/plugin.json
+++ b/.claude-plugin/plugin.json
@@ -1,6 +1,6 @@
{
"name": "aimock",
- "version": "1.13.0",
+ "version": "1.16.0",
"description": "Fixture authoring guidance for @copilotkit/aimock — LLM, multimedia, MCP, A2A, AG-UI, vector, and service mocking",
"author": {
"name": "CopilotKit"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e5f051d1..c5acbabf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# @copilotkit/aimock
+## 1.16.0
+
+### Added
+
+- **`turnIndex` match criterion**: Stateless conversation-depth matching — counts `role: "assistant"` messages in the request's message array. Use for multi-turn conversation flows in shared/deployed instances where `sequenceIndex` counters break under concurrency. `turnIndex: 0` matches the first turn (no prior assistant messages), `turnIndex: 1` the second, etc.
+- **`hasToolResult` match criterion**: Stateless boolean — `true` when any `role: "tool"` message exists in the request, `false` when none do. Simplest option for 2-step HITL flows (tool call → tool result → follow-up).
+- `onTurn(turn, pattern, response, opts)` convenience method on the programmatic API.
+
## 1.15.1
### Fixed
diff --git a/README.md b/README.md
index f85b19d1..561d185f 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@ Run them all on one port with `npx @copilotkit/aimock --config aimock.json`, or
## Features
- **[Record & Replay](https://aimock.copilotkit.dev/record-replay)** — Proxy real APIs, save as fixtures, replay deterministically forever
-- **[Multi-turn Conversations](https://aimock.copilotkit.dev/multi-turn)** — Record and replay multi-turn traces with tool rounds; match distinct turns via `toolCallId`, `sequenceIndex`, or custom predicates
+- **[Multi-turn Conversations](https://aimock.copilotkit.dev/multi-turn)** — Record and replay multi-turn traces with tool rounds; match distinct turns via `turnIndex`, `hasToolResult`, `toolCallId`, `sequenceIndex`, or custom predicates
- **[11 LLM Providers](https://aimock.copilotkit.dev/docs)** — OpenAI Chat, OpenAI Responses, OpenAI Realtime, Claude, Gemini, Gemini Live, Azure, Bedrock, Vertex AI, Ollama, Cohere — full streaming support
- **Multimedia APIs** — [image generation](https://aimock.copilotkit.dev/images) (DALL-E, Imagen), [text-to-speech](https://aimock.copilotkit.dev/speech), [audio transcription](https://aimock.copilotkit.dev/transcription), [video generation](https://aimock.copilotkit.dev/video)
- **[MCP](https://aimock.copilotkit.dev/mcp-mock) / [A2A](https://aimock.copilotkit.dev/a2a-mock) / [AG-UI](https://aimock.copilotkit.dev/agui-mock) / [Vector](https://aimock.copilotkit.dev/vector-mock)** — Mock every protocol your AI agents use
diff --git a/docs/index.html b/docs/index.html
index 2e32da81..3763d7a9 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1069,6 +1069,66 @@
text-decoration: none;
}
+ /* --- Cross-Nav Footer -------------------------------------------- */
+ .cross-nav-footer {
+ padding: 2rem 0;
+ border-top: 1px solid var(--border);
+ }
+ .cross-nav-toolbar {
+ max-width: 1120px;
+ margin: 0 auto;
+ padding: 0 2rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+ }
+ .cn-label {
+ font-family: "JetBrains Mono", "SF Mono", "Fira Code", monospace;
+ font-size: 0.8rem;
+ color: var(--text-dim);
+ margin-right: 0.25rem;
+ white-space: nowrap;
+ }
+ .cn-pill {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.4rem;
+ padding: 0.35rem 0.85rem;
+ border: 1px solid var(--border);
+ border-radius: 100px;
+ font-family: "JetBrains Mono", "SF Mono", "Fira Code", monospace;
+ font-size: 0.75rem;
+ font-weight: 500;
+ color: var(--text-secondary);
+ text-decoration: none;
+ transition:
+ border-color 0.2s,
+ background 0.2s,
+ color 0.2s;
+ white-space: nowrap;
+ }
+ .cn-pill:hover {
+ border-color: #3a3a50;
+ color: var(--text-primary);
+ text-decoration: none;
+ background: rgba(255, 255, 255, 0.03);
+ }
+ .cn-pill.active {
+ border-color: var(--accent);
+ background: var(--accent-glow);
+ color: var(--text-primary);
+ cursor: default;
+ pointer-events: none;
+ }
+ .cn-dot {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ flex-shrink: 0;
+ }
+
/* ─── Mobile ──────────────────────────────────────────────────── */
@media (max-width: 768px) {
.nav-links {
@@ -1111,6 +1171,16 @@
}
}
+ @media (max-width: 640px) {
+ .cross-nav-toolbar {
+ gap: 0.4rem;
+ }
+ .cn-pill {
+ font-size: 0.7rem;
+ padding: 0.3rem 0.7rem;
+ }
+ }
+
@media (max-width: 480px) {
.hero {
padding: 8rem 0 4rem;
@@ -1121,6 +1191,9 @@
.nav-brand .powered-by {
display: none;
}
+ .cn-label {
+ display: none;
+ }
}
@@ -1922,6 +1995,28 @@