@meshmakers/octo-ai-console 3.3.1190
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshmakers-octo-ai-console.mjs","sources":["../../../../projects/meshmakers/octo-ai-console/src/lib/services/ai-adapter-client.service.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/services/ai-session-stream.service.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/services/ai-adapter-options.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-job-status-badge/ai-job-status-badge.component.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-job-status-badge/ai-job-status-badge.component.html","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-session-list/ai-session-list.component.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-session-list/ai-session-list.component.html","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-chat-stream/ai-chat-stream.component.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-chat-stream/ai-chat-stream.component.html","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-tool-call/ai-tool-call.component.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-tool-call/ai-tool-call.component.html","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-approval-modal/ai-approval-modal.component.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-approval-modal/ai-approval-modal.component.html","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-quota-indicator/ai-quota-indicator.component.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-quota-indicator/ai-quota-indicator.component.html","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-credential-ticket-issue/ai-credential-ticket-issue.component.ts","../../../../projects/meshmakers/octo-ai-console/src/lib/components/ai-credential-ticket-issue/ai-credential-ticket-issue.component.html","../../../../projects/meshmakers/octo-ai-console/src/public-api.ts","../../../../projects/meshmakers/octo-ai-console/src/meshmakers-octo-ai-console.ts"],"sourcesContent":["import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AI_ADAPTER_OPTIONS } from './ai-adapter-options';\nimport {\n AiSessionDto,\n CreateSessionRequestDto,\n CreateSessionResponseDto,\n} from '../models/ai-session';\nimport { AiSessionEventDto } from '../models/ai-session-event';\nimport { AiApprovalDecisionDto } from '../models/ai-approval';\nimport {\n IssueAiCredentialTicketRequestDto,\n IssueAiCredentialTicketResponseDto,\n} from '../models/ai-credential-ticket';\n\n/**\n * Typed REST client for the AI Adapter's session endpoints. Every method maps\n * 1:1 to a controller route on the C# side\n * (`src/AiServices/TenantApi/v1/Controllers/SessionsController.cs`).\n *\n * The service does NOT cache responses or hold session state — each call is a\n * pure pass-through to `HttpClient`. Components that need a derived view (e.g.\n * a session list with status counts) should compose over the returned\n * observables themselves; that keeps the client free of UI concerns and lets\n * host apps mix Apollo / GraphQL state in the same component without dueling\n * caches.\n */\n/**\n * Not `providedIn: 'root'` — `AI_ADAPTER_OPTIONS` is provided per-route in host\n * apps (the tenant id is read from the route param, which the root injector\n * doesn't see). A root-provided service would resolve through the root injector\n * and fail with NG0201 on `AI_ADAPTER_OPTIONS`. Standalone components that\n * inject this service pick up the route-level provider via the element\n * injector hierarchy.\n */\n@Injectable()\nexport class AiAdapterClientService {\n private readonly http = inject(HttpClient);\n private readonly options = inject(AI_ADAPTER_OPTIONS);\n\n /**\n * `GET /{tenantId}/v1/sessions` — list all sessions for the configured tenant.\n * Optional `status` filter narrows to one lifecycle state when present.\n */\n listSessions(status?: string): Observable<AiSessionDto[]> {\n const url = `${this.tenantBase()}/sessions`;\n let params = new HttpParams();\n if (status) {\n params = params.set('status', status);\n }\n return this.http.get<AiSessionDto[]>(url, { params });\n }\n\n /** `GET /{tenantId}/v1/sessions/{sessionId}` — single session by rtId. */\n getSession(sessionId: string): Observable<AiSessionDto> {\n return this.http.get<AiSessionDto>(\n `${this.tenantBase()}/sessions/${encodeURIComponent(sessionId)}`,\n );\n }\n\n /**\n * `POST /{tenantId}/v1/sessions` — start a new session. Returns the persisted\n * session plus the quota gate's decision so the caller can render either a\n * \"Running\" pill or a \"Queued (n)\" pill without a second round-trip.\n */\n createSession(\n request: CreateSessionRequestDto,\n ): Observable<CreateSessionResponseDto> {\n return this.http.post<CreateSessionResponseDto>(\n `${this.tenantBase()}/sessions`,\n request,\n );\n }\n\n /**\n * `POST /{tenantId}/v1/sessions/{sessionId}/cancel` — request graceful\n * cancellation; the orchestrator transitions the session to `Cancelled`\n * once the worker has acknowledged.\n */\n cancelSession(sessionId: string): Observable<AiSessionDto> {\n return this.http.post<AiSessionDto>(\n `${this.tenantBase()}/sessions/${encodeURIComponent(sessionId)}/cancel`,\n null,\n );\n }\n\n /**\n * `GET /{tenantId}/v1/sessions/{sessionId}/events?sinceSequence=N` — replay\n * persisted events for a session. UI uses this on reconnect to backfill any\n * events SignalR missed while disconnected (drives the resume-from-sequence\n * path in {@link AiSessionStreamService}).\n */\n listEvents(\n sessionId: string,\n sinceSequence?: number,\n ): Observable<AiSessionEventDto[]> {\n const url = `${this.tenantBase()}/sessions/${encodeURIComponent(sessionId)}/events`;\n let params = new HttpParams();\n if (sinceSequence != null) {\n params = params.set('sinceSequence', sinceSequence.toString());\n }\n return this.http.get<AiSessionEventDto[]>(url, { params });\n }\n\n /**\n * `POST /{tenantId}/v1/sessions/{sessionId}/approvals/{requestId}` — submit\n * the user's decision on a paused approval gate. Server fans\n * `OnApprovalDecidedAsync` to every connection on the session.\n */\n decideApproval(\n sessionId: string,\n requestId: string,\n decision: AiApprovalDecisionDto,\n ): Observable<void> {\n return this.http.post<void>(\n `${this.tenantBase()}/sessions/${encodeURIComponent(sessionId)}` +\n `/approvals/${encodeURIComponent(requestId)}`,\n decision,\n );\n }\n\n /**\n * `POST /{tenantId}/v1/credentials/tickets` — mint a one-time credential-\n * registration ticket (#4133). The admin sees the plaintext code once in\n * the response; the server stores only the SHA-256 hash. The matching\n * redemption call (`POST /v1/credentials/tickets/redeem`) is anonymous and\n * NOT in this client because the redeemer is by design a different person\n * on a different machine — they use the bastion CLI, not the Studio.\n */\n issueCredentialTicket(\n request: IssueAiCredentialTicketRequestDto,\n ): Observable<IssueAiCredentialTicketResponseDto> {\n return this.http.post<IssueAiCredentialTicketResponseDto>(\n `${this.tenantBase()}/credentials/tickets`,\n request,\n );\n }\n\n private tenantBase(): string {\n return `${this.options.baseUrl}/${encodeURIComponent(this.options.tenantId)}/v1`;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\nimport {\n AI_ADAPTER_OPTIONS,\n AI_SESSION_STREAM_CONNECTION_FACTORY,\n AiHubConnectionLike,\n} from './ai-adapter-options';\nimport { AiAdapterClientService } from './ai-adapter-client.service';\nimport {\n AiSessionEventDto,\n AiSessionStatusChangedDto,\n} from '../models/ai-session-event';\nimport {\n AiApprovalDecidedDto,\n AiApprovalRequestedDto,\n} from '../models/ai-approval';\nimport { AiQuotaWarningDto } from '../models/ai-quota';\n\n/**\n * One open SignalR connection's worth of streams. Sessions get one\n * `SessionStream` per `streamSession()` call; closing the returned subscription\n * tears the connection down.\n */\nexport interface AiSessionStream {\n /** Stream-json lines plus orchestrator markers, ordered by `sequence`. */\n readonly events$: Observable<AiSessionEventDto>;\n /** Lifecycle transitions for the session. */\n readonly statusChanges$: Observable<AiSessionStatusChangedDto>;\n /** Approval gate fired — UI opens the modal. */\n readonly approvalsRequested$: Observable<AiApprovalRequestedDto>;\n /** Approval resolved — UI dismisses the modal in every tab. */\n readonly approvalsDecided$: Observable<AiApprovalDecidedDto>;\n /** Tenant-wide quota threshold crossed — UI renders a banner. */\n readonly quotaWarnings$: Observable<AiQuotaWarningDto>;\n\n /** Tear down the underlying SignalR connection and complete all observables. */\n disconnect(): void;\n}\n\n/**\n * Internal wrapper around the SignalR connection. The library does not pin a\n * SignalR version — host applications inject a `HubConnectionBuilder` they\n * already use, which keeps the library agnostic of the\n * `@microsoft/signalr` major version line (six and seven have diverged on the\n * `withAutomaticReconnect()` defaults).\n *\n * For now the connection is constructed deferred — `streamSession` builds it on\n * demand so the host can defer the SignalR JS bundle behind a route lazy-load.\n * Phase-1 ships a stub backed by `ReplaySubject` so demo apps can drive\n * components without a live hub; the real connection wiring lives behind a\n * `connectionFactory` provider the host overrides.\n */\n/**\n * Not `providedIn: 'root'` — see <see cref=\"AiAdapterClientService\"/> for the\n * rationale: `AI_ADAPTER_OPTIONS` is a per-route token, the root injector\n * cannot resolve it. Element-level injection picks up the route-level provider.\n */\n@Injectable()\nexport class AiSessionStreamService {\n private readonly options = inject(AI_ADAPTER_OPTIONS);\n private readonly client = inject(AiAdapterClientService);\n private readonly connectionFactory = inject(\n AI_SESSION_STREAM_CONNECTION_FACTORY,\n { optional: true },\n );\n\n /**\n * Open a streaming session. Returns the per-stream subjects and a\n * `disconnect()` closer. When the host has provided an\n * {@link AI_SESSION_STREAM_CONNECTION_FACTORY}, a live SignalR connection is\n * built against {@link hubUrl} and the five hub callbacks\n * (`OnSessionEventAsync`, `OnSessionStatusChangedAsync`,\n * `OnApprovalRequestedAsync`, `OnApprovalDecidedAsync`, `OnQuotaWarningAsync`)\n * are routed into the matching subject. Without a factory, the service\n * degrades to REST-only backfill — the original Phase-1 stub contract.\n *\n * Tracking the highest sequence we've emitted lets the host reconnect after a\n * network blip by passing `sinceSequence` to {@link replay} (the SignalR\n * `onreconnected` hook fires that with the highest seen sequence).\n */\n streamSession(sessionId: string): AiSessionStream {\n const events$ = new ReplaySubject<AiSessionEventDto>(256);\n const statusChanges$ = new Subject<AiSessionStatusChangedDto>();\n const approvalsRequested$ = new Subject<AiApprovalRequestedDto>();\n const approvalsDecided$ = new Subject<AiApprovalDecidedDto>();\n const quotaWarnings$ = new Subject<AiQuotaWarningDto>();\n\n // Backfill any persisted events the hub-connect process would have missed\n // — REST returns the full history up to \"now\", and the live channel takes\n // it from there. The combination is at-least-once with deterministic\n // ordering courtesy of the persisted `sequence` field.\n let highestSequence = 0;\n const backfill = this.client.listEvents(sessionId).subscribe({\n next: (events) => {\n for (const event of events) {\n highestSequence = Math.max(highestSequence, event.sequence);\n events$.next(event);\n }\n },\n });\n\n let connection: AiHubConnectionLike | null = null;\n if (this.connectionFactory) {\n connection = this.connectionFactory(this.hubUrl);\n }\n\n if (connection) {\n const conn = connection;\n conn.on('OnSessionEventAsync', (payload) => {\n const event = payload as AiSessionEventDto;\n highestSequence = Math.max(highestSequence, event.sequence ?? 0);\n events$.next(event);\n });\n conn.on('OnSessionStatusChangedAsync', (payload) => {\n statusChanges$.next(payload as AiSessionStatusChangedDto);\n });\n conn.on('OnApprovalRequestedAsync', (payload) => {\n approvalsRequested$.next(payload as AiApprovalRequestedDto);\n });\n conn.on('OnApprovalDecidedAsync', (payload) => {\n approvalsDecided$.next(payload as AiApprovalDecidedDto);\n });\n conn.on('OnQuotaWarningAsync', (payload) => {\n quotaWarnings$.next(payload as AiQuotaWarningDto);\n });\n conn.onreconnected(() => {\n // Pull anything we missed during the disconnect window so the\n // events$ stream stays gap-free without the caller having to do\n // their own bookkeeping.\n this.replay(sessionId, highestSequence, events$);\n });\n\n // Start the connection, then ask the hub to scope this connection's\n // group membership to the session. Failures are intentionally swallowed\n // — backfill stays valid and the UI degrades to REST-only instead of\n // crashing.\n conn\n .start()\n .then(() => conn.invoke('SubscribeToSessionAsync', sessionId))\n .catch(() => {\n /* hub start / subscribe failed — REST backfill still serves the UI */\n });\n }\n\n return {\n events$: events$.asObservable(),\n statusChanges$: statusChanges$.asObservable(),\n approvalsRequested$: approvalsRequested$.asObservable(),\n approvalsDecided$: approvalsDecided$.asObservable(),\n quotaWarnings$: quotaWarnings$.asObservable(),\n disconnect: () => {\n backfill.unsubscribe();\n if (connection) {\n // Best-effort — `stop()` may reject during teardown; the subjects\n // get completed regardless so consumers see clean termination.\n connection.stop().catch(() => undefined);\n connection = null;\n }\n events$.complete();\n statusChanges$.complete();\n approvalsRequested$.complete();\n approvalsDecided$.complete();\n quotaWarnings$.complete();\n },\n };\n }\n\n /**\n * Backfill missing events from a known sequence number and push them into\n * the host's existing stream. Used by a SignalR `onreconnected` hook the\n * host wires up.\n */\n replay(\n sessionId: string,\n sinceSequence: number,\n sink: Subject<AiSessionEventDto> | ReplaySubject<AiSessionEventDto>,\n ): void {\n this.client.listEvents(sessionId, sinceSequence).subscribe({\n next: (events) => events.forEach((event) => sink.next(event)),\n });\n }\n\n /**\n * Tenant-scoped hub URL. Composition matches the AI Adapter's hub map —\n * `app.MapHub<AiHub>(\"/{tenantId:tenantId}/aiHub\")` — so the host's\n * `hubPath` is appended after the tenant segment. Host apps that mount the\n * hub at a different relative path override `hubPath` via\n * `AI_ADAPTER_OPTIONS`.\n */\n get hubUrl(): string {\n const trimmed = this.options.hubPath.startsWith('/')\n ? this.options.hubPath\n : `/${this.options.hubPath}`;\n return `${this.options.baseUrl}/${this.options.tenantId}${trimmed}`;\n }\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { AiAdapterClientService } from './ai-adapter-client.service';\nimport { AiSessionStreamService } from './ai-session-stream.service';\n\n/**\n * Configuration the host application supplies via {@link provideOctoAiConsole}.\n * Every field is required so the library never falls back to a hard-coded URL or\n * tenant id — host apps that wire the library through their own DI container can\n * surface placeholders explicitly instead.\n */\nexport interface AiAdapterOptions {\n /**\n * Absolute base URL of the AI Adapter REST API, e.g. `https://ai.acme.cloud`.\n * Must NOT include a trailing slash. The library appends\n * `/{tenantId}/v1/sessions...` itself.\n */\n readonly baseUrl: string;\n\n /**\n * Tenant whose sessions the host wants to surface. The library renders the\n * tenant id into every REST URL. Host apps that have multiple tenants must\n * compose the provider with the tenant id from their routing context.\n */\n readonly tenantId: string;\n\n /**\n * SignalR hub path, relative to the base URL, e.g. `/hubs/ai`. Used by\n * `AiSessionStreamService` to connect when a host calls\n * `streamSession(sessionId)`.\n */\n readonly hubPath: string;\n}\n\n/**\n * DI token the services in this library read at construction time.\n * Provided by {@link provideOctoAiConsole}.\n */\nexport const AI_ADAPTER_OPTIONS = new InjectionToken<AiAdapterOptions>(\n 'mm-octo-ai-console.adapter-options',\n);\n\n/**\n * Minimal subset of the `@microsoft/signalr` `HubConnection` surface the library\n * exercises. The interface stays in the public API so host apps can supply\n * either the real SignalR connection (Refinery Studio, bastion CLI), a test\n * mock, or no factory at all — in which case {@link AiSessionStreamService}\n * falls back to REST-only backfill (Phase-1 stub behaviour). Keeping the type\n * structural lets the library stay agnostic of the `@microsoft/signalr` major\n * version line the host has installed.\n */\nexport interface AiHubConnectionLike {\n on(methodName: string, handler: (payload: unknown) => void): void;\n start(): Promise<void>;\n stop(): Promise<void>;\n invoke<T = unknown>(methodName: string, ...args: unknown[]): Promise<T>;\n onreconnected(handler: (connectionId?: string) => void): void;\n}\n\n/**\n * Builds a hub connection against the resolved URL. Return null when streaming\n * is not wired in this deployment yet — the stream service then quietly skips\n * the live channel and behaves exactly like the Phase-1 stub.\n */\nexport type AiSessionStreamConnectionFactory =\n (hubUrl: string) => AiHubConnectionLike | null;\n\n/**\n * Optional DI token a host application provides to enable the live SignalR\n * channel on {@link AiSessionStreamService}. When absent, the service degrades\n * to REST-only backfill.\n */\nexport const AI_SESSION_STREAM_CONNECTION_FACTORY =\n new InjectionToken<AiSessionStreamConnectionFactory>(\n 'mm-octo-ai-console.session-stream-connection-factory',\n );\n\n/**\n * Composable provider that surfaces the library's adapter configuration to the\n * Angular DI container. Host applications call this once in `app.config.ts`:\n *\n * ```ts\n * providers: [\n * provideOctoAiConsole({\n * baseUrl: 'https://ai.acme.cloud',\n * tenantId: 'acme',\n * hubPath: '/hubs/ai',\n * }),\n * ]\n * ```\n */\nexport function provideOctoAiConsole(\n options: AiAdapterOptions,\n): EnvironmentProviders {\n // Provide AiAdapterClientService + AiSessionStreamService alongside the\n // options token. Both services drop `providedIn: 'root'` (6d0e7daf) because\n // the options they read are route-scoped — a host with multiple tenants\n // composes the provider with the right tenant id per route, and root-\n // singleton services would freeze the first route's options. Bundling the\n // services into the same provider chain means a host's `providers: [\n // provideOctoAiConsole({...}) ]` is enough; no manual listing required.\n return makeEnvironmentProviders([\n { provide: AI_ADAPTER_OPTIONS, useValue: options },\n AiAdapterClientService,\n AiSessionStreamService,\n ]);\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { AiSessionStatus } from '../../models/ai-session';\n\n/**\n * Status pill that mirrors the eight values `AiSessionStatus` carries on the\n * wire. The component is purely visual — it takes a status string in and emits\n * a CSS class + display label that the host's stylesheet can theme via the\n * `--mm-ai-status-*` custom properties.\n */\n@Component({\n selector: 'mm-ai-job-status-badge',\n imports: [],\n templateUrl: './ai-job-status-badge.component.html',\n styleUrl: './ai-job-status-badge.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiJobStatusBadgeComponent {\n readonly status = input.required<AiSessionStatus>();\n\n protected readonly variant = computed(() => {\n switch (this.status()) {\n case 'Running':\n return 'running';\n case 'Queued':\n return 'queued';\n case 'Paused':\n return 'paused';\n case 'Completed':\n return 'completed';\n case 'Failed':\n case 'Cancelled':\n return 'failed';\n case 'QuotaBlocked':\n case 'RateLimited':\n return 'blocked';\n default:\n return 'queued';\n }\n });\n}\n","<span class=\"mm-ai-status-badge mm-ai-status-badge--{{ variant() }}\">\n {{ status() }}\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { AiSessionDto } from '../../models/ai-session';\nimport { AiJobStatusBadgeComponent } from '../ai-job-status-badge/ai-job-status-badge.component';\n\n/**\n * List view of an AI Adapter tenant's sessions. The host owns data fetching —\n * the component takes the array as an input signal and emits the rtId on\n * row click. Keeping it data-source-agnostic lets refinery wire its own\n * Apollo cache while a bastion CLI could pass static fixtures in a Storybook.\n */\n@Component({\n selector: 'mm-ai-session-list',\n imports: [AiJobStatusBadgeComponent],\n templateUrl: './ai-session-list.component.html',\n styleUrl: './ai-session-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiSessionListComponent {\n readonly sessions = input.required<AiSessionDto[]>();\n readonly selectedSessionId = input<string | null>(null);\n\n readonly sessionSelected = output<string>();\n\n protected readonly orderedSessions = computed(() =>\n [...this.sessions()].sort((a, b) =>\n b.startedAt.localeCompare(a.startedAt),\n ),\n );\n\n protected onSelect(sessionRtId: string): void {\n this.sessionSelected.emit(sessionRtId);\n }\n\n protected age(startedAt: string): string {\n const started = Date.parse(startedAt);\n if (Number.isNaN(started)) {\n return '';\n }\n const now = Date.now();\n const seconds = Math.floor((now - started) / 1000);\n if (seconds < 60) {\n return `${seconds}s ago`;\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m ago`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours}h ago`;\n }\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n }\n}\n","<ul class=\"mm-ai-session-list\">\n @for (session of orderedSessions(); track session.sessionRtId) {\n <li\n class=\"mm-ai-session-list__row\"\n [class.mm-ai-session-list__row--selected]=\"\n session.sessionRtId === selectedSessionId()\n \"\n >\n <button\n type=\"button\"\n class=\"mm-ai-session-list__button\"\n (click)=\"onSelect(session.sessionRtId)\"\n >\n <div class=\"mm-ai-session-list__main\">\n <div class=\"mm-ai-session-list__goal\">{{ session.goalSummary }}</div>\n <div class=\"mm-ai-session-list__meta\">\n <span class=\"mm-ai-session-list__owner\">{{ session.ownerUserId }}</span>\n <span class=\"mm-ai-session-list__age\">{{ age(session.startedAt) }}</span>\n <span class=\"mm-ai-session-list__tokens\">\n {{ session.tokensConsumed }} tok\n </span>\n @if (session.previewUrl) {\n <!--\n #4136 — preview-deploy URL the server surfaces when the worker\n pod's nginx sidecar has a build to serve. Opens in a new tab so\n the operator's session-list scroll position survives.\n stopPropagation prevents the row click from also firing.\n -->\n <a\n class=\"mm-ai-session-list__preview\"\n [href]=\"session.previewUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n >\n Open preview\n </a>\n }\n </div>\n </div>\n <mm-ai-job-status-badge [status]=\"session.status\" />\n </button>\n </li>\n } @empty {\n <li class=\"mm-ai-session-list__empty\">No sessions yet.</li>\n }\n</ul>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { AiSessionEventDto } from '../../models/ai-session-event';\n\n/**\n * Read-only transcript of a session, derived from the events stream. The\n * component takes the events as an input signal so the host owns lifetime —\n * a parent that's already wired `AiSessionStreamService.events$` into a\n * `toSignal()` just hands the same signal in.\n *\n * Markdown rendering is deliberately minimal in Phase 1: the component shows\n * the raw payload (already JSON or stream-json) in a `<pre>` block. The\n * concept §10 calls for proper markdown + code-block highlighting; that\n * upgrade lands behind a `markdown` Input once we've picked a renderer\n * (markdown-it vs marked) and verified its CSP behaviour.\n */\n@Component({\n selector: 'mm-ai-chat-stream',\n imports: [],\n templateUrl: './ai-chat-stream.component.html',\n styleUrl: './ai-chat-stream.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiChatStreamComponent {\n readonly events = input.required<AiSessionEventDto[]>();\n\n /**\n * Sorted by sequence so out-of-order arrival (the SignalR + REST backfill\n * union) renders deterministically.\n */\n protected readonly orderedEvents = computed(() =>\n [...this.events()].sort((a, b) => a.sequence - b.sequence),\n );\n\n protected variant(kind: AiSessionEventDto['kind']): string {\n switch (kind) {\n case 'Message':\n return 'message';\n case 'ToolCall':\n return 'tool-call';\n case 'ToolResult':\n return 'tool-result';\n case 'StatusChange':\n return 'status';\n case 'Hook':\n return 'hook';\n case 'Error':\n return 'error';\n default:\n return 'message';\n }\n }\n}\n","<div class=\"mm-ai-chat\">\n @for (event of orderedEvents(); track event.sequence) {\n <article class=\"mm-ai-chat__event mm-ai-chat__event--{{ variant(event.kind) }}\">\n <header class=\"mm-ai-chat__event-header\">\n <span class=\"mm-ai-chat__kind\">{{ event.kind }}</span>\n <span class=\"mm-ai-chat__actor\">{{ event.actorRef }}</span>\n <span class=\"mm-ai-chat__sequence\">#{{ event.sequence }}</span>\n <time class=\"mm-ai-chat__time\" [attr.datetime]=\"event.at\">\n {{ event.at }}\n </time>\n </header>\n <pre class=\"mm-ai-chat__payload\">{{ event.payload }}</pre>\n </article>\n } @empty {\n <div class=\"mm-ai-chat__empty\">\n No events yet — the worker hasn't emitted anything.\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n} from '@angular/core';\nimport { AiToolCallDto } from '../../models/ai-session-event';\n\n/**\n * Expandable card surface for one tool invocation in a session transcript.\n * Click the header to toggle arguments + result; the body is rendered as\n * pretty-printed JSON so the host doesn't need its own json formatter.\n */\n@Component({\n selector: 'mm-ai-tool-call',\n imports: [],\n templateUrl: './ai-tool-call.component.html',\n styleUrl: './ai-tool-call.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiToolCallComponent {\n readonly call = input.required<AiToolCallDto>();\n\n protected readonly expanded = signal(false);\n\n protected readonly statusVariant = computed(() => {\n const status = this.call().status;\n switch (status) {\n case 'Succeeded':\n return 'succeeded';\n case 'Failed':\n return 'failed';\n case 'Rejected':\n return 'rejected';\n case 'Approved':\n case 'Pending':\n return 'pending';\n default:\n return 'pending';\n }\n });\n\n protected readonly argumentsJson = computed(() =>\n this.format(this.call().arguments),\n );\n protected readonly resultJson = computed(() => {\n const result = this.call().result;\n return result === undefined ? null : this.format(result);\n });\n\n protected toggleExpanded(): void {\n this.expanded.update((v) => !v);\n }\n\n private format(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n}\n","<div class=\"mm-ai-tool-call mm-ai-tool-call--{{ statusVariant() }}\">\n <button\n type=\"button\"\n class=\"mm-ai-tool-call__header\"\n (click)=\"toggleExpanded()\"\n [attr.aria-expanded]=\"expanded()\"\n >\n <span class=\"mm-ai-tool-call__chevron\">\n {{ expanded() ? '▾' : '▸' }}\n </span>\n <span class=\"mm-ai-tool-call__name\">{{ call().toolName }}</span>\n <span class=\"mm-ai-tool-call__status\">{{ call().status }}</span>\n @if (call().durationMs != null) {\n <span class=\"mm-ai-tool-call__duration\">\n {{ call().durationMs }}ms\n </span>\n }\n </button>\n\n @if (expanded()) {\n <div class=\"mm-ai-tool-call__body\">\n <div class=\"mm-ai-tool-call__section\">\n <h4 class=\"mm-ai-tool-call__heading\">Arguments</h4>\n <pre class=\"mm-ai-tool-call__code\">{{ argumentsJson() }}</pre>\n </div>\n\n @if (resultJson() !== null) {\n <div class=\"mm-ai-tool-call__section\">\n <h4 class=\"mm-ai-tool-call__heading\">Result</h4>\n <pre class=\"mm-ai-tool-call__code\">{{ resultJson() }}</pre>\n </div>\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AiApprovalDecisionDto,\n AiApprovalRequestedDto,\n} from '../../models/ai-approval';\n\n/**\n * Approval modal. The host opens it when a `AiApprovalRequestedDto` arrives on\n * the SignalR stream, fills the `request` input, and listens for the `decide`\n * output to call `AiAdapterClientService.decideApproval`. The modal itself is\n * presentation-only: no networking, no global state, no portal magic.\n *\n * The host is expected to wrap the modal in its own backdrop / focus-trap so\n * the library doesn't pull in a positioning dependency (CDK overlay, Kendo\n * window, ng-bootstrap, …) — each host shop already has one.\n */\n@Component({\n selector: 'mm-ai-approval-modal',\n imports: [FormsModule],\n templateUrl: './ai-approval-modal.component.html',\n styleUrl: './ai-approval-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiApprovalModalComponent {\n readonly request = input.required<AiApprovalRequestedDto>();\n\n readonly decide = output<AiApprovalDecisionDto>();\n readonly dismiss = output<void>();\n\n protected readonly comment = signal('');\n\n protected readonly prettyPayload = computed(() => {\n try {\n return JSON.stringify(JSON.parse(this.request().payload), null, 2);\n } catch {\n return this.request().payload;\n }\n });\n\n protected approve(): void {\n this.decide.emit({\n outcome: 'Approved',\n comment: this.commentOrUndefined(),\n });\n }\n\n protected reject(): void {\n this.decide.emit({\n outcome: 'Rejected',\n comment: this.commentOrUndefined(),\n });\n }\n\n protected onDismiss(): void {\n this.dismiss.emit();\n }\n\n private commentOrUndefined(): string | undefined {\n const trimmed = this.comment().trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n}\n","<div class=\"mm-ai-approval\">\n <header class=\"mm-ai-approval__header\">\n <h3 class=\"mm-ai-approval__title\">Approve tool call</h3>\n <button\n type=\"button\"\n class=\"mm-ai-approval__close\"\n (click)=\"onDismiss()\"\n aria-label=\"Dismiss\"\n >\n ×\n </button>\n </header>\n\n <div class=\"mm-ai-approval__meta\">\n <div><span>Tool:</span> <code>{{ request().toolName }}</code></div>\n <div><span>Reason:</span> <code>{{ request().reason }}</code></div>\n <div><span>Session:</span> <code>{{ request().sessionId }}</code></div>\n </div>\n\n <div class=\"mm-ai-approval__section\">\n <h4 class=\"mm-ai-approval__heading\">Payload</h4>\n <pre class=\"mm-ai-approval__code\">{{ prettyPayload() }}</pre>\n </div>\n\n <div class=\"mm-ai-approval__section\">\n <h4 class=\"mm-ai-approval__heading\">Comment <span>(optional)</span></h4>\n <textarea\n class=\"mm-ai-approval__comment\"\n [ngModel]=\"comment()\"\n (ngModelChange)=\"comment.set($event)\"\n rows=\"3\"\n placeholder=\"Why is this approved or rejected?\"\n ></textarea>\n </div>\n\n <footer class=\"mm-ai-approval__actions\">\n <button\n type=\"button\"\n class=\"mm-ai-approval__btn mm-ai-approval__btn--reject\"\n (click)=\"reject()\"\n >\n Reject\n </button>\n <button\n type=\"button\"\n class=\"mm-ai-approval__btn mm-ai-approval__btn--approve\"\n (click)=\"approve()\"\n >\n Approve\n </button>\n </footer>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Two-bar usage indicator (daily + monthly) with threshold colour state.\n * Inputs are unit-agnostic counts and caps; the component does not parse the\n * tenant's `AiQuotaLimit` itself — the host is expected to feed numbers the\n * adapter already aggregated.\n */\n@Component({\n selector: 'mm-ai-quota-indicator',\n imports: [],\n templateUrl: './ai-quota-indicator.component.html',\n styleUrl: './ai-quota-indicator.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiQuotaIndicatorComponent {\n readonly dailyConsumed = input.required<number>();\n readonly dailyCap = input.required<number>();\n readonly monthlyConsumed = input<number | null>(null);\n readonly monthlyCap = input<number | null>(null);\n\n protected readonly dailyPercent = computed(() =>\n this.percent(this.dailyConsumed(), this.dailyCap()),\n );\n protected readonly monthlyPercent = computed(() => {\n const consumed = this.monthlyConsumed();\n const cap = this.monthlyCap();\n if (consumed == null || cap == null) {\n return null;\n }\n return this.percent(consumed, cap);\n });\n\n protected readonly dailyState = computed(() => this.toState(this.dailyPercent()));\n protected readonly monthlyState = computed(() => {\n const pct = this.monthlyPercent();\n return pct == null ? null : this.toState(pct);\n });\n\n private percent(consumed: number, cap: number): number {\n if (cap <= 0) {\n return 0;\n }\n return Math.min(100, Math.round((consumed / cap) * 100));\n }\n\n private toState(percent: number): 'ok' | 'warning' | 'critical' {\n if (percent >= 100) {\n return 'critical';\n }\n if (percent >= 80) {\n return 'warning';\n }\n return 'ok';\n }\n}\n","<div class=\"mm-ai-quota\">\n <div class=\"mm-ai-quota__row\">\n <span class=\"mm-ai-quota__label\">Daily</span>\n <div class=\"mm-ai-quota__bar mm-ai-quota__bar--{{ dailyState() }}\">\n <div class=\"mm-ai-quota__fill\" [style.width.%]=\"dailyPercent()\"></div>\n </div>\n <span class=\"mm-ai-quota__count\">\n {{ dailyConsumed() }} / {{ dailyCap() }} ({{ dailyPercent() }}%)\n </span>\n </div>\n\n @if (monthlyPercent() !== null) {\n <div class=\"mm-ai-quota__row\">\n <span class=\"mm-ai-quota__label\">Monthly</span>\n <div class=\"mm-ai-quota__bar mm-ai-quota__bar--{{ monthlyState() }}\">\n <div class=\"mm-ai-quota__fill\" [style.width.%]=\"monthlyPercent()\"></div>\n </div>\n <span class=\"mm-ai-quota__count\">\n {{ monthlyConsumed() }} / {{ monthlyCap() }} ({{ monthlyPercent() }}%)\n </span>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AiAdapterClientService } from '../../services/ai-adapter-client.service';\nimport {\n AiCredentialTicketScope,\n IssueAiCredentialTicketResponseDto,\n} from '../../models/ai-credential-ticket';\n\n/**\n * Self-service credential-ticket issuer (#4133, concept §10). Admin picks a\n * scope + TTL, hits **Issue ticket**, copies the displayed code, hands it to\n * a developer / operator out-of-band. The plaintext code is shown exactly\n * once — refreshing the panel after issue clears it so a careless screenshot\n * doesn't leak.\n *\n * Theme-neutral by design: visuals use CSS custom properties with neutral\n * defaults so the host (Refinery Studio LCARS, demo-app, etc.) can override\n * them via `--mm-ai-ticket-*` variables without touching the component.\n */\n@Component({\n selector: 'mm-ai-credential-ticket-issue',\n imports: [CommonModule, FormsModule],\n templateUrl: './ai-credential-ticket-issue.component.html',\n styleUrl: './ai-credential-ticket-issue.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiCredentialTicketIssueComponent {\n private readonly client = inject(AiAdapterClientService);\n\n protected readonly scope = signal<AiCredentialTicketScope>(\n 'CredentialRegister',\n );\n protected readonly ttlMinutes = signal<number>(5);\n\n protected readonly issuing = signal<boolean>(false);\n protected readonly issued = signal<IssueAiCredentialTicketResponseDto | null>(\n null,\n );\n protected readonly error = signal<string | null>(null);\n protected readonly copied = signal<boolean>(false);\n\n /** Available scope choices — kept in sync with `AiCredentialTicketScope`. */\n protected readonly scopes: readonly {\n value: AiCredentialTicketScope;\n label: string;\n hint: string;\n }[] = [\n {\n value: 'CredentialRegister',\n label: 'Subscription token',\n hint: 'For the bastion CLI to register an Anthropic OAuth pair on this tenant.',\n },\n {\n value: 'DevSshKeyRegister',\n label: 'Developer SSH key',\n hint: 'For a developer to register their own SSH public key on this tenant.',\n },\n ];\n\n protected onIssue(): void {\n if (this.issuing()) {\n return;\n }\n const ttl = this.normalizedTtl();\n this.issuing.set(true);\n this.error.set(null);\n this.copied.set(false);\n this.issued.set(null);\n\n this.client\n .issueCredentialTicket({\n scope: this.scope(),\n ttlMinutes: ttl,\n })\n .subscribe({\n next: (response) => {\n this.issued.set(response);\n this.issuing.set(false);\n },\n error: (err: unknown) => {\n this.error.set(this.formatError(err));\n this.issuing.set(false);\n },\n });\n }\n\n protected onCopy(): void {\n const code = this.issued()?.code;\n if (!code) {\n return;\n }\n // navigator.clipboard requires a secure context; if it's unavailable the\n // operator can still select + copy by hand. Falling back silently keeps\n // the panel usable on http://localhost dev origins.\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(code).then(\n () => this.copied.set(true),\n () => this.copied.set(false),\n );\n }\n }\n\n protected onClear(): void {\n this.issued.set(null);\n this.copied.set(false);\n }\n\n private normalizedTtl(): number {\n const v = Math.trunc(this.ttlMinutes());\n // Server clamps to 60 anyway; clamp here too so the slider can't push a\n // value the request would silently truncate.\n if (Number.isNaN(v) || v < 1) {\n return 1;\n }\n if (v > 60) {\n return 60;\n }\n return v;\n }\n\n private formatError(err: unknown): string {\n if (\n typeof err === 'object' &&\n err !== null &&\n 'status' in err &&\n typeof (err as { status: number }).status === 'number'\n ) {\n const status = (err as { status: number }).status;\n if (status === 401 || status === 403) {\n return 'Not authorised — only tenant admins can issue tickets.';\n }\n if (status === 400) {\n return 'Invalid request — check the scope value.';\n }\n return `Server returned HTTP ${status}.`;\n }\n return 'Failed to reach the AI Adapter — check the network.';\n }\n}\n","<section class=\"mm-ai-ticket\">\n <header class=\"mm-ai-ticket__header\">\n <div class=\"mm-ai-ticket__title\">Issue credential ticket</div>\n <div class=\"mm-ai-ticket__subtitle\">\n Mint a one-time code an operator redeems on their own machine.\n </div>\n </header>\n\n @if (!issued()) {\n <form\n class=\"mm-ai-ticket__form\"\n (ngSubmit)=\"onIssue()\"\n #issueForm=\"ngForm\"\n >\n <label class=\"mm-ai-ticket__field\">\n <span class=\"mm-ai-ticket__label\">Scope</span>\n <select\n class=\"mm-ai-ticket__select\"\n [ngModel]=\"scope()\"\n (ngModelChange)=\"scope.set($event)\"\n name=\"scope\"\n [disabled]=\"issuing()\"\n >\n @for (s of scopes; track s.value) {\n <option [value]=\"s.value\">{{ s.label }}</option>\n }\n </select>\n </label>\n <p class=\"mm-ai-ticket__hint\">\n @for (s of scopes; track s.value) {\n @if (s.value === scope()) {\n {{ s.hint }}\n }\n }\n </p>\n\n <label class=\"mm-ai-ticket__field\">\n <span class=\"mm-ai-ticket__label\">TTL (minutes)</span>\n <input\n class=\"mm-ai-ticket__input\"\n type=\"number\"\n min=\"1\"\n max=\"60\"\n step=\"1\"\n [ngModel]=\"ttlMinutes()\"\n (ngModelChange)=\"ttlMinutes.set(+$event)\"\n name=\"ttlMinutes\"\n [disabled]=\"issuing()\"\n />\n </label>\n <p class=\"mm-ai-ticket__hint\">\n Default 5 minutes. Server clamps to 60 — long TTLs leak.\n </p>\n\n <div class=\"mm-ai-ticket__actions\">\n <button\n class=\"mm-ai-ticket__button mm-ai-ticket__button--primary\"\n type=\"submit\"\n [disabled]=\"issuing()\"\n >\n @if (issuing()) {\n Issuing…\n } @else {\n Issue ticket\n }\n </button>\n </div>\n\n @if (error()) {\n <p class=\"mm-ai-ticket__error\">{{ error() }}</p>\n }\n </form>\n } @else {\n <div class=\"mm-ai-ticket__result\">\n <p class=\"mm-ai-ticket__result-label\">\n One-time code (copy now — not shown again):\n </p>\n <div class=\"mm-ai-ticket__code-row\">\n <code class=\"mm-ai-ticket__code\">{{ issued()!.code }}</code>\n <button\n class=\"mm-ai-ticket__button mm-ai-ticket__button--secondary\"\n type=\"button\"\n (click)=\"onCopy()\"\n >\n @if (copied()) {\n Copied\n } @else {\n Copy\n }\n </button>\n </div>\n <dl class=\"mm-ai-ticket__meta\">\n <div>\n <dt>Scope</dt>\n <dd>{{ issued()!.scope }}</dd>\n </div>\n <div>\n <dt>Expires at</dt>\n <dd>{{ issued()!.expiresAt }}</dd>\n </div>\n <div>\n <dt>Ticket rtId</dt>\n <dd><code>{{ issued()!.rtId }}</code></dd>\n </div>\n </dl>\n <div class=\"mm-ai-ticket__actions\">\n <button\n class=\"mm-ai-ticket__button\"\n type=\"button\"\n (click)=\"onClear()\"\n >\n Issue another\n </button>\n </div>\n </div>\n }\n</section>\n","/*\n * Public API Surface of @meshmakers/octo-ai-console\n *\n * Reusable Angular building blocks for the OctoMesh AI Adapter session console\n * (ADR-21, issue #4121). Host applications import individual standalone\n * components or call `provideOctoAiConsole({...})` to wire the services.\n */\n\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/components';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAgBA;;;;;;;;;;;AAWG;AACH;;;;;;;AAOG;MAEU,sBAAsB,CAAA;AAChB,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAErD;;;AAGG;AACH,IAAA,YAAY,CAAC,MAAe,EAAA;QAC1B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,WAAW;AAC3C,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;QAC7B,IAAI,MAAM,EAAE;YACV,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QACvC;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC;IACvD;;AAGA,IAAA,UAAU,CAAC,SAAiB,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,kBAAkB,CAAC,SAAS,CAAC,CAAA,CAAE,CACjE;IACH;AAEA;;;;AAIG;AACH,IAAA,aAAa,CACX,OAAgC,EAAA;AAEhC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,SAAA,CAAW,EAC/B,OAAO,CACR;IACH;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,SAAiB,EAAA;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,UAAA,EAAa,kBAAkB,CAAC,SAAS,CAAC,SAAS,EACvE,IAAI,CACL;IACH;AAEA;;;;;AAKG;IACH,UAAU,CACR,SAAiB,EACjB,aAAsB,EAAA;AAEtB,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,UAAA,EAAa,kBAAkB,CAAC,SAAS,CAAC,SAAS;AACnF,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,QAAA,IAAI,aAAa,IAAI,IAAI,EAAE;AACzB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC;QAChE;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC;IAC5D;AAEA;;;;AAIG;AACH,IAAA,cAAc,CACZ,SAAiB,EACjB,SAAiB,EACjB,QAA+B,EAAA;AAE/B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,UAAA,EAAa,kBAAkB,CAAC,SAAS,CAAC,CAAA,CAAE;YAC9D,CAAA,WAAA,EAAc,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAC/C,QAAQ,CACT;IACH;AAEA;;;;;;;AAOG;AACH,IAAA,qBAAqB,CACnB,OAA0C,EAAA;AAE1C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,oBAAA,CAAsB,EAC1C,OAAO,CACR;IACH;IAEQ,UAAU,GAAA;AAChB,QAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA,CAAA,EAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAClF;uGAxGW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAtB,sBAAsB,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;ACGD;;;;;;;;;;;;AAYG;AACH;;;;AAIG;MAEU,sBAAsB,CAAA;AAChB,IAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,IAAA,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC;IACvC,iBAAiB,GAAG,MAAM,CACzC,oCAAoC,EACpC,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB;AAED;;;;;;;;;;;;;AAaG;AACH,IAAA,aAAa,CAAC,SAAiB,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,aAAa,CAAoB,GAAG,CAAC;AACzD,QAAA,MAAM,cAAc,GAAG,IAAI,OAAO,EAA6B;AAC/D,QAAA,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAA0B;AACjE,QAAA,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAwB;AAC7D,QAAA,MAAM,cAAc,GAAG,IAAI,OAAO,EAAqB;;;;;QAMvD,IAAI,eAAe,GAAG,CAAC;AACvB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;AAC3D,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;AACf,gBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;oBAC1B,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC;AAC3D,oBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBACrB;YACF,CAAC;AACF,SAAA,CAAC;QAEF,IAAI,UAAU,GAA+B,IAAI;AACjD,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;QAClD;QAEA,IAAI,UAAU,EAAE;YACd,MAAM,IAAI,GAAG,UAAU;YACvB,IAAI,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,OAAO,KAAI;gBACzC,MAAM,KAAK,GAAG,OAA4B;AAC1C,gBAAA,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;AAChE,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACrB,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,6BAA6B,EAAE,CAAC,OAAO,KAAI;AACjD,gBAAA,cAAc,CAAC,IAAI,CAAC,OAAoC,CAAC;AAC3D,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,0BAA0B,EAAE,CAAC,OAAO,KAAI;AAC9C,gBAAA,mBAAmB,CAAC,IAAI,CAAC,OAAiC,CAAC;AAC7D,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,wBAAwB,EAAE,CAAC,OAAO,KAAI;AAC5C,gBAAA,iBAAiB,CAAC,IAAI,CAAC,OAA+B,CAAC;AACzD,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,OAAO,KAAI;AACzC,gBAAA,cAAc,CAAC,IAAI,CAAC,OAA4B,CAAC;AACnD,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,aAAa,CAAC,MAAK;;;;gBAItB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,CAAC;AAClD,YAAA,CAAC,CAAC;;;;;YAMF;AACG,iBAAA,KAAK;AACL,iBAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,yBAAyB,EAAE,SAAS,CAAC;iBAC5D,KAAK,CAAC,MAAK;;AAEZ,YAAA,CAAC,CAAC;QACN;QAEA,OAAO;AACL,YAAA,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE;AAC/B,YAAA,cAAc,EAAE,cAAc,CAAC,YAAY,EAAE;AAC7C,YAAA,mBAAmB,EAAE,mBAAmB,CAAC,YAAY,EAAE;AACvD,YAAA,iBAAiB,EAAE,iBAAiB,CAAC,YAAY,EAAE;AACnD,YAAA,cAAc,EAAE,cAAc,CAAC,YAAY,EAAE;YAC7C,UAAU,EAAE,MAAK;gBACf,QAAQ,CAAC,WAAW,EAAE;gBACtB,IAAI,UAAU,EAAE;;;oBAGd,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBACxC,UAAU,GAAG,IAAI;gBACnB;gBACA,OAAO,CAAC,QAAQ,EAAE;gBAClB,cAAc,CAAC,QAAQ,EAAE;gBACzB,mBAAmB,CAAC,QAAQ,EAAE;gBAC9B,iBAAiB,CAAC,QAAQ,EAAE;gBAC5B,cAAc,CAAC,QAAQ,EAAE;YAC3B,CAAC;SACF;IACH;AAEA;;;;AAIG;AACH,IAAA,MAAM,CACJ,SAAiB,EACjB,aAAqB,EACrB,IAAmE,EAAA;QAEnE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,SAAS,CAAC;YACzD,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9D,SAAA,CAAC;IACJ;AAEA;;;;;;AAMG;AACH,IAAA,IAAI,MAAM,GAAA;QACR,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG;AACjD,cAAE,IAAI,CAAC,OAAO,CAAC;cACb,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA,EAAG,OAAO,EAAE;IACrE;uGAxIW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAtB,sBAAsB,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;ACpBD;;;AAGG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAClD,oCAAoC;AA4BtC;;;;AAIG;MACU,oCAAoC,GAC/C,IAAI,cAAc,CAChB,sDAAsD;AAG1D;;;;;;;;;;;;;AAaG;AACG,SAAU,oBAAoB,CAClC,OAAyB,EAAA;;;;;;;;AASzB,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE;QAClD,sBAAsB;QACtB,sBAAsB;AACvB,KAAA,CAAC;AACJ;;AC1GA;;;;;AAKG;MAQU,yBAAyB,CAAA;AAC3B,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAmB;AAEhC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACzC,QAAA,QAAQ,IAAI,CAAC,MAAM,EAAE;AACnB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,WAAW;AACpB,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,SAAS;AAClB,YAAA;AACE,gBAAA,OAAO,QAAQ;;AAErB,IAAA,CAAC,8EAAC;uGAtBS,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,wNChBtC,sGAGA,EAAA,MAAA,EAAA,CAAA,+tCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDaa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,OAAA,EACzB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sGAAA,EAAA,MAAA,EAAA,CAAA,+tCAAA,CAAA,EAAA;;;AEJjD;;;;;AAKG;MAQU,sBAAsB,CAAA;AACxB,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAkB;AAC3C,IAAA,iBAAiB,GAAG,KAAK,CAAgB,IAAI,wFAAC;IAE9C,eAAe,GAAG,MAAM,EAAU;AAExB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAC5C,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAC7B,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CACvC,sFACF;AAES,IAAA,QAAQ,CAAC,WAAmB,EAAA;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;IACxC;AAEU,IAAA,GAAG,CAAC,SAAiB,EAAA;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AACrC,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;AACzB,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC;AAClD,QAAA,IAAI,OAAO,GAAG,EAAE,EAAE;YAChB,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAO;QAC1B;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AACxC,QAAA,IAAI,OAAO,GAAG,EAAE,EAAE;YAChB,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAO;QAC1B;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AACtC,QAAA,IAAI,KAAK,GAAG,EAAE,EAAE;YACd,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAO;QACxB;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACnC,OAAO,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO;IACvB;uGApCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBnC,g0DA+CA,EAAA,MAAA,EAAA,CAAA,q8CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7BY,yBAAyB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKxB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,WACrB,CAAC,yBAAyB,CAAC,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,g0DAAA,EAAA,MAAA,EAAA,CAAA,q8CAAA,CAAA,EAAA;;;AEbjD;;;;;;;;;;;AAWG;MAQU,qBAAqB,CAAA;AACvB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAuB;AAEvD;;;AAGG;AACgB,IAAA,aAAa,GAAG,QAAQ,CAAC,MAC1C,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,oFAC3D;AAES,IAAA,OAAO,CAAC,IAA+B,EAAA;QAC/C,QAAQ,IAAI;AACV,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,WAAW;AACpB,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO;AAChB,YAAA;AACE,gBAAA,OAAO,SAAS;;IAEtB;uGA5BW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,mNC3BlC,8xBAmBA,EAAA,MAAA,EAAA,CAAA,6lDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDQa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,OAAA,EACpB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8xBAAA,EAAA,MAAA,EAAA,CAAA,6lDAAA,CAAA,EAAA;;;AEhBjD;;;;AAIG;MAQU,mBAAmB,CAAA;AACrB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAiB;AAE5B,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AAExB,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM;QACjC,QAAQ,MAAM;AACZ,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,WAAW;AACpB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,UAAU;AACnB,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,SAAS;AAClB,YAAA;AACE,gBAAA,OAAO,SAAS;;AAEtB,IAAA,CAAC,oFAAC;AAEiB,IAAA,aAAa,GAAG,QAAQ,CAAC,MAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,oFACnC;AACkB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM;AACjC,QAAA,OAAO,MAAM,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAC1D,IAAA,CAAC,iFAAC;IAEQ,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC;AAEQ,IAAA,MAAM,CAAC,KAAc,EAAA;QAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,EAAE;QACX;AACA,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB;IACF;uGA3CW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,2MCrBhC,spCAmCA,EAAA,MAAA,EAAA,CAAA,ouDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDda,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAClB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,spCAAA,EAAA,MAAA,EAAA,CAAA,ouDAAA,CAAA,EAAA;;;AELjD;;;;;;;;;AASG;MAQU,wBAAwB,CAAA;AAC1B,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAA0B;IAElD,MAAM,GAAG,MAAM,EAAyB;IACxC,OAAO,GAAG,MAAM,EAAQ;AAEd,IAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AAEpB,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO;QAC/B;AACF,IAAA,CAAC,oFAAC;IAEQ,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACf,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACnC,SAAA,CAAC;IACJ;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACf,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACnC,SAAA,CAAC;IACJ;IAEU,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEQ,kBAAkB,GAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AACrC,QAAA,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,SAAS;IACjD;uGArCW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BrC,2gDAoDA,EAAA,MAAA,EAAA,CAAA,4mEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKV,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,WACvB,CAAC,WAAW,CAAC,EAAA,eAAA,EAGL,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2gDAAA,EAAA,MAAA,EAAA,CAAA,4mEAAA,CAAA,EAAA;;;AE3BjD;;;;;AAKG;MAQU,yBAAyB,CAAA;AAC3B,IAAA,aAAa,GAAG,KAAK,CAAC,QAAQ,mFAAU;AACxC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;AACnC,IAAA,eAAe,GAAG,KAAK,CAAgB,IAAI,sFAAC;AAC5C,IAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,iFAAC;IAE7B,YAAY,GAAG,QAAQ,CAAC,MACzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACpD;AACkB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;QAC7B,IAAI,QAAQ,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE;AACnC,YAAA,OAAO,IAAI;QACb;QACA,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;AACpC,IAAA,CAAC,qFAAC;AAEiB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,iFAAC;AAC9D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE;AACjC,QAAA,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/C,IAAA,CAAC,mFAAC;IAEM,OAAO,CAAC,QAAgB,EAAE,GAAW,EAAA;AAC3C,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE;AACZ,YAAA,OAAO,CAAC;QACV;AACA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;IAC1D;AAEQ,IAAA,OAAO,CAAC,OAAe,EAAA;AAC7B,QAAA,IAAI,OAAO,IAAI,GAAG,EAAE;AAClB,YAAA,OAAO,UAAU;QACnB;AACA,QAAA,IAAI,OAAO,IAAI,EAAE,EAAE;AACjB,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,IAAI;IACb;uGAvCW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,yoBCftC,q4BAuBA,EAAA,MAAA,EAAA,CAAA,s0BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDRa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,q4BAAA,EAAA,MAAA,EAAA,CAAA,s0BAAA,CAAA,EAAA;;;AECjD;;;;;;;;;;AAUG;MAQU,gCAAgC,CAAA;AAC1B,IAAA,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAErC,IAAA,KAAK,GAAG,MAAM,CAC/B,oBAAoB,4EACrB;AACkB,IAAA,UAAU,GAAG,MAAM,CAAS,CAAC,iFAAC;AAE9B,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,8EAAC;AAChC,IAAA,MAAM,GAAG,MAAM,CAChC,IAAI,6EACL;AACkB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,4EAAC;AACnC,IAAA,MAAM,GAAG,MAAM,CAAU,KAAK,6EAAC;;AAG/B,IAAA,MAAM,GAInB;AACJ,QAAA;AACE,YAAA,KAAK,EAAE,oBAAoB;AAC3B,YAAA,KAAK,EAAE,oBAAoB;AAC3B,YAAA,IAAI,EAAE,yEAAyE;AAChF,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,IAAI,EAAE,sEAAsE;AAC7E,SAAA;KACF;IAES,OAAO,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YAClB;QACF;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AAErB,QAAA,IAAI,CAAC;AACF,aAAA,qBAAqB,CAAC;AACrB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,UAAU,EAAE,GAAG;SAChB;AACA,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAY,KAAI;AACtB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACrC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;IAEU,MAAM,GAAA;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI;QAChC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;;;;QAIA,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE;AACxD,YAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CACtC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAC7B;QACH;IACF;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;IAEQ,aAAa,GAAA;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;;;QAGvC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAC5B,YAAA,OAAO,CAAC;QACV;AACA,QAAA,IAAI,CAAC,GAAG,EAAE,EAAE;AACV,YAAA,OAAO,EAAE;QACX;AACA,QAAA,OAAO,CAAC;IACV;AAEQ,IAAA,WAAW,CAAC,GAAY,EAAA;QAC9B,IACE,OAAO,GAAG,KAAK,QAAQ;AACvB,YAAA,GAAG,KAAK,IAAI;AACZ,YAAA,QAAQ,IAAI,GAAG;AACf,YAAA,OAAQ,GAA0B,CAAC,MAAM,KAAK,QAAQ,EACtD;AACA,YAAA,MAAM,MAAM,GAAI,GAA0B,CAAC,MAAM;YACjD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE;AACpC,gBAAA,OAAO,wDAAwD;YACjE;AACA,YAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,gBAAA,OAAO,0CAA0C;YACnD;YACA,OAAO,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAA,CAAG;QAC1C;AACA,QAAA,OAAO,qDAAqD;IAC9D;uGA/GW,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChC7C,wxGAqHA,EAAA,MAAA,EAAA,CAAA,q0FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1FY,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKxB,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAP5C,SAAS;+BACE,+BAA+B,EAAA,OAAA,EAChC,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wxGAAA,EAAA,MAAA,EAAA,CAAA,q0FAAA,CAAA,EAAA;;;AE9BjD;;;;;;AAMG;;ACNH;;AAEG;;;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@meshmakers/octo-ai-console",
|
|
3
|
+
"version": "3.3.1190",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^21.2.0",
|
|
6
|
+
"@angular/core": "^21.2.0"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.8.1"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"module": "fesm2022/meshmakers-octo-ai-console.mjs",
|
|
13
|
+
"typings": "types/meshmakers-octo-ai-console.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./types/meshmakers-octo-ai-console.d.ts",
|
|
20
|
+
"default": "./fesm2022/meshmakers-octo-ai-console.mjs"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"type": "module"
|
|
24
|
+
}
|