+
+
+
+ `,
+ styles: `
+ :host {
+ display: block;
+ flex: var(--weight);
+ }
+ `,
+})
+export class Tabs extends DynamicComponent {
+ protected selectedIndex = signal(0);
+ readonly tabs = input.required();
+
+ protected readonly buttonClasses = computed(() => {
+ const selectedIndex = this.selectedIndex();
+
+ return this.tabs().map((_, index) => {
+ return index === selectedIndex
+ ? Styles.merge(
+ this.theme.components.Tabs.controls.all,
+ this.theme.components.Tabs.controls.selected,
+ )
+ : this.theme.components.Tabs.controls.all;
+ });
+ });
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/catalog/text-field.ts b/vendor/a2ui/renderers/angular/src/lib/catalog/text-field.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3e7ebdf4bc954683a7edd0195a2de671f6510202
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/catalog/text-field.ts
@@ -0,0 +1,86 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { computed, Component, input } from '@angular/core';
+import { Primitives, Types } from '@a2ui/lit/0.8';
+import { DynamicComponent } from '../rendering/dynamic-component';
+
+@Component({
+ selector: 'a2ui-text-field',
+ styles: `
+ :host {
+ display: flex;
+ flex: var(--weight);
+ }
+
+ section,
+ input,
+ label {
+ box-sizing: border-box;
+ }
+
+ input {
+ display: block;
+ width: 100%;
+ }
+
+ label {
+ display: block;
+ margin-bottom: 4px;
+ }
+ `,
+ template: `
+ @let resolvedLabel = this.resolvedLabel();
+
+
+ @if (resolvedLabel) {
+
+ }
+
+
+
+ `,
+})
+export class TextField extends DynamicComponent {
+ readonly text = input.required();
+ readonly label = input.required();
+ readonly inputType = input.required();
+
+ protected inputValue = computed(() => super.resolvePrimitive(this.text()) || '');
+ protected resolvedLabel = computed(() => super.resolvePrimitive(this.label()));
+ protected inputId = super.getUniqueId('a2ui-input');
+
+ protected handleInput(event: Event) {
+ const path = this.text()?.path;
+
+ if (!(event.target instanceof HTMLInputElement) || !path) {
+ return;
+ }
+
+ this.processor.setData(this.component(), path, event.target.value, this.surfaceId());
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/catalog/text.ts b/vendor/a2ui/renderers/angular/src/lib/catalog/text.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a2bbf93fe690fa27f40d035d3ca022aa84a3877d
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/catalog/text.ts
@@ -0,0 +1,137 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Component, computed, inject, input, ViewEncapsulation } from '@angular/core';
+import { DynamicComponent } from '../rendering/dynamic-component';
+import { Primitives, Styles, Types } from '@a2ui/lit/0.8';
+import { MarkdownRenderer } from '../data/markdown';
+
+interface HintedStyles {
+ h1: Record;
+ h2: Record;
+ h3: Record;
+ h4: Record;
+ h5: Record;
+ body: Record;
+ caption: Record;
+}
+
+@Component({
+ selector: 'a2ui-text',
+ template: `
+
+ `,
+ encapsulation: ViewEncapsulation.None,
+ styles: `
+ a2ui-text {
+ display: block;
+ flex: var(--weight);
+ }
+
+ a2ui-text h1,
+ a2ui-text h2,
+ a2ui-text h3,
+ a2ui-text h4,
+ a2ui-text h5 {
+ line-height: inherit;
+ font: inherit;
+ }
+ `,
+})
+export class Text extends DynamicComponent {
+ private markdownRenderer = inject(MarkdownRenderer);
+ readonly text = input.required();
+ readonly usageHint = input.required();
+
+ protected resolvedText = computed(() => {
+ const usageHint = this.usageHint();
+ let value = super.resolvePrimitive(this.text());
+
+ if (value == null) {
+ return '(empty)';
+ }
+
+ switch (usageHint) {
+ case 'h1':
+ value = `# ${value}`;
+ break;
+ case 'h2':
+ value = `## ${value}`;
+ break;
+ case 'h3':
+ value = `### ${value}`;
+ break;
+ case 'h4':
+ value = `#### ${value}`;
+ break;
+ case 'h5':
+ value = `##### ${value}`;
+ break;
+ case 'caption':
+ value = `*${value}*`;
+ break;
+ default:
+ value = String(value);
+ break;
+ }
+
+ return this.markdownRenderer.render(
+ value,
+ Styles.appendToAll(this.theme.markdown, ['ol', 'ul', 'li'], {}),
+ );
+ });
+
+ protected classes = computed(() => {
+ const usageHint = this.usageHint();
+
+ return Styles.merge(
+ this.theme.components.Text.all,
+ usageHint ? this.theme.components.Text[usageHint] : {},
+ );
+ });
+
+ protected additionalStyles = computed(() => {
+ const usageHint = this.usageHint();
+ const styles = this.theme.additionalStyles?.Text;
+
+ if (!styles) {
+ return null;
+ }
+
+ let additionalStyles: Record = {};
+
+ if (this.areHintedStyles(styles)) {
+ additionalStyles = styles[usageHint ?? 'body'];
+ } else {
+ additionalStyles = styles;
+ }
+
+ return additionalStyles;
+ });
+
+ private areHintedStyles(styles: unknown): styles is HintedStyles {
+ if (typeof styles !== 'object' || !styles || Array.isArray(styles)) {
+ return false;
+ }
+
+ const expected = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'caption', 'body'];
+ return expected.every((v) => v in styles);
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/catalog/video.ts b/vendor/a2ui/renderers/angular/src/lib/catalog/video.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7629c543758893063531ba4bf253a9366c8364be
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/catalog/video.ts
@@ -0,0 +1,50 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Component, computed, input } from '@angular/core';
+import { DynamicComponent } from '../rendering/dynamic-component';
+import { Primitives } from '@a2ui/lit/0.8';
+
+@Component({
+ selector: 'a2ui-video',
+ template: `
+ @let resolvedUrl = this.resolvedUrl();
+
+ @if (resolvedUrl) {
+
+
+
+ }
+ `,
+ styles: `
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ video {
+ display: block;
+ width: 100%;
+ box-sizing: border-box;
+ }
+ `,
+})
+export class Video extends DynamicComponent {
+ readonly url = input.required();
+ protected readonly resolvedUrl = computed(() => this.resolvePrimitive(this.url()));
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/config.ts b/vendor/a2ui/renderers/angular/src/lib/config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fd3ef84852f8cf526fed89de59aeaf71c692a36a
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/config.ts
@@ -0,0 +1,25 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';
+import { Catalog, Theme } from './rendering';
+
+export function provideA2UI(config: { catalog: Catalog; theme: Theme }): EnvironmentProviders {
+ return makeEnvironmentProviders([
+ { provide: Catalog, useValue: config.catalog },
+ { provide: Theme, useValue: config.theme },
+ ]);
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/data/index.ts b/vendor/a2ui/renderers/angular/src/lib/data/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..59c24ba498c493d10926d74e8aaf210b8925afb5
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/data/index.ts
@@ -0,0 +1,18 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export * from './processor';
+export * from './types';
diff --git a/vendor/a2ui/renderers/angular/src/lib/data/markdown.ts b/vendor/a2ui/renderers/angular/src/lib/data/markdown.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dac3a77d2f3452c3cbd2c7e5b2c88c96ef4fcb0d
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/data/markdown.ts
@@ -0,0 +1,114 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { inject, Injectable, SecurityContext } from '@angular/core';
+import { DomSanitizer } from '@angular/platform-browser';
+import MarkdownIt from 'markdown-it';
+
+@Injectable({ providedIn: 'root' })
+export class MarkdownRenderer {
+ private originalClassMap = new Map();
+ private sanitizer = inject(DomSanitizer);
+
+ private markdownIt = MarkdownIt({
+ highlight: (str, lang) => {
+ if (lang === 'html') {
+ const iframe = document.createElement('iframe');
+ iframe.classList.add('html-view');
+ iframe.srcdoc = str;
+ iframe.sandbox = '';
+ return iframe.innerHTML;
+ }
+
+ return str;
+ },
+ });
+
+ render(value: string, tagClassMap?: Record) {
+ if (tagClassMap) {
+ this.applyTagClassMap(tagClassMap);
+ }
+ const htmlString = this.markdownIt.render(value);
+ this.unapplyTagClassMap();
+ return this.sanitizer.sanitize(SecurityContext.HTML, htmlString);
+ }
+
+ private applyTagClassMap(tagClassMap: Record) {
+ Object.entries(tagClassMap).forEach(([tag, classes]) => {
+ let tokenName;
+ switch (tag) {
+ case 'p':
+ tokenName = 'paragraph';
+ break;
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ tokenName = 'heading';
+ break;
+ case 'ul':
+ tokenName = 'bullet_list';
+ break;
+ case 'ol':
+ tokenName = 'ordered_list';
+ break;
+ case 'li':
+ tokenName = 'list_item';
+ break;
+ case 'a':
+ tokenName = 'link';
+ break;
+ case 'strong':
+ tokenName = 'strong';
+ break;
+ case 'em':
+ tokenName = 'em';
+ break;
+ }
+
+ if (!tokenName) {
+ return;
+ }
+
+ const key = `${tokenName}_open`;
+ const original = this.markdownIt.renderer.rules[key];
+ this.originalClassMap.set(key, original);
+
+ this.markdownIt.renderer.rules[key] = (tokens, idx, options, env, self) => {
+ const token = tokens[idx];
+ for (const clazz of classes) {
+ token.attrJoin('class', clazz);
+ }
+
+ if (original) {
+ return original.call(this, tokens, idx, options, env, self);
+ } else {
+ return self.renderToken(tokens, idx, options);
+ }
+ };
+ });
+ }
+
+ private unapplyTagClassMap() {
+ for (const [key, original] of this.originalClassMap) {
+ this.markdownIt.renderer.rules[key] = original;
+ }
+
+ this.originalClassMap.clear();
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/data/processor.ts b/vendor/a2ui/renderers/angular/src/lib/data/processor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..314a318c55db8b76ab79cdcd9c73548173900763
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/data/processor.ts
@@ -0,0 +1,47 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Data, Types } from '@a2ui/lit/0.8';
+import { Injectable } from '@angular/core';
+import { firstValueFrom, Subject } from 'rxjs';
+
+export interface DispatchedEvent {
+ message: Types.A2UIClientEventMessage;
+ completion: Subject;
+}
+
+@Injectable({ providedIn: 'root' })
+export class MessageProcessor extends Data.A2uiMessageProcessor {
+ readonly events = new Subject();
+
+ override setData(
+ node: Types.AnyComponentNode,
+ relativePath: string,
+ value: Types.DataValue,
+ surfaceId?: Types.SurfaceID | null,
+ ) {
+ // Override setData to convert from optional inputs (which can be null)
+ // to undefined so that this correctly falls back to the default value for
+ // surfaceId.
+ return super.setData(node, relativePath, value, surfaceId ?? undefined);
+ }
+
+ dispatch(message: Types.A2UIClientEventMessage): Promise {
+ const completion = new Subject();
+ this.events.next({ message, completion });
+ return firstValueFrom(completion);
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/data/types.ts b/vendor/a2ui/renderers/angular/src/lib/data/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1a9d3fd38daa33c7098e40e2437d23973735e470
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/data/types.ts
@@ -0,0 +1,29 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Types } from '@a2ui/lit/0.8';
+
+export interface A2TextPayload {
+ kind: 'text';
+ text: string;
+}
+
+export interface A2DataPayload {
+ kind: 'data';
+ data: Types.ServerToClientMessage;
+}
+
+export type A2AServerPayload = Array | { error: string };
diff --git a/vendor/a2ui/renderers/angular/src/lib/rendering/catalog.ts b/vendor/a2ui/renderers/angular/src/lib/rendering/catalog.ts
new file mode 100644
index 0000000000000000000000000000000000000000..35735c6ec9acf302da31e0aa21ac9cb9caeb0717
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/rendering/catalog.ts
@@ -0,0 +1,36 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Binding, InjectionToken, Type } from '@angular/core';
+import { DynamicComponent } from './dynamic-component';
+import { Types } from '@a2ui/lit/0.8';
+
+export type CatalogLoader = () =>
+ | Promise>>
+ | Type>;
+
+export type CatalogEntry =
+ | CatalogLoader
+ | {
+ type: CatalogLoader;
+ bindings: (data: T) => Binding[];
+ };
+
+export interface Catalog {
+ [key: string]: CatalogEntry;
+}
+
+export const Catalog = new InjectionToken('Catalog');
diff --git a/vendor/a2ui/renderers/angular/src/lib/rendering/dynamic-component.ts b/vendor/a2ui/renderers/angular/src/lib/rendering/dynamic-component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..358ecf349ec6690404267c8a227896a1c2da3c36
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/rendering/dynamic-component.ts
@@ -0,0 +1,100 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Types, Primitives } from '@a2ui/lit/0.8';
+import { Directive, inject, input } from '@angular/core';
+import { MessageProcessor } from '../data';
+import { Theme } from './theming';
+
+let idCounter = 0;
+
+@Directive({
+ host: {
+ '[style.--weight]': 'weight()',
+ },
+})
+export abstract class DynamicComponent {
+ protected readonly processor = inject(MessageProcessor);
+ protected readonly theme = inject(Theme);
+
+ readonly surfaceId = input.required();
+ readonly component = input.required();
+ readonly weight = input.required();
+
+ protected sendAction(action: Types.Action): Promise {
+ const component = this.component();
+ const surfaceId = this.surfaceId() ?? undefined;
+ const context: Record = {};
+
+ if (action.context) {
+ for (const item of action.context) {
+ if (item.value.literalBoolean) {
+ context[item.key] = item.value.literalBoolean;
+ } else if (item.value.literalNumber) {
+ context[item.key] = item.value.literalNumber;
+ } else if (item.value.literalString) {
+ context[item.key] = item.value.literalString;
+ } else if (item.value.path) {
+ const path = this.processor.resolvePath(item.value.path, component.dataContextPath);
+ const value = this.processor.getData(component, path, surfaceId);
+ context[item.key] = value;
+ }
+ }
+ }
+
+ const message: Types.A2UIClientEventMessage = {
+ userAction: {
+ name: action.name,
+ sourceComponentId: component.id,
+ surfaceId: surfaceId!,
+ timestamp: new Date().toISOString(),
+ context,
+ },
+ };
+
+ return this.processor.dispatch(message);
+ }
+
+ protected resolvePrimitive(value: Primitives.StringValue | null): string | null;
+ protected resolvePrimitive(value: Primitives.BooleanValue | null): boolean | null;
+ protected resolvePrimitive(value: Primitives.NumberValue | null): number | null;
+ protected resolvePrimitive(
+ value: Primitives.StringValue | Primitives.BooleanValue | Primitives.NumberValue | null,
+ ) {
+ const component = this.component();
+ const surfaceId = this.surfaceId();
+
+ if (!value || typeof value !== 'object') {
+ return null;
+ } else if (value.literal != null) {
+ return value.literal;
+ } else if (value.path) {
+ return this.processor.getData(component, value.path, surfaceId ?? undefined);
+ } else if ('literalString' in value) {
+ return value.literalString;
+ } else if ('literalNumber' in value) {
+ return value.literalNumber;
+ } else if ('literalBoolean' in value) {
+ return value.literalBoolean;
+ }
+
+ return null;
+ }
+
+ protected getUniqueId(prefix: string) {
+ return `${prefix}-${idCounter++}`;
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/rendering/index.ts b/vendor/a2ui/renderers/angular/src/lib/rendering/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ff029be964754333261cff10ebfa42ab5fbeae02
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/rendering/index.ts
@@ -0,0 +1,20 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export * from './catalog';
+export * from './dynamic-component';
+export * from './renderer';
+export * from './theming';
diff --git a/vendor/a2ui/renderers/angular/src/lib/rendering/renderer.ts b/vendor/a2ui/renderers/angular/src/lib/rendering/renderer.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0e456f97f1ced278829bba5c4c3e3457f9c13f06
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/rendering/renderer.ts
@@ -0,0 +1,109 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import {
+ Binding,
+ ComponentRef,
+ Directive,
+ DOCUMENT,
+ effect,
+ inject,
+ input,
+ inputBinding,
+ OnDestroy,
+ PLATFORM_ID,
+ Type,
+ untracked,
+ ViewContainerRef,
+} from '@angular/core';
+import { Types, Styles } from '@a2ui/lit/0.8';
+import { Catalog } from './catalog';
+import { isPlatformBrowser } from '@angular/common';
+
+@Directive({
+ selector: 'ng-container[a2ui-renderer]',
+})
+export class Renderer implements OnDestroy {
+ private viewContainerRef = inject(ViewContainerRef);
+ private catalog = inject(Catalog);
+ private static hasInsertedStyles = false;
+
+ private currentRef: ComponentRef | null = null;
+ private isDestroyed = false;
+
+ readonly surfaceId = input.required();
+ readonly component = input.required();
+
+ constructor() {
+ effect(() => {
+ const surfaceId = this.surfaceId();
+ const component = this.component();
+ untracked(() => this.render(surfaceId, component));
+ });
+
+ const platformId = inject(PLATFORM_ID);
+ const document = inject(DOCUMENT);
+
+ if (!Renderer.hasInsertedStyles && isPlatformBrowser(platformId)) {
+ const styles = document.createElement('style');
+ styles.textContent = Styles.structuralStyles;
+ document.head.appendChild(styles);
+ Renderer.hasInsertedStyles = true;
+ }
+ }
+
+ ngOnDestroy(): void {
+ this.isDestroyed = true;
+ this.clear();
+ }
+
+ private async render(surfaceId: Types.SurfaceID, component: Types.AnyComponentNode) {
+ const config = this.catalog[component.type];
+ let newComponent: Type | null = null;
+ let componentBindings: Binding[] | null = null;
+
+ if (typeof config === 'function') {
+ newComponent = await config();
+ } else if (typeof config === 'object') {
+ newComponent = await config.type();
+ componentBindings = config.bindings(component as any);
+ }
+
+ this.clear();
+
+ if (newComponent && !this.isDestroyed) {
+ const bindings = [
+ inputBinding('surfaceId', () => surfaceId),
+ inputBinding('component', () => component),
+ inputBinding('weight', () => component.weight ?? 'initial'),
+ ];
+
+ if (componentBindings) {
+ bindings.push(...componentBindings);
+ }
+
+ this.currentRef = this.viewContainerRef.createComponent(newComponent, {
+ bindings,
+ injector: this.viewContainerRef.injector,
+ });
+ }
+ }
+
+ private clear() {
+ this.currentRef?.destroy();
+ this.currentRef = null;
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/src/lib/rendering/theming.ts b/vendor/a2ui/renderers/angular/src/lib/rendering/theming.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6c200911e475e7ce782aa150f7d669bab22efa66
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/lib/rendering/theming.ts
@@ -0,0 +1,22 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Types } from '@a2ui/lit/0.8';
+import { InjectionToken } from '@angular/core';
+
+export const Theme = new InjectionToken('Theme');
+
+export type Theme = Types.Theme;
diff --git a/vendor/a2ui/renderers/angular/src/public-api.ts b/vendor/a2ui/renderers/angular/src/public-api.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d68004a561c1b1d6c64f0cf22aac1eff63c7e78
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/src/public-api.ts
@@ -0,0 +1,21 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export * from './lib/rendering/index';
+export * from './lib/data/index';
+export * from './lib/config';
+export * from './lib/catalog/default';
+export { Surface } from './lib/catalog/surface';
diff --git a/vendor/a2ui/renderers/angular/tsconfig.json b/vendor/a2ui/renderers/angular/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..9f6412a72d2cede230b2ed66612f8937f991544a
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/tsconfig.json
@@ -0,0 +1,23 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "skipLibCheck": true,
+ "isolatedModules": true,
+ "experimentalDecorators": true,
+ "importHelpers": true,
+ "target": "ES2022",
+ "module": "preserve"
+ },
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "typeCheckHostBindings": true,
+ "strictTemplates": true
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/tsconfig.lib.json b/vendor/a2ui/renderers/angular/tsconfig.lib.json
new file mode 100644
index 0000000000000000000000000000000000000000..6984a0e01fd2bf5a8e41ddd2b96bd4af370987e7
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/tsconfig.lib.json
@@ -0,0 +1,16 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/lib",
+ "declaration": true,
+ "declarationMap": true,
+ "inlineSources": true,
+ "types": []
+ },
+ "include": [
+ "src/**/*.ts"
+ ],
+ "exclude": [
+ "**/*.spec.ts"
+ ]
+}
diff --git a/vendor/a2ui/renderers/angular/tsconfig.lib.prod.json b/vendor/a2ui/renderers/angular/tsconfig.lib.prod.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a2faa884cf3a054c72288f62b9a9f9560ca4996
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/tsconfig.lib.prod.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.lib.json",
+ "compilerOptions": {
+ "declarationMap": false
+ },
+ "angularCompilerOptions": {
+ "compilationMode": "partial"
+ }
+}
diff --git a/vendor/a2ui/renderers/angular/tsconfig.spec.json b/vendor/a2ui/renderers/angular/tsconfig.spec.json
new file mode 100644
index 0000000000000000000000000000000000000000..79ee881a8020068bd293b80d507a6cab76d0aea2
--- /dev/null
+++ b/vendor/a2ui/renderers/angular/tsconfig.spec.json
@@ -0,0 +1,12 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/spec",
+ "types": [
+ "jasmine"
+ ]
+ },
+ "include": [
+ "src/**/*.ts"
+ ]
+}
diff --git a/vendor/a2ui/renderers/lit/.npmrc b/vendor/a2ui/renderers/lit/.npmrc
new file mode 100644
index 0000000000000000000000000000000000000000..06b0eef7e30cfe29788b12b453e763dc0e5723ac
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/.npmrc
@@ -0,0 +1,2 @@
+@a2ui:registry=https://us-npm.pkg.dev/oss-exit-gate-prod/a2ui--npm/
+//us-npm.pkg.dev/oss-exit-gate-prod/a2ui--npm/:always-auth=true
diff --git a/vendor/a2ui/renderers/lit/README b/vendor/a2ui/renderers/lit/README
new file mode 100644
index 0000000000000000000000000000000000000000..2e908410d4692b95b59ed26d270f05ba22335a24
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/README
@@ -0,0 +1,9 @@
+Lit implementation of A2UI.
+
+Important: The sample code provided is for demonstration purposes and illustrates the mechanics of A2UI and the Agent-to-Agent (A2A) protocol. When building production applications, it is critical to treat any agent operating outside of your direct control as a potentially untrusted entity.
+
+All operational data received from an external agent—including its AgentCard, messages, artifacts, and task statuses—should be handled as untrusted input. For example, a malicious agent could provide crafted data in its fields (e.g., name, skills.description) that, if used without sanitization to construct prompts for a Large Language Model (LLM), could expose your application to prompt injection attacks.
+
+Similarly, any UI definition or data stream received must be treated as untrusted. Malicious agents could attempt to spoof legitimate interfaces to deceive users (phishing), inject malicious scripts via property values (XSS), or generate excessive layout complexity to degrade client performance (DoS). If your application supports optional embedded content (such as iframes or web views), additional care must be taken to prevent exposure to malicious external sites.
+
+Developer Responsibility: Failure to properly validate data and strictly sandbox rendered content can introduce severe vulnerabilities. Developers are responsible for implementing appropriate security measures—such as input sanitization, Content Security Policies (CSP), strict isolation for optional embedded content, and secure credential handling—to protect their systems and users.
\ No newline at end of file
diff --git a/vendor/a2ui/renderers/lit/README.md b/vendor/a2ui/renderers/lit/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..2e908410d4692b95b59ed26d270f05ba22335a24
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/README.md
@@ -0,0 +1,9 @@
+Lit implementation of A2UI.
+
+Important: The sample code provided is for demonstration purposes and illustrates the mechanics of A2UI and the Agent-to-Agent (A2A) protocol. When building production applications, it is critical to treat any agent operating outside of your direct control as a potentially untrusted entity.
+
+All operational data received from an external agent—including its AgentCard, messages, artifacts, and task statuses—should be handled as untrusted input. For example, a malicious agent could provide crafted data in its fields (e.g., name, skills.description) that, if used without sanitization to construct prompts for a Large Language Model (LLM), could expose your application to prompt injection attacks.
+
+Similarly, any UI definition or data stream received must be treated as untrusted. Malicious agents could attempt to spoof legitimate interfaces to deceive users (phishing), inject malicious scripts via property values (XSS), or generate excessive layout complexity to degrade client performance (DoS). If your application supports optional embedded content (such as iframes or web views), additional care must be taken to prevent exposure to malicious external sites.
+
+Developer Responsibility: Failure to properly validate data and strictly sandbox rendered content can introduce severe vulnerabilities. Developers are responsible for implementing appropriate security measures—such as input sanitization, Content Security Policies (CSP), strict isolation for optional embedded content, and secure credential handling—to protect their systems and users.
\ No newline at end of file
diff --git a/vendor/a2ui/renderers/lit/package-lock.json b/vendor/a2ui/renderers/lit/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..26b270e092f776ca1d0c12165873ebf587dbf484
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/package-lock.json
@@ -0,0 +1,1196 @@
+{
+ "name": "@a2ui/lit",
+ "version": "0.8.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@a2ui/lit",
+ "version": "0.8.1",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@lit-labs/signals": "^0.1.3",
+ "@lit/context": "^1.1.4",
+ "lit": "^3.3.1",
+ "markdown-it": "^14.1.0",
+ "signal-utils": "^0.21.1"
+ },
+ "devDependencies": {
+ "@types/markdown-it": "^14.1.2",
+ "@types/node": "^24.10.1",
+ "google-artifactregistry-auth": "^3.5.0",
+ "typescript": "^5.8.3",
+ "wireit": "^0.15.0-pre.2"
+ }
+ },
+ "node_modules/@lit-labs/signals": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@lit-labs/signals/-/signals-0.1.3.tgz",
+ "integrity": "sha512-P0yWgH5blwVyEwBg+WFspLzeu1i0ypJP1QB0l1Omr9qZLIPsUu0p4Fy2jshOg7oQyha5n163K3GJGeUhQQ682Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "lit": "^2.0.0 || ^3.0.0",
+ "signal-polyfill": "^0.2.0"
+ }
+ },
+ "node_modules/@lit-labs/ssr-dom-shim": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz",
+ "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@lit/context": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz",
+ "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^1.6.2 || ^2.1.0"
+ }
+ },
+ "node_modules/@lit/reactive-element": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.1.tgz",
+ "integrity": "sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.4.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.10.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz",
+ "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/balanced-match": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-3.0.1.tgz",
+ "integrity": "sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bignumber.js": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-4.0.1.tgz",
+ "integrity": "sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gaxios": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.9",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/google-artifactregistry-auth": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/google-artifactregistry-auth/-/google-artifactregistry-auth-3.5.0.tgz",
+ "integrity": "sha512-SIvVBPjVr0KvYFEJEZXKfELt8nvXwTKl6IHyOT7pTHBlS8Ej2UuTOJeKWYFim/JztSjUyna9pKQxa3VhTA12Fg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "google-auth-library": "^9.14.0",
+ "js-yaml": "^4.1.0",
+ "yargs": "^17.1.1"
+ },
+ "bin": {
+ "artifactregistry-auth": "src/main.js"
+ }
+ },
+ "node_modules/google-auth-library": {
+ "version": "9.15.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+ "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "gaxios": "^6.1.1",
+ "gcp-metadata": "^6.1.0",
+ "gtoken": "^7.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/gtoken": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+ "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "gaxios": "^6.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jwa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jwa": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/lit": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz",
+ "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^2.1.0",
+ "lit-element": "^4.2.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-element": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.1.tgz",
+ "integrity": "sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.4.0",
+ "@lit/reactive-element": "^2.1.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-html": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz",
+ "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/proper-lockfile": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+ "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/signal-polyfill": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/signal-polyfill/-/signal-polyfill-0.2.2.tgz",
+ "integrity": "sha512-p63Y4Er5/eMQ9RHg0M0Y64NlsQKpiu6MDdhBXpyywRuWiPywhJTpKJ1iB5K2hJEbFZ0BnDS7ZkJ+0AfTuL37Rg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/signal-utils": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/signal-utils/-/signal-utils-0.21.1.tgz",
+ "integrity": "sha512-i9cdLSvVH4j8ql8mz2lyrA93xL499P8wEbIev3ldSriXeUwqh+wM4Q5VPhIZ19gPtIS4BOopJuKB8l1+wH9LCg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "signal-polyfill": "^0.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wireit": {
+ "version": "0.15.0-pre.2",
+ "resolved": "https://registry.npmjs.org/wireit/-/wireit-0.15.0-pre.2.tgz",
+ "integrity": "sha512-pXOTR56btrL7STFOPQgtq8MjAFWagSqs188E2FflCgcxk5uc0Xbn8CuLIR9FbqK97U3Jw6AK8zDEu/M/9ENqgA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "workspaces": [
+ "vscode-extension",
+ "website"
+ ],
+ "dependencies": {
+ "brace-expansion": "^4.0.0",
+ "chokidar": "^3.5.3",
+ "fast-glob": "^3.2.11",
+ "jsonc-parser": "^3.0.0",
+ "proper-lockfile": "^4.1.2"
+ },
+ "bin": {
+ "wireit": "bin/wireit.js"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ }
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/package.json b/vendor/a2ui/renderers/lit/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..6cc360cb5a0cedf3b8d9f4cf816debf95e6b5ce8
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/package.json
@@ -0,0 +1,108 @@
+{
+ "name": "@a2ui/lit",
+ "version": "0.8.1",
+ "description": "A2UI Lit Library",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/src/index.d.ts",
+ "default": "./dist/src/index.js"
+ },
+ "./0.8": {
+ "types": "./dist/src/0.8/core.d.ts",
+ "default": "./dist/src/0.8/core.js"
+ },
+ "./ui": {
+ "types": "./dist/src/0.8/ui/ui.d.ts",
+ "default": "./dist/src/0.8/ui/ui.js"
+ }
+ },
+ "type": "module",
+ "scripts": {
+ "prepack": "npm run build",
+ "build": "wireit",
+ "build:tsc": "wireit",
+ "dev": "npm run serve --watch",
+ "test": "wireit",
+ "serve": "wireit",
+ "copy-spec": "wireit"
+ },
+ "wireit": {
+ "copy-spec": {
+ "command": "mkdir -p src/0.8/schemas && cp ../../specification/0.8/json/*.json src/0.8/schemas",
+ "files": [
+ "../../specification/0.8/json/*.json"
+ ],
+ "output": [
+ "src/0.8/schemas/*.json"
+ ]
+ },
+ "serve": {
+ "command": "vite dev",
+ "dependencies": [
+ "build"
+ ],
+ "service": true
+ },
+ "test": {
+ "command": "node --test --enable-source-maps --test-reporter spec dist/src/0.8/*.test.js",
+ "dependencies": [
+ "build"
+ ]
+ },
+ "build": {
+ "dependencies": [
+ "build:tsc"
+ ]
+ },
+ "build:tsc": {
+ "command": "tsc -b --pretty",
+ "env": {
+ "FORCE_COLOR": "1"
+ },
+ "dependencies": [
+ "copy-spec"
+ ],
+ "files": [
+ "src/**/*.ts",
+ "src/**/*.json",
+ "tsconfig.json"
+ ],
+ "output": [
+ "dist/",
+ "!dist/**/*.min.js{,.map}"
+ ],
+ "clean": "if-file-deleted"
+ }
+ },
+ "repository": {
+ "directory": "renderers/lit",
+ "type": "git",
+ "url": "git+https://github.com/google/A2UI.git"
+ },
+ "files": [
+ "dist/src"
+ ],
+ "keywords": [],
+ "author": "Google",
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/google/A2UI/issues"
+ },
+ "homepage": "https://github.com/google/A2UI/tree/main/web#readme",
+ "devDependencies": {
+ "@types/markdown-it": "^14.1.2",
+ "@types/node": "^24.10.1",
+ "google-artifactregistry-auth": "^3.5.0",
+ "typescript": "^5.8.3",
+ "wireit": "^0.15.0-pre.2"
+ },
+ "dependencies": {
+ "@lit-labs/signals": "^0.1.3",
+ "@lit/context": "^1.1.4",
+ "lit": "^3.3.1",
+ "markdown-it": "^14.1.0",
+ "signal-utils": "^0.21.1"
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/core.ts b/vendor/a2ui/renderers/lit/src/0.8/core.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9c16e747a48a9203e381854b5540e6171789953c
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/core.ts
@@ -0,0 +1,35 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export * as Events from "./events/events.js";
+export * as Types from "./types/types.js";
+export * as Primitives from "./types/primitives.js";
+export * as Styles from "./styles/index.js";
+import * as Guards from "./data/guards.js";
+
+import { create as createSignalA2uiMessageProcessor } from "./data/signal-model-processor.js";
+import { A2uiMessageProcessor } from "./data/model-processor.js";
+import A2UIClientEventMessage from "./schemas/server_to_client_with_standard_catalog.json" with { type: "json" };
+
+export const Data = {
+ createSignalA2uiMessageProcessor,
+ A2uiMessageProcessor,
+ Guards,
+};
+
+export const Schemas = {
+ A2UIClientEventMessage,
+};
diff --git a/vendor/a2ui/renderers/lit/src/0.8/data/guards.ts b/vendor/a2ui/renderers/lit/src/0.8/data/guards.ts
new file mode 100644
index 0000000000000000000000000000000000000000..624e8f5ed7d3a05da21f61ee59276dcb0a9014bc
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/data/guards.ts
@@ -0,0 +1,236 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { BooleanValue, NumberValue, StringValue } from "../types/primitives";
+import {
+ AnyComponentNode,
+ ComponentArrayReference,
+ ResolvedAudioPlayer,
+ ResolvedButton,
+ ResolvedCard,
+ ResolvedCheckbox,
+ ResolvedColumn,
+ ResolvedDateTimeInput,
+ ResolvedDivider,
+ ResolvedIcon,
+ ResolvedImage,
+ ResolvedList,
+ ResolvedModal,
+ ResolvedMultipleChoice,
+ ResolvedRow,
+ ResolvedSlider,
+ ResolvedTabItem,
+ ResolvedTabs,
+ ResolvedText,
+ ResolvedTextField,
+ ResolvedVideo,
+ ValueMap,
+} from "../types/types";
+
+export function isValueMap(value: unknown): value is ValueMap {
+ return isObject(value) && "key" in value;
+}
+
+export function isPath(key: string, value: unknown): value is string {
+ return key === "path" && typeof value === "string";
+}
+
+export function isObject(value: unknown): value is Record {
+ return typeof value === "object" && value !== null && !Array.isArray(value);
+}
+
+export function isComponentArrayReference(
+ value: unknown
+): value is ComponentArrayReference {
+ if (!isObject(value)) return false;
+ return "explicitList" in value || "template" in value;
+}
+
+function isStringValue(value: unknown): value is StringValue {
+ return (
+ isObject(value) &&
+ ("path" in value ||
+ ("literal" in value && typeof value.literal === "string") ||
+ "literalString" in value)
+ );
+}
+
+function isNumberValue(value: unknown): value is NumberValue {
+ return (
+ isObject(value) &&
+ ("path" in value ||
+ ("literal" in value && typeof value.literal === "number") ||
+ "literalNumber" in value)
+ );
+}
+
+function isBooleanValue(value: unknown): value is BooleanValue {
+ return (
+ isObject(value) &&
+ ("path" in value ||
+ ("literal" in value && typeof value.literal === "boolean") ||
+ "literalBoolean" in value)
+ );
+}
+
+function isAnyComponentNode(value: unknown): value is AnyComponentNode {
+ if (!isObject(value)) return false;
+ const hasBaseKeys = "id" in value && "type" in value && "properties" in value;
+ if (!hasBaseKeys) return false;
+
+ return true;
+}
+
+export function isResolvedAudioPlayer(
+ props: unknown
+): props is ResolvedAudioPlayer {
+ return isObject(props) && "url" in props && isStringValue(props.url);
+}
+
+export function isResolvedButton(props: unknown): props is ResolvedButton {
+ return (
+ isObject(props) &&
+ "child" in props &&
+ isAnyComponentNode(props.child) &&
+ "action" in props
+ );
+}
+
+export function isResolvedCard(props: unknown): props is ResolvedCard {
+ if (!isObject(props)) return false;
+ if (!("child" in props)) {
+ if (!("children" in props)) {
+ return false;
+ } else {
+ return (
+ Array.isArray(props.children) &&
+ props.children.every(isAnyComponentNode)
+ );
+ }
+ }
+
+ return isAnyComponentNode(props.child);
+}
+
+export function isResolvedCheckbox(props: unknown): props is ResolvedCheckbox {
+ return (
+ isObject(props) &&
+ "label" in props &&
+ isStringValue(props.label) &&
+ "value" in props &&
+ isBooleanValue(props.value)
+ );
+}
+
+export function isResolvedColumn(props: unknown): props is ResolvedColumn {
+ return (
+ isObject(props) &&
+ "children" in props &&
+ Array.isArray(props.children) &&
+ props.children.every(isAnyComponentNode)
+ );
+}
+
+export function isResolvedDateTimeInput(
+ props: unknown
+): props is ResolvedDateTimeInput {
+ return isObject(props) && "value" in props && isStringValue(props.value);
+}
+
+export function isResolvedDivider(props: unknown): props is ResolvedDivider {
+ // Dividers can have all optional properties, so just checking if
+ // it's an object is enough.
+ return isObject(props);
+}
+
+export function isResolvedImage(props: unknown): props is ResolvedImage {
+ return isObject(props) && "url" in props && isStringValue(props.url);
+}
+
+export function isResolvedIcon(props: unknown): props is ResolvedIcon {
+ return isObject(props) && "name" in props && isStringValue(props.name);
+}
+
+export function isResolvedList(props: unknown): props is ResolvedList {
+ return (
+ isObject(props) &&
+ "children" in props &&
+ Array.isArray(props.children) &&
+ props.children.every(isAnyComponentNode)
+ );
+}
+
+export function isResolvedModal(props: unknown): props is ResolvedModal {
+ return (
+ isObject(props) &&
+ "entryPointChild" in props &&
+ isAnyComponentNode(props.entryPointChild) &&
+ "contentChild" in props &&
+ isAnyComponentNode(props.contentChild)
+ );
+}
+
+export function isResolvedMultipleChoice(
+ props: unknown
+): props is ResolvedMultipleChoice {
+ return isObject(props) && "selections" in props;
+}
+
+export function isResolvedRow(props: unknown): props is ResolvedRow {
+ return (
+ isObject(props) &&
+ "children" in props &&
+ Array.isArray(props.children) &&
+ props.children.every(isAnyComponentNode)
+ );
+}
+
+export function isResolvedSlider(props: unknown): props is ResolvedSlider {
+ return isObject(props) && "value" in props && isNumberValue(props.value);
+}
+
+function isResolvedTabItem(item: unknown): item is ResolvedTabItem {
+ return (
+ isObject(item) &&
+ "title" in item &&
+ isStringValue(item.title) &&
+ "child" in item &&
+ isAnyComponentNode(item.child)
+ );
+}
+
+export function isResolvedTabs(props: unknown): props is ResolvedTabs {
+ return (
+ isObject(props) &&
+ "tabItems" in props &&
+ Array.isArray(props.tabItems) &&
+ props.tabItems.every(isResolvedTabItem)
+ );
+}
+
+export function isResolvedText(props: unknown): props is ResolvedText {
+ return isObject(props) && "text" in props && isStringValue(props.text);
+}
+
+export function isResolvedTextField(
+ props: unknown
+): props is ResolvedTextField {
+ return isObject(props) && "label" in props && isStringValue(props.label);
+}
+
+export function isResolvedVideo(props: unknown): props is ResolvedVideo {
+ return isObject(props) && "url" in props && isStringValue(props.url);
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/data/model-processor.ts b/vendor/a2ui/renderers/lit/src/0.8/data/model-processor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b407cb96408817d2fe1d64c2c3bac027e01ddb14
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/data/model-processor.ts
@@ -0,0 +1,867 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import {
+ ServerToClientMessage,
+ AnyComponentNode,
+ BeginRenderingMessage,
+ DataArray,
+ DataMap,
+ DataModelUpdate,
+ DataValue,
+ DeleteSurfaceMessage,
+ ResolvedMap,
+ ResolvedValue,
+ Surface,
+ SurfaceID,
+ SurfaceUpdateMessage,
+ MessageProcessor,
+ ValueMap,
+ DataObject,
+} from "../types/types";
+import {
+ isComponentArrayReference,
+ isObject,
+ isPath,
+ isResolvedAudioPlayer,
+ isResolvedButton,
+ isResolvedCard,
+ isResolvedCheckbox,
+ isResolvedColumn,
+ isResolvedDateTimeInput,
+ isResolvedDivider,
+ isResolvedIcon,
+ isResolvedImage,
+ isResolvedList,
+ isResolvedModal,
+ isResolvedMultipleChoice,
+ isResolvedRow,
+ isResolvedSlider,
+ isResolvedTabs,
+ isResolvedText,
+ isResolvedTextField,
+ isResolvedVideo,
+ isValueMap,
+} from "./guards.js";
+
+/**
+ * Processes and consolidates A2UIProtocolMessage objects into a structured,
+ * hierarchical model of UI surfaces.
+ */
+export class A2uiMessageProcessor implements MessageProcessor {
+ static readonly DEFAULT_SURFACE_ID = "@default";
+
+ #mapCtor: MapConstructor = Map;
+ #arrayCtor: ArrayConstructor = Array;
+ #setCtor: SetConstructor = Set;
+ #objCtor: ObjectConstructor = Object;
+ #surfaces: Map;
+
+ constructor(
+ readonly opts: {
+ mapCtor: MapConstructor;
+ arrayCtor: ArrayConstructor;
+ setCtor: SetConstructor;
+ objCtor: ObjectConstructor;
+ } = { mapCtor: Map, arrayCtor: Array, setCtor: Set, objCtor: Object }
+ ) {
+ this.#arrayCtor = opts.arrayCtor;
+ this.#mapCtor = opts.mapCtor;
+ this.#setCtor = opts.setCtor;
+ this.#objCtor = opts.objCtor;
+
+ this.#surfaces = new opts.mapCtor();
+ }
+
+ getSurfaces(): ReadonlyMap {
+ return this.#surfaces;
+ }
+
+ clearSurfaces() {
+ this.#surfaces.clear();
+ }
+
+ processMessages(messages: ServerToClientMessage[]): void {
+ for (const message of messages) {
+ if (message.beginRendering) {
+ this.#handleBeginRendering(
+ message.beginRendering,
+ message.beginRendering.surfaceId
+ );
+ }
+
+ if (message.surfaceUpdate) {
+ this.#handleSurfaceUpdate(
+ message.surfaceUpdate,
+ message.surfaceUpdate.surfaceId
+ );
+ }
+
+ if (message.dataModelUpdate) {
+ this.#handleDataModelUpdate(
+ message.dataModelUpdate,
+ message.dataModelUpdate.surfaceId
+ );
+ }
+
+ if (message.deleteSurface) {
+ this.#handleDeleteSurface(message.deleteSurface);
+ }
+ }
+ }
+
+ /**
+ * Retrieves the data for a given component node and a relative path string.
+ * This correctly handles the special `.` path, which refers to the node's
+ * own data context.
+ */
+ getData(
+ node: AnyComponentNode,
+ relativePath: string,
+ surfaceId = A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ ): DataValue | null {
+ const surface = this.#getOrCreateSurface(surfaceId);
+ if (!surface) return null;
+
+ let finalPath: string;
+
+ // The special `.` path means the final path is the node's data context
+ // path and so we return the dataContextPath as-is.
+ if (relativePath === "." || relativePath === "") {
+ finalPath = node.dataContextPath ?? "/";
+ } else {
+ // For all other paths, resolve them against the node's context.
+ finalPath = this.resolvePath(relativePath, node.dataContextPath);
+ }
+
+ return this.#getDataByPath(surface.dataModel, finalPath);
+ }
+
+ setData(
+ node: AnyComponentNode | null,
+ relativePath: string,
+ value: DataValue,
+ surfaceId = A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ ): void {
+ if (!node) {
+ console.warn("No component node set");
+ return;
+ }
+
+ const surface = this.#getOrCreateSurface(surfaceId);
+ if (!surface) return;
+
+ let finalPath: string;
+
+ // The special `.` path means the final path is the node's data context
+ // path and so we return the dataContextPath as-is.
+ if (relativePath === "." || relativePath === "") {
+ finalPath = node.dataContextPath ?? "/";
+ } else {
+ // For all other paths, resolve them against the node's context.
+ finalPath = this.resolvePath(relativePath, node.dataContextPath);
+ }
+
+ this.#setDataByPath(surface.dataModel, finalPath, value);
+ }
+
+ resolvePath(path: string, dataContextPath?: string): string {
+ // If the path is absolute, it overrides any context.
+ if (path.startsWith("/")) {
+ return path;
+ }
+
+ if (dataContextPath && dataContextPath !== "/") {
+ // Ensure there's exactly one slash between the context and the path.
+ return dataContextPath.endsWith("/")
+ ? `${dataContextPath}${path}`
+ : `${dataContextPath}/${path}`;
+ }
+
+ // Fallback for no context or root context: make it an absolute path.
+ return `/${path}`;
+ }
+
+ #parseIfJsonString(value: DataValue): DataValue {
+ if (typeof value !== "string") {
+ return value;
+ }
+
+ const trimmedValue = value.trim();
+ if (
+ (trimmedValue.startsWith("{") && trimmedValue.endsWith("}")) ||
+ (trimmedValue.startsWith("[") && trimmedValue.endsWith("]"))
+ ) {
+ try {
+ // It looks like JSON, attempt to parse it.
+ return JSON.parse(value);
+ } catch (e) {
+ // It looked like JSON but wasn't. Keep the original string.
+ console.warn(
+ `Failed to parse potential JSON string: "${value.substring(
+ 0,
+ 50
+ )}..."`,
+ e
+ );
+ return value; // Return original string
+ }
+ }
+
+ // It's a string, but not JSON-like.
+ return value;
+ }
+
+ /**
+ * Converts a specific array format [{key: "...", value_string: "..."}, ...]
+ * into a standard Map. It also attempts to parse any string values that
+ * appear to be stringified JSON.
+ */
+ #convertKeyValueArrayToMap(arr: DataArray): DataMap {
+ const map = new this.#mapCtor();
+ for (const item of arr) {
+ if (!isObject(item) || !("key" in item)) continue;
+
+ const key = item.key as string;
+
+ // Find the value, which is in a property prefixed with "value".
+ const valueKey = this.#findValueKey(item);
+ if (!valueKey) continue;
+
+ let value: DataValue = item[valueKey];
+ // It's a valueMap. We must recursively convert it.
+ if (valueKey === "valueMap" && Array.isArray(value)) {
+ value = this.#convertKeyValueArrayToMap(value);
+ } else if (typeof value === "string") {
+ value = this.#parseIfJsonString(value);
+ }
+
+ this.#setDataByPath(map, key, value);
+ }
+ return map;
+ }
+
+ #setDataByPath(root: DataMap, path: string, value: DataValue): void {
+ // Check if the incoming value is the special key-value array format.
+ if (
+ Array.isArray(value) &&
+ (value.length === 0 || (isObject(value[0]) && "key" in value[0]))
+ ) {
+ // Check for "set primitive at path" convention:
+ // path: "/messages/123", contents: [{ key: ".", valueString: "hi" }]
+ if (value.length === 1 && isObject(value[0]) && value[0].key === ".") {
+ const item = value[0];
+ const valueKey = this.#findValueKey(item);
+
+ if (valueKey) {
+ // Extract the primitive value
+ value = item[valueKey];
+
+ // We must still process this value in case it's a valueMap or
+ // a JSON string.
+ if (valueKey === "valueMap" && Array.isArray(value)) {
+ value = this.#convertKeyValueArrayToMap(value);
+ } else if (typeof value === "string") {
+ value = this.#parseIfJsonString(value);
+ }
+ // Now, `value` is the primitive (e.g., "hi"), and we continue
+ // the function.
+ } else {
+ // Malformed, but fall back to existing behavior.
+ value = this.#convertKeyValueArrayToMap(value);
+ }
+ } else {
+ value = this.#convertKeyValueArrayToMap(value);
+ }
+ }
+
+ const segments = this.#normalizePath(path)
+ .split("/")
+ .filter((s) => s);
+ if (segments.length === 0) {
+ // Root data can either be a Map or an Object. If we receive an Object,
+ // however, we will normalize it to a proper Map.
+ if (value instanceof Map || isObject(value)) {
+ // Normalize an Object to a Map.
+ if (!(value instanceof Map) && isObject(value)) {
+ value = new this.#mapCtor(Object.entries(value));
+ }
+
+ root.clear();
+ for (const [key, v] of value.entries()) {
+ root.set(key, v);
+ }
+ } else {
+ console.error("Cannot set root of DataModel to a non-Map value.");
+ }
+ return;
+ }
+
+ let current: DataMap | DataArray = root;
+ for (let i = 0; i < segments.length - 1; i++) {
+ const segment = segments[i];
+ let target: DataValue | undefined;
+
+ if (current instanceof Map) {
+ target = current.get(segment);
+ } else if (Array.isArray(current) && /^\d+$/.test(segment)) {
+ target = current[parseInt(segment, 10)];
+ }
+
+ if (
+ target === undefined ||
+ typeof target !== "object" ||
+ target === null
+ ) {
+ target = new this.#mapCtor();
+ if (current instanceof this.#mapCtor) {
+ current.set(segment, target);
+ } else if (Array.isArray(current)) {
+ current[parseInt(segment, 10)] = target;
+ }
+ }
+ current = target as DataMap | DataArray;
+ }
+
+ const finalSegment = segments[segments.length - 1];
+ const storedValue = value;
+ if (current instanceof this.#mapCtor) {
+ current.set(finalSegment, storedValue);
+ } else if (Array.isArray(current) && /^\d+$/.test(finalSegment)) {
+ current[parseInt(finalSegment, 10)] = storedValue;
+ }
+ }
+
+ /**
+ * Normalizes a path string into a consistent, slash-delimited format.
+ * Converts bracket notation and dot notation in a two-pass.
+ * e.g., "bookRecommendations[0].title" -> "/bookRecommendations/0/title"
+ * e.g., "book.0.title" -> "/book/0/title"
+ */
+ #normalizePath(path: string): string {
+ // 1. Replace all bracket accessors `[index]` with dot accessors `.index`
+ const dotPath = path.replace(/\[(\d+)\]/g, ".$1");
+
+ // 2. Split by dots
+ const segments = dotPath.split(".");
+
+ // 3. Join with slashes and ensure it starts with a slash
+ return "/" + segments.filter((s) => s.length > 0).join("/");
+ }
+
+ #getDataByPath(root: DataMap, path: string): DataValue | null {
+ const segments = this.#normalizePath(path)
+ .split("/")
+ .filter((s) => s);
+
+ let current: DataValue = root;
+ for (const segment of segments) {
+ if (current === undefined || current === null) return null;
+
+ if (current instanceof Map) {
+ current = current.get(segment) as DataMap;
+ } else if (Array.isArray(current) && /^\d+$/.test(segment)) {
+ current = current[parseInt(segment, 10)];
+ } else if (isObject(current)) {
+ current = current[segment];
+ } else {
+ // If we need to traverse deeper but `current` is a primitive, the path is invalid.
+ return null;
+ }
+ }
+ return current;
+ }
+
+ #getOrCreateSurface(surfaceId: string): Surface {
+ let surface: Surface | undefined = this.#surfaces.get(surfaceId);
+ if (!surface) {
+ surface = new this.#objCtor({
+ rootComponentId: null,
+ componentTree: null,
+ dataModel: new this.#mapCtor(),
+ components: new this.#mapCtor(),
+ styles: new this.#objCtor(),
+ }) as Surface;
+
+ this.#surfaces.set(surfaceId, surface);
+ }
+
+ return surface;
+ }
+
+ #handleBeginRendering(
+ message: BeginRenderingMessage,
+ surfaceId: SurfaceID
+ ): void {
+ const surface = this.#getOrCreateSurface(surfaceId);
+ surface.rootComponentId = message.root;
+ surface.styles = message.styles ?? {};
+ this.#rebuildComponentTree(surface);
+ }
+
+ #handleSurfaceUpdate(
+ message: SurfaceUpdateMessage,
+ surfaceId: SurfaceID
+ ): void {
+ const surface = this.#getOrCreateSurface(surfaceId);
+ for (const component of message.components) {
+ surface.components.set(component.id, component);
+ }
+ this.#rebuildComponentTree(surface);
+ }
+
+ #handleDataModelUpdate(message: DataModelUpdate, surfaceId: SurfaceID): void {
+ const surface = this.#getOrCreateSurface(surfaceId);
+ const path = message.path ?? "/";
+ this.#setDataByPath(
+ surface.dataModel,
+ path,
+ message.contents
+ );
+ this.#rebuildComponentTree(surface);
+ }
+
+ #handleDeleteSurface(message: DeleteSurfaceMessage): void {
+ this.#surfaces.delete(message.surfaceId);
+ }
+
+ /**
+ * Starts at the root component of the surface and builds out the tree
+ * recursively. This process involves resolving all properties of the child
+ * components, and expanding on any explicit children lists or templates
+ * found in the structure.
+ *
+ * @param surface The surface to be built.
+ */
+ #rebuildComponentTree(surface: Surface): void {
+ if (!surface.rootComponentId) {
+ surface.componentTree = null;
+ return;
+ }
+
+ // Track visited nodes to avoid circular references.
+ const visited = new this.#setCtor();
+ surface.componentTree = this.#buildNodeRecursive(
+ surface.rootComponentId,
+ surface,
+ visited,
+ "/",
+ "" // Initial idSuffix.
+ );
+ }
+
+ /** Finds a value key in a map. */
+ #findValueKey(value: Record): string | undefined {
+ return Object.keys(value).find((k) => k.startsWith("value"));
+ }
+
+ /**
+ * Builds out the nodes recursively.
+ */
+ #buildNodeRecursive(
+ baseComponentId: string,
+ surface: Surface,
+ visited: Set,
+ dataContextPath: string,
+ idSuffix = ""
+ ): AnyComponentNode | null {
+ const fullId = `${baseComponentId}${idSuffix}`; // Construct the full ID
+ const { components } = surface;
+
+ if (!components.has(baseComponentId)) {
+ return null;
+ }
+
+ if (visited.has(fullId)) {
+ throw new Error(`Circular dependency for component "${fullId}".`);
+ }
+
+ visited.add(fullId);
+
+ const componentData = components.get(baseComponentId)!;
+ const componentProps = componentData.component ?? {};
+ const componentType = Object.keys(componentProps)[0];
+ const unresolvedProperties =
+ componentProps[componentType as keyof typeof componentProps];
+
+ // Manually build the resolvedProperties object by resolving each value in
+ // the component's properties.
+ const resolvedProperties: ResolvedMap = new this.#objCtor() as ResolvedMap;
+ if (isObject(unresolvedProperties)) {
+ for (const [key, value] of Object.entries(unresolvedProperties)) {
+ resolvedProperties[key] = this.#resolvePropertyValue(
+ value,
+ surface,
+ visited,
+ dataContextPath,
+ idSuffix,
+ key
+ );
+ }
+ }
+
+ visited.delete(fullId);
+
+ // Now that we have the resolved properties in place we can go ahead and
+ // ensure that they meet expectations in terms of types and so forth,
+ // casting them into the specific shape for usage.
+ const baseNode = {
+ id: fullId,
+ dataContextPath,
+ weight: componentData.weight ?? "initial",
+ };
+ switch (componentType) {
+ case "Text":
+ if (!isResolvedText(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Text",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Image":
+ if (!isResolvedImage(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Image",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Icon":
+ if (!isResolvedIcon(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Icon",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Video":
+ if (!isResolvedVideo(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Video",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "AudioPlayer":
+ if (!isResolvedAudioPlayer(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "AudioPlayer",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Row":
+ if (!isResolvedRow(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Row",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Column":
+ if (!isResolvedColumn(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Column",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "List":
+ if (!isResolvedList(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "List",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Card":
+ if (!isResolvedCard(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Card",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Tabs":
+ if (!isResolvedTabs(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Tabs",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Divider":
+ if (!isResolvedDivider(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Divider",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Modal":
+ if (!isResolvedModal(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Modal",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Button":
+ if (!isResolvedButton(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Button",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "CheckBox":
+ if (!isResolvedCheckbox(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "CheckBox",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "TextField":
+ if (!isResolvedTextField(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "TextField",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "DateTimeInput":
+ if (!isResolvedDateTimeInput(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "DateTimeInput",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "MultipleChoice":
+ if (!isResolvedMultipleChoice(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "MultipleChoice",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ case "Slider":
+ if (!isResolvedSlider(resolvedProperties)) {
+ throw new Error(`Invalid data; expected ${componentType}`);
+ }
+ return new this.#objCtor({
+ ...baseNode,
+ type: "Slider",
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+
+ default:
+ // Catch-all for other custom component types.
+ return new this.#objCtor({
+ ...baseNode,
+ type: componentType,
+ properties: resolvedProperties,
+ }) as AnyComponentNode;
+ }
+ }
+
+ /**
+ * Recursively resolves an individual property value. If a property indicates
+ * a child node (a string that matches a component ID), an explicitList of
+ * children, or a template, these will be built out here.
+ */
+ #resolvePropertyValue(
+ value: unknown,
+ surface: Surface,
+ visited: Set,
+ dataContextPath: string,
+ idSuffix = "",
+ propertyKey: string | null = null
+ ): ResolvedValue {
+ const isComponentIdReferenceKey = (key: string) =>
+ key === "child" || key.endsWith("Child");
+
+ // 1. If it's a string that matches a component ID, build that node.
+ if (
+ typeof value === "string" &&
+ propertyKey &&
+ isComponentIdReferenceKey(propertyKey) &&
+ surface.components.has(value)
+ ) {
+ return this.#buildNodeRecursive(
+ value,
+ surface,
+ visited,
+ dataContextPath,
+ idSuffix
+ );
+ }
+
+ // 2. If it's a ComponentArrayReference (e.g., a `children` property),
+ // resolve the list and return an array of nodes.
+ if (isComponentArrayReference(value)) {
+ if (value.explicitList) {
+ return value.explicitList.map((id) =>
+ this.#buildNodeRecursive(
+ id,
+ surface,
+ visited,
+ dataContextPath,
+ idSuffix
+ )
+ );
+ }
+
+ if (value.template) {
+ const fullDataPath = this.resolvePath(
+ value.template.dataBinding,
+ dataContextPath
+ );
+ const data = this.#getDataByPath(surface.dataModel, fullDataPath);
+
+ const template = value.template;
+ // Handle Array data.
+ if (Array.isArray(data)) {
+ return data.map((_, index) => {
+ // Create a synthetic ID based on the template ID and the
+ // full index path of the data (e.g., template-id:0:1)
+ const parentIndices = dataContextPath
+ .split("/")
+ .filter((segment) => /^\d+$/.test(segment));
+
+ const newIndices = [...parentIndices, index];
+ const newSuffix = `:${newIndices.join(":")}`;
+ const childDataContextPath = `${fullDataPath}/${index}`;
+
+ return this.#buildNodeRecursive(
+ template.componentId, // baseId
+ surface,
+ visited,
+ childDataContextPath,
+ newSuffix // new suffix
+ );
+ });
+ }
+
+ // Handle Map data.
+ const mapCtor = this.#mapCtor;
+ if (data instanceof mapCtor) {
+ return Array.from(data.keys(), (key) => {
+ const newSuffix = `:${key}`;
+ const childDataContextPath = `${fullDataPath}/${key}`;
+
+ return this.#buildNodeRecursive(
+ template.componentId, // baseId
+ surface,
+ visited,
+ childDataContextPath,
+ newSuffix // new suffix
+ );
+ });
+ }
+
+ // Return empty array if the data is not ready yet.
+ return new this.#arrayCtor();
+ }
+ }
+
+ // 3. If it's a plain array, resolve each of its items.
+ if (Array.isArray(value)) {
+ return value.map((item) =>
+ this.#resolvePropertyValue(
+ item,
+ surface,
+ visited,
+ dataContextPath,
+ idSuffix,
+ propertyKey
+ )
+ );
+ }
+
+ // 4. If it's a plain object, resolve each of its properties.
+ if (isObject(value)) {
+ const newObj: ResolvedMap = new this.#objCtor() as ResolvedMap;
+ for (const [key, propValue] of Object.entries(value)) {
+ // Special case for paths. Here we might get /item/ or ./ on the front
+ // of the path which isn't what we want. In this case we check the
+ // dataContextPath and if 1) it's not the default and 2) we also see the
+ // path beginning with /item/ or ./we trim it.
+ let propertyValue = propValue;
+ if (isPath(key, propValue) && dataContextPath !== "/") {
+ propertyValue = propValue
+ .replace(/^\.?\/item/, "")
+ .replace(/^\.?\/text/, "")
+ .replace(/^\.?\/label/, "")
+ .replace(/^\.?\//, "");
+ newObj[key] = propertyValue as ResolvedValue;
+ continue;
+ }
+
+ newObj[key] = this.#resolvePropertyValue(
+ propertyValue,
+ surface,
+ visited,
+ dataContextPath,
+ idSuffix,
+ key
+ );
+ }
+ return newObj;
+ }
+
+ // 5. Otherwise, it's a primitive value.
+ return value as ResolvedValue;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/data/signal-model-processor.ts b/vendor/a2ui/renderers/lit/src/0.8/data/signal-model-processor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e821c152118ebbc7ef3cebc93c71f28a2cf87535
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/data/signal-model-processor.ts
@@ -0,0 +1,31 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { A2uiMessageProcessor } from "./model-processor.js";
+
+import { SignalArray } from "signal-utils/array";
+import { SignalMap } from "signal-utils/map";
+import { SignalObject } from "signal-utils/object";
+import { SignalSet } from "signal-utils/set";
+
+export function create() {
+ return new A2uiMessageProcessor({
+ arrayCtor: SignalArray as unknown as ArrayConstructor,
+ mapCtor: SignalMap as unknown as MapConstructor,
+ objCtor: SignalObject as unknown as ObjectConstructor,
+ setCtor: SignalSet as unknown as SetConstructor,
+ });
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/events/a2ui.ts b/vendor/a2ui/renderers/lit/src/0.8/events/a2ui.ts
new file mode 100644
index 0000000000000000000000000000000000000000..88a41ea7de81deb54ba7b5a9418d14adc2bf4b43
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/events/a2ui.ts
@@ -0,0 +1,28 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { Action } from "../types/components.js";
+import { AnyComponentNode } from "../types/types.js";
+import { BaseEventDetail } from "./base.js";
+
+type Namespace = "a2ui";
+
+export interface A2UIAction extends BaseEventDetail<`${Namespace}.action`> {
+ readonly action: Action;
+ readonly dataContextPath: string;
+ readonly sourceComponentId: string;
+ readonly sourceComponent: AnyComponentNode | null;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/events/base.ts b/vendor/a2ui/renderers/lit/src/0.8/events/base.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5aeb4744837a0ca04d4895afc45d7bee40b1e0d0
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/events/base.ts
@@ -0,0 +1,19 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export interface BaseEventDetail {
+ readonly eventType: EventType;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/events/events.ts b/vendor/a2ui/renderers/lit/src/0.8/events/events.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d1c412e28b00f7ca7192980c67ec65de0d2e6638
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/events/events.ts
@@ -0,0 +1,53 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import type * as A2UI from "./a2ui.js";
+import { BaseEventDetail } from "./base.js";
+
+const eventInit = {
+ bubbles: true,
+ cancelable: true,
+ composed: true,
+};
+
+type EnforceEventTypeMatch>> =
+ {
+ [K in keyof T]: T[K] extends BaseEventDetail
+ ? EventType extends K
+ ? T[K]
+ : never
+ : never;
+ };
+
+export type StateEventDetailMap = EnforceEventTypeMatch<{
+ "a2ui.action": A2UI.A2UIAction;
+}>;
+
+export class StateEvent<
+ T extends keyof StateEventDetailMap
+> extends CustomEvent {
+ static eventName = "a2uiaction";
+
+ constructor(readonly payload: StateEventDetailMap[T]) {
+ super(StateEvent.eventName, { detail: payload, ...eventInit });
+ }
+}
+
+declare global {
+ interface HTMLElementEventMap {
+ a2uiaction: StateEvent<"a2ui.action">;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/index.ts b/vendor/a2ui/renderers/lit/src/0.8/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ab41af4b71ec3961a96b5a19e80802625804addc
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/index.ts
@@ -0,0 +1,18 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export * from "./core.js";
+export * as UI from "./ui/ui.js";
diff --git a/vendor/a2ui/renderers/lit/src/0.8/model.test.ts b/vendor/a2ui/renderers/lit/src/0.8/model.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e3a41c56bf8dd1b987ecb06aab3b9a7ad043f0cf
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/model.test.ts
@@ -0,0 +1,1376 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import assert from "node:assert";
+import { describe, it, beforeEach } from "node:test";
+import { v0_8 } from "@a2ui/lit";
+import { DataMap, DataValue } from "./types/types";
+
+// Helper function to strip reactivity for clean comparisons.
+const toPlainObject = (value: unknown): ReturnType => {
+ if (value instanceof Map) {
+ return Object.fromEntries(
+ Array.from(value.entries(), ([k, v]) => [k, toPlainObject(v)])
+ );
+ }
+ if (Array.isArray(value)) {
+ return value.map(toPlainObject);
+ }
+ if (
+ v0_8.Data.Guards.isObject(value) &&
+ value.constructor.name === "SignalObject"
+ ) {
+ const obj: Record = {};
+ for (const key in value) {
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
+ obj[key] = toPlainObject(value[key]);
+ }
+ }
+ return obj;
+ }
+
+ return value;
+};
+
+describe("A2uiMessageProcessor", () => {
+ let processor = new v0_8.Data.A2uiMessageProcessor();
+
+ beforeEach(() => {
+ processor = new v0_8.Data.A2uiMessageProcessor();
+ });
+
+ describe("Basic Initialization and State", () => {
+ it("should start with no surfaces", () => {
+ assert.strictEqual(processor.getSurfaces().size, 0);
+ });
+
+ it("should clear surfaces when clearSurfaces is called", () => {
+ processor.processMessages([
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+ assert.strictEqual(processor.getSurfaces().size, 1);
+ processor.clearSurfaces();
+ assert.strictEqual(processor.getSurfaces().size, 0);
+ });
+ });
+
+ describe("Message Processing", () => {
+ it("should handle `beginRendering` by creating a default surface", () => {
+ processor.processMessages([
+ {
+ beginRendering: {
+ root: "comp-a",
+ styles: { color: "blue" },
+ surfaceId: "@default",
+ },
+ },
+ ]);
+ const surfaces = processor.getSurfaces();
+ assert.strictEqual(surfaces.size, 1);
+
+ const defaultSurface = surfaces.get("@default");
+ assert.ok(defaultSurface, "Default surface should exist");
+ assert.strictEqual(defaultSurface!.rootComponentId, "comp-a");
+ assert.deepStrictEqual(defaultSurface!.styles, { color: "blue" });
+ });
+
+ it("should handle `surfaceUpdate` by adding components", () => {
+ const messages = [
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "comp-a",
+ component: {
+ Text: { text: { literalString: "Hi" } },
+ },
+ },
+ ],
+ },
+ },
+ ];
+ processor.processMessages(messages);
+ const surface = processor.getSurfaces().get("@default");
+ if (!surface) {
+ assert.fail("No default surface");
+ }
+ assert.strictEqual(surface!.components.size, 1);
+ assert.ok(surface!.components.has("comp-a"));
+ });
+
+ it("should handle `deleteSurface`", () => {
+ processor.processMessages([
+ {
+ beginRendering: { root: "root", surfaceId: "to-delete" },
+ },
+ { deleteSurface: { surfaceId: "to-delete" } },
+ ]);
+ assert.strictEqual(processor.getSurfaces().has("to-delete"), false);
+ });
+ });
+
+ describe("Data Model Updates", () => {
+ it("should update data at a specified path", () => {
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/user",
+ contents: [{ key: "name", valueString: "Alice" }],
+ },
+ },
+ ]);
+ const name = processor.getData(
+ { dataContextPath: "/" } as v0_8.Types.AnyComponentNode,
+ "/user/name"
+ );
+ assert.strictEqual(name, "Alice");
+ });
+
+ it("should replace the entire data model when path is not provided", () => {
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [
+ { key: "user", valueString: JSON.stringify({ name: "Bob" }) },
+ ],
+ },
+ },
+ ]);
+ const user = processor.getData(
+ { dataContextPath: "/" } as v0_8.Types.AnyComponentNode,
+ "/user"
+ );
+ assert.deepStrictEqual(toPlainObject(user), { name: "Bob" });
+ });
+
+ it("should create nested structures when setting data", () => {
+ const component = { dataContextPath: "/" } as v0_8.Types.AnyComponentNode;
+ // Note: setData is a public method that does not use the key-value format
+ processor.setData(component, "/a/b/c", "value");
+ const data = processor.getData(component, "/a/b/c");
+ assert.strictEqual(data, "value");
+ });
+
+ it("should handle paths correctly", () => {
+ const path1 = processor.resolvePath("/a/b/c", "/value");
+ const path2 = processor.resolvePath("a/b/c", "/value/");
+ const path3 = processor.resolvePath("a/b/c", "/value");
+
+ assert.strictEqual(path1, "/a/b/c");
+ assert.strictEqual(path2, "/value/a/b/c");
+ assert.strictEqual(path3, "/value/a/b/c");
+ });
+
+ it("should correctly parse nested valueMap structures", () => {
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/data",
+ contents: [
+ {
+ key: "users", // /data/users
+ valueMap: [
+ {
+ key: "user1", // /data/users/user1
+ valueMap: [
+ {
+ key: "firstName",
+ valueString: "Alice",
+ },
+ {
+ key: "lastName",
+ valueString: "Doe",
+ },
+ ],
+ },
+ {
+ key: "user2", // /data/users/user2
+ valueMap: [
+ {
+ key: "firstName",
+ valueString: "John",
+ },
+ {
+ key: "lastName",
+ valueString: "Doe",
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ },
+ ]);
+
+ const info = processor.getData(
+ { dataContextPath: "/" } as v0_8.Types.AnyComponentNode,
+ "/data/users"
+ );
+
+ // The expected result is a Map of Maps.
+ const expected = new Map([
+ [
+ "user1",
+ new Map([
+ ["firstName", "Alice"],
+ ["lastName", "Doe"],
+ ]),
+ ],
+ [
+ "user2",
+ new Map([
+ ["firstName", "John"],
+ ["lastName", "Doe"],
+ ]),
+ ],
+ ]);
+
+ assert.deepEqual(info, expected);
+ });
+
+ it("should additively update a Map using numeric-string keys (like timestamps)", () => {
+ // 1. First, establish the /messages path as a Map.
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/messages",
+ contents: [
+ // Sending an empty key-value array creates an empty Map at the path.
+ ],
+ },
+ },
+ ]);
+
+ const key1 = "1700000000001";
+ const message1 = "Hello";
+
+ // 2. Add the first message.
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: `/messages/${key1}`,
+ contents: [
+ {
+ key: ".",
+ valueString: message1,
+ },
+ ],
+ },
+ },
+ ]);
+
+ let messagesData = processor.getData(
+ { dataContextPath: "/" } as v0_8.Types.AnyComponentNode,
+ "/messages"
+ );
+
+ // Check that it's a Map and has the first item.
+ assertIsDataMap(messagesData);
+ assert.strictEqual(messagesData.size, 1);
+ assert.strictEqual(messagesData.get(key1), message1);
+
+ const key2 = "1700000000002";
+ const message2 = "World";
+
+ // 3. Add the second message. This is where the old logic would fail.
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: `/messages/${key2}`,
+ contents: [
+ {
+ key: ".",
+ valueString: message2,
+ },
+ ],
+ },
+ },
+ ]);
+
+ messagesData = processor.getData(
+ { dataContextPath: "/" } as v0_8.Types.AnyComponentNode,
+ "/messages"
+ );
+
+ // 4. Check that the Map was additively updated and now has both items.
+ assertIsDataMap(messagesData);
+ assert.strictEqual(messagesData.size, 2, "Map should have 2 items total");
+ assert.strictEqual(
+ (messagesData as DataMap).get(key1),
+ message1,
+ "First item correct"
+ );
+ assert.strictEqual(
+ messagesData.get(key2),
+ message2,
+ "Second item correct"
+ );
+ });
+ });
+
+ describe("Component Tree Building", () => {
+ it("should build a simple parent-child tree", () => {
+ processor.processMessages([
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ Column: { children: { explicitList: ["child"] } },
+ },
+ },
+ {
+ id: "child",
+ component: {
+ Text: { text: { literalString: "Hello" } },
+ },
+ },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+
+ assert.strictEqual(plainTree.id, "root");
+ assert.strictEqual(plainTree.type, "Column");
+ assert.strictEqual(plainTree.properties.children.length, 1);
+ assert.strictEqual(plainTree.properties.children[0].id, "child");
+ assert.strictEqual(plainTree.properties.children[0].type, "Text");
+ });
+
+ it("should not treat enum-like strings as child component IDs", () => {
+ processor.processMessages([
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ Column: { children: { explicitList: ["body"] } },
+ },
+ },
+ {
+ id: "body",
+ component: {
+ Text: {
+ text: { literalString: "Hello" },
+ usageHint: "body",
+ },
+ },
+ },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+ assert.strictEqual(plainTree.id, "root");
+ assert.strictEqual(plainTree.properties.children[0].id, "body");
+ assert.strictEqual(plainTree.properties.children[0].type, "Text");
+ });
+
+ it("should throw an error on circular dependencies", () => {
+ // First, load the components
+ processor.processMessages([
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ { id: "a", component: { Card: { child: "b" } } },
+ { id: "b", component: { Card: { child: "a" } } },
+ ],
+ },
+ },
+ ]);
+
+ // Now, try to render, which triggers the tree build
+ assert.throws(() => {
+ processor.processMessages([
+ {
+ beginRendering: {
+ root: "a",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+ }, new Error(`Circular dependency for component "a".`));
+
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ assert.strictEqual(
+ tree,
+ null,
+ "Tree should be null due to circular dependency"
+ );
+ });
+
+ it("should correctly expand a template with `dataBinding`", () => {
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [
+ {
+ key: "items",
+ valueString: JSON.stringify([{ name: "A" }, { name: "B" }]),
+ },
+ ],
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ List: {
+ children: {
+ template: {
+ componentId: "item-template",
+ dataBinding: "/items",
+ },
+ },
+ },
+ },
+ },
+ {
+ id: "item-template",
+ component: { Text: { text: { path: "/name" } } },
+ },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+
+ assert.strictEqual(plainTree.properties.children.length, 2);
+
+ // Check first generated child.
+ const child1 = plainTree.properties.children[0];
+ assert.strictEqual(child1.id, "item-template:0");
+ assert.strictEqual(child1.type, "Text");
+ assert.strictEqual(child1.dataContextPath, "/items/0");
+ assert.deepStrictEqual(child1.properties.text, { path: "name" });
+
+ // Check second generated child.
+ const child2 = plainTree.properties.children[1];
+ assert.strictEqual(child2.id, "item-template:1");
+ assert.strictEqual(child2.type, "Text");
+ assert.strictEqual(child2.dataContextPath, "/items/1");
+ assert.deepStrictEqual(child2.properties.text, { path: "name" });
+ });
+
+ it("should rebuild the tree when data for a template arrives later", () => {
+ processor.processMessages([
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ List: {
+ children: {
+ template: {
+ componentId: "item-template",
+ dataBinding: "/items",
+ },
+ },
+ },
+ },
+ },
+ {
+ id: "item-template",
+ component: { Text: { text: { path: "/name" } } },
+ },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+
+ let tree = processor.getSurfaces().get("@default")?.componentTree;
+ assert.strictEqual(
+ toPlainObject(tree).properties.children.length,
+ 0,
+ "Children should be empty before data arrives"
+ );
+
+ // Now, the data arrives.
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [
+ {
+ key: "items",
+ valueString: JSON.stringify([{ name: "A" }, { name: "B" }]),
+ },
+ ],
+ },
+ },
+ ]);
+
+ tree = processor.getSurfaces().get("@default")?.componentTree;
+ assert.strictEqual(
+ toPlainObject(tree).properties.children.length,
+ 2,
+ "Children should be populated after data arrives"
+ );
+ });
+
+ it("should trim relative paths within a data context (./item)", () => {
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [
+ {
+ key: "items",
+ valueString: JSON.stringify([{ name: "A" }, { name: "B" }]),
+ },
+ ],
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ List: {
+ children: {
+ template: {
+ componentId: "item-template",
+ dataBinding: "/items",
+ },
+ },
+ },
+ },
+ },
+ // These paths would are typical when a databinding is used.
+ {
+ id: "item-template",
+ component: { Text: { text: { path: "./item/name" } } },
+ },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+ const child1 = plainTree.properties.children[0];
+ const child2 = plainTree.properties.children[1];
+
+ // The processor should have trimmed `/item` and `./` from the path
+ // because we are inside a data context.
+ assert.deepEqual(child1.properties.text, { path: "name" });
+ assert.deepEqual(child2.properties.text, { path: "name" });
+ });
+
+ it("should trim relative paths within a data context (./name)", () => {
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [
+ {
+ key: "items",
+ valueString: JSON.stringify([{ name: "A" }, { name: "B" }]),
+ },
+ ],
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ List: {
+ children: {
+ template: {
+ componentId: "item-template",
+ dataBinding: "/items",
+ },
+ },
+ },
+ },
+ },
+ // These paths would are typical when a databinding is used.
+ {
+ id: "item-template",
+ component: { Text: { text: { path: "./name" } } },
+ },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+ const child1 = plainTree.properties.children[0];
+ const child2 = plainTree.properties.children[1];
+
+ // The processor should have trimmed `./` from the path
+ // because we are inside a data context.
+ assert.deepEqual(child1.properties.text, { path: "name" });
+ assert.deepEqual(child2.properties.text, { path: "name" });
+ });
+ });
+
+ describe("Data Normalization and Parsing", () => {
+ it("should correctly handle and parse the key-value array data format at the root", () => {
+ const messages = [
+ {
+ dataModelUpdate: {
+ surfaceId: "test-surface",
+ path: "/",
+ contents: [
+ { key: "title", valueString: "My Title" },
+ {
+ key: "items",
+ valueString: '[{"id": 1}, {"id": 2}]',
+ },
+ ],
+ },
+ },
+ ];
+
+ processor.processMessages(messages);
+
+ const component = { dataContextPath: "/" } as v0_8.Types.AnyComponentNode;
+ const title = processor.getData(component, "/title", "test-surface");
+ const items = processor.getData(component, "/items", "test-surface");
+
+ assert.strictEqual(title, "My Title");
+ assert.deepStrictEqual(toPlainObject(items), [{ id: 1 }, { id: 2 }]);
+ });
+
+ it("should fallback to a string if stringified JSON is invalid", () => {
+ const invalidJSON = '[{"id": 1}, {"id": 2}'; // Missing closing bracket
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [{ key: "badData", valueString: invalidJSON }],
+ },
+ },
+ ]);
+
+ const component = { dataContextPath: "/" } as v0_8.Types.AnyComponentNode;
+ const badData = processor.getData(component, "/badData");
+ assert.strictEqual(badData, invalidJSON);
+ });
+ });
+
+ describe("Complex Template Scenarios", () => {
+ it("should correctly expand a template with dataBinding to a Map (from valueMap)", () => {
+ const messages = [
+ {
+ beginRendering: {
+ surfaceId: "default",
+ root: "root-column",
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "default",
+ components: [
+ {
+ id: "root-column",
+ component: {
+ Column: {
+ children: {
+ explicitList: ["title-heading", "item-list"],
+ },
+ },
+ },
+ },
+ {
+ id: "title-heading",
+ component: {
+ Text: {
+ text: {
+ literalString: "Top Restaurants",
+ },
+ },
+ usageHint: "h1",
+ },
+ },
+ {
+ id: "item-list",
+ component: {
+ List: {
+ direction: "vertical",
+ children: {
+ template: {
+ componentId: "item-card-template",
+ dataBinding: "/items",
+ },
+ },
+ },
+ },
+ },
+ {
+ id: "item-card-template",
+ component: {
+ Card: {
+ child: "card-layout",
+ },
+ },
+ },
+ {
+ id: "card-layout",
+ component: {
+ Row: {
+ children: {
+ explicitList: ["template-image", "card-details"],
+ },
+ },
+ },
+ },
+ {
+ id: "template-image",
+ weight: 1,
+ component: {
+ Image: {
+ url: {
+ path: "imageUrl",
+ },
+ },
+ },
+ },
+ {
+ id: "card-details",
+ weight: 2,
+ component: {
+ Column: {
+ children: {
+ explicitList: [
+ "template-name",
+ "template-rating",
+ "template-detail",
+ "template-link",
+ "template-book-button",
+ ],
+ },
+ },
+ },
+ },
+ {
+ id: "template-name",
+ component: {
+ Text: {
+ text: {
+ path: "name",
+ },
+ },
+ usageHint: "h3",
+ },
+ },
+ {
+ id: "template-rating",
+ component: {
+ Text: {
+ text: {
+ path: "rating",
+ },
+ },
+ },
+ },
+ {
+ id: "template-detail",
+ component: {
+ Text: {
+ text: {
+ path: "detail",
+ },
+ },
+ },
+ },
+ {
+ id: "template-link",
+ component: {
+ Text: {
+ text: {
+ path: "infoLink",
+ },
+ },
+ },
+ },
+ {
+ id: "template-book-button",
+ component: {
+ Button: {
+ child: "book-now-text",
+ action: {
+ name: "book_restaurant",
+ context: [
+ {
+ key: "restaurantName",
+ value: {
+ path: "name",
+ },
+ },
+ {
+ key: "imageUrl",
+ value: {
+ path: "imageUrl",
+ },
+ },
+ {
+ key: "address",
+ value: {
+ path: "address",
+ },
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ id: "book-now-text",
+ component: {
+ Text: {
+ text: {
+ literalString: "Book Now",
+ },
+ },
+ },
+ },
+ ],
+ },
+ },
+ {
+ dataModelUpdate: {
+ surfaceId: "default",
+ path: "/",
+ contents: [
+ {
+ key: "items",
+ valueMap: [
+ {
+ key: "item1",
+ valueMap: [
+ {
+ key: "name",
+ valueString: "Business 1",
+ },
+ {
+ key: "rating",
+ valueString: "★★★★☆",
+ },
+ {
+ key: "detail",
+ valueString: "Spicy and savory hand-pulled noodles.",
+ },
+ {
+ key: "infoLink",
+ valueString: "[More Info](https://www.example.com/)",
+ },
+ {
+ key: "imageUrl",
+ valueString:
+ "http://www.example.com/static/shrimpchowmein.jpeg",
+ },
+ {
+ key: "address",
+ valueString: "Address 1",
+ },
+ ],
+ },
+ {
+ key: "item2",
+ valueMap: [
+ {
+ key: "name",
+ valueString: "Business 2",
+ },
+ {
+ key: "rating",
+ valueString: "★★★★☆",
+ },
+ {
+ key: "detail",
+ valueString: "Authentic and real.",
+ },
+ {
+ key: "infoLink",
+ valueString: "[More Info](https://www.example.com/)",
+ },
+ {
+ key: "imageUrl",
+ valueString:
+ "http://www.example.com/static/mapotofu.jpeg",
+ },
+ {
+ key: "address",
+ valueString: "Address 2",
+ },
+ ],
+ },
+ {
+ key: "item3",
+ valueMap: [
+ {
+ key: "name",
+ valueString: "Business 3",
+ },
+ {
+ key: "rating",
+ valueString: "★★★★☆",
+ },
+ {
+ key: "detail",
+ valueString:
+ "Modern food with a farm-to-table approach.",
+ },
+ {
+ key: "infoLink",
+ valueString: "[More Info](https://www.example.com/)",
+ },
+ {
+ key: "imageUrl",
+ valueString:
+ "http://www.example.com/static/beefbroccoli.jpeg",
+ },
+ {
+ key: "address",
+ valueString: "Address 3",
+ },
+ ],
+ },
+ {
+ key: "item4",
+ valueMap: [
+ {
+ key: "name",
+ valueString: "Business 4",
+ },
+ {
+ key: "rating",
+ valueString: "★★★★★",
+ },
+ {
+ key: "detail",
+ valueString: "Upscale dining.",
+ },
+ {
+ key: "infoLink",
+ valueString: "[More Info](https://www.example.com/)",
+ },
+ {
+ key: "imageUrl",
+ valueString:
+ "http://www.example.com/static/springrolls.jpeg",
+ },
+ {
+ key: "address",
+ valueString: "Address 4",
+ },
+ ],
+ },
+ {
+ key: "item5",
+ valueMap: [
+ {
+ key: "name",
+ valueString: "Business 5",
+ },
+ {
+ key: "rating",
+ valueString: "★★★★☆",
+ },
+ {
+ key: "detail",
+ valueString: "Famous for its noodles.",
+ },
+ {
+ key: "infoLink",
+ valueString: "[More Info](https://www.example.com/)",
+ },
+ {
+ key: "imageUrl",
+ valueString:
+ "http://www.example.com/static/kungpao.jpeg",
+ },
+ {
+ key: "address",
+ valueString: "Address 5",
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ },
+ ];
+
+ processor.processMessages(messages);
+ const tree = processor.getSurfaces().get("default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+
+ // 1. Find the "item-list" component (the List)
+ const itemList = plainTree.properties.children[1];
+ assert.strictEqual(itemList.id, "item-list");
+
+ // 2. Check that it expanded 5 children from the Map
+ const templateChildren = itemList.properties.children;
+ assert.strictEqual(templateChildren.length, 5);
+
+ // 3. Check the first generated child for correct key-based ID and data context
+ const child1 = templateChildren[0];
+ assert.strictEqual(child1.id, "item-card-template:item1");
+ assert.strictEqual(child1.dataContextPath, "/items/item1");
+
+ // 4. Go deeper to check the data binding on a nested component
+ // Path: Card -> Row -> Column -> Heading
+ const child1NameHeading =
+ child1.properties.child.properties.children[1].properties.children[0];
+ assert.strictEqual(child1NameHeading.id, "template-name:item1");
+ assert.strictEqual(child1NameHeading.dataContextPath, "/items/item1");
+ assert.deepStrictEqual(child1NameHeading.properties.text, {
+ path: "name",
+ });
+
+ // 5. Check the second generated child
+ const child2 = templateChildren[1];
+ assert.strictEqual(child2.id, "item-card-template:item2");
+ assert.strictEqual(child2.dataContextPath, "/items/item2");
+ });
+
+ it("should correctly expand nested templates with layered data contexts", () => {
+ const messages = [
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [
+ {
+ key: "days",
+ // The correct way to send an array of objects is as a stringified JSON.
+ valueString: JSON.stringify([
+ {
+ title: "Day 1",
+ activities: ["Morning Walk", "Museum Visit"],
+ },
+ {
+ title: "Day 2",
+ activities: ["Market Trip"],
+ },
+ ]),
+ },
+ ],
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ List: {
+ children: {
+ template: {
+ componentId: "day-list",
+ dataBinding: "/days",
+ },
+ },
+ },
+ },
+ },
+ {
+ id: "day-list",
+ component: {
+ Column: {
+ children: { explicitList: ["day-title", "activity-list"] },
+ },
+ },
+ },
+ {
+ id: "day-title",
+ component: {
+ Text: { text: { path: "title" }, usageHint: "h1" },
+ },
+ },
+ {
+ id: "activity-list",
+ component: {
+ List: {
+ children: {
+ template: {
+ componentId: "activity-text",
+ dataBinding: "activities",
+ },
+ },
+ },
+ },
+ },
+ {
+ id: "activity-text",
+ component: { Text: { text: { path: "." } } },
+ },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ];
+
+ processor.processMessages(messages);
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+
+ // Assert Day 1 structure
+ const day1 = plainTree.properties.children[0];
+ assert.strictEqual(day1.dataContextPath, "/days/0");
+ const day1Activities = day1.properties.children[1].properties.children;
+
+ assert.strictEqual(day1Activities.length, 2);
+ assert.strictEqual(day1Activities[0].id, "activity-text:0:0");
+ assert.strictEqual(
+ day1Activities[0].dataContextPath,
+ "/days/0/activities/0"
+ );
+ assert.deepStrictEqual(day1.properties.children[0].properties.text, {
+ path: "title",
+ });
+ assert.deepStrictEqual(day1Activities[0].properties.text, { path: "." });
+
+ // Assert Day 2 structure
+ const day2 = plainTree.properties.children[1];
+ assert.strictEqual(day2.dataContextPath, "/days/1");
+ const day2Activities = day2.properties.children[1].properties.children;
+ assert.strictEqual(day2Activities.length, 1);
+ assert.strictEqual(day2Activities[0].id, "activity-text:1:0");
+ assert.strictEqual(
+ day2Activities[0].dataContextPath,
+ "/days/1/activities/0"
+ );
+ assert.deepStrictEqual(day2.properties.children[0].properties.text, {
+ path: "title",
+ });
+ assert.deepStrictEqual(day2Activities[0].properties.text, { path: "." });
+ });
+
+ it("should correctly bind to primitive values in an array using path: '.'", () => {
+ processor.processMessages([
+ {
+ dataModelUpdate: {
+ surfaceId: "@default",
+ path: "/",
+ contents: [
+ {
+ key: "tags",
+ valueString: JSON.stringify(["travel", "paris", "guide"]),
+ },
+ ],
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "@default",
+ components: [
+ {
+ id: "root",
+ component: {
+ Row: {
+ children: {
+ template: { componentId: "tag", dataBinding: "/tags" },
+ },
+ },
+ },
+ },
+ { id: "tag", component: { Text: { text: { path: "." } } } },
+ ],
+ },
+ },
+ {
+ beginRendering: {
+ root: "root",
+ surfaceId: "@default",
+ },
+ },
+ ]);
+
+ const tree = processor.getSurfaces().get("@default")?.componentTree;
+ const plainTree = toPlainObject(tree);
+ const children = plainTree.properties.children;
+
+ assert.strictEqual(children.length, 3);
+ assert.strictEqual(children[0].dataContextPath, "/tags/0");
+ assert.deepEqual(children[0].properties.text, { path: "." });
+ assert.strictEqual(children[1].dataContextPath, "/tags/1");
+ assert.deepEqual(children[1].properties.text, { path: "." });
+ });
+ });
+
+ describe("Multi-Surface Interaction", () => {
+ it("should keep data and components for different surfaces separate", () => {
+ processor.processMessages([
+ // Surface A
+ {
+ dataModelUpdate: {
+ surfaceId: "A",
+ path: "/",
+ contents: [{ key: "name", valueString: "Surface A Data" }],
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "A",
+ components: [
+ {
+ id: "comp-a",
+ component: { Text: { text: { path: "/name" } } },
+ },
+ ],
+ },
+ },
+ { beginRendering: { root: "comp-a", surfaceId: "A" } },
+ // Surface B
+ {
+ dataModelUpdate: {
+ surfaceId: "B",
+ path: "/",
+ contents: [{ key: "name", valueString: "Surface B Data" }],
+ },
+ },
+ {
+ surfaceUpdate: {
+ surfaceId: "B",
+ components: [
+ {
+ id: "comp-b",
+ component: { Text: { text: { path: "/name" } } },
+ },
+ ],
+ },
+ },
+ { beginRendering: { root: "comp-b", surfaceId: "B" } },
+ ]);
+
+ const surfaces = processor.getSurfaces();
+ assert.strictEqual(surfaces.size, 2);
+
+ const surfaceA = surfaces.get("A");
+ const surfaceB = surfaces.get("B");
+
+ assert.ok(surfaceA && surfaceB, "Both surfaces should exist");
+
+ // Check Surface A
+ assert.ok(surfaceA, "Surface A exists.");
+ assert.strictEqual(surfaceA!.components.size, 1);
+ assert.ok(surfaceA!.components.has("comp-a"));
+ assert.deepStrictEqual(toPlainObject(surfaceA!.dataModel), {
+ name: "Surface A Data",
+ });
+ assert.deepStrictEqual(
+ toPlainObject(surfaceA!.componentTree).properties.text,
+ { path: "/name" }
+ );
+
+ // Check Surface B
+ assert.ok(surfaceB, "Surface B exists.");
+ assert.strictEqual(surfaceB!.components.size, 1);
+ assert.ok(surfaceB!.components.has("comp-b"));
+ assert.deepStrictEqual(toPlainObject(surfaceB!.dataModel), {
+ name: "Surface B Data",
+ });
+ assert.deepStrictEqual(
+ toPlainObject(surfaceB!.componentTree).properties.text,
+ { path: "/name" }
+ );
+ });
+ });
+});
+
+function assertIsDataMap(obj: DataValue): asserts obj is DataMap {
+ assert.ok(obj instanceof Map, `Data should be a DataMap`);
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/schemas/.gitignore b/vendor/a2ui/renderers/lit/src/0.8/schemas/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..496d370a3460879381796fc45840a456bfe3b5ee
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/schemas/.gitignore
@@ -0,0 +1,4 @@
+# Copied schema files
+# (needed for the build but otherwise redundant)
+*.json
+!server_to_client_with_standard_catalog.json
diff --git a/vendor/a2ui/renderers/lit/src/0.8/schemas/server_to_client_with_standard_catalog.json b/vendor/a2ui/renderers/lit/src/0.8/schemas/server_to_client_with_standard_catalog.json
new file mode 100644
index 0000000000000000000000000000000000000000..d3e71f5f92239e66a064cfc28500ddb4d145be15
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/schemas/server_to_client_with_standard_catalog.json
@@ -0,0 +1,827 @@
+{
+ "title": "A2UI Message Schema",
+ "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "beginRendering": {
+ "type": "object",
+ "description": "Signals the client to begin rendering a surface with a root component and specific styles.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be rendered."
+ },
+ "root": {
+ "type": "string",
+ "description": "The ID of the root component to render."
+ },
+ "styles": {
+ "type": "object",
+ "description": "Styling information for the UI.",
+ "additionalProperties": false,
+ "properties": {
+ "font": {
+ "type": "string",
+ "description": "The primary font for the UI."
+ },
+ "primaryColor": {
+ "type": "string",
+ "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ }
+ }
+ },
+ "required": ["root", "surfaceId"]
+ },
+ "surfaceUpdate": {
+ "type": "object",
+ "description": "Updates a surface with a new set of components.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be updated. If you are adding a new surface this *must* be a new, unique identified that has never been used for any existing surfaces shown."
+ },
+ "components": {
+ "type": "array",
+ "description": "A list containing all UI components for the surface.",
+ "minItems": 1,
+ "items": {
+ "type": "object",
+ "description": "Represents a *single* component in a UI widget tree. This component could be one of many supported types.",
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier for this component."
+ },
+ "weight": {
+ "type": "number",
+ "description": "The relative weight of this component within a Row or Column. This corresponds to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column."
+ },
+ "component": {
+ "type": "object",
+ "description": "A wrapper object that MUST contain exactly one key, which is the name of the component type (e.g., 'Heading'). The value is an object containing the properties for that specific component.",
+ "additionalProperties": false,
+ "properties": {
+ "Text": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "text": {
+ "type": "object",
+ "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation.",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.",
+ "enum": [
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "caption",
+ "body"
+ ]
+ }
+ },
+ "required": ["text"]
+ },
+ "Image": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "fit": {
+ "type": "string",
+ "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.",
+ "enum": [
+ "contain",
+ "cover",
+ "fill",
+ "none",
+ "scale-down"
+ ]
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.",
+ "enum": [
+ "icon",
+ "avatar",
+ "smallFeature",
+ "mediumFeature",
+ "largeFeature",
+ "header"
+ ]
+ }
+ },
+ "required": ["url"]
+ },
+ "Icon": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "object",
+ "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string",
+ "enum": [
+ "accountCircle",
+ "add",
+ "arrowBack",
+ "arrowForward",
+ "attachFile",
+ "calendarToday",
+ "call",
+ "camera",
+ "check",
+ "close",
+ "delete",
+ "download",
+ "edit",
+ "event",
+ "error",
+ "favorite",
+ "favoriteOff",
+ "folder",
+ "help",
+ "home",
+ "info",
+ "locationOn",
+ "lock",
+ "lockOpen",
+ "mail",
+ "menu",
+ "moreVert",
+ "moreHoriz",
+ "notificationsOff",
+ "notifications",
+ "payment",
+ "person",
+ "phone",
+ "photo",
+ "print",
+ "refresh",
+ "search",
+ "send",
+ "settings",
+ "share",
+ "shoppingCart",
+ "star",
+ "starHalf",
+ "starOff",
+ "upload",
+ "visibility",
+ "visibilityOff",
+ "warning"
+ ]
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["name"]
+ },
+ "Video": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["url"]
+ },
+ "AudioPlayer": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "description": {
+ "type": "object",
+ "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["url"]
+ },
+ "Row": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.",
+ "enum": [
+ "center",
+ "end",
+ "spaceAround",
+ "spaceBetween",
+ "spaceEvenly",
+ "start"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "Column": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.",
+ "enum": [
+ "start",
+ "center",
+ "end",
+ "spaceBetween",
+ "spaceAround",
+ "spaceEvenly"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.",
+ "enum": ["center", "end", "start", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "List": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "direction": {
+ "type": "string",
+ "description": "The direction in which the list items are laid out.",
+ "enum": ["vertical", "horizontal"]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis.",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "Card": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "child": {
+ "type": "string",
+ "description": "The ID of the component to be rendered inside the card."
+ }
+ },
+ "required": ["child"]
+ },
+ "Tabs": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "tabItems": {
+ "type": "array",
+ "description": "An array of objects, where each object defines a tab with a title and a child component.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "title": {
+ "type": "object",
+ "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "child": {
+ "type": "string"
+ }
+ },
+ "required": ["title", "child"]
+ }
+ }
+ },
+ "required": ["tabItems"]
+ },
+ "Divider": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "axis": {
+ "type": "string",
+ "description": "The orientation of the divider.",
+ "enum": ["horizontal", "vertical"]
+ }
+ }
+ },
+ "Modal": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "entryPointChild": {
+ "type": "string",
+ "description": "The ID of the component that opens the modal when interacted with (e.g., a button)."
+ },
+ "contentChild": {
+ "type": "string",
+ "description": "The ID of the component to be displayed inside the modal."
+ }
+ },
+ "required": ["entryPointChild", "contentChild"]
+ },
+ "Button": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "child": {
+ "type": "string",
+ "description": "The ID of the component to display in the button, typically a Text component."
+ },
+ "primary": {
+ "type": "boolean",
+ "description": "Indicates if this button should be styled as the primary action."
+ },
+ "action": {
+ "type": "object",
+ "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "context": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "value": {
+ "type": "object",
+ "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "path": {
+ "type": "string"
+ },
+ "literalString": {
+ "type": "string"
+ },
+ "literalNumber": {
+ "type": "number"
+ },
+ "literalBoolean": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "required": ["key", "value"]
+ }
+ }
+ },
+ "required": ["name"]
+ }
+ },
+ "required": ["child", "action"]
+ },
+ "CheckBox": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').",
+ "additionalProperties": false,
+ "properties": {
+ "literalBoolean": {
+ "type": "boolean"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["label", "value"]
+ },
+ "TextField": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "textFieldType": {
+ "type": "string",
+ "description": "The type of input field to display.",
+ "enum": [
+ "date",
+ "longText",
+ "number",
+ "shortText",
+ "obscured"
+ ]
+ },
+ "validationRegexp": {
+ "type": "string",
+ "description": "A regular expression used for client-side validation of the input."
+ }
+ },
+ "required": ["label"]
+ },
+ "DateTimeInput": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "value": {
+ "type": "object",
+ "description": "The selected date and/or time value. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "enableDate": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a date."
+ },
+ "enableTime": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a time."
+ },
+ "outputFormat": {
+ "type": "string",
+ "description": "The desired format for the output string after a date or time is selected."
+ }
+ },
+ "required": ["value"]
+ },
+ "MultipleChoice": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "selections": {
+ "type": "object",
+ "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').",
+ "additionalProperties": false,
+ "properties": {
+ "literalArray": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of available options for the user to choose from.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "value": {
+ "type": "string",
+ "description": "The value to be associated with this option when selected."
+ }
+ },
+ "required": ["label", "value"]
+ }
+ },
+ "maxAllowedSelections": {
+ "type": "integer",
+ "description": "The maximum number of options that the user is allowed to select."
+ }
+ },
+ "required": ["selections", "options"]
+ },
+ "Slider": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "value": {
+ "type": "object",
+ "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').",
+ "additionalProperties": false,
+ "properties": {
+ "literalNumber": {
+ "type": "number"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "minValue": {
+ "type": "number",
+ "description": "The minimum value of the slider."
+ },
+ "maxValue": {
+ "type": "number",
+ "description": "The maximum value of the slider."
+ }
+ },
+ "required": ["value"]
+ }
+ }
+ }
+ },
+ "required": ["id", "component"]
+ }
+ }
+ },
+ "required": ["surfaceId", "components"]
+ },
+ "dataModelUpdate": {
+ "type": "object",
+ "description": "Updates the data model for a surface.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface this data model update applies to."
+ },
+ "path": {
+ "type": "string",
+ "description": "An optional path to a location within the data model (e.g., '/user/name'). If omitted, or set to '/', the entire data model will be replaced."
+ },
+ "contents": {
+ "type": "array",
+ "description": "An array of data entries. Each entry must contain a 'key' and exactly one corresponding typed 'value*' property.",
+ "items": {
+ "type": "object",
+ "description": "A single data entry. Exactly one 'value*' property should be provided alongside the key.",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key for this data entry."
+ },
+ "valueString": {
+ "type": "string"
+ },
+ "valueNumber": {
+ "type": "number"
+ },
+ "valueBoolean": {
+ "type": "boolean"
+ },
+ "valueMap": {
+ "description": "Represents a map as an adjacency list.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "One entry in the map. Exactly one 'value*' property should be provided alongside the key.",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "valueString": {
+ "type": "string"
+ },
+ "valueNumber": {
+ "type": "number"
+ },
+ "valueBoolean": {
+ "type": "boolean"
+ }
+ },
+ "required": ["key"]
+ }
+ }
+ },
+ "required": ["key"]
+ }
+ }
+ },
+ "required": ["contents", "surfaceId"]
+ },
+ "deleteSurface": {
+ "type": "object",
+ "description": "Signals the client to delete the surface identified by 'surfaceId'.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be deleted."
+ }
+ },
+ "required": ["surfaceId"]
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/behavior.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/behavior.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a9cd0e669bd9c20f2e43e7e0232258fedf45b47b
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/behavior.ts
@@ -0,0 +1,55 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+const opacityBehavior = `
+ &:not([disabled]) {
+ cursor: pointer;
+ opacity: var(--opacity, 0);
+ transition: opacity var(--speed, 0.2s) cubic-bezier(0, 0, 0.3, 1);
+
+ &:hover,
+ &:focus {
+ opacity: 1;
+ }
+ }`;
+
+export const behavior = `
+ ${new Array(21)
+ .fill(0)
+ .map((_, idx) => {
+ return `.behavior-ho-${idx * 5} {
+ --opacity: ${idx / 20};
+ ${opacityBehavior}
+ }`;
+ })
+ .join("\n")}
+
+ .behavior-o-s {
+ overflow: scroll;
+ }
+
+ .behavior-o-a {
+ overflow: auto;
+ }
+
+ .behavior-o-h {
+ overflow: hidden;
+ }
+
+ .behavior-sw-n {
+ scrollbar-width: none;
+ }
+`;
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/border.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/border.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c4e74100da82e66bfebd94164ddab920fbcfe502
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/border.ts
@@ -0,0 +1,42 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { grid } from "./shared.js";
+
+export const border = `
+ ${new Array(25)
+ .fill(0)
+ .map((_, idx) => {
+ return `
+ .border-bw-${idx} { border-width: ${idx}px; }
+ .border-btw-${idx} { border-top-width: ${idx}px; }
+ .border-bbw-${idx} { border-bottom-width: ${idx}px; }
+ .border-blw-${idx} { border-left-width: ${idx}px; }
+ .border-brw-${idx} { border-right-width: ${idx}px; }
+
+ .border-ow-${idx} { outline-width: ${idx}px; }
+ .border-br-${idx} { border-radius: ${idx * grid}px; overflow: hidden;}`;
+ })
+ .join("\n")}
+
+ .border-br-50pc {
+ border-radius: 50%;
+ }
+
+ .border-bs-s {
+ border-style: solid;
+ }
+`;
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/colors.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/colors.ts
new file mode 100644
index 0000000000000000000000000000000000000000..74334fdd187434fa6a85ecc5968c7e0cd3ed02c6
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/colors.ts
@@ -0,0 +1,100 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { PaletteKey, PaletteKeyVals, shades } from "../types/colors.js";
+import { toProp } from "./utils.js";
+
+const color = (src: PaletteKey) =>
+ `
+ ${src
+ .map((key: string) => {
+ const inverseKey = getInverseKey(key);
+ return `.color-bc-${key} { border-color: light-dark(var(${toProp(
+ key
+ )}), var(${toProp(inverseKey)})); }`;
+ })
+ .join("\n")}
+
+ ${src
+ .map((key: string) => {
+ const inverseKey = getInverseKey(key);
+ const vals = [
+ `.color-bgc-${key} { background-color: light-dark(var(${toProp(
+ key
+ )}), var(${toProp(inverseKey)})); }`,
+ `.color-bbgc-${key}::backdrop { background-color: light-dark(var(${toProp(
+ key
+ )}), var(${toProp(inverseKey)})); }`,
+ ];
+
+ for (let o = 0.1; o < 1; o += 0.1) {
+ vals.push(`.color-bbgc-${key}_${(o * 100).toFixed(0)}::backdrop {
+ background-color: light-dark(oklch(from var(${toProp(
+ key
+ )}) l c h / calc(alpha * ${o.toFixed(1)})), oklch(from var(${toProp(
+ inverseKey
+ )}) l c h / calc(alpha * ${o.toFixed(1)})) );
+ }
+ `);
+ }
+
+ return vals.join("\n");
+ })
+ .join("\n")}
+
+ ${src
+ .map((key: string) => {
+ const inverseKey = getInverseKey(key);
+ return `.color-c-${key} { color: light-dark(var(${toProp(
+ key
+ )}), var(${toProp(inverseKey)})); }`;
+ })
+ .join("\n")}
+ `;
+
+const getInverseKey = (key: string): string => {
+ const match = key.match(/^([a-z]+)(\d+)$/);
+ if (!match) return key;
+ const [, prefix, shadeStr] = match;
+ const shade = parseInt(shadeStr, 10);
+ const target = 100 - shade;
+ const inverseShade = shades.reduce((prev, curr) =>
+ Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev
+ );
+ return `${prefix}${inverseShade}`;
+};
+
+const keyFactory = (prefix: K) => {
+ return shades.map((v) => `${prefix}${v}`) as PaletteKey;
+};
+
+export const colors = [
+ color(keyFactory("p")),
+ color(keyFactory("s")),
+ color(keyFactory("t")),
+ color(keyFactory("n")),
+ color(keyFactory("nv")),
+ color(keyFactory("e")),
+ `
+ .color-bgc-transparent {
+ background-color: transparent;
+ }
+
+ :host {
+ color-scheme: var(--color-scheme);
+ }
+ `,
+];
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/icons.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/icons.ts
new file mode 100644
index 0000000000000000000000000000000000000000..28f88c28aad51a6c7577cdf0a01b631587f5642b
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/icons.ts
@@ -0,0 +1,60 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+/**
+ * CSS classes for Google Symbols.
+ *
+ * Usage:
+ *
+ * ```html
+ * pen_spark
+ * ```
+ */
+export const icons = `
+ .g-icon {
+ font-family: "Material Symbols Outlined", "Google Symbols";
+ font-weight: normal;
+ font-style: normal;
+ font-display: optional;
+ font-size: 20px;
+ width: 1em;
+ height: 1em;
+ user-select: none;
+ line-height: 1;
+ letter-spacing: normal;
+ text-transform: none;
+ display: inline-block;
+ white-space: nowrap;
+ word-wrap: normal;
+ direction: ltr;
+ -webkit-font-feature-settings: "liga";
+ -webkit-font-smoothing: antialiased;
+ overflow: hidden;
+
+ font-variation-settings: "FILL" 0, "wght" 300, "GRAD" 0, "opsz" 48,
+ "ROND" 100;
+
+ &.filled {
+ font-variation-settings: "FILL" 1, "wght" 300, "GRAD" 0, "opsz" 48,
+ "ROND" 100;
+ }
+
+ &.filled-heavy {
+ font-variation-settings: "FILL" 1, "wght" 700, "GRAD" 0, "opsz" 48,
+ "ROND" 100;
+ }
+ }
+`;
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/index.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b0f4c51ef347e56ad091474d0bd86866f2703c0f
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/index.ts
@@ -0,0 +1,37 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { behavior } from "./behavior.js";
+import { border } from "./border.js";
+import { colors } from "./colors.js";
+import { icons } from "./icons.js";
+import { layout } from "./layout.js";
+import { opacity } from "./opacity.js";
+import { type } from "./type.js";
+
+export * from "./utils.js";
+
+export const structuralStyles: string = [
+ behavior,
+ border,
+ colors,
+ icons,
+ layout,
+ opacity,
+ type,
+]
+ .flat(Infinity)
+ .join("\n");
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/layout.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/layout.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dda674a5e017f16d8b6e9738528baa524c028eef
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/layout.ts
@@ -0,0 +1,235 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { grid } from "./shared.js";
+
+export const layout = `
+ :host {
+ ${new Array(16)
+ .fill(0)
+ .map((_, idx) => {
+ return `--g-${idx + 1}: ${(idx + 1) * grid}px;`;
+ })
+ .join("\n")}
+ }
+
+ ${new Array(49)
+ .fill(0)
+ .map((_, index) => {
+ const idx = index - 24;
+ const lbl = idx < 0 ? `n${Math.abs(idx)}` : idx.toString();
+ return `
+ .layout-p-${lbl} { --padding: ${
+ idx * grid
+ }px; padding: var(--padding); }
+ .layout-pt-${lbl} { padding-top: ${idx * grid}px; }
+ .layout-pr-${lbl} { padding-right: ${idx * grid}px; }
+ .layout-pb-${lbl} { padding-bottom: ${idx * grid}px; }
+ .layout-pl-${lbl} { padding-left: ${idx * grid}px; }
+
+ .layout-m-${lbl} { --margin: ${idx * grid}px; margin: var(--margin); }
+ .layout-mt-${lbl} { margin-top: ${idx * grid}px; }
+ .layout-mr-${lbl} { margin-right: ${idx * grid}px; }
+ .layout-mb-${lbl} { margin-bottom: ${idx * grid}px; }
+ .layout-ml-${lbl} { margin-left: ${idx * grid}px; }
+
+ .layout-t-${lbl} { top: ${idx * grid}px; }
+ .layout-r-${lbl} { right: ${idx * grid}px; }
+ .layout-b-${lbl} { bottom: ${idx * grid}px; }
+ .layout-l-${lbl} { left: ${idx * grid}px; }`;
+ })
+ .join("\n")}
+
+ ${new Array(25)
+ .fill(0)
+ .map((_, idx) => {
+ return `
+ .layout-g-${idx} { gap: ${idx * grid}px; }`;
+ })
+ .join("\n")}
+
+ ${new Array(8)
+ .fill(0)
+ .map((_, idx) => {
+ return `
+ .layout-grd-col${idx + 1} { grid-template-columns: ${"1fr "
+ .repeat(idx + 1)
+ .trim()}; }`;
+ })
+ .join("\n")}
+
+ .layout-pos-a {
+ position: absolute;
+ }
+
+ .layout-pos-rel {
+ position: relative;
+ }
+
+ .layout-dsp-none {
+ display: none;
+ }
+
+ .layout-dsp-block {
+ display: block;
+ }
+
+ .layout-dsp-grid {
+ display: grid;
+ }
+
+ .layout-dsp-iflex {
+ display: inline-flex;
+ }
+
+ .layout-dsp-flexvert {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .layout-dsp-flexhor {
+ display: flex;
+ flex-direction: row;
+ }
+
+ .layout-fw-w {
+ flex-wrap: wrap;
+ }
+
+ .layout-al-fs {
+ align-items: start;
+ }
+
+ .layout-al-fe {
+ align-items: end;
+ }
+
+ .layout-al-c {
+ align-items: center;
+ }
+
+ .layout-as-n {
+ align-self: normal;
+ }
+
+ .layout-js-c {
+ justify-self: center;
+ }
+
+ .layout-sp-c {
+ justify-content: center;
+ }
+
+ .layout-sp-ev {
+ justify-content: space-evenly;
+ }
+
+ .layout-sp-bt {
+ justify-content: space-between;
+ }
+
+ .layout-sp-s {
+ justify-content: start;
+ }
+
+ .layout-sp-e {
+ justify-content: end;
+ }
+
+ .layout-ji-e {
+ justify-items: end;
+ }
+
+ .layout-r-none {
+ resize: none;
+ }
+
+ .layout-fs-c {
+ field-sizing: content;
+ }
+
+ .layout-fs-n {
+ field-sizing: none;
+ }
+
+ .layout-flx-0 {
+ flex: 0 0 auto;
+ }
+
+ .layout-flx-1 {
+ flex: 1 0 auto;
+ }
+
+ .layout-c-s {
+ contain: strict;
+ }
+
+ /** Widths **/
+
+ ${new Array(10)
+ .fill(0)
+ .map((_, idx) => {
+ const weight = (idx + 1) * 10;
+ return `.layout-w-${weight} { width: ${weight}%; max-width: ${weight}%; }`;
+ })
+ .join("\n")}
+
+ ${new Array(16)
+ .fill(0)
+ .map((_, idx) => {
+ const weight = idx * grid;
+ return `.layout-wp-${idx} { width: ${weight}px; }`;
+ })
+ .join("\n")}
+
+ /** Heights **/
+
+ ${new Array(10)
+ .fill(0)
+ .map((_, idx) => {
+ const height = (idx + 1) * 10;
+ return `.layout-h-${height} { height: ${height}%; }`;
+ })
+ .join("\n")}
+
+ ${new Array(16)
+ .fill(0)
+ .map((_, idx) => {
+ const height = idx * grid;
+ return `.layout-hp-${idx} { height: ${height}px; }`;
+ })
+ .join("\n")}
+
+ .layout-el-cv {
+ & img,
+ & video {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ margin: 0;
+ }
+ }
+
+ .layout-ar-sq {
+ aspect-ratio: 1 / 1;
+ }
+
+ .layout-ex-fb {
+ margin: calc(var(--padding) * -1) 0 0 calc(var(--padding) * -1);
+ width: calc(100% + var(--padding) * 2);
+ height: calc(100% + var(--padding) * 2);
+ }
+`;
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/opacity.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/opacity.ts
new file mode 100644
index 0000000000000000000000000000000000000000..319fd605d5a30e2b5a3ea589de4b377f2aab275a
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/opacity.ts
@@ -0,0 +1,24 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export const opacity = `
+ ${new Array(21)
+ .fill(0)
+ .map((_, idx) => {
+ return `.opacity-el-${idx * 5} { opacity: ${idx / 20}; }`;
+ })
+ .join("\n")}
+`;
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/shared.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/shared.ts
new file mode 100644
index 0000000000000000000000000000000000000000..47af007ebc58ef52ddf55b734c34e08483636ac2
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/shared.ts
@@ -0,0 +1,17 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export const grid = 4;
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/type.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/type.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f755256860b966318a7d1fe194511018c86a8f51
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/type.ts
@@ -0,0 +1,156 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export const type = `
+ :host {
+ --default-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ --default-font-family-mono: "Courier New", Courier, monospace;
+ }
+
+ .typography-f-s {
+ font-family: var(--font-family, var(--default-font-family));
+ font-optical-sizing: auto;
+ font-variation-settings: "slnt" 0, "wdth" 100, "GRAD" 0;
+ }
+
+ .typography-f-sf {
+ font-family: var(--font-family-flex, var(--default-font-family));
+ font-optical-sizing: auto;
+ }
+
+ .typography-f-c {
+ font-family: var(--font-family-mono, var(--default-font-family));
+ font-optical-sizing: auto;
+ font-variation-settings: "slnt" 0, "wdth" 100, "GRAD" 0;
+ }
+
+ .typography-v-r {
+ font-variation-settings: "slnt" 0, "wdth" 100, "GRAD" 0, "ROND" 100;
+ }
+
+ .typography-ta-s {
+ text-align: start;
+ }
+
+ .typography-ta-c {
+ text-align: center;
+ }
+
+ .typography-fs-n {
+ font-style: normal;
+ }
+
+ .typography-fs-i {
+ font-style: italic;
+ }
+
+ .typography-sz-ls {
+ font-size: 11px;
+ line-height: 16px;
+ }
+
+ .typography-sz-lm {
+ font-size: 12px;
+ line-height: 16px;
+ }
+
+ .typography-sz-ll {
+ font-size: 14px;
+ line-height: 20px;
+ }
+
+ .typography-sz-bs {
+ font-size: 12px;
+ line-height: 16px;
+ }
+
+ .typography-sz-bm {
+ font-size: 14px;
+ line-height: 20px;
+ }
+
+ .typography-sz-bl {
+ font-size: 16px;
+ line-height: 24px;
+ }
+
+ .typography-sz-ts {
+ font-size: 14px;
+ line-height: 20px;
+ }
+
+ .typography-sz-tm {
+ font-size: 16px;
+ line-height: 24px;
+ }
+
+ .typography-sz-tl {
+ font-size: 22px;
+ line-height: 28px;
+ }
+
+ .typography-sz-hs {
+ font-size: 24px;
+ line-height: 32px;
+ }
+
+ .typography-sz-hm {
+ font-size: 28px;
+ line-height: 36px;
+ }
+
+ .typography-sz-hl {
+ font-size: 32px;
+ line-height: 40px;
+ }
+
+ .typography-sz-ds {
+ font-size: 36px;
+ line-height: 44px;
+ }
+
+ .typography-sz-dm {
+ font-size: 45px;
+ line-height: 52px;
+ }
+
+ .typography-sz-dl {
+ font-size: 57px;
+ line-height: 64px;
+ }
+
+ .typography-ws-p {
+ white-space: pre-line;
+ }
+
+ .typography-ws-nw {
+ white-space: nowrap;
+ }
+
+ .typography-td-none {
+ text-decoration: none;
+ }
+
+ /** Weights **/
+
+ ${new Array(9)
+ .fill(0)
+ .map((_, idx) => {
+ const weight = (idx + 1) * 100;
+ return `.typography-w-${weight} { font-weight: ${weight}; }`;
+ })
+ .join("\n")}
+`;
diff --git a/vendor/a2ui/renderers/lit/src/0.8/styles/utils.ts b/vendor/a2ui/renderers/lit/src/0.8/styles/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..05003f83b184bc5d4a355186f47a6f95302bc976
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/styles/utils.ts
@@ -0,0 +1,104 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { ColorPalettes } from "../types/colors.js";
+
+export function merge(...classes: Array>) {
+ const styles: Record = {};
+ for (const clazz of classes) {
+ for (const [key, val] of Object.entries(clazz)) {
+ const prefix = key.split("-").with(-1, "").join("-");
+ const existingKeys = Object.keys(styles).filter((key) =>
+ key.startsWith(prefix)
+ );
+
+ for (const existingKey of existingKeys) {
+ delete styles[existingKey];
+ }
+
+ styles[key] = val;
+ }
+ }
+
+ return styles;
+}
+
+export function appendToAll(
+ target: Record,
+ exclusions: string[],
+ ...classes: Array>
+) {
+ const updatedTarget: Record = structuredClone(target);
+ // Step through each of the new blocks we've been handed.
+ for (const clazz of classes) {
+ // For each of the items in the list, create the prefix value, e.g., for
+ // typography-f-s reduce to typography-f-. This will allow us to find any
+ // and all matches across the target that have the same prefix and swap them
+ // out for the updated item.
+ for (const key of Object.keys(clazz)) {
+ const prefix = key.split("-").with(-1, "").join("-");
+
+ // Now we have the prefix step through all iteme in the target, and
+ // replace the value in the array when we find it.
+ for (const [tagName, classesToAdd] of Object.entries(updatedTarget)) {
+ if (exclusions.includes(tagName)) {
+ continue;
+ }
+
+ let found = false;
+ for (let t = 0; t < classesToAdd.length; t++) {
+ if (classesToAdd[t].startsWith(prefix)) {
+ found = true;
+
+ // In theory we should be able to break after finding a single
+ // entry here because we shouldn't have items with the same prefix
+ // in the array, but for safety we'll run to the end of the array
+ // and ensure we've captured all possible items with the prefix.
+ classesToAdd[t] = key;
+ }
+ }
+
+ if (!found) {
+ classesToAdd.push(key);
+ }
+ }
+ }
+ }
+
+ return updatedTarget;
+}
+
+export function createThemeStyles(
+ palettes: ColorPalettes
+): Record {
+ const styles: Record = {};
+ for (const palette of Object.values(palettes)) {
+ for (const [key, val] of Object.entries(palette)) {
+ const prop = toProp(key);
+ styles[prop] = val;
+ }
+ }
+
+ return styles;
+}
+
+export function toProp(key: string) {
+ if (key.startsWith("nv")) {
+ return `--nv-${key.slice(2)}`;
+ }
+
+ return `--${key[0]}-${key.slice(1)}`;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/types/client-event.ts b/vendor/a2ui/renderers/lit/src/0.8/types/client-event.ts
new file mode 100644
index 0000000000000000000000000000000000000000..740ca71f34ce572943a054cf6fdd5c449c877cda
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/types/client-event.ts
@@ -0,0 +1,80 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+/**
+ * A message from the client describing its capabilities, such as the component
+ * catalog it supports. Exactly ONE of the properties in this object must be
+ * set.
+ */
+
+export type ClientCapabilitiesUri = string;
+export type ClientCapabilitiesDynamic = {
+ components: { [key: string]: unknown };
+ styles: { [key: string]: unknown };
+};
+
+export type ClientCapabilities =
+ | { catalogUri: ClientCapabilitiesUri }
+ | { dynamicCatalog: ClientCapabilitiesDynamic };
+
+/**
+ * A message sent from the client to the server. Exactly ONE of the properties
+ * in this object must be set.
+ */
+export interface ClientToServerMessage {
+ userAction?: UserAction;
+ clientUiCapabilities?: ClientCapabilities;
+ error?: ClientError;
+ /** Demo content */
+ request?: unknown;
+}
+
+/**
+ * Represents a user-initiated action, sent from the client to the server.
+ */
+export interface UserAction {
+ /**
+ * The name of the action.
+ */
+ name: string;
+ /**
+ * The ID of the surface.
+ */
+ surfaceId: string;
+ /**
+ * The ID of the component that triggered the event.
+ */
+ sourceComponentId: string;
+ /**
+ * An ISO timestamp of when the event occurred.
+ */
+ timestamp: string;
+ /**
+ * A JSON object containing the key-value pairs from the component's
+ * `action.context`, after resolving all data bindings.
+ */
+ context?: {
+ [k: string]: unknown;
+ };
+}
+
+/**
+ * A message from the client indicating an error occurred, for example,
+ * during UI rendering.
+ */
+export interface ClientError {
+ [k: string]: unknown;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/types/colors.ts b/vendor/a2ui/renderers/lit/src/0.8/types/colors.ts
new file mode 100644
index 0000000000000000000000000000000000000000..77726a62ebf49646fe50c27641f9a71470ebd78b
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/types/colors.ts
@@ -0,0 +1,66 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+type ColorShade =
+ | 0
+ | 5
+ | 10
+ | 15
+ | 20
+ | 25
+ | 30
+ | 35
+ | 40
+ | 50
+ | 60
+ | 70
+ | 80
+ | 90
+ | 95
+ | 98
+ | 99
+ | 100;
+
+export type PaletteKeyVals = "n" | "nv" | "p" | "s" | "t" | "e";
+export const shades: ColorShade[] = [
+ 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 70, 80, 90, 95, 98, 99, 100,
+];
+
+type CreatePalette = {
+ [Key in `${Prefix}${ColorShade}`]: string;
+};
+
+export type PaletteKey = Array<
+ keyof CreatePalette
+>;
+
+export type PaletteKeys = {
+ neutral: PaletteKey<"n">;
+ neutralVariant: PaletteKey<"nv">;
+ primary: PaletteKey<"p">;
+ secondary: PaletteKey<"s">;
+ tertiary: PaletteKey<"t">;
+ error: PaletteKey<"e">;
+};
+
+export type ColorPalettes = {
+ neutral: CreatePalette<"n">;
+ neutralVariant: CreatePalette<"nv">;
+ primary: CreatePalette<"p">;
+ secondary: CreatePalette<"s">;
+ tertiary: CreatePalette<"t">;
+ error: CreatePalette<"e">;
+};
diff --git a/vendor/a2ui/renderers/lit/src/0.8/types/components.ts b/vendor/a2ui/renderers/lit/src/0.8/types/components.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0e1765f5f5fde9a709ac5bf5c406062e15b77d1a
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/types/components.ts
@@ -0,0 +1,211 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { StringValue } from "./primitives";
+
+export interface Action {
+ /**
+ * A unique name identifying the action (e.g., 'submitForm').
+ */
+ name: string;
+ /**
+ * A key-value map of data bindings to be resolved when the action is triggered.
+ */
+ context?: {
+ key: string;
+ /**
+ * The dynamic value. Define EXACTLY ONE of the nested properties.
+ */
+ value: {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ /**
+ * A fixed, hardcoded string value.
+ */
+ literalString?: string;
+ literalNumber?: number;
+ literalBoolean?: boolean;
+ };
+ }[];
+}
+
+export interface Text {
+ text: StringValue;
+ usageHint: "h1" | "h2" | "h3" | "h4" | "h5" | "caption" | "body";
+}
+
+export interface Image {
+ url: StringValue;
+ usageHint:
+ | "icon"
+ | "avatar"
+ | "smallFeature"
+ | "mediumFeature"
+ | "largeFeature"
+ | "header";
+ fit?: "contain" | "cover" | "fill" | "none" | "scale-down";
+}
+
+export interface Icon {
+ name: StringValue;
+}
+
+export interface Video {
+ url: StringValue;
+}
+
+export interface AudioPlayer {
+ url: StringValue;
+ /**
+ * A label, title, or placeholder text.
+ */
+ description?: StringValue;
+}
+
+export interface Tabs {
+ /**
+ * A list of tabs, each with a title and a child component ID.
+ */
+ tabItems: {
+ /**
+ * The title of the tab.
+ */
+ title: {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ /**
+ * A fixed, hardcoded string value.
+ */
+ literalString?: string;
+ };
+ /**
+ * A reference to a component instance by its unique ID.
+ */
+ child: string;
+ }[];
+}
+
+export interface Divider {
+ /**
+ * The orientation.
+ */
+ axis?: "horizontal" | "vertical";
+ /**
+ * The color of the divider (e.g., hex code or semantic name).
+ */
+ color?: string;
+ /**
+ * The thickness of the divider.
+ */
+ thickness?: number;
+}
+
+export interface Modal {
+ /**
+ * The ID of the component (e.g., a button) that triggers the modal.
+ */
+ entryPointChild: string;
+ /**
+ * The ID of the component to display as the modal's content.
+ */
+ contentChild: string;
+}
+
+export interface Button {
+ /**
+ * The ID of the component to display as the button's content.
+ */
+ child: string;
+
+ /**
+ * Represents a user-initiated action.
+ */
+ action: Action;
+}
+
+export interface Checkbox {
+ label: StringValue;
+ value: {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ literalBoolean?: boolean;
+ };
+}
+
+export interface TextField {
+ text?: StringValue;
+ /**
+ * A label, title, or placeholder text.
+ */
+ label: StringValue;
+ type?: "shortText" | "number" | "date" | "longText";
+ /**
+ * A regex string to validate the input.
+ */
+ validationRegexp?: string;
+}
+
+export interface DateTimeInput {
+ value: StringValue;
+ enableDate?: boolean;
+ enableTime?: boolean;
+ /**
+ * The string format for the output (e.g., 'YYYY-MM-DD').
+ */
+ outputFormat?: string;
+}
+
+export interface MultipleChoice {
+ selections: {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ literalArray?: string[];
+ };
+ options?: {
+ label: {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ /**
+ * A fixed, hardcoded string value.
+ */
+ literalString?: string;
+ };
+ value: string;
+ }[];
+ maxAllowedSelections?: number;
+}
+
+export interface Slider {
+ value: {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ literalNumber?: number;
+ };
+ minValue?: number;
+ maxValue?: number;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/types/primitives.ts b/vendor/a2ui/renderers/lit/src/0.8/types/primitives.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cf7ca35523c6aef7e810e4b24c2348d4c3e9efa9
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/types/primitives.ts
@@ -0,0 +1,60 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export interface StringValue {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ /**
+ * A fixed, hardcoded string value.
+ */
+ literalString?: string;
+ /**
+ * A fixed, hardcoded string value.
+ */
+ literal?: string;
+}
+
+export interface NumberValue {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ /**
+ * A fixed, hardcoded number value.
+ */
+ literalNumber?: number;
+ /**
+ * A fixed, hardcoded number value.
+ */
+ literal?: number;
+}
+
+export interface BooleanValue {
+ /**
+ * A data binding reference to a location in the data model (e.g., '/user/name').
+ */
+ path?: string;
+ /**
+ * A fixed, hardcoded boolean value.
+ */
+ literalBoolean?: boolean;
+ /**
+ * A fixed, hardcoded boolean value.
+ */
+ literal?: boolean;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/types/types.ts b/vendor/a2ui/renderers/lit/src/0.8/types/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5deb7a6e9d6a1419aa547b979699b378a8fa4d7b
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/types/types.ts
@@ -0,0 +1,474 @@
+/*
+ Copyright 2025 Google LLC
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ https://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+export {
+ type ClientToServerMessage as A2UIClientEventMessage,
+ type ClientCapabilitiesDynamic,
+} from "./client-event.js";
+export { type Action } from "./components.js";
+import {
+ AudioPlayer,
+ Button,
+ Checkbox,
+ DateTimeInput,
+ Divider,
+ Icon,
+ Image,
+ MultipleChoice,
+ Slider,
+ Text,
+ TextField,
+ Video,
+} from "./components";
+import { StringValue } from "./primitives";
+export type MessageProcessor = {
+ getSurfaces(): ReadonlyMap;
+ clearSurfaces(): void;
+ processMessages(messages: ServerToClientMessage[]): void;
+ /**
+ * Retrieves the data for a given component node and a relative path string.
+ * This correctly handles the special `.` path, which refers to the node's
+ * own data context.
+ */
+ getData(
+ node: AnyComponentNode,
+ relativePath: string,
+ surfaceId: string
+ ): DataValue | null;
+ setData(
+ node: AnyComponentNode | null,
+ relativePath: string,
+ value: DataValue,
+ surfaceId: string
+ ): void;
+ resolvePath(path: string, dataContextPath?: string): string;
+};
+export type Theme = {
+ components: {
+ AudioPlayer: Record;
+ Button: Record;
+ Card: Record;
+ Column: Record;
+ CheckBox: {
+ container: Record;
+ element: Record;
+ label: Record;
+ };
+ DateTimeInput: {
+ container: Record;
+ element: Record;
+ label: Record;
+ };
+ Divider: Record;
+ Image: {
+ all: Record;
+ icon: Record;
+ avatar: Record;
+ smallFeature: Record;
+ mediumFeature: Record;
+ largeFeature: Record;
+ header: Record;
+ };
+ Icon: Record;
+ List: Record;
+ Modal: {
+ backdrop: Record;
+ element: Record;
+ };
+ MultipleChoice: {
+ container: Record;
+ element: Record;
+ label: Record;
+ };
+ Row: Record;
+ Slider: {
+ container: Record;
+ element: Record;
+ label: Record;
+ };
+ Tabs: {
+ container: Record;
+ element: Record;
+ controls: {
+ all: Record;
+ selected: Record;
+ };
+ };
+ Text: {
+ all: Record;
+ h1: Record;
+ h2: Record;
+ h3: Record;
+ h4: Record;
+ h5: Record;
+ caption: Record;
+ body: Record;
+ };
+ TextField: {
+ container: Record;
+ element: Record;
+ label: Record;
+ };
+ Video: Record;
+ };
+ elements: {
+ a: Record;
+ audio: Record;
+ body: Record;
+ button: Record;
+ h1: Record;
+ h2: Record;
+ h3: Record;
+ h4: Record;
+ h5: Record;
+ iframe: Record;
+ input: Record;
+ p: Record;
+ pre: Record;
+ textarea: Record;
+ video: Record;
+ };
+ markdown: {
+ p: string[];
+ h1: string[];
+ h2: string[];
+ h3: string[];
+ h4: string[];
+ h5: string[];
+ ul: string[];
+ ol: string[];
+ li: string[];
+ a: string[];
+ strong: string[];
+ em: string[];
+ };
+ additionalStyles?: {
+ AudioPlayer?: Record;
+ Button?: Record;
+ Card?: Record;
+ Column?: Record;
+ CheckBox?: Record;
+ DateTimeInput?: Record;
+ Divider?: Record;
+ Heading?: Record;
+ Icon?: Record;
+ Image?: Record;
+ List?: Record;
+ Modal?: Record;
+ MultipleChoice?: Record;
+ Row?: Record;
+ Slider?: Record;
+ Tabs?: Record;
+ Text?:
+ | Record
+ | {
+ h1: Record;
+ h2: Record;
+ h3: Record;
+ h4: Record;
+ h5: Record;
+ body: Record;
+ caption: Record;
+ };
+ TextField?: Record;
+ Video?: Record;
+ };
+};
+/**
+ * Represents a user-initiated action, sent from the client to the server.
+ */
+export interface UserAction {
+ /**
+ * The name of the action, taken from the component's `action.action`
+ * property.
+ */
+ actionName: string;
+ /**
+ * The `id` of the component that triggered the event.
+ */
+ sourceComponentId: string;
+ /**
+ * An ISO 8601 timestamp of when the event occurred.
+ */
+ timestamp: string;
+ /**
+ * A JSON object containing the key-value pairs from the component's
+ * `action.context`, after resolving all data bindings.
+ */
+ context?: {
+ [k: string]: unknown;
+ };
+}
+/** A recursive type for any valid JSON-like value in the data model. */
+export type DataValue =
+ | string
+ | number
+ | boolean
+ | null
+ | DataMap
+ | DataObject
+ | DataArray;
+export type DataObject = { [key: string]: DataValue };
+export type DataMap = Map;
+export type DataArray = DataValue[];
+/** A template for creating components from a list in the data model. */
+export interface ComponentArrayTemplate {
+ componentId: string;
+ dataBinding: string;
+}
+/** Defines a list of child components, either explicitly or via a template. */
+export interface ComponentArrayReference {
+ explicitList?: string[];
+ template?: ComponentArrayTemplate;
+}
+/** Represents the general shape of a component's properties. */
+export type ComponentProperties = {
+ // Allow any property, but define known structural ones for type safety.
+ children?: ComponentArrayReference;
+ child?: string;
+ [k: string]: unknown;
+};
+/** A raw component instance from a SurfaceUpdate message. */
+export interface ComponentInstance {
+ id: string;
+ weight?: number;
+ component?: ComponentProperties;
+}
+export interface BeginRenderingMessage {
+ surfaceId: string;
+ root: string;
+ styles?: Record;
+}
+export interface SurfaceUpdateMessage {
+ surfaceId: string;
+ components: ComponentInstance[];
+}
+export interface DataModelUpdate {
+ surfaceId: string;
+ path?: string;
+ contents: ValueMap[];
+}
+// ValueMap is a type of DataObject for passing to the data model.
+export type ValueMap = DataObject & {
+ key: string;
+ /** May be JSON */
+ valueString?: string;
+ valueNumber?: number;
+ valueBoolean?: boolean;
+ valueMap?: ValueMap[];
+};
+export interface DeleteSurfaceMessage {
+ surfaceId: string;
+}
+export interface ServerToClientMessage {
+ beginRendering?: BeginRenderingMessage;
+ surfaceUpdate?: SurfaceUpdateMessage;
+ dataModelUpdate?: DataModelUpdate;
+ deleteSurface?: DeleteSurfaceMessage;
+}
+/**
+ * A recursive type for any value that can appear within a resolved component
+ * tree. This is the main type that makes the recursive resolution possible.
+ */
+export type ResolvedValue =
+ | string
+ | number
+ | boolean
+ | null
+ | AnyComponentNode
+ | ResolvedMap
+ | ResolvedArray;
+/** A generic map where each value has been recursively resolved. */
+export type ResolvedMap = { [key: string]: ResolvedValue };
+/** A generic array where each item has been recursively resolved. */
+export type ResolvedArray = ResolvedValue[];
+/**
+ * A base interface that all component nodes share.
+ */
+interface BaseComponentNode {
+ id: string;
+ weight?: number;
+ dataContextPath?: string;
+ slotName?: string;
+}
+export interface TextNode extends BaseComponentNode {
+ type: "Text";
+ properties: ResolvedText;
+}
+export interface ImageNode extends BaseComponentNode {
+ type: "Image";
+ properties: ResolvedImage;
+}
+export interface IconNode extends BaseComponentNode {
+ type: "Icon";
+ properties: ResolvedIcon;
+}
+export interface VideoNode extends BaseComponentNode {
+ type: "Video";
+ properties: ResolvedVideo;
+}
+export interface AudioPlayerNode extends BaseComponentNode {
+ type: "AudioPlayer";
+ properties: ResolvedAudioPlayer;
+}
+export interface RowNode extends BaseComponentNode {
+ type: "Row";
+ properties: ResolvedRow;
+}
+export interface ColumnNode extends BaseComponentNode {
+ type: "Column";
+ properties: ResolvedColumn;
+}
+export interface ListNode extends BaseComponentNode {
+ type: "List";
+ properties: ResolvedList;
+}
+export interface CardNode extends BaseComponentNode {
+ type: "Card";
+ properties: ResolvedCard;
+}
+export interface TabsNode extends BaseComponentNode {
+ type: "Tabs";
+ properties: ResolvedTabs;
+}
+export interface DividerNode extends BaseComponentNode {
+ type: "Divider";
+ properties: ResolvedDivider;
+}
+export interface ModalNode extends BaseComponentNode {
+ type: "Modal";
+ properties: ResolvedModal;
+}
+export interface ButtonNode extends BaseComponentNode {
+ type: "Button";
+ properties: ResolvedButton;
+}
+export interface CheckboxNode extends BaseComponentNode {
+ type: "CheckBox";
+ properties: ResolvedCheckbox;
+}
+export interface TextFieldNode extends BaseComponentNode {
+ type: "TextField";
+ properties: ResolvedTextField;
+}
+export interface DateTimeInputNode extends BaseComponentNode {
+ type: "DateTimeInput";
+ properties: ResolvedDateTimeInput;
+}
+export interface MultipleChoiceNode extends BaseComponentNode {
+ type: "MultipleChoice";
+ properties: ResolvedMultipleChoice;
+}
+export interface SliderNode extends BaseComponentNode {
+ type: "Slider";
+ properties: ResolvedSlider;
+}
+export interface CustomNode extends BaseComponentNode {
+ type: string;
+ // For custom nodes, properties are just a map of string keys to any resolved value.
+ properties: CustomNodeProperties;
+}
+/**
+ * The complete discriminated union of all possible resolved component nodes.
+ * A renderer would use this type for any given node in the component tree.
+ */
+export type AnyComponentNode =
+ | TextNode
+ | IconNode
+ | ImageNode
+ | VideoNode
+ | AudioPlayerNode
+ | RowNode
+ | ColumnNode
+ | ListNode
+ | CardNode
+ | TabsNode
+ | DividerNode
+ | ModalNode
+ | ButtonNode
+ | CheckboxNode
+ | TextFieldNode
+ | DateTimeInputNode
+ | MultipleChoiceNode
+ | SliderNode
+ | CustomNode;
+// These components do not contain other components can reuse their
+// original interfaces.
+export type ResolvedText = Text;
+export type ResolvedIcon = Icon;
+export type ResolvedImage = Image;
+export type ResolvedVideo = Video;
+export type ResolvedAudioPlayer = AudioPlayer;
+export type ResolvedDivider = Divider;
+export type ResolvedCheckbox = Checkbox;
+export type ResolvedTextField = TextField;
+export type ResolvedDateTimeInput = DateTimeInput;
+export type ResolvedMultipleChoice = MultipleChoice;
+export type ResolvedSlider = Slider;
+export interface ResolvedRow {
+ children: AnyComponentNode[];
+ distribution?:
+ | "start"
+ | "center"
+ | "end"
+ | "spaceBetween"
+ | "spaceAround"
+ | "spaceEvenly";
+ alignment?: "start" | "center" | "end" | "stretch";
+}
+export interface ResolvedColumn {
+ children: AnyComponentNode[];
+ distribution?:
+ | "start"
+ | "center"
+ | "end"
+ | "spaceBetween"
+ | "spaceAround"
+ | "spaceEvenly";
+ alignment?: "start" | "center" | "end" | "stretch";
+}
+export interface ResolvedButton {
+ child: AnyComponentNode;
+ action: Button["action"];
+}
+export interface ResolvedList {
+ children: AnyComponentNode[];
+ direction?: "vertical" | "horizontal";
+ alignment?: "start" | "center" | "end" | "stretch";
+}
+export interface ResolvedCard {
+ child: AnyComponentNode;
+ children: AnyComponentNode[];
+}
+export interface ResolvedTabItem {
+ title: StringValue;
+ child: AnyComponentNode;
+}
+export interface ResolvedTabs {
+ tabItems: ResolvedTabItem[];
+}
+export interface ResolvedModal {
+ entryPointChild: AnyComponentNode;
+ contentChild: AnyComponentNode;
+}
+export interface CustomNodeProperties {
+ [k: string]: ResolvedValue;
+}
+export type SurfaceID = string;
+/** The complete state of a single UI surface. */
+export interface Surface {
+ rootComponentId: string | null;
+ componentTree: AnyComponentNode | null;
+ dataModel: DataMap;
+ components: Map;
+ styles: Record;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/audio.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/audio.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3465687bd8af8e46bcd70d9799ec21b273e1e3c5
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/audio.ts
@@ -0,0 +1,96 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { classMap } from "lit/directives/class-map.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-audioplayer")
+export class Audio extends Root {
+ @property()
+ accessor url: StringValue | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ audio {
+ display: block;
+ width: 100%;
+ }
+ `,
+ ];
+
+ #renderAudio() {
+ if (!this.url) {
+ return nothing;
+ }
+
+ if (this.url && typeof this.url === "object") {
+ if ("literalString" in this.url) {
+ return html``;
+ } else if ("literal" in this.url) {
+ return html``;
+ } else if (this.url && "path" in this.url && this.url.path) {
+ if (!this.processor || !this.component) {
+ return html`(no processor)`;
+ }
+
+ const audioUrl = this.processor.getData(
+ this.component,
+ this.url.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ if (!audioUrl) {
+ return html`Invalid audio URL`;
+ }
+
+ if (typeof audioUrl !== "string") {
+ return html`Invalid audio URL`;
+ }
+ return html``;
+ }
+ }
+
+ return html`(empty)`;
+ }
+
+ render() {
+ return html`
+ ${this.#renderAudio()}
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/button.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/button.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b4f728be358af39985bfef0538b84f902ef28342
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/button.ts
@@ -0,0 +1,65 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StateEvent } from "../events/events.js";
+import { classMap } from "lit/directives/class-map.js";
+import { Action } from "../types/components.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-button")
+export class Button extends Root {
+ @property()
+ accessor action: Action | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ }
+ `,
+ ];
+
+ render() {
+ return html``;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/card.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/card.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ac72d61c060566e95d274cbd7c395a9b41777e19
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/card.ts
@@ -0,0 +1,64 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { classMap } from "lit/directives/class-map.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-card")
+export class Card extends Root {
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ section {
+ height: 100%;
+ width: 100%;
+ min-height: 0;
+ overflow: auto;
+
+ ::slotted(*) {
+ height: 100%;
+ width: 100%;
+ }
+ }
+ `,
+ ];
+
+ render() {
+ return html`
+
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/checkbox.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/checkbox.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6f858c3ce900c0de9f522f0017b8a599c25b8d73
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/checkbox.ts
@@ -0,0 +1,139 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue, BooleanValue } from "../types/primitives";
+import { classMap } from "lit/directives/class-map.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-checkbox")
+export class Checkbox extends Root {
+ @property()
+ accessor value: BooleanValue | null = null;
+
+ @property()
+ accessor label: StringValue | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ input {
+ display: block;
+ width: 100%;
+ }
+
+ .description {
+ font-size: 14px;
+ margin-bottom: 4px;
+ }
+ `,
+ ];
+
+ #setBoundValue(value: string) {
+ if (!this.value || !this.processor) {
+ return;
+ }
+
+ if (!("path" in this.value)) {
+ return;
+ }
+
+ if (!this.value.path) {
+ return;
+ }
+
+ this.processor.setData(
+ this.component,
+ this.value.path,
+ value,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ }
+
+ #renderField(value: boolean | number) {
+ return html`
+ {
+ if (!(evt.target instanceof HTMLInputElement)) {
+ return;
+ }
+
+ this.#setBoundValue(evt.target.value);
+ }}
+ id="data"
+ type="checkbox"
+ .value=${value}
+ />
+
+ `;
+ }
+
+ render() {
+ if (this.value && typeof this.value === "object") {
+ if ("literalBoolean" in this.value && this.value.literalBoolean) {
+ return this.#renderField(this.value.literalBoolean);
+ } else if ("literal" in this.value && this.value.literal !== undefined) {
+ return this.#renderField(this.value.literal);
+ } else if (this.value && "path" in this.value && this.value.path) {
+ if (!this.processor || !this.component) {
+ return html`(no model)`;
+ }
+
+ const textValue = this.processor.getData(
+ this.component,
+ this.value.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+
+ if (textValue === null) {
+ return html`Invalid label`;
+ }
+
+ if (typeof textValue !== "boolean") {
+ return html`Invalid label`;
+ }
+
+ return this.#renderField(textValue);
+ }
+ }
+
+ return nothing;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/column.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/column.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8f7f34f7462352c8add00850821d82c727ae8d8a
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/column.ts
@@ -0,0 +1,104 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { classMap } from "lit/directives/class-map.js";
+import { ResolvedColumn } from "../types/types";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-column")
+export class Column extends Root {
+ @property({ reflect: true, type: String })
+ accessor alignment: ResolvedColumn["alignment"] = "stretch";
+
+ @property({ reflect: true, type: String })
+ accessor distribution: ResolvedColumn["distribution"] = "start";
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: flex;
+ flex: var(--weight);
+ }
+
+ section {
+ display: flex;
+ flex-direction: column;
+ min-width: 100%;
+ height: 100%;
+ }
+
+ :host([alignment="start"]) section {
+ align-items: start;
+ }
+
+ :host([alignment="center"]) section {
+ align-items: center;
+ }
+
+ :host([alignment="end"]) section {
+ align-items: end;
+ }
+
+ :host([alignment="stretch"]) section {
+ align-items: stretch;
+ }
+
+ :host([distribution="start"]) section {
+ justify-content: start;
+ }
+
+ :host([distribution="center"]) section {
+ justify-content: center;
+ }
+
+ :host([distribution="end"]) section {
+ justify-content: end;
+ }
+
+ :host([distribution="spaceBetween"]) section {
+ justify-content: space-between;
+ }
+
+ :host([distribution="spaceAround"]) section {
+ justify-content: space-around;
+ }
+
+ :host([distribution="spaceEvenly"]) section {
+ justify-content: space-evenly;
+ }
+ `,
+ ];
+
+ render() {
+ return html`
+
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/component-registry.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/component-registry.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8576eefca686649fd1d1c07f8d9a85cb586918a1
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/component-registry.ts
@@ -0,0 +1,58 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { CustomElementConstructorOf } from "./ui.js";
+
+export class ComponentRegistry {
+ private registry: Map> =
+ new Map();
+
+ register(
+ typeName: string,
+ constructor: CustomElementConstructorOf,
+ tagName?: string
+ ) {
+ if (!/^[a-zA-Z0-9]+$/.test(typeName)) {
+ throw new Error(
+ `[Registry] Invalid typeName '${typeName}'. Must be alphanumeric.`
+ );
+ }
+
+ this.registry.set(typeName, constructor);
+ const actualTagName = tagName || `a2ui-custom-${typeName.toLowerCase()}`;
+
+ const existingName = customElements.getName(constructor);
+ if (existingName) {
+ // Constructor is already registered.
+ if (existingName !== actualTagName) {
+ throw new Error(
+ `Component ${typeName} is already registered as ${existingName}, but requested as ${actualTagName}.`
+ );
+ }
+ return;
+ }
+
+ if (!customElements.get(actualTagName)) {
+ customElements.define(actualTagName, constructor);
+ }
+ }
+
+ get(typeName: string): CustomElementConstructorOf | undefined {
+ return this.registry.get(typeName);
+ }
+}
+
+export const componentRegistry = new ComponentRegistry();
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/context/theme.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/context/theme.ts
new file mode 100644
index 0000000000000000000000000000000000000000..117db7793b798f6e8ffcec7bc7dd52a5c461a3f9
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/context/theme.ts
@@ -0,0 +1,20 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { createContext } from "@lit/context";
+import { type Theme } from "../../types/types.js";
+
+export const themeContext = createContext("A2UITheme");
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/custom-components/index.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/custom-components/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..64ffcf90bb92598a5266ac4d33cfbd3dd2726532
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/custom-components/index.ts
@@ -0,0 +1,22 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { ComponentRegistry } from '../component-registry.js';
+
+export function registerCustomComponents() {
+ // No default custom components in the core library.
+ // Applications should register their own components.
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/datetime-input.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/datetime-input.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c77acd8d712abc67b35724860d36992a762aca8e
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/datetime-input.ts
@@ -0,0 +1,197 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { classMap } from "lit/directives/class-map.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-datetimeinput")
+export class DateTimeInput extends Root {
+ @property()
+ accessor value: StringValue | null = null;
+
+ @property()
+ accessor label: StringValue | null = null;
+
+ @property({ reflect: false, type: Boolean })
+ accessor enableDate = true;
+
+ @property({ reflect: false, type: Boolean })
+ accessor enableTime = true;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ input {
+ display: block;
+ border-radius: 8px;
+ padding: 8px;
+ border: 1px solid #ccc;
+ width: 100%;
+ }
+ `,
+ ];
+
+ #setBoundValue(value: string) {
+ if (!this.value || !this.processor) {
+ return;
+ }
+
+ if (!("path" in this.value)) {
+ return;
+ }
+
+ if (!this.value.path) {
+ return;
+ }
+
+ this.processor.setData(
+ this.component,
+ this.value.path,
+ value,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ }
+
+ #renderField(value: string) {
+ return html`
+
+ {
+ if (!(evt.target instanceof HTMLInputElement)) {
+ return;
+ }
+
+ this.#setBoundValue(evt.target.value);
+ }}
+ id="data"
+ name="data"
+ .value=${this.#formatInputValue(value)}
+ .placeholder=${this.#getPlaceholderText()}
+ .type=${this.#getInputType()}
+ />
+ `;
+ }
+
+ #getInputType() {
+ if (this.enableDate && this.enableTime) {
+ return "datetime-local";
+ } else if (this.enableDate) {
+ return "date";
+ } else if (this.enableTime) {
+ return "time";
+ }
+
+ return "datetime-local";
+ }
+
+ #formatInputValue(value: string) {
+ const inputType = this.#getInputType();
+ const date = value ? new Date(value) : null;
+
+ if (!date || isNaN(date.getTime())) {
+ return "";
+ }
+
+ const year = this.#padNumber(date.getFullYear());
+ const month = this.#padNumber(date.getMonth());
+ const day = this.#padNumber(date.getDate());
+ const hours = this.#padNumber(date.getHours());
+ const minutes = this.#padNumber(date.getMinutes());
+
+ // Browsers are picky with what format they allow for the `value` attribute of date/time inputs.
+ // We need to parse it out of the provided value. Note that we don't use `toISOString`,
+ // because the resulting value is relative to UTC.
+ if (inputType === "date") {
+ return `${year}-${month}-${day}`;
+ } else if (inputType === "time") {
+ return `${hours}:${minutes}`;
+ }
+
+ return `${year}-${month}-${day}T${hours}:${minutes}`;
+ }
+
+ #padNumber(value: number) {
+ return value.toString().padStart(2, "0");
+ }
+
+ #getPlaceholderText() {
+ // TODO: this should likely be passed from the model.
+ const inputType = this.#getInputType();
+
+ if (inputType === "date") {
+ return "Date";
+ } else if (inputType === "time") {
+ return "Time";
+ }
+
+ return "Date & Time";
+ }
+
+ render() {
+ if (this.value && typeof this.value === "object") {
+ if ("literalString" in this.value && this.value.literalString) {
+ return this.#renderField(this.value.literalString);
+ } else if ("literal" in this.value && this.value.literal !== undefined) {
+ return this.#renderField(this.value.literal);
+ } else if (this.value && "path" in this.value && this.value.path) {
+ if (!this.processor || !this.component) {
+ return html`(no model)`;
+ }
+
+ const textValue = this.processor.getData(
+ this.component,
+ this.value.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ if (typeof textValue !== "string") {
+ return html`(invalid)`;
+ }
+
+ return this.#renderField(textValue);
+ }
+ }
+
+ return nothing;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/directives/directives.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/directives/directives.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3c838da9e87e181892026674fbb963b6d86282fc
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/directives/directives.ts
@@ -0,0 +1,17 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export { markdown } from "./markdown.js";
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/directives/markdown.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/directives/markdown.ts
new file mode 100644
index 0000000000000000000000000000000000000000..faf1b56a8a78e3a57d7a759713e0e538b7183292
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/directives/markdown.ts
@@ -0,0 +1,152 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { noChange } from "lit";
+import {
+ Directive,
+ DirectiveParameters,
+ Part,
+ directive,
+} from "lit/directive.js";
+import { unsafeHTML } from "lit/directives/unsafe-html.js";
+import MarkdownIt from "markdown-it";
+import { RenderRule } from "markdown-it/lib/renderer.mjs";
+import * as Sanitizer from "./sanitizer.js";
+
+class MarkdownDirective extends Directive {
+ #markdownIt = MarkdownIt({
+ highlight: (str, lang) => {
+ switch (lang) {
+ case "html": {
+ const iframe = document.createElement("iframe");
+ iframe.classList.add("html-view");
+ iframe.srcdoc = str;
+ iframe.sandbox = "";
+ return iframe.innerHTML;
+ }
+
+ default:
+ return Sanitizer.escapeNodeText(str);
+ }
+ },
+ });
+ #lastValue: string | null = null;
+ #lastTagClassMap: string | null = null;
+
+ update(_part: Part, [value, tagClassMap]: DirectiveParameters) {
+ if (
+ this.#lastValue === value &&
+ JSON.stringify(tagClassMap) === this.#lastTagClassMap
+ ) {
+ return noChange;
+ }
+
+ this.#lastValue = value;
+ this.#lastTagClassMap = JSON.stringify(tagClassMap);
+ return this.render(value, tagClassMap);
+ }
+
+ #originalClassMap = new Map();
+ #applyTagClassMap(tagClassMap: Record) {
+ Object.entries(tagClassMap).forEach(([tag]) => {
+ let tokenName;
+ switch (tag) {
+ case "p":
+ tokenName = "paragraph";
+ break;
+ case "h1":
+ case "h2":
+ case "h3":
+ case "h4":
+ case "h5":
+ case "h6":
+ tokenName = "heading";
+ break;
+ case "ul":
+ tokenName = "bullet_list";
+ break;
+ case "ol":
+ tokenName = "ordered_list";
+ break;
+ case "li":
+ tokenName = "list_item";
+ break;
+ case "a":
+ tokenName = "link";
+ break;
+ case "strong":
+ tokenName = "strong";
+ break;
+ case "em":
+ tokenName = "em";
+ break;
+ }
+
+ if (!tokenName) {
+ return;
+ }
+
+ const key = `${tokenName}_open`;
+ this.#markdownIt.renderer.rules[key] = (
+ tokens,
+ idx,
+ options,
+ _env,
+ self
+ ) => {
+ const token = tokens[idx];
+ const tokenClasses = tagClassMap[token.tag] ?? [];
+ for (const clazz of tokenClasses) {
+ token.attrJoin("class", clazz);
+ }
+
+ return self.renderToken(tokens, idx, options);
+ };
+ });
+ }
+
+ #unapplyTagClassMap() {
+ for (const [key] of this.#originalClassMap) {
+ delete this.#markdownIt.renderer.rules[key];
+ }
+
+ this.#originalClassMap.clear();
+ }
+
+ /**
+ * Renders the markdown string to HTML using MarkdownIt.
+ *
+ * Note: MarkdownIt doesn't enable HTML in its output, so we render the
+ * value directly without further sanitization.
+ * @see https://github.com/markdown-it/markdown-it/blob/master/docs/security.md
+ */
+ render(value: string, tagClassMap?: Record) {
+ if (tagClassMap) {
+ this.#applyTagClassMap(tagClassMap);
+ }
+ const htmlString = this.#markdownIt.render(value);
+ this.#unapplyTagClassMap();
+
+ return unsafeHTML(htmlString);
+ }
+}
+
+export const markdown = directive(MarkdownDirective);
+
+const markdownItStandalone = MarkdownIt();
+export function renderMarkdownToHtmlString(value: string): string {
+ return markdownItStandalone.render(value);
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/directives/sanitizer.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/directives/sanitizer.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f9b0bc116b09d031060c44c009060ebb690a919d
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/directives/sanitizer.ts
@@ -0,0 +1,40 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, render } from "lit";
+
+/**
+ * This is only safe for (and intended to be used for) text node positions. If
+ * you are using attribute position, then this is only safe if the attribute
+ * value is surrounded by double-quotes, and is unsafe otherwise (because the
+ * value could break out of the attribute value and e.g. add another attribute).
+ */
+export function escapeNodeText(str: string | null | undefined) {
+ const frag = document.createElement("div");
+ render(html`${str}`, frag);
+
+ return frag.innerHTML.replaceAll(//gim, "");
+}
+
+export function unescapeNodeText(str: string | null | undefined) {
+ if (!str) {
+ return "";
+ }
+
+ const frag = document.createElement("textarea");
+ frag.innerHTML = str;
+ return frag.value;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/divider.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/divider.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f4088ee22054f9d95ce0445e0f1e2832e4e2c38e
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/divider.ts
@@ -0,0 +1,51 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { classMap } from "lit/directives/class-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-divider")
+export class Divider extends Root {
+ static styles = [
+ structuralStyles,
+ css`
+ :host {
+ display: block;
+ min-height: 0;
+ overflow: auto;
+ }
+
+ hr {
+ height: 1px;
+ background: #ccc;
+ border: none;
+ }
+ `,
+ ];
+
+ render() {
+ return html``;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/icon.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/icon.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a160f22d407586f13504bfd0826118b72009b8da
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/icon.ts
@@ -0,0 +1,98 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { classMap } from "lit/directives/class-map.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-icon")
+export class Icon extends Root {
+ @property()
+ accessor name: StringValue | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+ `,
+ ];
+
+ #renderIcon() {
+ if (!this.name) {
+ return nothing;
+ }
+
+ const render = (url: string) => {
+ url = url.replace(/([A-Z])/gm, "_$1").toLocaleLowerCase();
+ return html`${url}`;
+ };
+
+ if (this.name && typeof this.name === "object") {
+ if ("literalString" in this.name) {
+ const iconName = this.name.literalString ?? "";
+ return render(iconName);
+ } else if ("literal" in this.name) {
+ const iconName = this.name.literal ?? "";
+ return render(iconName);
+ } else if (this.name && "path" in this.name && this.name.path) {
+ if (!this.processor || !this.component) {
+ return html`(no model)`;
+ }
+
+ const iconName = this.processor.getData(
+ this.component,
+ this.name.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ if (!iconName) {
+ return html`Invalid icon name`;
+ }
+
+ if (typeof iconName !== "string") {
+ return html`Invalid icon name`;
+ }
+ return render(iconName);
+ }
+ }
+
+ return html`(empty)`;
+ }
+
+ render() {
+ return html`
+ ${this.#renderIcon()}
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/image.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/image.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f13b1f4a7c662e69f9f782b66a49ac45baad491b
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/image.ts
@@ -0,0 +1,118 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { classMap } from "lit/directives/class-map.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+import { ResolvedImage } from "../types/types.js";
+import { Styles } from "../index.js";
+
+@customElement("a2ui-image")
+export class Image extends Root {
+ @property()
+ accessor url: StringValue | null = null;
+
+ @property()
+ accessor usageHint: ResolvedImage["usageHint"] | null = null;
+
+ @property()
+ accessor fit: "contain" | "cover" | "fill" | "none" | "scale-down" | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ img {
+ display: block;
+ width: 100%;
+ height: 100%;
+ object-fit: var(--object-fit, fill);
+ }
+ `,
+ ];
+
+ #renderImage() {
+ if (!this.url) {
+ return nothing;
+ }
+
+ const render = (url: string) => {
+ return html``;
+ };
+
+ if (this.url && typeof this.url === "object") {
+ if ("literalString" in this.url) {
+ const imageUrl = this.url.literalString ?? "";
+ return render(imageUrl);
+ } else if ("literal" in this.url) {
+ const imageUrl = this.url.literal ?? "";
+ return render(imageUrl);
+ } else if (this.url && "path" in this.url && this.url.path) {
+ if (!this.processor || !this.component) {
+ return html`(no model)`;
+ }
+
+ const imageUrl = this.processor.getData(
+ this.component,
+ this.url.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ if (!imageUrl) {
+ return html`Invalid image URL`;
+ }
+
+ if (typeof imageUrl !== "string") {
+ return html`Invalid image URL`;
+ }
+ return render(imageUrl);
+ }
+ }
+
+ return html`(empty)`;
+ }
+
+ render() {
+ const classes = Styles.merge(
+ this.theme.components.Image.all,
+ this.usageHint ? this.theme.components.Image[this.usageHint] : {}
+ );
+
+ return html`
+ ${this.#renderImage()}
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/list.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/list.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7b1f09b71925b4e0eb97ee654fc549a05263feeb
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/list.ts
@@ -0,0 +1,72 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { classMap } from "lit/directives/class-map.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-list")
+export class List extends Root {
+ @property({ reflect: true, type: String })
+ accessor direction: "vertical" | "horizontal" = "vertical";
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ :host([direction="vertical"]) section {
+ display: grid;
+ }
+
+ :host([direction="horizontal"]) section {
+ display: flex;
+ max-width: 100%;
+ overflow-x: scroll;
+ overflow-y: hidden;
+ scrollbar-width: none;
+
+ > ::slotted(*) {
+ flex: 1 0 fit-content;
+ max-width: min(80%, 400px);
+ }
+ }
+ `,
+ ];
+
+ render() {
+ return html`
+
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/modal.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/modal.ts
new file mode 100644
index 0000000000000000000000000000000000000000..685b5588aacf00f70ac368cafbd83f61d8078fa7
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/modal.ts
@@ -0,0 +1,131 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, query, state } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { classMap } from "lit/directives/class-map.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+import { ref } from "lit/directives/ref.js";
+
+@customElement("a2ui-modal")
+export class Modal extends Root {
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ dialog {
+ padding: 0 0 0 0;
+ border: none;
+ background: none;
+
+ & section {
+ & #controls {
+ display: flex;
+ justify-content: end;
+ margin-bottom: 4px;
+
+ & button {
+ padding: 0;
+ background: none;
+ width: 20px;
+ height: 20px;
+ pointer: cursor;
+ border: none;
+ cursor: pointer;
+ }
+ }
+ }
+ }
+ `,
+ ];
+
+ @state()
+ accessor #showModal = false;
+
+ @query("dialog")
+ accessor #modalRef: HTMLDialogElement | null = null;
+
+ #closeModal() {
+ if (!this.#modalRef) {
+ return;
+ }
+
+ if (this.#modalRef.open) {
+ this.#modalRef.close();
+ }
+
+ this.#showModal = false;
+ }
+
+ render() {
+ if (!this.#showModal) {
+ return html` {
+ this.#showModal = true;
+ }}
+ >
+
+ `;
+ }
+
+ return html``;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/multiple-choice.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/multiple-choice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a4fba38e449e0ce8231400927c85375c68a38235
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/multiple-choice.ts
@@ -0,0 +1,142 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, PropertyValues, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { classMap } from "lit/directives/class-map.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+import { extractStringValue } from "./utils/utils.js";
+
+@customElement("a2ui-multiplechoice")
+export class MultipleChoice extends Root {
+ @property()
+ accessor description: string | null = null;
+
+ @property()
+ accessor options: { label: StringValue; value: string }[] = [];
+
+ @property()
+ accessor selections: StringValue | string[] = [];
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ select {
+ width: 100%;
+ }
+
+ .description {
+ }
+ `,
+ ];
+
+ #setBoundValue(value: string[]) {
+ console.log(value);
+ if (!this.selections || !this.processor) {
+ return;
+ }
+ if (!("path" in this.selections)) {
+ return;
+ }
+ if (!this.selections.path) {
+ return;
+ }
+
+ this.processor.setData(
+ this.component,
+ this.selections.path,
+ value,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ }
+
+ protected willUpdate(changedProperties: PropertyValues): void {
+ const shouldUpdate = changedProperties.has("options");
+ if (!shouldUpdate) {
+ return;
+ }
+
+ if (!this.processor || !this.component || Array.isArray(this.selections)) {
+ return;
+ }
+
+ this.selections;
+
+ const selectionValue = this.processor.getData(
+ this.component,
+ this.selections.path!,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+
+ if (!Array.isArray(selectionValue)) {
+ return;
+ }
+
+ this.#setBoundValue(selectionValue as string[]);
+ }
+
+ render() {
+ return html`
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/root.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/root.ts
new file mode 100644
index 0000000000000000000000000000000000000000..24494fd1d3beb29b5dd1ba78e59414e4b67f2459
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/root.ts
@@ -0,0 +1,475 @@
+/*
+ Copyright 2025 Google LLC
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ https://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+import { SignalWatcher } from "@lit-labs/signals";
+import { consume } from "@lit/context";
+import {
+ css,
+ html,
+ LitElement,
+ nothing,
+ PropertyValues,
+ render,
+ TemplateResult,
+} from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { map } from "lit/directives/map.js";
+import { effect } from "signal-utils/subtle/microtask-effect";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { StringValue } from "../types/primitives.js";
+import { Theme, AnyComponentNode, SurfaceID } from "../types/types.js";
+import { themeContext } from "./context/theme.js";
+import { structuralStyles } from "./styles.js";
+import { componentRegistry } from "./component-registry.js";
+type NodeOfType = Extract<
+ AnyComponentNode,
+ { type: T }
+>;
+// This is the base class all the components will inherit
+@customElement("a2ui-root")
+export class Root extends (SignalWatcher(LitElement) as typeof LitElement) {
+ @property()
+ accessor surfaceId: SurfaceID | null = null;
+ @property()
+ accessor component: AnyComponentNode | null = null;
+ @consume({ context: themeContext })
+ accessor theme!: Theme;
+ @property({ attribute: false })
+ accessor childComponents: AnyComponentNode[] | null = null;
+ @property({ attribute: false })
+ accessor processor: A2uiMessageProcessor | null = null;
+ @property()
+ accessor dataContextPath: string = "";
+ @property()
+ accessor enableCustomElements = false;
+ @property()
+ set weight(weight: string | number) {
+ this.#weight = weight;
+ this.style.setProperty("--weight", `${weight}`);
+ }
+ get weight() {
+ return this.#weight;
+ }
+ #weight: string | number = 1;
+ static styles = [
+ structuralStyles,
+ css`
+ :host {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ max-height: 80%;
+ }
+ `,
+ ];
+ /**
+ * Holds the cleanup function for our effect.
+ * We need this to stop the effect when the component is disconnected.
+ */
+ #lightDomEffectDisposer: null | (() => void) = null;
+ protected willUpdate(changedProperties: PropertyValues): void {
+ if (changedProperties.has("childComponents")) {
+ if (this.#lightDomEffectDisposer) {
+ this.#lightDomEffectDisposer();
+ }
+ // This effect watches the A2UI Children signal and updates the Light DOM.
+ this.#lightDomEffectDisposer = effect(() => {
+ // 1. Read the signal to create the subscription.
+ const allChildren = this.childComponents ?? null;
+ // 2. Generate the template for the children.
+ const lightDomTemplate = this.renderComponentTree(allChildren);
+ // 3. Imperatively render that template into the component itself.
+ render(lightDomTemplate, this, { host: this });
+ });
+ }
+ }
+ /**
+ * Clean up the effect when the component is removed from the DOM.
+ */
+ disconnectedCallback(): void {
+ super.disconnectedCallback();
+ if (this.#lightDomEffectDisposer) {
+ this.#lightDomEffectDisposer();
+ }
+ }
+ /**
+ * Turns the SignalMap into a renderable TemplateResult for Lit.
+ */
+ private renderComponentTree(
+ components: AnyComponentNode[] | null
+ ): TemplateResult | typeof nothing {
+ if (!components) {
+ return nothing;
+ }
+ if (!Array.isArray(components)) {
+ return nothing;
+ }
+ return html` ${map(components, (component) => {
+ // 1. Check if there is a registered custom component or override.
+ if (this.enableCustomElements) {
+ const registeredCtor = componentRegistry.get(component.type);
+ // We also check customElements.get for non-registered but defined elements
+ const elCtor = registeredCtor || customElements.get(component.type);
+ if (elCtor) {
+ const node = component as AnyComponentNode;
+ const el = new elCtor() as Root;
+ el.id = node.id;
+ if (node.slotName) {
+ el.slot = node.slotName;
+ }
+ el.component = node;
+ el.weight = node.weight ?? "initial";
+ el.processor = this.processor;
+ el.surfaceId = this.surfaceId;
+ el.dataContextPath = node.dataContextPath ?? "/";
+ for (const [prop, val] of Object.entries(component.properties)) {
+ // @ts-expect-error We're off the books.
+ el[prop] = val;
+ }
+ return html`${el}`;
+ }
+ }
+ // 2. Fallback to standard components.
+ switch (component.type) {
+ case "List": {
+ const node = component as NodeOfType<"List">;
+ const childComponents = node.properties.children;
+ return html``;
+ }
+ case "Card": {
+ const node = component as NodeOfType<"Card">;
+ let childComponents: AnyComponentNode[] | null =
+ node.properties.children;
+ if (!childComponents && node.properties.child) {
+ childComponents = [node.properties.child];
+ }
+ return html``;
+ }
+ case "Column": {
+ const node = component as NodeOfType<"Column">;
+ return html``;
+ }
+ case "Row": {
+ const node = component as NodeOfType<"Row">;
+ return html``;
+ }
+ case "Image": {
+ const node = component as NodeOfType<"Image">;
+ return html``;
+ }
+ case "Icon": {
+ const node = component as NodeOfType<"Icon">;
+ return html``;
+ }
+ case "AudioPlayer": {
+ const node = component as NodeOfType<"AudioPlayer">;
+ return html``;
+ }
+ case "Button": {
+ const node = component as NodeOfType<"Button">;
+ return html``;
+ }
+ case "Text": {
+ const node = component as NodeOfType<"Text">;
+ return html``;
+ }
+ case "CheckBox": {
+ const node = component as NodeOfType<"CheckBox">;
+ return html``;
+ }
+ case "DateTimeInput": {
+ const node = component as NodeOfType<"DateTimeInput">;
+ return html``;
+ }
+ case "Divider": {
+ // TODO: thickness, axis and color.
+ const node = component as NodeOfType<"Divider">;
+ return html``;
+ }
+ case "MultipleChoice": {
+ // TODO: maxAllowedSelections and selections.
+ const node = component as NodeOfType<"MultipleChoice">;
+ return html``;
+ }
+ case "Slider": {
+ const node = component as NodeOfType<"Slider">;
+ return html``;
+ }
+ case "TextField": {
+ // TODO: type and validationRegexp.
+ const node = component as NodeOfType<"TextField">;
+ return html``;
+ }
+ case "Video": {
+ const node = component as NodeOfType<"Video">;
+ return html``;
+ }
+ case "Tabs": {
+ const node = component as NodeOfType<"Tabs">;
+ const titles: StringValue[] = [];
+ const childComponents: AnyComponentNode[] = [];
+ if (node.properties.tabItems) {
+ for (const item of node.properties.tabItems) {
+ titles.push(item.title);
+ childComponents.push(item.child);
+ }
+ }
+ return html``;
+ }
+ case "Modal": {
+ const node = component as NodeOfType<"Modal">;
+ const childComponents: AnyComponentNode[] = [
+ node.properties.entryPointChild,
+ node.properties.contentChild,
+ ];
+ node.properties.entryPointChild.slotName = "entry";
+ return html``;
+ }
+ default: {
+ return this.renderCustomComponent(component);
+ }
+ }
+ })}`;
+ }
+ private renderCustomComponent(component: AnyComponentNode) {
+ if (!this.enableCustomElements) {
+ return;
+ }
+ const node = component as AnyComponentNode;
+ const registeredCtor = componentRegistry.get(component.type);
+ const elCtor = registeredCtor || customElements.get(component.type);
+ if (!elCtor) {
+ return html`Unknown element ${component.type}`;
+ }
+ const el = new elCtor() as Root;
+ el.id = node.id;
+ if (node.slotName) {
+ el.slot = node.slotName;
+ }
+ el.component = node;
+ el.weight = node.weight ?? "initial";
+ el.processor = this.processor;
+ el.surfaceId = this.surfaceId;
+ el.dataContextPath = node.dataContextPath ?? "/";
+ for (const [prop, val] of Object.entries(component.properties)) {
+ // @ts-expect-error We're off the books.
+ el[prop] = val;
+ }
+ return html`${el}`;
+ }
+ render(): TemplateResult | typeof nothing {
+ return html``;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/row.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/row.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bdab6284d54527bc349370579f9a67bc60afbeca
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/row.ts
@@ -0,0 +1,104 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { classMap } from "lit/directives/class-map.js";
+import { ResolvedRow } from "../types/types";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-row")
+export class Row extends Root {
+ @property({ reflect: true, type: String })
+ accessor alignment: ResolvedRow["alignment"] = "stretch";
+
+ @property({ reflect: true, type: String })
+ accessor distribution: ResolvedRow["distribution"] = "start";
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: flex;
+ flex: var(--weight);
+ }
+
+ section {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+ min-height: 100%;
+ }
+
+ :host([alignment="start"]) section {
+ align-items: start;
+ }
+
+ :host([alignment="center"]) section {
+ align-items: center;
+ }
+
+ :host([alignment="end"]) section {
+ align-items: end;
+ }
+
+ :host([alignment="stretch"]) section {
+ align-items: stretch;
+ }
+
+ :host([distribution="start"]) section {
+ justify-content: start;
+ }
+
+ :host([distribution="center"]) section {
+ justify-content: center;
+ }
+
+ :host([distribution="end"]) section {
+ justify-content: end;
+ }
+
+ :host([distribution="spaceBetween"]) section {
+ justify-content: space-between;
+ }
+
+ :host([distribution="spaceAround"]) section {
+ justify-content: space-around;
+ }
+
+ :host([distribution="spaceEvenly"]) section {
+ justify-content: space-evenly;
+ }
+ `,
+ ];
+
+ render() {
+ return html`
+
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/slider.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/slider.ts
new file mode 100644
index 0000000000000000000000000000000000000000..17adcff24ae23fb2ab1ecc1ca8526af6d84e9d1f
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/slider.ts
@@ -0,0 +1,159 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { NumberValue, StringValue } from "../types/primitives";
+import { ResolvedTextField } from "../types/types.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { classMap } from "lit/directives/class-map.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+import { extractNumberValue, extractStringValue } from "./utils/utils.js";
+
+@customElement("a2ui-slider")
+export class Slider extends Root {
+ @property()
+ accessor value: NumberValue | null = null;
+
+ @property()
+ accessor minValue = 0;
+
+ @property()
+ accessor maxValue = 0;
+
+ @property()
+ accessor label: StringValue | null = null;
+
+ @property()
+ accessor inputType: ResolvedTextField["type"] | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ }
+
+ input {
+ display: block;
+ width: 100%;
+ }
+
+ .description {
+ }
+ `,
+ ];
+
+ #setBoundValue(value: string) {
+ if (!this.value || !this.processor) {
+ return;
+ }
+
+ if (!("path" in this.value)) {
+ return;
+ }
+
+ if (!this.value.path) {
+ return;
+ }
+
+ this.processor.setData(
+ this.component,
+ this.value.path,
+ value,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ }
+
+ #renderField(value: string | number) {
+ return html`
+
+ {
+ if (!(evt.target instanceof HTMLInputElement)) {
+ return;
+ }
+
+ this.#setBoundValue(evt.target.value);
+ }}
+ id="data"
+ name="data"
+ .value=${value}
+ type="range"
+ min=${this.minValue ?? "0"}
+ max=${this.maxValue ?? "0"}
+ />
+ ${this.value
+ ? extractNumberValue(
+ this.value,
+ this.component,
+ this.processor,
+ this.surfaceId
+ )
+ : "0"}
+ `;
+ }
+
+ render() {
+ if (this.value && typeof this.value === "object") {
+ if ("literalNumber" in this.value && this.value.literalNumber) {
+ return this.#renderField(this.value.literalNumber);
+ } else if ("literal" in this.value && this.value.literal !== undefined) {
+ return this.#renderField(this.value.literal);
+ } else if (this.value && "path" in this.value && this.value.path) {
+ if (!this.processor || !this.component) {
+ return html`(no processor)`;
+ }
+
+ const textValue = this.processor.getData(
+ this.component,
+ this.value.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+
+ if (textValue === null) {
+ return html`Invalid value`;
+ }
+
+ if (typeof textValue !== "string" && typeof textValue !== "number") {
+ return html`Invalid value`;
+ }
+
+ return this.#renderField(textValue);
+ }
+ }
+
+ return nothing;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/styles.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/styles.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f5135c1251d9de5812a972f031cf9d41a83ea152
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/styles.ts
@@ -0,0 +1,20 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { unsafeCSS } from "lit";
+import { structuralStyles as unsafeStructuralStyles } from "../styles/index.js";
+
+export const structuralStyles = unsafeCSS(unsafeStructuralStyles);
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/surface.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/surface.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f11af658f34a13a349a6171c7d4904d32415bab6
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/surface.ts
@@ -0,0 +1,134 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { SurfaceID, Surface as SurfaceState } from "../types/types";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { Root } from "./root.js";
+import { styleMap } from "lit/directives/style-map.js";
+
+@customElement("a2ui-surface")
+export class Surface extends Root {
+ @property()
+ accessor surfaceId: SurfaceID | null = null;
+
+ @property()
+ accessor surface: SurfaceState | null = null;
+
+ @property()
+ accessor processor: A2uiMessageProcessor | null = null;
+
+ static styles = [
+ css`
+ :host {
+ display: flex;
+ min-height: 0;
+ max-height: 100%;
+ flex-direction: column;
+ gap: 16px;
+ }
+
+ #surface-logo {
+ display: flex;
+ justify-content: center;
+
+ & img {
+ width: 50%;
+ max-width: 220px;
+ }
+ }
+
+ a2ui-root {
+ flex: 1;
+ }
+ `,
+ ];
+
+ #renderLogo() {
+ if (!this.surface?.styles.logoUrl) {
+ return nothing;
+ }
+
+ return html`
+
+
`;
+ }
+
+ #renderSurface() {
+ const styles: Record = {};
+ if (this.surface?.styles) {
+ for (const [key, value] of Object.entries(this.surface.styles)) {
+ switch (key) {
+ // Here we generate a palette from the singular primary color received
+ // from the surface data. We will want the values to range from
+ // 0 <= x <= 100, where 0 = back, 100 = white, and 50 = the primary
+ // color itself. As such we use a color-mix to create the intermediate
+ // values.
+ //
+ // Note: since we use half the range for black to the primary color,
+ // and half the range for primary color to white the mixed values have
+ // to go up double the amount, i.e., a range from black to primary
+ // color needs to fit in 0 -> 50 rather than 0 -> 100.
+ case "primaryColor": {
+ styles["--p-100"] = "#ffffff";
+ styles["--p-99"] = `color-mix(in srgb, ${value} 2%, white 98%)`;
+ styles["--p-98"] = `color-mix(in srgb, ${value} 4%, white 96%)`;
+ styles["--p-95"] = `color-mix(in srgb, ${value} 10%, white 90%)`;
+ styles["--p-90"] = `color-mix(in srgb, ${value} 20%, white 80%)`;
+ styles["--p-80"] = `color-mix(in srgb, ${value} 40%, white 60%)`;
+ styles["--p-70"] = `color-mix(in srgb, ${value} 60%, white 40%)`;
+ styles["--p-60"] = `color-mix(in srgb, ${value} 80%, white 20%)`;
+ styles["--p-50"] = value;
+ styles["--p-40"] = `color-mix(in srgb, ${value} 80%, black 20%)`;
+ styles["--p-35"] = `color-mix(in srgb, ${value} 70%, black 30%)`;
+ styles["--p-30"] = `color-mix(in srgb, ${value} 60%, black 40%)`;
+ styles["--p-25"] = `color-mix(in srgb, ${value} 50%, black 50%)`;
+ styles["--p-20"] = `color-mix(in srgb, ${value} 40%, black 60%)`;
+ styles["--p-15"] = `color-mix(in srgb, ${value} 30%, black 70%)`;
+ styles["--p-10"] = `color-mix(in srgb, ${value} 20%, black 80%)`;
+ styles["--p-5"] = `color-mix(in srgb, ${value} 10%, black 90%)`;
+ styles["--0"] = "#00000";
+ break;
+ }
+
+ case "font": {
+ styles["--font-family"] = value;
+ styles["--font-family-flex"] = value;
+ break;
+ }
+ }
+ }
+ }
+
+ return html``;
+ }
+
+ render() {
+ if (!this.surface) {
+ return nothing;
+ }
+
+ return html`${[this.#renderLogo(), this.#renderSurface()]}`;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/tabs.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/tabs.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7485063a0bdf9866dda612454e6896eb24fcf2db
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/tabs.ts
@@ -0,0 +1,132 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, PropertyValues, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { repeat } from "lit/directives/repeat.js";
+import { StringValue } from "../types/primitives.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { classMap } from "lit/directives/class-map.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+import { Styles } from "../index.js";
+
+@customElement("a2ui-tabs")
+export class Tabs extends Root {
+ @property()
+ accessor titles: StringValue[] | null = null;
+
+ @property()
+ accessor selected = 0;
+
+ static styles = [
+ structuralStyles,
+ css`
+ :host {
+ display: block;
+ flex: var(--weight);
+ }
+ `,
+ ];
+
+ protected willUpdate(changedProperties: PropertyValues): void {
+ super.willUpdate(changedProperties);
+
+ if (changedProperties.has("selected")) {
+ for (const child of this.children) {
+ child.removeAttribute("slot");
+ }
+ const selectedChild = this.children[this.selected];
+ if (!selectedChild) {
+ return;
+ }
+
+ selectedChild.slot = "current";
+ }
+ }
+
+ #renderTabs() {
+ if (!this.titles) {
+ return nothing;
+ }
+
+ return html`
+ ${repeat(this.titles, (title, idx) => {
+ let titleString = "";
+ if ("literalString" in title && title.literalString) {
+ titleString = title.literalString;
+ } else if ("literal" in title && title.literal !== undefined) {
+ titleString = title.literal;
+ } else if (title && "path" in title && title.path) {
+ if (!this.processor || !this.component) {
+ return html`(no model)`;
+ }
+
+ const textValue = this.processor.getData(
+ this.component,
+ title.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+
+ if (typeof textValue !== "string") {
+ return html`(invalid)`;
+ }
+
+ titleString = textValue;
+ }
+
+ let classes;
+ if (this.selected === idx) {
+ classes = Styles.merge(
+ this.theme.components.Tabs.controls.all,
+ this.theme.components.Tabs.controls.selected
+ );
+ } else {
+ classes = { ...this.theme.components.Tabs.controls.all };
+ }
+
+ return html``;
+ })}
+
`;
+ }
+
+ #renderSlot() {
+ return html``;
+ }
+
+ render() {
+ return html`
+ ${[this.#renderTabs(), this.#renderSlot()]}
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/text-field.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/text-field.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4d695751e3fd2c9fd87490f2b96641facff142c7
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/text-field.ts
@@ -0,0 +1,131 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { classMap } from "lit/directives/class-map.js";
+import { ResolvedTextField } from "../types/types";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { extractStringValue } from "./utils/utils.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-textfield")
+export class TextField extends Root {
+ @property()
+ accessor text: StringValue | null = null;
+
+ @property()
+ accessor label: StringValue | null = null;
+
+ @property()
+ accessor inputType: ResolvedTextField["type"] | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: flex;
+ flex: var(--weight);
+ }
+
+ input {
+ display: block;
+ width: 100%;
+ }
+
+ label {
+ display: block;
+ margin-bottom: 4px;
+ }
+ `,
+ ];
+
+ #setBoundValue(value: string) {
+ if (!this.text || !this.processor) {
+ return;
+ }
+ if (!("path" in this.text)) {
+ return;
+ }
+ if (!this.text.path) {
+ return;
+ }
+
+ this.processor.setData(
+ this.component,
+ this.text.path,
+ value,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ }
+
+ #renderField(value: string | number, label: string) {
+ return html`
+ ${label && label !== ""
+ ? html``
+ : nothing}
+ {
+ if (!(evt.target instanceof HTMLInputElement)) {
+ return;
+ }
+
+ this.#setBoundValue(evt.target.value);
+ }}
+ name="data"
+ id="data"
+ .value=${value}
+ .placeholder=${"Please enter a value"}
+ type=${this.inputType === "number" ? "number" : "text"}
+ />
+ `;
+ }
+
+ render() {
+ const label = extractStringValue(
+ this.label,
+ this.component,
+ this.processor,
+ this.surfaceId
+ );
+ const value = extractStringValue(
+ this.text,
+ this.component,
+ this.processor,
+ this.surfaceId
+ );
+
+ return this.#renderField(value, label);
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/text.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/text.ts
new file mode 100644
index 0000000000000000000000000000000000000000..02cb32a6183637bc1e0347d87d7c82ea7b5ad7a7
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/text.ts
@@ -0,0 +1,164 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { markdown } from "./directives/directives.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { classMap } from "lit/directives/class-map.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+import { Styles } from "../index.js";
+import { ResolvedText, Theme } from "../types/types.js";
+
+interface HintedStyles {
+ h1: Record;
+ h2: Record;
+ h3: Record;
+ h4: Record;
+ h5: Record;
+ body: Record;
+ caption: Record;
+}
+
+@customElement("a2ui-text")
+export class Text extends Root {
+ @property()
+ accessor text: StringValue | null = null;
+
+ @property({ reflect: true, attribute: "usage-hint" })
+ accessor usageHint: ResolvedText["usageHint"] | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ :host {
+ display: block;
+ flex: var(--weight);
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5 {
+ line-height: inherit;
+ font: inherit;
+ }
+ `,
+ ];
+
+ #renderText() {
+ let textValue: string | null | undefined = null;
+
+ if (this.text && typeof this.text === "object") {
+ if ("literalString" in this.text && this.text.literalString) {
+ textValue = this.text.literalString;
+ } else if ("literal" in this.text && this.text.literal !== undefined) {
+ textValue = this.text.literal;
+ } else if (this.text && "path" in this.text && this.text.path) {
+ if (!this.processor || !this.component) {
+ return html`(no model)`;
+ }
+
+ const value = this.processor.getData(
+ this.component,
+ this.text.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+
+ if (value !== null && value !== undefined) {
+ textValue = value.toString();
+ }
+ }
+ }
+
+ if (textValue === null || textValue === undefined) {
+ return html`(empty)`;
+ }
+
+ let markdownText = textValue;
+ switch (this.usageHint) {
+ case "h1":
+ markdownText = `# ${markdownText}`;
+ break;
+ case "h2":
+ markdownText = `## ${markdownText}`;
+ break;
+ case "h3":
+ markdownText = `### ${markdownText}`;
+ break;
+ case "h4":
+ markdownText = `#### ${markdownText}`;
+ break;
+ case "h5":
+ markdownText = `##### ${markdownText}`;
+ break;
+ case "caption":
+ markdownText = `*${markdownText}*`;
+ break;
+ default:
+ break; // Body.
+ }
+
+ return html`${markdown(
+ markdownText,
+ Styles.appendToAll(this.theme.markdown, ["ol", "ul", "li"], {})
+ )}`;
+ }
+
+ #areHintedStyles(styles: unknown): styles is HintedStyles {
+ if (typeof styles !== "object") return false;
+ if (Array.isArray(styles)) return false;
+ if (!styles) return false;
+
+ const expected = ["h1", "h2", "h3", "h4", "h5", "h6", "caption", "body"];
+ return expected.every((v) => v in styles);
+ }
+
+ #getAdditionalStyles() {
+ let additionalStyles: Record = {};
+ const styles = this.theme.additionalStyles?.Text;
+ if (!styles) return additionalStyles;
+
+ if (this.#areHintedStyles(styles)) {
+ const hint = this.usageHint ?? "body";
+ additionalStyles = styles[hint] as Record;
+ } else {
+ additionalStyles = styles;
+ }
+
+ return additionalStyles;
+ }
+
+ render() {
+ const classes = Styles.merge(
+ this.theme.components.Text.all,
+ this.usageHint ? this.theme.components.Text[this.usageHint] : {}
+ );
+
+ return html`
+ ${this.#renderText()}
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/ui.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/ui.ts
new file mode 100644
index 0000000000000000000000000000000000000000..476d4d5678ad38a9008cf3be9145b0aae015d690
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/ui.ts
@@ -0,0 +1,119 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export type TagName = keyof A2UITagNameMap;
+
+// A type that describes a constructor function which returns an instance of T
+export type CustomElementConstructorOf = {
+ // The 'new' signature ensures it can be instantiated
+ new (): T;
+} & typeof HTMLElement;
+
+import { Audio } from "./audio.js";
+import { Button } from "./button.js";
+import { Card } from "./card.js";
+import { Checkbox } from "./checkbox.js";
+import { Column } from "./column.js";
+import { DateTimeInput } from "./datetime-input.js";
+import { Divider } from "./divider.js";
+import { Icon } from "./icon.js";
+import { Image } from "./image.js";
+import { List } from "./list.js";
+import { MultipleChoice } from "./multiple-choice.js";
+import { Modal } from "./modal.js";
+import { Root } from "./root.js";
+import { Row } from "./row.js";
+import { Slider } from "./slider.js";
+import { Surface } from "./surface.js";
+import { Tabs } from "./tabs.js";
+import { TextField } from "./text-field.js";
+import { Text } from "./text.js";
+import { Video } from "./video.js";
+
+export * as Context from "./context/theme.js";
+export * as Utils from "./utils/utils.js";
+export { ComponentRegistry, componentRegistry } from "./component-registry.js";
+export { registerCustomComponents } from "./custom-components/index.js";
+
+export {
+ Audio,
+ Button,
+ Card,
+ Column,
+ Checkbox,
+ DateTimeInput,
+ Divider,
+ Icon,
+ Image,
+ List,
+ MultipleChoice,
+ Modal,
+ Row,
+ Slider,
+ Root,
+ Surface,
+ Tabs,
+ Text,
+ TextField,
+ Video,
+};
+
+interface A2UITagNameMap {
+ "a2ui-audioplayer": Audio;
+ "a2ui-button": Button;
+ "a2ui-card": Card;
+ "a2ui-checkbox": Checkbox;
+ "a2ui-column": Column;
+ "a2ui-datetimeinput": DateTimeInput;
+ "a2ui-divider": Divider;
+ "a2ui-icon": Icon;
+ "a2ui-image": Image;
+ "a2ui-list": List;
+ "a2ui-modal": Modal;
+ "a2ui-multiplechoice": MultipleChoice;
+ "a2ui-root": Root;
+ "a2ui-row": Row;
+ "a2ui-slider": Slider;
+ "a2ui-surface": Surface;
+ "a2ui-tabs": Tabs;
+ "a2ui-text": Text;
+ "a2ui-textfield": TextField;
+ "a2ui-video": Video;
+}
+
+declare global {
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
+ interface HTMLElementTagNameMap extends A2UITagNameMap {}
+}
+
+/**
+ * Type-safely retrieves a custom element constructor using the tagName map.
+ * @param tagName The tag name to look up (must exist in HTMLElementTagNameMap).
+ * @returns The specific constructor type or undefined.
+ */
+export function instanceOf(tagName: T) {
+ // Use a type assertion: we tell TypeScript to trust that the value returned
+ // by customElements.get(tagName) matches the type defined in our map.
+ const ctor = customElements.get(tagName) as
+ | CustomElementConstructorOf
+ | undefined;
+ if (!ctor) {
+ console.warn("No element definition for", tagName);
+ return;
+ }
+
+ return new ctor();
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/utils/utils.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/utils/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ca882ad397e24aadbb812d1f8b603277f7e9ec85
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/utils/utils.ts
@@ -0,0 +1,92 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { A2uiMessageProcessor } from "../../data/model-processor.js";
+import { NumberValue, type StringValue } from "../../types/primitives.js";
+import { type AnyComponentNode } from "../../types/types.js";
+
+export function extractStringValue(
+ val: StringValue | null,
+ component: AnyComponentNode | null,
+ processor: A2uiMessageProcessor | null,
+ surfaceId: string | null
+): string {
+ if (val !== null && typeof val === "object") {
+ if ("literalString" in val) {
+ return val.literalString ?? "";
+ } else if ("literal" in val && val.literal !== undefined) {
+ return val.literal ?? "";
+ } else if (val && "path" in val && val.path) {
+ if (!processor || !component) {
+ return "(no model)";
+ }
+
+ const textValue = processor.getData(
+ component,
+ val.path,
+ surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+
+ if (textValue === null || typeof textValue !== "string") {
+ return "";
+ }
+
+ return textValue;
+ }
+ }
+
+ return "";
+}
+
+export function extractNumberValue(
+ val: NumberValue | null,
+ component: AnyComponentNode | null,
+ processor: A2uiMessageProcessor | null,
+ surfaceId: string | null
+): number {
+ if (val !== null && typeof val === "object") {
+ if ("literalNumber" in val) {
+ return val.literalNumber ?? 0;
+ } else if ("literal" in val && val.literal !== undefined) {
+ return val.literal ?? 0;
+ } else if (val && "path" in val && val.path) {
+ if (!processor || !component) {
+ return -1;
+ }
+
+ let numberValue = processor.getData(
+ component,
+ val.path,
+ surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+
+ if (typeof numberValue === "string") {
+ numberValue = Number.parseInt(numberValue, 10);
+ if (Number.isNaN(numberValue)) {
+ numberValue = null;
+ }
+ }
+
+ if (numberValue === null || typeof numberValue !== "number") {
+ return -1;
+ }
+
+ return numberValue;
+ }
+ }
+
+ return 0;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/utils/youtube.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/utils/youtube.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a4bc00f020d6d76738883aa274abd9605173db70
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/utils/youtube.ts
@@ -0,0 +1,77 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export function isEmbedUri(uri: string | null): boolean {
+ if (!uri) {
+ return false;
+ }
+
+ return /^https:\/\/www\.youtube\.com\/embed\//.test(uri);
+}
+
+export function isShareUri(uri: string | null): boolean {
+ if (!uri) {
+ return false;
+ }
+
+ return /^https:\/\/youtu\.be\//.test(uri);
+}
+
+export function isWatchUri(uri: string): boolean {
+ return /^https:\/\/www\.youtube\.com\/watch\?v=/.test(uri);
+}
+
+export function isShortsUri(uri: string): boolean {
+ return /^https:\/\/www\.youtube\.com\/shorts\//.test(uri);
+}
+
+export function convertShareUriToEmbedUri(uri: string) {
+ const regex = /^https:\/\/youtu\.be\/(.*?)(?:[&\\?]|$)/;
+ const matches = regex.exec(uri);
+ if (!matches) {
+ return null;
+ }
+
+ const embedId = matches[1];
+ return `https://www.youtube.com/embed/${embedId}`;
+}
+
+export function convertWatchOrShortsUriToEmbedUri(uri: string) {
+ const regex =
+ /^https:\/\/www\.youtube\.com\/(?:shorts\/|embed\/|watch\?v=)(.*?)(?:[&\\?]|$)/;
+ const matches = regex.exec(uri);
+ if (!matches) {
+ return null;
+ }
+
+ const embedId = matches[1];
+ return `https://www.youtube.com/embed/${embedId}`;
+}
+
+export function videoIdFromWatchOrShortsOrEmbedUri(uri: string) {
+ const regex =
+ /^https:\/\/www\.youtube\.com\/(?:shorts\/|embed\/|watch\?v=)(.*?)(?:[&\\?]|$)/;
+ const matches = regex.exec(uri);
+ if (!matches) {
+ return null;
+ }
+
+ return matches[1];
+}
+
+export function createWatchUriFromVideoId(id: string) {
+ return `https://www.youtube.com/watch?v=${id}`;
+}
diff --git a/vendor/a2ui/renderers/lit/src/0.8/ui/video.ts b/vendor/a2ui/renderers/lit/src/0.8/ui/video.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cf7613e07a6055025d103dbfca3eb1d9b1fb4702
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/0.8/ui/video.ts
@@ -0,0 +1,96 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { html, css, nothing } from "lit";
+import { customElement, property } from "lit/decorators.js";
+import { Root } from "./root.js";
+import { StringValue } from "../types/primitives.js";
+import { A2uiMessageProcessor } from "../data/model-processor.js";
+import { classMap } from "lit/directives/class-map.js";
+import { styleMap } from "lit/directives/style-map.js";
+import { structuralStyles } from "./styles.js";
+
+@customElement("a2ui-video")
+export class Video extends Root {
+ @property()
+ accessor url: StringValue | null = null;
+
+ static styles = [
+ structuralStyles,
+ css`
+ * {
+ box-sizing: border-box;
+ }
+
+ :host {
+ display: block;
+ flex: var(--weight);
+ min-height: 0;
+ overflow: auto;
+ }
+
+ video {
+ display: block;
+ width: 100%;
+ }
+ `,
+ ];
+
+ #renderVideo() {
+ if (!this.url) {
+ return nothing;
+ }
+
+ if (this.url && typeof this.url === "object") {
+ if ("literalString" in this.url) {
+ return html``;
+ } else if ("literal" in this.url) {
+ return html``;
+ } else if (this.url && "path" in this.url && this.url.path) {
+ if (!this.processor || !this.component) {
+ return html`(no processor)`;
+ }
+
+ const videoUrl = this.processor.getData(
+ this.component,
+ this.url.path,
+ this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID
+ );
+ if (!videoUrl) {
+ return html`Invalid video URL`;
+ }
+
+ if (typeof videoUrl !== "string") {
+ return html`Invalid video URL`;
+ }
+ return html``;
+ }
+ }
+
+ return html`(empty)`;
+ }
+
+ render() {
+ return html`
+ ${this.#renderVideo()}
+ `;
+ }
+}
diff --git a/vendor/a2ui/renderers/lit/src/index.ts b/vendor/a2ui/renderers/lit/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2a3d4e33c60f1579f82a9412ba205fe587729e69
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/src/index.ts
@@ -0,0 +1,17 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export * as v0_8 from "./0.8/index.js";
diff --git a/vendor/a2ui/renderers/lit/tsconfig.json b/vendor/a2ui/renderers/lit/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..f928e3840f4108c946a03f3aabfdeeb11fafecdd
--- /dev/null
+++ b/vendor/a2ui/renderers/lit/tsconfig.json
@@ -0,0 +1,35 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+
+ "compilerOptions": {
+ "composite": true,
+ "declaration": true,
+ "declarationMap": true,
+ "incremental": true,
+ "forceConsistentCasingInFileNames": true,
+ "inlineSources": false,
+ // "allowJs": true,
+ "preserveWatchOutput": true,
+ "sourceMap": true,
+ "target": "es2022",
+ "module": "esnext",
+ "lib": ["es2023", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
+ "useDefineForClassFields": false,
+ "rootDir": ".",
+ "outDir": "dist",
+ "tsBuildInfoFile": "dist/.tsbuildinfo",
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src/**/*.ts", "src/**/*.json"]
+}
diff --git a/vendor/a2ui/requirements-docs.txt b/vendor/a2ui/requirements-docs.txt
new file mode 100644
index 0000000000000000000000000000000000000000..573152f228d3502fd28d6ca7d553e0e75d3f3675
--- /dev/null
+++ b/vendor/a2ui/requirements-docs.txt
@@ -0,0 +1,9 @@
+mkdocs-material
+mkdocs-redirects
+mkdocs-macros-plugin
+mkdocs-llmstxt
+mkdocs-include-markdown-plugin
+mkdocs-mermaid2-plugin
+sphinx
+furo
+myst-parser
diff --git a/vendor/a2ui/specification/0.8/eval/.gitignore b/vendor/a2ui/specification/0.8/eval/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..d66c580af770e50ad321e086e73fad008e29b70f
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/.gitignore
@@ -0,0 +1,26 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# production
+/build
+lib/
+output/
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.genkit
diff --git a/vendor/a2ui/specification/0.8/eval/GEMINI.md b/vendor/a2ui/specification/0.8/eval/GEMINI.md
new file mode 100644
index 0000000000000000000000000000000000000000..2f8a8294d6893423705449cc4b38938d601a8685
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/GEMINI.md
@@ -0,0 +1,76 @@
+# A2UI Protocol Message Validation Logic
+
+This document outlines the validation rules implemented in the `validateSchema` function. The purpose of this validator is to check for constraints that are not easily expressed in the JSON schema itself, such as conditional requirements and reference integrity.
+
+An A2UI message is a JSON object that can have a `surfaceId` and one of the following properties, defining the message type: `beginRendering`, `surfaceUpdate`, `dataModelUpdate`, or `deleteSurface`.
+
+## Common Properties
+
+- **`surfaceId`**: An optional string that identifies the UI surface the message applies to.
+
+## `BeginRendering` Message Rules
+
+- **Required**: Must have a `root` property, which is the ID of the root component to render.
+
+## `SurfaceUpdate` Message Rules
+
+### 1. Component ID Integrity
+
+- **Uniqueness**: All component `id`s within the `components` array must be unique.
+- **Reference Validity**: Any property that references a component ID (e.g., `child`, `children`, `entryPointChild`, `contentChild`) must point to an ID that actually exists in the `components` array.
+
+### 2. Component-Specific Property Rules
+
+For each component in the `components` array, the following rules apply:
+
+- **General**:
+ - A component must have an `id` and a `componentProperties` object.
+ - The `componentProperties` object must contain exactly one key, which defines the component's type (e.g., "Heading", "Text").
+
+- **Heading**:
+ - **Required**: Must have a `text` property.
+- **Text**:
+ - **Required**: Must have a `text` property.
+- **Image**:
+ - **Required**: Must have a `url` property.
+- **Video**:
+ - **Required**: Must have a `url` property.
+- **AudioPlayer**:
+ - **Required**: Must have a `url` property.
+- **TextField**:
+ - **Required**: Must have a `label` property.
+- **DateTimeInput**:
+ - **Required**: Must have a `value` property.
+- **MultipleChoice**:
+ - **Required**: Must have a `selections` property.
+- **Slider**:
+ - **Required**: Must have a `value` property.
+- **Container Components** (`Row`, `Column`, `List`):
+ - **Required**: Must have a `children` property.
+ - The `children` object must contain _either_ `explicitList` _or_ `template`, but not both.
+- **Card**:
+ - **Required**: Must have a `child` property.
+- **Tabs**:
+ - **Required**: Must have a `tabItems` property, which must be an array.
+ - Each item in `tabItems` must have a `title` and a `child`.
+- **Modal**:
+ - **Required**: Must have both `entryPointChild` and `contentChild` properties.
+- **Button**:
+ - **Required**: Must have `label` and `action` properties.
+- **CheckBox**:
+ - **Required**: Must have `label` and `value` properties.
+- **Divider**:
+ - No required properties.
+
+## `DataModelUpdate` Message Rules
+
+- **Required**: A `DataModelUpdate` message must have a `contents` property.
+- The `path` property is optional.
+- If `path` is not present, the `contents` object will replace the entire data model.
+- If `path` is present, the `contents` will be set at that location in the data model.
+- No other properties besides `path` and `contents` are allowed.
+
+## `DeleteSurface` Message Rules
+
+- **Required**: Must have a `delete` property set to `true`.
+- No other properties are allowed.
diff --git a/vendor/a2ui/specification/0.8/eval/README.md b/vendor/a2ui/specification/0.8/eval/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..fbef16d3b96b458a2d5d50d6b940ccb96e03ebe1
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/README.md
@@ -0,0 +1,61 @@
+# Genkit Eval Framework for UI generation
+
+This is for evaluating A2UI (v0.8) against various LLMs.
+
+## Setup
+
+To use the models, you need to set the following environment variables with your API keys:
+
+- `GEMINI_API_KEY`
+- `OPENAI_API_KEY`
+- `ANTHROPIC_API_KEY`
+
+You can set these in a `.env` file in the root of the project, or in your shell's configuration file (e.g., `.bashrc`, `.zshrc`).
+
+You also need to install dependencies before running:
+
+```bash
+pnpm install
+```
+
+## Running all evals (warning: can use *lots* of model quota)
+
+To run the flow, use the following command:
+
+```bash
+pnpm run evalAll
+```
+
+## Running a Single Test
+
+You can run the script for a single model and data point by using the `--model` and `--prompt` command-line flags. This is useful for quick tests and debugging.
+
+### Syntax
+
+```bash
+pnpm run eval -- --model='' --prompt=
+```
+
+### Example
+
+To run the test with the `gpt-5-mini (reasoning: minimal)` model and the `generateDogUIs` prompt, use the following command:
+
+```bash
+pnpm run eval -- --model='gpt-5-mini (reasoning: minimal)' --prompt=generateDogUIs
+```
+
+## Controlling Output
+
+By default, the script only prints the summary table and any errors that occur during generation. To see the full JSON output for each successful generation, use the `--verbose` flag.
+
+To keep the input and output for each run in separate files, specify the `--keep=` flag, which will create a directory hierarchy with the input and output for each LLM call in separate files.
+
+### Example
+
+```bash
+pnpm run evalAll -- --verbose
+```
+
+```bash
+pnpm run evalAll -- --keep=output
+```
diff --git a/vendor/a2ui/specification/0.8/eval/genkit.conf.js b/vendor/a2ui/specification/0.8/eval/genkit.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..7752b118a2a90c2e3faff0ebca7bf9bb616a8f13
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/genkit.conf.js
@@ -0,0 +1,24 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { googleAI } from "@genkit-ai/google-genai";
+import { configure } from "genkit";
+
+export default configure({
+ plugins: [googleAI()],
+ logLevel: "debug",
+ enableTracingAndMetrics: true,
+});
diff --git a/vendor/a2ui/specification/0.8/eval/package.json b/vendor/a2ui/specification/0.8/eval/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..07ebdda3bd5f4c81dcc64f4f9b50d2ee69c066ec
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "a2ui_genkit_eval",
+ "version": "1.0.0",
+ "main": "lib/index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "build": "tsc",
+ "eval": "dotenv -- tsx src/index.ts",
+ "evalAll": "pnpm run eval",
+ "evalGemini": "pnpm run eval -- --model=gemini-2.5-flash --prompt=travelItinerary",
+ "evalGpt": "pnpm run eval -- --model=gpt-5-mini --prompt=travelItinerary",
+ "evalClaude": "pnpm run eval -- --model=claude-4-sonnet --prompt=travelItinerary",
+ "start": "genkit start",
+ "genkit:dev": "genkit start -- tsx --watch src/dev.ts",
+ "format": "prettier --write src/**/*.ts"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "devDependencies": {
+ "@types/yargs": "^17.0.34",
+ "dotenv-cli": "^10.0.0",
+ "prettier": "^3.6.2",
+ "tsx": "^4.20.5",
+ "typescript": "^5.9.2",
+ "yargs": "^18.0.0"
+ },
+ "dependencies": {
+ "@genkit-ai/compat-oai": "^1.19.2",
+ "@genkit-ai/google-genai": "^1.19.3",
+ "@genkit-ai/vertexai": "^1.19.3",
+ "genkit": "^1.19.2",
+ "genkitx-anthropic": "^0.25.0"
+ }
+}
diff --git a/vendor/a2ui/specification/0.8/eval/pnpm-lock.yaml b/vendor/a2ui/specification/0.8/eval/pnpm-lock.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3bccec7038aa791839dd9add3440dd667b925a53
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/pnpm-lock.yaml
@@ -0,0 +1,4885 @@
+# Copyright 2025 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@genkit-ai/compat-oai':
+ specifier: ^1.19.2
+ version: 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))(zod@3.25.76)
+ '@genkit-ai/google-genai':
+ specifier: ^1.19.3
+ version: 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@genkit-ai/vertexai':
+ specifier: ^1.19.3
+ version: 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))(zod@3.25.76)
+ genkit:
+ specifier: ^1.19.2
+ version: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ genkitx-anthropic:
+ specifier: ^0.25.0
+ version: 0.25.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ devDependencies:
+ '@types/yargs':
+ specifier: ^17.0.34
+ version: 17.0.35
+ dotenv-cli:
+ specifier: ^10.0.0
+ version: 10.0.0
+ prettier:
+ specifier: ^3.6.2
+ version: 3.6.2
+ tsx:
+ specifier: ^4.20.5
+ version: 4.20.6
+ typescript:
+ specifier: ^5.9.2
+ version: 5.9.3
+ yargs:
+ specifier: ^18.0.0
+ version: 18.0.0
+
+packages:
+
+ '@anthropic-ai/sdk@0.24.3':
+ resolution: {integrity: sha512-916wJXO6T6k8R6BAAcLhLPv/pnLGy7YSEBZXZ1XTFbLcTZE8oTy3oDW9WJf9KKZwMvVcePIfoTSvzXHRcGxkQQ==}
+
+ '@anthropic-ai/sdk@0.39.0':
+ resolution: {integrity: sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==}
+
+ '@anthropic-ai/vertex-sdk@0.4.3':
+ resolution: {integrity: sha512-2Uef0C5P2Hx+T88RnUSRA3u4aZqmqnrRSOb2N64ozgKPiSUPTM5JlggAq2b32yWMj5d3MLYa6spJXKMmHXOcoA==}
+
+ '@colors/colors@1.6.0':
+ resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
+ engines: {node: '>=0.1.90'}
+
+ '@dabh/diagnostics@2.0.8':
+ resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
+
+ '@esbuild/aix-ppc64@0.25.12':
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.12':
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.12':
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.12':
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.12':
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.12':
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.12':
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.12':
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.12':
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.12':
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.12':
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.12':
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.12':
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.12':
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.12':
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.12':
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.12':
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.12':
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.12':
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.12':
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.12':
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@fastify/busboy@3.2.0':
+ resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==}
+
+ '@firebase/app-check-interop-types@0.3.3':
+ resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==}
+
+ '@firebase/app-types@0.9.3':
+ resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==}
+
+ '@firebase/auth-interop-types@0.2.4':
+ resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==}
+
+ '@firebase/component@0.7.0':
+ resolution: {integrity: sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/database-compat@2.1.0':
+ resolution: {integrity: sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/database-types@1.0.16':
+ resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==}
+
+ '@firebase/database@1.1.0':
+ resolution: {integrity: sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/logger@0.5.0':
+ resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/util@1.13.0':
+ resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@genkit-ai/ai@1.24.0':
+ resolution: {integrity: sha512-Rv2eZqvJA8awIfLKiZL+P1hlBPGFiBFk1r01hRk0BSp1HmpZmlzSx+MM+X2H54xMgRXBRAelzU6xUXXzN5U57Q==}
+
+ '@genkit-ai/compat-oai@1.24.0':
+ resolution: {integrity: sha512-DCUFTlql4LH3wb3q3SWnC4CZS74iLsXchLvVGxorlqG7YMPaVFntjMzUX9ehRIgXCLyFJA3PHOgAZE2yjtOU+g==}
+ peerDependencies:
+ genkit: ^1.24.0
+
+ '@genkit-ai/core@1.24.0':
+ resolution: {integrity: sha512-JGmwdcC066OpbwShXeOOwvinj9b4yA0BKfKjPrVqqbWt9hvu81I60UNNiZC5y8dx+TvEhdEPUAXRvoOup2vC0w==}
+
+ '@genkit-ai/firebase@1.24.0':
+ resolution: {integrity: sha512-6DZ612qNV4OUsAa0L40gYx0rIzcANAjv3u9R08wGK/twdOvANJuMOUWBRTIVPA0IZL2WiHLcm6Ss+GOdZOdvpg==}
+ peerDependencies:
+ '@google-cloud/firestore': ^7.11.0
+ firebase: '>=11.5.0'
+ firebase-admin: '>=12.2'
+ genkit: ^1.24.0
+ peerDependenciesMeta:
+ firebase:
+ optional: true
+
+ '@genkit-ai/google-cloud@1.24.0':
+ resolution: {integrity: sha512-SrNCuo7UC1c7BRRk4F6IRAM9ZSBbpLUUWgpP9xUUQ3sozVzPwWwI5Eps32WCa52ljrbhSiQQRi4sRm36glDBiA==}
+ peerDependencies:
+ genkit: ^1.24.0
+
+ '@genkit-ai/google-genai@1.24.0':
+ resolution: {integrity: sha512-J8WfWWkyeF6Pq9t7XTZU1D/IoRzg5RUkYhXFWnEJd+Ez22DUjBQLkyxiFt3UqDQ2F2yNWYzt8Dcca03kqwZyvg==}
+ peerDependencies:
+ genkit: ^1.24.0
+
+ '@genkit-ai/vertexai@1.24.0':
+ resolution: {integrity: sha512-gQWgLLEv47ARWGMY2e3tgvOCNag00hxj/iAvR6FPEAtLsNB/k38sCXxxCgOB1irs7ZDkieKsd4HUahanf8+yQA==}
+ peerDependencies:
+ genkit: ^1.24.0
+
+ '@google-cloud/aiplatform@3.35.0':
+ resolution: {integrity: sha512-Eo+ckr1KbTxAOew9P+MeeR0aQXeW5PeOzrSM1JyGny/SGKejwX/RcGWSFpeapnlegTfI9N9xJeUeo3M+XBOeFg==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/bigquery@7.9.4':
+ resolution: {integrity: sha512-C7jeI+9lnCDYK3cRDujcBsPgiwshWKn/f0BiaJmClplfyosCLfWE83iGQ0eKH113UZzjR9c9q7aZQg0nU388sw==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/common@5.0.2':
+ resolution: {integrity: sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/firestore@7.11.6':
+ resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/logging-winston@6.0.1':
+ resolution: {integrity: sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ winston: '>=3.2.1'
+
+ '@google-cloud/logging@11.2.1':
+ resolution: {integrity: sha512-2h9HBJG3OAsvzXmb81qXmaTPfXYU7KJTQUxunoOKFGnY293YQ/eCkW1Y5mHLocwpEqeqQYT/Qvl6Tk+Q7PfStw==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/opentelemetry-cloud-monitoring-exporter@0.19.0':
+ resolution: {integrity: sha512-5SOPXwC6RET4ZvXxw5D97dp8fWpqWEunHrzrUUGXhG4UAeedQe1KvYV8CK+fnaAbN2l2ha6QDYspT6z40TVY0g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+ '@opentelemetry/core': ^1.0.0
+ '@opentelemetry/resources': ^1.0.0
+ '@opentelemetry/sdk-metrics': ^1.0.0
+
+ '@google-cloud/opentelemetry-cloud-trace-exporter@2.4.1':
+ resolution: {integrity: sha512-Dq2IyAyA9PCjbjLOn86i2byjkYPC59b5ic8k/L4q5bBWH0Jro8lzMs8C0G5pJfqh2druj8HF+oAIAlSdWQ+Z9Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+ '@opentelemetry/core': ^1.0.0
+ '@opentelemetry/resources': ^1.0.0
+ '@opentelemetry/sdk-trace-base': ^1.0.0
+
+ '@google-cloud/opentelemetry-resource-util@2.4.0':
+ resolution: {integrity: sha512-/7ujlMoKtDtrbQlJihCjQnm31n2s2RTlvJqcSbt2jV3OkCzPAdo3u31Q13HNugqtIRUSk7bUoLx6AzhURkhW4w==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/resources': ^1.0.0
+
+ '@google-cloud/paginator@5.0.2':
+ resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/precise-date@4.0.0':
+ resolution: {integrity: sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/projectify@4.0.0':
+ resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/promisify@4.0.0':
+ resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==}
+ engines: {node: '>=14'}
+
+ '@google-cloud/storage@7.17.3':
+ resolution: {integrity: sha512-gOnCAbFgAYKRozywLsxagdevTF7Gm+2Ncz5u5CQAuOv/2VCa0rdGJWvJFDOftPx1tc+q8TXiC2pEJfFKu+yeMQ==}
+ engines: {node: '>=14'}
+
+ '@google-cloud/vertexai@1.10.0':
+ resolution: {integrity: sha512-HqYqoivNtkq59po8m7KI0n+lWKdz4kabENncYQXZCX/hBWJfXtKAfR/2nUQsP+TwSfHKoA7zDL2RrJYIv/j3VQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@grpc/grpc-js@1.14.1':
+ resolution: {integrity: sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==}
+ engines: {node: '>=12.10.0'}
+
+ '@grpc/proto-loader@0.7.15':
+ resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ '@grpc/proto-loader@0.8.0':
+ resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ '@js-sdsl/ordered-map@4.4.2':
+ resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==}
+
+ '@mistralai/mistralai-gcp@1.5.0':
+ resolution: {integrity: sha512-KUv4GziIN8do4gmPe7T85gpYW1o2Q89e0hs8PQfZhFRMYz7uYPwxHyVI5UaxWlHFcmAvyxfaOAH0OuCC38Hb6g==}
+ peerDependencies:
+ zod: '>= 3'
+
+ '@opentelemetry/api-logs@0.52.1':
+ resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/api@1.9.0':
+ resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
+ engines: {node: '>=8.0.0'}
+
+ '@opentelemetry/auto-instrumentations-node@0.49.2':
+ resolution: {integrity: sha512-xtETEPmAby/3MMmedv8Z/873sdLTWg+Vq98rtm4wbwvAiXBB/ao8qRyzRlvR2MR6puEr+vIB/CXeyJnzNA3cyw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.4.1
+
+ '@opentelemetry/context-async-hooks@1.25.1':
+ resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/core@1.25.1':
+ resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/core@1.30.1':
+ resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/exporter-jaeger@1.30.1':
+ resolution: {integrity: sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==}
+ engines: {node: '>=14'}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-trace-otlp-grpc@0.52.1':
+ resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-trace-otlp-http@0.52.1':
+ resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-trace-otlp-proto@0.52.1':
+ resolution: {integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-zipkin@1.25.1':
+ resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/instrumentation-amqplib@0.41.0':
+ resolution: {integrity: sha512-00Oi6N20BxJVcqETjgNzCmVKN+I5bJH/61IlHiIWd00snj1FdgiIKlpE4hYVacTB2sjIBB3nTbHskttdZEE2eg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-aws-lambda@0.43.0':
+ resolution: {integrity: sha512-pSxcWlsE/pCWQRIw92sV2C+LmKXelYkjkA7C5s39iPUi4pZ2lA1nIiw+1R/y2pDEhUHcaKkNyljQr3cx9ZpVlQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-aws-sdk@0.43.1':
+ resolution: {integrity: sha512-qLT2cCniJ5W+6PFzKbksnoIQuq9pS83nmgaExfUwXVvlwi0ILc50dea0tWBHZMkdIDa/zZdcuFrJ7+fUcSnRow==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-bunyan@0.40.0':
+ resolution: {integrity: sha512-aZ4cXaGWwj79ZXSYrgFVsrDlE4mmf2wfvP9bViwRc0j75A6eN6GaHYHqufFGMTCqASQn5pIjjP+Bx+PWTGiofw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-cassandra-driver@0.40.0':
+ resolution: {integrity: sha512-JxbM39JU7HxE9MTKKwi6y5Z3mokjZB2BjwfqYi4B3Y29YO3I42Z7eopG6qq06yWZc+nQli386UDQe0d9xKmw0A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-connect@0.38.0':
+ resolution: {integrity: sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-cucumber@0.8.0':
+ resolution: {integrity: sha512-ieTm4RBIlZt2brPwtX5aEZYtYnkyqhAVXJI9RIohiBVMe5DxiwCwt+2Exep/nDVqGPX8zRBZUl4AEw423OxJig==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/instrumentation-dataloader@0.11.0':
+ resolution: {integrity: sha512-27urJmwkH4KDaMJtEv1uy2S7Apk4XbN4AgWMdfMJbi7DnOduJmeuA+DpJCwXB72tEWXo89z5T3hUVJIDiSNmNw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-dns@0.38.0':
+ resolution: {integrity: sha512-Um07I0TQXDWa+ZbEAKDFUxFH40dLtejtExDOMLNJ1CL8VmOmA71qx93Qi/QG4tGkiI1XWqr7gF/oiMCJ4m8buQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-express@0.41.1':
+ resolution: {integrity: sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-fastify@0.38.0':
+ resolution: {integrity: sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-fs@0.14.0':
+ resolution: {integrity: sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-generic-pool@0.38.1':
+ resolution: {integrity: sha512-WvssuKCuavu/hlq661u82UWkc248cyI/sT+c2dEIj6yCk0BUkErY1D+9XOO+PmHdJNE+76i2NdcvQX5rJrOe/w==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-graphql@0.42.0':
+ resolution: {integrity: sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-grpc@0.52.1':
+ resolution: {integrity: sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-hapi@0.40.0':
+ resolution: {integrity: sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-http@0.52.1':
+ resolution: {integrity: sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-ioredis@0.42.0':
+ resolution: {integrity: sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-kafkajs@0.2.0':
+ resolution: {integrity: sha512-uKKmhEFd0zR280tJovuiBG7cfnNZT4kvVTvqtHPxQP7nOmRbJstCYHFH13YzjVcKjkmoArmxiSulmZmF7SLIlg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-knex@0.39.0':
+ resolution: {integrity: sha512-lRwTqIKQecPWDkH1KEcAUcFhCaNssbKSpxf4sxRTAROCwrCEnYkjOuqJHV+q1/CApjMTaKu0Er4LBv/6bDpoxA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-koa@0.42.0':
+ resolution: {integrity: sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-lru-memoizer@0.39.0':
+ resolution: {integrity: sha512-eU1Wx1RRTR/2wYXFzH9gcpB8EPmhYlNDIUHzUXjyUE0CAXEJhBLkYNlzdaVCoQDw2neDqS+Woshiia6+emWK9A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-memcached@0.38.0':
+ resolution: {integrity: sha512-tPmyqQEZNyrvg6G+iItdlguQEcGzfE+bJkpQifmBXmWBnoS5oU3UxqtyYuXGL2zI9qQM5yMBHH4nRXWALzy7WA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mongodb@0.46.0':
+ resolution: {integrity: sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mongoose@0.41.0':
+ resolution: {integrity: sha512-ivJg4QnnabFxxoI7K8D+in7hfikjte38sYzJB9v1641xJk9Esa7jM3hmbPB7lxwcgWJLVEDvfPwobt1if0tXxA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mysql2@0.40.0':
+ resolution: {integrity: sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mysql@0.40.0':
+ resolution: {integrity: sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-nestjs-core@0.39.0':
+ resolution: {integrity: sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-net@0.38.0':
+ resolution: {integrity: sha512-stjow1PijcmUquSmRD/fSihm/H61DbjPlJuJhWUe7P22LFPjFhsrSeiB5vGj3vn+QGceNAs+kioUTzMGPbNxtg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-pg@0.43.0':
+ resolution: {integrity: sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-pino@0.41.0':
+ resolution: {integrity: sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-redis-4@0.41.1':
+ resolution: {integrity: sha512-UqJAbxraBk7s7pQTlFi5ND4sAUs4r/Ai7gsAVZTQDbHl2kSsOp7gpHcpIuN5dpcI2xnuhM2tkH4SmEhbrv2S6Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-redis@0.41.0':
+ resolution: {integrity: sha512-RJ1pwI3btykp67ts+5qZbaFSAAzacucwBet5/5EsKYtWBpHbWwV/qbGN/kIBzXg5WEZBhXLrR/RUq0EpEUpL3A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-restify@0.40.0':
+ resolution: {integrity: sha512-sm/rH/GysY/KOEvZqYBZSLYFeXlBkHCgqPDgWc07tz+bHCN6mPs9P3otGOSTe7o3KAIM8Nc6ncCO59vL+jb2cA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-router@0.39.0':
+ resolution: {integrity: sha512-LaXnVmD69WPC4hNeLzKexCCS19hRLrUw3xicneAMkzJSzNJvPyk7G6I7lz7VjQh1cooObPBt9gNyd3hhTCUrag==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-socket.io@0.41.0':
+ resolution: {integrity: sha512-7fzDe9/FpO6NFizC/wnzXXX7bF9oRchsD//wFqy5g5hVEgXZCQ70IhxjrKdBvgjyIejR9T9zTvfQ6PfVKfkCAw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-tedious@0.13.0':
+ resolution: {integrity: sha512-Pob0+0R62AqXH50pjazTeGBy/1+SK4CYpFUBV5t7xpbpeuQezkkgVGvLca84QqjBqQizcXedjpUJLgHQDixPQg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-undici@0.5.0':
+ resolution: {integrity: sha512-aNTeSrFAVcM9qco5DfZ9DNXu6hpMRe8Kt8nCDHfMWDB3pwgGVUE76jTdohc+H/7eLRqh4L7jqs5NSQoHw7S6ww==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.7.0
+
+ '@opentelemetry/instrumentation-winston@0.39.0':
+ resolution: {integrity: sha512-v/1xziLJ9CyB3YDjBSBzbB70Qd0JwWTo36EqWK5m3AR0CzsyMQQmf3ZIZM6sgx7hXMcRQ0pnEYhg6nhrUQPm9A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation@0.52.1':
+ resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/otlp-exporter-base@0.52.1':
+ resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/otlp-grpc-exporter-base@0.52.1':
+ resolution: {integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/otlp-transformer@0.52.1':
+ resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/propagation-utils@0.30.16':
+ resolution: {integrity: sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/propagator-aws-xray@1.26.2':
+ resolution: {integrity: sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/propagator-b3@1.25.1':
+ resolution: {integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/propagator-jaeger@1.25.1':
+ resolution: {integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/redis-common@0.36.2':
+ resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/resource-detector-alibaba-cloud@0.29.7':
+ resolution: {integrity: sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-aws@1.12.0':
+ resolution: {integrity: sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-azure@0.2.12':
+ resolution: {integrity: sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-container@0.4.4':
+ resolution: {integrity: sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-gcp@0.29.13':
+ resolution: {integrity: sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resources@1.25.1':
+ resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/resources@1.30.1':
+ resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/sdk-logs@0.52.1':
+ resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.4.0 <1.10.0'
+
+ '@opentelemetry/sdk-metrics@1.25.1':
+ resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/sdk-node@0.52.1':
+ resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace-base@1.25.1':
+ resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace-base@1.30.1':
+ resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace-node@1.25.1':
+ resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/semantic-conventions@1.25.1':
+ resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/semantic-conventions@1.28.0':
+ resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/semantic-conventions@1.38.0':
+ resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/sql-common@0.40.1':
+ resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+
+ '@protobufjs/aspromise@1.1.2':
+ resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+
+ '@protobufjs/base64@1.1.2':
+ resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+
+ '@protobufjs/codegen@2.0.4':
+ resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+
+ '@protobufjs/eventemitter@1.1.0':
+ resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+
+ '@protobufjs/fetch@1.1.0':
+ resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+
+ '@protobufjs/float@1.0.2':
+ resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+
+ '@protobufjs/inquire@1.1.0':
+ resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+
+ '@protobufjs/path@1.1.2':
+ resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+
+ '@protobufjs/pool@1.1.0':
+ resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+
+ '@protobufjs/utf8@1.1.0':
+ resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+
+ '@so-ric/colorspace@1.1.6':
+ resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
+
+ '@tootallnate/once@2.0.0':
+ resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+ engines: {node: '>= 10'}
+
+ '@types/aws-lambda@8.10.122':
+ resolution: {integrity: sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==}
+
+ '@types/body-parser@1.19.6':
+ resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
+
+ '@types/bunyan@1.8.9':
+ resolution: {integrity: sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==}
+
+ '@types/caseless@0.12.5':
+ resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==}
+
+ '@types/connect@3.4.36':
+ resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/express-serve-static-core@4.19.7':
+ resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==}
+
+ '@types/express@4.17.25':
+ resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==}
+
+ '@types/http-errors@2.0.5':
+ resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/jsonwebtoken@9.0.10':
+ resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==}
+
+ '@types/long@4.0.2':
+ resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
+
+ '@types/memcached@2.2.10':
+ resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==}
+
+ '@types/mime@1.3.5':
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/mysql@2.15.22':
+ resolution: {integrity: sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==}
+
+ '@types/node-fetch@2.6.13':
+ resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==}
+
+ '@types/node@18.19.130':
+ resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==}
+
+ '@types/node@20.19.25':
+ resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==}
+
+ '@types/node@22.19.1':
+ resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==}
+
+ '@types/node@24.10.1':
+ resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==}
+
+ '@types/pg-pool@2.0.4':
+ resolution: {integrity: sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==}
+
+ '@types/pg@8.6.1':
+ resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==}
+
+ '@types/qs@6.14.0':
+ resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/request@2.48.13':
+ resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==}
+
+ '@types/send@0.17.6':
+ resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
+
+ '@types/send@1.2.1':
+ resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
+
+ '@types/serve-static@1.15.10':
+ resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==}
+
+ '@types/shimmer@1.2.0':
+ resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==}
+
+ '@types/tedious@4.0.14':
+ resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==}
+
+ '@types/tough-cookie@4.0.5':
+ resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+
+ '@types/triple-beam@1.3.5':
+ resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
+
+ '@types/yargs-parser@21.0.3':
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+ '@types/yargs@17.0.35':
+ resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
+
+ abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+
+ accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+
+ acorn-import-attributes@1.9.5:
+ resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
+ peerDependencies:
+ acorn: ^8
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
+ agentkeepalive@4.6.0:
+ resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==}
+ engines: {node: '>= 8.0.0'}
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ ansi-color@0.2.1:
+ resolution: {integrity: sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+ arrify@2.0.1:
+ resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
+ engines: {node: '>=8'}
+
+ async-mutex@0.5.0:
+ resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==}
+
+ async-retry@1.3.3:
+ resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ big.js@6.2.2:
+ resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==}
+
+ bignumber.js@9.3.1:
+ resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
+
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ buffer-equal-constant-time@1.0.1:
+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+
+ bufrw@1.4.0:
+ resolution: {integrity: sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==}
+ engines: {node: '>= 0.10.x'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ cjs-module-lexer@1.4.3:
+ resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ cliui@9.0.1:
+ resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
+ engines: {node: '>=20'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-convert@3.1.3:
+ resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==}
+ engines: {node: '>=14.6'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-name@2.1.0:
+ resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==}
+ engines: {node: '>=12.20'}
+
+ color-string@2.1.4:
+ resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==}
+ engines: {node: '>=18'}
+
+ color@5.0.3:
+ resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==}
+ engines: {node: '>=18'}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ data-uri-to-buffer@4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ dot-prop@6.0.1:
+ resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+ engines: {node: '>=10'}
+
+ dotenv-cli@10.0.0:
+ resolution: {integrity: sha512-lnOnttzfrzkRx2echxJHQRB6vOAMSCzzZg79IxpC00tU42wZPuZkQxNNrrwVAxaQZIIh001l4PxVlCrBxngBzA==}
+ hasBin: true
+
+ dotenv-expand@11.0.7:
+ resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==}
+ engines: {node: '>=12'}
+
+ dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+
+ dotenv@17.2.3:
+ resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
+ engines: {node: '>=12'}
+
+ dotprompt@1.1.2:
+ resolution: {integrity: sha512-24EU+eORQbPywBicIP44BiqykzEXFwZq1ZQKO5TEr9KrrENyDA7I1NzqhtmmEdQVfAXka0DEbSLPN5nerCqJ8A==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexify@4.1.3:
+ resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
+
+ ecdsa-sig-formatter@1.0.11:
+ resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ emoji-regex@10.6.0:
+ resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ enabled@2.0.0:
+ resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
+ error@7.0.2:
+ resolution: {integrity: sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ eventid@2.0.1:
+ resolution: {integrity: sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==}
+ engines: {node: '>=10'}
+
+ express@4.21.2:
+ resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+ engines: {node: '>= 0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ farmhash-modern@1.1.0:
+ resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==}
+ engines: {node: '>=18.0.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+ fast-xml-parser@4.5.3:
+ resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
+ hasBin: true
+
+ faye-websocket@0.11.4:
+ resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+ engines: {node: '>=0.8.0'}
+
+ fecha@4.2.3:
+ resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
+
+ fetch-blob@3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+
+ firebase-admin@13.6.0:
+ resolution: {integrity: sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==}
+ engines: {node: '>=18'}
+
+ fn.name@1.1.0:
+ resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
+
+ form-data-encoder@1.7.2:
+ resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==}
+
+ form-data@2.5.5:
+ resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==}
+ engines: {node: '>= 0.12'}
+
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
+ formdata-node@4.4.1:
+ resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==}
+ engines: {node: '>= 12.20'}
+
+ formdata-polyfill@4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ functional-red-black-tree@1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+
+ gaxios@6.7.1:
+ resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==}
+ engines: {node: '>=14'}
+
+ gcp-metadata@6.1.1:
+ resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==}
+ engines: {node: '>=14'}
+
+ genkit@1.24.0:
+ resolution: {integrity: sha512-9BjPrLULfWdzauibKkbZcCf2LVu0mW2EW6EXHK/cTber6QdiP/guA5mXahaaDWBo+qdIKpInXAYDEzcRUmCVSA==}
+
+ genkitx-anthropic@0.25.0:
+ resolution: {integrity: sha512-TiI5fA5iXpD2RYqV0+RsS3Y927niL7gSjcNVflNScK74i0mTDMhaHUXaPGEnLTGK5OtS5lWfXnj/Mkqo6n6J3g==}
+ peerDependencies:
+ genkit: ^1.15.0
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.4.0:
+ resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-port@5.1.1:
+ resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
+ engines: {node: '>=8'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.13.0:
+ resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
+
+ google-auth-library@9.15.1:
+ resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==}
+ engines: {node: '>=14'}
+
+ google-gax@4.6.1:
+ resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==}
+ engines: {node: '>=14'}
+
+ google-logging-utils@0.0.2:
+ resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==}
+ engines: {node: '>=14'}
+
+ googleapis-common@7.2.0:
+ resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==}
+ engines: {node: '>=14.0.0'}
+
+ googleapis@137.1.0:
+ resolution: {integrity: sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==}
+ engines: {node: '>=14.0.0'}
+
+ googleapis@140.0.1:
+ resolution: {integrity: sha512-ZGvBX4mQcFXO9ACnVNg6Aqy3KtBPB5zTuue43YVLxwn8HSv8jB7w+uDKoIPSoWuxGROgnj2kbng6acXncOQRNA==}
+ engines: {node: '>=14.0.0'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ gtoken@7.1.0:
+ resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==}
+ engines: {node: '>=14.0.0'}
+
+ handlebars@4.7.8:
+ resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
+ engines: {node: '>=0.4.7'}
+ hasBin: true
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hexer@1.5.0:
+ resolution: {integrity: sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==}
+ engines: {node: '>= 0.10.x'}
+ hasBin: true
+
+ html-entities@2.6.0:
+ resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
+
+ http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+
+ http-parser-js@0.5.10:
+ resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
+
+ http-proxy-agent@5.0.0:
+ resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+ engines: {node: '>= 6'}
+
+ https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
+ humanize-ms@1.2.1:
+ resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ import-in-the-middle@1.15.0:
+ resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is@3.3.2:
+ resolution: {integrity: sha512-a2xr4E3s1PjDS8ORcGgXpWx6V+liNs+O3JRD2mb9aeugD7rtkkZ0zgLdYgw0tWsKhsdiezGYptSiMlVazCBTuQ==}
+ engines: {node: '>= 0.4'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jaeger-client@3.19.0:
+ resolution: {integrity: sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==}
+ engines: {node: '>=10'}
+
+ jose@4.15.9:
+ resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+
+ json-bigint@1.0.0:
+ resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-schema@0.4.0:
+ resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonwebtoken@9.0.2:
+ resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
+ engines: {node: '>=12', npm: '>=6'}
+
+ jwa@1.4.2:
+ resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
+
+ jwa@2.0.1:
+ resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
+
+ jwks-rsa@3.2.0:
+ resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==}
+ engines: {node: '>=14'}
+
+ jws@3.2.2:
+ resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+
+ jws@4.0.0:
+ resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
+
+ kuler@2.0.0:
+ resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
+
+ limiter@1.1.5:
+ resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==}
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+ lodash.includes@4.3.0:
+ resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
+
+ lodash.isboolean@3.0.3:
+ resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
+
+ lodash.isinteger@4.0.4:
+ resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
+
+ lodash.isnumber@3.0.3:
+ resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.isstring@4.0.1:
+ resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
+
+ lodash.mapvalues@4.6.0:
+ resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.once@4.1.1:
+ resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
+
+ logform@2.7.0:
+ resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
+ engines: {node: '>= 12.0.0'}
+
+ long@1.1.5:
+ resolution: {integrity: sha512-TU6nAF5SdasnTr28c7e74P4Crbn9o3/zwo1pM22Wvg2i2vlZ4Eelxwu4QT7j21z0sDBlJDEnEZjXTZg2J8WJrg==}
+ engines: {node: '>=0.6'}
+
+ long@2.4.0:
+ resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==}
+ engines: {node: '>=0.6'}
+
+ long@5.3.2:
+ resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lru-memoizer@2.3.0:
+ resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+ methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mime@3.0.0:
+ resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ module-details-from-path@1.0.4:
+ resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ deprecated: Use your platform's native DOMException instead
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-fetch@3.3.2:
+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ node-forge@1.3.1:
+ resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
+ engines: {node: '>= 6.13.0'}
+
+ node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ one-time@1.0.0:
+ resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
+
+ openai@4.104.0:
+ resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==}
+ hasBin: true
+ peerDependencies:
+ ws: ^8.18.0
+ zod: ^3.23.8
+ peerDependenciesMeta:
+ ws:
+ optional: true
+ zod:
+ optional: true
+
+ opentracing@0.14.7:
+ resolution: {integrity: sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==}
+ engines: {node: '>=0.10'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ partial-json@0.1.7:
+ resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-protocol@1.10.3:
+ resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-bytea@1.0.0:
+ resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
+ prettier@3.6.2:
+ resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ process@0.10.1:
+ resolution: {integrity: sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==}
+ engines: {node: '>= 0.6.0'}
+
+ proto3-json-serializer@2.0.2:
+ resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
+ engines: {node: '>=14.0.0'}
+
+ protobuf.js@1.1.2:
+ resolution: {integrity: sha512-USO7Xus/pzPw549M1TguiyoOrKEhm9VMXv+CkDufcjMC8Rd7EPbxeRQPEjCV8ua1tm0k7z9xHkogcxovZogWdA==}
+
+ protobufjs@7.5.4:
+ resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
+ engines: {node: '>=12.0.0'}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ pump@3.0.3:
+ resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
+
+ pumpify@2.0.1:
+ resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==}
+
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+
+ qs@6.14.0:
+ resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+ engines: {node: '>=0.6'}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ require-in-the-middle@7.5.2:
+ resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==}
+ engines: {node: '>=8.6.0'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ retry-request@7.0.2:
+ resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==}
+ engines: {node: '>=14'}
+
+ retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shimmer@1.2.1:
+ resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ stack-trace@0.0.10:
+ resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
+
+ statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+
+ stream-events@1.0.5:
+ resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==}
+
+ stream-shift@1.0.3:
+ resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+
+ string-template@0.2.1:
+ resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.2:
+ resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
+ engines: {node: '>=12'}
+
+ strnum@1.1.2:
+ resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
+
+ stubs@3.0.0:
+ resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ teeny-request@9.0.0:
+ resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==}
+ engines: {node: '>=14'}
+
+ text-hex@1.0.0:
+ resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
+
+ thriftrw@3.11.4:
+ resolution: {integrity: sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==}
+ engines: {node: '>= 0.10.x'}
+ hasBin: true
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ triple-beam@1.4.1:
+ resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
+ engines: {node: '>= 14.0.0'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.20.6:
+ resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ uglify-js@3.19.3:
+ resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ uri-templates@0.2.0:
+ resolution: {integrity: sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==}
+
+ url-template@2.0.8:
+ resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@10.0.0:
+ resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
+ hasBin: true
+
+ uuid@11.1.0:
+ resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
+ hasBin: true
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
+ web-streams-polyfill@4.0.0-beta.3:
+ resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==}
+ engines: {node: '>= 14'}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ websocket-driver@0.7.4:
+ resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
+ engines: {node: '>=0.8.0'}
+
+ websocket-extensions@0.1.4:
+ resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
+ engines: {node: '>=0.8.0'}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ winston-transport@4.9.0:
+ resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
+ engines: {node: '>= 12.0.0'}
+
+ winston@3.18.3:
+ resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==}
+ engines: {node: '>= 12.0.0'}
+
+ wordwrap@1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ xorshift@1.2.0:
+ resolution: {integrity: sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@2.8.1:
+ resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs-parser@22.0.0:
+ resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yargs@18.0.0:
+ resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zod-to-json-schema@3.25.0:
+ resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==}
+ peerDependencies:
+ zod: ^3.25 || ^4
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
+snapshots:
+
+ '@anthropic-ai/sdk@0.24.3':
+ dependencies:
+ '@types/node': 18.19.130
+ '@types/node-fetch': 2.6.13
+ abort-controller: 3.0.0
+ agentkeepalive: 4.6.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ web-streams-polyfill: 3.3.3
+ transitivePeerDependencies:
+ - encoding
+
+ '@anthropic-ai/sdk@0.39.0':
+ dependencies:
+ '@types/node': 18.19.130
+ '@types/node-fetch': 2.6.13
+ abort-controller: 3.0.0
+ agentkeepalive: 4.6.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ '@anthropic-ai/vertex-sdk@0.4.3':
+ dependencies:
+ '@anthropic-ai/sdk': 0.24.3
+ google-auth-library: 9.15.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@colors/colors@1.6.0':
+ optional: true
+
+ '@dabh/diagnostics@2.0.8':
+ dependencies:
+ '@so-ric/colorspace': 1.1.6
+ enabled: 2.0.0
+ kuler: 2.0.0
+ optional: true
+
+ '@esbuild/aix-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm@0.25.12':
+ optional: true
+
+ '@esbuild/android-x64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
+ optional: true
+
+ '@fastify/busboy@3.2.0':
+ optional: true
+
+ '@firebase/app-check-interop-types@0.3.3':
+ optional: true
+
+ '@firebase/app-types@0.9.3':
+ optional: true
+
+ '@firebase/auth-interop-types@0.2.4':
+ optional: true
+
+ '@firebase/component@0.7.0':
+ dependencies:
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ optional: true
+
+ '@firebase/database-compat@2.1.0':
+ dependencies:
+ '@firebase/component': 0.7.0
+ '@firebase/database': 1.1.0
+ '@firebase/database-types': 1.0.16
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+ optional: true
+
+ '@firebase/database-types@1.0.16':
+ dependencies:
+ '@firebase/app-types': 0.9.3
+ '@firebase/util': 1.13.0
+ optional: true
+
+ '@firebase/database@1.1.0':
+ dependencies:
+ '@firebase/app-check-interop-types': 0.3.3
+ '@firebase/auth-interop-types': 0.2.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ faye-websocket: 0.11.4
+ tslib: 2.8.1
+ optional: true
+
+ '@firebase/logger@0.5.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@firebase/util@1.13.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@genkit-ai/ai@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@genkit-ai/core': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@opentelemetry/api': 1.9.0
+ '@types/node': 20.19.25
+ colorette: 2.0.20
+ dotprompt: 1.1.2
+ json5: 2.2.3
+ node-fetch: 3.3.2
+ partial-json: 0.1.7
+ uri-templates: 0.2.0
+ uuid: 10.0.0
+ transitivePeerDependencies:
+ - '@google-cloud/firestore'
+ - encoding
+ - firebase
+ - firebase-admin
+ - genkit
+ - supports-color
+
+ '@genkit-ai/compat-oai@1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))(zod@3.25.76)':
+ dependencies:
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ openai: 4.104.0(zod@3.25.76)
+ transitivePeerDependencies:
+ - encoding
+ - ws
+ - zod
+
+ '@genkit-ai/core@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-jaeger': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ '@types/json-schema': 7.0.15
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ async-mutex: 0.5.0
+ body-parser: 1.20.3
+ cors: 2.8.5
+ dotprompt: 1.1.2
+ express: 4.21.2
+ get-port: 5.1.1
+ json-schema: 0.4.0
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.0(zod@3.25.76)
+ optionalDependencies:
+ '@genkit-ai/firebase': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ transitivePeerDependencies:
+ - '@google-cloud/firestore'
+ - encoding
+ - firebase
+ - firebase-admin
+ - genkit
+ - supports-color
+
+ '@genkit-ai/firebase@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@genkit-ai/google-cloud': 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@google-cloud/firestore': 7.11.6
+ firebase-admin: 13.6.0
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@genkit-ai/google-cloud@1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@google-cloud/logging-winston': 6.0.1(winston@3.18.3)
+ '@google-cloud/opentelemetry-cloud-monitoring-exporter': 0.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0))
+ '@google-cloud/opentelemetry-cloud-trace-exporter': 2.4.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))
+ '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/auto-instrumentations-node': 0.49.2(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-pino': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-winston': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ google-auth-library: 9.15.1
+ node-fetch: 3.3.2
+ winston: 3.18.3
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@genkit-ai/google-genai@1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ google-auth-library: 9.15.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@genkit-ai/vertexai@1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))(zod@3.25.76)':
+ dependencies:
+ '@anthropic-ai/sdk': 0.24.3
+ '@anthropic-ai/vertex-sdk': 0.4.3
+ '@google-cloud/aiplatform': 3.35.0
+ '@google-cloud/vertexai': 1.10.0
+ '@mistralai/mistralai-gcp': 1.5.0(zod@3.25.76)
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ google-auth-library: 9.15.1
+ googleapis: 140.0.1
+ node-fetch: 3.3.2
+ openai: 4.104.0(zod@3.25.76)
+ optionalDependencies:
+ '@google-cloud/bigquery': 7.9.4
+ firebase-admin: 13.6.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ - ws
+ - zod
+
+ '@google-cloud/aiplatform@3.35.0':
+ dependencies:
+ google-gax: 4.6.1
+ protobuf.js: 1.1.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/bigquery@7.9.4':
+ dependencies:
+ '@google-cloud/common': 5.0.2
+ '@google-cloud/paginator': 5.0.2
+ '@google-cloud/precise-date': 4.0.0
+ '@google-cloud/promisify': 4.0.0
+ arrify: 2.0.1
+ big.js: 6.2.2
+ duplexify: 4.1.3
+ extend: 3.0.2
+ is: 3.3.2
+ stream-events: 1.0.5
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/common@5.0.2':
+ dependencies:
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 4.0.0
+ arrify: 2.0.1
+ duplexify: 4.1.3
+ extend: 3.0.2
+ google-auth-library: 9.15.1
+ html-entities: 2.6.0
+ retry-request: 7.0.2
+ teeny-request: 9.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/firestore@7.11.6':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ fast-deep-equal: 3.1.3
+ functional-red-black-tree: 1.0.1
+ google-gax: 4.6.1
+ protobufjs: 7.5.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/logging-winston@6.0.1(winston@3.18.3)':
+ dependencies:
+ '@google-cloud/logging': 11.2.1
+ google-auth-library: 9.15.1
+ lodash.mapvalues: 4.6.0
+ winston: 3.18.3
+ winston-transport: 4.9.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/logging@11.2.1':
+ dependencies:
+ '@google-cloud/common': 5.0.2
+ '@google-cloud/paginator': 5.0.2
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 4.0.0
+ '@opentelemetry/api': 1.9.0
+ arrify: 2.0.1
+ dot-prop: 6.0.1
+ eventid: 2.0.1
+ extend: 3.0.2
+ gcp-metadata: 6.1.1
+ google-auth-library: 9.15.1
+ google-gax: 4.6.1
+ on-finished: 2.4.1
+ pumpify: 2.0.1
+ stream-events: 1.0.5
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/opentelemetry-cloud-monitoring-exporter@0.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0))':
+ dependencies:
+ '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))
+ '@google-cloud/precise-date': 4.0.0
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ google-auth-library: 9.15.1
+ googleapis: 137.1.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/opentelemetry-cloud-trace-exporter@2.4.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))':
+ dependencies:
+ '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))
+ '@grpc/grpc-js': 1.14.1
+ '@grpc/proto-loader': 0.7.15
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ google-auth-library: 9.15.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/opentelemetry-resource-util@2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))':
+ dependencies:
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ gcp-metadata: 6.1.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/paginator@5.0.2':
+ dependencies:
+ arrify: 2.0.1
+ extend: 3.0.2
+ optional: true
+
+ '@google-cloud/precise-date@4.0.0':
+ optional: true
+
+ '@google-cloud/projectify@4.0.0':
+ optional: true
+
+ '@google-cloud/promisify@4.0.0':
+ optional: true
+
+ '@google-cloud/storage@7.17.3':
+ dependencies:
+ '@google-cloud/paginator': 5.0.2
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 4.0.0
+ abort-controller: 3.0.0
+ async-retry: 1.3.3
+ duplexify: 4.1.3
+ fast-xml-parser: 4.5.3
+ gaxios: 6.7.1
+ google-auth-library: 9.15.1
+ html-entities: 2.6.0
+ mime: 3.0.0
+ p-limit: 3.1.0
+ retry-request: 7.0.2
+ teeny-request: 9.0.0
+ uuid: 8.3.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@google-cloud/vertexai@1.10.0':
+ dependencies:
+ google-auth-library: 9.15.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@grpc/grpc-js@1.14.1':
+ dependencies:
+ '@grpc/proto-loader': 0.8.0
+ '@js-sdsl/ordered-map': 4.4.2
+
+ '@grpc/proto-loader@0.7.15':
+ dependencies:
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
+
+ '@grpc/proto-loader@0.8.0':
+ dependencies:
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
+
+ '@js-sdsl/ordered-map@4.4.2': {}
+
+ '@mistralai/mistralai-gcp@1.5.0(zod@3.25.76)':
+ dependencies:
+ google-auth-library: 9.15.1
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@opentelemetry/api-logs@0.52.1':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+
+ '@opentelemetry/api@1.9.0': {}
+
+ '@opentelemetry/auto-instrumentations-node@0.49.2(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-amqplib': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-aws-lambda': 0.43.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-aws-sdk': 0.43.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-bunyan': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-cassandra-driver': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-connect': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-cucumber': 0.8.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-dataloader': 0.11.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-dns': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-express': 0.41.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-fastify': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-fs': 0.14.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-generic-pool': 0.38.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-graphql': 0.42.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-grpc': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-hapi': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-http': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-ioredis': 0.42.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-kafkajs': 0.2.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-knex': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-koa': 0.42.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-lru-memoizer': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-memcached': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mongodb': 0.46.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mongoose': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mysql': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mysql2': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-nestjs-core': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-net': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-pg': 0.43.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-pino': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-redis': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-redis-4': 0.41.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-restify': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-router': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-socket.io': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-tedious': 0.13.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-undici': 0.5.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-winston': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-alibaba-cloud': 0.29.7(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-aws': 1.12.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-azure': 0.2.12(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-container': 0.4.4(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-gcp': 0.29.13(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+
+ '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/exporter-jaeger@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.28.0
+ jaeger-client: 3.19.0
+
+ '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/instrumentation-amqplib@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-aws-lambda@0.43.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagator-aws-xray': 1.26.2(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/aws-lambda': 8.10.122
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-aws-sdk@0.43.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagation-utils': 0.30.16(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-bunyan@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@types/bunyan': 1.8.9
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-cassandra-driver@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-connect@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/connect': 3.4.36
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-cucumber@0.8.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-dataloader@0.11.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-dns@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-express@0.41.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-fastify@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-fs@0.14.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-generic-pool@0.38.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-graphql@0.42.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-grpc@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-hapi@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-http@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-ioredis@0.42.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/redis-common': 0.36.2
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-kafkajs@0.2.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-knex@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-koa@0.42.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-lru-memoizer@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-memcached@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/memcached': 2.2.10
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-mongodb@0.46.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-mongoose@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-mysql2@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-mysql@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/mysql': 2.15.22
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-nestjs-core@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-net@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-pg@0.43.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0)
+ '@types/pg': 8.6.1
+ '@types/pg-pool': 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-pino@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-redis-4@0.41.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/redis-common': 0.36.2
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-redis@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/redis-common': 0.36.2
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-restify@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-router@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-socket.io@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-tedious@0.13.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/tedious': 4.0.14
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-undici@0.5.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation-winston@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@types/shimmer': 1.2.0
+ import-in-the-middle: 1.15.0
+ require-in-the-middle: 7.5.2
+ semver: 7.7.3
+ shimmer: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ protobufjs: 7.5.4
+
+ '@opentelemetry/propagation-utils@0.30.16(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ optional: true
+
+ '@opentelemetry/propagator-aws-xray@1.26.2(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ optional: true
+
+ '@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/redis-common@0.36.2':
+ optional: true
+
+ '@opentelemetry/resource-detector-alibaba-cloud@0.29.7(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ optional: true
+
+ '@opentelemetry/resource-detector-aws@1.12.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ optional: true
+
+ '@opentelemetry/resource-detector-azure@0.2.12(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ optional: true
+
+ '@opentelemetry/resource-detector-container@0.4.4(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ optional: true
+
+ '@opentelemetry/resource-detector-gcp@0.29.13(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ gcp-metadata: 6.1.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ lodash.merge: 4.6.2
+
+ '@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ semver: 7.7.3
+
+ '@opentelemetry/semantic-conventions@1.25.1': {}
+
+ '@opentelemetry/semantic-conventions@1.28.0': {}
+
+ '@opentelemetry/semantic-conventions@1.38.0':
+ optional: true
+
+ '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ optional: true
+
+ '@protobufjs/aspromise@1.1.2': {}
+
+ '@protobufjs/base64@1.1.2': {}
+
+ '@protobufjs/codegen@2.0.4': {}
+
+ '@protobufjs/eventemitter@1.1.0': {}
+
+ '@protobufjs/fetch@1.1.0':
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/inquire': 1.1.0
+
+ '@protobufjs/float@1.0.2': {}
+
+ '@protobufjs/inquire@1.1.0': {}
+
+ '@protobufjs/path@1.1.2': {}
+
+ '@protobufjs/pool@1.1.0': {}
+
+ '@protobufjs/utf8@1.1.0': {}
+
+ '@so-ric/colorspace@1.1.6':
+ dependencies:
+ color: 5.0.3
+ text-hex: 1.0.0
+ optional: true
+
+ '@tootallnate/once@2.0.0': {}
+
+ '@types/aws-lambda@8.10.122':
+ optional: true
+
+ '@types/body-parser@1.19.6':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 22.19.1
+ optional: true
+
+ '@types/bunyan@1.8.9':
+ dependencies:
+ '@types/node': 24.10.1
+ optional: true
+
+ '@types/caseless@0.12.5': {}
+
+ '@types/connect@3.4.36':
+ dependencies:
+ '@types/node': 24.10.1
+ optional: true
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 22.19.1
+ optional: true
+
+ '@types/express-serve-static-core@4.19.7':
+ dependencies:
+ '@types/node': 22.19.1
+ '@types/qs': 6.14.0
+ '@types/range-parser': 1.2.7
+ '@types/send': 1.2.1
+ optional: true
+
+ '@types/express@4.17.25':
+ dependencies:
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 4.19.7
+ '@types/qs': 6.14.0
+ '@types/serve-static': 1.15.10
+ optional: true
+
+ '@types/http-errors@2.0.5':
+ optional: true
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/jsonwebtoken@9.0.10':
+ dependencies:
+ '@types/ms': 2.1.0
+ '@types/node': 22.19.1
+ optional: true
+
+ '@types/long@4.0.2': {}
+
+ '@types/memcached@2.2.10':
+ dependencies:
+ '@types/node': 24.10.1
+ optional: true
+
+ '@types/mime@1.3.5':
+ optional: true
+
+ '@types/ms@2.1.0':
+ optional: true
+
+ '@types/mysql@2.15.22':
+ dependencies:
+ '@types/node': 24.10.1
+ optional: true
+
+ '@types/node-fetch@2.6.13':
+ dependencies:
+ '@types/node': 18.19.130
+ form-data: 4.0.5
+
+ '@types/node@18.19.130':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/node@20.19.25':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/node@22.19.1':
+ dependencies:
+ undici-types: 6.21.0
+ optional: true
+
+ '@types/node@24.10.1':
+ dependencies:
+ undici-types: 7.16.0
+
+ '@types/pg-pool@2.0.4':
+ dependencies:
+ '@types/pg': 8.6.1
+ optional: true
+
+ '@types/pg@8.6.1':
+ dependencies:
+ '@types/node': 24.10.1
+ pg-protocol: 1.10.3
+ pg-types: 2.2.0
+ optional: true
+
+ '@types/qs@6.14.0':
+ optional: true
+
+ '@types/range-parser@1.2.7':
+ optional: true
+
+ '@types/request@2.48.13':
+ dependencies:
+ '@types/caseless': 0.12.5
+ '@types/node': 24.10.1
+ '@types/tough-cookie': 4.0.5
+ form-data: 2.5.5
+
+ '@types/send@0.17.6':
+ dependencies:
+ '@types/mime': 1.3.5
+ '@types/node': 22.19.1
+ optional: true
+
+ '@types/send@1.2.1':
+ dependencies:
+ '@types/node': 22.19.1
+ optional: true
+
+ '@types/serve-static@1.15.10':
+ dependencies:
+ '@types/http-errors': 2.0.5
+ '@types/node': 22.19.1
+ '@types/send': 0.17.6
+ optional: true
+
+ '@types/shimmer@1.2.0': {}
+
+ '@types/tedious@4.0.14':
+ dependencies:
+ '@types/node': 24.10.1
+ optional: true
+
+ '@types/tough-cookie@4.0.5': {}
+
+ '@types/triple-beam@1.3.5':
+ optional: true
+
+ '@types/yargs-parser@21.0.3': {}
+
+ '@types/yargs@17.0.35':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ abort-controller@3.0.0:
+ dependencies:
+ event-target-shim: 5.0.1
+
+ accepts@1.3.8:
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+
+ acorn-import-attributes@1.9.5(acorn@8.15.0):
+ dependencies:
+ acorn: 8.15.0
+
+ acorn@8.15.0: {}
+
+ agent-base@6.0.2:
+ dependencies:
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ agent-base@7.1.4: {}
+
+ agentkeepalive@4.6.0:
+ dependencies:
+ humanize-ms: 1.2.1
+
+ ajv-formats@3.0.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ansi-color@0.2.1: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.2.2: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.3: {}
+
+ array-flatten@1.1.1: {}
+
+ arrify@2.0.1:
+ optional: true
+
+ async-mutex@0.5.0:
+ dependencies:
+ tslib: 2.8.1
+
+ async-retry@1.3.3:
+ dependencies:
+ retry: 0.13.1
+ optional: true
+
+ async@3.2.6:
+ optional: true
+
+ asynckit@0.4.0: {}
+
+ base64-js@1.5.1: {}
+
+ big.js@6.2.2:
+ optional: true
+
+ bignumber.js@9.3.1: {}
+
+ body-parser@1.20.3:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.13.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ buffer-equal-constant-time@1.0.1: {}
+
+ bufrw@1.4.0:
+ dependencies:
+ ansi-color: 0.2.1
+ error: 7.0.2
+ hexer: 1.5.0
+ xtend: 4.0.2
+
+ bytes@3.1.2: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ cjs-module-lexer@1.4.3: {}
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ cliui@9.0.1:
+ dependencies:
+ string-width: 7.2.0
+ strip-ansi: 7.1.2
+ wrap-ansi: 9.0.2
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-convert@3.1.3:
+ dependencies:
+ color-name: 2.1.0
+ optional: true
+
+ color-name@1.1.4: {}
+
+ color-name@2.1.0:
+ optional: true
+
+ color-string@2.1.4:
+ dependencies:
+ color-name: 2.1.0
+ optional: true
+
+ color@5.0.3:
+ dependencies:
+ color-convert: 3.1.3
+ color-string: 2.1.4
+ optional: true
+
+ colorette@2.0.20: {}
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ content-disposition@0.5.4:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ content-type@1.0.5: {}
+
+ cookie-signature@1.0.6: {}
+
+ cookie@0.7.1: {}
+
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ data-uri-to-buffer@4.0.1: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ delayed-stream@1.0.0: {}
+
+ depd@2.0.0: {}
+
+ destroy@1.2.0: {}
+
+ dot-prop@6.0.1:
+ dependencies:
+ is-obj: 2.0.0
+ optional: true
+
+ dotenv-cli@10.0.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ dotenv: 17.2.3
+ dotenv-expand: 11.0.7
+ minimist: 1.2.8
+
+ dotenv-expand@11.0.7:
+ dependencies:
+ dotenv: 16.6.1
+
+ dotenv@16.6.1: {}
+
+ dotenv@17.2.3: {}
+
+ dotprompt@1.1.2:
+ dependencies:
+ handlebars: 4.7.8
+ yaml: 2.8.1
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexify@4.1.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ stream-shift: 1.0.3
+
+ ecdsa-sig-formatter@1.0.11:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ ee-first@1.1.1: {}
+
+ emoji-regex@10.6.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ enabled@2.0.0:
+ optional: true
+
+ encodeurl@1.0.2: {}
+
+ encodeurl@2.0.0: {}
+
+ end-of-stream@1.4.5:
+ dependencies:
+ once: 1.4.0
+
+ error@7.0.2:
+ dependencies:
+ string-template: 0.2.1
+ xtend: 4.0.2
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ esbuild@0.25.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ etag@1.8.1: {}
+
+ event-target-shim@5.0.1: {}
+
+ eventid@2.0.1:
+ dependencies:
+ uuid: 8.3.2
+ optional: true
+
+ express@4.21.2:
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.3
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.12
+ proxy-addr: 2.0.7
+ qs: 6.13.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.0
+ serve-static: 1.16.2
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ extend@3.0.2: {}
+
+ farmhash-modern@1.1.0:
+ optional: true
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-uri@3.1.0: {}
+
+ fast-xml-parser@4.5.3:
+ dependencies:
+ strnum: 1.1.2
+ optional: true
+
+ faye-websocket@0.11.4:
+ dependencies:
+ websocket-driver: 0.7.4
+ optional: true
+
+ fecha@4.2.3:
+ optional: true
+
+ fetch-blob@3.2.0:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
+
+ finalhandler@1.3.1:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ firebase-admin@13.6.0:
+ dependencies:
+ '@fastify/busboy': 3.2.0
+ '@firebase/database-compat': 2.1.0
+ '@firebase/database-types': 1.0.16
+ '@types/node': 22.19.1
+ farmhash-modern: 1.1.0
+ fast-deep-equal: 3.1.3
+ google-auth-library: 9.15.1
+ jsonwebtoken: 9.0.2
+ jwks-rsa: 3.2.0
+ node-forge: 1.3.1
+ uuid: 11.1.0
+ optionalDependencies:
+ '@google-cloud/firestore': 7.11.6
+ '@google-cloud/storage': 7.17.3
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ fn.name@1.1.0:
+ optional: true
+
+ form-data-encoder@1.7.2: {}
+
+ form-data@2.5.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+ safe-buffer: 5.2.1
+
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
+ formdata-node@4.4.1:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 4.0.0-beta.3
+
+ formdata-polyfill@4.0.10:
+ dependencies:
+ fetch-blob: 3.2.0
+
+ forwarded@0.2.0: {}
+
+ fresh@0.5.2: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ functional-red-black-tree@1.0.1:
+ optional: true
+
+ gaxios@6.7.1:
+ dependencies:
+ extend: 3.0.2
+ https-proxy-agent: 7.0.6
+ is-stream: 2.0.1
+ node-fetch: 2.7.0
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ gcp-metadata@6.1.1:
+ dependencies:
+ gaxios: 6.7.1
+ google-logging-utils: 0.0.2
+ json-bigint: 1.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0):
+ dependencies:
+ '@genkit-ai/ai': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@genkit-ai/core': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ uuid: 10.0.0
+ transitivePeerDependencies:
+ - '@google-cloud/firestore'
+ - encoding
+ - firebase
+ - firebase-admin
+ - supports-color
+
+ genkitx-anthropic@0.25.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)):
+ dependencies:
+ '@anthropic-ai/sdk': 0.39.0
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ transitivePeerDependencies:
+ - encoding
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.4.0: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-port@5.1.1: {}
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-tsconfig@4.13.0:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ google-auth-library@9.15.1:
+ dependencies:
+ base64-js: 1.5.1
+ ecdsa-sig-formatter: 1.0.11
+ gaxios: 6.7.1
+ gcp-metadata: 6.1.1
+ gtoken: 7.1.0
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ google-gax@4.6.1:
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@grpc/proto-loader': 0.7.15
+ '@types/long': 4.0.2
+ abort-controller: 3.0.0
+ duplexify: 4.1.3
+ google-auth-library: 9.15.1
+ node-fetch: 2.7.0
+ object-hash: 3.0.0
+ proto3-json-serializer: 2.0.2
+ protobufjs: 7.5.4
+ retry-request: 7.0.2
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ google-logging-utils@0.0.2: {}
+
+ googleapis-common@7.2.0:
+ dependencies:
+ extend: 3.0.2
+ gaxios: 6.7.1
+ google-auth-library: 9.15.1
+ qs: 6.14.0
+ url-template: 2.0.8
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ googleapis@137.1.0:
+ dependencies:
+ google-auth-library: 9.15.1
+ googleapis-common: 7.2.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ googleapis@140.0.1:
+ dependencies:
+ google-auth-library: 9.15.1
+ googleapis-common: 7.2.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ gopd@1.2.0: {}
+
+ gtoken@7.1.0:
+ dependencies:
+ gaxios: 6.7.1
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ handlebars@4.7.8:
+ dependencies:
+ minimist: 1.2.8
+ neo-async: 2.6.2
+ source-map: 0.6.1
+ wordwrap: 1.0.0
+ optionalDependencies:
+ uglify-js: 3.19.3
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hexer@1.5.0:
+ dependencies:
+ ansi-color: 0.2.1
+ minimist: 1.2.8
+ process: 0.10.1
+ xtend: 4.0.2
+
+ html-entities@2.6.0:
+ optional: true
+
+ http-errors@2.0.0:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+
+ http-parser-js@0.5.10:
+ optional: true
+
+ http-proxy-agent@5.0.0:
+ dependencies:
+ '@tootallnate/once': 2.0.0
+ agent-base: 6.0.2
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@5.0.1:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ humanize-ms@1.2.1:
+ dependencies:
+ ms: 2.1.3
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ import-in-the-middle@1.15.0:
+ dependencies:
+ acorn: 8.15.0
+ acorn-import-attributes: 1.9.5(acorn@8.15.0)
+ cjs-module-lexer: 1.4.3
+ module-details-from-path: 1.0.4
+
+ inherits@2.0.4: {}
+
+ ipaddr.js@1.9.1: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-obj@2.0.0:
+ optional: true
+
+ is-stream@2.0.1: {}
+
+ is@3.3.2:
+ optional: true
+
+ isexe@2.0.0: {}
+
+ jaeger-client@3.19.0:
+ dependencies:
+ node-int64: 0.4.0
+ opentracing: 0.14.7
+ thriftrw: 3.11.4
+ uuid: 8.3.2
+ xorshift: 1.2.0
+
+ jose@4.15.9:
+ optional: true
+
+ json-bigint@1.0.0:
+ dependencies:
+ bignumber.js: 9.3.1
+
+ json-schema-traverse@1.0.0: {}
+
+ json-schema@0.4.0: {}
+
+ json5@2.2.3: {}
+
+ jsonwebtoken@9.0.2:
+ dependencies:
+ jws: 3.2.2
+ lodash.includes: 4.3.0
+ lodash.isboolean: 3.0.3
+ lodash.isinteger: 4.0.4
+ lodash.isnumber: 3.0.3
+ lodash.isplainobject: 4.0.6
+ lodash.isstring: 4.0.1
+ lodash.once: 4.1.1
+ ms: 2.1.3
+ semver: 7.7.3
+ optional: true
+
+ jwa@1.4.2:
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+ optional: true
+
+ jwa@2.0.1:
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+
+ jwks-rsa@3.2.0:
+ dependencies:
+ '@types/express': 4.17.25
+ '@types/jsonwebtoken': 9.0.10
+ debug: 4.4.3
+ jose: 4.15.9
+ limiter: 1.1.5
+ lru-memoizer: 2.3.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ jws@3.2.2:
+ dependencies:
+ jwa: 1.4.2
+ safe-buffer: 5.2.1
+ optional: true
+
+ jws@4.0.0:
+ dependencies:
+ jwa: 2.0.1
+ safe-buffer: 5.2.1
+
+ kuler@2.0.0:
+ optional: true
+
+ limiter@1.1.5:
+ optional: true
+
+ lodash.camelcase@4.3.0: {}
+
+ lodash.clonedeep@4.5.0:
+ optional: true
+
+ lodash.includes@4.3.0:
+ optional: true
+
+ lodash.isboolean@3.0.3:
+ optional: true
+
+ lodash.isinteger@4.0.4:
+ optional: true
+
+ lodash.isnumber@3.0.3:
+ optional: true
+
+ lodash.isplainobject@4.0.6:
+ optional: true
+
+ lodash.isstring@4.0.1:
+ optional: true
+
+ lodash.mapvalues@4.6.0:
+ optional: true
+
+ lodash.merge@4.6.2: {}
+
+ lodash.once@4.1.1:
+ optional: true
+
+ logform@2.7.0:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@types/triple-beam': 1.3.5
+ fecha: 4.2.3
+ ms: 2.1.3
+ safe-stable-stringify: 2.5.0
+ triple-beam: 1.4.1
+ optional: true
+
+ long@1.1.5: {}
+
+ long@2.4.0: {}
+
+ long@5.3.2: {}
+
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+ optional: true
+
+ lru-memoizer@2.3.0:
+ dependencies:
+ lodash.clonedeep: 4.5.0
+ lru-cache: 6.0.0
+ optional: true
+
+ math-intrinsics@1.1.0: {}
+
+ media-typer@0.3.0: {}
+
+ merge-descriptors@1.0.3: {}
+
+ methods@1.1.2: {}
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0: {}
+
+ mime@3.0.0:
+ optional: true
+
+ minimist@1.2.8: {}
+
+ module-details-from-path@1.0.4: {}
+
+ ms@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ negotiator@0.6.3: {}
+
+ neo-async@2.6.2: {}
+
+ node-domexception@1.0.0: {}
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-fetch@3.3.2:
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+
+ node-forge@1.3.1:
+ optional: true
+
+ node-int64@0.4.0: {}
+
+ object-assign@4.1.1: {}
+
+ object-hash@3.0.0: {}
+
+ object-inspect@1.13.4: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ one-time@1.0.0:
+ dependencies:
+ fn.name: 1.1.0
+ optional: true
+
+ openai@4.104.0(zod@3.25.76):
+ dependencies:
+ '@types/node': 18.19.130
+ '@types/node-fetch': 2.6.13
+ abort-controller: 3.0.0
+ agentkeepalive: 4.6.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ optionalDependencies:
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - encoding
+
+ opentracing@0.14.7: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+ optional: true
+
+ parseurl@1.3.3: {}
+
+ partial-json@0.1.7: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-to-regexp@0.1.12: {}
+
+ pg-int8@1.0.1:
+ optional: true
+
+ pg-protocol@1.10.3:
+ optional: true
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.0
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+ optional: true
+
+ postgres-array@2.0.0:
+ optional: true
+
+ postgres-bytea@1.0.0:
+ optional: true
+
+ postgres-date@1.0.7:
+ optional: true
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
+ optional: true
+
+ prettier@3.6.2: {}
+
+ process@0.10.1: {}
+
+ proto3-json-serializer@2.0.2:
+ dependencies:
+ protobufjs: 7.5.4
+
+ protobuf.js@1.1.2:
+ dependencies:
+ long: 1.1.5
+
+ protobufjs@7.5.4:
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/base64': 1.1.2
+ '@protobufjs/codegen': 2.0.4
+ '@protobufjs/eventemitter': 1.1.0
+ '@protobufjs/fetch': 1.1.0
+ '@protobufjs/float': 1.0.2
+ '@protobufjs/inquire': 1.1.0
+ '@protobufjs/path': 1.1.2
+ '@protobufjs/pool': 1.1.0
+ '@protobufjs/utf8': 1.1.0
+ '@types/node': 24.10.1
+ long: 5.3.2
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ pump@3.0.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ once: 1.4.0
+ optional: true
+
+ pumpify@2.0.1:
+ dependencies:
+ duplexify: 4.1.3
+ inherits: 2.0.4
+ pump: 3.0.3
+ optional: true
+
+ qs@6.13.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ qs@6.14.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ range-parser@1.2.1: {}
+
+ raw-body@2.5.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ require-in-the-middle@7.5.2:
+ dependencies:
+ debug: 4.4.3
+ module-details-from-path: 1.0.4
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.11:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ retry-request@7.0.2:
+ dependencies:
+ '@types/request': 2.48.13
+ extend: 3.0.2
+ teeny-request: 9.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ retry@0.13.1:
+ optional: true
+
+ safe-buffer@5.2.1: {}
+
+ safe-stable-stringify@2.5.0:
+ optional: true
+
+ safer-buffer@2.1.2: {}
+
+ semver@7.7.3: {}
+
+ send@0.19.0:
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@1.16.2:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.0
+ transitivePeerDependencies:
+ - supports-color
+
+ setprototypeof@1.2.0: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shimmer@1.2.1: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ source-map@0.6.1: {}
+
+ stack-trace@0.0.10:
+ optional: true
+
+ statuses@2.0.1: {}
+
+ stream-events@1.0.5:
+ dependencies:
+ stubs: 3.0.0
+
+ stream-shift@1.0.3: {}
+
+ string-template@0.2.1: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.4.0
+ strip-ansi: 7.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.2:
+ dependencies:
+ ansi-regex: 6.2.2
+
+ strnum@1.1.2:
+ optional: true
+
+ stubs@3.0.0: {}
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ teeny-request@9.0.0:
+ dependencies:
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ node-fetch: 2.7.0
+ stream-events: 1.0.5
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ text-hex@1.0.0:
+ optional: true
+
+ thriftrw@3.11.4:
+ dependencies:
+ bufrw: 1.4.0
+ error: 7.0.2
+ long: 2.4.0
+
+ toidentifier@1.0.1: {}
+
+ tr46@0.0.3: {}
+
+ triple-beam@1.4.1:
+ optional: true
+
+ tslib@2.8.1: {}
+
+ tsx@4.20.6:
+ dependencies:
+ esbuild: 0.25.12
+ get-tsconfig: 4.13.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ typescript@5.9.3: {}
+
+ uglify-js@3.19.3:
+ optional: true
+
+ undici-types@5.26.5: {}
+
+ undici-types@6.21.0: {}
+
+ undici-types@7.16.0: {}
+
+ unpipe@1.0.0: {}
+
+ uri-templates@0.2.0: {}
+
+ url-template@2.0.8: {}
+
+ util-deprecate@1.0.2: {}
+
+ utils-merge@1.0.1: {}
+
+ uuid@10.0.0: {}
+
+ uuid@11.1.0:
+ optional: true
+
+ uuid@8.3.2: {}
+
+ uuid@9.0.1: {}
+
+ vary@1.1.2: {}
+
+ web-streams-polyfill@3.3.3: {}
+
+ web-streams-polyfill@4.0.0-beta.3: {}
+
+ webidl-conversions@3.0.1: {}
+
+ websocket-driver@0.7.4:
+ dependencies:
+ http-parser-js: 0.5.10
+ safe-buffer: 5.2.1
+ websocket-extensions: 0.1.4
+ optional: true
+
+ websocket-extensions@0.1.4:
+ optional: true
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ winston-transport@4.9.0:
+ dependencies:
+ logform: 2.7.0
+ readable-stream: 3.6.2
+ triple-beam: 1.4.1
+ optional: true
+
+ winston@3.18.3:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@dabh/diagnostics': 2.0.8
+ async: 3.2.6
+ is-stream: 2.0.1
+ logform: 2.7.0
+ one-time: 1.0.0
+ readable-stream: 3.6.2
+ safe-stable-stringify: 2.5.0
+ stack-trace: 0.0.10
+ triple-beam: 1.4.1
+ winston-transport: 4.9.0
+ optional: true
+
+ wordwrap@1.0.0: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@9.0.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.1.2
+
+ wrappy@1.0.2: {}
+
+ xorshift@1.2.0: {}
+
+ xtend@4.0.2: {}
+
+ y18n@5.0.8: {}
+
+ yallist@4.0.0:
+ optional: true
+
+ yaml@2.8.1: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs-parser@22.0.0: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yargs@18.0.0:
+ dependencies:
+ cliui: 9.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ string-width: 7.2.0
+ y18n: 5.0.8
+ yargs-parser: 22.0.0
+
+ yocto-queue@0.1.0:
+ optional: true
+
+ zod-to-json-schema@3.25.0(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod@3.25.76: {}
diff --git a/vendor/a2ui/specification/0.8/eval/pnpm-workspace.yaml b/vendor/a2ui/specification/0.8/eval/pnpm-workspace.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..719ee0b40eff30adf08c69593f54aa773c37204b
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/pnpm-workspace.yaml
@@ -0,0 +1,18 @@
+# Copyright 2025 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+onlyBuiltDependencies:
+ - '@firebase/util'
+ - esbuild
+ - protobufjs
diff --git a/vendor/a2ui/specification/0.8/eval/src/basic_schema_matcher.ts b/vendor/a2ui/specification/0.8/eval/src/basic_schema_matcher.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fd530e55e31cae121f16bc4183fb0e4e8e56f2c7
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/basic_schema_matcher.ts
@@ -0,0 +1,65 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { SchemaMatcher, ValidationResult } from "./schema_matcher";
+
+export class BasicSchemaMatcher extends SchemaMatcher {
+ constructor(
+ public propertyPath: string,
+ public propertyValue?: any,
+ ) {
+ super();
+ }
+
+ validate(schema: any): ValidationResult {
+ if (!schema) {
+ const result: ValidationResult = {
+ success: false,
+ error: "Schema is undefined.",
+ };
+ return result;
+ }
+
+ const pathParts = this.propertyPath.split(".");
+ let actualValue = schema;
+ for (const part of pathParts) {
+ if (actualValue && typeof actualValue === "object") {
+ actualValue = actualValue[part];
+ } else {
+ actualValue = undefined;
+ break;
+ }
+ }
+
+ if (actualValue === undefined) {
+ const error = `Failed to find property '${this.propertyPath}'.`;
+ return { success: false, error };
+ }
+
+ if (this.propertyValue !== undefined) {
+ if (JSON.stringify(actualValue) !== JSON.stringify(this.propertyValue)) {
+ const error = `Property '${
+ this.propertyPath
+ }' has value '${JSON.stringify(
+ actualValue,
+ )}', but expected '${JSON.stringify(this.propertyValue)}'.`;
+ return { success: false, error };
+ }
+ }
+
+ return { success: true };
+ }
+}
diff --git a/vendor/a2ui/specification/0.8/eval/src/dev.ts b/vendor/a2ui/specification/0.8/eval/src/dev.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f1b747bcd59580664179e312372858f1a1f69bfa
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/dev.ts
@@ -0,0 +1,17 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import "./flows";
diff --git a/vendor/a2ui/specification/0.8/eval/src/flows.ts b/vendor/a2ui/specification/0.8/eval/src/flows.ts
new file mode 100644
index 0000000000000000000000000000000000000000..95b538cd4963f3b0605feedfa66a0e966316ac93
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/flows.ts
@@ -0,0 +1,71 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { googleAI } from "@genkit-ai/google-genai";
+import { genkit, z } from "genkit";
+import { openAI } from "@genkit-ai/compat-oai/openai";
+import { anthropic } from "genkitx-anthropic";
+
+const plugins = [];
+
+if (process.env.GEMINI_API_KEY) {
+ console.log("Initializing Google AI plugin...");
+ plugins.push(
+ googleAI({
+ apiKey: process.env.GEMINI_API_KEY!,
+ experimental_debugTraces: true,
+ }),
+ );
+}
+if (process.env.OPENAI_API_KEY) {
+ console.log("Initializing OpenAI plugin...");
+ plugins.push(openAI());
+}
+if (process.env.ANTHROPIC_API_KEY) {
+ console.log("Initializing Anthropic plugin...");
+ plugins.push(anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! }));
+}
+
+export const ai = genkit({
+ plugins,
+});
+
+// Define a UI component generator flow
+export const componentGeneratorFlow = ai.defineFlow(
+ {
+ name: "componentGeneratorFlow",
+ inputSchema: z.object({
+ prompt: z.string(),
+ model: z.any(),
+ config: z.any().optional(),
+ schema: z.any(),
+ }),
+ outputSchema: z.any(),
+ },
+ async ({ prompt, model, config, schema }) => {
+ // Generate structured component data using the schema from the file
+ const { output } = await ai.generate({
+ prompt,
+ model,
+ output: { contentType: "application/json", jsonSchema: schema },
+ config,
+ });
+
+ if (!output) throw new Error("Failed to generate component");
+
+ return output;
+ },
+);
diff --git a/vendor/a2ui/specification/0.8/eval/src/index.ts b/vendor/a2ui/specification/0.8/eval/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e8a3873a3b23f1cba4b32b687006a8c3fb8a3f9a
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/index.ts
@@ -0,0 +1,363 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { componentGeneratorFlow, ai } from "./flows";
+import * as fs from "fs";
+import * as path from "path";
+import { modelsToTest } from "./models";
+import { prompts, TestPrompt } from "./prompts";
+import { validateSchema } from "./validator";
+
+interface InferenceResult {
+ modelName: string;
+ prompt: TestPrompt;
+ component: any;
+ error: any;
+ latency: number;
+ validationResults: string[];
+ runNumber: number;
+}
+
+function generateSummary(
+ resultsByModel: Record,
+ results: InferenceResult[],
+): string {
+ const promptNameWidth = 40;
+ const latencyWidth = 20;
+ const failedRunsWidth = 15;
+ const toolErrorRunsWidth = 20;
+
+ let summary = "# Evaluation Summary";
+ for (const modelName in resultsByModel) {
+ summary += `\n\n## Model: ${modelName}\n\n`;
+ const header = `| ${"Prompt Name".padEnd(
+ promptNameWidth,
+ )} | ${"Avg Latency (ms)".padEnd(latencyWidth)} | ${"Failed Runs".padEnd(
+ failedRunsWidth,
+ )} | ${"Tool Error Runs".padEnd(toolErrorRunsWidth)} |`;
+ const divider = `|${"-".repeat(promptNameWidth + 2)}|${"-".repeat(
+ latencyWidth + 2,
+ )}|${"-".repeat(failedRunsWidth + 2)}|${"-".repeat(
+ toolErrorRunsWidth + 2,
+ )}|`;
+ summary += header;
+ summary += `\n${divider}`;
+
+ const promptsInModel = resultsByModel[modelName].reduce(
+ (acc, result) => {
+ if (!acc[result.prompt.name]) {
+ acc[result.prompt.name] = [];
+ }
+ acc[result.prompt.name].push(result);
+ return acc;
+ },
+ {} as Record,
+ );
+
+ let totalModelFailedRuns = 0;
+
+ for (const promptName in promptsInModel) {
+ const runs = promptsInModel[promptName];
+ const totalRuns = runs.length;
+ const errorRuns = runs.filter((r) => r.error).length;
+ const failedRuns = runs.filter(
+ (r) => r.error || r.validationResults.length > 0,
+ ).length;
+ const totalLatency = runs.reduce((acc, r) => acc + r.latency, 0);
+ const avgLatency = (totalLatency / totalRuns).toFixed(0);
+
+ totalModelFailedRuns += failedRuns;
+
+ const failedRunsStr =
+ failedRuns > 0 ? `${failedRuns} / ${totalRuns}` : "";
+ const errorRunsStr = errorRuns > 0 ? `${errorRuns} / ${totalRuns}` : "";
+
+ summary += `\n| ${promptName.padEnd(
+ promptNameWidth,
+ )} | ${avgLatency.padEnd(latencyWidth)} | ${failedRunsStr.padEnd(
+ failedRunsWidth,
+ )} | ${errorRunsStr.padEnd(toolErrorRunsWidth)} |`;
+ }
+
+ const totalRunsForModel = resultsByModel[modelName].length;
+ summary += `\n\n**Total failed runs:** ${totalModelFailedRuns} / ${totalRunsForModel}`;
+ }
+
+ summary += "\n\n---\n\n## Overall Summary\n";
+ const totalRuns = results.length;
+ const totalToolErrorRuns = results.filter((r) => r.error).length;
+ const totalRunsWithAnyFailure = results.filter(
+ (r) => r.error || r.validationResults.length > 0,
+ ).length;
+ const modelsWithFailures = [
+ ...new Set(
+ results
+ .filter((r) => r.error || r.validationResults.length > 0)
+ .map((r) => r.modelName),
+ ),
+ ].join(", ");
+
+ summary += `\n- **Number of tool error runs:** ${totalToolErrorRuns} / ${totalRuns}`;
+ summary += `\n- **Number of runs with any failure (tool error or validation):** ${totalRunsWithAnyFailure} / ${totalRuns}`;
+ const latencies = results.map((r) => r.latency).sort((a, b) => a - b);
+ const totalLatency = latencies.reduce((acc, l) => acc + l, 0);
+ const meanLatency = (totalLatency / totalRuns).toFixed(0);
+ let medianLatency = 0;
+ if (latencies.length > 0) {
+ const mid = Math.floor(latencies.length / 2);
+ if (latencies.length % 2 === 0) {
+ medianLatency = (latencies[mid - 1] + latencies[mid]) / 2;
+ } else {
+ medianLatency = latencies[mid];
+ }
+ }
+
+ summary += `\n- **Mean Latency:** ${meanLatency} ms`;
+ summary += `\n- **Median Latency:** ${medianLatency} ms`;
+ if (modelsWithFailures) {
+ summary += `\n- **Models with at least one failure:** ${modelsWithFailures}`;
+ }
+ return summary;
+}
+
+import yargs from "yargs";
+import { hideBin } from "yargs/helpers";
+
+// Run the flow
+async function main() {
+ const argv = await yargs(hideBin(process.argv))
+ .option("verbose", {
+ alias: "v",
+ type: "boolean",
+ description: "Run with verbose logging",
+ default: false,
+ })
+ .option("keep", {
+ type: "string",
+ description:
+ "Directory to keep output files. If no path is provided, a temporary directory will be created.",
+ coerce: (arg) => (arg === undefined ? true : arg),
+ })
+ .option("runs-per-prompt", {
+ type: "number",
+ description: "Number of times to run each prompt",
+ default: 1,
+ })
+ .option("model", {
+ type: "string",
+ array: true,
+ description: "Filter models by exact name",
+ default: [],
+ choices: modelsToTest.map((m) => m.name),
+ })
+ .option("prompt", {
+ type: "string",
+ description: "Filter prompts by name prefix",
+ })
+ .help()
+ .alias("h", "help").argv;
+
+ const verbose = argv.verbose;
+ const keep = argv.keep;
+ let outputDir: string | null = null;
+
+ if (keep) {
+ if (typeof keep === "string") {
+ outputDir = keep;
+ } else {
+ outputDir = fs.mkdtempSync(path.join(process.cwd(), "a2ui-eval-"));
+ }
+ if (!fs.existsSync(outputDir)) {
+ fs.mkdirSync(outputDir, { recursive: true });
+ }
+ console.log(`Keeping output in: ${outputDir}`);
+ }
+
+ const runsPerPrompt = argv["runs-per-prompt"];
+
+ let filteredModels = modelsToTest;
+ if (argv.model && argv.model.length > 0) {
+ const modelNames = argv.model as string[];
+ filteredModels = modelsToTest.filter((m) => modelNames.includes(m.name));
+ if (filteredModels.length === 0) {
+ console.error(`No models found matching: ${modelNames.join(", ")}.`);
+ process.exit(1);
+ }
+ }
+
+ let filteredPrompts = prompts;
+ if (argv.prompt) {
+ filteredPrompts = prompts.filter((p) =>
+ p.name.startsWith(argv.prompt as string)
+ );
+ if (filteredPrompts.length === 0) {
+ console.error(`No prompt found with prefix "${argv.prompt}".`);
+ process.exit(1);
+ }
+ }
+
+ const generationPromises: Promise[] = [];
+
+ for (const prompt of filteredPrompts) {
+ const schemaString = fs.readFileSync(
+ path.join(__dirname, prompt.schemaPath),
+ "utf-8"
+ );
+ const schema = JSON.parse(schemaString);
+ for (const modelConfig of filteredModels) {
+ const modelDirName = modelConfig.name.replace(/[\/:]/g, "_");
+ const modelOutputDir = outputDir
+ ? path.join(outputDir, modelDirName)
+ : null;
+ if (modelOutputDir && !fs.existsSync(modelOutputDir)) {
+ fs.mkdirSync(modelOutputDir, { recursive: true });
+ }
+ for (let i = 1; i <= runsPerPrompt; i++) {
+ console.log(
+ `Queueing generation for model: ${modelConfig.name}, prompt: ${prompt.name} (run ${i})`
+ );
+ const startTime = Date.now();
+ generationPromises.push(
+ componentGeneratorFlow({
+ prompt: prompt.promptText,
+ model: modelConfig.model,
+ config: modelConfig.config,
+ schema,
+ })
+ .then((component) => {
+ if (modelOutputDir) {
+ const inputPath = path.join(
+ modelOutputDir,
+ `${prompt.name}.input.txt`
+ );
+ fs.writeFileSync(inputPath, prompt.promptText);
+
+ const outputPath = path.join(
+ modelOutputDir,
+ `${prompt.name}.output.json`
+ );
+ fs.writeFileSync(
+ outputPath,
+ JSON.stringify(component, null, 2)
+ );
+ }
+ const validationResults = validateSchema(
+ component,
+ prompt.schemaPath,
+ prompt.matchers
+ );
+ return {
+ modelName: modelConfig.name,
+ prompt,
+ component,
+ error: null,
+ latency: Date.now() - startTime,
+ validationResults,
+ runNumber: i,
+ };
+ })
+ .catch((error) => {
+ if (modelOutputDir) {
+ const inputPath = path.join(
+ modelOutputDir,
+ `${prompt.name}.input.txt`
+ );
+ fs.writeFileSync(inputPath, prompt.promptText);
+
+ const errorPath = path.join(
+ modelOutputDir,
+ `${prompt.name}.error.json`
+ );
+ const errorOutput = {
+ message: error.message,
+ stack: error.stack,
+ ...error,
+ };
+ fs.writeFileSync(
+ errorPath,
+ JSON.stringify(errorOutput, null, 2)
+ );
+ }
+ return {
+ modelName: modelConfig.name,
+ prompt,
+ component: null,
+ error,
+ latency: Date.now() - startTime,
+ validationResults: [],
+ runNumber: i,
+ };
+ })
+ );
+ }
+ }
+ }
+
+ const results = await Promise.all(generationPromises);
+
+ const resultsByModel: Record = {};
+
+ for (const result of results) {
+ if (!resultsByModel[result.modelName]) {
+ resultsByModel[result.modelName] = [];
+ }
+ resultsByModel[result.modelName].push(result);
+ }
+
+ console.log("\n--- Generation Results ---");
+ for (const modelName in resultsByModel) {
+ for (const result of resultsByModel[modelName]) {
+ const hasError = !!result.error;
+ const hasValidationFailures = result.validationResults.length > 0;
+ const hasComponent = !!result.component;
+
+ if (hasError || hasValidationFailures || (verbose && hasComponent)) {
+ console.log(`\n----------------------------------------`);
+ console.log(`Model: ${modelName}`);
+ console.log(`----------------------------------------`);
+ console.log(`\nQuery: ${result.prompt.name} (run ${result.runNumber})`);
+
+ if (hasError) {
+ console.error("Error generating component:", result.error);
+ } else if (hasComponent) {
+ if (hasValidationFailures) {
+ console.log("Validation Failures:");
+ result.validationResults.forEach((failure) =>
+ console.log(`- ${failure}`)
+ );
+ }
+ if (verbose) {
+ if (hasValidationFailures) {
+ console.log("Generated schema:");
+ console.log(JSON.stringify(result.component, null, 2));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ const summary = generateSummary(resultsByModel, results);
+ console.log(summary);
+ if (outputDir) {
+ const summaryPath = path.join(outputDir, "summary.md");
+ fs.writeFileSync(summaryPath, summary);
+ }
+}
+
+if (require.main === module) {
+ main().catch(console.error);
+}
diff --git a/vendor/a2ui/specification/0.8/eval/src/message_type_matcher.ts b/vendor/a2ui/specification/0.8/eval/src/message_type_matcher.ts
new file mode 100644
index 0000000000000000000000000000000000000000..390d1f4d525f74a9a8a5743fd226a4979371be03
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/message_type_matcher.ts
@@ -0,0 +1,50 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { SchemaMatcher, ValidationResult } from "./schema_matcher";
+
+/**
+ * A concrete matcher that verifies the top-level message type.
+ */
+export class MessageTypeMatcher extends SchemaMatcher {
+ constructor(private messageType: string) {
+ super();
+ }
+
+ validate(response: object): ValidationResult {
+ if (!response || typeof response !== "object") {
+ return {
+ success: false,
+ error: "Response is not a valid object.",
+ };
+ }
+ const keys = Object.keys(response);
+ if (keys.length === 1 && keys[0] === this.messageType) {
+ return { success: true };
+ } else {
+ return {
+ success: false,
+ error: `Expected top-level message type to be '${
+ this.messageType
+ }', but found '${keys.join(", ")}'`,
+ };
+ }
+ }
+
+ get description(): string {
+ return `Expected top-level message type to be '${this.messageType}'`;
+ }
+}
diff --git a/vendor/a2ui/specification/0.8/eval/src/models.ts b/vendor/a2ui/specification/0.8/eval/src/models.ts
new file mode 100644
index 0000000000000000000000000000000000000000..37b685ff2ee2fe9f2274e95c6bcb84acce6bee3c
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/models.ts
@@ -0,0 +1,68 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { googleAI } from "@genkit-ai/google-genai";
+import { openAI } from "@genkit-ai/compat-oai/openai";
+import { claude35Haiku, claude4Sonnet } from "genkitx-anthropic";
+
+export interface ModelConfiguration {
+ model: any;
+ name: string;
+ config?: any;
+}
+
+export const modelsToTest: ModelConfiguration[] = [
+ {
+ model: openAI.model("gpt-5"),
+ name: "gpt-5",
+ config: { reasoning_effort: "minimal" },
+ },
+ {
+ model: openAI.model("gpt-5-mini"),
+ name: "gpt-5-mini",
+ config: { reasoning_effort: "minimal" },
+ },
+ {
+ model: openAI.model("gpt-4.1"),
+ name: "gpt-4.1",
+ config: {},
+ },
+ {
+ model: googleAI.model("gemini-2.5-pro"),
+ name: "gemini-2.5-pro-thinking",
+ config: { thinkingConfig: { thinkingBudget: 1000 } },
+ },
+ {
+ model: googleAI.model("gemini-2.5-flash"),
+ name: "gemini-2.5-flash",
+ config: { thinkingConfig: { thinkingBudget: 0 } },
+ },
+ {
+ model: googleAI.model("gemini-2.5-flash-lite"),
+ name: "gemini-2.5-flash-lite",
+ config: { thinkingConfig: { thinkingBudget: 0 } },
+ },
+ {
+ model: claude4Sonnet,
+ name: "claude-4-sonnet",
+ config: {},
+ },
+ {
+ model: claude35Haiku,
+ name: "claude-35-haiku",
+ config: {},
+ },
+];
diff --git a/vendor/a2ui/specification/0.8/eval/src/prompts.ts b/vendor/a2ui/specification/0.8/eval/src/prompts.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9e26aca273cd45509cba59dbe4c59b1487165006
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/prompts.ts
@@ -0,0 +1,493 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { BasicSchemaMatcher } from "./basic_schema_matcher";
+import { MessageTypeMatcher } from "./message_type_matcher";
+import { SchemaMatcher } from "./schema_matcher";
+import { SurfaceUpdateSchemaMatcher } from "./surface_update_schema_matcher";
+
+export interface TestPrompt {
+ name: string;
+ description: string;
+ schemaPath: string;
+ promptText: string;
+ matchers: SchemaMatcher[];
+}
+
+const schemaPath = "../../json/server_to_client_with_standard_catalog.json";
+
+export const prompts: TestPrompt[] = [
+ {
+ name: "deleteSurface",
+ description: "A DeleteSurface message to remove a UI surface.",
+ schemaPath,
+ promptText: `Generate a JSON message containing a deleteSurface for the surface 'dashboard-surface-1'.`,
+ matchers: [
+ new MessageTypeMatcher("deleteSurface"),
+ new BasicSchemaMatcher("deleteSurface"),
+ new BasicSchemaMatcher("deleteSurface.surfaceId", "dashboard-surface-1"),
+ ],
+ },
+ {
+ name: "dogBreedGenerator",
+ description:
+ "A prompt to generate a UI for a dog breed information and generator tool.",
+ schemaPath,
+ promptText: `Generate a JSON message containing a surfaceUpdate to describe the following UI:
+
+A root node has already been created with ID "root".
+
+A vertical list with:
+Dog breed information
+Dog generator
+
+The dog breed information is a card, which contains a title “Famous Dog breeds”, a header image, and a carousel of different dog breeds. The carousel information should be in the data model at /carousel.
+
+The dog generator is another card which is a form that generates a fictional dog breed with a description
+- Title
+- Description text explaining what it is
+- Dog breed name (text input)
+- Number of legs (number input)
+- Skills (checkboxes)
+- Button called “Generate” which takes the data above and generates a new dog description
+- A divider
+- A section which shows the generated content
+`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher(
+ "TextField",
+ "label",
+ "Dog breed name",
+ true
+ ),
+ new SurfaceUpdateSchemaMatcher(
+ "TextField",
+ "label",
+ "Number of legs",
+ true
+ ),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Generate"),
+ ],
+ },
+ {
+ name: "loginForm",
+ description:
+ 'A simple login form with username, password, a "remember me" checkbox, and a submit button.',
+ schemaPath,
+ promptText: `Generate a JSON message containing a surfaceUpdate for a login form. It should have a "Login" heading, two text fields for username and password (bound to /login/username and /login/password), a checkbox for "Remember Me" (bound to /login/rememberMe), and a "Sign In" button. The button should trigger a 'login' action, passing the username, password, and rememberMe status in the dynamicContext.`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Login"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "username", true),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "password", true),
+ new SurfaceUpdateSchemaMatcher("CheckBox", "label", "Remember Me"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Sign In"),
+ ],
+ },
+ {
+ name: "productGallery",
+ description: "A gallery of products using a list with a template.",
+ schemaPath,
+ promptText: `Generate a JSON message containing a surfaceUpdate for a product gallery. It should display a list of products from the data model at '/products'. Use a template for the list items. Each item should be a Card containing an Image (from '/products/item/imageUrl'), a Text component for the product name (from '/products/item/name'), and a Button labeled "Add to Cart". The button's action should be 'addToCart' and include a staticContext with the product ID, for example, 'productId': 'product123'. You should create a template component and then a list that uses it.`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("Card"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher("Text"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Add to Cart"),
+ ],
+ },
+ {
+ name: "productGalleryData",
+ description:
+ "A DataModelUpdate message to populate the product gallery data.",
+ schemaPath,
+ promptText: `Generate a JSON message containing a dataModelUpdate to populate the data model for the product gallery. The update should target the path '/products' and include at least two products. Each product in the map should have keys 'id', 'name', and 'imageUrl'. For example:
+ {
+ "key": "product1",
+ "valueMap": [
+ { "key": "id", "valueString": "product1" },
+ { "key": "name", "valueString": "Awesome Gadget" },
+ { "key": "imageUrl", "valueString": "https://example.com/gadget.jpg" }
+ ]
+ }`,
+ matchers: [
+ new MessageTypeMatcher("dataModelUpdate"),
+ new BasicSchemaMatcher("dataModelUpdate.path", "/products"),
+ new BasicSchemaMatcher("dataModelUpdate.contents.0.key"), // Check that the first product key exists
+ new BasicSchemaMatcher("dataModelUpdate.contents.0.valueMap"), // Check that valueMap exists
+ ],
+ },
+ {
+ name: "settingsPage",
+ description: "A settings page with tabs and a modal dialog.",
+ schemaPath,
+ promptText: `Generate a JSON message containing a surfaceUpdate for a user settings page. Use a Tabs component with two tabs: "Profile" and "Notifications". The "Profile" tab should contain a simple column with a text field for the user's name. The "Notifications" tab should contain a checkbox for "Enable email notifications". Also, include a Modal component. The modal's entry point should be a button labeled "Delete Account", and its content should be a column with a confirmation text and two buttons: "Confirm Deletion" and "Cancel".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "name", true),
+ new SurfaceUpdateSchemaMatcher(
+ "CheckBox",
+ "label",
+ "Enable email notifications"
+ ),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Delete Account"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Confirm Deletion"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Cancel"),
+ ],
+ },
+ {
+ name: "dataModelUpdate",
+ description: "A DataModelUpdate message to update user data.",
+ schemaPath,
+ promptText: `Generate a JSON message with a 'dataModelUpdate' property. This is used to update the client's data model. The scenario is that a user has just logged in, and we need to populate their profile information. Create a single data model update message to set '/user/name' to "John Doe" and '/user/email' to "john.doe@example.com".`,
+ matchers: [new MessageTypeMatcher("dataModelUpdate")],
+ },
+ {
+ name: "uiRoot",
+ description: "A UIRoot message to set the initial UI and data roots.",
+ schemaPath,
+ promptText: `Generate a JSON message with a 'beginRendering' property. This message tells the client where to start rendering the UI. Set the UI root to a component with ID "mainLayout".`,
+ matchers: [new MessageTypeMatcher("beginRendering")],
+ },
+ {
+ name: "animalKingdomExplorer",
+ description: "A simple, explicit UI to display a hierarchy of animals.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a simplified UI explorer for the Animal Kingdom.
+
+The UI must have a main 'Heading' with the text "Simple Animal Explorer".
+
+Below the heading, create a 'Tabs' component with exactly three tabs: "Mammals", "Birds", and "Reptiles".
+
+Each tab's content should be a 'Column'. The first item in each column must be a 'TextField' with the label "Search...". Below the search field, display the hierarchy for that tab using nested 'Card' components.
+
+The exact hierarchy to create is as follows:
+
+**1. "Mammals" Tab:**
+ - A 'Card' for the Class "Mammalia".
+ - Inside the "Mammalia" card, create two 'Card's for the following Orders:
+ - A 'Card' for the Order "Carnivora". Inside this, create 'Card's for these three species: "Lion", "Tiger", "Wolf".
+ - A 'Card' for the Order "Artiodactyla". Inside this, create 'Card's for these two species: "Giraffe", "Hippopotamus".
+
+**2. "Birds" Tab:**
+ - A 'Card' for the Class "Aves".
+ - Inside the "Aves" card, create three 'Card's for the following Orders:
+ - A 'Card' for the Order "Accipitriformes". Inside this, create a 'Card' for the species: "Bald Eagle".
+ - A 'Card' for the Order "Struthioniformes". Inside this, create a 'Card' for the species: "Ostrich".
+ - A 'Card' for the Order "Sphenisciformes". Inside this, create a 'Card' for the species: "Penguin".
+
+**3. "Reptiles" Tab:**
+ - A 'Card' for the Class "Reptilia".
+ - Inside the "Reptilia" card, create two 'Card's for the following Orders:
+ - A 'Card' for the Order "Crocodilia". Inside this, create a 'Card' for the species: "Nile Crocodile".
+ - A 'Card' for the Order "Squamata". Inside this, create 'Card's for these two species: "Komodo Dragon", "Ball Python".
+
+Each species card must contain a 'Row' with an 'Image' and a 'Text' component for the species name. Do not add any other components.
+
+Each Class and Order card must contain a 'Column' with a 'Text' component with the name, and then the children cards below.
+
+IMPORTANT: Do not skip any of the classes, orders, or species above. Include every item that is mentioned.
+`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher(
+ "Heading",
+ "text",
+ "Simple Animal Explorer"
+ ),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Search..."),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Class: Mammalia"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Order: Carnivora"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Lion"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Tiger"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Wolf"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Order: Artiodactyla"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Giraffe"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Hippopotamus"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Class: Aves"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Order: Accipitriformes"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Bald Eagle"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Order: Struthioniformes"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Ostrich"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Order: Sphenisciformes"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Penguin"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Class: Reptilia"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Order: Crocodilia"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Nile Crocodile"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Order: Squamata"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Komodo Dragon"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Ball Python"),
+ ],
+ },
+ {
+ name: "recipeCard",
+ description: "A UI to display a recipe with ingredients and instructions.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a recipe card. It should have a 'Heading' for the recipe title, "Classic Lasagna". Below the title, an 'Image' of the lasagna. Then, a 'Row' containing two 'Column's. The first column has a 'Text' heading "Ingredients" and a 'List' of ingredients. The second column has a 'Text' heading "Instructions" and a 'List' of step-by-step instructions. Finally, a 'Button' at the bottom labeled "Watch Video Tutorial".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Classic Lasagna"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Ingredients"),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Instructions"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Watch Video Tutorial"),
+ ],
+ },
+ {
+ name: "musicPlayer",
+ description: "A simple music player UI.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a music player. It should be a 'Card' containing a 'Column'. Inside the column, there's an 'Image' for the album art, a 'Text' for the song title "Bohemian Rhapsody", another 'Text' for the artist "Queen", a 'Slider' for the song progress, and a 'Row' with three 'Button's: "Previous", "Play", and "Next".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Bohemian Rhapsody"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Queen"),
+ new SurfaceUpdateSchemaMatcher("Slider"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Previous"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Play"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Next"),
+ ],
+ },
+ {
+ name: "weatherForecast",
+ description: "A UI to display the weather forecast.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a weather forecast UI. It should have a 'Heading' with the city name, "New York". Below it, a 'Row' with the current temperature as a 'Text' component ("68°F") and an 'Image' for the weather icon (e.g., a sun). Below that, a 'Divider'. Then, a 'List' component to display the 5-day forecast. Each item in the list should be a 'Row' with the day, an icon, and high/low temperatures.`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "New York"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "68°F"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher("List"),
+ ],
+ },
+ {
+ name: "surveyForm",
+ description: "A customer feedback survey form.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a survey form. It should have a 'Heading' "Customer Feedback". Then a 'MultipleChoice' question "How would you rate our service?" with options "Excellent", "Good", "Average", "Poor". Then a 'CheckBox' section for "What did you like?" with options "Product Quality", "Price", "Customer Support". Finally, a 'TextField' with the label "Any other comments?" and a 'Button' labeled "Submit Feedback".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Customer Feedback"),
+ new SurfaceUpdateSchemaMatcher("MultipleChoice", "options", "Excellent"),
+ new SurfaceUpdateSchemaMatcher("CheckBox", "label", "Product Quality"),
+ new SurfaceUpdateSchemaMatcher(
+ "TextField",
+ "label",
+ "Any other comments?"
+ ),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Submit Feedback"),
+ ],
+ },
+ {
+ name: "flightBooker",
+ description: "A form to search for flights.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a flight booking form. It should have a 'Heading' "Book a Flight". Use a 'Row' for two 'TextField's: "Departure City" and "Arrival City". Below that, another 'Row' for two 'DateTimeInput's: "Departure Date" and "Return Date". Add a 'CheckBox' for "One-way trip". Finally, a 'Button' labeled "Search Flights".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Book a Flight"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Departure City"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Arrival City"),
+ new SurfaceUpdateSchemaMatcher("DateTimeInput"),
+ new SurfaceUpdateSchemaMatcher("CheckBox", "label", "One-way trip"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Search Flights"),
+ ],
+ },
+ {
+ name: "dashboard",
+ description: "A simple dashboard with statistics.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a simple dashboard. It should have a 'Heading' "Sales Dashboard". Below, a 'Row' containing three 'Card's. The first card has a 'Text' "Revenue" and another 'Text' "$50,000". The second card has "New Customers" and "1,200". The third card has "Conversion Rate" and "4.5%".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Sales Dashboard"),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Revenue"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "$50,000"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "New Customers"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "1,200"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Conversion Rate"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "4.5%"),
+ ],
+ },
+ {
+ name: "contactCard",
+ description: "A UI to display contact information.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a contact card. It should be a 'Card' with a 'Row'. The row contains an 'Image' (as an avatar) and a 'Column'. The column contains a 'Text' for the name "Jane Doe", a 'Text' for the email "jane.doe@example.com", and a 'Text' for the phone number "(123) 456-7890". Below the main row, add a 'Button' labeled "View on Map".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Jane Doe"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "jane.doe@example.com"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "(123) 456-7890"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "View on Map"),
+ ],
+ },
+ {
+ name: "calendarEventCreator",
+ description: "A form to create a new calendar event.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a calendar event creation form. It should have a 'Heading' "New Event". Include a 'TextField' for the "Event Title". Use a 'Row' for two 'DateTimeInput's for "Start Time" and "End Time". Add a 'CheckBox' labeled "All-day event". Finally, a 'Row' with two 'Button's: "Save" and "Cancel".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "New Event"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Event Title"),
+ new SurfaceUpdateSchemaMatcher("DateTimeInput"),
+ new SurfaceUpdateSchemaMatcher("CheckBox", "label", "All-day event"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Save"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Cancel"),
+ ],
+ },
+ {
+ name: "checkoutPage",
+ description: "A simplified e-commerce checkout page.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a checkout page. It should have a 'Heading' "Checkout". Create a 'Column' for "Shipping Information" with 'TextField's for "Full Name" and "Address". Create another 'Column' for "Payment Information" with 'TextField's for "Card Number" and "Expiry Date". Add a 'Divider'. Show an order summary with a 'Text' component: "Total: $99.99". Finally, a 'Button' labeled "Place Order".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Checkout"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Full Name"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Address"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Card Number"),
+ new SurfaceUpdateSchemaMatcher("TextField", "label", "Expiry Date"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Total: $99.99"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Place Order"),
+ ],
+ },
+ {
+ name: "socialMediaPost",
+ description: "A component representing a social media post.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a social media post. It should be a 'Card' containing a 'Column'. The first item is a 'Row' with an 'Image' (user avatar) and a 'Text' (username "user123"). Below that, a 'Text' component for the post content: "Enjoying the beautiful weather today!". Then, an 'Image' for the main post picture. Finally, a 'Row' with three 'Button's: "Like", "Comment", and "Share".`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "user123"),
+ new SurfaceUpdateSchemaMatcher(
+ "Text",
+ "text",
+ "Enjoying the beautiful weather today!"
+ ),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Like"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Comment"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Share"),
+ ],
+ },
+ {
+ name: "eCommerceProductPage",
+ description: "A detailed product page for an e-commerce website.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a product details page.
+The main layout should be a 'Row'.
+The left side of the row is a 'Column' containing a large main 'Image' of the product, and below it, a 'Row' of three smaller thumbnail 'Image' components.
+The right side of the row is another 'Column' for product information:
+- A 'Heading' for the product name, "Premium Leather Jacket".
+- A 'Text' component for the price, "$299.99".
+- A 'Divider'.
+- A 'Text' heading "Select Size", followed by a 'MultipleChoice' component with options "S", "M", "L", "XL".
+- A 'Text' heading "Select Color", followed by another 'MultipleChoice' component with options "Black", "Brown", "Red".
+- A 'Button' with the label "Add to Cart".
+- A 'Text' component for the product description below the button.`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher(
+ "Heading",
+ "text",
+ "Premium Leather Jacket"
+ ),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "$299.99"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ new SurfaceUpdateSchemaMatcher("MultipleChoice", "options", "S"),
+ new SurfaceUpdateSchemaMatcher("MultipleChoice", "options", "Black"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Add to Cart"),
+ ],
+ },
+ {
+ name: "interactiveDashboard",
+ description: "A dashboard with filters and data cards.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for an interactive analytics dashboard.
+At the top, a 'Heading' "Company Dashboard".
+Below the heading, a 'Card' containing a 'Row' of filter controls:
+- A 'DateTimeInput' with a label for "Start Date".
+- A 'DateTimeInput' with a label for "End Date".
+- A 'Button' labeled "Apply Filters".
+Below the filters card, a 'Row' containing two 'Card's for key metrics:
+- The first 'Card' has a 'Heading' "Total Revenue" and a 'Text' component showing "$1,234,567".
+- The second 'Card' has a 'Heading' "New Users" and a 'Text' component showing "4,321".
+Finally, a large 'Card' at the bottom with a 'Heading' "Revenue Over Time" and a placeholder 'Image' to represent a line chart.`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Company Dashboard"),
+ new SurfaceUpdateSchemaMatcher("DateTimeInput"),
+ new SurfaceUpdateSchemaMatcher("Button", "label", "Apply Filters"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Total Revenue"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "$1,234,567"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "New Users"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "4,321"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Revenue Over Time"),
+ new SurfaceUpdateSchemaMatcher("Image"),
+ ],
+ },
+ {
+ name: "travelItinerary",
+ description: "A multi-day travel itinerary display.",
+ schemaPath,
+ promptText: `Generate a JSON message with a surfaceUpdate property for a travel itinerary for a trip to Paris.
+It should have a main 'Heading' "Paris Adventure".
+Below, use a 'List' to display three days. Each item in the list should be a 'Card'.
+- The first 'Card' (Day 1) should contain a 'Heading' "Day 1: Arrival & Eiffel Tower", and a 'List' of activities for that day: "Check into hotel", "Lunch at a cafe", "Visit the Eiffel Tower".
+- The second 'Card' (Day 2) should contain a 'Heading' "Day 2: Museums & Culture", and a 'List' of activities: "Visit the Louvre Museum", "Walk through Tuileries Garden", "See the Arc de Triomphe".
+- The third 'Card' (Day 3) should contain a 'Heading' "Day 3: Art & Departure", and a 'List' of activities: "Visit Musée d'Orsay", "Explore Montmartre", "Depart from CDG".
+Each activity in the inner lists should be a 'Row' containing a 'CheckBox' (to mark as complete) and a 'Text' component with the activity description.`,
+ matchers: [
+ new MessageTypeMatcher("surfaceUpdate"),
+ new SurfaceUpdateSchemaMatcher("Heading", "text", "Paris Adventure"),
+ new SurfaceUpdateSchemaMatcher(
+ "Heading",
+ "text",
+ "Day 1: Arrival & Eiffel Tower"
+ ),
+ new SurfaceUpdateSchemaMatcher(
+ "Heading",
+ "text",
+ "Day 2: Museums & Culture"
+ ),
+ new SurfaceUpdateSchemaMatcher(
+ "Heading",
+ "text",
+ "Day 3: Art & Departure"
+ ),
+ new SurfaceUpdateSchemaMatcher("Column"),
+ new SurfaceUpdateSchemaMatcher("CheckBox"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Visit the Eiffel Tower"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Visit the Louvre Museum"),
+ new SurfaceUpdateSchemaMatcher("Text", "text", "Explore Montmartre"),
+ ],
+ },
+];
diff --git a/vendor/a2ui/specification/0.8/eval/src/schema_matcher.ts b/vendor/a2ui/specification/0.8/eval/src/schema_matcher.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0f25886ce580c558bce649dd647298da4d30b03a
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/schema_matcher.ts
@@ -0,0 +1,24 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export interface ValidationResult {
+ success: boolean;
+ error?: string;
+}
+
+export abstract class SchemaMatcher {
+ abstract validate(schema: any): ValidationResult;
+}
diff --git a/vendor/a2ui/specification/0.8/eval/src/surface_update_schema_matcher.ts b/vendor/a2ui/specification/0.8/eval/src/surface_update_schema_matcher.ts
new file mode 100644
index 0000000000000000000000000000000000000000..52310a60c7c8491395cf12a0b2d45279288d197f
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/surface_update_schema_matcher.ts
@@ -0,0 +1,207 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { SchemaMatcher, ValidationResult } from "./schema_matcher";
+
+/**
+ * A schema matcher that validates the presence of a component type within a
+ * `surfaceUpdate` message, and optionally validates the presence and value of
+ * a property on that component.
+ */
+export class SurfaceUpdateSchemaMatcher extends SchemaMatcher {
+ constructor(
+ public componentType: string,
+ public propertyName?: string,
+ public propertyValue?: any,
+ public caseInsensitive: boolean = false
+ ) {
+ super();
+ }
+
+ private getComponentById(components: any[], id: string): any | undefined {
+ return components.find((c: any) => c.id === id);
+ }
+
+ validate(schema: any): ValidationResult {
+ if (!schema.surfaceUpdate) {
+ return {
+ success: false,
+ error: `Expected a 'surfaceUpdate' message but found none.`,
+ };
+ }
+ if (!Array.isArray(schema.surfaceUpdate.components)) {
+ return {
+ success: false,
+ error: `'surfaceUpdate' message does not contain a 'components' array.`,
+ };
+ }
+
+ const components = schema.surfaceUpdate.components;
+
+ for (const c of components) {
+ if (c.component && Object.keys(c.component).length > 1) {
+ return {
+ success: false,
+ error: `Component ID '${c.id}' has multiple component types defined: ${Object.keys(c.component).join(", ")}`,
+ };
+ }
+ }
+
+ const matchingComponents = components.filter(
+ (c: any) => c.component && c.component[this.componentType]
+ );
+
+ if (matchingComponents.length === 0) {
+ return {
+ success: false,
+ error: `Failed to find component of type '${this.componentType}'.`,
+ };
+ }
+
+ if (!this.propertyName) {
+ return { success: true };
+ }
+
+ for (const component of matchingComponents) {
+ const properties = component.component[this.componentType];
+ if (properties) {
+ // Check for property directly on the component
+ if (properties[this.propertyName] !== undefined) {
+ if (this.propertyValue === undefined) {
+ return { success: true };
+ }
+ const actualValue = properties[this.propertyName];
+ if (this.valueMatches(actualValue, this.propertyValue)) {
+ return { success: true };
+ }
+ }
+
+ // Specifically for Buttons, check for label in a child Text component
+ if (
+ this.componentType === "Button" &&
+ this.propertyName === "label" &&
+ properties.child
+ ) {
+ const childComponent = this.getComponentById(
+ components,
+ properties.child
+ );
+ if (
+ childComponent &&
+ childComponent.component &&
+ childComponent.component.Text
+ ) {
+ const textValue = childComponent.component.Text.text;
+ if (this.valueMatches(textValue, this.propertyValue)) {
+ return { success: true };
+ }
+ }
+ }
+ }
+ }
+
+ if (this.propertyValue !== undefined) {
+ return {
+ success: false,
+ error: `Failed to find component of type '${this.componentType}' with property '${this.propertyName}' containing value ${JSON.stringify(this.propertyValue)}.`,
+ };
+ } else {
+ return {
+ success: false,
+ error: `Failed to find component of type '${this.componentType}' with property '${this.propertyName}'.`,
+ };
+ }
+ }
+
+ private valueMatches(actualValue: any, expectedValue: any): boolean {
+ if (actualValue === null || actualValue === undefined) {
+ return false;
+ }
+
+ const compareStrings = (s1: string, s2: string) => {
+ return this.caseInsensitive
+ ? s1.toLowerCase() === s2.toLowerCase()
+ : s1 === s2;
+ };
+
+ // Handle new literal/path object structure
+ if (typeof actualValue === "object" && !Array.isArray(actualValue)) {
+ if (actualValue.literalString !== undefined) {
+ return (
+ typeof expectedValue === "string" &&
+ compareStrings(actualValue.literalString, expectedValue)
+ );
+ }
+ if (actualValue.literalNumber !== undefined) {
+ return actualValue.literalNumber === expectedValue;
+ }
+ if (actualValue.literalBoolean !== undefined) {
+ return actualValue.literalBoolean === expectedValue;
+ }
+ // Could also have a 'path' key, but for matching we'd expect a literal value in expectedValue
+ }
+
+ // Handle array cases (e.g., for MultipleChoice options)
+ if (Array.isArray(actualValue)) {
+ for (const item of actualValue) {
+ if (typeof item === "object" && item !== null) {
+ // Check if the item itself is a bound value object
+ if (
+ item.literalString !== undefined &&
+ typeof expectedValue === "string" &&
+ compareStrings(item.literalString, expectedValue)
+ )
+ return true;
+ if (
+ item.literalNumber !== undefined &&
+ item.literalNumber === expectedValue
+ )
+ return true;
+ if (
+ item.literalBoolean !== undefined &&
+ item.literalBoolean === expectedValue
+ )
+ return true;
+
+ // Check for structures like MultipleChoice options {label: {literalString: ...}, value: ...}
+ if (
+ item.label &&
+ typeof item.label === "object" &&
+ item.label.literalString !== undefined &&
+ typeof expectedValue === "string" &&
+ compareStrings(item.label.literalString, expectedValue)
+ ) {
+ return true;
+ }
+ if (item.value === expectedValue) {
+ return true;
+ }
+ } else if (
+ typeof item === "string" &&
+ typeof expectedValue === "string" &&
+ compareStrings(item, expectedValue)
+ ) {
+ return true;
+ } else if (item === expectedValue) {
+ return true;
+ }
+ }
+ }
+
+ // Fallback to direct comparison
+ return JSON.stringify(actualValue) === JSON.stringify(expectedValue);
+ }
+}
diff --git a/vendor/a2ui/specification/0.8/eval/src/validator.ts b/vendor/a2ui/specification/0.8/eval/src/validator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..89f41d39819bcb3b8a14d997e74a28144ca3c46c
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/src/validator.ts
@@ -0,0 +1,496 @@
+/*
+ Copyright 2025 Google LLC
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ https://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+import { SurfaceUpdateSchemaMatcher } from "./surface_update_schema_matcher";
+import { SchemaMatcher } from "./schema_matcher";
+export function validateSchema(
+ data: any,
+ schemaName: string,
+ matchers?: SchemaMatcher[],
+): string[] {
+ const errors: string[] = [];
+ if (data.surfaceUpdate) {
+ validateSurfaceUpdate(data.surfaceUpdate, errors);
+ } else if (data.dataModelUpdate) {
+ validateDataModelUpdate(data.dataModelUpdate, errors);
+ } else if (data.beginRendering) {
+ validateBeginRendering(data.beginRendering, errors);
+ } else if (data.deleteSurface) {
+ validateDeleteSurface(data.deleteSurface, errors);
+ } else {
+ errors.push(
+ "A2UI Protocol message must have one of: surfaceUpdate, dataModelUpdate, beginRendering, deleteSurface.",
+ );
+ }
+ if (matchers) {
+ for (const matcher of matchers) {
+ const result = matcher.validate(data);
+ if (!result.success) {
+ errors.push(result.error!);
+ }
+ }
+ }
+ return errors;
+}
+function validateDeleteSurface(data: any, errors: string[]) {
+ if (data.surfaceId === undefined) {
+ errors.push("DeleteSurface must have a 'surfaceId' property.");
+ }
+ const allowed = ["surfaceId"];
+ for (const key in data) {
+ if (!allowed.includes(key)) {
+ errors.push(`DeleteSurface has unexpected property: ${key}`);
+ }
+ }
+}
+function validateSurfaceUpdate(data: any, errors: string[]) {
+ if (data.surfaceId === undefined) {
+ errors.push("SurfaceUpdate must have a 'surfaceId' property.");
+ }
+ if (!data.components || !Array.isArray(data.components)) {
+ errors.push("SurfaceUpdate must have a 'components' array.");
+ return;
+ }
+ const componentIds = new Set();
+ for (const c of data.components) {
+ if (c.id) {
+ if (componentIds.has(c.id)) {
+ errors.push(`Duplicate component ID found: ${c.id}`);
+ }
+ componentIds.add(c.id);
+ }
+ }
+ for (const component of data.components) {
+ validateComponent(component, componentIds, errors);
+ }
+}
+function validateDataModelUpdate(data: any, errors: string[]) {
+ if (data.surfaceId === undefined) {
+ errors.push("DataModelUpdate must have a 'surfaceId' property.");
+ }
+ const allowedTopLevel = ["surfaceId", "path", "contents"];
+ for (const key in data) {
+ if (!allowedTopLevel.includes(key)) {
+ errors.push(`DataModelUpdate has unexpected property: ${key}`);
+ }
+ }
+ if (!Array.isArray(data.contents)) {
+ errors.push("DataModelUpdate must have a 'contents' array.");
+ return;
+ }
+ const validateValueProperty = (
+ item: any,
+ itemErrors: string[],
+ prefix: string,
+ ) => {
+ const valueProps = [
+ "valueString",
+ "valueNumber",
+ "valueBoolean",
+ "valueMap",
+ ];
+ let valueCount = 0;
+ let foundValueProp = "";
+ for (const prop of valueProps) {
+ if (item[prop] !== undefined) {
+ valueCount++;
+ foundValueProp = prop;
+ }
+ }
+ if (valueCount !== 1) {
+ itemErrors.push(
+ `${prefix} must have exactly one value property (${valueProps.join(", ")}), found ${valueCount}.`,
+ );
+ return;
+ }
+ if (foundValueProp === "valueMap") {
+ if (!Array.isArray(item.valueMap)) {
+ itemErrors.push(`${prefix} 'valueMap' must be an array.`);
+ return;
+ }
+ item.valueMap.forEach((mapItem: any, index: number) => {
+ if (!mapItem.key) {
+ itemErrors.push(
+ `${prefix} 'valueMap' item at index ${index} is missing a 'key'.`,
+ );
+ }
+ const mapValueProps = ["valueString", "valueNumber", "valueBoolean"];
+ let mapValueCount = 0;
+ for (const prop of mapValueProps) {
+ if (mapItem[prop] !== undefined) {
+ mapValueCount++;
+ }
+ }
+ if (mapValueCount !== 1) {
+ itemErrors.push(
+ `${prefix} 'valueMap' item at index ${index} must have exactly one value property (${mapValueProps.join(", ")}), found ${mapValueCount}.`,
+ );
+ }
+ const allowedMapKeys = ["key", ...mapValueProps];
+ for (const key in mapItem) {
+ if (!allowedMapKeys.includes(key)) {
+ itemErrors.push(
+ `${prefix} 'valueMap' item at index ${index} has unexpected property: ${key}`,
+ );
+ }
+ }
+ });
+ }
+ };
+ data.contents.forEach((item: any, index: number) => {
+ if (!item.key) {
+ errors.push(
+ `DataModelUpdate 'contents' item at index ${index} is missing a 'key'.`,
+ );
+ }
+ validateValueProperty(
+ item,
+ errors,
+ `DataModelUpdate 'contents' item at index ${index}`,
+ );
+ const allowedKeys = [
+ "key",
+ "valueString",
+ "valueNumber",
+ "valueBoolean",
+ "valueMap",
+ ];
+ for (const key in item) {
+ if (!allowedKeys.includes(key)) {
+ errors.push(
+ `DataModelUpdate 'contents' item at index ${index} has unexpected property: ${key}`,
+ );
+ }
+ }
+ });
+}
+function validateBeginRendering(data: any, errors: string[]) {
+ if (data.surfaceId === undefined) {
+ errors.push("BeginRendering message must have a 'surfaceId' property.");
+ }
+ if (!data.root) {
+ errors.push("BeginRendering message must have a 'root' property.");
+ }
+}
+function validateBoundValue(
+ prop: any,
+ propName: string,
+ componentId: string,
+ componentType: string,
+ errors: string[],
+) {
+ if (typeof prop !== "object" || prop === null || Array.isArray(prop)) {
+ errors.push(
+ `Component '${componentId}' of type '${componentType}' property '${propName}' must be an object.`,
+ );
+ return;
+ }
+ const keys = Object.keys(prop);
+ const allowedKeys = [
+ "literalString",
+ "literalNumber",
+ "literalBoolean",
+ "path",
+ ];
+ let validKeyCount = 0;
+ for (const key of keys) {
+ if (allowedKeys.includes(key)) {
+ validKeyCount++;
+ }
+ }
+ if (validKeyCount !== 1 || keys.length !== 1) {
+ errors.push(
+ `Component '${componentId}' of type '${componentType}' property '${propName}' must have exactly one key from [${allowedKeys.join(", ")}]. Found: ${keys.join(", ")}`,
+ );
+ }
+}
+function validateComponent(
+ component: any,
+ allIds: Set,
+ errors: string[],
+) {
+ if (!component.id) {
+ errors.push(`Component is missing an 'id'.`);
+ return;
+ }
+ if (!component.component) {
+ errors.push(`Component '${component.id}' is missing 'component'.`);
+ return;
+ }
+ const componentTypes = Object.keys(component.component);
+ if (componentTypes.length !== 1) {
+ errors.push(
+ `Component '${component.id}' must have exactly one property in 'component', but found ${componentTypes.length}.`,
+ );
+ return;
+ }
+ const componentType = componentTypes[0];
+ const properties = component.component[componentType];
+ const checkRequired = (props: string[]) => {
+ for (const prop of props) {
+ if (properties[prop] === undefined) {
+ errors.push(
+ `Component '${component.id}' of type '${componentType}' is missing required property '${prop}'.`,
+ );
+ }
+ }
+ };
+ const checkRefs = (ids: (string | undefined)[]) => {
+ for (const id of ids) {
+ if (id && !allIds.has(id)) {
+ errors.push(
+ `Component '${component.id}' references non-existent component ID '${id}'.`,
+ );
+ }
+ }
+ };
+ switch (componentType) {
+ case "Heading":
+ checkRequired(["text"]);
+ if (properties.text)
+ validateBoundValue(
+ properties.text,
+ "text",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "Text":
+ checkRequired(["text"]);
+ if (properties.text)
+ validateBoundValue(
+ properties.text,
+ "text",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "Image":
+ checkRequired(["url"]);
+ if (properties.url)
+ validateBoundValue(
+ properties.url,
+ "url",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "Video":
+ checkRequired(["url"]);
+ if (properties.url)
+ validateBoundValue(
+ properties.url,
+ "url",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "AudioPlayer":
+ checkRequired(["url"]);
+ if (properties.url)
+ validateBoundValue(
+ properties.url,
+ "url",
+ component.id,
+ componentType,
+ errors,
+ );
+ if (properties.description)
+ validateBoundValue(
+ properties.description,
+ "description",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "TextField":
+ checkRequired(["label"]);
+ if (properties.label)
+ validateBoundValue(
+ properties.label,
+ "label",
+ component.id,
+ componentType,
+ errors,
+ );
+ if (properties.text)
+ validateBoundValue(
+ properties.text,
+ "text",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "DateTimeInput":
+ checkRequired(["value"]);
+ if (properties.value)
+ validateBoundValue(
+ properties.value,
+ "value",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "MultipleChoice":
+ checkRequired(["selections", "options"]);
+ if (properties.selections) {
+ if (
+ typeof properties.selections !== "object" ||
+ properties.selections === null ||
+ (!properties.selections.literalArray && !properties.selections.path)
+ ) {
+ errors.push(
+ `Component '${component.id}' of type '${componentType}' property 'selections' must have either 'literalArray' or 'path'.`,
+ );
+ }
+ }
+ if (Array.isArray(properties.options)) {
+ properties.options.forEach((option: any, index: number) => {
+ if (!option.label)
+ errors.push(
+ `Component '${component.id}' option at index ${index} missing 'label'.`,
+ );
+ if (option.label)
+ validateBoundValue(
+ option.label,
+ "label",
+ component.id,
+ componentType,
+ errors,
+ );
+ if (!option.value)
+ errors.push(
+ `Component '${component.id}' option at index ${index} missing 'value'.`,
+ );
+ });
+ }
+ break;
+ case "Slider":
+ checkRequired(["value"]);
+ if (properties.value)
+ validateBoundValue(
+ properties.value,
+ "value",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "CheckBox":
+ checkRequired(["value", "label"]);
+ if (properties.value)
+ validateBoundValue(
+ properties.value,
+ "value",
+ component.id,
+ componentType,
+ errors,
+ );
+ if (properties.label)
+ validateBoundValue(
+ properties.label,
+ "label",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ case "Row":
+ case "Column":
+ case "List":
+ checkRequired(["children"]);
+ if (properties.children && Array.isArray(properties.children)) {
+ const hasExplicit = !!properties.children.explicitList;
+ const hasTemplate = !!properties.children.template;
+ if ((hasExplicit && hasTemplate) || (!hasExplicit && !hasTemplate)) {
+ errors.push(
+ `Component '${component.id}' must have either 'explicitList' or 'template' in children, but not both or neither.`,
+ );
+ }
+ if (hasExplicit) {
+ checkRefs(properties.children.explicitList);
+ }
+ if (hasTemplate) {
+ checkRefs([properties.children.template?.componentId]);
+ }
+ }
+ break;
+ case "Card":
+ checkRequired(["child"]);
+ checkRefs([properties.child]);
+ break;
+ case "Tabs":
+ checkRequired(["tabItems"]);
+ if (properties.tabItems && Array.isArray(properties.tabItems)) {
+ properties.tabItems.forEach((tab: any) => {
+ if (!tab.title) {
+ errors.push(
+ `Tab item in component '${component.id}' is missing a 'title'.`,
+ );
+ }
+ if (!tab.child) {
+ errors.push(
+ `Tab item in component '${component.id}' is missing a 'child'.`,
+ );
+ }
+ checkRefs([tab.child]);
+ if (tab.title)
+ validateBoundValue(
+ tab.title,
+ "title",
+ component.id,
+ componentType,
+ errors,
+ );
+ });
+ }
+ break;
+ case "Modal":
+ checkRequired(["entryPointChild", "contentChild"]);
+ checkRefs([properties.entryPointChild, properties.contentChild]);
+ break;
+ case "Button":
+ checkRequired(["child", "action"]);
+ checkRefs([properties.child]);
+ if (!properties.action || !properties.action.name) {
+ errors.push(
+ `Component '${component.id}' Button action is missing a 'name'.`,
+ );
+ }
+ break;
+ case "Divider":
+ // No required properties
+ break;
+ case "Icon":
+ checkRequired(["name"]);
+ if (properties.name)
+ validateBoundValue(
+ properties.name,
+ "name",
+ component.id,
+ componentType,
+ errors,
+ );
+ break;
+ default:
+ errors.push(
+ `Unknown component type '${componentType}' in component '${component.id}'.`,
+ );
+ }
+}
diff --git a/vendor/a2ui/specification/0.8/eval/tsconfig.json b/vendor/a2ui/specification/0.8/eval/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..cb2bc5954e7e96d541f15d43f03ee26dd307fc0a
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/eval/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "target": "es2020",
+ "module": "commonjs",
+ "outDir": "lib",
+ "rootDir": "src",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true
+ }
+}
\ No newline at end of file
diff --git a/vendor/a2ui/specification/0.8/json/README.md b/vendor/a2ui/specification/0.8/json/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..75d0d7c344e4bcc2cb178a5c822539964d3da16c
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/json/README.md
@@ -0,0 +1,15 @@
+# A2UI JSON Schema Files
+
+This directory contains the formal JSON Schema definitions for the A2UI protocol.
+
+## Schema Descriptions
+
+- `server_to_client.json`: This is the core, catalog-agnostic schema for messages sent from the server to the client. It defines the four main message types (`beginRendering`, `surfaceUpdate`, `dataModelUpdate`, `deleteSurface`) and their structure. In this schema, the `component` object within a `surfaceUpdate` message is generic (`"additionalProperties": true`), allowing any component definitions to be passed.
+
+- `client_to_server.json`: This schema defines the structure for event messages sent from the client to the server. This includes user-initiated actions (`userAction`), error reporting (`error`), and the crucial `clientUiCapabilities` message, which allows a client to inform the server about the component catalog it supports.
+
+- `catalog_description_schema.json`: This is a meta-schema that defines the structure of an A2UI component catalog. A catalog consists of a `components` object and a `styles` object, where each key is a component/style name and the value is a JSON schema defining its properties. This allows for the creation of custom component sets.
+
+- `standard_catalog_definition.json`: This file is a concrete implementation of a catalog, conforming to the `catalog_description_schema.json`. It defines the standard set of components (e.g., `Text`, `Image`, `Row`, `Card`) and styles that are part of the baseline A2UI specification.
+
+- `server_to_client_with_standard_catalog.json`: This is a resolved, LLM-friendly version of the server-to-client schema. It is generated by combining `server_to_client.json` with the `standard_catalog_definition.json`. In this version, the generic `component` object is replaced with a strict `oneOf` definition that includes every component from the standard catalog. This provides a complete, strictly-typed schema that is ideal for LLMs to use for generating valid A2UI messages without ambiguity.
diff --git a/vendor/a2ui/specification/0.8/json/a2ui_client_capabilities_schema.json b/vendor/a2ui/specification/0.8/json/a2ui_client_capabilities_schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..b42df003903af5d93f87e17e65b0c55fe60dd2e0
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/json/a2ui_client_capabilities_schema.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "title": "A2UI Client Capabilities Schema",
+ "description": "A schema for the a2uiClientCapabilities object, which is sent from the client to the server to describe the client's UI rendering capabilities.",
+ "type": "object",
+ "properties": {
+ "supportedCatalogIds": {
+ "type": "array",
+ "description": "The URI of each of the catalogs that is supported by the client. The standard catalog for v0.8 is 'a2ui.org:standard_catalog_0_8_0'.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "inlineCatalogs": {
+ "type": "array",
+ "description": "An array of inline catalog definitions. This should only be provided if the agent declares 'acceptsInlineCatalogs: true' in its capabilities.",
+ "items": {
+ "$ref": "catalog_description_schema.json"
+ }
+ }
+ },
+ "required": ["supportedCatalogIds"]
+}
diff --git a/vendor/a2ui/specification/0.8/json/catalog_description_schema.json b/vendor/a2ui/specification/0.8/json/catalog_description_schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..8338c37a9953f10c7f731dd8ce8aa64c6e7fade3
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/json/catalog_description_schema.json
@@ -0,0 +1,34 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "title": "A2UI Catalog Description Schema",
+ "description": "A schema for a custom Catalog Description including A2UI components and styles.",
+ "type": "object",
+ "properties": {
+ "catalogId": {
+ "title": "Catalog ID",
+ "description": "A string that uniquely identifies this catalog. It is recommended to prefix this with an internet domain that you own, to avoid conflicts e.g. mycompany.com:somecatalog'.",
+ "type": "string"
+ },
+ "components": {
+ "title": "A2UI Components",
+ "description": "A schema that defines a catalog of A2UI components. Each key is a component name, and each value is the JSON schema for that component's properties.",
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "https://json-schema.org/draft/2020-12/schema"
+ }
+ },
+ "styles": {
+ "title": "A2UI Styles",
+ "description": "A schema that defines a catalog of A2UI styles. Each key is a style name, and each value is the JSON schema for that style's properties.",
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "https://json-schema.org/draft/2020-12/schema"
+ }
+ }
+ },
+ "required": [
+ "catalogId",
+ "components",
+ "styles"
+ ]
+}
diff --git a/vendor/a2ui/specification/0.8/json/client_to_server.json b/vendor/a2ui/specification/0.8/json/client_to_server.json
new file mode 100644
index 0000000000000000000000000000000000000000..f4f964a24518967a0c99c4b3accb195b948350b0
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/json/client_to_server.json
@@ -0,0 +1,53 @@
+{
+ "title": "A2UI (Agent to UI) Client-to-Server Event Schema",
+ "description": "Describes a JSON payload for a client-to-server event message.",
+ "type": "object",
+ "minProperties": 1,
+ "maxProperties": 1,
+ "properties": {
+ "userAction": {
+ "type": "object",
+ "description": "Reports a user-initiated action from a component.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the action, taken from the component's action.name property."
+ },
+ "surfaceId": {
+ "type": "string",
+ "description": "The id of the surface where the event originated."
+ },
+ "sourceComponentId": {
+ "type": "string",
+ "description": "The id of the component that triggered the event."
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time",
+ "description": "An ISO 8601 timestamp of when the event occurred."
+ },
+ "context": {
+ "type": "object",
+ "description": "A JSON object containing the key-value pairs from the component's action.context, after resolving all data bindings.",
+ "additionalProperties": true
+ }
+ },
+ "required": [
+ "name",
+ "surfaceId",
+ "sourceComponentId",
+ "timestamp",
+ "context"
+ ]
+ },
+ "error": {
+ "type": "object",
+ "description": "Reports a client-side error. The content is flexible.",
+ "additionalProperties": true
+ }
+ },
+ "oneOf": [
+ { "required": ["userAction"] },
+ { "required": ["error"] }
+ ]
+}
diff --git a/vendor/a2ui/specification/0.8/json/server_to_client.json b/vendor/a2ui/specification/0.8/json/server_to_client.json
new file mode 100644
index 0000000000000000000000000000000000000000..17c829814d248f142a7155a18a20a3d456969f84
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/json/server_to_client.json
@@ -0,0 +1,148 @@
+{
+ "title": "A2UI Message Schema",
+ "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "beginRendering": {
+ "type": "object",
+ "description": "Signals the client to begin rendering a surface with a root component and specific styles.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be rendered."
+ },
+ "catalogId": {
+ "type": "string",
+ "description": "The identifier of the component catalog to use for this surface. If omitted, the client MUST default to the standard catalog for this A2UI version (a2ui.org:standard_catalog_0_8_0)."
+ },
+ "root": {
+ "type": "string",
+ "description": "The ID of the root component to render."
+ },
+ "styles": {
+ "type": "object",
+ "description": "Styling information for the UI.",
+ "additionalProperties": true
+ }
+ },
+ "required": ["root", "surfaceId"]
+ },
+ "surfaceUpdate": {
+ "type": "object",
+ "description": "Updates a surface with a new set of components.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be updated. If you are adding a new surface this *must* be a new, unique identified that has never been used for any existing surfaces shown."
+ },
+ "components": {
+ "type": "array",
+ "description": "A list containing all UI components for the surface.",
+ "minItems": 1,
+ "items": {
+ "type": "object",
+ "description": "Represents a *single* component in a UI widget tree. This component could be one of many supported types.",
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier for this component."
+ },
+ "weight": {
+ "type": "number",
+ "description": "The relative weight of this component within a Row or Column. This corresponds to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column."
+ },
+ "component": {
+ "type": "object",
+ "description": "A wrapper object that MUST contain exactly one key, which is the name of the component type. The value is an object containing the properties for that specific component.",
+ "additionalProperties": true
+ }
+ },
+ "required": ["id", "component"]
+ }
+ }
+ },
+ "required": ["surfaceId", "components"]
+ },
+ "dataModelUpdate": {
+ "type": "object",
+ "description": "Updates the data model for a surface.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface this data model update applies to."
+ },
+ "path": {
+ "type": "string",
+ "description": "An optional path to a location within the data model (e.g., '/user/name'). If omitted, or set to '/', the entire data model will be replaced."
+ },
+ "contents": {
+ "type": "array",
+ "description": "An array of data entries. Each entry must contain a 'key' and exactly one corresponding typed 'value*' property.",
+ "items": {
+ "type": "object",
+ "description": "A single data entry. Exactly one 'value*' property should be provided alongside the key.",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key for this data entry."
+ },
+ "valueString": {
+ "type": "string"
+ },
+ "valueNumber": {
+ "type": "number"
+ },
+ "valueBoolean": {
+ "type": "boolean"
+ },
+ "valueMap": {
+ "description": "Represents a map as an adjacency list.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "One entry in the map. Exactly one 'value*' property should be provided alongside the key.",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "valueString": {
+ "type": "string"
+ },
+ "valueNumber": {
+ "type": "number"
+ },
+ "valueBoolean": {
+ "type": "boolean"
+ }
+ },
+ "required": ["key"]
+ }
+ }
+ },
+ "required": ["key"]
+ }
+ }
+ },
+ "required": ["contents", "surfaceId"]
+ },
+ "deleteSurface": {
+ "type": "object",
+ "description": "Signals the client to delete the surface identified by 'surfaceId'.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be deleted."
+ }
+ },
+ "required": ["surfaceId"]
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/a2ui/specification/0.8/json/server_to_client_with_standard_catalog.json b/vendor/a2ui/specification/0.8/json/server_to_client_with_standard_catalog.json
new file mode 100644
index 0000000000000000000000000000000000000000..d3e71f5f92239e66a064cfc28500ddb4d145be15
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/json/server_to_client_with_standard_catalog.json
@@ -0,0 +1,827 @@
+{
+ "title": "A2UI Message Schema",
+ "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "beginRendering": {
+ "type": "object",
+ "description": "Signals the client to begin rendering a surface with a root component and specific styles.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be rendered."
+ },
+ "root": {
+ "type": "string",
+ "description": "The ID of the root component to render."
+ },
+ "styles": {
+ "type": "object",
+ "description": "Styling information for the UI.",
+ "additionalProperties": false,
+ "properties": {
+ "font": {
+ "type": "string",
+ "description": "The primary font for the UI."
+ },
+ "primaryColor": {
+ "type": "string",
+ "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ }
+ }
+ },
+ "required": ["root", "surfaceId"]
+ },
+ "surfaceUpdate": {
+ "type": "object",
+ "description": "Updates a surface with a new set of components.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be updated. If you are adding a new surface this *must* be a new, unique identified that has never been used for any existing surfaces shown."
+ },
+ "components": {
+ "type": "array",
+ "description": "A list containing all UI components for the surface.",
+ "minItems": 1,
+ "items": {
+ "type": "object",
+ "description": "Represents a *single* component in a UI widget tree. This component could be one of many supported types.",
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The unique identifier for this component."
+ },
+ "weight": {
+ "type": "number",
+ "description": "The relative weight of this component within a Row or Column. This corresponds to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column."
+ },
+ "component": {
+ "type": "object",
+ "description": "A wrapper object that MUST contain exactly one key, which is the name of the component type (e.g., 'Heading'). The value is an object containing the properties for that specific component.",
+ "additionalProperties": false,
+ "properties": {
+ "Text": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "text": {
+ "type": "object",
+ "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation.",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.",
+ "enum": [
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "caption",
+ "body"
+ ]
+ }
+ },
+ "required": ["text"]
+ },
+ "Image": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "fit": {
+ "type": "string",
+ "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.",
+ "enum": [
+ "contain",
+ "cover",
+ "fill",
+ "none",
+ "scale-down"
+ ]
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.",
+ "enum": [
+ "icon",
+ "avatar",
+ "smallFeature",
+ "mediumFeature",
+ "largeFeature",
+ "header"
+ ]
+ }
+ },
+ "required": ["url"]
+ },
+ "Icon": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "object",
+ "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string",
+ "enum": [
+ "accountCircle",
+ "add",
+ "arrowBack",
+ "arrowForward",
+ "attachFile",
+ "calendarToday",
+ "call",
+ "camera",
+ "check",
+ "close",
+ "delete",
+ "download",
+ "edit",
+ "event",
+ "error",
+ "favorite",
+ "favoriteOff",
+ "folder",
+ "help",
+ "home",
+ "info",
+ "locationOn",
+ "lock",
+ "lockOpen",
+ "mail",
+ "menu",
+ "moreVert",
+ "moreHoriz",
+ "notificationsOff",
+ "notifications",
+ "payment",
+ "person",
+ "phone",
+ "photo",
+ "print",
+ "refresh",
+ "search",
+ "send",
+ "settings",
+ "share",
+ "shoppingCart",
+ "star",
+ "starHalf",
+ "starOff",
+ "upload",
+ "visibility",
+ "visibilityOff",
+ "warning"
+ ]
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["name"]
+ },
+ "Video": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["url"]
+ },
+ "AudioPlayer": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "description": {
+ "type": "object",
+ "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["url"]
+ },
+ "Row": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.",
+ "enum": [
+ "center",
+ "end",
+ "spaceAround",
+ "spaceBetween",
+ "spaceEvenly",
+ "start"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "Column": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.",
+ "enum": [
+ "start",
+ "center",
+ "end",
+ "spaceBetween",
+ "spaceAround",
+ "spaceEvenly"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.",
+ "enum": ["center", "end", "start", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "List": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "direction": {
+ "type": "string",
+ "description": "The direction in which the list items are laid out.",
+ "enum": ["vertical", "horizontal"]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis.",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "Card": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "child": {
+ "type": "string",
+ "description": "The ID of the component to be rendered inside the card."
+ }
+ },
+ "required": ["child"]
+ },
+ "Tabs": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "tabItems": {
+ "type": "array",
+ "description": "An array of objects, where each object defines a tab with a title and a child component.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "title": {
+ "type": "object",
+ "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "child": {
+ "type": "string"
+ }
+ },
+ "required": ["title", "child"]
+ }
+ }
+ },
+ "required": ["tabItems"]
+ },
+ "Divider": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "axis": {
+ "type": "string",
+ "description": "The orientation of the divider.",
+ "enum": ["horizontal", "vertical"]
+ }
+ }
+ },
+ "Modal": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "entryPointChild": {
+ "type": "string",
+ "description": "The ID of the component that opens the modal when interacted with (e.g., a button)."
+ },
+ "contentChild": {
+ "type": "string",
+ "description": "The ID of the component to be displayed inside the modal."
+ }
+ },
+ "required": ["entryPointChild", "contentChild"]
+ },
+ "Button": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "child": {
+ "type": "string",
+ "description": "The ID of the component to display in the button, typically a Text component."
+ },
+ "primary": {
+ "type": "boolean",
+ "description": "Indicates if this button should be styled as the primary action."
+ },
+ "action": {
+ "type": "object",
+ "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "context": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "value": {
+ "type": "object",
+ "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "path": {
+ "type": "string"
+ },
+ "literalString": {
+ "type": "string"
+ },
+ "literalNumber": {
+ "type": "number"
+ },
+ "literalBoolean": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "required": ["key", "value"]
+ }
+ }
+ },
+ "required": ["name"]
+ }
+ },
+ "required": ["child", "action"]
+ },
+ "CheckBox": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').",
+ "additionalProperties": false,
+ "properties": {
+ "literalBoolean": {
+ "type": "boolean"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["label", "value"]
+ },
+ "TextField": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "textFieldType": {
+ "type": "string",
+ "description": "The type of input field to display.",
+ "enum": [
+ "date",
+ "longText",
+ "number",
+ "shortText",
+ "obscured"
+ ]
+ },
+ "validationRegexp": {
+ "type": "string",
+ "description": "A regular expression used for client-side validation of the input."
+ }
+ },
+ "required": ["label"]
+ },
+ "DateTimeInput": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "value": {
+ "type": "object",
+ "description": "The selected date and/or time value. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "enableDate": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a date."
+ },
+ "enableTime": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a time."
+ },
+ "outputFormat": {
+ "type": "string",
+ "description": "The desired format for the output string after a date or time is selected."
+ }
+ },
+ "required": ["value"]
+ },
+ "MultipleChoice": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "selections": {
+ "type": "object",
+ "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').",
+ "additionalProperties": false,
+ "properties": {
+ "literalArray": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of available options for the user to choose from.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "value": {
+ "type": "string",
+ "description": "The value to be associated with this option when selected."
+ }
+ },
+ "required": ["label", "value"]
+ }
+ },
+ "maxAllowedSelections": {
+ "type": "integer",
+ "description": "The maximum number of options that the user is allowed to select."
+ }
+ },
+ "required": ["selections", "options"]
+ },
+ "Slider": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "value": {
+ "type": "object",
+ "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').",
+ "additionalProperties": false,
+ "properties": {
+ "literalNumber": {
+ "type": "number"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "minValue": {
+ "type": "number",
+ "description": "The minimum value of the slider."
+ },
+ "maxValue": {
+ "type": "number",
+ "description": "The maximum value of the slider."
+ }
+ },
+ "required": ["value"]
+ }
+ }
+ }
+ },
+ "required": ["id", "component"]
+ }
+ }
+ },
+ "required": ["surfaceId", "components"]
+ },
+ "dataModelUpdate": {
+ "type": "object",
+ "description": "Updates the data model for a surface.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface this data model update applies to."
+ },
+ "path": {
+ "type": "string",
+ "description": "An optional path to a location within the data model (e.g., '/user/name'). If omitted, or set to '/', the entire data model will be replaced."
+ },
+ "contents": {
+ "type": "array",
+ "description": "An array of data entries. Each entry must contain a 'key' and exactly one corresponding typed 'value*' property.",
+ "items": {
+ "type": "object",
+ "description": "A single data entry. Exactly one 'value*' property should be provided alongside the key.",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key for this data entry."
+ },
+ "valueString": {
+ "type": "string"
+ },
+ "valueNumber": {
+ "type": "number"
+ },
+ "valueBoolean": {
+ "type": "boolean"
+ },
+ "valueMap": {
+ "description": "Represents a map as an adjacency list.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "One entry in the map. Exactly one 'value*' property should be provided alongside the key.",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "valueString": {
+ "type": "string"
+ },
+ "valueNumber": {
+ "type": "number"
+ },
+ "valueBoolean": {
+ "type": "boolean"
+ }
+ },
+ "required": ["key"]
+ }
+ }
+ },
+ "required": ["key"]
+ }
+ }
+ },
+ "required": ["contents", "surfaceId"]
+ },
+ "deleteSurface": {
+ "type": "object",
+ "description": "Signals the client to delete the surface identified by 'surfaceId'.",
+ "additionalProperties": false,
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be deleted."
+ }
+ },
+ "required": ["surfaceId"]
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/a2ui/specification/0.8/json/standard_catalog_definition.json b/vendor/a2ui/specification/0.8/json/standard_catalog_definition.json
new file mode 100644
index 0000000000000000000000000000000000000000..b86acd7f0a67a62a3996882341a83efab1df6945
--- /dev/null
+++ b/vendor/a2ui/specification/0.8/json/standard_catalog_definition.json
@@ -0,0 +1,685 @@
+{
+ "components": {
+ "Text": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "text": {
+ "type": "object",
+ "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation.",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.",
+ "enum": [
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "caption",
+ "body"
+ ]
+ }
+ },
+ "required": ["text"]
+ },
+ "Image": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "fit": {
+ "type": "string",
+ "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.",
+ "enum": [
+ "contain",
+ "cover",
+ "fill",
+ "none",
+ "scale-down"
+ ]
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.",
+ "enum": [
+ "icon",
+ "avatar",
+ "smallFeature",
+ "mediumFeature",
+ "largeFeature",
+ "header"
+ ]
+ }
+ },
+ "required": ["url"]
+ },
+ "Icon": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "object",
+ "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string",
+ "enum": [
+ "accountCircle",
+ "add",
+ "arrowBack",
+ "arrowForward",
+ "attachFile",
+ "calendarToday",
+ "call",
+ "camera",
+ "check",
+ "close",
+ "delete",
+ "download",
+ "edit",
+ "event",
+ "error",
+ "favorite",
+ "favoriteOff",
+ "folder",
+ "help",
+ "home",
+ "info",
+ "locationOn",
+ "lock",
+ "lockOpen",
+ "mail",
+ "menu",
+ "moreVert",
+ "moreHoriz",
+ "notificationsOff",
+ "notifications",
+ "payment",
+ "person",
+ "phone",
+ "photo",
+ "print",
+ "refresh",
+ "search",
+ "send",
+ "settings",
+ "share",
+ "shoppingCart",
+ "star",
+ "starHalf",
+ "starOff",
+ "upload",
+ "visibility",
+ "visibilityOff",
+ "warning"
+ ]
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["name"]
+ },
+ "Video": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["url"]
+ },
+ "AudioPlayer": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "url": {
+ "type": "object",
+ "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "description": {
+ "type": "object",
+ "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["url"]
+ },
+ "Row": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.",
+ "enum": [
+ "center",
+ "end",
+ "spaceAround",
+ "spaceBetween",
+ "spaceEvenly",
+ "start"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "Column": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.",
+ "enum": [
+ "start",
+ "center",
+ "end",
+ "spaceBetween",
+ "spaceAround",
+ "spaceEvenly"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.",
+ "enum": ["center", "end", "start", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "List": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "children": {
+ "type": "object",
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
+ "additionalProperties": false,
+ "properties": {
+ "explicitList": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
+ "additionalProperties": false,
+ "properties": {
+ "componentId": {
+ "type": "string"
+ },
+ "dataBinding": {
+ "type": "string"
+ }
+ },
+ "required": ["componentId", "dataBinding"]
+ }
+ }
+ },
+ "direction": {
+ "type": "string",
+ "description": "The direction in which the list items are laid out.",
+ "enum": ["vertical", "horizontal"]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis.",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["children"]
+ },
+ "Card": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "child": {
+ "type": "string",
+ "description": "The ID of the component to be rendered inside the card."
+ }
+ },
+ "required": ["child"]
+ },
+ "Tabs": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "tabItems": {
+ "type": "array",
+ "description": "An array of objects, where each object defines a tab with a title and a child component.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "title": {
+ "type": "object",
+ "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "child": {
+ "type": "string"
+ }
+ },
+ "required": ["title", "child"]
+ }
+ }
+ },
+ "required": ["tabItems"]
+ },
+ "Divider": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "axis": {
+ "type": "string",
+ "description": "The orientation of the divider.",
+ "enum": ["horizontal", "vertical"]
+ }
+ }
+ },
+ "Modal": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "entryPointChild": {
+ "type": "string",
+ "description": "The ID of the component that opens the modal when interacted with (e.g., a button)."
+ },
+ "contentChild": {
+ "type": "string",
+ "description": "The ID of the component to be displayed inside the modal."
+ }
+ },
+ "required": ["entryPointChild", "contentChild"]
+ },
+ "Button": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "child": {
+ "type": "string",
+ "description": "The ID of the component to display in the button, typically a Text component."
+ },
+ "primary": {
+ "type": "boolean",
+ "description": "Indicates if this button should be styled as the primary action."
+ },
+ "action": {
+ "type": "object",
+ "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "context": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "value": {
+ "type": "object",
+ "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "path": {
+ "type": "string"
+ },
+ "literalString": {
+ "type": "string"
+ },
+ "literalNumber": {
+ "type": "number"
+ },
+ "literalBoolean": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "required": ["key", "value"]
+ }
+ }
+ },
+ "required": ["name"]
+ }
+ },
+ "required": ["child", "action"]
+ },
+ "CheckBox": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').",
+ "additionalProperties": false,
+ "properties": {
+ "literalBoolean": {
+ "type": "boolean"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": ["label", "value"]
+ },
+ "TextField": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "textFieldType": {
+ "type": "string",
+ "description": "The type of input field to display.",
+ "enum": [
+ "date",
+ "longText",
+ "number",
+ "shortText",
+ "obscured"
+ ]
+ },
+ "validationRegexp": {
+ "type": "string",
+ "description": "A regular expression used for client-side validation of the input."
+ }
+ },
+ "required": ["label"]
+ },
+ "DateTimeInput": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "value": {
+ "type": "object",
+ "description": "The selected date and/or time value. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "enableDate": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a date."
+ },
+ "enableTime": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a time."
+ },
+ "outputFormat": {
+ "type": "string",
+ "description": "The desired format for the output string after a date or time is selected."
+ }
+ },
+ "required": ["value"]
+ },
+ "MultipleChoice": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "selections": {
+ "type": "object",
+ "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').",
+ "additionalProperties": false,
+ "properties": {
+ "literalArray": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of available options for the user to choose from.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "object",
+ "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').",
+ "additionalProperties": false,
+ "properties": {
+ "literalString": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "value": {
+ "type": "string",
+ "description": "The value to be associated with this option when selected."
+ }
+ },
+ "required": ["label", "value"]
+ }
+ },
+ "maxAllowedSelections": {
+ "type": "integer",
+ "description": "The maximum number of options that the user is allowed to select."
+ }
+ },
+ "required": ["selections", "options"]
+ },
+ "Slider": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "value": {
+ "type": "object",
+ "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').",
+ "additionalProperties": false,
+ "properties": {
+ "literalNumber": {
+ "type": "number"
+ },
+ "path": {
+ "type": "string"
+ }
+ }
+ },
+ "minValue": {
+ "type": "number",
+ "description": "The minimum value of the slider."
+ },
+ "maxValue": {
+ "type": "number",
+ "description": "The maximum value of the slider."
+ }
+ },
+ "required": ["value"]
+ }
+ },
+ "styles": {
+ "font": {
+ "type": "string",
+ "description": "The primary font for the UI."
+ },
+ "primaryColor": {
+ "type": "string",
+ "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/a2ui/specification/0.9/eval/.gitignore b/vendor/a2ui/specification/0.9/eval/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..9432981d8c912df5aaf29a2fe501a728ac6fbf27
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/.gitignore
@@ -0,0 +1,26 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+/results
+
+# production
+/build
+lib/
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.genkit
diff --git a/vendor/a2ui/specification/0.9/eval/README.md b/vendor/a2ui/specification/0.9/eval/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8e02d8ae800c4c85f2162acf614ed2cfaf2f1d8f
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/README.md
@@ -0,0 +1,79 @@
+# Genkit Eval Framework for UI generation
+
+This is for evaluating A2UI (v0.9) against various LLMs.
+
+This version embeds the JSON schemas directly into the prompt and instructs the LLM to output a JSON object within a markdown code block. The framework then extracts and validates this JSON.
+
+## Setup
+
+To use the models, you need to set the following environment variables with your API keys:
+
+- `GEMINI_API_KEY`
+- `OPENAI_API_KEY`
+- `ANTHROPIC_API_KEY`
+
+You can set these in a `.env` file in the root of the project, or in your shell's configuration file (e.g., `.bashrc`, `.zshrc`).
+
+You also need to install dependencies before running:
+
+```bash
+pnpm install
+```
+
+## Running all evals (warning: can use _lots_ of model quota)
+
+To run the flow, use the following command:
+
+```bash
+pnpm run evalAll
+```
+
+## Running a Single Test
+
+You can run the script for a single model and data point by using the `--model` and `--prompt` command-line flags. This is useful for quick tests and debugging.
+
+### Syntax
+
+```bash
+pnpm run eval --model= --prompt=
+```
+
+### Example
+
+To run the test with the `gemini-2.5-flash-lite` model and the `loginForm` prompt, use the following command:
+
+```bash
+pnpm run eval --model=gemini-2.5-flash-lite --prompt=loginForm
+```
+
+## Controlling Output
+
+By default, the script prints a progress bar and the final summary table to the console. Detailed logs are written to `output.log` in the results directory.
+
+### Command-Line Options
+
+- `--log-level=`: Sets the console logging level (default: `info`). Options: `error`, `warn`, `info`, `http`, `verbose`, `debug`, `silly`.
+ - Note: The file log (`output.log` in the results directory) always captures `debug` level logs regardless of this setting.
+- `--results=`: (Default: `results/output-` or `results/output-combined` if multiple models are specified) Preserves output files. To specify a custom directory, use `--results=my_results`.
+- `--clean-results`: If set, cleans the results directory before running tests.
+- `--runs-per-prompt=`: Number of times to run each prompt (default: 1).
+- `--model=`: (Default: all models) Run only the specified model(s). Can be specified multiple times.
+- `--prompt=`: (Default: all prompts) Run only the specified prompt.
+
+### Examples
+
+Run with debug output in console:
+```bash
+pnpm run eval -- --log-level=debug
+```
+
+Run 5 times per prompt and clean previous results:
+```bash
+pnpm run eval -- --runs-per-prompt=5 --clean-results
+```
+
+## Rate Limiting
+
+The framework includes a two-tiered rate limiting system:
+1. **Proactive Limiting**: Locally tracks token and request usage to stay within configured limits (defined in `src/models.ts`).
+2. **Reactive Circuit Breaker**: Automatically pauses requests to a model if a `RESOURCE_EXHAUSTED` (429) error is received, resuming only after the requested retry duration.
diff --git a/vendor/a2ui/specification/0.9/eval/genkit.conf.js b/vendor/a2ui/specification/0.9/eval/genkit.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..7752b118a2a90c2e3faff0ebca7bf9bb616a8f13
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/genkit.conf.js
@@ -0,0 +1,24 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { googleAI } from "@genkit-ai/google-genai";
+import { configure } from "genkit";
+
+export default configure({
+ plugins: [googleAI()],
+ logLevel: "debug",
+ enableTracingAndMetrics: true,
+});
diff --git a/vendor/a2ui/specification/0.9/eval/package.json b/vendor/a2ui/specification/0.9/eval/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..b75a92ae6722e3adafade966a0f6a1e785450ba1
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "a2ui_0_9_eval_llm",
+ "version": "1.0.0",
+ "main": "lib/index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "build": "tsc",
+ "eval": "dotenv -- tsx src/index.ts",
+ "evalAll": "pnpm run eval --clean-results",
+ "evalGemini": "pnpm run eval --model=gemini-2.5-flash-lite --clean-results",
+ "evalGpt": "pnpm run eval --model=gpt-5-mini --clean-results",
+ "evalClaude": "pnpm run eval --model=claude-4-sonnet --clean-results",
+ "start": "genkit start",
+ "genkit:dev": "genkit start -- tsx --watch src/dev.ts",
+ "format": "prettier --write src/**/*.ts"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "devDependencies": {
+ "@types/node": "^20.19.25",
+ "@types/yargs": "^17.0.35",
+ "dotenv-cli": "^10.0.0",
+ "prettier": "^3.6.2",
+ "tsx": "^4.20.6",
+ "typescript": "^5.9.3",
+ "yargs": "^18.0.0"
+ },
+ "dependencies": {
+ "@genkit-ai/ai": "^1.24.0",
+ "@genkit-ai/compat-oai": "^1.24.0",
+ "@genkit-ai/core": "^1.24.0",
+ "@genkit-ai/dotprompt": "^0.9.12",
+ "@genkit-ai/firebase": "^1.24.0",
+ "@genkit-ai/google-cloud": "^1.24.0",
+ "@genkit-ai/google-genai": "^1.24.0",
+ "@types/js-yaml": "^4.0.9",
+ "ajv": "^8.17.1",
+ "ajv-formats": "^3.0.1",
+ "genkit": "^1.24.0",
+ "genkitx-anthropic": "^0.25.0",
+ "js-yaml": "^4.1.1",
+ "winston": "^3.18.3",
+ "zod": "^3.25.76"
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/eval/pnpm-lock.yaml b/vendor/a2ui/specification/0.9/eval/pnpm-lock.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2cbb1dec7f301c0cf3fd7778c0174301b101de80
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/pnpm-lock.yaml
@@ -0,0 +1,4727 @@
+# Copyright 2025 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@genkit-ai/ai':
+ specifier: ^1.24.0
+ version: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@genkit-ai/compat-oai':
+ specifier: ^1.24.0
+ version: 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))(zod@3.25.76)
+ '@genkit-ai/core':
+ specifier: ^1.24.0
+ version: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@genkit-ai/dotprompt':
+ specifier: ^0.9.12
+ version: 0.9.12
+ '@genkit-ai/firebase':
+ specifier: ^1.24.0
+ version: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@genkit-ai/google-cloud':
+ specifier: ^1.24.0
+ version: 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@genkit-ai/google-genai':
+ specifier: ^1.24.0
+ version: 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@types/js-yaml':
+ specifier: ^4.0.9
+ version: 4.0.9
+ ajv:
+ specifier: ^8.17.1
+ version: 8.17.1
+ ajv-formats:
+ specifier: ^3.0.1
+ version: 3.0.1(ajv@8.17.1)
+ genkit:
+ specifier: ^1.24.0
+ version: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ genkitx-anthropic:
+ specifier: ^0.25.0
+ version: 0.25.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ js-yaml:
+ specifier: ^4.1.1
+ version: 4.1.1
+ winston:
+ specifier: ^3.18.3
+ version: 3.18.3
+ zod:
+ specifier: ^3.25.76
+ version: 3.25.76
+ devDependencies:
+ '@types/node':
+ specifier: ^20.19.25
+ version: 20.19.25
+ '@types/yargs':
+ specifier: ^17.0.35
+ version: 17.0.35
+ dotenv-cli:
+ specifier: ^10.0.0
+ version: 10.0.0
+ prettier:
+ specifier: ^3.6.2
+ version: 3.6.2
+ tsx:
+ specifier: ^4.20.6
+ version: 4.20.6
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+ yargs:
+ specifier: ^18.0.0
+ version: 18.0.0
+
+packages:
+
+ '@anthropic-ai/sdk@0.39.0':
+ resolution: {integrity: sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==}
+
+ '@colors/colors@1.6.0':
+ resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
+ engines: {node: '>=0.1.90'}
+
+ '@dabh/diagnostics@2.0.8':
+ resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
+
+ '@esbuild/aix-ppc64@0.25.12':
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.12':
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.12':
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.12':
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.12':
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.12':
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.12':
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.12':
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.12':
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.12':
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.12':
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.12':
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.12':
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.12':
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.12':
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.12':
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.12':
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.12':
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.12':
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.12':
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.12':
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@fastify/busboy@3.2.0':
+ resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==}
+
+ '@firebase/app-check-interop-types@0.3.3':
+ resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==}
+
+ '@firebase/app-types@0.9.3':
+ resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==}
+
+ '@firebase/auth-interop-types@0.2.4':
+ resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==}
+
+ '@firebase/component@0.7.0':
+ resolution: {integrity: sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/database-compat@2.1.0':
+ resolution: {integrity: sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/database-types@1.0.16':
+ resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==}
+
+ '@firebase/database@1.1.0':
+ resolution: {integrity: sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/logger@0.5.0':
+ resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==}
+ engines: {node: '>=20.0.0'}
+
+ '@firebase/util@1.13.0':
+ resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@genkit-ai/ai@0.9.12':
+ resolution: {integrity: sha512-xyVVAIGKNpj5zCkoEfWZkzwctl0/hmpX6vKZgdgMH2MiqP5LzTp7rUekBMon8c1rMDVAze97QVSjAmZIoMLSlA==}
+
+ '@genkit-ai/ai@1.24.0':
+ resolution: {integrity: sha512-Rv2eZqvJA8awIfLKiZL+P1hlBPGFiBFk1r01hRk0BSp1HmpZmlzSx+MM+X2H54xMgRXBRAelzU6xUXXzN5U57Q==}
+
+ '@genkit-ai/compat-oai@1.24.0':
+ resolution: {integrity: sha512-DCUFTlql4LH3wb3q3SWnC4CZS74iLsXchLvVGxorlqG7YMPaVFntjMzUX9ehRIgXCLyFJA3PHOgAZE2yjtOU+g==}
+ peerDependencies:
+ genkit: ^1.24.0
+
+ '@genkit-ai/core@0.9.12':
+ resolution: {integrity: sha512-QPJZ3TL5Iq2fyeo30MpUjd3ZLcYQf97RsitDZhMbGy3vMwbgig0nhEbJ6v/qaWsOMqSfIxJE/gETY3mMts1vRg==}
+
+ '@genkit-ai/core@1.24.0':
+ resolution: {integrity: sha512-JGmwdcC066OpbwShXeOOwvinj9b4yA0BKfKjPrVqqbWt9hvu81I60UNNiZC5y8dx+TvEhdEPUAXRvoOup2vC0w==}
+
+ '@genkit-ai/dotprompt@0.9.12':
+ resolution: {integrity: sha512-eEHBRzRVemiPuqCBbXiLgltNWpmCHmC+gVHBhsAnrfOYBlwmPvh2nnAPBXGYnkDH87PuN11jg8YJQmO4kQuoSw==}
+
+ '@genkit-ai/firebase@1.24.0':
+ resolution: {integrity: sha512-6DZ612qNV4OUsAa0L40gYx0rIzcANAjv3u9R08wGK/twdOvANJuMOUWBRTIVPA0IZL2WiHLcm6Ss+GOdZOdvpg==}
+ peerDependencies:
+ '@google-cloud/firestore': ^7.11.0
+ firebase: '>=11.5.0'
+ firebase-admin: '>=12.2'
+ genkit: ^1.24.0
+ peerDependenciesMeta:
+ firebase:
+ optional: true
+
+ '@genkit-ai/google-cloud@1.24.0':
+ resolution: {integrity: sha512-SrNCuo7UC1c7BRRk4F6IRAM9ZSBbpLUUWgpP9xUUQ3sozVzPwWwI5Eps32WCa52ljrbhSiQQRi4sRm36glDBiA==}
+ peerDependencies:
+ genkit: ^1.24.0
+
+ '@genkit-ai/google-genai@1.24.0':
+ resolution: {integrity: sha512-J8WfWWkyeF6Pq9t7XTZU1D/IoRzg5RUkYhXFWnEJd+Ez22DUjBQLkyxiFt3UqDQ2F2yNWYzt8Dcca03kqwZyvg==}
+ peerDependencies:
+ genkit: ^1.24.0
+
+ '@google-cloud/common@5.0.2':
+ resolution: {integrity: sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/firestore@7.11.6':
+ resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/logging-winston@6.0.1':
+ resolution: {integrity: sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ winston: '>=3.2.1'
+
+ '@google-cloud/logging@11.2.1':
+ resolution: {integrity: sha512-2h9HBJG3OAsvzXmb81qXmaTPfXYU7KJTQUxunoOKFGnY293YQ/eCkW1Y5mHLocwpEqeqQYT/Qvl6Tk+Q7PfStw==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/opentelemetry-cloud-monitoring-exporter@0.19.0':
+ resolution: {integrity: sha512-5SOPXwC6RET4ZvXxw5D97dp8fWpqWEunHrzrUUGXhG4UAeedQe1KvYV8CK+fnaAbN2l2ha6QDYspT6z40TVY0g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+ '@opentelemetry/core': ^1.0.0
+ '@opentelemetry/resources': ^1.0.0
+ '@opentelemetry/sdk-metrics': ^1.0.0
+
+ '@google-cloud/opentelemetry-cloud-trace-exporter@2.4.1':
+ resolution: {integrity: sha512-Dq2IyAyA9PCjbjLOn86i2byjkYPC59b5ic8k/L4q5bBWH0Jro8lzMs8C0G5pJfqh2druj8HF+oAIAlSdWQ+Z9Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+ '@opentelemetry/core': ^1.0.0
+ '@opentelemetry/resources': ^1.0.0
+ '@opentelemetry/sdk-trace-base': ^1.0.0
+
+ '@google-cloud/opentelemetry-resource-util@2.4.0':
+ resolution: {integrity: sha512-/7ujlMoKtDtrbQlJihCjQnm31n2s2RTlvJqcSbt2jV3OkCzPAdo3u31Q13HNugqtIRUSk7bUoLx6AzhURkhW4w==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/resources': ^1.0.0
+
+ '@google-cloud/paginator@5.0.2':
+ resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/precise-date@4.0.0':
+ resolution: {integrity: sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/projectify@4.0.0':
+ resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/promisify@4.0.0':
+ resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==}
+ engines: {node: '>=14'}
+
+ '@google-cloud/storage@7.17.3':
+ resolution: {integrity: sha512-gOnCAbFgAYKRozywLsxagdevTF7Gm+2Ncz5u5CQAuOv/2VCa0rdGJWvJFDOftPx1tc+q8TXiC2pEJfFKu+yeMQ==}
+ engines: {node: '>=14'}
+
+ '@grpc/grpc-js@1.14.1':
+ resolution: {integrity: sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==}
+ engines: {node: '>=12.10.0'}
+
+ '@grpc/proto-loader@0.7.15':
+ resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ '@grpc/proto-loader@0.8.0':
+ resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ '@js-sdsl/ordered-map@4.4.2':
+ resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==}
+
+ '@opentelemetry/api-logs@0.52.1':
+ resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/api@1.9.0':
+ resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
+ engines: {node: '>=8.0.0'}
+
+ '@opentelemetry/auto-instrumentations-node@0.49.2':
+ resolution: {integrity: sha512-xtETEPmAby/3MMmedv8Z/873sdLTWg+Vq98rtm4wbwvAiXBB/ao8qRyzRlvR2MR6puEr+vIB/CXeyJnzNA3cyw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.4.1
+
+ '@opentelemetry/context-async-hooks@1.25.1':
+ resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/context-async-hooks@1.30.1':
+ resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/core@1.25.1':
+ resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/core@1.30.1':
+ resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/exporter-jaeger@1.30.1':
+ resolution: {integrity: sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==}
+ engines: {node: '>=14'}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-trace-otlp-grpc@0.52.1':
+ resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-trace-otlp-http@0.52.1':
+ resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-trace-otlp-proto@0.52.1':
+ resolution: {integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/exporter-zipkin@1.25.1':
+ resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/instrumentation-amqplib@0.41.0':
+ resolution: {integrity: sha512-00Oi6N20BxJVcqETjgNzCmVKN+I5bJH/61IlHiIWd00snj1FdgiIKlpE4hYVacTB2sjIBB3nTbHskttdZEE2eg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-aws-lambda@0.43.0':
+ resolution: {integrity: sha512-pSxcWlsE/pCWQRIw92sV2C+LmKXelYkjkA7C5s39iPUi4pZ2lA1nIiw+1R/y2pDEhUHcaKkNyljQr3cx9ZpVlQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-aws-sdk@0.43.1':
+ resolution: {integrity: sha512-qLT2cCniJ5W+6PFzKbksnoIQuq9pS83nmgaExfUwXVvlwi0ILc50dea0tWBHZMkdIDa/zZdcuFrJ7+fUcSnRow==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-bunyan@0.40.0':
+ resolution: {integrity: sha512-aZ4cXaGWwj79ZXSYrgFVsrDlE4mmf2wfvP9bViwRc0j75A6eN6GaHYHqufFGMTCqASQn5pIjjP+Bx+PWTGiofw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-cassandra-driver@0.40.0':
+ resolution: {integrity: sha512-JxbM39JU7HxE9MTKKwi6y5Z3mokjZB2BjwfqYi4B3Y29YO3I42Z7eopG6qq06yWZc+nQli386UDQe0d9xKmw0A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-connect@0.38.0':
+ resolution: {integrity: sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-cucumber@0.8.0':
+ resolution: {integrity: sha512-ieTm4RBIlZt2brPwtX5aEZYtYnkyqhAVXJI9RIohiBVMe5DxiwCwt+2Exep/nDVqGPX8zRBZUl4AEw423OxJig==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/instrumentation-dataloader@0.11.0':
+ resolution: {integrity: sha512-27urJmwkH4KDaMJtEv1uy2S7Apk4XbN4AgWMdfMJbi7DnOduJmeuA+DpJCwXB72tEWXo89z5T3hUVJIDiSNmNw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-dns@0.38.0':
+ resolution: {integrity: sha512-Um07I0TQXDWa+ZbEAKDFUxFH40dLtejtExDOMLNJ1CL8VmOmA71qx93Qi/QG4tGkiI1XWqr7gF/oiMCJ4m8buQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-express@0.41.1':
+ resolution: {integrity: sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-fastify@0.38.0':
+ resolution: {integrity: sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-fs@0.14.0':
+ resolution: {integrity: sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-generic-pool@0.38.1':
+ resolution: {integrity: sha512-WvssuKCuavu/hlq661u82UWkc248cyI/sT+c2dEIj6yCk0BUkErY1D+9XOO+PmHdJNE+76i2NdcvQX5rJrOe/w==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-graphql@0.42.0':
+ resolution: {integrity: sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-grpc@0.52.1':
+ resolution: {integrity: sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-hapi@0.40.0':
+ resolution: {integrity: sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-http@0.52.1':
+ resolution: {integrity: sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-ioredis@0.42.0':
+ resolution: {integrity: sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-kafkajs@0.2.0':
+ resolution: {integrity: sha512-uKKmhEFd0zR280tJovuiBG7cfnNZT4kvVTvqtHPxQP7nOmRbJstCYHFH13YzjVcKjkmoArmxiSulmZmF7SLIlg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-knex@0.39.0':
+ resolution: {integrity: sha512-lRwTqIKQecPWDkH1KEcAUcFhCaNssbKSpxf4sxRTAROCwrCEnYkjOuqJHV+q1/CApjMTaKu0Er4LBv/6bDpoxA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-koa@0.42.0':
+ resolution: {integrity: sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-lru-memoizer@0.39.0':
+ resolution: {integrity: sha512-eU1Wx1RRTR/2wYXFzH9gcpB8EPmhYlNDIUHzUXjyUE0CAXEJhBLkYNlzdaVCoQDw2neDqS+Woshiia6+emWK9A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-memcached@0.38.0':
+ resolution: {integrity: sha512-tPmyqQEZNyrvg6G+iItdlguQEcGzfE+bJkpQifmBXmWBnoS5oU3UxqtyYuXGL2zI9qQM5yMBHH4nRXWALzy7WA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mongodb@0.46.0':
+ resolution: {integrity: sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mongoose@0.41.0':
+ resolution: {integrity: sha512-ivJg4QnnabFxxoI7K8D+in7hfikjte38sYzJB9v1641xJk9Esa7jM3hmbPB7lxwcgWJLVEDvfPwobt1if0tXxA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mysql2@0.40.0':
+ resolution: {integrity: sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-mysql@0.40.0':
+ resolution: {integrity: sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-nestjs-core@0.39.0':
+ resolution: {integrity: sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-net@0.38.0':
+ resolution: {integrity: sha512-stjow1PijcmUquSmRD/fSihm/H61DbjPlJuJhWUe7P22LFPjFhsrSeiB5vGj3vn+QGceNAs+kioUTzMGPbNxtg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-pg@0.43.0':
+ resolution: {integrity: sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-pino@0.41.0':
+ resolution: {integrity: sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-redis-4@0.41.1':
+ resolution: {integrity: sha512-UqJAbxraBk7s7pQTlFi5ND4sAUs4r/Ai7gsAVZTQDbHl2kSsOp7gpHcpIuN5dpcI2xnuhM2tkH4SmEhbrv2S6Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-redis@0.41.0':
+ resolution: {integrity: sha512-RJ1pwI3btykp67ts+5qZbaFSAAzacucwBet5/5EsKYtWBpHbWwV/qbGN/kIBzXg5WEZBhXLrR/RUq0EpEUpL3A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-restify@0.40.0':
+ resolution: {integrity: sha512-sm/rH/GysY/KOEvZqYBZSLYFeXlBkHCgqPDgWc07tz+bHCN6mPs9P3otGOSTe7o3KAIM8Nc6ncCO59vL+jb2cA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-router@0.39.0':
+ resolution: {integrity: sha512-LaXnVmD69WPC4hNeLzKexCCS19hRLrUw3xicneAMkzJSzNJvPyk7G6I7lz7VjQh1cooObPBt9gNyd3hhTCUrag==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-socket.io@0.41.0':
+ resolution: {integrity: sha512-7fzDe9/FpO6NFizC/wnzXXX7bF9oRchsD//wFqy5g5hVEgXZCQ70IhxjrKdBvgjyIejR9T9zTvfQ6PfVKfkCAw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-tedious@0.13.0':
+ resolution: {integrity: sha512-Pob0+0R62AqXH50pjazTeGBy/1+SK4CYpFUBV5t7xpbpeuQezkkgVGvLca84QqjBqQizcXedjpUJLgHQDixPQg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation-undici@0.5.0':
+ resolution: {integrity: sha512-aNTeSrFAVcM9qco5DfZ9DNXu6hpMRe8Kt8nCDHfMWDB3pwgGVUE76jTdohc+H/7eLRqh4L7jqs5NSQoHw7S6ww==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.7.0
+
+ '@opentelemetry/instrumentation-winston@0.39.0':
+ resolution: {integrity: sha512-v/1xziLJ9CyB3YDjBSBzbB70Qd0JwWTo36EqWK5m3AR0CzsyMQQmf3ZIZM6sgx7hXMcRQ0pnEYhg6nhrUQPm9A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/instrumentation@0.52.1':
+ resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/otlp-exporter-base@0.52.1':
+ resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/otlp-grpc-exporter-base@0.52.1':
+ resolution: {integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/otlp-transformer@0.52.1':
+ resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/propagation-utils@0.30.16':
+ resolution: {integrity: sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/propagator-aws-xray@1.26.2':
+ resolution: {integrity: sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/propagator-b3@1.25.1':
+ resolution: {integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/propagator-jaeger@1.25.1':
+ resolution: {integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/redis-common@0.36.2':
+ resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/resource-detector-alibaba-cloud@0.29.7':
+ resolution: {integrity: sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-aws@1.12.0':
+ resolution: {integrity: sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-azure@0.2.12':
+ resolution: {integrity: sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-container@0.4.4':
+ resolution: {integrity: sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resource-detector-gcp@0.29.13':
+ resolution: {integrity: sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.0.0
+
+ '@opentelemetry/resources@1.25.1':
+ resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/resources@1.30.1':
+ resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/sdk-logs@0.52.1':
+ resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.4.0 <1.10.0'
+
+ '@opentelemetry/sdk-metrics@1.25.1':
+ resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/sdk-metrics@1.30.1':
+ resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/sdk-node@0.52.1':
+ resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace-base@1.25.1':
+ resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace-base@1.30.1':
+ resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace-node@1.25.1':
+ resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/semantic-conventions@1.25.1':
+ resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/semantic-conventions@1.28.0':
+ resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/semantic-conventions@1.38.0':
+ resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/sql-common@0.40.1':
+ resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+
+ '@protobufjs/aspromise@1.1.2':
+ resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+
+ '@protobufjs/base64@1.1.2':
+ resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+
+ '@protobufjs/codegen@2.0.4':
+ resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+
+ '@protobufjs/eventemitter@1.1.0':
+ resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+
+ '@protobufjs/fetch@1.1.0':
+ resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+
+ '@protobufjs/float@1.0.2':
+ resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+
+ '@protobufjs/inquire@1.1.0':
+ resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+
+ '@protobufjs/path@1.1.2':
+ resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+
+ '@protobufjs/pool@1.1.0':
+ resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+
+ '@protobufjs/utf8@1.1.0':
+ resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+
+ '@so-ric/colorspace@1.1.6':
+ resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
+
+ '@tootallnate/once@2.0.0':
+ resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+ engines: {node: '>= 10'}
+
+ '@types/aws-lambda@8.10.122':
+ resolution: {integrity: sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==}
+
+ '@types/body-parser@1.19.6':
+ resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
+
+ '@types/bunyan@1.8.9':
+ resolution: {integrity: sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==}
+
+ '@types/caseless@0.12.5':
+ resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==}
+
+ '@types/connect@3.4.36':
+ resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/express-serve-static-core@4.19.7':
+ resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==}
+
+ '@types/express@4.17.25':
+ resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==}
+
+ '@types/http-errors@2.0.5':
+ resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
+
+ '@types/js-yaml@4.0.9':
+ resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/jsonwebtoken@9.0.10':
+ resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==}
+
+ '@types/long@4.0.2':
+ resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
+
+ '@types/memcached@2.2.10':
+ resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==}
+
+ '@types/mime@1.3.5':
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/mysql@2.15.22':
+ resolution: {integrity: sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==}
+
+ '@types/node-fetch@2.6.13':
+ resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==}
+
+ '@types/node@18.19.130':
+ resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==}
+
+ '@types/node@20.19.25':
+ resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==}
+
+ '@types/node@22.19.1':
+ resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==}
+
+ '@types/pg-pool@2.0.4':
+ resolution: {integrity: sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==}
+
+ '@types/pg@8.6.1':
+ resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==}
+
+ '@types/qs@6.14.0':
+ resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/request@2.48.13':
+ resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==}
+
+ '@types/send@0.17.6':
+ resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
+
+ '@types/send@1.2.1':
+ resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
+
+ '@types/serve-static@1.15.10':
+ resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==}
+
+ '@types/shimmer@1.2.0':
+ resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==}
+
+ '@types/tedious@4.0.14':
+ resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==}
+
+ '@types/tough-cookie@4.0.5':
+ resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+
+ '@types/triple-beam@1.3.5':
+ resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
+
+ '@types/yargs-parser@21.0.3':
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+ '@types/yargs@17.0.35':
+ resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
+
+ abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+
+ accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+
+ acorn-import-attributes@1.9.5:
+ resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
+ peerDependencies:
+ acorn: ^8
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
+ agentkeepalive@4.6.0:
+ resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==}
+ engines: {node: '>= 8.0.0'}
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ ansi-color@0.2.1:
+ resolution: {integrity: sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+ arrify@2.0.1:
+ resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
+ engines: {node: '>=8'}
+
+ async-mutex@0.5.0:
+ resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==}
+
+ async-retry@1.3.3:
+ resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ bignumber.js@9.3.1:
+ resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
+
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ buffer-equal-constant-time@1.0.1:
+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+
+ bufrw@1.4.0:
+ resolution: {integrity: sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==}
+ engines: {node: '>= 0.10.x'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ cjs-module-lexer@1.4.3:
+ resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ cliui@9.0.1:
+ resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
+ engines: {node: '>=20'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-convert@3.1.3:
+ resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==}
+ engines: {node: '>=14.6'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-name@2.1.0:
+ resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==}
+ engines: {node: '>=12.20'}
+
+ color-string@2.1.4:
+ resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==}
+ engines: {node: '>=18'}
+
+ color@5.0.3:
+ resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==}
+ engines: {node: '>=18'}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ data-uri-to-buffer@4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ dot-prop@6.0.1:
+ resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+ engines: {node: '>=10'}
+
+ dotenv-cli@10.0.0:
+ resolution: {integrity: sha512-lnOnttzfrzkRx2echxJHQRB6vOAMSCzzZg79IxpC00tU42wZPuZkQxNNrrwVAxaQZIIh001l4PxVlCrBxngBzA==}
+ hasBin: true
+
+ dotenv-expand@11.0.7:
+ resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==}
+ engines: {node: '>=12'}
+
+ dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+
+ dotenv@17.2.3:
+ resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
+ engines: {node: '>=12'}
+
+ dotprompt@1.1.2:
+ resolution: {integrity: sha512-24EU+eORQbPywBicIP44BiqykzEXFwZq1ZQKO5TEr9KrrENyDA7I1NzqhtmmEdQVfAXka0DEbSLPN5nerCqJ8A==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexify@4.1.3:
+ resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
+
+ ecdsa-sig-formatter@1.0.11:
+ resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ emoji-regex@10.6.0:
+ resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ enabled@2.0.0:
+ resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
+ error@7.0.2:
+ resolution: {integrity: sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ eventid@2.0.1:
+ resolution: {integrity: sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==}
+ engines: {node: '>=10'}
+
+ express@4.21.2:
+ resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+ engines: {node: '>= 0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ farmhash-modern@1.1.0:
+ resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==}
+ engines: {node: '>=18.0.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+ fast-xml-parser@4.5.3:
+ resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
+ hasBin: true
+
+ faye-websocket@0.11.4:
+ resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+ engines: {node: '>=0.8.0'}
+
+ fecha@4.2.3:
+ resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
+
+ fetch-blob@3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+
+ firebase-admin@13.6.0:
+ resolution: {integrity: sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==}
+ engines: {node: '>=18'}
+
+ fn.name@1.1.0:
+ resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
+
+ form-data-encoder@1.7.2:
+ resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==}
+
+ form-data@2.5.5:
+ resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==}
+ engines: {node: '>= 0.12'}
+
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
+ formdata-node@4.4.1:
+ resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==}
+ engines: {node: '>= 12.20'}
+
+ formdata-polyfill@4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ front-matter@4.0.2:
+ resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ functional-red-black-tree@1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+
+ gaxios@6.7.1:
+ resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==}
+ engines: {node: '>=14'}
+
+ gcp-metadata@6.1.1:
+ resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==}
+ engines: {node: '>=14'}
+
+ genkit@1.24.0:
+ resolution: {integrity: sha512-9BjPrLULfWdzauibKkbZcCf2LVu0mW2EW6EXHK/cTber6QdiP/guA5mXahaaDWBo+qdIKpInXAYDEzcRUmCVSA==}
+
+ genkitx-anthropic@0.25.0:
+ resolution: {integrity: sha512-TiI5fA5iXpD2RYqV0+RsS3Y927niL7gSjcNVflNScK74i0mTDMhaHUXaPGEnLTGK5OtS5lWfXnj/Mkqo6n6J3g==}
+ peerDependencies:
+ genkit: ^1.15.0
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.4.0:
+ resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-port@5.1.1:
+ resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
+ engines: {node: '>=8'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.13.0:
+ resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
+
+ google-auth-library@9.15.1:
+ resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==}
+ engines: {node: '>=14'}
+
+ google-gax@4.6.1:
+ resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==}
+ engines: {node: '>=14'}
+
+ google-logging-utils@0.0.2:
+ resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==}
+ engines: {node: '>=14'}
+
+ googleapis-common@7.2.0:
+ resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==}
+ engines: {node: '>=14.0.0'}
+
+ googleapis@137.1.0:
+ resolution: {integrity: sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==}
+ engines: {node: '>=14.0.0'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ gtoken@7.1.0:
+ resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==}
+ engines: {node: '>=14.0.0'}
+
+ handlebars@4.7.8:
+ resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
+ engines: {node: '>=0.4.7'}
+ hasBin: true
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hexer@1.5.0:
+ resolution: {integrity: sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==}
+ engines: {node: '>= 0.10.x'}
+ hasBin: true
+
+ html-entities@2.6.0:
+ resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
+
+ http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+
+ http-parser-js@0.5.10:
+ resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
+
+ http-proxy-agent@5.0.0:
+ resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+ engines: {node: '>= 6'}
+
+ https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
+ humanize-ms@1.2.1:
+ resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ import-in-the-middle@1.15.0:
+ resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jaeger-client@3.19.0:
+ resolution: {integrity: sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==}
+ engines: {node: '>=10'}
+
+ jose@4.15.9:
+ resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+
+ js-yaml@3.14.2:
+ resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
+ hasBin: true
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ json-bigint@1.0.0:
+ resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-schema@0.4.0:
+ resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonwebtoken@9.0.2:
+ resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
+ engines: {node: '>=12', npm: '>=6'}
+
+ jwa@1.4.2:
+ resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
+
+ jwa@2.0.1:
+ resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
+
+ jwks-rsa@3.2.0:
+ resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==}
+ engines: {node: '>=14'}
+
+ jws@3.2.2:
+ resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+
+ jws@4.0.0:
+ resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
+
+ kuler@2.0.0:
+ resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
+
+ limiter@1.1.5:
+ resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==}
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+ lodash.includes@4.3.0:
+ resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
+
+ lodash.isboolean@3.0.3:
+ resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
+
+ lodash.isinteger@4.0.4:
+ resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
+
+ lodash.isnumber@3.0.3:
+ resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.isstring@4.0.1:
+ resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
+
+ lodash.mapvalues@4.6.0:
+ resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.once@4.1.1:
+ resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
+
+ logform@2.7.0:
+ resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
+ engines: {node: '>= 12.0.0'}
+
+ long@2.4.0:
+ resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==}
+ engines: {node: '>=0.6'}
+
+ long@5.3.2:
+ resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lru-memoizer@2.3.0:
+ resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+ methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mime@3.0.0:
+ resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ module-details-from-path@1.0.4:
+ resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ deprecated: Use your platform's native DOMException instead
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-fetch@3.3.2:
+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ node-forge@1.3.1:
+ resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
+ engines: {node: '>= 6.13.0'}
+
+ node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ one-time@1.0.0:
+ resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
+
+ openai@4.104.0:
+ resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==}
+ hasBin: true
+ peerDependencies:
+ ws: ^8.18.0
+ zod: ^3.23.8
+ peerDependenciesMeta:
+ ws:
+ optional: true
+ zod:
+ optional: true
+
+ opentracing@0.14.7:
+ resolution: {integrity: sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==}
+ engines: {node: '>=0.10'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ partial-json@0.1.7:
+ resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-protocol@1.10.3:
+ resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-bytea@1.0.0:
+ resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
+ prettier@3.6.2:
+ resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ process@0.10.1:
+ resolution: {integrity: sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==}
+ engines: {node: '>= 0.6.0'}
+
+ proto3-json-serializer@2.0.2:
+ resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
+ engines: {node: '>=14.0.0'}
+
+ protobufjs@7.5.4:
+ resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
+ engines: {node: '>=12.0.0'}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ pump@3.0.3:
+ resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
+
+ pumpify@2.0.1:
+ resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==}
+
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+
+ qs@6.14.0:
+ resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+ engines: {node: '>=0.6'}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ require-in-the-middle@7.5.2:
+ resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==}
+ engines: {node: '>=8.6.0'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ retry-request@7.0.2:
+ resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==}
+ engines: {node: '>=14'}
+
+ retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shimmer@1.2.1:
+ resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ stack-trace@0.0.10:
+ resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
+
+ statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+
+ stream-events@1.0.5:
+ resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==}
+
+ stream-shift@1.0.3:
+ resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+
+ string-template@0.2.1:
+ resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.2:
+ resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
+ engines: {node: '>=12'}
+
+ strnum@1.1.2:
+ resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
+
+ stubs@3.0.0:
+ resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ teeny-request@9.0.0:
+ resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==}
+ engines: {node: '>=14'}
+
+ text-hex@1.0.0:
+ resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
+
+ thriftrw@3.11.4:
+ resolution: {integrity: sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==}
+ engines: {node: '>= 0.10.x'}
+ hasBin: true
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ triple-beam@1.4.1:
+ resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
+ engines: {node: '>= 14.0.0'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.20.6:
+ resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ uglify-js@3.19.3:
+ resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ uri-templates@0.2.0:
+ resolution: {integrity: sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==}
+
+ url-template@2.0.8:
+ resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@10.0.0:
+ resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
+ hasBin: true
+
+ uuid@11.1.0:
+ resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
+ hasBin: true
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
+ web-streams-polyfill@4.0.0-beta.3:
+ resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==}
+ engines: {node: '>= 14'}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ websocket-driver@0.7.4:
+ resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
+ engines: {node: '>=0.8.0'}
+
+ websocket-extensions@0.1.4:
+ resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
+ engines: {node: '>=0.8.0'}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ winston-transport@4.9.0:
+ resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
+ engines: {node: '>= 12.0.0'}
+
+ winston@3.18.3:
+ resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==}
+ engines: {node: '>= 12.0.0'}
+
+ wordwrap@1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ xorshift@1.2.0:
+ resolution: {integrity: sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@2.8.1:
+ resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs-parser@22.0.0:
+ resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yargs@18.0.0:
+ resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zod-to-json-schema@3.25.0:
+ resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==}
+ peerDependencies:
+ zod: ^3.25 || ^4
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
+snapshots:
+
+ '@anthropic-ai/sdk@0.39.0':
+ dependencies:
+ '@types/node': 18.19.130
+ '@types/node-fetch': 2.6.13
+ abort-controller: 3.0.0
+ agentkeepalive: 4.6.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ '@colors/colors@1.6.0': {}
+
+ '@dabh/diagnostics@2.0.8':
+ dependencies:
+ '@so-ric/colorspace': 1.1.6
+ enabled: 2.0.0
+ kuler: 2.0.0
+
+ '@esbuild/aix-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm@0.25.12':
+ optional: true
+
+ '@esbuild/android-x64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
+ optional: true
+
+ '@fastify/busboy@3.2.0': {}
+
+ '@firebase/app-check-interop-types@0.3.3': {}
+
+ '@firebase/app-types@0.9.3': {}
+
+ '@firebase/auth-interop-types@0.2.4': {}
+
+ '@firebase/component@0.7.0':
+ dependencies:
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/database-compat@2.1.0':
+ dependencies:
+ '@firebase/component': 0.7.0
+ '@firebase/database': 1.1.0
+ '@firebase/database-types': 1.0.16
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ tslib: 2.8.1
+
+ '@firebase/database-types@1.0.16':
+ dependencies:
+ '@firebase/app-types': 0.9.3
+ '@firebase/util': 1.13.0
+
+ '@firebase/database@1.1.0':
+ dependencies:
+ '@firebase/app-check-interop-types': 0.3.3
+ '@firebase/auth-interop-types': 0.2.4
+ '@firebase/component': 0.7.0
+ '@firebase/logger': 0.5.0
+ '@firebase/util': 1.13.0
+ faye-websocket: 0.11.4
+ tslib: 2.8.1
+
+ '@firebase/logger@0.5.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@firebase/util@1.13.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@genkit-ai/ai@0.9.12':
+ dependencies:
+ '@genkit-ai/core': 0.9.12
+ '@opentelemetry/api': 1.9.0
+ '@types/node': 20.19.25
+ colorette: 2.0.20
+ json5: 2.2.3
+ node-fetch: 3.3.2
+ partial-json: 0.1.7
+ uuid: 10.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@genkit-ai/ai@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@genkit-ai/core': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@opentelemetry/api': 1.9.0
+ '@types/node': 20.19.25
+ colorette: 2.0.20
+ dotprompt: 1.1.2
+ json5: 2.2.3
+ node-fetch: 3.3.2
+ partial-json: 0.1.7
+ uri-templates: 0.2.0
+ uuid: 10.0.0
+ transitivePeerDependencies:
+ - '@google-cloud/firestore'
+ - encoding
+ - firebase
+ - firebase-admin
+ - genkit
+ - supports-color
+
+ '@genkit-ai/compat-oai@1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))(zod@3.25.76)':
+ dependencies:
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ openai: 4.104.0(zod@3.25.76)
+ transitivePeerDependencies:
+ - encoding
+ - ws
+ - zod
+
+ '@genkit-ai/core@0.9.12':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ async-mutex: 0.5.0
+ body-parser: 1.20.3
+ cors: 2.8.5
+ express: 4.21.2
+ get-port: 5.1.1
+ json-schema: 0.4.0
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.0(zod@3.25.76)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@genkit-ai/core@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-jaeger': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ '@types/json-schema': 7.0.15
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ async-mutex: 0.5.0
+ body-parser: 1.20.3
+ cors: 2.8.5
+ dotprompt: 1.1.2
+ express: 4.21.2
+ get-port: 5.1.1
+ json-schema: 0.4.0
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.0(zod@3.25.76)
+ optionalDependencies:
+ '@genkit-ai/firebase': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ transitivePeerDependencies:
+ - '@google-cloud/firestore'
+ - encoding
+ - firebase
+ - firebase-admin
+ - genkit
+ - supports-color
+
+ '@genkit-ai/dotprompt@0.9.12':
+ dependencies:
+ '@genkit-ai/ai': 0.9.12
+ '@genkit-ai/core': 0.9.12
+ front-matter: 4.0.2
+ handlebars: 4.7.8
+ node-fetch: 3.3.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@genkit-ai/firebase@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@genkit-ai/google-cloud': 1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@google-cloud/firestore': 7.11.6
+ firebase-admin: 13.6.0
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@genkit-ai/google-cloud@1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ '@google-cloud/logging-winston': 6.0.1(winston@3.18.3)
+ '@google-cloud/opentelemetry-cloud-monitoring-exporter': 0.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0))
+ '@google-cloud/opentelemetry-cloud-trace-exporter': 2.4.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))
+ '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/auto-instrumentations-node': 0.49.2(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-pino': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-winston': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ google-auth-library: 9.15.1
+ node-fetch: 3.3.2
+ winston: 3.18.3
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@genkit-ai/google-genai@1.24.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))':
+ dependencies:
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ google-auth-library: 9.15.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/common@5.0.2':
+ dependencies:
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 4.0.0
+ arrify: 2.0.1
+ duplexify: 4.1.3
+ extend: 3.0.2
+ google-auth-library: 9.15.1
+ html-entities: 2.6.0
+ retry-request: 7.0.2
+ teeny-request: 9.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/firestore@7.11.6':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ fast-deep-equal: 3.1.3
+ functional-red-black-tree: 1.0.1
+ google-gax: 4.6.1
+ protobufjs: 7.5.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/logging-winston@6.0.1(winston@3.18.3)':
+ dependencies:
+ '@google-cloud/logging': 11.2.1
+ google-auth-library: 9.15.1
+ lodash.mapvalues: 4.6.0
+ winston: 3.18.3
+ winston-transport: 4.9.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/logging@11.2.1':
+ dependencies:
+ '@google-cloud/common': 5.0.2
+ '@google-cloud/paginator': 5.0.2
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 4.0.0
+ '@opentelemetry/api': 1.9.0
+ arrify: 2.0.1
+ dot-prop: 6.0.1
+ eventid: 2.0.1
+ extend: 3.0.2
+ gcp-metadata: 6.1.1
+ google-auth-library: 9.15.1
+ google-gax: 4.6.1
+ on-finished: 2.4.1
+ pumpify: 2.0.1
+ stream-events: 1.0.5
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/opentelemetry-cloud-monitoring-exporter@0.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0))':
+ dependencies:
+ '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))
+ '@google-cloud/precise-date': 4.0.0
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ google-auth-library: 9.15.1
+ googleapis: 137.1.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/opentelemetry-cloud-trace-exporter@2.4.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))':
+ dependencies:
+ '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))
+ '@grpc/grpc-js': 1.14.1
+ '@grpc/proto-loader': 0.7.15
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ google-auth-library: 9.15.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/opentelemetry-resource-util@2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))':
+ dependencies:
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ gcp-metadata: 6.1.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@google-cloud/paginator@5.0.2':
+ dependencies:
+ arrify: 2.0.1
+ extend: 3.0.2
+
+ '@google-cloud/precise-date@4.0.0': {}
+
+ '@google-cloud/projectify@4.0.0': {}
+
+ '@google-cloud/promisify@4.0.0': {}
+
+ '@google-cloud/storage@7.17.3':
+ dependencies:
+ '@google-cloud/paginator': 5.0.2
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 4.0.0
+ abort-controller: 3.0.0
+ async-retry: 1.3.3
+ duplexify: 4.1.3
+ fast-xml-parser: 4.5.3
+ gaxios: 6.7.1
+ google-auth-library: 9.15.1
+ html-entities: 2.6.0
+ mime: 3.0.0
+ p-limit: 3.1.0
+ retry-request: 7.0.2
+ teeny-request: 9.0.0
+ uuid: 8.3.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ optional: true
+
+ '@grpc/grpc-js@1.14.1':
+ dependencies:
+ '@grpc/proto-loader': 0.8.0
+ '@js-sdsl/ordered-map': 4.4.2
+
+ '@grpc/proto-loader@0.7.15':
+ dependencies:
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
+
+ '@grpc/proto-loader@0.8.0':
+ dependencies:
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
+
+ '@js-sdsl/ordered-map@4.4.2': {}
+
+ '@opentelemetry/api-logs@0.52.1':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+
+ '@opentelemetry/api@1.9.0': {}
+
+ '@opentelemetry/auto-instrumentations-node@0.49.2(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-amqplib': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-aws-lambda': 0.43.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-aws-sdk': 0.43.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-bunyan': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-cassandra-driver': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-connect': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-cucumber': 0.8.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-dataloader': 0.11.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-dns': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-express': 0.41.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-fastify': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-fs': 0.14.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-generic-pool': 0.38.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-graphql': 0.42.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-grpc': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-hapi': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-http': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-ioredis': 0.42.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-kafkajs': 0.2.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-knex': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-koa': 0.42.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-lru-memoizer': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-memcached': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mongodb': 0.46.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mongoose': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mysql': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-mysql2': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-nestjs-core': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-net': 0.38.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-pg': 0.43.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-pino': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-redis': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-redis-4': 0.41.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-restify': 0.40.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-router': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-socket.io': 0.41.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-tedious': 0.13.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-undici': 0.5.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation-winston': 0.39.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-alibaba-cloud': 0.29.7(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-aws': 1.12.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-azure': 0.2.12(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-container': 0.4.4(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resource-detector-gcp': 0.29.13(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+
+ '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+
+ '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/exporter-jaeger@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.28.0
+ jaeger-client: 3.19.0
+
+ '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/instrumentation-amqplib@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-aws-lambda@0.43.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagator-aws-xray': 1.26.2(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/aws-lambda': 8.10.122
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-aws-sdk@0.43.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagation-utils': 0.30.16(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-bunyan@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@types/bunyan': 1.8.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-cassandra-driver@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-connect@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/connect': 3.4.36
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-cucumber@0.8.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-dataloader@0.11.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-dns@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-express@0.41.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-fastify@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-fs@0.14.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-generic-pool@0.38.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-graphql@0.42.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-grpc@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-hapi@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-http@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-ioredis@0.42.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/redis-common': 0.36.2
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-kafkajs@0.2.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-knex@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-koa@0.42.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-lru-memoizer@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-memcached@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/memcached': 2.2.10
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-mongodb@0.46.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-mongoose@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-mysql2@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-mysql@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/mysql': 2.15.22
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-nestjs-core@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-net@0.38.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-pg@0.43.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0)
+ '@types/pg': 8.6.1
+ '@types/pg-pool': 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-pino@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-redis-4@0.41.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/redis-common': 0.36.2
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-redis@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/redis-common': 0.36.2
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-restify@0.40.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-router@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-socket.io@0.41.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-tedious@0.13.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ '@types/tedious': 4.0.14
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-undici@0.5.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation-winston@0.39.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@types/shimmer': 1.2.0
+ import-in-the-middle: 1.15.0
+ require-in-the-middle: 7.5.2
+ semver: 7.7.3
+ shimmer: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ protobufjs: 7.5.4
+
+ '@opentelemetry/propagation-utils@0.30.16(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+
+ '@opentelemetry/propagator-aws-xray@1.26.2(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+
+ '@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/redis-common@0.36.2': {}
+
+ '@opentelemetry/resource-detector-alibaba-cloud@0.29.7(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+
+ '@opentelemetry/resource-detector-aws@1.12.0(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+
+ '@opentelemetry/resource-detector-azure@0.2.12(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+
+ '@opentelemetry/resource-detector-container@0.4.4(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+
+ '@opentelemetry/resource-detector-gcp@0.29.13(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.38.0
+ gcp-metadata: 6.1.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ lodash.merge: 4.6.2
+
+ '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
+
+ '@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/api-logs': 0.52.1
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.25.1
+
+ '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
+ semver: 7.7.3
+
+ '@opentelemetry/semantic-conventions@1.25.1': {}
+
+ '@opentelemetry/semantic-conventions@1.28.0': {}
+
+ '@opentelemetry/semantic-conventions@1.38.0': {}
+
+ '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
+
+ '@protobufjs/aspromise@1.1.2': {}
+
+ '@protobufjs/base64@1.1.2': {}
+
+ '@protobufjs/codegen@2.0.4': {}
+
+ '@protobufjs/eventemitter@1.1.0': {}
+
+ '@protobufjs/fetch@1.1.0':
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/inquire': 1.1.0
+
+ '@protobufjs/float@1.0.2': {}
+
+ '@protobufjs/inquire@1.1.0': {}
+
+ '@protobufjs/path@1.1.2': {}
+
+ '@protobufjs/pool@1.1.0': {}
+
+ '@protobufjs/utf8@1.1.0': {}
+
+ '@so-ric/colorspace@1.1.6':
+ dependencies:
+ color: 5.0.3
+ text-hex: 1.0.0
+
+ '@tootallnate/once@2.0.0': {}
+
+ '@types/aws-lambda@8.10.122': {}
+
+ '@types/body-parser@1.19.6':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 20.19.25
+
+ '@types/bunyan@1.8.9':
+ dependencies:
+ '@types/node': 20.19.25
+
+ '@types/caseless@0.12.5': {}
+
+ '@types/connect@3.4.36':
+ dependencies:
+ '@types/node': 20.19.25
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 20.19.25
+
+ '@types/express-serve-static-core@4.19.7':
+ dependencies:
+ '@types/node': 20.19.25
+ '@types/qs': 6.14.0
+ '@types/range-parser': 1.2.7
+ '@types/send': 1.2.1
+
+ '@types/express@4.17.25':
+ dependencies:
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 4.19.7
+ '@types/qs': 6.14.0
+ '@types/serve-static': 1.15.10
+
+ '@types/http-errors@2.0.5': {}
+
+ '@types/js-yaml@4.0.9': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/jsonwebtoken@9.0.10':
+ dependencies:
+ '@types/ms': 2.1.0
+ '@types/node': 20.19.25
+
+ '@types/long@4.0.2': {}
+
+ '@types/memcached@2.2.10':
+ dependencies:
+ '@types/node': 20.19.25
+
+ '@types/mime@1.3.5': {}
+
+ '@types/ms@2.1.0': {}
+
+ '@types/mysql@2.15.22':
+ dependencies:
+ '@types/node': 20.19.25
+
+ '@types/node-fetch@2.6.13':
+ dependencies:
+ '@types/node': 20.19.25
+ form-data: 4.0.5
+
+ '@types/node@18.19.130':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/node@20.19.25':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/node@22.19.1':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/pg-pool@2.0.4':
+ dependencies:
+ '@types/pg': 8.6.1
+
+ '@types/pg@8.6.1':
+ dependencies:
+ '@types/node': 20.19.25
+ pg-protocol: 1.10.3
+ pg-types: 2.2.0
+
+ '@types/qs@6.14.0': {}
+
+ '@types/range-parser@1.2.7': {}
+
+ '@types/request@2.48.13':
+ dependencies:
+ '@types/caseless': 0.12.5
+ '@types/node': 20.19.25
+ '@types/tough-cookie': 4.0.5
+ form-data: 2.5.5
+
+ '@types/send@0.17.6':
+ dependencies:
+ '@types/mime': 1.3.5
+ '@types/node': 20.19.25
+
+ '@types/send@1.2.1':
+ dependencies:
+ '@types/node': 20.19.25
+
+ '@types/serve-static@1.15.10':
+ dependencies:
+ '@types/http-errors': 2.0.5
+ '@types/node': 20.19.25
+ '@types/send': 0.17.6
+
+ '@types/shimmer@1.2.0': {}
+
+ '@types/tedious@4.0.14':
+ dependencies:
+ '@types/node': 20.19.25
+
+ '@types/tough-cookie@4.0.5': {}
+
+ '@types/triple-beam@1.3.5': {}
+
+ '@types/yargs-parser@21.0.3': {}
+
+ '@types/yargs@17.0.35':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ abort-controller@3.0.0:
+ dependencies:
+ event-target-shim: 5.0.1
+
+ accepts@1.3.8:
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+
+ acorn-import-attributes@1.9.5(acorn@8.15.0):
+ dependencies:
+ acorn: 8.15.0
+
+ acorn@8.15.0: {}
+
+ agent-base@6.0.2:
+ dependencies:
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ agent-base@7.1.4: {}
+
+ agentkeepalive@4.6.0:
+ dependencies:
+ humanize-ms: 1.2.1
+
+ ajv-formats@3.0.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ansi-color@0.2.1: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.2.2: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.3: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ array-flatten@1.1.1: {}
+
+ arrify@2.0.1: {}
+
+ async-mutex@0.5.0:
+ dependencies:
+ tslib: 2.8.1
+
+ async-retry@1.3.3:
+ dependencies:
+ retry: 0.13.1
+ optional: true
+
+ async@3.2.6: {}
+
+ asynckit@0.4.0: {}
+
+ base64-js@1.5.1: {}
+
+ bignumber.js@9.3.1: {}
+
+ body-parser@1.20.3:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.13.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ buffer-equal-constant-time@1.0.1: {}
+
+ bufrw@1.4.0:
+ dependencies:
+ ansi-color: 0.2.1
+ error: 7.0.2
+ hexer: 1.5.0
+ xtend: 4.0.2
+
+ bytes@3.1.2: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ cjs-module-lexer@1.4.3: {}
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ cliui@9.0.1:
+ dependencies:
+ string-width: 7.2.0
+ strip-ansi: 7.1.2
+ wrap-ansi: 9.0.2
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-convert@3.1.3:
+ dependencies:
+ color-name: 2.1.0
+
+ color-name@1.1.4: {}
+
+ color-name@2.1.0: {}
+
+ color-string@2.1.4:
+ dependencies:
+ color-name: 2.1.0
+
+ color@5.0.3:
+ dependencies:
+ color-convert: 3.1.3
+ color-string: 2.1.4
+
+ colorette@2.0.20: {}
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ content-disposition@0.5.4:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ content-type@1.0.5: {}
+
+ cookie-signature@1.0.6: {}
+
+ cookie@0.7.1: {}
+
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ data-uri-to-buffer@4.0.1: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ delayed-stream@1.0.0: {}
+
+ depd@2.0.0: {}
+
+ destroy@1.2.0: {}
+
+ dot-prop@6.0.1:
+ dependencies:
+ is-obj: 2.0.0
+
+ dotenv-cli@10.0.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ dotenv: 17.2.3
+ dotenv-expand: 11.0.7
+ minimist: 1.2.8
+
+ dotenv-expand@11.0.7:
+ dependencies:
+ dotenv: 16.6.1
+
+ dotenv@16.6.1: {}
+
+ dotenv@17.2.3: {}
+
+ dotprompt@1.1.2:
+ dependencies:
+ handlebars: 4.7.8
+ yaml: 2.8.1
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexify@4.1.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ stream-shift: 1.0.3
+
+ ecdsa-sig-formatter@1.0.11:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ ee-first@1.1.1: {}
+
+ emoji-regex@10.6.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ enabled@2.0.0: {}
+
+ encodeurl@1.0.2: {}
+
+ encodeurl@2.0.0: {}
+
+ end-of-stream@1.4.5:
+ dependencies:
+ once: 1.4.0
+
+ error@7.0.2:
+ dependencies:
+ string-template: 0.2.1
+ xtend: 4.0.2
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ esbuild@0.25.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ esprima@4.0.1: {}
+
+ etag@1.8.1: {}
+
+ event-target-shim@5.0.1: {}
+
+ eventid@2.0.1:
+ dependencies:
+ uuid: 8.3.2
+
+ express@4.21.2:
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.3
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.12
+ proxy-addr: 2.0.7
+ qs: 6.13.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.0
+ serve-static: 1.16.2
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ extend@3.0.2: {}
+
+ farmhash-modern@1.1.0: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-uri@3.1.0: {}
+
+ fast-xml-parser@4.5.3:
+ dependencies:
+ strnum: 1.1.2
+ optional: true
+
+ faye-websocket@0.11.4:
+ dependencies:
+ websocket-driver: 0.7.4
+
+ fecha@4.2.3: {}
+
+ fetch-blob@3.2.0:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
+
+ finalhandler@1.3.1:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ firebase-admin@13.6.0:
+ dependencies:
+ '@fastify/busboy': 3.2.0
+ '@firebase/database-compat': 2.1.0
+ '@firebase/database-types': 1.0.16
+ '@types/node': 22.19.1
+ farmhash-modern: 1.1.0
+ fast-deep-equal: 3.1.3
+ google-auth-library: 9.15.1
+ jsonwebtoken: 9.0.2
+ jwks-rsa: 3.2.0
+ node-forge: 1.3.1
+ uuid: 11.1.0
+ optionalDependencies:
+ '@google-cloud/firestore': 7.11.6
+ '@google-cloud/storage': 7.17.3
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ fn.name@1.1.0: {}
+
+ form-data-encoder@1.7.2: {}
+
+ form-data@2.5.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+ safe-buffer: 5.2.1
+
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
+ formdata-node@4.4.1:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 4.0.0-beta.3
+
+ formdata-polyfill@4.0.10:
+ dependencies:
+ fetch-blob: 3.2.0
+
+ forwarded@0.2.0: {}
+
+ fresh@0.5.2: {}
+
+ front-matter@4.0.2:
+ dependencies:
+ js-yaml: 3.14.2
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ functional-red-black-tree@1.0.1: {}
+
+ gaxios@6.7.1:
+ dependencies:
+ extend: 3.0.2
+ https-proxy-agent: 7.0.6
+ is-stream: 2.0.1
+ node-fetch: 2.7.0
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ gcp-metadata@6.1.1:
+ dependencies:
+ gaxios: 6.7.1
+ google-logging-utils: 0.0.2
+ json-bigint: 1.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0):
+ dependencies:
+ '@genkit-ai/ai': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ '@genkit-ai/core': 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0))
+ uuid: 10.0.0
+ transitivePeerDependencies:
+ - '@google-cloud/firestore'
+ - encoding
+ - firebase
+ - firebase-admin
+ - supports-color
+
+ genkitx-anthropic@0.25.0(genkit@1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)):
+ dependencies:
+ '@anthropic-ai/sdk': 0.39.0
+ genkit: 1.24.0(@google-cloud/firestore@7.11.6)(firebase-admin@13.6.0)
+ transitivePeerDependencies:
+ - encoding
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.4.0: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-port@5.1.1: {}
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-tsconfig@4.13.0:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ google-auth-library@9.15.1:
+ dependencies:
+ base64-js: 1.5.1
+ ecdsa-sig-formatter: 1.0.11
+ gaxios: 6.7.1
+ gcp-metadata: 6.1.1
+ gtoken: 7.1.0
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ google-gax@4.6.1:
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@grpc/proto-loader': 0.7.15
+ '@types/long': 4.0.2
+ abort-controller: 3.0.0
+ duplexify: 4.1.3
+ google-auth-library: 9.15.1
+ node-fetch: 2.7.0
+ object-hash: 3.0.0
+ proto3-json-serializer: 2.0.2
+ protobufjs: 7.5.4
+ retry-request: 7.0.2
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ google-logging-utils@0.0.2: {}
+
+ googleapis-common@7.2.0:
+ dependencies:
+ extend: 3.0.2
+ gaxios: 6.7.1
+ google-auth-library: 9.15.1
+ qs: 6.14.0
+ url-template: 2.0.8
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ googleapis@137.1.0:
+ dependencies:
+ google-auth-library: 9.15.1
+ googleapis-common: 7.2.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ gopd@1.2.0: {}
+
+ gtoken@7.1.0:
+ dependencies:
+ gaxios: 6.7.1
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ handlebars@4.7.8:
+ dependencies:
+ minimist: 1.2.8
+ neo-async: 2.6.2
+ source-map: 0.6.1
+ wordwrap: 1.0.0
+ optionalDependencies:
+ uglify-js: 3.19.3
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hexer@1.5.0:
+ dependencies:
+ ansi-color: 0.2.1
+ minimist: 1.2.8
+ process: 0.10.1
+ xtend: 4.0.2
+
+ html-entities@2.6.0: {}
+
+ http-errors@2.0.0:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+
+ http-parser-js@0.5.10: {}
+
+ http-proxy-agent@5.0.0:
+ dependencies:
+ '@tootallnate/once': 2.0.0
+ agent-base: 6.0.2
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@5.0.1:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ humanize-ms@1.2.1:
+ dependencies:
+ ms: 2.1.3
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ import-in-the-middle@1.15.0:
+ dependencies:
+ acorn: 8.15.0
+ acorn-import-attributes: 1.9.5(acorn@8.15.0)
+ cjs-module-lexer: 1.4.3
+ module-details-from-path: 1.0.4
+
+ inherits@2.0.4: {}
+
+ ipaddr.js@1.9.1: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-stream@2.0.1: {}
+
+ isexe@2.0.0: {}
+
+ jaeger-client@3.19.0:
+ dependencies:
+ node-int64: 0.4.0
+ opentracing: 0.14.7
+ thriftrw: 3.11.4
+ uuid: 8.3.2
+ xorshift: 1.2.0
+
+ jose@4.15.9: {}
+
+ js-yaml@3.14.2:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ json-bigint@1.0.0:
+ dependencies:
+ bignumber.js: 9.3.1
+
+ json-schema-traverse@1.0.0: {}
+
+ json-schema@0.4.0: {}
+
+ json5@2.2.3: {}
+
+ jsonwebtoken@9.0.2:
+ dependencies:
+ jws: 3.2.2
+ lodash.includes: 4.3.0
+ lodash.isboolean: 3.0.3
+ lodash.isinteger: 4.0.4
+ lodash.isnumber: 3.0.3
+ lodash.isplainobject: 4.0.6
+ lodash.isstring: 4.0.1
+ lodash.once: 4.1.1
+ ms: 2.1.3
+ semver: 7.7.3
+
+ jwa@1.4.2:
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+
+ jwa@2.0.1:
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+
+ jwks-rsa@3.2.0:
+ dependencies:
+ '@types/express': 4.17.25
+ '@types/jsonwebtoken': 9.0.10
+ debug: 4.4.3
+ jose: 4.15.9
+ limiter: 1.1.5
+ lru-memoizer: 2.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ jws@3.2.2:
+ dependencies:
+ jwa: 1.4.2
+ safe-buffer: 5.2.1
+
+ jws@4.0.0:
+ dependencies:
+ jwa: 2.0.1
+ safe-buffer: 5.2.1
+
+ kuler@2.0.0: {}
+
+ limiter@1.1.5: {}
+
+ lodash.camelcase@4.3.0: {}
+
+ lodash.clonedeep@4.5.0: {}
+
+ lodash.includes@4.3.0: {}
+
+ lodash.isboolean@3.0.3: {}
+
+ lodash.isinteger@4.0.4: {}
+
+ lodash.isnumber@3.0.3: {}
+
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.isstring@4.0.1: {}
+
+ lodash.mapvalues@4.6.0: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.once@4.1.1: {}
+
+ logform@2.7.0:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@types/triple-beam': 1.3.5
+ fecha: 4.2.3
+ ms: 2.1.3
+ safe-stable-stringify: 2.5.0
+ triple-beam: 1.4.1
+
+ long@2.4.0: {}
+
+ long@5.3.2: {}
+
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+
+ lru-memoizer@2.3.0:
+ dependencies:
+ lodash.clonedeep: 4.5.0
+ lru-cache: 6.0.0
+
+ math-intrinsics@1.1.0: {}
+
+ media-typer@0.3.0: {}
+
+ merge-descriptors@1.0.3: {}
+
+ methods@1.1.2: {}
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0: {}
+
+ mime@3.0.0:
+ optional: true
+
+ minimist@1.2.8: {}
+
+ module-details-from-path@1.0.4: {}
+
+ ms@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ negotiator@0.6.3: {}
+
+ neo-async@2.6.2: {}
+
+ node-domexception@1.0.0: {}
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-fetch@3.3.2:
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+
+ node-forge@1.3.1: {}
+
+ node-int64@0.4.0: {}
+
+ object-assign@4.1.1: {}
+
+ object-hash@3.0.0: {}
+
+ object-inspect@1.13.4: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ one-time@1.0.0:
+ dependencies:
+ fn.name: 1.1.0
+
+ openai@4.104.0(zod@3.25.76):
+ dependencies:
+ '@types/node': 18.19.130
+ '@types/node-fetch': 2.6.13
+ abort-controller: 3.0.0
+ agentkeepalive: 4.6.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ optionalDependencies:
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - encoding
+
+ opentracing@0.14.7: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+ optional: true
+
+ parseurl@1.3.3: {}
+
+ partial-json@0.1.7: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-to-regexp@0.1.12: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-protocol@1.10.3: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.0
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ postgres-array@2.0.0: {}
+
+ postgres-bytea@1.0.0: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
+
+ prettier@3.6.2: {}
+
+ process@0.10.1: {}
+
+ proto3-json-serializer@2.0.2:
+ dependencies:
+ protobufjs: 7.5.4
+
+ protobufjs@7.5.4:
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/base64': 1.1.2
+ '@protobufjs/codegen': 2.0.4
+ '@protobufjs/eventemitter': 1.1.0
+ '@protobufjs/fetch': 1.1.0
+ '@protobufjs/float': 1.0.2
+ '@protobufjs/inquire': 1.1.0
+ '@protobufjs/path': 1.1.2
+ '@protobufjs/pool': 1.1.0
+ '@protobufjs/utf8': 1.1.0
+ '@types/node': 20.19.25
+ long: 5.3.2
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ pump@3.0.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ once: 1.4.0
+
+ pumpify@2.0.1:
+ dependencies:
+ duplexify: 4.1.3
+ inherits: 2.0.4
+ pump: 3.0.3
+
+ qs@6.13.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ qs@6.14.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ range-parser@1.2.1: {}
+
+ raw-body@2.5.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ require-in-the-middle@7.5.2:
+ dependencies:
+ debug: 4.4.3
+ module-details-from-path: 1.0.4
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.11:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ retry-request@7.0.2:
+ dependencies:
+ '@types/request': 2.48.13
+ extend: 3.0.2
+ teeny-request: 9.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ retry@0.13.1:
+ optional: true
+
+ safe-buffer@5.2.1: {}
+
+ safe-stable-stringify@2.5.0: {}
+
+ safer-buffer@2.1.2: {}
+
+ semver@7.7.3: {}
+
+ send@0.19.0:
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@1.16.2:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.0
+ transitivePeerDependencies:
+ - supports-color
+
+ setprototypeof@1.2.0: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shimmer@1.2.1: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ source-map@0.6.1: {}
+
+ sprintf-js@1.0.3: {}
+
+ stack-trace@0.0.10: {}
+
+ statuses@2.0.1: {}
+
+ stream-events@1.0.5:
+ dependencies:
+ stubs: 3.0.0
+
+ stream-shift@1.0.3: {}
+
+ string-template@0.2.1: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.4.0
+ strip-ansi: 7.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.2:
+ dependencies:
+ ansi-regex: 6.2.2
+
+ strnum@1.1.2:
+ optional: true
+
+ stubs@3.0.0: {}
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ teeny-request@9.0.0:
+ dependencies:
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ node-fetch: 2.7.0
+ stream-events: 1.0.5
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ text-hex@1.0.0: {}
+
+ thriftrw@3.11.4:
+ dependencies:
+ bufrw: 1.4.0
+ error: 7.0.2
+ long: 2.4.0
+
+ toidentifier@1.0.1: {}
+
+ tr46@0.0.3: {}
+
+ triple-beam@1.4.1: {}
+
+ tslib@2.8.1: {}
+
+ tsx@4.20.6:
+ dependencies:
+ esbuild: 0.25.12
+ get-tsconfig: 4.13.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ typescript@5.9.3: {}
+
+ uglify-js@3.19.3:
+ optional: true
+
+ undici-types@5.26.5: {}
+
+ undici-types@6.21.0: {}
+
+ unpipe@1.0.0: {}
+
+ uri-templates@0.2.0: {}
+
+ url-template@2.0.8: {}
+
+ util-deprecate@1.0.2: {}
+
+ utils-merge@1.0.1: {}
+
+ uuid@10.0.0: {}
+
+ uuid@11.1.0: {}
+
+ uuid@8.3.2: {}
+
+ uuid@9.0.1: {}
+
+ vary@1.1.2: {}
+
+ web-streams-polyfill@3.3.3: {}
+
+ web-streams-polyfill@4.0.0-beta.3: {}
+
+ webidl-conversions@3.0.1: {}
+
+ websocket-driver@0.7.4:
+ dependencies:
+ http-parser-js: 0.5.10
+ safe-buffer: 5.2.1
+ websocket-extensions: 0.1.4
+
+ websocket-extensions@0.1.4: {}
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ winston-transport@4.9.0:
+ dependencies:
+ logform: 2.7.0
+ readable-stream: 3.6.2
+ triple-beam: 1.4.1
+
+ winston@3.18.3:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@dabh/diagnostics': 2.0.8
+ async: 3.2.6
+ is-stream: 2.0.1
+ logform: 2.7.0
+ one-time: 1.0.0
+ readable-stream: 3.6.2
+ safe-stable-stringify: 2.5.0
+ stack-trace: 0.0.10
+ triple-beam: 1.4.1
+ winston-transport: 4.9.0
+
+ wordwrap@1.0.0: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@9.0.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.1.2
+
+ wrappy@1.0.2: {}
+
+ xorshift@1.2.0: {}
+
+ xtend@4.0.2: {}
+
+ y18n@5.0.8: {}
+
+ yallist@4.0.0: {}
+
+ yaml@2.8.1: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs-parser@22.0.0: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yargs@18.0.0:
+ dependencies:
+ cliui: 9.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ string-width: 7.2.0
+ y18n: 5.0.8
+ yargs-parser: 22.0.0
+
+ yocto-queue@0.1.0:
+ optional: true
+
+ zod-to-json-schema@3.25.0(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod@3.25.76: {}
diff --git a/vendor/a2ui/specification/0.9/eval/pnpm-workspace.yaml b/vendor/a2ui/specification/0.9/eval/pnpm-workspace.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..719ee0b40eff30adf08c69593f54aa773c37204b
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/pnpm-workspace.yaml
@@ -0,0 +1,18 @@
+# Copyright 2025 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+onlyBuiltDependencies:
+ - '@firebase/util'
+ - esbuild
+ - protobufjs
diff --git a/vendor/a2ui/specification/0.9/eval/src/ai.ts b/vendor/a2ui/specification/0.9/eval/src/ai.ts
new file mode 100644
index 0000000000000000000000000000000000000000..df4aed1eae2d83c77426bd7388f2c2478cbf1c3c
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/ai.ts
@@ -0,0 +1,46 @@
+
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { googleAI } from "@genkit-ai/google-genai";
+import { genkit } from "genkit";
+import { openAI } from "@genkit-ai/compat-oai/openai";
+import { anthropic } from "genkitx-anthropic";
+import { logger } from "./logger";
+
+const plugins = [];
+
+if (process.env.GEMINI_API_KEY) {
+ logger.info("Initializing Google AI plugin...");
+ plugins.push(
+ googleAI({
+ apiKey: process.env.GEMINI_API_KEY!,
+ experimental_debugTraces: true,
+ })
+ );
+}
+if (process.env.OPENAI_API_KEY) {
+ logger.info("Initializing OpenAI plugin...");
+ plugins.push(openAI());
+}
+if (process.env.ANTHROPIC_API_KEY) {
+ logger.info("Initializing Anthropic plugin...");
+ plugins.push(anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! }));
+}
+
+export const ai = genkit({
+ plugins,
+});
diff --git a/vendor/a2ui/specification/0.9/eval/src/analysis_flow.ts b/vendor/a2ui/specification/0.9/eval/src/analysis_flow.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c4f25340b94e7421e3e25db5bfdc0a6eb6e2b27
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/analysis_flow.ts
@@ -0,0 +1,118 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { z } from "genkit";
+import { ai } from "./ai";
+import { rateLimiter } from "./rateLimiter";
+import { logger } from "./logger";
+
+export const analysisFlow = ai.defineFlow(
+ {
+ name: "analysisFlow",
+ inputSchema: z.object({
+ modelName: z.string(),
+ failures: z.array(
+ z.object({
+ promptName: z.string(),
+ runNumber: z.number(),
+ failureType: z.string(),
+ reason: z.string(),
+ issues: z.array(z.string()).optional(),
+ })
+ ),
+ numRuns: z.number(),
+ evalModel: z.string(),
+ }),
+ outputSchema: z.string(),
+ },
+ async ({ modelName, failures, numRuns, evalModel }) => {
+ const failureDetails = failures
+ .map((f) => {
+ let details = `Prompt: ${f.promptName} (Run ${f.runNumber})\nType: ${f.failureType}\nReason: ${f.reason}`;
+ if (f.issues && f.issues.length > 0) {
+ details += `\nIssues:\n- ${f.issues.join("\n- ")}`;
+ }
+ return details;
+ })
+ .join("\n\n---\n\n");
+
+ const analysisPrompt = `You are an expert AI analyst.
+Your task is to analyze the following failures from an evaluation run of the model "${modelName}".
+
+Out of the ${failures.length} failures, ${failures.filter((f) => f.failureType === "Schema Validation").length} are schema validation failures, ${failures.filter((f) => f.failureType === "Missing Components").length} are missing components failures, and ${failures.filter((f) => f.failureType === "Incorrect Logic").length} are incorrect logic failures.
+
+There were ${numRuns - failures.length} successful runs. Take this into account in the final summary of the analysis.
+
+Failures:
+${failureDetails}
+
+Instructions:
+1. Identify and list the broad types of errors (e.g., Schema Validation, Missing Components, Incorrect Logic, etc.).
+2. Analyze succinctly any patterns you see in the failures (e.g., "The model consistently fails to include the 'id' property", "The model struggles with nested layouts") and list them in a bullet point list. Try to give short examples of the patterns taken from the actual failures.
+3. Provide a concise summary of your findings in a single paragraph.
+
+The output is meant to be a short summary, not a full report. It should be easy to read and understand at a glance.
+
+Output Format:
+Return a Markdown formatted summary. Use headers and bullet points.
+`;
+
+ // Calculate estimated tokens for rate limiting
+ const estimatedInputTokens = Math.ceil(analysisPrompt.length / 2.5);
+
+ const { modelsToTest } = await import("./models");
+ let evalModelConfig = modelsToTest.find((m) => m.name === evalModel);
+
+ if (!evalModelConfig) {
+ evalModelConfig = {
+ name: evalModel,
+ model: null,
+ requestsPerMinute: 60,
+ tokensPerMinute: 100000,
+ };
+ }
+
+ await rateLimiter.acquirePermit(evalModelConfig, estimatedInputTokens);
+
+ try {
+ const response = await ai.generate({
+ prompt: analysisPrompt,
+ model: evalModelConfig.model || evalModel,
+ config: evalModelConfig.config,
+ output: {
+ format: "text",
+ },
+ });
+
+ const output = response.output;
+ if (!output) {
+ throw new Error("No output from analysis model");
+ }
+
+ if (typeof output !== "string") {
+ return "Analysis failed: Output was not a string.";
+ }
+
+ return output;
+ } catch (e: any) {
+ logger.error(`Error during analysis: ${e}`);
+ if (evalModelConfig) {
+ rateLimiter.reportError(evalModelConfig, e);
+ }
+ return `Analysis failed: ${e.message}`;
+ }
+ }
+);
diff --git a/vendor/a2ui/specification/0.9/eval/src/dev.ts b/vendor/a2ui/specification/0.9/eval/src/dev.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4d256880fe13ce2d5dbd267dbd9739dc9a575490
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/dev.ts
@@ -0,0 +1,18 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import "./generation_flow";
+import "./evaluation_flow";
diff --git a/vendor/a2ui/specification/0.9/eval/src/evaluation_flow.ts b/vendor/a2ui/specification/0.9/eval/src/evaluation_flow.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dc739a68ce99e26d6d8bffbd740b338c8d51bd62
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/evaluation_flow.ts
@@ -0,0 +1,193 @@
+
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { z } from "genkit";
+import { ai } from "./ai";
+import { rateLimiter } from "./rateLimiter";
+import { logger } from "./logger";
+import * as yaml from "js-yaml";
+
+// Define an evaluation flow
+export const evaluationFlow = ai.defineFlow(
+ {
+ name: "evaluationFlow",
+ inputSchema: z.object({
+ originalPrompt: z.string(),
+ generatedOutput: z.string(),
+ evalModel: z.string(),
+ schemas: z.any(),
+ }),
+ outputSchema: z.object({
+ pass: z.boolean(),
+ reason: z.string(),
+ issues: z
+ .array(
+ z.object({
+ issue: z.string(),
+ severity: z.enum(["minor", "significant", "critical"]),
+ })
+ )
+ .optional(),
+ evalPrompt: z.string().optional(),
+ }),
+ },
+ async ({ originalPrompt, generatedOutput, evalModel, schemas }) => {
+ const schemaDefs = Object.values(schemas)
+ .map((s: any) => JSON.stringify(s, null, 2))
+ .join("\n\n");
+
+ const EvalResultSchema = z.object({
+ pass: z
+ .boolean()
+ .describe("Whether the generated UI meets the requirements"),
+ reason: z.string().describe("Summary of the reason for a failure."),
+ issues: z
+ .array(
+ z.object({
+ issue: z.string().describe("Description of the issue"),
+ severity: z
+ .enum(["minor", "significant", "critical"])
+ .describe("Severity of the issue"),
+ })
+ )
+ .describe("List of specific issues found."),
+ });
+
+ const evalPrompt = `You are an expert QA evaluator for a UI generation system.
+Your task is to evaluate whether the generated UI JSON matches the user's request and conforms to the expected behavior.
+
+User Request:
+${originalPrompt}
+
+Expected Schemas:
+${schemaDefs}
+
+Generated Output (JSONL in Markdown):
+${generatedOutput}
+
+Instructions:
+1. Analyze the Generated Output against the User Request.
+2. Check if all requested components are present and match the user's intent.
+3. Check if the hierarchy and properties match the description.
+4. Verify that the content (text, labels, etc.) is correct and makes sense.
+5. Ignore minor formatting differences.
+6. If the output is correct and satisfies the request, return "pass": true.
+7. If there are missing components, incorrect values, or structural issues that affect the user experience, return "pass": false and provide a detailed "reason".
+8. In the "reason", explicitly quote the part of the JSON that is incorrect if possible.
+
+- You can be lenient in your evaluation for URLs, as the generated output may use a placeholder URL for images and icons.
+- If label text is similar but not exact, you can still pass the test as long as the meaning is the same. (e.g. "Cancel" vs "Cancel Order")
+- If the generated output is missing a component that is specified in the user request, it is required to exist in the output in order to pass the test. If it is not specified, it is not required.
+- If the request is vague about the contents of a label or other property, you can still pass the test as long as it can be construed as matching the intent.
+- Unless explicitly required to be absent by the user request, extra components or attributes are allowed.
+
+Severity Definitions:
+- Minor: Merely cosmetic or a slight deviation from the request.
+- Significant: The UI isn't very ergonomic or would be hard to understand.
+- Critical: That part of the UI is left off, or the structure isn't valid and can't be rendered.
+
+Return a JSON object with the following schema:
+
+\`\`\`json
+{
+ "type": "object",
+ "properties": {
+ "pass": {
+ "type": "boolean",
+ "description": "Whether the generated UI meets the requirements"
+ },
+ "reason": {
+ "type": "string",
+ "description": "Summary of the reason for a failure."
+ },
+ "issues": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "issue": {
+ "type": "string",
+ "description": "Description of the issue"
+ },
+ "severity": {
+ "type": "string",
+ "enum": ["minor", "significant", "critical"],
+ "description": "Severity of the issue"
+ }
+ },
+ "required": ["issue", "severity"]
+ },
+ "description": "List of specific issues found."
+ }
+ },
+ "required": ["pass", "reason", "issues"]
+}
+\`\`\`
+`;
+
+ // Calculate estimated tokens for rate limiting
+ const estimatedInputTokens = Math.ceil(evalPrompt.length / 2.5);
+
+ // Find the model config for the eval model
+ // We need to look it up from the models list or create a temporary config
+ // For now, we'll try to find it in the imported models list, or default to a safe config
+ const { modelsToTest } = await import("./models");
+ let evalModelConfig = modelsToTest.find((m) => m.name === evalModel);
+
+ if (!evalModelConfig) {
+ // If not found, create a temporary config with default limits
+ evalModelConfig = {
+ name: evalModel,
+ model: null, // We don't need the model object for rate limiting if we just use the name
+ requestsPerMinute: 60, // Safe default
+ tokensPerMinute: 100000, // Safe default
+ };
+ }
+
+ await rateLimiter.acquirePermit(evalModelConfig, estimatedInputTokens);
+
+ try {
+ const response = await ai.generate({
+ prompt: evalPrompt,
+ model: evalModelConfig.model || evalModel, // Use the model object if available, otherwise the string
+ config: evalModelConfig.config,
+ output: {
+ schema: EvalResultSchema,
+ },
+ });
+
+ // Parse the output
+ const result = response.output;
+ if (!result) {
+ throw new Error("No output from evaluation model");
+ }
+
+ return {
+ pass: result.pass,
+ reason: result.reason || "No reason provided",
+ issues: result.issues || [],
+ evalPrompt: evalPrompt,
+ };
+ } catch (e: any) {
+ logger.error(`Error during evaluation: ${e}`);
+ if (evalModelConfig) {
+ rateLimiter.reportError(evalModelConfig, e);
+ }
+ throw e; // Re-throw to let the retry logic handle it
+ }
+ }
+);
diff --git a/vendor/a2ui/specification/0.9/eval/src/evaluator.ts b/vendor/a2ui/specification/0.9/eval/src/evaluator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a0340442d19834c6cb69f68b54fbc54f71641d8e
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/evaluator.ts
@@ -0,0 +1,205 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { evaluationFlow } from "./evaluation_flow";
+import { ValidatedResult, EvaluatedResult } from "./types";
+import { logger } from "./logger";
+import { rateLimiter } from "./rateLimiter";
+import * as fs from "fs";
+import * as path from "path";
+import * as yaml from "js-yaml";
+import { IssueSeverity } from "./types";
+
+export class Evaluator {
+ constructor(
+ private schemas: any,
+ private evalModel: string,
+ private outputDir?: string
+ ) {}
+
+ async run(results: ValidatedResult[]): Promise {
+ const passedResults = results.filter(
+ (r) => r.validationErrors.length === 0 && r.components
+ );
+ const skippedCount = results.length - passedResults.length;
+
+ logger.info(
+ `Starting Phase 3: LLM Evaluation (${passedResults.length} items to evaluate, ${skippedCount} skipped due to validation failure)`
+ );
+
+ const totalJobs = passedResults.length;
+ let completedCount = 0;
+ let failedCount = 0;
+ const evaluatedResults: EvaluatedResult[] = [];
+
+ // Initialize results with skipped items
+ for (const result of results) {
+ if (result.validationErrors.length > 0) {
+ evaluatedResults.push({
+ ...result,
+ evaluationResult: {
+ pass: false,
+ reason: "Schema validation failure",
+ issues: [
+ {
+ issue: result.validationErrors.join("\n"),
+ severity: "criticalSchema",
+ },
+ ],
+ overallSeverity: "criticalSchema",
+ },
+ });
+ } else if (!result.components) {
+ evaluatedResults.push({ ...result });
+ }
+ }
+
+ if (totalJobs === 0) {
+ logger.info("Phase 3: Evaluation Complete (No items to evaluate)");
+ return evaluatedResults;
+ }
+
+ const progressInterval = setInterval(() => {
+ const queuedCount = rateLimiter.waitingCount;
+ const inProgressCount =
+ totalJobs - completedCount - failedCount - queuedCount;
+ const pct = Math.round(
+ ((completedCount + failedCount) / totalJobs) * 100
+ );
+ process.stderr.write(
+ `\r[Phase 3] Progress: ${pct}% | Completed: ${completedCount} | In Progress: ${inProgressCount} | Queued: ${queuedCount} | Failed: ${failedCount} `
+ );
+ }, 1000);
+
+ const promises = passedResults.map((result) =>
+ this.runJob(result).then((evalResult) => {
+ if (evalResult.evaluationResult) {
+ completedCount++;
+ } else {
+ failedCount++; // Failed to run evaluation flow (e.g. error)
+ }
+ evaluatedResults.push(evalResult);
+ return evalResult;
+ })
+ );
+
+ await Promise.all(promises);
+ clearInterval(progressInterval);
+ process.stderr.write("\n");
+ logger.info("Phase 3: Evaluation Complete");
+
+ return evaluatedResults;
+ }
+
+ private async runJob(result: ValidatedResult): Promise {
+ const maxEvalRetries = 3;
+ let evaluationResult:
+ | {
+ pass: boolean;
+ reason: string;
+ issues?: { issue: string; severity: IssueSeverity }[];
+ }
+ | undefined;
+
+ for (let evalRetry = 0; evalRetry < maxEvalRetries; evalRetry++) {
+ try {
+ evaluationResult = await evaluationFlow({
+ originalPrompt: result.prompt.promptText,
+ generatedOutput: result.rawText || "",
+ evalModel: this.evalModel,
+ schemas: this.schemas,
+ });
+ break;
+ } catch (e: any) {
+ if (evalRetry === maxEvalRetries - 1) {
+ logger.warn(
+ `Evaluation failed for ${result.prompt.name} run ${result.runNumber}: ${e.message}`
+ );
+ evaluationResult = {
+ pass: false,
+ reason: `Evaluation flow failed: ${e.message}`,
+ };
+ } else {
+ await new Promise((resolve) =>
+ setTimeout(resolve, 1000 * Math.pow(2, evalRetry))
+ );
+ }
+ }
+ }
+
+ let overallSeverity: IssueSeverity | undefined;
+ if (evaluationResult && !evaluationResult.pass && evaluationResult.issues) {
+ const severities = evaluationResult.issues.map((i) => i.severity);
+ if (severities.includes("critical")) {
+ overallSeverity = "critical";
+ } else if (severities.includes("significant")) {
+ overallSeverity = "significant";
+ } else if (severities.includes("minor")) {
+ overallSeverity = "minor";
+ }
+ }
+
+ if (this.outputDir && evaluationResult) {
+ this.saveEvaluation(result, evaluationResult, overallSeverity);
+ }
+
+ return {
+ ...result,
+ evaluationResult: evaluationResult
+ ? { ...evaluationResult, overallSeverity }
+ : undefined,
+ };
+ }
+
+ private saveEvaluation(
+ result: ValidatedResult,
+ evaluationResult: {
+ pass: boolean;
+ reason: string;
+ issues?: { issue: string; severity: IssueSeverity }[];
+ evalPrompt?: string;
+ },
+ overallSeverity?: IssueSeverity
+ ) {
+ if (!this.outputDir) return;
+
+ // Only save if the evaluation failed
+ if (evaluationResult.pass) return;
+
+ const modelDir = path.join(
+ this.outputDir,
+ `output-${result.modelName.replace(/[\/:]/g, "_")}`
+ );
+ const detailsDir = path.join(modelDir, "details");
+ fs.writeFileSync(
+ path.join(
+ detailsDir,
+ `${result.prompt.name}.${result.runNumber}.failed.yaml`
+ ),
+ yaml.dump({ ...evaluationResult, overallSeverity })
+ );
+
+ if (evaluationResult.evalPrompt) {
+ fs.writeFileSync(
+ path.join(
+ detailsDir,
+ `${result.prompt.name}.${result.runNumber}.eval_prompt.txt`
+ ),
+ evaluationResult.evalPrompt
+ );
+ }
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/eval/src/generation_flow.ts b/vendor/a2ui/specification/0.9/eval/src/generation_flow.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7f8568708061ef5c67ab90624cadc4e50d673f52
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/generation_flow.ts
@@ -0,0 +1,148 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { z } from "genkit";
+import { ai } from "./ai";
+import { ModelConfiguration } from "./models";
+import { rateLimiter } from "./rateLimiter";
+import { logger } from "./logger";
+
+// Define a UI component generator flow
+export const componentGeneratorFlow = ai.defineFlow(
+ {
+ name: "componentGeneratorFlow",
+ inputSchema: z.object({
+ prompt: z.string(),
+ modelConfig: z.any(), // Ideally, we'd have a Zod schema for ModelConfiguration
+ schemas: z.any(),
+ catalogRules: z.string().optional(),
+ }),
+ outputSchema: z.any(),
+ },
+ async ({ prompt, modelConfig, schemas, catalogRules }) => {
+ const schemaDefs = Object.values(schemas)
+ .map((s: any) => JSON.stringify(s, null, 2))
+ .join("\n\n");
+
+ const fullPrompt = `You are an AI assistant. Based on the following request, generate a stream of JSON messages that conform to the provided JSON Schemas.
+The output MUST be a series of JSON objects, each enclosed in a markdown code block (or a single block with multiple objects).
+
+Standard Instructions:
+1. Generate a 'createSurface' message with surfaceId 'main' and catalogId 'https://a2ui.dev/specification/0.9/standard_catalog_definition.json'.
+2. Generate a 'updateComponents' message with surfaceId 'main' containing the requested UI.
+3. Ensure all component children are referenced by ID (using the 'children' or 'child' property with IDs), NOT nested inline as objects.
+4. If the request involves data binding, you may also generate 'updateDataModel' messages.
+5. Among the 'updateComponents' messages in the output, there MUST be one root component with id: 'root'.
+6. Components need to be nested within a root layout container (Column, Row). No need to add an extra container if the root is already a layout container.
+7. There shouldn't be any orphaned components: no components should be generated which don't have a parent, except for the root component.
+8. Do NOT output a list of lists (e.g. [[...]]). Output individual JSON objects separated by newlines.
+9. STRICTLY follow the JSON Schemas. Do NOT add any properties that are not defined in the schema. Ensure ALL required properties are present.
+10. Do NOT invent data bindings or action contexts. Only use them if the prompt explicitly asks for them.
+11. Read the 'description' field of each component in the schema carefully. It contains critical usage instructions (e.g. regarding labels, single child limits, and layout behavior) that you MUST follow.
+12. Do NOT define components inline inside 'child' or 'children'. Always use a string ID referencing a separate component definition.
+13. Do NOT use a 'style' property. Use standard properties like 'alignment', 'distribution', 'usageHint', etc.
+14. Do NOT invent properties that are not in the schema. Check the 'properties' list for each component type.
+${catalogRules ? `\nInstructions specific to this catalog:\n${catalogRules}` : ""}
+
+Schemas:
+${schemaDefs}
+
+Request:
+${prompt}
+`;
+ const estimatedInputTokens = Math.ceil(fullPrompt.length / 2.5);
+ await rateLimiter.acquirePermit(
+ modelConfig as ModelConfiguration,
+ estimatedInputTokens
+ );
+
+ // Generate text response
+ let response;
+ const startTime = Date.now();
+ try {
+ response = await ai.generate({
+ prompt: fullPrompt,
+ model: modelConfig.model,
+ config: modelConfig.config,
+ });
+ } catch (e) {
+ logger.error(`Error during ai.generate: ${e}`);
+ rateLimiter.reportError(modelConfig as ModelConfiguration, e);
+ throw e;
+ }
+ const latency = Date.now() - startTime;
+
+ if (!response) throw new Error("Failed to generate component");
+
+ let candidate = (response as any).candidates?.[0];
+
+ // Fallback for different response structure (e.g. Genkit 0.9+ or specific model adapters)
+ if (!candidate && (response as any).message) {
+ const message = (response as any).message;
+ candidate = {
+ index: 0,
+ content: message.content,
+ finishReason: "STOP", // Assume STOP if not provided in this format
+ message: message,
+ };
+ }
+
+ if (!candidate) {
+ logger.error(
+ `No candidates returned in response. Full response: ${JSON.stringify(response, null, 2)}`
+ );
+ throw new Error("No candidates returned");
+ }
+
+ if (
+ candidate.finishReason !== "STOP" &&
+ candidate.finishReason !== undefined
+ ) {
+ logger.warn(
+ `Model finished with reason: ${candidate.finishReason}. Content: ${JSON.stringify(
+ candidate.content
+ )}`
+ );
+ }
+
+ // Record token usage (adjusting for actual usage)
+ const inputTokens = response.usage?.inputTokens || 0;
+ const outputTokens = response.usage?.outputTokens || 0;
+ const totalTokens = inputTokens + outputTokens;
+
+ // We already recorded estimatedInputTokens. We need to record the difference.
+ // If actual > estimated, we record the positive difference.
+ // If actual < estimated, we technically over-counted, but RateLimiter doesn't support negative adjustments yet.
+ // For safety, we just record any *additional* tokens if we under-estimated.
+ // And we definitely record the output tokens.
+
+ const additionalInputTokens = Math.max(
+ 0,
+ inputTokens - estimatedInputTokens
+ );
+ const tokensToAdd = additionalInputTokens + outputTokens;
+
+ if (tokensToAdd > 0) {
+ rateLimiter.recordUsage(
+ modelConfig as ModelConfiguration,
+ tokensToAdd,
+ false
+ );
+ }
+
+ return { text: response.text, latency };
+ }
+);
diff --git a/vendor/a2ui/specification/0.9/eval/src/generator.ts b/vendor/a2ui/specification/0.9/eval/src/generator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d61bd2754ea92ef0a048de41da52c20452c78880
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/generator.ts
@@ -0,0 +1,211 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { componentGeneratorFlow } from "./generation_flow";
+import { ModelConfiguration } from "./models";
+import { TestPrompt } from "./prompts";
+import { GeneratedResult } from "./types";
+import { extractJsonFromMarkdown } from "./utils";
+import { rateLimiter } from "./rateLimiter";
+import { logger } from "./logger";
+import * as fs from "fs";
+import * as path from "path";
+
+export class Generator {
+ constructor(
+ private schemas: any,
+ private outputDir?: string,
+ private catalogRules?: string
+ ) {}
+
+ async run(
+ prompts: TestPrompt[],
+ models: ModelConfiguration[],
+ runsPerPrompt: number
+ ): Promise {
+ const totalJobs = prompts.length * models.length * runsPerPrompt;
+ let completedCount = 0;
+ let failedCount = 0;
+ const results: GeneratedResult[] = [];
+ const promises: Promise[] = [];
+
+ logger.info(`Starting Phase 1: Generation (${totalJobs} jobs)`);
+
+ const progressInterval = setInterval(() => {
+ const queuedCount = rateLimiter.waitingCount;
+ const inProgressCount =
+ totalJobs - completedCount - failedCount - queuedCount;
+ const pct =
+ totalJobs > 0
+ ? Math.round(((completedCount + failedCount) / totalJobs) * 100)
+ : 0;
+ process.stderr.write(
+ `\r[Phase 1] Progress: ${pct}% | Completed: ${completedCount} | In Progress: ${inProgressCount} | Queued: ${queuedCount} | Failed: ${failedCount} `
+ );
+ }, 1000);
+
+ for (const model of models) {
+ for (const prompt of prompts) {
+ for (let i = 1; i <= runsPerPrompt; i++) {
+ promises.push(
+ this.runJob(model, prompt, i).then((result) => {
+ if (result.error) {
+ failedCount++;
+ } else {
+ completedCount++;
+ }
+ results.push(result);
+ return result;
+ })
+ );
+ }
+ }
+ }
+
+ await Promise.all(promises);
+ clearInterval(progressInterval);
+ process.stderr.write("\n");
+ logger.info("Phase 1: Generation Complete");
+
+ return results;
+ }
+
+ private async runJob(
+ model: ModelConfiguration,
+ prompt: TestPrompt,
+ runIndex: number,
+ retryCount: number = 0
+ ): Promise {
+ const startTime = Date.now();
+ try {
+ const output: any = await componentGeneratorFlow({
+ prompt: prompt.promptText,
+ modelConfig: model,
+ schemas: this.schemas,
+ catalogRules: this.catalogRules,
+ });
+
+ const text = output?.text;
+ const latency = output?.latency || 0;
+ let components: any[] = [];
+ let error = null;
+
+ if (text) {
+ try {
+ components = extractJsonFromMarkdown(text);
+ if (this.outputDir) {
+ this.saveArtifacts(model, prompt, runIndex, text, components);
+ }
+ } catch (e) {
+ error = e;
+ if (this.outputDir) {
+ this.saveError(model, prompt, runIndex, text, e);
+ }
+ }
+ } else {
+ error = new Error("No output text returned from model");
+ }
+
+ return {
+ modelName: model.name,
+ prompt,
+ runNumber: runIndex,
+ rawText: text,
+ components,
+ latency,
+ error,
+ };
+ } catch (error: any) {
+ if (retryCount < 1) {
+ // Simple retry for tool errors
+ return this.runJob(model, prompt, runIndex, retryCount + 1);
+ }
+ return {
+ modelName: model.name,
+ prompt,
+ runNumber: runIndex,
+ latency: Date.now() - startTime,
+ error,
+ };
+ }
+ }
+
+ private saveArtifacts(
+ model: ModelConfiguration,
+ prompt: TestPrompt,
+ runIndex: number,
+ text: string,
+ components: any[]
+ ) {
+ if (!this.outputDir) return;
+ const modelDir = path.join(
+ this.outputDir,
+ `output-${model.name.replace(/[\/:]/g, "_")}`
+ );
+ const detailsDir = path.join(modelDir, "details");
+ fs.mkdirSync(detailsDir, { recursive: true });
+
+ fs.writeFileSync(
+ path.join(detailsDir, `${prompt.name}.${runIndex}.json`),
+ JSON.stringify(components, null, 2)
+ );
+
+ const samplePath = path.join(
+ detailsDir,
+ `${prompt.name}.${runIndex}.sample`
+ );
+ const yamlHeader = `---
+description: ${prompt.description}
+name: ${prompt.name}
+prompt: |
+${prompt.promptText
+ .split("\n")
+ .map((line) => " " + line)
+ .join("\n")}
+---
+`;
+ let jsonlBody = "";
+ for (const comp of components) {
+ jsonlBody += JSON.stringify(comp) + "\n";
+ }
+ fs.writeFileSync(samplePath, yamlHeader + jsonlBody);
+ }
+
+ private saveError(
+ model: ModelConfiguration,
+ prompt: TestPrompt,
+ runIndex: number,
+ text: string | undefined,
+ error: any
+ ) {
+ if (!this.outputDir) return;
+ const modelDir = path.join(
+ this.outputDir,
+ `output-${model.name.replace(/[\/:]/g, "_")}`
+ );
+ const detailsDir = path.join(modelDir, "details");
+ fs.mkdirSync(detailsDir, { recursive: true });
+
+ fs.writeFileSync(
+ path.join(detailsDir, `${prompt.name}.${runIndex}.output.txt`),
+ text || "No output"
+ );
+ fs.writeFileSync(
+ path.join(detailsDir, `${prompt.name}.${runIndex}.error.json`),
+ JSON.stringify({ message: error.message, stack: error.stack }, null, 2)
+ );
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/eval/src/index.ts b/vendor/a2ui/specification/0.9/eval/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9c4ff138a8d486c61c8940611eea6f892f2d4fa4
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/index.ts
@@ -0,0 +1,493 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import * as fs from "fs";
+import * as path from "path";
+import yargs from "yargs";
+import { hideBin } from "yargs/helpers";
+import { logger, setupLogger } from "./logger";
+import { modelsToTest } from "./models";
+import { prompts, TestPrompt } from "./prompts";
+import { Generator } from "./generator";
+import { Validator } from "./validator";
+import { Evaluator } from "./evaluator";
+import { EvaluatedResult } from "./types";
+import { analysisFlow } from "./analysis_flow";
+
+const schemaFiles = [
+ "../../json/common_types.json",
+ "../../json/standard_catalog_definition.json",
+ "../../json/server_to_client.json",
+];
+
+function loadSchemas(): Record {
+ const schemas: Record = {};
+ for (const file of schemaFiles) {
+ const schemaString = fs.readFileSync(path.join(__dirname, file), "utf-8");
+ const schema = JSON.parse(schemaString);
+ schemas[path.basename(file)] = schema;
+ }
+ return schemas;
+}
+
+function generateSummary(
+ results: EvaluatedResult[],
+ analysisResults: Record
+): string {
+ const promptNameWidth = 40;
+ const latencyWidth = 20;
+ const failedRunsWidth = 15;
+ const severityWidth = 15;
+
+ // Group by model
+ const resultsByModel: Record = {};
+ for (const result of results) {
+ if (!resultsByModel[result.modelName]) {
+ resultsByModel[result.modelName] = [];
+ }
+ resultsByModel[result.modelName].push(result);
+ }
+
+ let summary = "# Evaluation Summary";
+ for (const modelName in resultsByModel) {
+ summary += `\n\n## Model: ${modelName}\n\n`;
+ const header = `| ${"Prompt Name".padEnd(
+ promptNameWidth
+ )} | ${"Avg Latency (ms)".padEnd(latencyWidth)} | ${"Schema Fail".padEnd(
+ failedRunsWidth
+ )} | ${"Eval Fail".padEnd(failedRunsWidth)} | ${"Minor".padEnd(
+ severityWidth
+ )} | ${"Significant".padEnd(severityWidth)} | ${"Critical".padEnd(
+ severityWidth
+ )} |`;
+ const divider = `|${"-".repeat(promptNameWidth + 2)}|${"-".repeat(
+ latencyWidth + 2
+ )}|${"-".repeat(failedRunsWidth + 2)}|${"-".repeat(
+ failedRunsWidth + 2
+ )}|${"-".repeat(severityWidth + 2)}|${"-".repeat(
+ severityWidth + 2
+ )}|${"-".repeat(severityWidth + 2)}|`;
+ summary += header;
+ summary += `\n${divider}`;
+
+ const modelResults = resultsByModel[modelName];
+ const promptsInModel = modelResults.reduce(
+ (acc, result) => {
+ if (!acc[result.prompt.name]) {
+ acc[result.prompt.name] = [];
+ }
+ acc[result.prompt.name].push(result);
+ return acc;
+ },
+ {} as Record
+ );
+
+ const sortedPromptNames = Object.keys(promptsInModel).sort();
+ for (const promptName of sortedPromptNames) {
+ const runs = promptsInModel[promptName];
+ const totalRuns = runs.length;
+ const schemaFailedRuns = runs.filter(
+ (r) => r.error || r.validationErrors.length > 0
+ ).length;
+ const evalFailedRuns = runs.filter(
+ (r) => r.evaluationResult && !r.evaluationResult.pass
+ ).length;
+
+ const totalLatency = runs.reduce((acc, r) => acc + r.latency, 0);
+ const avgLatency = (totalLatency / totalRuns).toFixed(0);
+
+ const schemaFailedStr =
+ schemaFailedRuns > 0 ? `${schemaFailedRuns} / ${totalRuns}` : "";
+ const evalFailedStr =
+ evalFailedRuns > 0 ? `${evalFailedRuns} / ${totalRuns}` : "";
+
+ let minorCount = 0;
+ let significantCount = 0;
+ let criticalCount = 0;
+
+ for (const r of runs) {
+ if (r.evaluationResult?.issues) {
+ for (const issue of r.evaluationResult.issues) {
+ if (issue.severity === "minor") minorCount++;
+ else if (issue.severity === "significant") significantCount++;
+ else if (issue.severity === "critical") criticalCount++;
+ }
+ }
+ }
+
+ const minorStr = minorCount > 0 ? `${minorCount}` : "";
+ const significantStr = significantCount > 0 ? `${significantCount}` : "";
+ const criticalStr = criticalCount > 0 ? `${criticalCount}` : "";
+
+ summary += `\n| ${promptName.padEnd(
+ promptNameWidth
+ )} | ${avgLatency.padEnd(latencyWidth)} | ${schemaFailedStr.padEnd(
+ failedRunsWidth
+ )} | ${evalFailedStr.padEnd(failedRunsWidth)} | ${minorStr.padEnd(
+ severityWidth
+ )} | ${significantStr.padEnd(severityWidth)} | ${criticalStr.padEnd(
+ severityWidth
+ )} |`;
+ }
+
+ const totalRunsForModel = modelResults.length;
+ const successfulRuns = modelResults.filter(
+ (r) =>
+ !r.error &&
+ r.validationErrors.length === 0 &&
+ (!r.evaluationResult || r.evaluationResult.pass)
+ ).length;
+
+ const successPercentage =
+ totalRunsForModel === 0
+ ? "0.0"
+ : ((successfulRuns / totalRunsForModel) * 100.0).toFixed(1);
+
+ summary += `\n\n**Total successful runs:** ${successfulRuns} / ${totalRunsForModel} (${successPercentage}% success)`;
+
+ if (analysisResults[modelName]) {
+ summary += `\n\n### Failure Analysis\n\n${analysisResults[modelName]}`;
+ }
+ }
+
+ summary += "\n\n---\n\n## Overall Summary\n";
+ const totalRuns = results.length;
+ const totalToolErrorRuns = results.filter((r) => r.error).length;
+ const totalRunsWithAnyFailure = results.filter(
+ (r) =>
+ r.error ||
+ r.validationErrors.length > 0 ||
+ (r.evaluationResult && !r.evaluationResult.pass)
+ ).length;
+
+ const modelsWithFailures = [
+ ...new Set(
+ results
+ .filter(
+ (r) =>
+ r.error ||
+ r.validationErrors.length > 0 ||
+ (r.evaluationResult && !r.evaluationResult.pass)
+ )
+ .map((r) => r.modelName)
+ ),
+ ].join(", ");
+
+ let totalMinor = 0;
+ let totalSignificant = 0;
+ let totalCritical = 0;
+ let totalCriticalSchema = 0;
+
+ for (const r of results) {
+ if (r.evaluationResult?.issues) {
+ for (const issue of r.evaluationResult.issues) {
+ if (issue.severity === "minor") totalMinor++;
+ else if (issue.severity === "significant") totalSignificant++;
+ else if (issue.severity === "critical") totalCritical++;
+ else if (issue.severity === "criticalSchema") totalCriticalSchema++;
+ }
+ }
+ }
+
+ summary += `\n- **Total tool failures:** ${totalToolErrorRuns} / ${totalRuns}`;
+ const successPercentage =
+ totalRuns === 0
+ ? "0.0"
+ : (((totalRuns - totalRunsWithAnyFailure) / totalRuns) * 100.0).toFixed(
+ 1
+ );
+ summary += `\n- **Number of runs with any failure (tool error, validation, or eval):** ${totalRunsWithAnyFailure} / ${totalRuns} (${successPercentage}% success)`;
+ summary += `\n- **Severity Breakdown:**`;
+ summary += `\n - **Minor:** ${totalMinor}`;
+ summary += `\n - **Significant:** ${totalSignificant}`;
+ summary += `\n - **Critical (Eval):** ${totalCritical}`;
+ summary += `\n - **Critical (Schema):** ${totalCriticalSchema}`;
+
+ const latencies = results.map((r) => r.latency).sort((a, b) => a - b);
+ const totalLatency = latencies.reduce((acc, l) => acc + l, 0);
+ const meanLatency =
+ totalRuns > 0 ? (totalLatency / totalRuns).toFixed(0) : "0";
+ let medianLatency = 0;
+ if (latencies.length > 0) {
+ const mid = Math.floor(latencies.length / 2);
+ if (latencies.length % 2 === 0) {
+ medianLatency = (latencies[mid - 1] + latencies[mid]) / 2;
+ } else {
+ medianLatency = latencies[mid];
+ }
+ }
+
+ summary += `\n- **Mean Latency:** ${meanLatency} ms`;
+ summary += `\n- **Median Latency:** ${medianLatency} ms`;
+
+ if (modelsWithFailures) {
+ summary += `\n- **Models with at least one failure:** ${modelsWithFailures}`;
+ }
+ return summary;
+}
+
+async function main() {
+ const argv = await yargs(hideBin(process.argv))
+ .option("log-level", {
+ type: "string",
+ description: "Set the logging level",
+ default: "info",
+ choices: ["debug", "info", "warn", "error"],
+ })
+ .option("results", {
+ type: "string",
+ description:
+ "Directory to keep output files. If not specified, uses results/output-. If specified, uses the provided directory (appending output-).",
+ coerce: (arg) => (arg === undefined ? true : arg),
+ default: true,
+ })
+ .option("runs-per-prompt", {
+ type: "number",
+ description: "Number of times to run each prompt",
+ default: 1,
+ })
+ .option("model", {
+ type: "string",
+ array: true,
+ description: "Filter models by exact name",
+ default: [],
+ choices: modelsToTest.map((m) => m.name),
+ })
+ .option("prompt", {
+ type: "string",
+ array: true,
+ description: "Filter prompts by name prefix",
+ })
+ .option("eval-model", {
+ type: "string",
+ description: "Model to use for evaluation",
+ default: "gemini-2.5-flash",
+ choices: modelsToTest.map((m) => m.name),
+ })
+ .option("clean-results", {
+ type: "boolean",
+ description: "Clear the output directory before starting",
+ default: false,
+ })
+
+ .help()
+ .alias("h", "help")
+ .strict().argv;
+
+ // Filter Models
+ let filteredModels = modelsToTest;
+ if (argv.model && argv.model.length > 0) {
+ const modelNames = argv.model as string[];
+ filteredModels = modelsToTest.filter((m) => modelNames.includes(m.name));
+ if (filteredModels.length === 0) {
+ logger.error(`No models found matching: ${modelNames.join(", ")}.`);
+ process.exit(1);
+ }
+ }
+
+ // Filter Prompts
+ let filteredPrompts = prompts;
+ if (argv.prompt && argv.prompt.length > 0) {
+ const promptPrefixes = argv.prompt as string[];
+ filteredPrompts = prompts.filter((p) =>
+ promptPrefixes.some((prefix) => p.name.startsWith(prefix))
+ );
+ if (filteredPrompts.length === 0) {
+ logger.error(
+ `No prompt found with prefix "${promptPrefixes.join(", ")}".`
+ );
+ process.exit(1);
+ }
+ }
+
+ // Determine Output Directory (Base)
+ // Note: Generator/Validator/Evaluator handle per-model subdirectories if outputDir is provided.
+ // But we need a base output dir to pass to them.
+ let resultsBaseDir: string | undefined;
+ const resultsArg = argv.results;
+ if (typeof resultsArg === "string") {
+ resultsBaseDir = resultsArg;
+ } else if (resultsArg === true) {
+ resultsBaseDir = "results";
+ }
+
+ // Clean Results
+ if (
+ argv["clean-results"] &&
+ resultsBaseDir &&
+ fs.existsSync(resultsBaseDir)
+ ) {
+ // Only clean if we are using the default structure or explicit path
+ // We should be careful not to delete root if user passed "/" (unlikely but possible)
+ // For safety, let's iterate over models and clean their specific dirs if they exist
+ // Or just clean the base dir if it looks like our results dir.
+ // The previous logic cleaned `outputDir` which was per-model.
+ // Here we might want to clean the whole results dir if it's the default "results".
+ if (resultsBaseDir === "results") {
+ fs.rmSync(resultsBaseDir, { recursive: true, force: true });
+ } else {
+ // If custom dir, maybe just clean it?
+ // User asked to clean results.
+ fs.rmSync(resultsBaseDir, { recursive: true, force: true });
+ }
+ }
+
+ // Setup Logger (Global)
+ // We need to setup logger to write to file?
+ // Previous logic setup logger per model output dir.
+ // Now we have multiple models potentially.
+ // We can setup logger to write to stdout/stderr primarily, and maybe a global log file?
+ // Or we can setup logger to NOT write to file, and let phases write their own logs?
+ // The `setupLogger` function takes an outputDir.
+ // If we have multiple models, where do we log?
+ // Maybe just log to the first model's dir or a "latest" dir?
+ // Or just console for now if multiple models?
+ // If single model, use that model's dir.
+
+ if (resultsBaseDir) {
+ if (filteredModels.length === 1) {
+ const modelDirName = `output-${filteredModels[0].name.replace(/[\/:]/g, "_")}`;
+ setupLogger(path.join(resultsBaseDir, modelDirName), argv["log-level"]);
+ } else {
+ // If multiple models, maybe just log to console or a shared log?
+ // For now, let's just use console logging (default if setupLogger not called with dir?)
+ // Actually setupLogger needs a dir to create 'eval.log'.
+ // Let's create a 'combined' log if multiple models?
+ // Or just skip file logging for multiple models for now.
+ setupLogger(undefined, argv["log-level"]);
+ }
+ } else {
+ setupLogger(undefined, argv["log-level"]);
+ }
+
+ const schemas = loadSchemas();
+ const catalogRulesPath = path.join(
+ __dirname,
+ "../../json/standard_catalog_rules.txt"
+ );
+ let catalogRules: string | undefined;
+ if (fs.existsSync(catalogRulesPath)) {
+ catalogRules = fs.readFileSync(catalogRulesPath, "utf-8");
+ } else {
+ logger.warn(
+ `Catalog rules file not found at ${catalogRulesPath}. Proceeding without specific catalog rules.`
+ );
+ }
+
+ // Phase 1: Generation
+ const generator = new Generator(schemas, resultsBaseDir, catalogRules);
+ const generatedResults = await generator.run(
+ filteredPrompts,
+ filteredModels,
+ argv["runs-per-prompt"]
+ );
+
+ // Phase 2: Validation
+ const validator = new Validator(schemas, resultsBaseDir);
+ const validatedResults = await validator.run(generatedResults);
+
+ // Phase 3: Evaluation
+ const evaluator = new Evaluator(schemas, argv["eval-model"], resultsBaseDir);
+ const evaluatedResults = await evaluator.run(validatedResults);
+
+ // Phase 4: Failure Analysis
+ const analysisResults: Record = {};
+ const resultsByModel: Record = {};
+ for (const result of evaluatedResults) {
+ if (!resultsByModel[result.modelName]) {
+ resultsByModel[result.modelName] = [];
+ }
+ resultsByModel[result.modelName].push(result);
+ }
+
+ for (const modelName in resultsByModel) {
+ const modelResults = resultsByModel[modelName];
+ const failures = modelResults
+ .filter(
+ (r) =>
+ r.error ||
+ r.validationErrors.length > 0 ||
+ (r.evaluationResult && !r.evaluationResult.pass)
+ )
+ .map((r) => {
+ let failureType = "Unknown";
+ let reason = "Unknown";
+ let issues: string[] = [];
+
+ if (r.error) {
+ failureType = "Tool Error";
+ reason = r.error.message || String(r.error);
+ } else if (r.validationErrors.length > 0) {
+ failureType = "Schema Validation";
+ reason = "Schema validation failed";
+ issues = r.validationErrors;
+ } else if (r.evaluationResult && !r.evaluationResult.pass) {
+ failureType = "Evaluation Failure";
+ reason = r.evaluationResult.reason;
+ if (r.evaluationResult.issues) {
+ issues = r.evaluationResult.issues.map(
+ (i) => `${i.severity}: ${i.issue}`
+ );
+ }
+ }
+
+ return {
+ promptName: r.prompt.name,
+ runNumber: r.runNumber,
+ failureType,
+ reason,
+ issues,
+ };
+ });
+
+ if (failures.length > 0) {
+ logger.info(`Running failure analysis for model: ${modelName}...`);
+ try {
+ const analysis = await analysisFlow({
+ modelName,
+ failures,
+ numRuns: modelResults.length,
+ evalModel: argv["eval-model"],
+ });
+ analysisResults[modelName] = analysis;
+ } catch (e) {
+ logger.error(`Failed to run failure analysis for ${modelName}: ${e}`);
+ analysisResults[modelName] = "Failed to run analysis.";
+ }
+ }
+ }
+
+ // Summary
+ const summary = generateSummary(evaluatedResults, analysisResults);
+ logger.info(summary);
+
+ if (resultsBaseDir) {
+ // Save summary to each model dir?
+ // Or just one summary?
+ // Previous logic saved summary.md in model dir.
+ for (const model of filteredModels) {
+ const modelDirName = `output-${model.name.replace(/[\/:]/g, "_")}`;
+ const modelDir = path.join(resultsBaseDir, modelDirName);
+ if (fs.existsSync(modelDir)) {
+ fs.writeFileSync(path.join(modelDir, "summary.md"), summary);
+ }
+ }
+ }
+}
+
+if (require.main === module) {
+ main().catch(console.error);
+}
diff --git a/vendor/a2ui/specification/0.9/eval/src/logger.ts b/vendor/a2ui/specification/0.9/eval/src/logger.ts
new file mode 100644
index 0000000000000000000000000000000000000000..15f6ec268f36bc34331162162c7ae92dcd7fe6f9
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/logger.ts
@@ -0,0 +1,70 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import * as winston from "winston";
+import * as path from "path";
+
+let fileTransport: winston.transport | null = null;
+
+const consoleTransport = new winston.transports.Console({
+ level: "info", // Default to info, can be updated later
+ format: winston.format.combine(
+ winston.format.colorize(),
+ winston.format.printf(({ timestamp, level, message }) => {
+ // Clear the current line (where progress bar might be) before logging
+ // \r clears the line, \x1b[K clears from cursor to end of line
+ return `\r\x1b[K${timestamp} [${level}]: ${message}`;
+ })
+ ),
+});
+
+// Create a default logger instance that logs to console only initially
+export const logger = winston.createLogger({
+ level: "debug", // Allow all logs to flow through (transports can filter)
+ format: winston.format.combine(
+ winston.format.timestamp(),
+ winston.format.printf(({ timestamp, level, message }) => {
+ return `${timestamp} [${level}]: ${message}`;
+ })
+ ),
+ transports: [consoleTransport],
+});
+
+export function setupLogger(outputDir: string | undefined, logLevel: string) {
+ // Ensure the global level allows debug logs so they reach the file transport
+ logger.level = "debug";
+
+ // Update Console transport level to match user preference directly
+ consoleTransport.level = logLevel;
+
+ if (fileTransport) {
+ logger.remove(fileTransport);
+ fileTransport = null;
+ }
+
+ if (outputDir) {
+ fileTransport = new winston.transports.File({
+ filename: path.join(outputDir, "output.log"),
+ level: "debug", // Always capture everything in the file
+ format: winston.format.combine(
+ winston.format.timestamp(),
+ winston.format.json()
+ ),
+ });
+
+ logger.add(fileTransport);
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/eval/src/models.ts b/vendor/a2ui/specification/0.9/eval/src/models.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d208ce2d14635cf2c9406d033eca2dfc0e377524
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/models.ts
@@ -0,0 +1,93 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { googleAI } from "@genkit-ai/google-genai";
+import { openAI } from "@genkit-ai/compat-oai/openai";
+import { claude35Haiku, claude4Sonnet } from "genkitx-anthropic";
+
+export interface ModelConfiguration {
+ model: any;
+ name: string;
+ config?: any;
+ requestsPerMinute?: number;
+ tokensPerMinute?: number;
+}
+
+export const modelsToTest: ModelConfiguration[] = [
+ {
+ model: openAI.model("gpt-5.1"),
+ name: "gpt-5.1",
+ config: { reasoning_effort: "minimal" },
+ requestsPerMinute: 500,
+ tokensPerMinute: 30000,
+ },
+ {
+ model: openAI.model("gpt-5-mini"),
+ name: "gpt-5-mini",
+ config: { reasoning_effort: "minimal" },
+ requestsPerMinute: 500,
+ tokensPerMinute: 500000,
+ },
+ {
+ model: openAI.model("gpt-5-nano"),
+ name: "gpt-5-nano",
+ config: {},
+ requestsPerMinute: 500,
+ tokensPerMinute: 200000,
+ },
+ {
+ model: googleAI.model("gemini-2.5-pro"),
+ name: "gemini-2.5-pro",
+ config: { thinkingConfig: { thinkingBudget: 1000 } },
+ requestsPerMinute: 150,
+ tokensPerMinute: 2000000,
+ },
+ {
+ model: googleAI.model("gemini-3-pro-preview"),
+ name: "gemini-3-pro",
+ config: { thinkingConfig: { thinkingBudget: 1000 } },
+ requestsPerMinute: 50,
+ tokensPerMinute: 1000000,
+ },
+ {
+ model: googleAI.model("gemini-2.5-flash"),
+ name: "gemini-2.5-flash",
+ config: { thinkingConfig: { thinkingBudget: 0 } },
+ requestsPerMinute: 1000,
+ tokensPerMinute: 1000000,
+ },
+ {
+ model: googleAI.model("gemini-2.5-flash-lite"),
+ name: "gemini-2.5-flash-lite",
+ config: { thinkingConfig: { thinkingBudget: 0 } },
+ requestsPerMinute: 4000,
+ tokensPerMinute: 1200000,
+ },
+ {
+ model: claude4Sonnet,
+ name: "claude-4-sonnet",
+ config: {},
+ requestsPerMinute: 50,
+ tokensPerMinute: 30000,
+ },
+ {
+ model: claude35Haiku,
+ name: "claude-35-haiku",
+ config: {},
+ requestsPerMinute: 50,
+ tokensPerMinute: 50000,
+ },
+];
diff --git a/vendor/a2ui/specification/0.9/eval/src/prompts.ts b/vendor/a2ui/specification/0.9/eval/src/prompts.ts
new file mode 100644
index 0000000000000000000000000000000000000000..11ac6c398814dd588fddb0724b4611f7976ac4a9
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/prompts.ts
@@ -0,0 +1,373 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+
+export interface TestPrompt {
+ name: string;
+ description: string;
+ promptText: string;
+}
+
+export const prompts: TestPrompt[] = [
+ {
+ name: "deleteSurface",
+ description: "A DeleteSurface message to remove a UI surface.",
+ promptText: `Generate a JSON message containing a deleteSurface for the surface 'dashboard-surface-1'.`,
+ },
+ {
+ name: "dogBreedGenerator",
+ description:
+ "A prompt to generate a UI for a dog breed information and generator tool.",
+ promptText: `Use a surfaceId of 'main'. Then, generate a 'createSurface' message followed by 'updateComponents' message to describe the following UI:
+
+A vertical list with:
+- Dog breed information
+- Dog generator
+
+The dog breed information is a card, which contains a title “Famous Dog breeds”, a header image, and a horizontal list of images of different dog breeds. The list information should be in the data model at /breeds.
+
+The dog generator is another card which is a form that generates a fictional dog breed with a description
+- Title
+- Description text explaining what it is
+- Dog breed name (text input)
+- Number of legs (number input)
+- Button called “Generate” which takes the data above and generates a new dog description
+- Skills (ChoicePicker component, usageHint 'multipleSelection')
+- A divider
+- A section which shows the generated content
+`,
+ },
+ {
+ name: "loginForm",
+ description:
+ 'A simple login form with username, password, a "remember me" checkbox, and a submit button.',
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a login form. It should have a "Login" text (usageHint 'h1'), two text fields for username and password (bound to /login/username and /login/password), a checkbox for "Remember Me" (bound to /login/rememberMe), and a "Sign In" button. The button should trigger a 'login' action, passing the username, password, and rememberMe status in the dynamicContext.`,
+ },
+ {
+ name: "productGallery",
+ description: "A gallery of products using a list with a template.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a product gallery. It should display a list of products from the data model at '/products'. Use a template for the list items. Each item should be a Card containing a Column. The Column should contain an Image (from '/products/item/imageUrl'), a Text component for the product name (from '/products/item/name'), and a Button labeled "Add to Cart". The button's action should be 'addToCart' and include a context with the product ID, for example, 'productId': 'static-id-123' (use this exact literal string). You should create a template component and then a list that uses it.`,
+ },
+ {
+ name: "productGalleryData",
+ description:
+ "An updateDataModel message to populate the product gallery data.",
+ promptText: `Generate a 'createSurface' message with surfaceId 'main', followed by an updateDataModel message to populate the data model for the product gallery. The update should target the path '/products' and include at least two products. Each product in the map should have keys 'id', 'name', and 'imageUrl'. For example:
+ {
+ "product1": {
+ "id": "product1",
+ "name": "Awesome Gadget",
+ "imageUrl": "https://example.com/gadget.jpg"
+ }
+ }`,
+ },
+ {
+ name: "settingsPage",
+ description: "A settings page with tabs and a modal dialog.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a user settings page. Use a Tabs component with two tabs: "Profile" and "Notifications". The "Profile" tab should contain a simple column with a text field for the user's name. The "Notifications" tab should contain a checkbox for "Enable email notifications". Also, include a Modal component. The modal's entry point should be a button labeled "Delete Account", and its content should be a column with a confirmation text and two buttons: "Confirm Deletion" and "Cancel".`,
+ },
+ {
+ name: "updateDataModel",
+ description: "An updateDataModel message to update user data.",
+ promptText: `Generate a 'createSurface' message with surfaceId 'main', followed by an updateDataModel message. This is used to update the client's data model. The scenario is that a user has just logged in, and we need to populate their profile information. Create a single data model update message to set '/user/name' to "John Doe" and '/user/email' to "john.doe@example.com".`,
+ },
+ {
+ name: "animalKingdomExplorer",
+ description: "A simple, explicit UI to display a hierarchy of animals.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a simplified UI explorer for the Animal Kingdom.
+
+The UI must have a main 'Text' (usageHint 'h1') with the text "Simple Animal Explorer".
+
+Below the text heading, create a 'Tabs' component with exactly three tabs: "Mammals", "Birds", and "Reptiles".
+
+Each tab's content should be a 'Column'. The first item in each column must be a 'TextField' with the label "Search...". Below the search field, display the hierarchy for that tab using nested 'Card' components.
+
+The exact hierarchy to create is as follows:
+
+**1. "Mammals" Tab:**
+ - A 'Card' for the Class "Mammalia".
+ - Inside the "Mammalia" card, create two 'Card's for the following Orders:
+ - A 'Card' for the Order "Carnivora". Inside this, create 'Card's for these three species: "Lion", "Tiger", "Wolf".
+ - A 'Card' for the Order "Artiodactyla". Inside this, create 'Card's for these two species: "Giraffe", "Hippopotamus".
+
+**2. "Birds" Tab:**
+ - A 'Card' for the Class "Aves".
+ - Inside the "Aves" card, create three 'Card's for the following Orders:
+ - A 'Card' for the Order "Accipitriformes". Inside this, create a 'Card' for the species: "Bald Eagle".
+ - A 'Card' for the Order "Struthioniformes". Inside this, create a 'Card' for the species: "Ostrich".
+ - A 'Card' for the Order "Sphenisciformes". Inside this, create a 'Card' for the species: "Penguin".
+
+**3. "Reptiles" Tab:**
+ - A 'Card' for the Class "Reptilia".
+ - Inside the "Reptilia" card, create two 'Card's for the following Orders:
+ - A 'Card' for the Order "Crocodilia". Inside this, create a 'Card' for the species: "Nile Crocodile".
+ - A 'Card' for the Order "Squamata". Inside this, create 'Card's for these two species: "Komodo Dragon", "Ball Python".
+
+Each species card must contain a 'Row' with an 'Image' and a 'Text' component for the species name. Do not add any other components.
+
+Each Class and Order card must contain a 'Column' with a 'Text' component with the name, and then the children cards below.
+
+IMPORTANT: Do not skip any of the classes, orders, or species above. Include every item that is mentioned.
+`,
+ },
+ {
+ name: "recipeCard",
+ description: "A UI to display a recipe with ingredients and instructions.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a recipe card. It should have a 'Text' (usageHint 'h1') for the recipe title, "Classic Lasagna". Below the title, an 'Image' of the lasagna. Then, a 'Row' containing two 'Column's. The first column has a 'Text' (usageHint 'h2') "Ingredients" and a 'List' of ingredients (use 'Text' components for items: "Pasta", "Cheese", "Sauce"). The second column has a 'Text' (usageHint 'h2') "Instructions" and a 'List' of step-by-step instructions (use 'Text' components: "Boil pasta", "Layer ingredients", "Bake"). Finally, a 'Button' at the bottom labeled "Watch Video Tutorial".`,
+ },
+ {
+ name: "musicPlayer",
+ description: "A simple music player UI.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a music player. It should be a 'Card' containing a 'Column'. Inside the column, there's an 'Image' for the album art, a 'Text' for the song title "Bohemian Rhapsody", another 'Text' for the artist "Queen", a 'Slider' labeled "Progress", and a 'Row' with three 'Button' components. Each Button should have a child 'Text' component. The Text components should have the labels "Previous", "Play", and "Next" respectively.`,
+ },
+ {
+ name: "weatherForecast",
+ description: "A UI to display the weather forecast.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a weather forecast UI. It should have a 'Text' (usageHint 'h1') with the city name, "New York". Below it, a 'Row' with the current temperature as a 'Text' component ("68°F") and an 'Image' for the weather icon (e.g., a sun). Below that, a 'Divider'. Then, a 'List' component to display the 5-day forecast. Each item in the list should be a 'Row' with the day, an icon, and high/low temperatures.`,
+ },
+ {
+ name: "surveyForm",
+ description: "A customer feedback survey form.",
+ promptText: `Create a customer feedback survey form. It should have a 'Text' (usageHint 'h1') "Customer Feedback". Then a 'ChoicePicker' (usageHint 'mutuallyExclusive') with label "How would you rate our service?" and options "Excellent", "Good", "Average", "Poor". Then a 'ChoicePicker' (usageHint 'multipleSelection') with label "What did you like?" and options "Product Quality", "Price", "Customer Support". Finally, a 'TextField' with the label "Any other comments?" and a 'Button' labeled "Submit Feedback".`,
+ },
+ {
+ name: "flightBooker",
+ description: "A form to search for flights.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a flight booking form. It should have a 'Text' (usageHint 'h1') "Book a Flight". Then a 'Row' with two 'TextField's for "Origin" and "Destination". Below that, a 'Row' with two 'DateTimeInput's for "Departure Date" and "Return Date" (initialize with empty values). Add a 'Slider' labeled "Passengers" (min 1, max 10, value 1). Finally, a 'Button' labeled "Search Flights".`,
+ },
+ {
+ name: "dashboard",
+ description: "A simple dashboard with statistics.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a simple dashboard. It should have a 'Text' (usageHint 'h1') "Sales Dashboard". Below, a 'Row' containing three 'Card's. The first card has a 'Text' "Revenue" and another 'Text' "$50,000". The second card has "New Customers" and "1,200". The third card has "Conversion Rate" and "4.5%".`,
+ },
+ {
+ name: "contactCard",
+ description: "A UI to display contact information.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a contact card. It should be a 'Card' with a 'Row'. The row contains an 'Image' (as an avatar) and a 'Column'. The column contains a 'Text' for the name "Jane Doe", a 'Text' for the email "jane.doe@example.com", and a 'Text' for the phone number "(123) 456-7890". Below the main row, add a 'Button' labeled "View on Map".`,
+ },
+ {
+ name: "calendarEventCreator",
+ description: "A form to create a new calendar event.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a calendar event creation form. It should have a 'Text' (usageHint 'h1') "New Event". Include a 'TextField' for the "Event Title". Use a 'Row' for two 'DateTimeInput's for "Start Time" and "End Time" (initialize both with empty values). Add a 'CheckBox' labeled "All-day event". Finally, a 'Row' with two 'Button's: "Save" and "Cancel".`,
+ },
+ {
+ name: "checkoutPage",
+ description: "A simplified e-commerce checkout page.",
+ promptText: `Create a simplified e-commerce checkout page. It should have a 'Text' (usageHint 'h1') "Checkout". A 'Column' for shipping info with 'TextField's for "Name", "Address", "City", "Zip Code". A 'Column' for payment info with 'TextField's for "Card Number", "Expiry Date", "CVV". Finally, a 'Text' "Total: $99.99" and a 'Button' "Place Order".`,
+ },
+ {
+ name: "socialMediaPost",
+ description: "A component representing a social media post.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a social media post. It should be a 'Card' containing a 'Column'. The first item is a 'Row' with an 'Image' (user avatar) and a 'Text' (username "user123"). Below that, a 'Text' component for the post content: "Enjoying the beautiful weather today!". Then, an 'Image' for the main post picture. Finally, a 'Row' with three 'Button's: "Like", "Comment", and "Share".`,
+ },
+ {
+ name: "eCommerceProductPage",
+ description: "A detailed product page for an e-commerce website.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a product details page.
+The main layout should be a 'Row'.
+The left side of the row is a 'Column' containing a large main 'Image' of the product, and below it, a 'Row' of three smaller thumbnail 'Image' components.
+The right side of the row is another 'Column' for product information:
+- A 'Text' (usageHint 'h1') for the product name, "Premium Leather Jacket".
+- A 'Text' component for the price, "$299.99".
+- A 'Divider'.
+- A 'ChoicePicker' (usageHint 'mutuallyExclusive') labeled "Select Size" with options "S", "M", "L", "XL".
+- A 'ChoicePicker' (usageHint 'mutuallyExclusive') labeled "Select Color" with options "Black", "Brown", "Red".
+- A 'Button' with a 'Text' child "Add to Cart".
+- A 'Text' component for the product description below the button.`,
+ },
+ {
+ name: "interactiveDashboard",
+ description: "A dashboard with filters and data cards.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for an interactive analytics dashboard.
+ At the top, a 'Text' (usageHint 'h1') "Company Dashboard".
+ Below the text heading, a 'Card' containing a 'Row' of filter controls:
+ - A 'DateTimeInput' with a label for "Start Date" (initialize with empty value).
+ - A 'DateTimeInput' with a label for "End Date" (initialize with empty value).
+ - A 'Button' labeled "Apply Filters".
+ Below the filters card, a 'Row' containing two 'Card's for key metrics:
+ - The first 'Card' has a 'Text' (usageHint 'h2') "Total Revenue" and a 'Text' component showing "$1,234,567".
+ - The second 'Card' has a 'Text' (usageHint 'h2') "New Users" and a 'Text' component showing "4,321".
+ Finally, a large 'Card' at the bottom with a 'Text' (usageHint 'h2') "Revenue Over Time" and a placeholder 'Image' with a valid URL to represent a line chart.`,
+ },
+ {
+ name: "travelItinerary",
+ description: "A multi-day travel itinerary display.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a travel itinerary for a trip to Paris.
+It should have a main 'Text' component with usageHint 'h1' and text "Paris Adventure".
+Below, use a 'List' to display three days. Each item in the list should be a 'Card'.
+- The first 'Card' (Day 1) should contain a 'Text' (usageHint 'h2') "Day 1: Arrival & Eiffel Tower", and a 'List' of activities for that day: "Check into hotel", "Lunch at a cafe", "Visit the Eiffel Tower".
+- The second 'Card' (Day 2) should contain a 'Text' (usageHint 'h2') "Day 2: Museums & Culture", and a 'List' of activities: "Visit the Louvre Museum", "Walk through Tuileries Garden", "See the Arc de Triomphe".
+- The third 'Card' (Day 3) should contain a 'Text' (usageHint 'h2') "Day 3: Art & Departure", and a 'List' of activities: "Visit Musée d'Orsay", "Explore Montmartre", "Depart from CDG".
+Each activity in the inner lists should be a 'Row' containing a 'CheckBox' (to mark as complete) and a 'Text' component with the activity description.`,
+ },
+ {
+ name: "kanbanBoard",
+ description: "A Kanban-style task tracking board.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a Kanban board. It should have a 'Text' (usageHint 'h1') "Project Tasks". Below, a 'Row' containing three 'Column's representing "To Do", "In Progress", and "Done". Each column should have a 'Text' (usageHint 'h2') header and a list of 'Card's.
+ - "To Do" column: Card "Research", Card "Design".
+ - "In Progress" column: Card "Implementation".
+ - "Done" column: Card "Planning".
+ Each card should just contain a 'Text' with the task name.`,
+ },
+ {
+ name: "videoCallInterface",
+ description: "A video conference UI.",
+ promptText: `Create a video call interface. It should have a 'Text' (usageHint 'h1') "Video Call". A 'Video' component (placeholder URL). Below that, a 'Row' with three 'Button's labeled "Mute", "Camera", and "End Call".`,
+ },
+ {
+ name: "fileBrowser",
+ description: "A file explorer list.",
+ promptText: `Create a file browser. It should have a 'Text' (usageHint 'h1') "My Files". A 'List' of 'Row's. Each row has an 'Icon' (folder or attachFile) and a 'Text' (filename). Examples (create these as static rows, not data bound): "Documents", "Images", "Work.txt".`,
+ },
+ {
+ name: "chatRoom",
+ description: "A chat application interface.",
+ promptText: `Create a chat room interface. It should have a 'Column' for the message history. Inside, include several 'Card's representing messages, each with a 'Text' for the sender and a 'Text' for the message body. Specifically include these messages: "Alice: Hi there!", "Bob: Hello!". At the bottom, a 'Row' with a 'TextField' (label "Type a message...") and a 'Button' labeled "Send".`,
+ },
+ {
+ name: "fitnessTracker",
+ description: "A daily activity summary.",
+ promptText: `Create a fitness tracker dashboard. It should have a 'Text' (usageHint 'h1') "Daily Activity", and a 'Row' of 'Card's. Each card should contain a 'Column' with a 'Text' label (e.g. "Steps") and a 'Text' value (e.g. "10,000"). Create cards for "Steps" ("10,000"), "Calories" ("500 kcal"), "Distance" ("5 km"). Below that, a 'Slider' labeled "Daily Goal" (initialize value to 50). Finally, a 'List' of recent workouts. Use 'Text' components for the list items, for example: "Morning Run", "Evening Yoga", "Gym Session".`,
+ },
+ {
+ name: "smartHome",
+ description: "A smart home control panel.",
+ promptText: `Create a smart home dashboard. It should have a 'Text' (usageHint 'h1') "Living Room". A 'Grid' of 'Card's. To create the grid, use a 'Column' that contains multiple 'Row's. Each 'Row' should contain 'Card's. Create a row with cards for "Lights" (CheckBox, label "Lights", value true) and "Thermostat" (Slider, label "Thermostat", value 72). Create another row with a card for "Music" (CheckBox, label "Music", value false). Ensure the CheckBox labels are exactly "Lights" and "Music".`,
+ },
+ {
+ name: "restaurantMenu",
+ description: "A restaurant menu with tabs.",
+ promptText: `Create a restaurant menu with tabs. It should have a 'Text' (usageHint 'h1') "Gourmet Bistro". A 'Tabs' component with "Starters", "Mains", "Desserts".
+ - "Starters": 'List' containing IDs of separate 'Row' components (Name, Price). Create rows for "Soup - $8", "Salad - $10".
+ - "Mains": 'List' containing IDs of separate 'Row' components. Create rows for "Steak - $25", "Pasta - $18".
+ - "Desserts": 'List' containing IDs of separate 'Row' components. Create rows for "Cake - $8", "Pie - $7".`,
+ },
+ {
+ name: "newsAggregator",
+ description: "A news feed with article cards.",
+ promptText: `Create a news aggregator. The root component should be a 'Column'. Inside this column, place a 'Text' (usageHint 'h1') "Top Headlines". Below the text, place a 'List' of 'Card's. The 'List' should be a sibling of the 'Text', not a parent. Each card has a 'Column' with an 'Image', a 'Text' (headline), and a 'Text' (summary). Include headlines "Tech Breakthrough" and "Local Sports". Each card should have a 'Button' labeled "Read More". Create these as static components, not data bound.`,
+ },
+ {
+ name: "photoEditor",
+ description: "A photo editing interface with sliders.",
+ promptText: `Create a photo editor. It should have a large 'Image' (photo). Below it, a 'Row' of 'Button's (Filters, Crop, Adjust). Below that, a 'Slider' labeled "Intensity" (initialize value to 50).`,
+ },
+ {
+ name: "triviaQuiz",
+ description: "A trivia question card.",
+ promptText: `Create a trivia quiz. It should have a 'Text' (usageHint 'h1') "Question 1". A 'Text' "What is the capital of France?". A 'ChoicePicker' (usageHint 'mutuallyExclusive') for answers (options: "Paris", "London", "Berlin", "Madrid"). A 'Button' "Submit Answer".`,
+ },
+ {
+ name: "simpleCalculator",
+ description: "A basic calculator layout.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a calculator. It should have a 'Card'. Inside the card, there MUST be a single 'Column' that contains two things: a 'Text' (display) showing "0", and a nested 'Column' of 'Row's for the buttons.
+ - Row 1: "7", "8", "9", "/"
+ - Row 2: "4", "5", "6", "*"
+ - Row 3: "1", "2", "3", "-"
+ - Row 4: "0", ".", "=", "+"
+ Each button should be a 'Button' component.`,
+ },
+ {
+ name: "jobApplication",
+ description: "A job application form.",
+ promptText: `Create a job application form. It should have 'TextField's for "Name", "Email", "Phone", "Resume URL". A 'ChoicePicker' (usageHint 'mutuallyExclusive') labeled "Years of Experience" (options: "0-1", "2-5", "5+"). A 'Button' "Submit Application".`,
+ },
+ {
+ name: "courseSyllabus",
+ description: "A course syllabus outline.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a course syllabus. 'Text' (h1) "Introduction to Computer Science". 'List' of modules.
+- For module 1, a 'Card' with 'Text' "Algorithms" and 'List' ("Sorting", "Searching").
+- For module 2, a 'Card' with 'Text' "Data Structures" and 'List' ("Arrays", "Linked Lists").`,
+ },
+ {
+ name: "stockWatchlist",
+ description: "A stock market watchlist.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a stock watchlist. 'Text' (h1) "Market Watch". 'List' of 'Row's.
+ - Row 1: 'Text' "AAPL", 'Text' "$150.00", 'Text' "+1.2%".
+ - Row 2: 'Text' "GOOGL", 'Text' "$2800.00", 'Text' "-0.5%".
+ - Row 3: 'Text' "AMZN", 'Text' "$3400.00", 'Text' "+0.8%".`,
+ },
+ {
+ name: "podcastEpisode",
+ description: "A podcast player interface.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a podcast player. 'Card' containing:
+ - 'Image' (Cover Art).
+ - 'Text' (h2) "Episode 42: The Future of AI".
+ - 'Text' "Host: Jane Smith".
+ - 'Slider' labeled "Progress" (initialize value to 0).
+ - 'Row' with 'Button' (child 'Text' "1x"), 'Button' (child 'Text' "Play/Pause"), 'Button' (child 'Text' "Share").
+ Create these as static components, not data bound.`,
+ },
+ {
+ name: "hotelSearchResults",
+ description: "Hotel search results list.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for hotel search results. 'Text' (h1) "Hotels in Tokyo". 'List' of 'Card's.
+ - Card 1: 'Row' with 'Image', 'Column' ('Text' "Grand Hotel", 'Text' "5 Stars", 'Text' "$200/night"), 'Button' "Book".
+ - Card 2: 'Row' with 'Image', 'Column' ('Text' "City Inn", 'Text' "3 Stars", 'Text' "$100/night"), 'Button' "Book".`,
+ },
+ {
+ name: "notificationCenter",
+ description: "A list of notifications.",
+ promptText: `Create a notification center. It should have a 'Text' (usageHint 'h1') "Notifications". A 'List' of 'Card's. Include cards for "New message from Sarah" and "Your order has shipped". Each card should have a 'Button' "Dismiss".`,
+ },
+ {
+ name: "nestedDataBinding",
+ description: "A project dashboard with deeply nested data binding.",
+ promptText: `Generate a stream of JSON messages for a Project Management Dashboard.
+ The output must consist of exactly three JSON objects, one after the other.
+
+ Generate a createSurface message with surfaceId 'main'.
+ Generate an updateComponents message with surfaceId 'main'.
+ It should have a 'Text' (usageHint 'h1') "Project Dashboard".
+ Then a 'List' of projects bound to '/projects'.
+ Inside the list template, each item should be a 'Card' containing:
+ - A 'Text' (usageHint 'h2') bound to the project 'title'.
+ - A 'List' of tasks bound to the 'tasks' property of the project.
+ Inside the tasks list template, each item should be a 'Column' containing:
+ - A 'Text' bound to the task 'description'.
+ - A 'Row' for the assignee, containing:
+ - A 'Text' bound to 'assignee/name'.
+ - A 'Text' bound to 'assignee/role'.
+ - A 'List' of subtasks bound to 'subtasks'.
+ Inside the subtasks list template, each item should be a 'Text' bound to 'title'.
+
+ Then generate an 'updateDataModel' message.
+ Populate this dashboard with sample data:
+ - At least one project.
+ - The project should have a title, and a list of tasks.
+ - The task should have a description, an assignee object (with name and role), and a list of subtasks.`,
+ },
+
+ {
+ name: "profileEditor",
+ description: "A user profile editing form.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for editing a profile. 'Text' (h1) "Edit Profile". 'Image' (Current Avatar). 'Button' "Change Photo". 'TextField' "Display Name". 'TextField' "Bio" (multiline). 'TextField' "Website". 'Button' "Save Changes".`,
+ },
+ {
+ name: "cinemaSeatSelection",
+ description: "A seat selection grid.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for cinema seat selection. 'Text' (h1) "Select Seats". 'Text' "Screen" (centered). 'Column' of 'Row's representing rows of seats.
+ - Row A: 4 'CheckBox'es.
+ - Row B: 4 'CheckBox'es.
+ - Row C: 4 'CheckBox'es.
+ 'Button' "Confirm Selection".`,
+ },
+ {
+ name: "flashcardApp",
+ description: "A language learning flashcard.",
+ promptText: `Generate a 'createSurface' message and a 'updateComponents' message with surfaceId 'main' for a flashcard app. 'Text' (h1) "Spanish Vocabulary". 'Card' (the flashcard). Inside the card, a 'Column' with 'Text' (h2) "Hola" (Front). 'Divider'. 'Text' "Hello" (Back - conceptually hidden, but rendered here). 'Row' of buttons: "Hard", "Good", "Easy".`,
+ },
+];
diff --git a/vendor/a2ui/specification/0.9/eval/src/rateLimiter.ts b/vendor/a2ui/specification/0.9/eval/src/rateLimiter.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8504249af6f2bfb789b7533ec374eb2a023a5cfb
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/rateLimiter.ts
@@ -0,0 +1,205 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { logger } from "./logger";
+import { ModelConfiguration } from "./models";
+
+interface UsageRecord {
+ timestamp: number;
+ tokensUsed: number;
+ isRequest: boolean;
+}
+
+interface ModelRateLimitState {
+ usageRecords: UsageRecord[];
+}
+
+export class RateLimiter {
+ private modelStates: Map = new Map();
+ private _waitingCount = 0;
+
+ private modelPauses: Map = new Map();
+
+ get waitingCount(): number {
+ return this._waitingCount;
+ }
+
+ private getModelState(modelName: string): ModelRateLimitState {
+ if (!this.modelStates.has(modelName)) {
+ this.modelStates.set(modelName, { usageRecords: [] });
+ }
+ return this.modelStates.get(modelName)!;
+ }
+
+ private cleanUpRecords(state: ModelRateLimitState): void {
+ // Use 65 seconds to be safe against clock drift and server bucket alignment
+ const minuteAgo = Date.now() - 65 * 1000;
+ state.usageRecords = state.usageRecords.filter(
+ (record) => record.timestamp > minuteAgo
+ );
+ }
+
+ reportError(modelConfig: ModelConfiguration, error: any): void {
+ const isResourceExhausted =
+ error?.status === "RESOURCE_EXHAUSTED" ||
+ error?.code === 429 ||
+ (error?.message && error.message.includes("429"));
+
+ if (isResourceExhausted) {
+ // Try to parse "Please retry in X s" or similar from error message
+ // Example: "Please retry in 22.648565753s."
+ const message = error?.originalMessage || error?.message || "";
+ const match = message.match(/retry in ([0-9.]+)\s*s/i);
+
+ let retrySeconds = 60; // Default to 60s if not found
+ if (match && match[1]) {
+ retrySeconds = parseFloat(match[1]);
+ }
+
+ // Add a small buffer
+ const pauseDuration = Math.ceil(retrySeconds * 1000) + 1000;
+ const pausedUntil = Date.now() + pauseDuration;
+
+ this.modelPauses.set(modelConfig.name, pausedUntil);
+
+ logger.verbose(
+ `RateLimiter: Pausing ${modelConfig.name} for ${pauseDuration}ms due to 429 error. Resuming at ${new Date(pausedUntil).toISOString()}`
+ );
+ }
+ }
+
+ async acquirePermit(
+ modelConfig: ModelConfiguration,
+ tokensCost: number = 0
+ ): Promise {
+ this._waitingCount++;
+ try {
+ const { name, requestsPerMinute, tokensPerMinute } = modelConfig;
+ if (!requestsPerMinute && !tokensPerMinute) {
+ return; // No limits
+ }
+
+ const state = this.getModelState(name);
+
+ // Loop to re-check after waiting, as multiple limits might be in play
+ while (true) {
+ // Check if model is paused globally due to 429
+ const pausedUntil = this.modelPauses.get(name);
+ if (pausedUntil && pausedUntil > Date.now()) {
+ const pauseWait = pausedUntil - Date.now();
+ logger.verbose(
+ `Rate limiting ${name}: Paused by circuit breaker for ${pauseWait}ms`
+ );
+ await new Promise((resolve) => setTimeout(resolve, pauseWait));
+ // After waiting, loop again to check normal rate limits
+ continue;
+ }
+
+ this.cleanUpRecords(state);
+ const currentNow = Date.now();
+ let rpmWait = 0;
+ let tpmWait = 0;
+
+ let currentTokens = 0;
+ let currentRequests = 0;
+ state.usageRecords.forEach((r) => {
+ currentTokens += r.tokensUsed;
+ if (r.isRequest) currentRequests++;
+ });
+
+ const effectiveTokensPerMinute = tokensPerMinute
+ ? Math.floor(tokensPerMinute * 0.9)
+ : 0;
+
+ logger.debug(
+ `RateLimiter check for ${name}: Cost=${tokensCost}, CurrentTokens=${currentTokens}, Limit=${effectiveTokensPerMinute}, Requests=${currentRequests}, RPM=${requestsPerMinute}`
+ );
+
+ // Check RPM
+ if (requestsPerMinute && currentRequests + 1 > requestsPerMinute) {
+ // Find the oldest REQUEST record
+ const oldestRequest = state.usageRecords.find((r) => r.isRequest);
+ if (oldestRequest) {
+ rpmWait = Math.max(
+ 0,
+ oldestRequest.timestamp + 60 * 1000 - currentNow
+ );
+ }
+ }
+
+ // Check TPM
+ if (tokensPerMinute) {
+ // Apply a 10% safety buffer to the limit
+ const effectiveTokensPerMinute = Math.floor(tokensPerMinute * 0.9);
+
+ if (currentTokens + tokensCost > effectiveTokensPerMinute) {
+ // Check if we are ALREADY over limit for the next call
+ // We need to shed enough tokens so that (current - shed + cost) <= limit
+ // shed >= current + cost - limit
+ let tokensToShed =
+ currentTokens + tokensCost - effectiveTokensPerMinute;
+ let cumulativeTokens = 0;
+ for (const record of state.usageRecords) {
+ cumulativeTokens += record.tokensUsed;
+ if (cumulativeTokens >= tokensToShed) {
+ tpmWait = Math.max(
+ tpmWait,
+ record.timestamp + 60 * 1000 - currentNow
+ );
+ break;
+ }
+ }
+ }
+ }
+
+ const requiredWait = Math.max(rpmWait, tpmWait);
+ if (requiredWait <= 0) {
+ // RESERVE THE PERMIT HERE TO PREVENT RACE CONDITIONS
+ state.usageRecords.push({
+ timestamp: Date.now(),
+ tokensUsed: tokensCost,
+ isRequest: true,
+ });
+ break; // Permit acquired
+ }
+
+ logger.verbose(
+ `Rate limiting ${name}: Waiting ${requiredWait}ms (RPM wait: ${rpmWait}ms, TPM wait: ${tpmWait}ms)`
+ );
+ await new Promise((resolve) => setTimeout(resolve, requiredWait));
+ }
+ } finally {
+ this._waitingCount--;
+ }
+ }
+
+ recordUsage(
+ modelConfig: ModelConfiguration,
+ tokensUsed: number,
+ isRequest: boolean = true
+ ): void {
+ if (tokensUsed > 0 || isRequest) {
+ const state = this.getModelState(modelConfig.name);
+ state.usageRecords.push({
+ timestamp: Date.now(),
+ tokensUsed,
+ isRequest,
+ });
+ }
+ }
+}
+
+export const rateLimiter = new RateLimiter();
diff --git a/vendor/a2ui/specification/0.9/eval/src/types.ts b/vendor/a2ui/specification/0.9/eval/src/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6680b48162e3ea6ab8700db0df1fdf13208ce8b5
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/types.ts
@@ -0,0 +1,47 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import { TestPrompt } from "./prompts";
+
+export interface GeneratedResult {
+ modelName: string;
+ prompt: TestPrompt;
+ runNumber: number;
+ rawText?: string;
+ components?: any[];
+ latency: number;
+ error?: any;
+}
+
+export interface ValidatedResult extends GeneratedResult {
+ validationErrors: string[];
+}
+
+export type IssueSeverity =
+ | "minor"
+ | "significant"
+ | "critical"
+ | "criticalSchema";
+
+export interface EvaluatedResult extends ValidatedResult {
+ evaluationResult?: {
+ pass: boolean;
+ reason: string;
+ issues?: { issue: string; severity: IssueSeverity }[];
+ overallSeverity?: IssueSeverity;
+ evalPrompt?: string;
+ };
+}
diff --git a/vendor/a2ui/specification/0.9/eval/src/utils.ts b/vendor/a2ui/specification/0.9/eval/src/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1eea61081d658c2fa929b88c4cf3084d5e8928a4
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/utils.ts
@@ -0,0 +1,44 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+export function extractJsonFromMarkdown(markdown: string): any[] {
+ const jsonBlockRegex = /```json\s*([\s\S]*?)\s*```/g;
+ const matches = [...markdown.matchAll(jsonBlockRegex)];
+ const results: any[] = [];
+
+ for (const match of matches) {
+ if (match[1]) {
+ const content = match[1].trim();
+ // Try parsing as a single JSON object first
+ try {
+ results.push(JSON.parse(content));
+ } catch (error) {
+ // If that fails, try parsing as JSONL (line by line)
+ const lines = content.split("\n");
+ for (const line of lines) {
+ if (line.trim()) {
+ try {
+ results.push(JSON.parse(line));
+ } catch (e2) {
+ // Ignore invalid lines
+ }
+ }
+ }
+ }
+ }
+ }
+ return results;
+}
diff --git a/vendor/a2ui/specification/0.9/eval/src/validator.ts b/vendor/a2ui/specification/0.9/eval/src/validator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d2c0a2dcdd40945cb226b1d82dde773f7440a82a
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/src/validator.ts
@@ -0,0 +1,365 @@
+/*
+ Copyright 2025 Google LLC
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import Ajv from "ajv/dist/2020";
+import * as fs from "fs";
+import * as path from "path";
+import * as yaml from "js-yaml";
+
+import { GeneratedResult, ValidatedResult, IssueSeverity } from "./types";
+import { logger } from "./logger";
+
+export class Validator {
+ private ajv: Ajv;
+ private validateFn: any;
+
+ constructor(
+ private schemas: Record,
+ private outputDir?: string
+ ) {
+ this.ajv = new Ajv({ allErrors: true, strict: false }); // strict: false to be lenient with unknown keywords if any
+ for (const [name, schema] of Object.entries(schemas)) {
+ this.ajv.addSchema(schema, name);
+ }
+ this.validateFn = this.ajv.getSchema(
+ "https://a2ui.dev/specification/0.9/server_to_client.json"
+ );
+ }
+
+ async run(results: GeneratedResult[]): Promise {
+ logger.info(
+ `Starting Phase 2: Schema Validation (${results.length} items)`
+ );
+ const validatedResults: ValidatedResult[] = [];
+ let passedCount = 0;
+ let failedCount = 0;
+
+ // Phase 2 is fast (CPU bound), so we can just iterate.
+ // If we wanted to be fancy we could chunk it, but for < 1000 items it's instant.
+
+ for (const result of results) {
+ if (result.error || !result.components) {
+ validatedResults.push({ ...result, validationErrors: [] }); // Already failed generation
+ continue;
+ }
+
+ const errors: string[] = [];
+ const components = result.components;
+
+ // AJV Validation
+ // AJV Validation
+ if (this.ajv) {
+ for (const message of components) {
+ // Smart validation: check which key is present and validate against that specific definition
+ // to avoid noisy "oneOf" errors.
+ let validated = false;
+ const schemaUri =
+ "https://a2ui.dev/specification/0.9/server_to_client.json";
+
+ if (message.createSurface) {
+ validated = this.ajv.validate(
+ `${schemaUri}#/$defs/CreateSurfaceMessage`,
+ message
+ );
+ } else if (message.updateComponents) {
+ validated = this.ajv.validate(
+ `${schemaUri}#/$defs/UpdateComponentsMessage`,
+ message
+ );
+ } else if (message.updateDataModel) {
+ validated = this.ajv.validate(
+ `${schemaUri}#/$defs/UpdateDataModelMessage`,
+ message
+ );
+ } else if (message.deleteSurface) {
+ validated = this.ajv.validate(
+ `${schemaUri}#/$defs/DeleteSurfaceMessage`,
+ message
+ );
+ } else {
+ // Fallback to top-level validation if no known key matches (or if it's empty/invalid structure)
+ validated = this.validateFn(message);
+ }
+
+ if (!validated) {
+ errors.push(
+ ...(this.ajv.errors || []).map(
+ (err: any) => `${err.instancePath} ${err.message}`
+ )
+ );
+ }
+ }
+ }
+
+ // Custom Validation (Referential Integrity, etc.)
+ this.validateCustom(components, errors);
+
+ if (errors.length > 0) {
+ failedCount++;
+ if (this.outputDir) {
+ this.saveFailure(result, errors);
+ }
+ } else {
+ passedCount++;
+ }
+
+ validatedResults.push({
+ ...result,
+ validationErrors: errors,
+ });
+ }
+
+ logger.info(
+ `Phase 2: Validation Complete. Passed: ${passedCount}, Failed: ${failedCount}`
+ );
+ return validatedResults;
+ }
+
+ private saveFailure(result: GeneratedResult, errors: string[]) {
+ if (!this.outputDir) return;
+ const modelDir = path.join(
+ this.outputDir,
+ `output-${result.modelName.replace(/[\/:]/g, "_")}`
+ );
+ const detailsDir = path.join(modelDir, "details");
+ const failureData = {
+ pass: false,
+ reason: "Schema validation failure",
+ issues: errors.map((e) => ({
+ issue: e,
+ severity: "criticalSchema" as IssueSeverity,
+ })),
+ overallSeverity: "criticalSchema" as IssueSeverity,
+ };
+
+ fs.writeFileSync(
+ path.join(
+ detailsDir,
+ `${result.prompt.name}.${result.runNumber}.failed.yaml`
+ ),
+ yaml.dump(failureData)
+ );
+ }
+
+ private validateCustom(messages: any[], errors: string[]) {
+ let hasUpdateComponents = false;
+ let hasRootComponent = false;
+ const createdSurfaces = new Set();
+
+ for (const message of messages) {
+ if (message.updateComponents) {
+ hasUpdateComponents = true;
+ const surfaceId = message.updateComponents.surfaceId;
+ if (surfaceId && !createdSurfaces.has(surfaceId)) {
+ errors.push(
+ `updateComponents message received for surface '${surfaceId}' before createSurface message.`
+ );
+ }
+
+ this.validateUpdateComponents(message.updateComponents, errors);
+
+ // Check for root component in this message
+ if (message.updateComponents.components) {
+ for (const comp of message.updateComponents.components) {
+ if (comp.id === "root") {
+ hasRootComponent = true;
+ }
+ }
+ }
+ } else if (message.createSurface) {
+ this.validateCreateSurface(message.createSurface, errors);
+ if (message.createSurface.surfaceId) {
+ createdSurfaces.add(message.createSurface.surfaceId);
+ }
+ } else if (message.updateDataModel) {
+ this.validateUpdateDataModel(message.updateDataModel, errors);
+ } else if (message.deleteSurface) {
+ this.validateDeleteSurface(message.deleteSurface, errors);
+ } else {
+ errors.push(
+ `Unknown message type in output: ${JSON.stringify(message)}`
+ );
+ }
+ }
+
+ // Algorithmic check for root component
+ if (hasUpdateComponents && !hasRootComponent) {
+ errors.push(
+ "Missing root component: At least one 'updateComponents' message must contain a component with id: 'root'."
+ );
+ }
+ }
+
+ // ... Copied helper functions ...
+ private validateCreateSurface(data: any, errors: string[]) {
+ if (data.surfaceId === undefined) {
+ errors.push("createSurface must have a 'surfaceId' property.");
+ }
+ if (data.catalogId === undefined) {
+ errors.push("createSurface must have a 'catalogId' property.");
+ }
+ const allowed = ["surfaceId", "catalogId"];
+ for (const key in data) {
+ if (!allowed.includes(key)) {
+ errors.push(`createSurface has unexpected property: ${key}`);
+ }
+ }
+ }
+
+ private validateDeleteSurface(data: any, errors: string[]) {
+ if (data.surfaceId === undefined) {
+ errors.push("DeleteSurface must have a 'surfaceId' property.");
+ }
+ const allowed = ["surfaceId"];
+ for (const key in data) {
+ if (!allowed.includes(key)) {
+ errors.push(`DeleteSurface has unexpected property: ${key}`);
+ }
+ }
+ }
+
+ private validateUpdateComponents(data: any, errors: string[]) {
+ if (data.surfaceId === undefined) {
+ errors.push("UpdateComponents must have a 'surfaceId' property.");
+ }
+ if (!data.components || !Array.isArray(data.components)) {
+ errors.push("UpdateComponents must have a 'components' array.");
+ return;
+ }
+
+ const componentIds = new Set();
+ for (const c of data.components) {
+ const id = c.id;
+ if (id) {
+ if (componentIds.has(id)) {
+ errors.push(`Duplicate component ID found: ${id}`);
+ }
+ componentIds.add(id);
+ }
+
+ // Smart Component Validation
+ if (this.ajv && c.component) {
+ const componentType = c.component;
+ const schemaUri =
+ "https://a2ui.dev/specification/0.9/standard_catalog_definition.json";
+
+ const defRef = `${schemaUri}#/$defs/${componentType}`;
+
+ const valid = this.ajv.validate(defRef, c);
+ if (!valid) {
+ errors.push(
+ ...(this.ajv.errors || []).map(
+ (err: any) =>
+ `${err.instancePath} ${err.message} (in component '${
+ c.id || "unknown"
+ }')`
+ )
+ );
+ }
+ }
+ }
+
+ for (const component of data.components) {
+ this.validateComponent(component, componentIds, errors);
+ }
+ }
+
+ private validateUpdateDataModel(data: any, errors: string[]) {
+ // Schema validation handles types, required fields (surfaceId, op), and extra properties.
+ // We only need to validate the conditional requirement of 'value' based on 'op'.
+
+ if (data.op === "remove") {
+ if (data.value !== undefined) {
+ errors.push(
+ "updateDataModel 'value' property must not be present when op is 'remove'."
+ );
+ }
+ } else {
+ // op is 'add' or 'replace' (schema validates enum values)
+ if (data.value === undefined) {
+ errors.push(
+ `updateDataModel 'value' property is required when op is '${data.op}'.`
+ );
+ }
+ }
+ }
+
+ private validateComponent(
+ component: any,
+ allIds: Set,
+ errors: string[]
+ ) {
+ const id = component.id;
+ if (!id) {
+ errors.push(`Component is missing an 'id'.`);
+ return;
+ }
+
+ const componentType = component.component;
+ if (!componentType || typeof componentType !== "string") {
+ errors.push(`Component '${id}' is missing 'component' property.`);
+ return;
+ }
+
+ // Basic required checks that might be missed by AJV if it's lenient or if we want specific messages
+ // Actually AJV covers most of this, but the custom logic for 'children' and 'refs' is key.
+
+ const checkRefs = (ids: (string | undefined)[]) => {
+ for (const id of ids) {
+ if (id && !allIds.has(id)) {
+ errors.push(
+ `Component ${JSON.stringify(id)} references non-existent component ID.`
+ );
+ }
+ }
+ };
+
+ switch (componentType) {
+ case "Row":
+ case "Column":
+ case "List":
+ if (component.children) {
+ if (Array.isArray(component.children)) {
+ checkRefs(component.children);
+ } else if (
+ typeof component.children === "object" &&
+ component.children !== null
+ ) {
+ if (component.children.componentId) {
+ checkRefs([component.children.componentId]);
+ }
+ }
+ }
+ break;
+ case "Card":
+ checkRefs([component.child]);
+ break;
+ case "Tabs":
+ if (component.tabItems && Array.isArray(component.tabItems)) {
+ component.tabItems.forEach((tab: any) => {
+ checkRefs([tab.child]);
+ });
+ }
+ break;
+ case "Modal":
+ checkRefs([component.entryPointChild, component.contentChild]);
+ break;
+ case "Button":
+ checkRefs([component.child]);
+ break;
+ }
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/eval/tsconfig.json b/vendor/a2ui/specification/0.9/eval/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..cb2bc5954e7e96d541f15d43f03ee26dd307fc0a
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/eval/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "target": "es2020",
+ "module": "commonjs",
+ "outDir": "lib",
+ "rootDir": "src",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true
+ }
+}
\ No newline at end of file
diff --git a/vendor/a2ui/specification/0.9/json/client_to_server.json b/vendor/a2ui/specification/0.9/json/client_to_server.json
new file mode 100644
index 0000000000000000000000000000000000000000..27416ef1f9083bc706fb4fd333c231d93048de5e
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/json/client_to_server.json
@@ -0,0 +1,97 @@
+{
+ "title": "A2UI (Agent to UI) Client-to-Server Event Schema",
+ "description": "Describes a JSON payload for a client-to-server event message.",
+ "type": "object",
+ "minProperties": 1,
+ "maxProperties": 1,
+ "properties": {
+ "userAction": {
+ "type": "object",
+ "description": "Reports a user-initiated action from a component.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the action, taken from the component's action.name property."
+ },
+ "surfaceId": {
+ "type": "string",
+ "description": "The id of the surface where the event originated."
+ },
+ "sourceComponentId": {
+ "type": "string",
+ "description": "The id of the component that triggered the event."
+ },
+ "timestamp": {
+ "type": "string",
+ "format": "date-time",
+ "description": "An ISO 8601 timestamp of when the event occurred."
+ },
+ "context": {
+ "type": "object",
+ "description": "A JSON object containing the key-value pairs from the component's action.context, after resolving all data bindings.",
+ "additionalProperties": true
+ }
+ },
+ "required": [
+ "name",
+ "surfaceId",
+ "sourceComponentId",
+ "timestamp",
+ "context"
+ ]
+ },
+ "error": {
+ "description": "Reports a client-side error.",
+ "oneOf": [
+ {
+ "type": "object",
+ "title": "Validation Failed Error",
+ "properties": {
+ "code": {
+ "const": "VALIDATION_FAILED"
+ },
+ "surfaceId": {
+ "type": "string",
+ "description": "The id of the surface where the error occurred."
+ },
+ "path": {
+ "type": "string",
+ "description": "The JSON pointer to the field that failed validation (e.g. '/components/0/text')."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short one-sentence description of why validation failed."
+ }
+ },
+ "required": ["code", "path", "message", "surfaceId"]
+ },
+ {
+ "type": "object",
+ "title": "Generic Error",
+ "properties": {
+ "code": {
+ "not": {
+ "const": "VALIDATION_FAILED"
+ }
+ },
+ "message": {
+ "type": "string",
+ "description": "A short one-sentence description of why the error occurred."
+ },
+ "surfaceId": {
+ "type": "string",
+ "description": "The id of the surface where the error occurred."
+ }
+ },
+ "required": ["code", "surfaceId", "message"],
+ "additionalProperties": true
+ }
+ ]
+ }
+ },
+ "oneOf": [
+ { "required": ["userAction"] },
+ { "required": ["clientUiCapabilities"] },
+ { "required": ["error"] }
+ ]
+}
diff --git a/vendor/a2ui/specification/0.9/json/common_types.json b/vendor/a2ui/specification/0.9/json/common_types.json
new file mode 100644
index 0000000000000000000000000000000000000000..bae7d3662093a91ae00b7a49737f7b859e0b5a58
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/json/common_types.json
@@ -0,0 +1,120 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://a2ui.dev/specification/0.9/common_types.json",
+ "title": "A2UI Common Types",
+ "description": "Common type definitions used across A2UI schemas.",
+ "$defs": {
+ "stringOrPath": {
+ "description": "Represents a value that can be either a literal string or a path to a value in the data model.",
+ "oneOf": [
+ { "type": "string" },
+ {
+ "type": "object",
+ "properties": {
+ "path": { "type": "string" }
+ },
+ "required": ["path"],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "numberOrPath": {
+ "description": "Represents a value that can be either a literal number or a path to a value in the data model.",
+ "oneOf": [
+ { "type": "number" },
+ {
+ "type": "object",
+ "properties": {
+ "path": { "type": "string" }
+ },
+ "required": ["path"],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "booleanOrPath": {
+ "description": "Represents a value that can be either a literal boolean or a path to a value in the data model.",
+ "oneOf": [
+ { "type": "boolean" },
+ {
+ "type": "object",
+ "properties": {
+ "path": { "type": "string" }
+ },
+ "required": ["path"],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "stringArrayOrPath": {
+ "description": "Represents a value that can be either a literal array of strings or a path to a value in the data model.",
+ "oneOf": [
+ {
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ {
+ "type": "object",
+ "properties": {
+ "path": { "type": "string" }
+ },
+ "required": ["path"],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "id": {
+ "type": "string",
+ "description": "The unique identifier for this component."
+ },
+ "ComponentCommon": {
+ "type": "object",
+ "properties": {
+ "id": { "$ref": "#/$defs/id" },
+ "weight": {
+ "type": "number",
+ "description": "The relative weight of this component within a Row or Column. This is similar to the CSS 'flex-grow' property."
+ }
+ },
+ "required": ["id"]
+ },
+ "contextValue": {
+ "description": "A value that can be a string, number, boolean, or a path to a value.",
+ "oneOf": [
+ { "type": "string" },
+ { "type": "number" },
+ { "type": "boolean" },
+ {
+ "type": "object",
+ "properties": { "path": { "type": "string" } },
+ "required": ["path"],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "childrenProperty": {
+ "oneOf": [
+ {
+ "type": "array",
+ "items": { "type": "string" },
+ "description": "A static list of child component IDs."
+ },
+ {
+ "type": "object",
+ "description": "A template for generating a dynamic list of children from a data model list. The `componentId` is the component to use as a template.",
+ "properties": {
+ "componentId": {
+ "$ref": "#/$defs/id"
+ },
+ "path": {
+ "type": "string",
+ "description": "The path to the list of component property objects in the data model."
+ }
+ },
+ "required": ["componentId", "path"],
+ "additionalProperties": false
+ }
+ ]
+ }
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/json/contact_form_example.jsonl b/vendor/a2ui/specification/0.9/json/contact_form_example.jsonl
new file mode 100644
index 0000000000000000000000000000000000000000..deacae03c9a6b6ea5e5db326034bc0b6b20e9f9c
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/json/contact_form_example.jsonl
@@ -0,0 +1,3 @@
+{"createSurface":{"surfaceId":"contact_form_1","catalogId":"https://a2ui.dev/specification/0.9/standard_catalog_definition.json"}}
+{"updateComponents":{"surfaceId":"contact_form_1","components":[{"id":"root","component":"Column","children":["first_name_label","first_name_field","last_name_label","last_name_field","email_label","email_field","phone_label","phone_field","notes_label","notes_field","submit_button"]},{"id":"first_name_label","component":"Text","text":"First Name"},{"id":"first_name_field","component":"TextField","label":"First Name","text":{"path":"/contact/firstName"},"usageHint":"shortText"},{"id":"last_name_label","component":"Text","text":"Last Name"},{"id":"last_name_field","component":"TextField","label":"Last Name","text":{"path":"/contact/lastName"},"usageHint":"shortText"},{"id":"email_label","component":"Text","text":"Email"},{"id":"email_field","component":"TextField","label":"Email","text":{"path":"/contact/email"},"usageHint":"shortText"},{"id":"phone_label","component":"Text","text":"Phone"},{"id":"phone_field","component":"TextField","label":"Phone","text":{"path":"/contact/phone"},"usageHint":"shortText"},{"id":"notes_label","component":"Text","text":"Notes"},{"id":"notes_field","component":"TextField","label":"Notes","text":{"path":"/contact/notes"},"usageHint":"longText"},{"id":"submit_button_label","component":"Text","text":"Submit"},{"id":"submit_button","component":"Button","child":"submit_button_label","action":{"name":"submitContactForm"}}]}}
+{"updateDataModel": {"surfaceId": "contact_form_1", "path": "/contact", "op": "replace", "value": {"firstName": "John", "lastName": "Doe", "email": "john.doe@example.com"}}}
diff --git a/vendor/a2ui/specification/0.9/json/server_to_client.json b/vendor/a2ui/specification/0.9/json/server_to_client.json
new file mode 100644
index 0000000000000000000000000000000000000000..c06063943650867cad1ba09830ae6fba4d8aa99b
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/json/server_to_client.json
@@ -0,0 +1,114 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://a2ui.dev/specification/0.9/server_to_client.json",
+ "title": "A2UI Message Schema",
+ "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces.",
+ "type": "object",
+ "oneOf": [
+ { "$ref": "#/$defs/CreateSurfaceMessage" },
+ { "$ref": "#/$defs/UpdateComponentsMessage" },
+ { "$ref": "#/$defs/UpdateDataModelMessage" },
+ { "$ref": "#/$defs/DeleteSurfaceMessage" }
+ ],
+ "$defs": {
+ "CreateSurfaceMessage": {
+ "properties": {
+ "createSurface": {
+ "type": "object",
+ "description": "Signals the client to create a new surface and begin rendering it. When this message is sent, the client will expect 'updateComponents' and/or 'updateDataModel' messages for the same surfaceId that define the component tree.",
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be rendered."
+ },
+ "catalogId": {
+ "title": "Catalog ID",
+ "description": "A string that uniquely identifies this catalog. It is recommended to prefix this with an internet domain that you own, to avoid conflicts e.g. mycompany.com:somecatalog'.",
+ "type": "string"
+ }
+ },
+ "required": ["surfaceId", "catalogId"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["createSurface"],
+ "additionalProperties": false
+ },
+ "UpdateComponentsMessage": {
+ "properties": {
+ "updateComponents": {
+ "type": "object",
+ "description": "Updates a surface with a new set of components. This message can be sent multiple times to update the component tree of an existing surface. One of the components in one of the components lists MUST have an 'id' of 'root' to serve as the root of the component tree. The createSurface message MUST have been previously sent with the 'catalogId' that is in this message.",
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be updated."
+ },
+
+ "components": {
+ "type": "array",
+ "description": "A list containing all UI components for the surface.",
+ "minItems": 1,
+ "items": {
+ "$ref": "standard_catalog_definition.json#/$defs/anyComponent"
+ }
+ }
+ },
+ "required": ["surfaceId", "components"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["updateComponents"],
+ "additionalProperties": false
+ },
+ "UpdateDataModelMessage": {
+ "properties": {
+ "updateDataModel": {
+ "type": "object",
+ "description": "Updates the data model for an existing surface. This message can be sent multiple times to update the data model. The createSurface message MUST have been previously sent with the 'catalogId' that is in this message.",
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface this data model update applies to."
+ },
+ "path": {
+ "type": "string",
+ "description": "An optional path to a location within the data model (e.g., '/user/name'). If omitted, or set to '/', refers to the entire data model."
+ },
+ "op": {
+ "type": "string",
+ "description": "The operation to perform on the data model. Defaults to 'replace' if omitted.",
+ "enum": ["add", "replace", "remove"]
+ },
+ "value": {
+ "description": "The data to be updated in the data model. Required for 'add' and 'replace' operations. Not allowed for 'remove' operation.",
+ "additionalProperties": true
+ }
+ },
+ "required": ["surfaceId"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["updateDataModel"],
+ "additionalProperties": false
+ },
+ "DeleteSurfaceMessage": {
+ "properties": {
+ "deleteSurface": {
+ "type": "object",
+ "description": "Signals the client to delete the surface identified by 'surfaceId'. The createSurface message MUST have been previously sent with the 'catalogId' that is in this message.",
+ "properties": {
+ "surfaceId": {
+ "type": "string",
+ "description": "The unique identifier for the UI surface to be deleted."
+ }
+ },
+ "required": ["surfaceId"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["deleteSurface"],
+ "additionalProperties": false
+ }
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/json/standard_catalog_definition.json b/vendor/a2ui/specification/0.9/json/standard_catalog_definition.json
new file mode 100644
index 0000000000000000000000000000000000000000..1f05127c9742ea5ecb3d3fd28cd57be1e19287ed
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/json/standard_catalog_definition.json
@@ -0,0 +1,638 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://a2ui.dev/specification/0.9/standard_catalog_definition.json",
+ "title": "A2UI Component Catalog",
+ "description": "Definitions for the standard catalog of A2UI components.",
+ "$defs": {
+ "Theme": {
+ "type": "object",
+ "description": "Theming information for the UI.",
+ "properties": {
+ "font": {
+ "type": "string",
+ "description": "The primary font for the UI."
+ },
+ "primaryColor": {
+ "type": "string",
+ "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ "additionalProperties": false
+ },
+ "anyComponent": {
+ "oneOf": [
+ { "$ref": "#/$defs/Text" },
+ { "$ref": "#/$defs/Image" },
+ { "$ref": "#/$defs/Icon" },
+ { "$ref": "#/$defs/Video" },
+ { "$ref": "#/$defs/AudioPlayer" },
+ { "$ref": "#/$defs/Row" },
+ { "$ref": "#/$defs/Column" },
+ { "$ref": "#/$defs/List" },
+ { "$ref": "#/$defs/Card" },
+ { "$ref": "#/$defs/Tabs" },
+ { "$ref": "#/$defs/Divider" },
+ { "$ref": "#/$defs/Modal" },
+ { "$ref": "#/$defs/Button" },
+ { "$ref": "#/$defs/CheckBox" },
+ { "$ref": "#/$defs/TextField" },
+ { "$ref": "#/$defs/DateTimeInput" },
+ { "$ref": "#/$defs/ChoicePicker" },
+ { "$ref": "#/$defs/Slider" }
+ ],
+ "discriminator": {
+ "propertyName": "component"
+ }
+ },
+ "Text": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Text" },
+ "text": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The text content to display. While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation."
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the base text style.",
+ "enum": ["h1", "h2", "h3", "h4", "h5", "caption", "body"]
+ }
+ },
+ "required": ["component", "text"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Image": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Image" },
+ "url": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The URL of the image to display."
+ },
+ "fit": {
+ "type": "string",
+ "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.",
+ "enum": ["contain", "cover", "fill", "none", "scale-down"]
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for the image size and style.",
+ "enum": [
+ "icon",
+ "avatar",
+ "smallFeature",
+ "mediumFeature",
+ "largeFeature",
+ "header"
+ ]
+ }
+ },
+ "required": ["component", "url"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Icon": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Icon" },
+ "name": {
+ "description": "The name of the icon to display.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "accountCircle",
+ "add",
+ "arrowBack",
+ "arrowForward",
+ "attachFile",
+ "calendarToday",
+ "call",
+ "camera",
+ "check",
+ "close",
+ "delete",
+ "download",
+ "edit",
+ "event",
+ "error",
+ "fastForward",
+ "favorite",
+ "favoriteOff",
+ "folder",
+ "help",
+ "home",
+ "info",
+ "locationOn",
+ "lock",
+ "lockOpen",
+ "mail",
+ "menu",
+ "moreVert",
+ "moreHoriz",
+ "notificationsOff",
+ "notifications",
+ "pause",
+ "payment",
+ "person",
+ "phone",
+ "photo",
+ "play",
+ "print",
+ "refresh",
+ "rewind",
+ "search",
+ "send",
+ "settings",
+ "share",
+ "shoppingCart",
+ "skipNext",
+ "skipPrevious",
+ "star",
+ "starHalf",
+ "starOff",
+ "stop",
+ "upload",
+ "visibility",
+ "visibilityOff",
+ "volumeDown",
+ "volumeMute",
+ "volumeOff",
+ "volumeUp",
+ "warning"
+ ]
+ },
+ {
+ "type": "object",
+ "properties": {
+ "path": { "type": "string" }
+ },
+ "required": ["path"],
+ "additionalProperties": false
+ }
+ ]
+ }
+ },
+ "required": ["component", "name"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Video": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Video" },
+ "url": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The URL of the video to display."
+ }
+ },
+ "required": ["component", "url"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "AudioPlayer": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "AudioPlayer" },
+ "url": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The URL of the audio to be played."
+ },
+ "description": {
+ "description": "A description of the audio, such as a title or summary.",
+ "$ref": "common_types.json#/$defs/stringOrPath"
+ }
+ },
+ "required": ["component", "url"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Row": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "description": "A layout component that arranges its children horizontally. To create a grid layout, nest Columns within this Row.",
+ "properties": {
+ "component": { "const": "Row" },
+ "children": {
+ "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list. Children cannot be defined inline, they must be referred to by ID.",
+ "$ref": "common_types.json#/$defs/childrenProperty"
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (horizontally). Use 'spaceBetween' to push items to the edges, or 'start'/'end'/'center' to pack them together.",
+ "enum": [
+ "center",
+ "end",
+ "spaceAround",
+ "spaceBetween",
+ "spaceEvenly",
+ "start",
+ "stretch"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (vertically). This is similar to the CSS 'align-items' property, but uses camelCase values (e.g., 'start').",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["component", "children"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Column": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "description": "A layout component that arranges its children vertically. To create a grid layout, nest Rows within this Column.",
+ "properties": {
+ "component": { "const": "Column" },
+ "children": {
+ "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list. Children cannot be defined inline, they must be referred to by ID.",
+ "$ref": "common_types.json#/$defs/childrenProperty"
+ },
+ "distribution": {
+ "type": "string",
+ "description": "Defines the arrangement of children along the main axis (vertically). Use 'spaceBetween' to push items to the edges (e.g. header at top, footer at bottom), or 'start'/'end'/'center' to pack them together.",
+ "enum": [
+ "start",
+ "center",
+ "end",
+ "spaceBetween",
+ "spaceAround",
+ "spaceEvenly",
+ "stretch"
+ ]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis (horizontally). This is similar to the CSS 'align-items' property.",
+ "enum": ["center", "end", "start", "stretch"]
+ }
+ },
+ "required": ["component", "children"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "List": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "List" },
+ "children": {
+ "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list.",
+ "$ref": "common_types.json#/$defs/childrenProperty"
+ },
+ "direction": {
+ "type": "string",
+ "description": "The direction in which the list items are laid out.",
+ "enum": ["vertical", "horizontal"]
+ },
+ "alignment": {
+ "type": "string",
+ "description": "Defines the alignment of children along the cross axis.",
+ "enum": ["start", "center", "end", "stretch"]
+ }
+ },
+ "required": ["component", "children"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Card": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Card" },
+ "child": {
+ "type": "string",
+ "description": "The ID of the single child component to be rendered inside the card. To display multiple elements, you MUST wrap them in a layout component (like Column or Row) and pass that container's ID here. Do NOT pass multiple IDs or a non-existent ID. Do NOT define the child component inline."
+ }
+ },
+ "required": ["component", "child"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Tabs": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Tabs" },
+ "tabItems": {
+ "type": "array",
+ "description": "An array of objects, where each object defines a tab with a title and a child component.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "title": {
+ "description": "The tab title.",
+ "$ref": "common_types.json#/$defs/stringOrPath"
+ },
+ "child": {
+ "type": "string",
+ "description": "The ID of the child component. Do NOT define the component inline."
+ }
+ },
+ "required": ["title", "child"],
+ "additionalProperties": false
+ }
+ }
+ },
+ "required": ["component", "tabItems"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Divider": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Divider" },
+ "axis": {
+ "type": "string",
+ "description": "The orientation of the divider.",
+ "enum": ["horizontal", "vertical"]
+ }
+ },
+ "required": ["component"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Modal": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Modal" },
+ "entryPointChild": {
+ "type": "string",
+ "description": "The ID of the component that opens the modal when interacted with (e.g., a button). Do NOT define the component inline."
+ },
+ "contentChild": {
+ "type": "string",
+ "description": "The ID of the component to be displayed inside the modal. Do NOT define the component inline."
+ }
+ },
+ "required": ["component", "entryPointChild", "contentChild"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Button": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "Button" },
+ "child": {
+ "type": "string",
+ "description": "The ID of the child component. Use a 'Text' component for a labeled button. Only use an 'Icon' if the requirements explicitly ask for an icon-only button. Do NOT define the child component inline."
+ },
+ "primary": {
+ "type": "boolean",
+ "description": "Indicates if this button should be styled as the primary action."
+ },
+ "action": {
+ "type": "object",
+ "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.",
+ "properties": {
+ "name": { "type": "string" },
+ "context": {
+ "type": "object",
+ "description": "A JSON object containing the key-value pairs for the action context. Values can be literals or paths. Use literal values unless the value must be dynamically bound to the data model. Do NOT use paths for static IDs.",
+ "additionalProperties": {
+ "$ref": "common_types.json#/$defs/contextValue"
+ }
+ }
+ },
+ "required": ["name"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["component", "child", "action"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "CheckBox": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "CheckBox" },
+ "label": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The text to display next to the checkbox."
+ },
+ "value": {
+ "$ref": "common_types.json#/$defs/booleanOrPath",
+ "description": "The current state of the checkbox (true for checked, false for unchecked)."
+ }
+ },
+ "required": ["component", "label", "value"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "TextField": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "TextField" },
+ "label": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The text label for the input field."
+ },
+ "text": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The value of the text field."
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "The type of input field to display.",
+ "enum": ["longText", "number", "shortText", "obscured"]
+ },
+ "validationRegexp": {
+ "type": "string",
+ "description": "A regular expression used for client-side validation of the input."
+ }
+ },
+ "required": ["component", "label"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "DateTimeInput": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": { "const": "DateTimeInput" },
+ "value": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The selected date and/or time value in ISO 8601 format. If not yet set, initialize with an empty string."
+ },
+ "enableDate": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a date."
+ },
+ "enableTime": {
+ "type": "boolean",
+ "description": "If true, allows the user to select a time."
+ },
+ "outputFormat": {
+ "type": "string",
+ "description": "The desired format for the output string after a date or time is selected."
+ },
+ "label": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The text label for the input field."
+ }
+ },
+ "required": ["component", "value"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "ChoicePicker": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "description": "A component that allows selecting one or more options from a list.",
+ "properties": {
+ "component": {
+ "const": "ChoicePicker"
+ },
+ "label": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The label for the group of options."
+ },
+ "usageHint": {
+ "type": "string",
+ "description": "A hint for how the choice picker should be displayed and behave.",
+ "enum": ["multipleSelection", "mutuallyExclusive"]
+ },
+ "options": {
+ "type": "array",
+ "description": "The list of available options to choose from.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "label": {
+ "description": "The text to display for this option.",
+ "$ref": "common_types.json#/$defs/stringOrPath"
+ },
+ "value": {
+ "type": "string",
+ "description": "The stable value associated with this option."
+ }
+ },
+ "required": ["label", "value"],
+ "additionalProperties": false
+ }
+ },
+ "value": {
+ "$ref": "common_types.json#/$defs/stringArrayOrPath",
+ "description": "The list of currently selected values. This should be bound to a string array in the data model."
+ }
+ },
+ "required": ["component", "options", "value", "usageHint"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "Slider": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "common_types.json#/$defs/ComponentCommon" },
+ {
+ "type": "object",
+ "properties": {
+ "component": {
+ "const": "Slider"
+ },
+ "label": {
+ "$ref": "common_types.json#/$defs/stringOrPath",
+ "description": "The label for the slider."
+ },
+ "min": {
+ "type": "number",
+ "description": "The minimum value of the slider."
+ },
+ "max": {
+ "type": "number",
+ "description": "The maximum value of the slider."
+ },
+ "value": {
+ "$ref": "common_types.json#/$defs/numberOrPath",
+ "description": "The current value of the slider."
+ }
+ },
+ "required": ["component", "value"]
+ }
+ ],
+ "unevaluatedProperties": false
+ }
+ }
+}
diff --git a/vendor/a2ui/specification/0.9/json/standard_catalog_rules.txt b/vendor/a2ui/specification/0.9/json/standard_catalog_rules.txt
new file mode 100644
index 0000000000000000000000000000000000000000..33e601348e587d7c08b171ba363d212c3b99b4f1
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/json/standard_catalog_rules.txt
@@ -0,0 +1,5 @@
+**REQUIRED PROPERTIES:** You MUST include ALL required properties for every component, even if they are inside a template or will be bound to data.
+- For 'Text', you MUST provide 'text'. If dynamic, use { "path": "..." }.
+- For 'Image', you MUST provide 'url'. If dynamic, use { "path": "..." }.
+- For 'Button', you MUST provide 'action'.
+- For 'TextField', 'CheckBox', etc., you MUST provide 'label'.
diff --git a/vendor/a2ui/specification/0.9/validate.sh b/vendor/a2ui/specification/0.9/validate.sh
new file mode 100644
index 0000000000000000000000000000000000000000..a73a91e1f7d15f880cc99528ed974f3ee5bc6187
--- /dev/null
+++ b/vendor/a2ui/specification/0.9/validate.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+# Copyright 2025 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+SCHEMA_DIR="/Users/gspencer/code/a2ui/specification/0.9"
+SERVER_SCHEMA="${SCHEMA_DIR}/server_to_client.json"
+COMMON_TYPES="${SCHEMA_DIR}/common_types.json"
+COMPONENT_CATALOG="${SCHEMA_DIR}/component_catalog.json"
+EXAMPLE_FILE="${SCHEMA_DIR}/contact_form_example.jsonl"
+TEMP_FILE="${SCHEMA_DIR}/temp_message.json"
+
+while read -r line; do
+ echo "$line" | jq '.' > "${TEMP_FILE}"
+ if [ $? -ne 0 ]; then
+ echo "jq failed to parse line: $line"
+ continue
+ fi
+ ajv validate --verbose -s "${SERVER_SCHEMA}" -r "${COMMON_TYPES}" -r "${COMPONENT_CATALOG}" --spec=draft2020 -d "${TEMP_FILE}"
+ if [ $? -ne 0 ]; then
+ echo "Validation failed for line: $line"
+ fi
+done < "${EXAMPLE_FILE}"
+
+rm "${TEMP_FILE}"
+
+echo "Validation complete."