diff --git a/.claude/worktrees/blissful-bartik b/.claude/worktrees/blissful-bartik deleted file mode 160000 index 44e21de99..000000000 --- a/.claude/worktrees/blissful-bartik +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 44e21de992ad8c0b01a35d4d71cb41dfeb92cdb8 diff --git a/.claude/worktrees/optimistic-jang b/.claude/worktrees/optimistic-jang deleted file mode 160000 index 0a6d25bcb..000000000 --- a/.claude/worktrees/optimistic-jang +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0a6d25bcb8d03bd2afe4e5bdd50ee660e6ae4df9 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa1113a2e..f9bca386f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -104,18 +104,6 @@ jobs: - run: npm ci - run: npx tsx apps/cockpit/scripts/deploy-smoke.ts --url https://cockpit.cacheplane.ai --dry-run - mcp: - name: MCP — build / smoke - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6.0.2 - - uses: actions/setup-node@v6.3.0 - with: - node-version: 22 - cache: npm - - run: npm ci - - run: npx nx test mcp --skip-nx-cache - chat-agent-smoke: name: Chat Agent — smoke runs-on: ubuntu-latest @@ -162,7 +150,7 @@ jobs: deploy: name: Deploy → Vercel - needs: [library, website, cockpit, cockpit-examples-build, cockpit-smoke, cockpit-secret-integration, cockpit-deploy-smoke, mcp, chat-agent-smoke, cockpit-e2e, website-e2e] + needs: [library, website, cockpit, cockpit-examples-build, cockpit-smoke, cockpit-secret-integration, cockpit-deploy-smoke, chat-agent-smoke, cockpit-e2e, website-e2e] runs-on: ubuntu-latest # Only deploy on pushes to main, not on pull requests if: github.ref == 'refs/heads/main' && github.event_name == 'push' diff --git a/apps/website/content/docs/chat/a2ui/catalog.mdx b/apps/website/content/docs/chat/a2ui/catalog.mdx index 3a07571c2..b05cfb9d9 100644 --- a/apps/website/content/docs/chat/a2ui/catalog.mdx +++ b/apps/website/content/docs/chat/a2ui/catalog.mdx @@ -1,6 +1,6 @@ # Component Catalog -The built-in A2UI catalog provides 12 Angular components covering display, layout, and interactive controls. It is included automatically when using `ChatComponent`, and can be instantiated directly for custom rendering setups. +The built-in A2UI catalog provides 18 Angular components covering display, layout, interactive controls, media, and advanced inputs. Pass `a2uiBasicCatalog()` to the `ChatComponent` `views` input to enable A2UI rendering, or instantiate it directly for custom setups. **Import:** @@ -14,7 +14,7 @@ import { a2uiBasicCatalog } from '@cacheplane/chat'; function a2uiBasicCatalog(): ViewRegistry ``` -Returns a `ViewRegistry` mapping 12 A2UI type names to their Angular component implementations. Pass the result to `A2uiSurfaceComponent` or use it as a starting point for a custom registry. +Returns a `ViewRegistry` mapping 18 A2UI type names to their Angular component implementations. Pass the result to `A2uiSurfaceComponent` or use it as a starting point for a custom registry. ```typescript const catalog = a2uiBasicCatalog(); @@ -229,6 +229,177 @@ A dropdown select control with a list of string options. | `_bindings` | `Record` | Bind `selected` to a data model path | | `emit` | injected | Event emitter provided by the render engine | +### DateTimeInput + +A date, time, or datetime input with two-way binding. + +| A2UI type | Angular component | Selector | +|-----------|-------------------|----------| +| `DateTimeInput` | `A2uiDateTimeInputComponent` | `a2ui-date-time-input` | + +| Prop | Type | Description | +|------|------|-------------| +| `label` | `string` | Input label | +| `value` | `string` | Current value (bind via `_bindings`) | +| `inputType` | `'date' \| 'time' \| 'datetime-local'` | HTML input type. Defaults to `'date'` | +| `min` | `string` | Minimum allowed value | +| `max` | `string` | Maximum allowed value | +| `_bindings` | `Record` | Bind `value` to a data model path | +| `emit` | injected | Event emitter provided by the render engine | + +```json +{ + "id": "date-field", + "component": "DateTimeInput", + "label": "Appointment date", + "value": {"path": "/appointmentDate"}, + "inputType": "date", + "_bindings": {"value": "/appointmentDate"} +} +``` + +### Slider + +A range slider input with two-way binding. + +| A2UI type | Angular component | Selector | +|-----------|-------------------|----------| +| `Slider` | `A2uiSliderComponent` | `a2ui-slider` | + +| Prop | Type | Description | +|------|------|-------------| +| `label` | `string` | Slider label | +| `value` | `number` | Current value (bind via `_bindings`) | +| `min` | `number` | Minimum value | +| `max` | `number` | Maximum value | +| `step` | `number` | Step increment | +| `_bindings` | `Record` | Bind `value` to a data model path | +| `emit` | injected | Event emitter provided by the render engine | + +```json +{ + "id": "volume", + "component": "Slider", + "label": "Volume", + "value": {"path": "/volume"}, + "min": 0, + "max": 100, + "step": 1, + "_bindings": {"value": "/volume"} +} +``` + +## Layout Components (continued) + +### Tabs + +A tabbed container that shows one child panel at a time based on the selected tab index. + +| A2UI type | Angular component | Selector | +|-----------|-------------------|----------| +| `Tabs` | `A2uiTabsComponent` | `a2ui-tabs` | + +| Prop | Type | Description | +|------|------|-------------| +| `tabs` | `{label: string, childKeys: string[]}[]` | Tab definitions with labels and child component IDs | +| `selected` | `number` | Currently selected tab index. Defaults to `0` | +| `_bindings` | `Record` | Bind `selected` to a data model path | +| `spec` | `Spec` | Injected automatically by the render engine | +| `emit` | injected | Event emitter provided by the render engine | + +```json +{ + "id": "info-tabs", + "component": "Tabs", + "tabs": [ + {"label": "Overview", "childKeys": ["overview-content"]}, + {"label": "Details", "childKeys": ["detail-list"]} + ], + "selected": 0, + "_bindings": {"selected": "/activeTab"} +} +``` + +### Modal + +A dialog overlay that renders child content when open. Supports an optional title and dismissible close button. + +| A2UI type | Angular component | Selector | +|-----------|-------------------|----------| +| `Modal` | `A2uiModalComponent` | `a2ui-modal` | + +| Prop | Type | Description | +|------|------|-------------| +| `title` | `string` | Optional modal heading | +| `open` | `boolean` | Whether the modal is visible | +| `childKeys` | `string[]` | Child component IDs rendered inside the modal body | +| `dismissible` | `boolean` | Shows a close button when `true`. Defaults to `true` | +| `_bindings` | `Record` | Bind `open` to a data model path | +| `spec` | `Spec` | Injected automatically by the render engine | +| `emit` | injected | Event emitter provided by the render engine | + +```json +{ + "id": "confirm-dialog", + "component": "Modal", + "title": "Confirm Action", + "open": {"path": "/showConfirm"}, + "childKeys": ["confirm-message", "confirm-buttons"], + "dismissible": true, + "_bindings": {"open": "/showConfirm"} +} +``` + +## Media Components + +### Video + +Renders an HTML5 `