@mohamedatia/fly-design-system 2.9.0 → 2.11.0
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.
- package/fesm2022/mohamedatia-fly-design-system.mjs +814 -8
- package/fesm2022/mohamedatia-fly-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/scss/_theme-light.scss +7 -1
- package/types/mohamedatia-fly-design-system.d.ts +716 -13
- package/types/mohamedatia-fly-design-system.d.ts.map +1 -1
- package/mohamedatia-fly-design-system-2.9.0.tgz +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { Type, InjectionToken, Signal, OnInit, EventEmitter, OnChanges, OnDestroy, SimpleChanges, PipeTransform, signal, AfterViewInit, ElementRef } from '@angular/core';
|
|
3
|
-
import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
|
|
2
|
+
import { Type, InjectionToken, Signal, WritableSignal, OnInit, EventEmitter, OnChanges, OnDestroy, SimpleChanges, PipeTransform, signal, AfterViewInit, ElementRef } from '@angular/core';
|
|
4
3
|
import { Observable } from 'rxjs';
|
|
4
|
+
import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
|
|
5
5
|
import { NavigationExtras } from '@angular/router';
|
|
6
6
|
import * as _mohamedatia_fly_design_system from '@mohamedatia/fly-design-system';
|
|
7
7
|
|
|
@@ -123,6 +123,61 @@ declare const FLYOS_LAUNCH_EVENT = "flyos:launch";
|
|
|
123
123
|
declare const FlyosPendingLaunchesGlobalKey: "__FLYOS_PENDING_LAUNCHES__";
|
|
124
124
|
/** Type of the `globalThis[FlyosPendingLaunchesGlobalKey]` registry. */
|
|
125
125
|
type FlyosPendingLaunches = Record<string, LaunchContext>;
|
|
126
|
+
/**
|
|
127
|
+
* Hint published by an app to drive the window-titlebar help-button deeplink.
|
|
128
|
+
*
|
|
129
|
+
* The shell renders the help button automatically on every non-chromeless
|
|
130
|
+
* window, defaulting the deeplink to `params.appId = win.appId`. An app
|
|
131
|
+
* customises that deeplink by injecting <see cref="WINDOW_HELP_HINT"/> and
|
|
132
|
+
* setting the writable signal — typically once on construct + again as the
|
|
133
|
+
* active route/page changes.
|
|
134
|
+
*
|
|
135
|
+
* - `appId` overrides `win.appId` (rare; reserved for embedded sub-apps
|
|
136
|
+
* whose help lives under a different seed-pack id).
|
|
137
|
+
* - `topic` seeds the help-center search query when the deeplink fires.
|
|
138
|
+
* Free-form short phrase (e.g. "calculated measures", "share dialog").
|
|
139
|
+
* Updated dynamically as the user navigates within the app.
|
|
140
|
+
*/
|
|
141
|
+
interface WindowHelpHint {
|
|
142
|
+
/** Override for the help-center `appId` chip pre-selection. Optional. */
|
|
143
|
+
readonly appId?: string;
|
|
144
|
+
/** Free-form search-query seed for the help-center landing. */
|
|
145
|
+
readonly topic?: string | null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Per-window injection token carrying the active <see cref="WindowHelpHint"/>
|
|
149
|
+
* as a writable signal. The shell creates one writable signal per window
|
|
150
|
+
* (alongside <see cref="LAUNCH_CONTEXT"/>); apps inject it and `.set(...)` to
|
|
151
|
+
* publish or update their hint. Setting `null` clears the hint — the chrome
|
|
152
|
+
* falls back to the implicit `win.appId` deeplink.
|
|
153
|
+
*
|
|
154
|
+
* **Federation note:** same caveat as <see cref="LAUNCH_CONTEXT"/> — Native
|
|
155
|
+
* Federation can split the InjectionToken across host/remote bundles, so
|
|
156
|
+
* federated remotes cannot rely on DI to publish hints. Use
|
|
157
|
+
* <see cref="FLY_WINDOW_HELP_HINT_EVENT"/> instead.
|
|
158
|
+
*/
|
|
159
|
+
declare const WINDOW_HELP_HINT: InjectionToken<WritableSignal<WindowHelpHint | null>>;
|
|
160
|
+
/**
|
|
161
|
+
* Federation-safe window CustomEvent name for publishing a help hint from a
|
|
162
|
+
* federated remote that cannot see <see cref="WINDOW_HELP_HINT"/> via DI.
|
|
163
|
+
*
|
|
164
|
+
* Detail: <see cref="FlyWindowHelpHintEventDetail"/>. The shell listens at
|
|
165
|
+
* `window` scope and mirrors the payload into the matching per-window signal
|
|
166
|
+
* (keyed by `windowId` from <see cref="WINDOW_DATA"/>). Pairs with the
|
|
167
|
+
* <see cref="FLYOS_LAUNCH_EVENT"/> pattern.
|
|
168
|
+
*/
|
|
169
|
+
declare const FLY_WINDOW_HELP_HINT_EVENT = "flyos:window-help-hint";
|
|
170
|
+
/**
|
|
171
|
+
* Detail payload of the <see cref="FLY_WINDOW_HELP_HINT_EVENT"/> CustomEvent.
|
|
172
|
+
* Federated remotes dispatch one event per hint change; the shell filters
|
|
173
|
+
* by `windowId` (each window owns its own hint).
|
|
174
|
+
*/
|
|
175
|
+
interface FlyWindowHelpHintEventDetail {
|
|
176
|
+
/** Window id; remotes obtain via WINDOW_DATA at mount. */
|
|
177
|
+
readonly windowId: string;
|
|
178
|
+
/** Pass `null` to clear; the chrome reverts to win.appId. */
|
|
179
|
+
readonly hint: WindowHelpHint | null;
|
|
180
|
+
}
|
|
126
181
|
|
|
127
182
|
interface User {
|
|
128
183
|
id: string;
|
|
@@ -1224,6 +1279,59 @@ declare class SourceAppResolver {
|
|
|
1224
1279
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<SourceAppResolver>;
|
|
1225
1280
|
}
|
|
1226
1281
|
|
|
1282
|
+
/**
|
|
1283
|
+
* Publishes a {@link WindowHelpHint} for the current window so the shell's
|
|
1284
|
+
* titlebar Help button deeplinks the help-center reader to the article most
|
|
1285
|
+
* relevant to where the user is.
|
|
1286
|
+
*
|
|
1287
|
+
* This is the **publisher twin** of the shell's `WindowHelpHintService`
|
|
1288
|
+
* (the listener). It exists in the design system so that **any app — and
|
|
1289
|
+
* especially a federated remote — publishes hints the same way**, without
|
|
1290
|
+
* hand-rolling the cross-bundle CustomEvent contract.
|
|
1291
|
+
*
|
|
1292
|
+
* **Why a `window` CustomEvent and not the `WINDOW_HELP_HINT` DI token?**
|
|
1293
|
+
* Native Federation can split an `InjectionToken` instance across the host and
|
|
1294
|
+
* remote bundles, so a remote that injects `WINDOW_HELP_HINT` may get a
|
|
1295
|
+
* different token than the one the shell provides. The string-keyed
|
|
1296
|
+
* {@link FLY_WINDOW_HELP_HINT_EVENT} crosses bundles reliably; the shell
|
|
1297
|
+
* mirrors it into the matching per-window hint signal. In-shell (OS-Core) apps
|
|
1298
|
+
* may still use the DI token directly, but this service works for them too.
|
|
1299
|
+
*
|
|
1300
|
+
* **Imperative by design.** The service holds no signals and runs no effect —
|
|
1301
|
+
* the *app* owns its reactivity (route + state → resolved hint) and pushes the
|
|
1302
|
+
* result via {@link setHint}. The design system owns only the wire format. A
|
|
1303
|
+
* hint set before {@link bindWindow} is buffered and emitted once the window id
|
|
1304
|
+
* arrives, so call order doesn't matter.
|
|
1305
|
+
*
|
|
1306
|
+
* Usage (typically from the remote root + its feature components):
|
|
1307
|
+
* ```ts
|
|
1308
|
+
* private help = inject(FlyWindowHelpService);
|
|
1309
|
+
* constructor() {
|
|
1310
|
+
* this.help.bindWindow(inject(WINDOW_DATA, { optional: true })?.id);
|
|
1311
|
+
* effect(() => this.help.setHint(this.resolvedHint())); // app-specific
|
|
1312
|
+
* }
|
|
1313
|
+
* ```
|
|
1314
|
+
*/
|
|
1315
|
+
declare class FlyWindowHelpService {
|
|
1316
|
+
private windowId;
|
|
1317
|
+
private hint;
|
|
1318
|
+
/**
|
|
1319
|
+
* Bind (or clear) the host window id — typically once, from the app root,
|
|
1320
|
+
* with `WINDOW_DATA.id`. Re-emits the current hint for the (new) window.
|
|
1321
|
+
* Passing null/undefined (standalone, no shell) makes publishing a no-op.
|
|
1322
|
+
*/
|
|
1323
|
+
bindWindow(windowId: string | null | undefined): void;
|
|
1324
|
+
/**
|
|
1325
|
+
* Set the active hint (or null to clear — the shell then reverts to the
|
|
1326
|
+
* window's own `appId`). Emits immediately when a window is bound; otherwise
|
|
1327
|
+
* the value is buffered and emitted on the next {@link bindWindow}.
|
|
1328
|
+
*/
|
|
1329
|
+
setHint(hint: WindowHelpHint | null): void;
|
|
1330
|
+
private publish;
|
|
1331
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyWindowHelpService, never>;
|
|
1332
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<FlyWindowHelpService>;
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1227
1335
|
/**
|
|
1228
1336
|
* fly-remote-styles — Shell-layer CSS loader for Native Federation remotes.
|
|
1229
1337
|
*
|
|
@@ -1826,8 +1934,25 @@ declare class FlyFileUploadComponent {
|
|
|
1826
1934
|
*/
|
|
1827
1935
|
/** Frozen MIME used by `flyAgentDraggable` and the drop-zone reader. Never change without a DS major. */
|
|
1828
1936
|
declare const AGENT_DRAG_MIME: "application/x-fly-agent-payload+json";
|
|
1829
|
-
/**
|
|
1830
|
-
|
|
1937
|
+
/**
|
|
1938
|
+
* Frozen payload envelope version.
|
|
1939
|
+
*
|
|
1940
|
+
* v1 — minimal drag payload: kind / appId / version / payload / plainTextFallback /
|
|
1941
|
+
* suggestedCommandIds. Still used by the drag/drop surface.
|
|
1942
|
+
*
|
|
1943
|
+
* v2 — bus envelope ({@link AgentMessageEnvelope}). Adds optional `userMessage`,
|
|
1944
|
+
* `systemContext`, `attachments`, `mcpScope` so a dispatcher can give the agent
|
|
1945
|
+
* rich context without polluting the user-visible message bubble. v2 is a
|
|
1946
|
+
* superset of v1 — every v1 payload is a valid v2 payload — so the version
|
|
1947
|
+
* number ratchets forward without breaking existing callers.
|
|
1948
|
+
*/
|
|
1949
|
+
declare const AGENT_PAYLOAD_VERSION: 2;
|
|
1950
|
+
/**
|
|
1951
|
+
* Versions accepted by the validator. v1 payloads (the drag/drop surface) remain valid;
|
|
1952
|
+
* v2 adds the optional bus-envelope fields. Renderers narrow on `version` when they need
|
|
1953
|
+
* to.
|
|
1954
|
+
*/
|
|
1955
|
+
declare const SUPPORTED_AGENT_PAYLOAD_VERSIONS: readonly number[];
|
|
1831
1956
|
/**
|
|
1832
1957
|
* Where a command surfaces. `'global'` = always offered. `{ appId }` = offered only when
|
|
1833
1958
|
* the host's live `liveAppIds` set (passed to {@link AgentCommandRegistry.visible}) contains
|
|
@@ -1874,22 +1999,263 @@ interface AgentCommandHandle {
|
|
|
1874
1999
|
dispose(): void;
|
|
1875
2000
|
}
|
|
1876
2001
|
/**
|
|
1877
|
-
*
|
|
1878
|
-
*
|
|
2002
|
+
* How a lookup fetches candidate entities. The picker calls the app's existing
|
|
2003
|
+
* authenticated REST search endpoint (the same one the agent's MCP `*_list_brief`
|
|
2004
|
+
* tool wraps) through the shell's HttpClient — gateway routing + auth
|
|
2005
|
+
* interceptor apply. We deliberately do NOT route typeahead through MCP (agent-
|
|
2006
|
+
* shaped, agent-auth) or the dataset executor (aggregation-shaped, no fulltext).
|
|
2007
|
+
*
|
|
2008
|
+
* Field mapping is declarative because entities differ: Circles trends/signals
|
|
2009
|
+
* expose `/brief` endpoints returning `{ id, title, status }`, while scenarios
|
|
2010
|
+
* have no brief variant and return full objects with `titleEn` / `titleAr`. The
|
|
2011
|
+
* `displayField` / `secondaryField` indirection absorbs that per-entity skew so
|
|
2012
|
+
* one picker component serves them all.
|
|
2013
|
+
*/
|
|
2014
|
+
interface LookupSearch {
|
|
2015
|
+
/**
|
|
2016
|
+
* Relative REST path the picker GETs, e.g. `/api/circles/trends/brief`. Must
|
|
2017
|
+
* be a relative path (no scheme/host) — the SSRF guard at onboard time (when
|
|
2018
|
+
* the descriptor is manifest-backed) and the picker both reject absolute URLs.
|
|
2019
|
+
*/
|
|
2020
|
+
readonly endpoint: string;
|
|
2021
|
+
/** Query param carrying the typed text, e.g. `search`. */
|
|
2022
|
+
readonly queryParam: string;
|
|
2023
|
+
/** Static query params merged into every request, e.g. `{ pageSize: '10' }`. */
|
|
2024
|
+
readonly extraParams?: Readonly<Record<string, string>>;
|
|
2025
|
+
/** Response-item field holding the entity id. Default `id`. */
|
|
2026
|
+
readonly idField?: string;
|
|
2027
|
+
/** Response-item field holding the display label, e.g. `title` / `titleEn`. */
|
|
2028
|
+
readonly displayField: string;
|
|
2029
|
+
/** Optional response-item field for the chip's secondary line (status, category). */
|
|
2030
|
+
readonly secondaryField?: string;
|
|
2031
|
+
/**
|
|
2032
|
+
* Dotted path to the results array within the response body when it is
|
|
2033
|
+
* wrapped, e.g. `items` for `{ items: [...], total }`. Omit when the response
|
|
2034
|
+
* body IS the array.
|
|
2035
|
+
*/
|
|
2036
|
+
readonly resultsPath?: string;
|
|
2037
|
+
}
|
|
2038
|
+
/**
|
|
2039
|
+
* A lookupable entity offered by the `/lookup` palette. Registered by the owning
|
|
2040
|
+
* app (a federation remote self-registers at boot, mirroring {@link AgentCommand})
|
|
2041
|
+
* or, once manifest-backed, projected from the app's `lookups[]` manifest section.
|
|
2042
|
+
*
|
|
2043
|
+
* The descriptor is a shallow, business-logic-free descriptor: it tells the
|
|
2044
|
+
* picker WHAT to search, WHERE it is offered, and HOW to map the response — the
|
|
2045
|
+
* picker owns the typeahead UX, the shell owns the HTTP call.
|
|
2046
|
+
*/
|
|
2047
|
+
interface LookupDescriptor {
|
|
2048
|
+
/**
|
|
2049
|
+
* Stable entity key, kebab/lower, e.g. `scenario`. Doubles as the `/lookup
|
|
2050
|
+
* <entity>` sub-token and the group key the picked ref is grouped under when
|
|
2051
|
+
* serialized for the agent.
|
|
2052
|
+
*/
|
|
2053
|
+
readonly entity: string;
|
|
2054
|
+
/** i18n key for the entity's display name in the picker / palette. */
|
|
2055
|
+
readonly labelKey: string;
|
|
2056
|
+
/** Optional PrimeIcons class for the picker row + chip. */
|
|
2057
|
+
readonly icon?: string;
|
|
2058
|
+
/**
|
|
2059
|
+
* Route globs where this lookup is offered (matched against the shell's
|
|
2060
|
+
* router url), e.g. `['/scenarios/*', '/trends/*']`. Omit / empty = offered
|
|
2061
|
+
* everywhere the owning app is live.
|
|
2062
|
+
*/
|
|
2063
|
+
readonly pages?: readonly string[];
|
|
2064
|
+
/** How to fetch + map candidates. */
|
|
2065
|
+
readonly search: LookupSearch;
|
|
2066
|
+
}
|
|
2067
|
+
/** What hosts pass to the lookup registry. Adds the scope to {@link LookupDescriptor}. */
|
|
2068
|
+
interface LookupRegistration extends LookupDescriptor {
|
|
2069
|
+
/** Same scoping semantics as {@link AgentCommandScope}. */
|
|
2070
|
+
readonly scope: AgentCommandScope;
|
|
2071
|
+
}
|
|
2072
|
+
/** One resolved row the picker returns once the user selects a candidate. */
|
|
2073
|
+
interface LookupResult {
|
|
2074
|
+
/** The entity kind (echoes {@link LookupDescriptor.entity}). */
|
|
2075
|
+
readonly entity: string;
|
|
2076
|
+
/** Selected entity id. */
|
|
2077
|
+
readonly id: string;
|
|
2078
|
+
/** Selected entity's display label. */
|
|
2079
|
+
readonly label: string;
|
|
2080
|
+
/** Optional secondary detail (status / category). */
|
|
2081
|
+
readonly secondary?: string;
|
|
2082
|
+
}
|
|
2083
|
+
/** Disposable handle returned by the lookup registry. Idempotent `dispose()`. */
|
|
2084
|
+
interface LookupHandle {
|
|
2085
|
+
dispose(): void;
|
|
2086
|
+
}
|
|
2087
|
+
/**
|
|
2088
|
+
* The wire envelope used by both the drag/drop surface and the imperative
|
|
2089
|
+
* {@link AgentActionBus}. Renderers narrow on `kind`; mismatches fall back to
|
|
2090
|
+
* `plainTextFallback`.
|
|
2091
|
+
*
|
|
2092
|
+
* The base fields (v1) describe **what** is being handed to the agent panel.
|
|
2093
|
+
* The v2 fields describe **how the agent should treat it** — `userMessage`
|
|
2094
|
+
* scopes the user-visible bubble, `systemContext` extends the system prompt,
|
|
2095
|
+
* `attachments` decorate the message with typed chips, and `mcpScope` hints
|
|
2096
|
+
* the agent toward a tool family. All v2 fields are optional so existing
|
|
2097
|
+
* v1 (drag/drop) payloads remain valid envelopes.
|
|
2098
|
+
*
|
|
2099
|
+
* Caps (see {@link AgentPayloadLimits}):
|
|
2100
|
+
* - JSON total 32 KB
|
|
2101
|
+
* - plainTextFallback 8 KB
|
|
2102
|
+
* - per-string field 4 KB
|
|
2103
|
+
* - userMessage 280 chars
|
|
2104
|
+
* - systemContext 32 entries × 4 KB per value, 8 KB total serialized
|
|
2105
|
+
* - attachments 4 entries, kind-dependent inner caps
|
|
2106
|
+
* - mcpScope.apis 5 prefixes × 128 chars
|
|
2107
|
+
*
|
|
2108
|
+
* The cap math is split per-section so an oversize attachment fails fast at the
|
|
2109
|
+
* attachment site instead of the whole envelope; field paths are dotted (see
|
|
2110
|
+
* {@link AgentPayloadValidationResult}).
|
|
1879
2111
|
*/
|
|
1880
2112
|
interface AgentDragPayload<T = unknown> {
|
|
1881
2113
|
/** Domain-stable kind, e.g. `circles.trend`. */
|
|
1882
2114
|
readonly kind: string;
|
|
1883
2115
|
/** Originating appId. Must match an entry in the host's app registry. */
|
|
1884
2116
|
readonly appId: string;
|
|
1885
|
-
/** Frozen format version.
|
|
1886
|
-
readonly version:
|
|
2117
|
+
/** Frozen format version. Accepted: 1 or {@link AGENT_PAYLOAD_VERSION} (2). */
|
|
2118
|
+
readonly version: number;
|
|
1887
2119
|
/** Domain object. Renderers narrow on `kind`. */
|
|
1888
2120
|
readonly payload: T;
|
|
1889
2121
|
/** Plain-text fallback written to the dataTransfer alongside the typed MIME. */
|
|
1890
2122
|
readonly plainTextFallback: string;
|
|
1891
2123
|
/** Optional command ids to highlight when this payload is dropped. */
|
|
1892
2124
|
readonly suggestedCommandIds?: readonly string[];
|
|
2125
|
+
/**
|
|
2126
|
+
* Short, locale-resolved string the dispatcher wants shown in the user's
|
|
2127
|
+
* chat bubble. The agent panel uses it as the visible message text; when
|
|
2128
|
+
* absent, the panel falls back to a generic per-verb default
|
|
2129
|
+
* (e.g. "Tell me more about this"). Cap 280 chars — chip-sized, not essay.
|
|
2130
|
+
*
|
|
2131
|
+
* This is the ONLY field that should ever surface to the user verbatim.
|
|
2132
|
+
* Everything else (systemContext, attachment bodies, mcpScope) is wire-only.
|
|
2133
|
+
*/
|
|
2134
|
+
readonly userMessage?: string;
|
|
2135
|
+
/**
|
|
2136
|
+
* Flat key→string facts the dispatcher wants injected into the agent's
|
|
2137
|
+
* system prompt for this turn. Keys are dot-namespaced (e.g.
|
|
2138
|
+
* `chart.name`, `chart.type`, `chart.dimension`) to keep the model's
|
|
2139
|
+
* mental schema flat and grep-friendly. Values are strings — booleans,
|
|
2140
|
+
* numbers, and dates must be pre-serialized at the call site so the
|
|
2141
|
+
* dispatcher owns the formatting (timezone, locale, number style).
|
|
2142
|
+
*
|
|
2143
|
+
* Cap: 32 entries, 4 KB per value, 8 KB total when serialized.
|
|
2144
|
+
*
|
|
2145
|
+
* NOT user-visible. The agent panel may transiently embed this as an
|
|
2146
|
+
* `[Internal context]` block in the wire content while the backend
|
|
2147
|
+
* learns to consume the dedicated field, but never renders it in the
|
|
2148
|
+
* user bubble.
|
|
2149
|
+
*/
|
|
2150
|
+
readonly systemContext?: Readonly<Record<string, string>>;
|
|
2151
|
+
/**
|
|
2152
|
+
* Typed attachments rendered as a chip strip under the user's outgoing
|
|
2153
|
+
* message bubble. Each entry has a `kind` discriminator and a `label`
|
|
2154
|
+
* (locale-resolved by the dispatcher). v2 ships `json` + `text`;
|
|
2155
|
+
* `image` and `file` are reserved — their interfaces are stable so
|
|
2156
|
+
* future callers don't need a contract bump, but the panel may render
|
|
2157
|
+
* a generic chip for them until per-kind renderers land.
|
|
2158
|
+
*
|
|
2159
|
+
* Cap: 4 entries per envelope. Per-kind body caps:
|
|
2160
|
+
* - json: 16 KB serialized
|
|
2161
|
+
* - text: 8 KB UTF-8
|
|
2162
|
+
* - image / file: dataUrl ≤ 32 KB (small previews; large media stays in
|
|
2163
|
+
* the files-manager and is referenced by id)
|
|
2164
|
+
*/
|
|
2165
|
+
readonly attachments?: readonly AgentEnvelopeAttachment[];
|
|
2166
|
+
/**
|
|
2167
|
+
* Advisory MCP scope. The agent service injects these prefixes into the
|
|
2168
|
+
* system prompt as a tool-selection hint ("prefer tools matching
|
|
2169
|
+
* `dashboard.reports.*` for this turn") — NOT a hard filter. The agent
|
|
2170
|
+
* remains free to pick any tool; this just biases the first guess so a
|
|
2171
|
+
* dashboard explain doesn't waste a tool-call probing Notes APIs first.
|
|
2172
|
+
*
|
|
2173
|
+
* Cap: 5 prefixes × 128 chars. Prefixes should match gateway-aggregated
|
|
2174
|
+
* OpenAPI tag/path roots so they line up with the names the MCP server
|
|
2175
|
+
* exposes — see `src/backend/gateway` Swagger aggregation + the dynamic
|
|
2176
|
+
* loader in `src/backend/mcp-server`.
|
|
2177
|
+
*/
|
|
2178
|
+
readonly mcpScope?: AgentMcpScope;
|
|
2179
|
+
/**
|
|
2180
|
+
* Optional deep-link route the originating app can use to re-open the
|
|
2181
|
+
* source object. When set, payload chips (and any other renderer that
|
|
2182
|
+
* surfaces the envelope to the user) become clickable — clicking calls
|
|
2183
|
+
* `ShellLauncherService.launch({ appId, route: deepLinkRoute })` so the
|
|
2184
|
+
* target app opens / focuses and navigates to the originating object.
|
|
2185
|
+
*
|
|
2186
|
+
* Shape constraints (mirror `DeepLinkService.isValidRoute`):
|
|
2187
|
+
* - starts with `/`
|
|
2188
|
+
* - ≤ {@link AgentPayloadLimits.maxDeepLinkRouteBytes} bytes (default
|
|
2189
|
+
* 1024) — matches the route limit on the wider shell deep-link
|
|
2190
|
+
* contract so this field can be handed straight to the launcher.
|
|
2191
|
+
* - no `..` segments
|
|
2192
|
+
* - no `//` runs
|
|
2193
|
+
* - no scheme-like prefixes (`/javascript:`, `/data:`, `/http:`, `/https:`)
|
|
2194
|
+
*
|
|
2195
|
+
* The DS validator enforces only the byte cap — full route syntax
|
|
2196
|
+
* validation is owned by the shell side (`DeepLinkService`) because the
|
|
2197
|
+
* DS package is shell-agnostic and shouldn't grow a second copy of the
|
|
2198
|
+
* URL grammar. Apps building envelopes are expected to stamp routes that
|
|
2199
|
+
* match their own internal route schema (e.g. dashboard publishes
|
|
2200
|
+
* `/reports/{id}` and `/custom/{id}`); see `skills/cross-app-deep-linking.md`.
|
|
2201
|
+
*
|
|
2202
|
+
* Backwards-compat: absent on v1 payloads and on v2 payloads built
|
|
2203
|
+
* before this field was added. Persisted JSONB chips without the field
|
|
2204
|
+
* remain non-clickable; new chips light up automatically.
|
|
2205
|
+
*/
|
|
2206
|
+
readonly deepLinkRoute?: string;
|
|
2207
|
+
}
|
|
2208
|
+
/**
|
|
2209
|
+
* Canonical name for the bus-side envelope. v2 callers should reference this
|
|
2210
|
+
* over {@link AgentDragPayload} for clarity — the underlying shape is
|
|
2211
|
+
* identical, but the name signals "this is going to the agent, not to a
|
|
2212
|
+
* drop zone." The alias is intentional: one wire shape, two semantic uses.
|
|
2213
|
+
*/
|
|
2214
|
+
type AgentMessageEnvelope<T = unknown> = AgentDragPayload<T>;
|
|
2215
|
+
/**
|
|
2216
|
+
* Typed attachment discriminator for {@link AgentDragPayload.attachments}.
|
|
2217
|
+
*
|
|
2218
|
+
* - `json` — structured data the panel renders as a "code-ish" chip the
|
|
2219
|
+
* user can expand. Used for chart snapshots, query results, etc.
|
|
2220
|
+
* - `text` — short utterance / excerpt with optional MIME. Used when the
|
|
2221
|
+
* dispatcher wants the chip to preview a note paragraph, log line,
|
|
2222
|
+
* code snippet, etc.
|
|
2223
|
+
* - `image` / `file` — reserved. Stable interface; renderers added per
|
|
2224
|
+
* downstream caller (the panel may fall back to a generic icon-chip).
|
|
2225
|
+
*
|
|
2226
|
+
* Every kind carries `label` — that's what shows on the chip face and what
|
|
2227
|
+
* a11y trees announce.
|
|
2228
|
+
*/
|
|
2229
|
+
type AgentEnvelopeAttachment = {
|
|
2230
|
+
readonly kind: 'json';
|
|
2231
|
+
readonly label: string;
|
|
2232
|
+
readonly json: unknown;
|
|
2233
|
+
} | {
|
|
2234
|
+
readonly kind: 'text';
|
|
2235
|
+
readonly label: string;
|
|
2236
|
+
readonly text: string;
|
|
2237
|
+
readonly mimeType?: string;
|
|
2238
|
+
} | {
|
|
2239
|
+
readonly kind: 'image';
|
|
2240
|
+
readonly label: string;
|
|
2241
|
+
/** `data:` URL — small previews only. Large media stays in files-manager. */
|
|
2242
|
+
readonly dataUrl: string;
|
|
2243
|
+
readonly mimeType: string;
|
|
2244
|
+
} | {
|
|
2245
|
+
readonly kind: 'file';
|
|
2246
|
+
readonly label: string;
|
|
2247
|
+
readonly dataUrl: string;
|
|
2248
|
+
readonly mimeType: string;
|
|
2249
|
+
readonly bytes: number;
|
|
2250
|
+
};
|
|
2251
|
+
/** Advisory tool-selection hint for {@link AgentDragPayload.mcpScope}. */
|
|
2252
|
+
interface AgentMcpScope {
|
|
2253
|
+
/**
|
|
2254
|
+
* Prefixes of gateway-aggregated OpenAPI tags / path roots — e.g.
|
|
2255
|
+
* `dashboard.reports`, `notes.documents`. The agent service treats these
|
|
2256
|
+
* as a soft preference, not a hard filter.
|
|
2257
|
+
*/
|
|
2258
|
+
readonly apis: readonly string[];
|
|
1893
2259
|
}
|
|
1894
2260
|
/**
|
|
1895
2261
|
* Where a chip is being rendered. `inline` = inside the input chip tray (removable);
|
|
@@ -1937,6 +2303,32 @@ interface AgentPayloadLimits {
|
|
|
1937
2303
|
readonly maxPlainTextFallbackBytes: number;
|
|
1938
2304
|
/** Cap on any single string field inside payload (recursive). Default 4 KB. */
|
|
1939
2305
|
readonly maxStringFieldBytes: number;
|
|
2306
|
+
/** Cap on `userMessage` UTF-8 byte length. Default 280 chars (~1.1 KB). */
|
|
2307
|
+
readonly maxUserMessageBytes: number;
|
|
2308
|
+
/** Max entries in `systemContext`. Default 32. */
|
|
2309
|
+
readonly maxSystemContextEntries: number;
|
|
2310
|
+
/** Cap on any single systemContext value's UTF-8 byte length. Default 4 KB. */
|
|
2311
|
+
readonly maxSystemContextValueBytes: number;
|
|
2312
|
+
/** Cap on the full JSON.stringify(systemContext). Default 8 KB. */
|
|
2313
|
+
readonly maxSystemContextJsonBytes: number;
|
|
2314
|
+
/** Max attachments per envelope. Default 4. */
|
|
2315
|
+
readonly maxAttachments: number;
|
|
2316
|
+
/** Cap on a `json` attachment's serialized body. Default 16 KB. */
|
|
2317
|
+
readonly maxAttachmentJsonBytes: number;
|
|
2318
|
+
/** Cap on a `text` attachment's body bytes. Default 8 KB. */
|
|
2319
|
+
readonly maxAttachmentTextBytes: number;
|
|
2320
|
+
/** Cap on an `image` / `file` attachment's dataUrl bytes. Default 32 KB. */
|
|
2321
|
+
readonly maxAttachmentDataUrlBytes: number;
|
|
2322
|
+
/** Max prefixes in `mcpScope.apis`. Default 5. */
|
|
2323
|
+
readonly maxMcpScopeApis: number;
|
|
2324
|
+
/** Cap on any single mcpScope prefix string. Default 128 chars. */
|
|
2325
|
+
readonly maxMcpScopeApiBytes: number;
|
|
2326
|
+
/**
|
|
2327
|
+
* Cap on `deepLinkRoute` UTF-8 byte length. Default 1024 bytes — matches
|
|
2328
|
+
* the route limit on `DeepLinkService.isValidRoute` so this field can be
|
|
2329
|
+
* handed straight to the shell launcher without a second resize.
|
|
2330
|
+
*/
|
|
2331
|
+
readonly maxDeepLinkRouteBytes: number;
|
|
1940
2332
|
}
|
|
1941
2333
|
declare const DEFAULT_AGENT_PAYLOAD_LIMITS: AgentPayloadLimits;
|
|
1942
2334
|
/**
|
|
@@ -1951,7 +2343,7 @@ type AgentPayloadValidationResult = {
|
|
|
1951
2343
|
readonly ok: true;
|
|
1952
2344
|
} | {
|
|
1953
2345
|
readonly ok: false;
|
|
1954
|
-
readonly reason: 'json_too_large' | 'fallback_too_large' | 'field_too_large' | 'invalid_version' | 'invalid_kind';
|
|
2346
|
+
readonly reason: 'json_too_large' | 'fallback_too_large' | 'field_too_large' | 'invalid_version' | 'invalid_kind' | 'user_message_too_large' | 'system_context_too_many_entries' | 'system_context_value_too_large' | 'system_context_json_too_large' | 'too_many_attachments' | 'attachment_invalid_kind' | 'attachment_json_too_large' | 'attachment_text_too_large' | 'attachment_data_url_too_large' | 'mcp_scope_too_many_apis' | 'mcp_scope_api_too_large' | 'deep_link_route_too_large' | 'deep_link_route_invalid_shape';
|
|
1955
2347
|
/** Dotted property-access path to the offending field, e.g. `payload.title` or `payload.tags[2]`. NOT RFC 6901 JSON Pointer. */
|
|
1956
2348
|
readonly fieldPath?: string;
|
|
1957
2349
|
readonly actualBytes?: number;
|
|
@@ -2007,6 +2399,53 @@ declare class AgentCommandRegistry {
|
|
|
2007
2399
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AgentCommandRegistry>;
|
|
2008
2400
|
}
|
|
2009
2401
|
|
|
2402
|
+
/**
|
|
2403
|
+
* Singleton registry of entity lookups offered by the `/lookup` typeahead.
|
|
2404
|
+
*
|
|
2405
|
+
* Mirrors {@link AgentCommandRegistry} exactly — same federation-singleton story
|
|
2406
|
+
* (`sharedMappings: ['@mohamedatia/fly-design-system']`), same id-collision
|
|
2407
|
+
* "latest wins" contract, same disposable-handle ergonomics. Federated remotes
|
|
2408
|
+
* register their lookupable entities at boot (Circles: scenario / trend / signal)
|
|
2409
|
+
* and dispose on window close, so the picker only ever offers entities whose app
|
|
2410
|
+
* is currently live.
|
|
2411
|
+
*
|
|
2412
|
+
* Storage is a signal store keyed on {@link LookupRegistration.entity}. Because
|
|
2413
|
+
* `entity` is the collision key, an app re-registering the same entity replaces
|
|
2414
|
+
* the prior descriptor; a stale handle's `dispose()` then no-ops.
|
|
2415
|
+
*/
|
|
2416
|
+
declare class AgentLookupRegistry {
|
|
2417
|
+
private readonly _lookups;
|
|
2418
|
+
/** All currently-registered lookups, in insertion order. */
|
|
2419
|
+
readonly all: Signal<readonly LookupRegistration[]>;
|
|
2420
|
+
/**
|
|
2421
|
+
* Lookups whose scope is `'global'` OR whose `scope.appId` is in the live app
|
|
2422
|
+
* set. Recomputes when either the registry or `liveAppIds` changes — pass a
|
|
2423
|
+
* `Signal<ReadonlySet<string>>` from the host's app-registry for reactive
|
|
2424
|
+
* filtering, exactly like {@link AgentCommandRegistry.visible}.
|
|
2425
|
+
*/
|
|
2426
|
+
visible(liveAppIds: ReadonlySet<string> | Signal<ReadonlySet<string>>): Signal<readonly LookupRegistration[]>;
|
|
2427
|
+
/**
|
|
2428
|
+
* Register one lookup. Returns a handle whose `dispose()` removes the row by
|
|
2429
|
+
* `entity`. A later re-registration of the same entity makes the original
|
|
2430
|
+
* handle's `dispose()` a no-op (the newer registration owns the row).
|
|
2431
|
+
*/
|
|
2432
|
+
register(lookup: LookupRegistration): LookupHandle;
|
|
2433
|
+
/**
|
|
2434
|
+
* Bulk register. Rolls back on a duplicate entity WITHIN the input batch
|
|
2435
|
+
* (throws before any row lands). Cross-batch duplicates against existing rows
|
|
2436
|
+
* follow the standard "latest wins" rule and do NOT trigger rollback.
|
|
2437
|
+
*/
|
|
2438
|
+
registerAll(lookups: readonly LookupRegistration[]): LookupHandle;
|
|
2439
|
+
/** Tear down by entity. Idempotent. */
|
|
2440
|
+
unregister(entity: string): void;
|
|
2441
|
+
/** Monotonic counter; identifies which registration call currently owns each entity. */
|
|
2442
|
+
private _generation;
|
|
2443
|
+
/** entity → generation. Lets a stale handle's `dispose()` no-op after replacement. */
|
|
2444
|
+
private readonly _owners;
|
|
2445
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AgentLookupRegistry, never>;
|
|
2446
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AgentLookupRegistry>;
|
|
2447
|
+
}
|
|
2448
|
+
|
|
2010
2449
|
/**
|
|
2011
2450
|
* Singleton registry of chip-renderer components and keyboard-alternative draggable
|
|
2012
2451
|
* items, keyed by `kind` and `appId`.
|
|
@@ -2063,6 +2502,202 @@ declare class AgentDropRegistry {
|
|
|
2063
2502
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AgentDropRegistry>;
|
|
2064
2503
|
}
|
|
2065
2504
|
|
|
2505
|
+
/**
|
|
2506
|
+
* Imperative action published by an app, consumed by the agent panel.
|
|
2507
|
+
*
|
|
2508
|
+
* Re-uses {@link AgentDragPayload} as the wire envelope so a dragged item
|
|
2509
|
+
* and a programmatic "Explain" click are byte-for-byte the same shape —
|
|
2510
|
+
* renderers, validators, and serialisation paths never fork on transport.
|
|
2511
|
+
*
|
|
2512
|
+
* Adding a verb is a minor DS bump (consumers ignore unknown verbs in
|
|
2513
|
+
* their `switch`). Removing one is a major DS bump.
|
|
2514
|
+
*/
|
|
2515
|
+
type AgentActionVerb = 'explain' | 'why-empty' | 'compose-query' | 'compare' | 'forecast' | 'summarize';
|
|
2516
|
+
/**
|
|
2517
|
+
* Whether the agent panel sends the staged payload immediately or stages
|
|
2518
|
+
* the chip for the user to edit and send manually.
|
|
2519
|
+
*
|
|
2520
|
+
* Phase 1 (DS v2.6.0) supports `'stage'` only. Dispatching with `'auto'`
|
|
2521
|
+
* throws {@link AgentActionUnsupportedDispatchError} so callers don't
|
|
2522
|
+
* silently fail. `'auto'` lands once `AgentInputComponent.programmaticSubmit`
|
|
2523
|
+
* is exposed and reviewed against the input's state machine.
|
|
2524
|
+
*/
|
|
2525
|
+
type AgentActionDispatch = 'auto' | 'stage';
|
|
2526
|
+
interface AgentAction<T = unknown> {
|
|
2527
|
+
/** Intent the agent should apply to {@link payload}. */
|
|
2528
|
+
readonly verb: AgentActionVerb;
|
|
2529
|
+
/** The wire envelope. Validated against {@link validateAgentPayload}'s
|
|
2530
|
+
* size caps before the bus fans it out. */
|
|
2531
|
+
readonly payload: AgentDragPayload<T>;
|
|
2532
|
+
/** Optional slash command id to bind before send (e.g. `'explain-report'`).
|
|
2533
|
+
* Phase 1 captures this for telemetry only — actual binding lands when
|
|
2534
|
+
* the input's programmatic-send API ships. An unknown id is dropped
|
|
2535
|
+
* silently with a console warning, the chip still arrives. */
|
|
2536
|
+
readonly autoCommandId?: string;
|
|
2537
|
+
/** Phase 1 supports `'stage'` only. See {@link AgentActionDispatch}. */
|
|
2538
|
+
readonly dispatch: AgentActionDispatch;
|
|
2539
|
+
/** Source DOM rect for the FLIP entry animation. Omit to skip the
|
|
2540
|
+
* animation (e.g. dispatching from a keyboard shortcut with no anchor). */
|
|
2541
|
+
readonly originRect?: DOMRect;
|
|
2542
|
+
/** Optional HTML snippet rendered inside the flight ghost. Callers are
|
|
2543
|
+
* responsible for escaping untrusted text — the bus does not sanitise.
|
|
2544
|
+
* Defaults (when omitted) to a strong-wrapped escape of the payload's
|
|
2545
|
+
* `plainTextFallback` rendered by the panel host. */
|
|
2546
|
+
readonly originPreviewHtml?: string;
|
|
2547
|
+
}
|
|
2548
|
+
/**
|
|
2549
|
+
* Thrown synchronously by {@link AgentActionBus.dispatch} when a caller
|
|
2550
|
+
* supplies a dispatch mode this DS version doesn't implement yet. Catching
|
|
2551
|
+
* by class name lets a forward-compatible caller fall back to `'stage'`
|
|
2552
|
+
* without depending on instanceof across federation boundaries.
|
|
2553
|
+
*/
|
|
2554
|
+
declare class AgentActionUnsupportedDispatchError extends Error {
|
|
2555
|
+
readonly dispatch: AgentActionDispatch;
|
|
2556
|
+
constructor(dispatch: AgentActionDispatch);
|
|
2557
|
+
}
|
|
2558
|
+
|
|
2559
|
+
/**
|
|
2560
|
+
* Imperative sibling to {@link AgentCommandRegistry} / {@link AgentDropRegistry}.
|
|
2561
|
+
*
|
|
2562
|
+
* Apps call {@link dispatch} to push a typed {@link AgentAction} onto the bus;
|
|
2563
|
+
* the agent panel subscribes once at construct and routes by verb. The bus
|
|
2564
|
+
* itself is a thin pass-through — it does NOT decide UI behaviour. The
|
|
2565
|
+
* subscriber (agent-panel) owns: showing the panel, staging the chip,
|
|
2566
|
+
* triggering the flight animation, and binding the command. This keeps the
|
|
2567
|
+
* DS free of host policy.
|
|
2568
|
+
*
|
|
2569
|
+
* Federation-safe: `providedIn: 'root'` + `sharedMappings: ['@mohamedatia/fly-design-system']`
|
|
2570
|
+
* give every federated remote the same singleton, so a remote's "Explain"
|
|
2571
|
+
* button reaches the host's panel without any cross-bundle wiring.
|
|
2572
|
+
*
|
|
2573
|
+
* Validation runs synchronously inside `dispatch` so a caller that sends an
|
|
2574
|
+
* oversize payload sees the throw at their site, not on the subscriber. The
|
|
2575
|
+
* subscriber therefore never has to defend against malformed envelopes.
|
|
2576
|
+
*/
|
|
2577
|
+
declare class AgentActionBus {
|
|
2578
|
+
private readonly _actions$;
|
|
2579
|
+
/** Hot stream of actions in dispatch order. Subscribers receive only
|
|
2580
|
+
* actions dispatched AFTER they subscribe — late subscribers see nothing
|
|
2581
|
+
* retroactively. Use {@link lastAction} for the latest snapshot. */
|
|
2582
|
+
readonly actions$: Observable<AgentAction>;
|
|
2583
|
+
/** Most recent action — for DevTools, smoke tests, and late-subscriber
|
|
2584
|
+
* catch-up. Null until the first successful dispatch. */
|
|
2585
|
+
readonly lastAction: _angular_core.WritableSignal<AgentAction<unknown> | null>;
|
|
2586
|
+
/**
|
|
2587
|
+
* The action currently being processed by the subscriber, or null when
|
|
2588
|
+
* none. Set by {@link dispatch} immediately before emitting on
|
|
2589
|
+
* {@link actions$}; cleared by the subscriber via {@link settle} once
|
|
2590
|
+
* it finishes its handler (success or fail). Lets the dispatcher render
|
|
2591
|
+
* a busy state on the originating control — e.g. a card swapping its
|
|
2592
|
+
* sparkle icon for a spinner while the agent panel mints the optimistic
|
|
2593
|
+
* thread and starts the request. Identity check (`bus.inFlight() === act`)
|
|
2594
|
+
* is the panel-side contract; dispatchers usually project to a stable id
|
|
2595
|
+
* inside the payload (e.g. <c>reportId</c>) to scope busy-state visually.
|
|
2596
|
+
*
|
|
2597
|
+
* If multiple dispatches race, the latest wins — the prior in-flight
|
|
2598
|
+
* action is dropped on the floor here (the panel may still handle it,
|
|
2599
|
+
* but the dispatcher's busy indicator follows the newer action). Apps
|
|
2600
|
+
* that need stricter single-flight semantics should guard at the call
|
|
2601
|
+
* site (the agent-panel's <c>_pendingTempThreadId</c> already does so
|
|
2602
|
+
* for the explain verb).
|
|
2603
|
+
*/
|
|
2604
|
+
readonly inFlight: _angular_core.WritableSignal<AgentAction<unknown> | null>;
|
|
2605
|
+
/**
|
|
2606
|
+
* Push an action onto the bus.
|
|
2607
|
+
*
|
|
2608
|
+
* Throws synchronously when:
|
|
2609
|
+
* - `dispatch === 'auto'` (not implemented in this DS version) — see
|
|
2610
|
+
* {@link AgentActionUnsupportedDispatchError}.
|
|
2611
|
+
* - the payload fails {@link validateAgentPayload} (oversize, invalid
|
|
2612
|
+
* version, invalid kind). The error message carries the field path
|
|
2613
|
+
* so the caller can fix the offending field.
|
|
2614
|
+
*
|
|
2615
|
+
* Subscribers see the action via {@link actions$} on the next tick of
|
|
2616
|
+
* the Subject; the {@link lastAction} signal updates synchronously
|
|
2617
|
+
* before the Subject emits so an effect reading both stays consistent.
|
|
2618
|
+
*/
|
|
2619
|
+
dispatch<T>(action: AgentAction<T>): void;
|
|
2620
|
+
/**
|
|
2621
|
+
* Subscriber contract: call after the handler for {@link inFlight}
|
|
2622
|
+
* completes (success or fail). Only clears {@link inFlight} if it still
|
|
2623
|
+
* points at the passed action — a no-op when a later dispatch already
|
|
2624
|
+
* superseded it. Pass the same action reference the subscriber received
|
|
2625
|
+
* from {@link actions$}; identity is the gate.
|
|
2626
|
+
*/
|
|
2627
|
+
settle(action: AgentAction): void;
|
|
2628
|
+
/**
|
|
2629
|
+
* Semantic alias of {@link settle} for explicit user-driven cancellation —
|
|
2630
|
+
* e.g. a future "Stop" button in the agent input tray, or a dispatcher
|
|
2631
|
+
* teardown that wants to abandon its own in-flight action. Identical
|
|
2632
|
+
* runtime behaviour (identity check + clear), but the two-method surface
|
|
2633
|
+
* lets the UI distinguish "handler finished" from "user said no" in
|
|
2634
|
+
* telemetry / logs without sniffing a "reason" parameter.
|
|
2635
|
+
*
|
|
2636
|
+
* Pass the same action reference returned from {@link inFlight} or held
|
|
2637
|
+
* by the dispatcher; identity is the gate.
|
|
2638
|
+
*/
|
|
2639
|
+
cancel(action: AgentAction): void;
|
|
2640
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AgentActionBus, never>;
|
|
2641
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AgentActionBus>;
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
/**
|
|
2645
|
+
* FLIP-style entry animation for payloads landing in the agent panel.
|
|
2646
|
+
*
|
|
2647
|
+
* Pure DOM + Web Animations API — no Chart.js, no Angular animations module,
|
|
2648
|
+
* no CSS transitions racing layout. Honours `prefers-reduced-motion`: the
|
|
2649
|
+
* ghost is appended then removed without animating when the user asked for
|
|
2650
|
+
* less motion (so DOM side-effects stay consistent).
|
|
2651
|
+
*
|
|
2652
|
+
* Lifecycle:
|
|
2653
|
+
* 1. The agent panel calls {@link registerTarget} in `ngAfterViewInit`
|
|
2654
|
+
* with its header element.
|
|
2655
|
+
* 2. A source app dispatches an `AgentAction` carrying an `originRect`
|
|
2656
|
+
* from `getBoundingClientRect()` on the click target.
|
|
2657
|
+
* 3. The bus subscriber calls {@link flyInto} with that rect.
|
|
2658
|
+
* 4. The animator creates a fixed-position ghost at the origin, animates
|
|
2659
|
+
* transform + opacity toward the registered target's rect, then
|
|
2660
|
+
* removes itself on `onfinish` / `oncancel`.
|
|
2661
|
+
*
|
|
2662
|
+
* Uses `getBoundingClientRect()` (physical viewport coords) so the animation
|
|
2663
|
+
* is RTL-correct without inset-inline math — the rect already encodes the
|
|
2664
|
+
* physical position regardless of `dir`.
|
|
2665
|
+
*
|
|
2666
|
+
* The 900 ms duration and easing curve are deliberately hardcoded — making
|
|
2667
|
+
* them configurable surfaces an API the host can't usefully tune without
|
|
2668
|
+
* understanding motion design as a whole.
|
|
2669
|
+
*/
|
|
2670
|
+
declare class AgentFlightAnimator {
|
|
2671
|
+
/** Hardcoded — see class doc. */
|
|
2672
|
+
private static readonly DURATION_MS;
|
|
2673
|
+
private static readonly EASING;
|
|
2674
|
+
/** Floor the target/source scale ratio so a tiny target rect doesn't
|
|
2675
|
+
* collapse the ghost to invisibility before the animation finishes. */
|
|
2676
|
+
private static readonly MIN_SCALE;
|
|
2677
|
+
private targetEl;
|
|
2678
|
+
/** Called by the panel host to publish where flights should land. Pass
|
|
2679
|
+
* `null` on destroy so a re-mounted panel doesn't leave the animator
|
|
2680
|
+
* pointing at a detached node. */
|
|
2681
|
+
registerTarget(el: HTMLElement | null): void;
|
|
2682
|
+
/**
|
|
2683
|
+
* Animate a ghost element from {@link from} to the registered target's
|
|
2684
|
+
* rect. No-ops when:
|
|
2685
|
+
* - no target is registered (silent — panel may not be mounted yet)
|
|
2686
|
+
* - running outside a browser (SSR safety)
|
|
2687
|
+
* - the user has `prefers-reduced-motion: reduce` set (DOM is still
|
|
2688
|
+
* touched so callers see consistent side-effects, but no animation
|
|
2689
|
+
* runs)
|
|
2690
|
+
*
|
|
2691
|
+
* The ghost is appended to `document.body` (not the panel) so a parent
|
|
2692
|
+
* `overflow: hidden` on the panel can't clip the flight path.
|
|
2693
|
+
*/
|
|
2694
|
+
flyInto(from: DOMRect, opts?: {
|
|
2695
|
+
previewHtml?: string;
|
|
2696
|
+
}): void;
|
|
2697
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AgentFlightAnimator, never>;
|
|
2698
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AgentFlightAnimator>;
|
|
2699
|
+
}
|
|
2700
|
+
|
|
2066
2701
|
/**
|
|
2067
2702
|
* Single canonical way to declare a drag source for the agent input.
|
|
2068
2703
|
*
|
|
@@ -2115,6 +2750,71 @@ declare class FlyAgentDraggableDirective<T = unknown> {
|
|
|
2115
2750
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FlyAgentDraggableDirective<any>, "[flyAgentDraggable]", never, { "flyAgentDraggable": { "alias": "flyAgentDraggable"; "required": true; "isSignal": true; }; "flyAgentDraggableGhostId": { "alias": "flyAgentDraggableGhostId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2116
2751
|
}
|
|
2117
2752
|
|
|
2753
|
+
/**
|
|
2754
|
+
* Renders an authenticated image into a host `<img>` element by fetching the
|
|
2755
|
+
* resource as a blob through Angular's `HttpClient` and binding the resulting
|
|
2756
|
+
* object URL to the host's `src` attribute.
|
|
2757
|
+
*
|
|
2758
|
+
* Why this exists: every Business / Supporting app stores files in the Files
|
|
2759
|
+
* Manager service, which authenticates with a Bearer JWT. A raw `<img src>`
|
|
2760
|
+
* request bypasses the Angular HTTP interceptor — the browser issues the GET
|
|
2761
|
+
* without the Authorization header, so the response is 401 and the image is
|
|
2762
|
+
* broken. The standard workaround is roughly fifteen lines of `effect` +
|
|
2763
|
+
* `URL.createObjectURL` + `URL.revokeObjectURL` per call site (see prior
|
|
2764
|
+
* inline copies in `FlyImageUploadComponent` and the Circles trend-detail
|
|
2765
|
+
* cover). This directive centralizes that pattern so:
|
|
2766
|
+
*
|
|
2767
|
+
* * Memory hygiene is automatic — the previous object URL is revoked
|
|
2768
|
+
* whenever the input changes and on destroy. Easy to forget inline.
|
|
2769
|
+
* * Error handling is uniform — a fetch failure clears the host `src`
|
|
2770
|
+
* so the browser shows its broken-image affordance once, not the prior
|
|
2771
|
+
* image stuck on screen.
|
|
2772
|
+
* * A future protocol change (per-request signed URLs, CDN tokens, etc.)
|
|
2773
|
+
* lands in one place rather than across every app's image bindings.
|
|
2774
|
+
*
|
|
2775
|
+
* Usage:
|
|
2776
|
+
*
|
|
2777
|
+
* ```html
|
|
2778
|
+
* <img [flySecureSrc]="trend.coverImageId" alt="" class="cover-img" />
|
|
2779
|
+
* ```
|
|
2780
|
+
*
|
|
2781
|
+
* Pass a full URL when the resource lives somewhere other than the default
|
|
2782
|
+
* Files Manager download endpoint:
|
|
2783
|
+
*
|
|
2784
|
+
* ```html
|
|
2785
|
+
* <img [flySecureSrc]="'/api/avatars/' + user.id" alt="" />
|
|
2786
|
+
* ```
|
|
2787
|
+
*
|
|
2788
|
+
* A bare file id (no `/` prefix) is resolved against
|
|
2789
|
+
* `/api/files/{id}/download`, which matches the Files Manager convention
|
|
2790
|
+
* used everywhere in the platform. Anything that starts with `/` is treated
|
|
2791
|
+
* as a literal URL and passed through unchanged — apps with bespoke download
|
|
2792
|
+
* routes (signed Excel exports, attachment thumbnails, …) keep working
|
|
2793
|
+
* without a wrapper.
|
|
2794
|
+
*/
|
|
2795
|
+
declare class FlySecureSrcDirective implements OnDestroy {
|
|
2796
|
+
/**
|
|
2797
|
+
* File id or absolute path. Passing `null` / `undefined` / `''` clears the
|
|
2798
|
+
* `src` attribute and revokes the previous blob. Useful when binding to a
|
|
2799
|
+
* signal whose value can become empty (e.g. after a file is detached).
|
|
2800
|
+
*/
|
|
2801
|
+
readonly flySecureSrc: _angular_core.InputSignal<string | null | undefined>;
|
|
2802
|
+
private readonly http;
|
|
2803
|
+
private readonly host;
|
|
2804
|
+
private readonly renderer;
|
|
2805
|
+
/**
|
|
2806
|
+
* The object URL currently bound to the host's `src` attribute. Tracked so
|
|
2807
|
+
* we can revoke it before binding a new one (avoids leaking blob memory
|
|
2808
|
+
* across rapid input changes — e.g. carousel scrubbing) and on destroy.
|
|
2809
|
+
*/
|
|
2810
|
+
private currentUrl;
|
|
2811
|
+
constructor();
|
|
2812
|
+
ngOnDestroy(): void;
|
|
2813
|
+
private releaseCurrent;
|
|
2814
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlySecureSrcDirective, never>;
|
|
2815
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FlySecureSrcDirective, "img[flySecureSrc]", never, { "flySecureSrc": { "alias": "flySecureSrc"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2816
|
+
}
|
|
2817
|
+
|
|
2118
2818
|
/**
|
|
2119
2819
|
* Pure utility helpers for agent drag payload size guarding.
|
|
2120
2820
|
*
|
|
@@ -2166,11 +2866,14 @@ declare function trimAgentString(input: string, maxBytes: number, ellipsis?: str
|
|
|
2166
2866
|
* structured failure with the offending field path and byte counts.
|
|
2167
2867
|
*
|
|
2168
2868
|
* Order of checks (cheap → expensive):
|
|
2169
|
-
* 1. `version`
|
|
2869
|
+
* 1. `version` is in {@link SUPPORTED_AGENT_PAYLOAD_VERSIONS}.
|
|
2170
2870
|
* 2. `kind` is a non-empty string.
|
|
2171
2871
|
* 3. `plainTextFallback` fits its cap.
|
|
2172
2872
|
* 4. Every string in `payload` (recursively) fits the per-field cap.
|
|
2173
|
-
* 5.
|
|
2873
|
+
* 5. v2 sections — `userMessage`, `systemContext`, `attachments`, `mcpScope` —
|
|
2874
|
+
* each fits their independent caps. Skipped when absent so v1 payloads pass
|
|
2875
|
+
* unchanged.
|
|
2876
|
+
* 6. The full `JSON.stringify(envelope)` fits the JSON cap.
|
|
2174
2877
|
*
|
|
2175
2878
|
* The walker stops on the first oversize string field — the intent is to surface
|
|
2176
2879
|
* actionable feedback, not enumerate every offender.
|
|
@@ -2279,6 +2982,6 @@ declare const AUDIENCE_ERROR_CODES: {
|
|
|
2279
2982
|
};
|
|
2280
2983
|
type AudienceErrorCode = (typeof AUDIENCE_ERROR_CODES)[keyof typeof AUDIENCE_ERROR_CODES];
|
|
2281
2984
|
|
|
2282
|
-
export { AGENT_DRAG_MIME, AGENT_PAYLOAD_VERSION, APP_LOOKUP, AUDIENCE_ERROR_CODES, AUDIENCE_LIMITS, AUDIENCE_PRESETS, AUDIENCE_TERM_KINDS, AgentCommandRegistry, AgentDropRegistry, AgentPayloadOversizeError, AudienceBuilderComponent, AuthService, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DialogResult, FLYOS_LAUNCH_EVENT, FLY_LOCALE_CATALOG, FLY_REMOTE_BASE_PATH, FLY_REMOTE_ROUTES, FLY_THEME_MODE_IDS, FlyAgentDraggableDirective, FlyBlockUiComponent, FlyFileUploadComponent, FlyImageUploadComponent, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlyThemeService, FlyosPendingLaunchesGlobalKey, I18nService, LAUNCH_CONTEXT, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, TranslatePipe, WINDOW_DATA, WindowManagerService, findLocaleByDialect, findLocaleByPrefix, isRtlLocale, isRtlLocaleEntry, loadRemoteStyles, matchFlyRoutePattern, normalizeFlyTheme, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload };
|
|
2283
|
-
export type { AgentChipHostInputs, AgentCommand, AgentCommandHandle, AgentCommandRegistration, AgentCommandScope, AgentDragPayload, AgentDraggableItem, AgentDropChipMode, AgentDropRendererRegistration, AgentPayloadLimits, AgentPayloadValidationResult, AppEveryonePrincipal, AppEveryoneTerm, AppLookup, AppLookupEntry, AudienceEditTarget, AudienceErrorCode, AudienceFilter, AudienceOptions, AudiencePresetKind, AudienceTerm, AudienceTermKind, ChartTerm, ChildWindowData, ContextMenuItem, ContextMenuSection, DesktopApp, DesktopAppKind, DialogResultWithAcknowledgement, FlyFileInfo, FlyLaunchEventDetail, FlyLocaleEntry, FlyRemoteMatch, FlyRemoteRoute, FlyThemeMode, FlyosPendingLaunches, LaunchContext, LoadBundleOptions, MessageBoxButton, MessageBoxDontAskAgainConfig, MessageBoxOptions, MessageBoxOptionsWithAcknowledgement, MockAuthConfig, OpenWindowOptions, OuPrincipal, OuTerm, PresetTerm, RemoteAppDef, RoleOuLookupRow, RolePrincipal, RolesTerm, ShareOrgChartOption, ShareOuNode, SharePanelLevelOption, SharePermissionEntry, SharePrincipal, SharePrincipalKind, ShareUserResult, User, UserPrincipal, UsersTerm, WindowInstance, WindowState };
|
|
2985
|
+
export { AGENT_DRAG_MIME, AGENT_PAYLOAD_VERSION, APP_LOOKUP, AUDIENCE_ERROR_CODES, AUDIENCE_LIMITS, AUDIENCE_PRESETS, AUDIENCE_TERM_KINDS, AgentActionBus, AgentActionUnsupportedDispatchError, AgentCommandRegistry, AgentDropRegistry, AgentFlightAnimator, AgentLookupRegistry, AgentPayloadOversizeError, AudienceBuilderComponent, AuthService, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DialogResult, FLYOS_LAUNCH_EVENT, FLY_LOCALE_CATALOG, FLY_REMOTE_BASE_PATH, FLY_REMOTE_ROUTES, FLY_THEME_MODE_IDS, FLY_WINDOW_HELP_HINT_EVENT, FlyAgentDraggableDirective, FlyBlockUiComponent, FlyFileUploadComponent, FlyImageUploadComponent, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySecureSrcDirective, FlyThemeService, FlyWindowHelpService, FlyosPendingLaunchesGlobalKey, I18nService, LAUNCH_CONTEXT, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, SUPPORTED_AGENT_PAYLOAD_VERSIONS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, TranslatePipe, WINDOW_DATA, WINDOW_HELP_HINT, WindowManagerService, findLocaleByDialect, findLocaleByPrefix, isRtlLocale, isRtlLocaleEntry, loadRemoteStyles, matchFlyRoutePattern, normalizeFlyTheme, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload };
|
|
2986
|
+
export type { AgentAction, AgentActionDispatch, AgentActionVerb, AgentChipHostInputs, AgentCommand, AgentCommandHandle, AgentCommandRegistration, AgentCommandScope, AgentDragPayload, AgentDraggableItem, AgentDropChipMode, AgentDropRendererRegistration, AgentEnvelopeAttachment, AgentMcpScope, AgentMessageEnvelope, AgentPayloadLimits, AgentPayloadValidationResult, AppEveryonePrincipal, AppEveryoneTerm, AppLookup, AppLookupEntry, AudienceEditTarget, AudienceErrorCode, AudienceFilter, AudienceOptions, AudiencePresetKind, AudienceTerm, AudienceTermKind, ChartTerm, ChildWindowData, ContextMenuItem, ContextMenuSection, DesktopApp, DesktopAppKind, DialogResultWithAcknowledgement, FlyFileInfo, FlyLaunchEventDetail, FlyLocaleEntry, FlyRemoteMatch, FlyRemoteRoute, FlyThemeMode, FlyWindowHelpHintEventDetail, FlyosPendingLaunches, LaunchContext, LoadBundleOptions, LookupDescriptor, LookupHandle, LookupRegistration, LookupResult, LookupSearch, MessageBoxButton, MessageBoxDontAskAgainConfig, MessageBoxOptions, MessageBoxOptionsWithAcknowledgement, MockAuthConfig, OpenWindowOptions, OuPrincipal, OuTerm, PresetTerm, RemoteAppDef, RoleOuLookupRow, RolePrincipal, RolesTerm, ShareOrgChartOption, ShareOuNode, SharePanelLevelOption, SharePermissionEntry, SharePrincipal, SharePrincipalKind, ShareUserResult, User, UserPrincipal, UsersTerm, WindowHelpHint, WindowInstance, WindowState };
|
|
2284
2987
|
//# sourceMappingURL=mohamedatia-fly-design-system.d.ts.map
|