From a2bbce495dd455d45e7b20cba2e5b4111e2894ef Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 08:38:44 -0700 Subject: [PATCH 1/2] =?UTF-8?q?fix(chat,e2e):=20rename=20ChatSidenavScrim.?= =?UTF-8?q?close=20=E2=86=92=20closed=20+=20delete=20legacy=20subagents=20?= =?UTF-8?q?spec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two cleanups bundled: 1. Rename ChatSidenavScrimComponent's `close` output to `closed` (and update the demo-shell consumer + spec + JSDoc + generated api docs). `close` collides with the native DOM event and triggers @angular-eslint/no-output-native, which has been failing the Library — lint / test / build gate on every PR for the last week. Past-tense is idiomatic for Angular outputs (closed, opened, selected, submitted). 2. Delete cockpit/chat/subagents/angular/e2e/subagents.spec.ts (legacy orphan from pre-aimock era). It hardcoded http://localhost:4505 bypassing Playwright's baseURL, tested stale DOM structure (Orchestrator/Research Agent/Analysis Agent/Summary Agent — old cap shape), and ran silently alongside c-subagents.spec.ts because testMatch: '**/*.spec.ts' picks both up. The aimock-backed c-subagents.spec.ts is the canonical coverage. Bumps @ngaf/chat 0.0.44 → 0.0.45 (per the lib's patch-only release convention). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../content/docs/chat/api/api-docs.json | 84 +++++++++---------- .../subagents/angular/e2e/subagents.spec.ts | 21 ----- .../src/app/shell/demo-shell.component.html | 2 +- libs/chat/package.json | 2 +- .../chat-sidenav-scrim.component.spec.ts | 4 +- .../chat-sidenav-scrim.component.ts | 8 +- 6 files changed, 51 insertions(+), 70 deletions(-) delete mode 100644 cockpit/chat/subagents/angular/e2e/subagents.spec.ts diff --git a/apps/website/content/docs/chat/api/api-docs.json b/apps/website/content/docs/chat/api/api-docs.json index 1b0201a4..9d91538c 100644 --- a/apps/website/content/docs/chat/api/api-docs.json +++ b/apps/website/content/docs/chat/api/api-docs.json @@ -356,13 +356,13 @@ { "name": "enableDate", "type": "InputSignal", - "description": "v1 prop: enableDate — include date portion.", + "description": "v1 prop: enableDate \u2014 include date portion.", "optional": false }, { "name": "enableTime", "type": "InputSignal", - "description": "v1 prop: enableTime — include time portion.", + "description": "v1 prop: enableTime \u2014 include time portion.", "optional": false }, { @@ -458,7 +458,7 @@ { "name": "orientation", "type": "Signal<\"horizontal\" | \"vertical\">", - "description": "Effective axis — `axis` wins if provided, otherwise fall back to `direction`.", + "description": "Effective axis \u2014 `axis` wins if provided, otherwise fall back to `direction`.", "optional": false }, { @@ -809,7 +809,7 @@ { "name": "maxAllowedSelections", "type": "InputSignal", - "description": "When ≤ 1 — render as single-select ; otherwise multi-select checkboxes.", "optional": false }, { @@ -1115,13 +1115,13 @@ { "name": "rootIds", "type": "Signal", - "description": "Roots from the surface state — components whose ids appear as\nchildren of no other component. The wire spec includes\n`beginRendering.root` as the single root; that path stays usable\nbut we keep the renderer permissive in case future surfaces emit\nmultiple top-level components.\n\nConservative: returns only the first key from componentViews\ninsertion order. The wire format's beginRendering.root carries the\ntrue root id; plumbing it through A2uiSurfaceState is a follow-up.", + "description": "Roots from the surface state \u2014 components whose ids appear as\nchildren of no other component. The wire spec includes\n`beginRendering.root` as the single root; that path stays usable\nbut we keep the renderer permissive in case future surfaces emit\nmultiple top-level components.\n\nConservative: returns only the first key from componentViews\ninsertion order. The wire format's beginRendering.root carries the\ntrue root id; plumbing it through A2uiSurfaceState is a follow-up.", "optional": false }, { "name": "spec", "type": "Signal", - "description": "Convert the A2UI surface to a json-render Spec for rendering.\n Prefers `state().surface` (the progressively-built wire surface)\n over the legacy `surface` input. surfaceToSpec handles\n children.explicitList → spec.children translation + reserved-key\n filtering + path-ref → $bindState rewriting; the rendered tree\n then uses render-element's standard input-mapping\n (`childKeys: el.children`) so catalog components receive the\n inputs they actually declare.\n\n This supersedes the earlier slot-based progressive renderer,\n which mounted root components but never populated their\n childKeys input — leaving Columns/Rows/etc. with no children.", + "description": "Convert the A2UI surface to a json-render Spec for rendering.\n Prefers `state().surface` (the progressively-built wire surface)\n over the legacy `surface` input. surfaceToSpec handles\n children.explicitList \u2192 spec.children translation + reserved-key\n filtering + path-ref \u2192 $bindState rewriting; the rendered tree\n then uses render-element's standard input-mapping\n (`childKeys: el.children`) so catalog components receive the\n inputs they actually declare.\n\n This supersedes the earlier slot-based progressive renderer,\n which mounted root components but never populated their\n childKeys input \u2014 leaving Columns/Rows/etc. with no children.", "optional": false }, { @@ -1133,7 +1133,7 @@ { "name": "surface", "type": "InputSignal", - "description": "Wire-format surface (legacy path — kept for backwards compat).", + "description": "Wire-format surface (legacy path \u2014 kept for backwards compat).", "optional": false }, { @@ -1187,7 +1187,7 @@ { "name": "childKeys", "type": "InputSignal", - "description": "v1: each child key corresponds to a tab's contentChild (childKeys[i] ↔ tabTitles[i]).", + "description": "v1: each child key corresponds to a tab's contentChild (childKeys[i] \u2194 tabTitles[i]).", "optional": false }, { @@ -1211,7 +1211,7 @@ { "name": "tabTitles", "type": "InputSignal", - "description": "Resolved tab titles from tabItems[*].title — produced by surface-to-spec.", + "description": "Resolved tab titles from tabItems[*].title \u2014 produced by surface-to-spec.", "optional": false } ], @@ -1378,7 +1378,7 @@ { "name": "value", "type": "Signal", - "description": "Back-compat alias: value. surface-to-spec resolves DynamicString → plain string.", + "description": "Back-compat alias: value. surface-to-spec resolves DynamicString \u2192 plain string.", "optional": false } ], @@ -1504,7 +1504,7 @@ { "name": "citations", "type": "Signal", - "description": "Combined citation list:\n 1. Message.citations (provider-populated, takes precedence by id)\n 2. Markdown sidecar defs (Pandoc-formatted [^id]: lines), merged in\n for any id not already present.\n\nSorted by index ascending. This guarantees the sources panel surfaces\ncitations whether they come from message metadata, content syntax, or\nboth — matching the same precedence as inline-marker resolution.", + "description": "Combined citation list:\n 1. Message.citations (provider-populated, takes precedence by id)\n 2. Markdown sidecar defs (Pandoc-formatted [^id]: lines), merged in\n for any id not already present.\n\nSorted by index ascending. This guarantees the sources panel surfaces\ncitations whether they come from message metadata, content syntax, or\nboth \u2014 matching the same precedence as inline-marker resolution.", "optional": false }, { @@ -1709,7 +1709,7 @@ { "name": "humanContent", "signature": "humanContent(message: unknown)", - "description": "Renderable content for a human-role message bubble. Most human\nmessages are typed prompts and pass through `messageContent`\nunchanged. A2UI action messages (e.g. form submits, button clicks\non a rendered surface) flow through the same submit channel and\nland in the message stream as a HumanMessage whose content is a\nJSON-serialized `A2uiActionMessage`. Showing the raw JSON as if\nthe user typed it leaks the protocol; per the A2UI v0.9 spec\nthose events resemble tool calls more than user utterances.\n\n`a2uiActionLabel` returns a short human-readable label for\nrecognized action shapes (\"Search flights\", \"Selected flight UA123\",\netc.) — or null for any non-action content, in which case we fall\nback to the original text.", + "description": "Renderable content for a human-role message bubble. Most human\nmessages are typed prompts and pass through `messageContent`\nunchanged. A2UI action messages (e.g. form submits, button clicks\non a rendered surface) flow through the same submit channel and\nland in the message stream as a HumanMessage whose content is a\nJSON-serialized `A2uiActionMessage`. Showing the raw JSON as if\nthe user typed it leaks the protocol; per the A2UI v0.9 spec\nthose events resemble tool calls more than user utterances.\n\n`a2uiActionLabel` returns a short human-readable label for\nrecognized action shapes (\"Search flights\", \"Selected flight UA123\",\netc.) \u2014 or null for any non-action content, in which case we fall\nback to the original text.", "params": [ { "name": "message", @@ -1722,7 +1722,7 @@ { "name": "isGenuiTurn", "signature": "isGenuiTurn(message: unknown, _prevMsg: unknown, index: number)", - "description": "True when this assistant message is part of a GenUI render turn.\nWalks backward through messages from `index` until it finds either\nan assistant message with `tool_calls` referencing a GenUI tool\n(→ this turn produces a surface) or a human message (→ the\npreceding turn ended; this assistant message stands on its own).\n\nAlso checks the message itself for:\n - `extra.tool_calls[].name` matching a GenUI tool (post-streaming\n state of the tool-call AI message), OR\n - `extra.content[].type === 'function_call' && .name` matching\n (live during the OpenAI Responses-API streaming chunks before\n `tool_calls` populates).\n\nThe walk-back approach is robust to LangGraph's in-place\nreplacement of the ToolMessage (which strips the `name` field),\nunlike a single prev-message check.", + "description": "True when this assistant message is part of a GenUI render turn.\nWalks backward through messages from `index` until it finds either\nan assistant message with `tool_calls` referencing a GenUI tool\n(\u2192 this turn produces a surface) or a human message (\u2192 the\npreceding turn ended; this assistant message stands on its own).\n\nAlso checks the message itself for:\n - `extra.tool_calls[].name` matching a GenUI tool (post-streaming\n state of the tool-call AI message), OR\n - `extra.content[].type === 'function_call' && .name` matching\n (live during the OpenAI Responses-API streaming chunks before\n `tool_calls` populates).\n\nThe walk-back approach is robust to LangGraph's in-place\nreplacement of the ToolMessage (which strips the `name` field),\nunlike a single prev-message check.", "params": [ { "name": "message", @@ -1747,7 +1747,7 @@ { "name": "isReasoningStreaming", "signature": "isReasoningStreaming(message: Message, index: number)", - "description": "True while a message's reasoning is mid-stream — i.e. it's the latest\nmessage, the agent is loading, the message has reasoning content, and\nno response text has arrived yet. Once the response text begins, the\nreasoning pill collapses (per its internal logic).", + "description": "True while a message's reasoning is mid-stream \u2014 i.e. it's the latest\nmessage, the agent is loading, the message has reasoning content, and\nno response text has arrived yet. Once the response text begins, the\nreasoning pill collapses (per its internal logic).", "params": [ { "name": "message", @@ -2414,7 +2414,7 @@ { "name": "clicked", "type": "OutputEmitterRef", - "description": "Fires when the inner