From 17d170c8a19bf32da7568306a84081fd0c07015d Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 23 Nov 2022 10:37:54 +0000 Subject: [PATCH 001/106] adding bridging spec to fresh branch --- docs/api-bridging/spec.md | 2023 +++++++++++++++++++++++++++++++++++++ 1 file changed, 2023 insertions(+) create mode 100644 docs/api-bridging/spec.md diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md new file mode 100644 index 000000000..e41731894 --- /dev/null +++ b/docs/api-bridging/spec.md @@ -0,0 +1,2023 @@ +--- +id: spec +sidebar_label: Overview +title: API Bridging Overview (next) +--- + +The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent API Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. + +In any Desktop Agent bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. + +## Recent Changes + +* Added/consolidated advice on handling error responses from Desktop Agents in Messaging protocol section + +## Open questions + +## TODO list + +* Complete message exchange documentation for PrivateChannels +* Add notes about flows for raiseIntentForContext and findIntentByContext +* Add getAppMetadata to messages exchange +* Add error details to the error handling +* Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. +* To create final PR: + * Add new terms and acronyms to FDC3 glossary and ensure they are defined in this spec's introduction + * Add new errors to Error enumerations specified in this proposal + * Add RFC 4122 - https://datatracker.ietf.org/doc/html/rfc4122 to FDC3 references page + +## Implementing a Desktop Agent Bridge + +### Topology + +In order to implement Desktop Agent Bridging some means for Desktop Agents to connect to and communicate with each other is needed. This Standard assumes that Desktop Agent Bridging is implemented via a standalone 'bridge' which each agent connects to and will use to route messages to or from other agents. This topology is similar to a star topology in networking, where the Desktop Agent Bridge (a 'bridge') will be the central node acting as a router. + +```mermaid +flowchart TD; + A[DA A] + B[DA B] + C[DA C] + D[DA D] + E{Bridge} + A <--> |websocket| E + E <--> |websocket| B + E <--> |websocket| C + D <--> |websocket| E + E --> |loopback - 127.0.0.1| E +``` + +Other possible topologies include peer-to-peer or client/server networks, however, these introduce significant additional complexity into multiple aspects of the bridging protocol that must be implemented by Desktop Agents, (including discovery, authentication and message routing), where a star topology/standalone bridge enables a relatively simple set of protocols, with the most difficult parts being implemented in the bridge itself. + +Whilst the standalone bridge represents a single point of failure for the interconnection of Desktop Agents, it will also be significantly simpler than a full Desktop Agent implementation. Further, failures may be mitigated by setting the bridge up as a system service, such that it is started when the user's computer is started and may be restarted automatically if it fails. In the event of a bridge failure or manual shutdown, then Desktop Agents will no longer be bridged and should act as single agents. + +In Financial services it is not unusual for a single user to be working with applications on more than one desktop. As Desktop Agents do not span desktops bridging Desktop Agents across multiple machines is an additional use case for Desktop Agent bridging. However, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. + +### Technology & Service Discovery + +Connections between Desktop Agents and the Desktop Agent Bridge will be made via websocket connections, with the bridge acting as the websocket server and each connected Desktop Agent as a client. + +The bridge MUST run on the same machine as the Desktop Agents, and the websocket MUST be bound to the loopback adapter IP address (127.0.0.1), ensuring that the websocket is not exposed to wider networks. + +Bridge implementations SHOULD default to binding the websocket server to a port in the recommended port range 4475 - 4575, enabling simple discovery of a running bridge via attempting socket connections to ports in that range and attempting a handshake (as defined later in this proposal) that will identify the websocket as belong to a Desktop Agent Bridge. A port range is used, in preference to a single nominated port, in order to enable the automatic resolution of port clashes with other services. + +Both DAs and bridge implementations MUST support at least connection to the recommended port range and MAY also support configuration for connection to an alternative bridging port range. + +As part of the Desktop Agent Bridging protocol, a bridge will implement "server" behavior by: + +* Accepting connections from client Desktop Agents, receiving and authenticating credentials and assigning a name (for routing purposes) +* Receiving requests from client Desktop Agents. +* Routing requests to client Desktop Agents. +* Receiving responses from client Desktop Agents and collating them. +* Routing responses to client Desktop Agents. + +A Desktop Agent will implement "client" behavior by: + +* Connecting to the bridge, providing authentication credentials and receiving an assigned named (for purposes) +* Forwarding requests to the bridge. +* Awaiting response(s) from the bridge. +* Receiving requests from the bridge. +* Sending responses to the bridge. + +Hence, message paths and propagation are simple. All messages to other Desktop Agents are passed to the bridge for routing and all messages (both requests and responses) are received back from it, i.e. the bridge is responsible for all message routing. + +#### Collating Responses + +Whilst some FDC3 requests are 'fire and forget' (e.g. broadcast) the main requests such as `findIntent` or `raiseIntent` expect a response. In a bridging scenario, the response can come from multiple Desktop Agents and therefore need to be aggregated and augmented before they are sent back to the requesting DA. + +:::note +A set of classifications for message exchange types are provided in the [Individual message exchanges](#individual-message-exchanges) section. +::: + +The DAB is the responsible entity for collating responses together from all DAs. Whilst this approach may add some complexity to bridge implementations, it will simplify DA implementations since they only need to handle one response. + +The DAB MUST allow for timeout configuration. + +The Bridge SHOULD also implement timeout for waiting on DA responses. Assuming the message exchange will be all intra-machine, a recommended timeout of 1500ms SHOULD be used. Similarly, Desktop Agents SHOULD apply a timeout to requests made to the bridge that require a response (collated or otherwise), to handle situations where the bridge is not responding as expected. A recommended timeout of 3000ms SHOULD be used in this case. + +#### Channels + +It is assumed that Desktop Agents SHOULD adopt the recommended 8 channel set (and the respective display metadata). Desktop Agents MAY support channel customization through configuration. + +The Desktop Agent Bridge MAY support channel mapping ability, to deal with issues caused by differing channel sets. + +A key responsibility of the DAB is ensuring that the channel state of the connected agents is kept in-sync, which requires an initial synchronization step as part of the connection protocol. + +#### Bridging Desktop Agent on Multiple Machines + +As the bridge binds its websocket on the loopback address (127.0.0.1) it cannot be connected to from another device. Hence, an instance of the standalone bridge may be run on each device and those instances exchange messages in order to implement the bridge cross-device. + +However, cross-machine routing is an internal concern of the Desktop Agent Bridge, with each Desktop Agent simply communicating with a bridge instance located on the same machine. The connection protocol between bridges themselves is implementation specific and beyond the scope of this standard. Further, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. However, methods of verifying the identity of user are currently beyond the scope of this Standard. + +## Connection Protocol + +On connection to the bridge's websocket, a handshake must be completed that may include an authentication step before a name is assigned to the Desktop Agent for use in routing messages. The purpose of the handshake is to allow: + +* The Desktop Agent to confirm that it is connecting to Desktop Agent Bridge, rather than another service exposed via a websocket. +* The DAB to require that the Desktop Agent authenticate itself, allowing it to control access to the network of bridged Desktop Agents. +* The Desktop Agent to request a particular name by which it will be addressed by other agents and for the bridge to assign the requested name, after confirming that no other agent is connected with that name, or a derivative of that name if it is already in use. + +The bridge is ultimately responsible for assigning each Desktop Agent a name and for routing messages using those names. Desktop Agents MUST accept the name they are assigned by the bridge. + +Exchange standardized handshake messages that identify: + +* That the server is a bridge, including: + * implementation details for logging by DA. + * supported FDC3 version(s). +* That the client is an FDC3 DA, including: + * implementation details (ImplementationMeta returned by fdc3.getInfo() call) for logging by DA and sharing with other DAs. + * already includes supported FDC3 version. + * request for a specific agent name. + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: connect (step 1) + DAB ->>+ DA: hello (step 2) + DA ->>+ DAB: handshake (steps 3-5) + DAB ->>+ DA: connectedAgentsUpdate (step 6) + DAB ->>+ DB: connectedAgentsUpdate (step 6) + DAB ->>+ DC: connectedAgentsUpdate (step 6) +``` + +### Step 1. Connect to Websocket + +The Desktop Agent attempts to connect to the websocket at the first port in the defined port range. If a connection cannot be made on the current port, move to the next port in the range and reattempt connection. + +In the event that there are no ports remaining in the range, the Desktop Agent SHOULD reset to the beginning of the range, SHOULD pause its attempts to connect and resume later (a minimum wait period of 5 seconds SHOULD be used) + +Note, if the Desktop Agent is configured to run at startup (of the user's machine) it is possible that the Desktop Agent Bridge may start later (or be restarted at some point). Hence, Desktop Agents SHOULD be capable of connecting to the bridge once they are already running (rather than purely at startup). + +### Step 2. Hello + +When a new connection is made to the DAB websocket, it sends a `hello` message, including its metadata. + +```typescript +{ + type: "hello", + payload: { + desktopAgentBridgeVersion: number, + supportedFDC3Versions: string[], + authRequired: boolean, + /** The DAB JWT authentication token */ + authToken?: string + }, + meta: { + timestamp: date + } +} +``` + +A Desktop Agent can use the structure of this message to determine that it has connected to a Desktop Agent Bridge (i.e by checking `msg.type === "hello" && msg.payload.desktopAgentBridgeVersion`), whether it supports a compatible FDC3 version and whether it is expected to provide authentication credentials in the next step (`if(msg.payload.authRequired) { ... }`). + +An optional JWT token can be included in the `hello` message to allow the connecting agent to authenticate the bridge. Verification of the supplied JWT by the DA is optional but recommended, meaning that the DA SHOULD verify the received JWT when one is included in the `hello` message. + +If no hello message is received, the message doesn't match the defined format or validation of the optional JWT fails, the Desktop Agent should return to step 1 and attempt connection to the next port in the range. + +### Step 3. Handshake & Authentication + +The DA must then respond to the `hello` message with a `handshake` request to the bridge, including an auth token (JWT) if required. + +```typescript +{ + type: "handshake", + /** Request body, containing the arguments to the function called.*/ + payload: { + /** The JWT authentication token */ + authToken?: string, + /** DesktopAgent implementationMetadata trying to connect to the bridge */ + implementationMetadata: ImplementationMetadata, + /** The requested DA name */ + requestedName: string, + /** The current state of the Desktop Agent's channels, excluding any private channels, + * as a mapping of channel id to an array of Context objects, most recent first.*/ + channelsState: Record + }, + meta: { + /** Unique GUID for this request */ + requestGuid: string, + /** Timestamp at which request was generated */ + timestamp: date + } +} +``` + +Note that the `meta` element of of the handshake message contains both a `timestamp` field (for logging purposes) and a `requestGuid` field that should be populated with a Globally Unique Identifier (GUID), generated by the Desktop Agent. This `responseGuid` will be used to link the handshake message to a response from the DAB that assigns it a name. For more details on GUID generation see [Globally Unique Identifier](#globally-unique-identifier) section. + +If requested by the server, the JWT auth token payload should take the form: + +```typescript +{ + "sub": string, // GUID for the keypair used to sign the token + "iat": date // timestamp at which the the token was generated as specified in ISO 8601 +} +``` + +e.g. + +```JSON +{ + "sub": "65141135-7200-47d3-9777-eb8786dd31c7", + "iat": "2022-07-06T10:11:43.492Z" +} +``` + +Note that the `sub` SHOULD be a GUID that does NOT need to match the name requested by the Desktop Agent. It will be used to identify the keypair that should be used to validate the JWT token. Further, multiple Desktop Agent's MAY share the same keys for authentication and hence the same `sub`, but they will be assigned different names for routing purposes by the DAB. If an agent disconnects from the bridge and later re-connects it MAY request and be assigned the same name it connected with before. + +### Step 4. Auth Confirmation and Name Assignment + +The DAB will extract the authentication token `sub` from the JWT token's claims and then verify the token's signature against any public key it has been configured with. If the signature can't be verified, the bridge should respond with the below authentication failed message and the socket should be disconnected by the bridge. + +```typescript +{ + type: "authenticationFailed", + meta: { + /** Timestamp at which response was generated */ + timestamp: date, + /** GUID for the handshake request */ + requestGuid: string, + /** Unique GUID for this message */ + responseGuid: string, + } +} +``` + +If authentication succeeds (or is not required), then the DAB should assign the Desktop Agent the name requested in the `handshake` message, unless another agent is already connected with that name in which case it should generate a new name which MAY be derived from the requested name. Note that the assigned name is not communicated to the connecting agent until step 5. + +### Step 5. Synchronize the Bridge's Channel State + +Channels are the main stateful mechanism in the FDC3 that we have to consider. A key responsibility of the DAB is ensuring that the channel state of the connected agents is kept in-sync. To do so, the states must be synchronized whenever a new agent connects. Hence, the Bridge MUST process the `channelState` provided by the new agent in the `handshake` request, which MUST contain details of each known User Channel or App Channel and its state. The bridge MUST compare the received channel names and states to its own representation of the current state of channels in connected agents, merge that state with that of the new agent and communicate the updated state to all connected agents to ensure that they are synchronized with it. + +Hence, if we assume that the state of each channel can be represented by an ordered array of context objects (most recent first - noting that only the first position, that of the most recent context broadcast, matters), the Desktop Agent Bridge MUST merge the incoming `channelsState` with the `existingChannelsState` as follows: + +```typescript +Object.keys(channelsState).forEach((channelId) => { + if (!existingChannelsState[channelId]) { + //unknown channels: just adopt its state + existingChannelsState[channelId] = channelsState[channelId]; + } else { + //known channels: merge state, with existing state taking precedence + const currentState = existingChannelsState[channelId]; + const incoming = channelsState[channelId]; + incoming.forEach((context) => { + //only add previously unknown context types to the state + if (!currentState.find(element => element.type === context.type)){ + //add to end of array to avoid setting most recent context type at the beginning + currentState.push(context); + } + // else ignore any types that are already known + }); + } +}); +``` + +When multiple agents attempt to connect to the Desktop Agent Bridge at the same time, steps 3-6 of the connection protocol MUST be handled by the DAB serially to ensure correct channel state synchronization. + +### Step 6. Connected Agents Update + +The updated `existingChannelsState` will then be shared with all connected agents along with updated details of all connected agents via a `connectedAgentsUpdate` message sent to all connected sockets. The newly connected agent will receive both its assigned name and channel state via this message. The `connectedAgentsUpdate` message will be linked to the handshake request by quoting the `meta.requestGuid` of the `handshake` message. + +The `connectedAgentsUpdate` message will take the form: + +```typescript +{ + type: "connectedAgentsUpdate", + /** Request body, containing the arguments to the function called.*/ + payload: { + /** Should be set when an agent first connects to the bridge and provide its assigned name. */ + addAgent?: string, + /** Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned. */ + removeAgent?: string, + /** Desktop Agent Bridge implementation metadata of all connected agents. + * Note that this object is extended to include a `desktopAgent` field with the name assigned by the DAB. */ + allAgents: ImplementationMetadata[], + /** The updated state of channels that should be adopted by the agents. SHOULD only be set when an agent is connecting to the bridge. */ + channelsState?: ChannelState[] // see step4 + }, + meta: { + /** For a new connection, should be the same as the handshake requestGuid. + * Should be the same as the responseGuid for a disconnection. + */ + requestGuid: string, + /** Unique GUID for this message */ + responseGuid: string, + /** Timestamp at which response was generated */ + timestamp: date, + } +} +``` + +When an agent connects to the bridge, it and other agents connected to the bridge, should adopt the state of any channels that do not currently exist or do not currently contain state of a particular type. This synchronization is NOT performed via broadcast as the context being merged would become the most recent context on the channel, when other contexts may have been broadcast subsequently. Rather, it should be adopted internally by each Desktop Agent, merging it such that it would be received by applications that have added a context listener to the channel or call `channel.getCurrentContext()` on it. + +It should be noted that Desktop Agents will not have context listeners for previously unknown channels, and SHOULD simply record that channel's state for use when that channel is first used. + +For known channel names, the Desktop Agents MUST also compare their current state to that which they have just received and may need to internally adopt context of types not previously seen on a channel. As context listeners can be registered for either a specific type or all types some care is necessary when doing so (as only the most recently transmitted Context should be received by un-typed listeners). Hence, the new context MUST only be passed to a context listener if it was registered specifically for that type and a context of that type did not previously exist on the channel. + +In summary, updating listeners for a known channel should be performed as follows: + +1. The incoming channel state `channelState` for a particular channel should be processed from last to first (most recent context broadcast). +2. If there is no current context of that type, broadcast it to any listeners of that specific type only. +3. If there is a current context of that type, and it does not match the incoming object exactly, broadcast it to listeners of that specific type only. +4. If the most recent (first in the incoming array) type OR value of that type doesn't match the most recent context broadcast on the channel, broadcast it to un-typed listeners only. + +This procedure is the same for both previously connected and connecting agents, however, the merging procedure used by the DAB in step 5 will result in apps managed by previously connected agents only rarely receiving context broadcasts (and only for types they have not yet seen on a channel). + +After applying the `connectedAgentsUpdate` message, the newly connected Desktop Agent and other already connected agents are able to begin communicating through the bridge. + +#### Atomicity and handling concurrent operations + +Handling by the Desktop Agent of the synchronization message from the DAB in step 6 of the connection protocol should be atomic to prevent message overlap with `fdc3.broadcast`, `channel.broadcast`, `fdc3.addContextListener` or `channel.getCurrentContext`. I.e. the `connectedAgentsUpdate` message must be processed immediately on receipt by Desktop Agents and updates applied before any other messages are sent or responses processed. + +Similarly, the Desktop Agent Bridge must process steps 3-6 of the connection protocol (receiving a `handshake` messages up to issuing the `connectedAgentsUpdate` messages to all participants) as a single atomic unit, allowing no overlap with the processing of other messages from connected agents (as they might modify the state information it is processing during those steps). + +#### Notification to users of connection events + +Desktop Agents SHOULD provide visual feedback to end users when they or other agents connect or disconnect from the Desktop Agent Bridge (i.e. whenever a `connectedAgentsUpdate` message is received, or a disconnection happens). Doing so will ensure that the end user understands whether their apps and Desktop Agent can communicate with other apps running under other Desktop Agents, and can better attribute any issues with interoperability between them to the probable source. + +### Step 7. Disconnects + +Although not part of the connection protocol, it should be noted that the `connectedAgentsUpdate` message sent in step 6 should also be sent whenever an agent disconnects from the bridge to update other agents. If any agents remain connected, then the `channelState` does not change and can be omitted. However, if the last agent disconnects the bridge SHOULD discard its internal `channelState`, instead of issuing the update. + +## Messaging Protocol + +In order for Desktop Agents to communicate with the Desktop Agent Bridge and thereby other Desktop Agents, a messaging protocol is required. FDC3 supports both 'fire and forget' interactions (such as the broadcast of context messages) and interactions with specific responses (such as raising intents and returning a resolution and optional result), both of which must be handled by that messaging protocol and message formats it defines, as described in this section. + +### Message Format + +All messages sent or received by the Desktop Agent Bridge will be encoded in JSON and will have the same basic structure (including those already defined in the connection protocol): + +```typescript +{ + /** Identifier used to declare what aspect of FDC3 that the message relates to. */ + type: string, + /** Request body, containing any the arguments to the FDC3 interactions. */ + payload: { ... }, + /** Metadata relating to the message, its sender and destination. */ + meta: { ... } +} +``` + +Messages can be divided into two categories: + +* Requests: Messages that initiate a particular interaction +* Responses: Messages that later to a prior request + +Details specific to each are provided below: + +#### Request Messages + +Request messages use the following format: + +```typescript +{ + /** Typically set to the FDC3 function name that the message relates to, e.g. "findIntent" */ + type: string, + /** Request body, typically containing the arguments to the function called.*/ + payload: { + /** Used to indicate which channel `broadcast` functions were called on. */ + channel?: string, + /** Used as an argument to `findIntent` and `raiseIntent` functions.`*/ + intent?: string, + /** Used as an argument to `broadcast`, `findIntent` and `raiseIntent` functions. */ + context?: Context, + /** Used as an argument to `open`, `raiseIntent`, `getAppMetadata`, and `findInstances` functions */ + app?: AppIdentifier, + /** Used as an argument to `findIntent` functions. */ + resultType?: string + }, + /** Metadata used to uniquely identify the message and its sender. */ + meta: { + /** Unique GUID for this request */ + requestGuid: string, + /** Timestamp at which request was generated */ + timestamp: date, + /** AppIdentifier OR DesktopAgentIdentifier for the source application that the request was + * received from and will be augmented with the assigned name of the + * Desktop Agent by the Desktop Agent Bridge, rather than the sender. */ + source: AppIdentifier | DesktopAgentIdentifier, + /** Optional AppIdentifier or DesktopAgentIdentifier for the destination that the request should be + * routed to, which MUST be set by the Desktop Agent for API calls that + * include a target (`app`) parameter. MUST include the name of the + * Desktop Agent hosting the target application. */ + destination?: AppIdentifier | DesktopAgentIdentifier + } +} +``` + +If the FDC3 API call underlying the request message includes a target (typically defined by an `app` argument, in the form of an AppIdentifier object) it is the responsibility of the Desktop Agent to copy that argument into the `meta.destination` field of the message and to ensure that it includes a `meta.destination.desktopAgent` value. If the target is provided in the FDC3 API call, but without a `meta.destination.desktopAgent` value, the Desktop Agent should assume that the call relates to a local application and does not need to send it to the bridge. + +Requests without a `meta.destination` field will be forwarded to all other agents by the bridge, which will also handle the collation of responses which quote the `meta.requestGuid`. + +#### Response Messages + +Response messages will be differentiated from requests by the presence of a `meta.responseGuid` field and MUST quote the `meta.requestGuid` that they are responding to. + +```typescript +{ + /** FDC3 function name the original request related to, e.g. "findIntent" */ + type: string, + /** Response body, containing the actual response data. */ + payload: { + /** Standardized error strings from an appropriate FDC3 API Error enumeration. */ + error?: string, + /** Response to `open` */ + appIdentifier?: AppIdentifier, + /** Response to `findInstances` */ + appIdentifiers?: Array, + /** Response to `getAppMetadata` */ + appMetadata?: AppMetadata, + /** Response to `findIntent`*/ + appIntent?: AppIntent, + /** Response to `findIntentsByContext`*/ + appIntents?: AppIntent[], + /** Response to `raiseIntent` functions, returned on delivery of the intent and context to the target app. + * Note `getResult()` function should not / can not be included in JSON. */ + intentResolution?: IntentResolution, + /** Secondary response to `raiseIntent`, sent when the `IntentHandler` has returned. + * Note return an empty object if the `IntentHandler` returned void. + * Note `Channel` functions (`broadcast`, `getCurrentContext`, `addContextListener` should not / can not be included in JSON)*/ + intentResult?: {context?: Context, channel?: Channel}, + }, + meta: { + /** requestGuid from the original request being responded to*/ + requestGuid: string, + /** Unique GUID for this response */ + responseGuid: string, + /** Timestamp at which request was generated */ + timestamp: Date, + /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge.*/ + sources: [AppIdentifier | DesktopAgentIdentifier], + /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. + * May be omitted if all sources responded. */ + errorSources: [AppIdentifier | DesktopAgentIdentifier] + } +} +``` + +Response messages do not include a `meta.destination` as the routing of responses is handled by the bridge via the `meta.requestGuid` field. + +### Identifying Individual Messages + +There are a variety of message types need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Globally Unique Identifier (GUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. + +Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestGuid` value. Response messages should quote that same value in the `meta.requestGuid` field and generate a further unique identity for their response, which is included in the `meta.responseGuid` field. + +Desktop Agent Bridge implementations should consider request messages that omit `meta.requestGuid` and response messages that omit either `meta.requestGuid` or `meta.responseGuid` to be invalid and should discard them. + +#### Globally Unique Identifier + +A GUID (globally unique identifier), also known as a Universally Unique IDentifier (UUID), is a generated 128-bit text string that is intended to be 'unique across space and time', as defined in [IETF RFC 4122](https://www.ietf.org/rfc/rfc4122.txt). + +There are several types of GUIDs, which vary how they are generated. As Desktop Agents will typically be running on the same machine, system clock and hardware details may not provide sufficient uniqueness in GUIDs generated (including during the connect step, where Desktop Agent name collisions may exist). Hence, it is recommended that both Desktop Agents and Desktop Agent Bridges SHOULD use a version 4 generation type (random). + +### Identifying Desktop Agents Identity and Message Sources + +Desktop Agents will prepare messages in the above format and transmit them to the bridge. However, to target intents and perform other actions that require specific routing between DAs, DAs need to have an identity. Identities should be assigned to clients when they connect to the bridge. This allows for multiple copies of the same underlying Desktop Agent implementation to be bridged and ensures that id clashes can be avoided. + +To facilitate routing of messages between agents, the `AppIdentifier` is expanded to contain an optional `desktopAgent` field: + +```typescript +interface AppIdentifier { + readonly appId: string; + readonly instanceId?: string; + /** Field that represents the Desktop Agent that the app is available on.**/ + readonly desktopAgent?: string; +} +``` + +Further, a new `DesktopAgentIdentifier` type is introduced to handle cases where a response message is returned by the Desktop Agent (or more specifically its resolver) rather than a specific app. This is particularly relevant for `findIntent` responses: + +```typescript +interface DesktopAgentIdentifier { + /** A string filled in by the Desktop Agent Bridge on receipt of a message, that represents + * the Desktop Agent Identifier that is the source of the message. + **/ + readonly desktopAgent: string; +} +``` + +Hence, either an `AppIdentifier` or `DesktopAgentIdentifier` is used as the `meta.source` value of both request or response messages and the source Desktop Agent identity for bridging messages will always be found at `meta.source.desktopAgent`. To prevent spoofing and to simplify the implementation of clients, the source Desktop Agent identity MUST be added to (or overwritten in) each message by the bridge when received. + +A request message may include a `destination` field, set by the source Desktop Agent if the message is intended for a particular Desktop Agent (e.g. to support a `raiseIntent` call with a specified target app or app instance on a particular Desktop Agent). + +Response messages do not include a `destination` field. Instead, a Desktop Agent Bridge implementation MUST retain a record of `requestGuid` fields for request message, until the request is fully resolved, allowing them to determine the destination for the collated responses and effectively enforcing the routing policy for interactions. + +Further, the Desktop Agent Bridge should also inspect the `payload` of both request and response messages and ensure that any `AppIdentifier` objects have been augmented with the correct `desktopAgent` value for the app's host Desktop Agent (e.g. if returning responses to `findIntent`, ensure each `AppIntent.apps[]` entry includes the correct `desktopAgent` value). Further details of any such augmentation are provided in the description of each message exchange. + +### Handling of Error Responses + +The FDC3 Desktop Agent API specifies a number of error enumerations that define specific error strings that should be used as the `message` element of a JavaScript `Error` to be returned to the requesting application via a rejected promise. In the event that an Error must be returned by a Desktop Agent to the Desktop Agent Bridge, the message should be selected from the [Error enumeration](../api/ref/Errors) normally used by the corresponding FDC3 function (i.e. `OpenError` for `open` calls, `ResolveError` for `findIntent` and `raiseIntent` etc.). However, Desktop Agent Bridging does NOT require that an `Error` object is returned across the bridge as it cannot be fully recreated from its constituent fields in JavaScript. Rather, return only the specified message string in the `error` field of the `payload`, which should then be used to initialize a JavaScript `Error` on the receiving end. It is also advisable to output additional logging (in the Desktop Agent Bridge) indicating that the error was originally generated by a remote Desktop Agent and to provide the relevant details. + +For example, a `raiseIntent` targeted at an app instance that no longer exists might generate the following response from the Desktop Agent: + +```JSON +// e.g. agent-B -> DAB in response to a raiseIntent call +{ + "type": "raiseIntentResponse", + "payload": { + "error": "TargetInstanceUnavailable", //", + "responseGuid": "", + "timestamp": "2020-03-..." + } +} +``` + +For messages that target a specific agent, the Desktop Agent Bridge will augment the message with a `source` field and return it to the calling agent and the app that made the original request. + +However, API calls that require a collated response from all agents where at least one agent returns a successful response, will result in a successful response from the Desktop Agent Bridge (i.e. no `error` element should be included), with the agents returning errors listed in the `errorSources` array. This allows for successful exchanges on API calls such as `fdc3.findIntent` where some agents do not have options to return and would normally respond with (for example) `ResolveError.NoAppsFound`. + +Finally, to facilitate easier debugging, errors specific to Desktop Agent Bridge are added to those enumerations, including: + +```typescript +enum OpenError { + ... + /** Returned if the specified Desktop Agent is not found, via a connected + Desktop Agent Bridge. */ + DesktopAgentNotFound = 'DesktopAgentNotFound', +} + +enum ResolveError { + ... + /** Returned if the specified Desktop Agent is not found, via a connected + Desktop Agent Bridge. */ + DesktopAgentNotFound = 'DesktopAgentNotFound', +} + +enum ResultError { + ... + /** Returned if the specified Desktop Agent disconnected from the Desktop + Agent Bridge before a result was returned. */ + DesktopAgentDisconnected = 'DesktopAgentDisconnected', +} +``` + +### Forwarding of Messages and Collating Responses + +When handling request messages, it is the responsibility of the Desktop Agent Bridge to: + +* Receive request messages from connected Desktop Agents. +* Augment request messages with `meta.source.desktopAgent` information (as described above). +* Forward request messages onto either a specific Desktop Agent or all other Desktop Agents. + * The bridge MUST NOT forward the request to the agent that sent the request, nor expect a reply from it. + +For message exchanges that involve responses, it is the responsibility of the Desktop Agent Bridge to: + +* Receive and collate response messages according the `meta.requestGuid` (allowing multiple message exchanges to be 'in-flight' at once). +* Apply a timeout to the receipt of response messages for each request. +* Produce a single collated response message that incorporates the output of each individual response received. +* Deliver the collated response message to the source Desktop Agent that sent the request. + +Collated response messages generated by the bridge use the same format as individual response messages. + +The following pseudo-code defines how messages should be forwarded or collated by the bridge: + +* if the message is a request (`meta.requestGuid` is set, but `meta.responseGuid` is not), + * and the message does not include a `meta.destination` field, + * forward it to all other Desktop Agents (not including the source), + * annotate the request as requiring responses from all other connected agents, + * await responses or the specified timeout. + * else if a `meta.destination` was included, + * forward it to the specified destination agent, + * annotate the request as requiring only a response from the specified agent, + * await the response or the specified timeout. +* else if the message is a response (both `meta.requestGuid` and `meta.responseGuid` are set) + * if the `meta.requestGuid` is known, + * add the message to the collated responses for the request, + * augment any `AppIdentifier` types in the response message with a `desktopAgent` field matching that of the responding Desktop Agent, + * if `payload.error` is set in the response add the DesktopAgentIdentifier to the `meta.errorSources` element. + * else add the DesktopAgentIdentifier to the `meta.sources` element. + * if all expected responses have been received (i.e. all connected agents or the specified agent has responded, as appropriate), + * produce the collated response message and return to the requesting Desktop Agent. + * else await the configured response timeout or further responses, + * if the timeout is reached without any responses being received + * produce and return an appropriate [error response](../api/ref/Errors), including details of all Desktop Agents in `errorSources`. + * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. + * if the timeout is reached with a partial set of responses + * produce and return a collated response, but include details of Desktop Agents that timed out in `errorSources`. + * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. + * else discard the response message (as it is a delayed to a request that has timed out or is otherwise invalid). +* else the message is invalid and should be discarded. + +### Workflows Broken By Disconnects + +Targeted request and request/response workflows may be broken when a Desktop Agent disconnects from the bridge, which bridge implementations will need to handle. + +Three types of requests: + +1. Fire and forget (i.e. `broadcast`). +2. Requests that require the bridge to collate multiple responses from the bridged Desktop Agents (e.g. `findIntent`). +3. Requests targeted at a specific Desktop Agent that are forwarded to the target Desktop Agent (e.g. `raiseIntent`). + +The latter two types embody workflows that may be broken by an agent disconnecting from the bridge either before or during the processing of the request. + +When processing the disconnection of an agent from the bridge, the bridge MUST examine requests currently 'in-flight' and: + +* For requests that require the bridge to collate multiple responses: + * complete those that no longer require further responses (all other agents have responded), or + * continue to await the timeout (if other agents are yet to respond), or + * return an 'empty' response in the expected format (if no other agents are connected and no data will be received). +* For requests that target a specific agent: + * return an appropriate error (as the request cannot be completed). + +Finally, in the event that either a Desktop Agent or the bridge itself stops responding, but doesn't fully disconnect, the timeouts (specified earlier in this document) will be used to handle the request as if a disconnection had occurred. + +In the event that a Desktop Agent repeatedly times out, the bridge SHOULD disconnect that agent (and update other agents via the `connectedAgentsUpdate` message specified in the connection protocol), to avoid all requests requiring the full timeout to complete. + +In the event that the bridge repeatedly times out, connected Desktop Agents MAY disconnect from the bridge and attempt to reconnect by returning to Step 1 of the connection protocol. + +### FDC3 API calls that do NOT generate bridge messages + +Some FDC3 API calls can be handled locally and do not need to generate request messages to the Desktop Agent Bridge, but are likely to be involved in other exchanges that do generate messages to the bridge (for example adding context or intent handlers). Those calls include: + +* `addContextListener` functions (excluding those for `PrivateChannel` instances) +* `listener.unsubscribe` (excluding those for `PrivateChannel` instances) +* `addIntentListener` +* `getOrCreateChannel` +* `createPrivateChannel` +* `getUserChannels` and `getSystemChannels` +* `joinUserChannel` and `joinChannel` +* `getCurrentChannel` +* `leaveCurrentChannel` +* `getInfo` + +However, `PrivateChannel` instances allow the registration of additional event handlers (for the addition or removal of context listeners) that may be used to manage streaming data sent over them by starting or stopping the stream in response to those events. Hence, the following calls DO generate request messages when used on a PrivateChannel instance: + +* `addContextListener` +* `listener.unsubscribe` +* `disconnect` + +## Individual message exchanges + +The sections below cover most scenarios for each of the Desktop Agent methods in order to explore how this protocol might work. + +Each section assumes that we have 3 agents connected by a bridge: + +* agent-A +* agent-B +* agent-C +* DAB + +Message exchanges come in a number of formats, which are known as: + +* **Request only**: A request message that does not require a response ('fire and forget'), such as a `broadcast`. +* **Request Response (single)**: A request message that expects a single response from a single Desktop Agent, such as `open` or `getAppMetadata`. +* **Request Response (collated)**: A request message that expects responses from all other Desktop Agents that are collated by the bridge and returned as a single response to the requestor, such as `findIntent` or `findInstances`. +* **Request Multiple Response (single)**: A request message that expects multiple responses from a single Desktop Agent, such as `raiseIntent`. + +### `broadcast` (on `fdc3`, a `Channel` or `PrivateChannel`) + +Type: **Request only** + +Generated by API calls: + +* [`fdc3.broadcast(context: Context)`](../api/ref/DesktopAgent#broadcast) +* [`Channel.broadcast(context: Context)`](../api/ref/Channel#broadcast) + +e.g. + +```javascript +fdc3.broadcast(contextObj); +``` + +or + +```javascript +(await fdc3.getOrCreateChannel("myChannel")).broadcast(contextObj) +``` + +Message exchange: + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: broadcast + DAB ->>+ DB: broadcast + DAB ->>+ DC: broadcast +``` + +It encodes this as a message which it sends to the DAB + +```JSON +// agent-A -> DAB +{ + "type": "broadcast", + "payload": { + "channel": "myChannel", + "context": { /*contextObj*/ } + }, + "meta": { + "requestGuid": "", + "timestamp": "2022-03-...", + "source": [{ + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + }] + } +} +``` + +which it repeats on to agent-B AND agent-C with the `source.desktopAgent` metadata added. + +```JSON +// DAB -> agent-B +// DAB -> agent-C +{ + "type": "broadcast", + "payload": { + "channel": "myChannel", + "context": { /*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": [{ + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + }] + } +} +``` + +### `findIntent` (on `fdc3`) + +Type: **Request Response (collated)** + +Generated by API call: + +* [`findIntent(intent: string, context: Context)`](../api/ref/DesktopAgent#findintent) + +e.g. An application with `appId: "agentA-app1"` and `instanceId: "c6ad5174-6f78-4582-8e96-728d93a4d7d7"` makes the following API call: + +```javascript +let appIntent = await fdc3.findIntent("StartChat", context); +``` + +Message exchange: + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: findIntent + DAB ->>+ DB: findIntent + DB -->>- DAB: findIntentResponse (B) + DAB ->>+ DC: findIntent + DC -->>- DAB: findIntentResponse (C) + DAB -->>- DA: findIntentResponse (B + C) +``` + +#### Request format + +Outward message to the DAB: + +```JSON +// agent-A -> DAB +{ + "type": "findIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": [{ + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + }] + } +} +``` + +The DAB fills in the `source.desktopAgent` field and forwards the request to the other Desktop Agents (agent-B AND agent-C): + +```JSON +// DAB -> agent-B +// DAB -> agent-C +{ + "type": "findIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +Note that the `source.desktopAgent` field has been populated with the id of the agent that raised the requests, enabling the routing of responses. + +#### Response format + +Normal response from agent-A, where the request was raised. + +```JSON +{ + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "myChat" } + ] +} +``` + +DA agent-B would produce the following response if the request was generated locally: + +```JSON +{ + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] +} +``` + +Hence, the response it sends to the bridge is encoded as follows: + +```JSON +// agent-B -> DAB +{ + "type": "findIntentResponse", + "payload": { + "appIntent": { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */ }, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +Note the response GUID generated by the agent-B and the reference to the request GUID produced by agent-A where the request was originated. Further, note that the `AppMetadata` elements in the `AppIntent` do not have a `desktopAgent` field yet, and the `meta` element does not contain a `sources` element, both of which the bridge will add. + +DA agent-C would produce the following response locally: + +```JSON +{ + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "WebIce"} + ] +} +``` + +which is sent back over the bridge as a response to the request message as: + +```JSON +// agent-C -> DAB +{ + "type": "findIntentResponse", + "payload": { + "appIntent": { + "intent": { "appId": "StartChat" }, + "apps": [ + { "appId": "WebIce"} + ] + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +The bridge receives and collates the responses, producing the following collated response which is sends back to agent-A: + +```JSON +// DAB -> agent-A +{ + "type": "findIntentResponse", + "payload": { + "intent": "StartChat", + "appIntent": { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, //desktopAgent added by DAB + { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony", + "desktopAgent": "agent-B" }, + { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, + { "appId": "WebIce", "desktopAgent": "agent-C"} + ] + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [ //added by DAB + { "desktopAgent": "agent-A" }, + { "desktopAgent": "agent-B" }, + ] + } +} +``` + +:::note +In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. +::: + +Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: + +```JSON +// agent-A -> requesting App +{ + "intent": { "name": "StartChat", "displayName": "Chat" }, + "apps": [ + // local to this agent + { "appId": "myChat" }, + //agent-B responses + { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, + { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony", + "desktopAgent": "agent-B" }, + { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, + //agent-C responses + { "appId": "WebIce", "desktopAgent": "agent-C"} + ] +} +``` + +### `findIntentsByContext` (on `fdc3`) + +Type: **Request Response (collated)** + +Generated by API call: + +* [`findIntentsByContext(context: Context)`](../api/ref/DesktopAgent#findintentsbycontext) + +e.g. An application with appId `agentA-app1` makes the following API call: + +```javascript +let appIntentArr = await fdc3.findIntentsByContext(context); +``` + +:::note +The message exchanges for this API call are nearly identical to that used for `findIntent()`, differing only by the lack of an `intent` field in the request message payload and the structure of the response message (where an array of `AppIntents` is returned). +::: + +#### Request format + +Outward message to the DAB: + +```JSON +// agent-A -> DAB +{ + "type": "findIntentsForContext", + "payload": { + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + } + } +} +``` + +The DAB fills in the `source.desktopAgent` field and forwards the request to the other Desktop Agents (agent-B AND agent-C). + +```JSON +// DAB -> agent-B +// DAB -> agent-C +{ + "type": "findIntentsForContext", + "payload": { + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +#### Response format + +An individual agent (for example agentB) would generate a local response as an array of `AppIntent` objects: + +```JSON +[ + { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] + }, + { + "intent": { "name": "ViewProfile" }, + "apps": [ + { "appId": "myCRM", "title": "My CRM" }, + { "appId": "myCRM", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "My CRM" } + ] + } +] +``` + +This response is encoded and sent to the bridge as: + +```JSON +// agent-B -> DAB +{ + "type": "findIntentsForContextResponse", + "payload": { + "appIntents": [ + { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] + }, + { + "intent": { "name": "ViewProfile" }, + "apps": [ + { "appId": "myCRM", "title": "My CRM" }, + { "appId": "myCRM", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "My CRM" } + ] + } + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +Each `AppMetadata` object is augmented by the bridge with a `desktopAgent` field, the responding `DesktopAgentIdentifier` value is added to the `meta.sources` element and the message payload is collated with responses from other agents into a response to the requesting agent: + +```JSON +// DAB -> agent-A +{ + "type": "findIntentsForContextResponse", + "payload": { + "appIntents": [ + { + "intent": { "name": "StartChat" }, + "apps": [ + //agent-B responses + { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, + { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony", + "desktopAgent": "agent-B" }, + { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, + //agent-C response + { "appId": "WebIce", "desktopAgent": "agent-C"} + ] + }, + { + "intent": { "name": "ViewProfile" }, + "apps": [ + //agent-A responses + { "appId": "myCRM", "title": "My CRM", "desktopAgent": "agent-B" }, + { "appId": "myCRM", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "My CRM", + "desktopAgent": "agent-B" } + //agent-C responses + { "appId": "riskToolkit", "title": "Client Risk Toolkit", "desktopAgent": "agent-C" }, + { "appId": "linkedIn", "title": "LinkedIn", "desktopAgent": "agent-C" } + ] + } + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [ + { "desktopAgent": "agent-B" }, + { "desktopAgent": "agent-C" } + ] + } +} +``` + +Finally agent-A combines the payload received with it own response and returns it to the requesting application. + +### raiseIntent (on `fdc3`) + +Type: **Request Multiple Response (single)** + +Generated by API call: + +* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseIntent) + +For Desktop Agent Bridging, a `fdc3.raiseIntent` call MUST always pass a `app: AppIdentifier` argument to target the intent. If a target `app` is not passed, then the `findIntent` message exchange should be used to collect options for the local resolver to use (note that Desktop Agents MAY also support the deprecated `raiseIntent` signature that uses the app `name` field by using the `findIntent` message exchange to attempt to resolve the `name` to an `AppIdentifier`). Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. + +e.g. An application with appId `agentA-app1` makes the following API call: + +```javascript +let appIntent = await fdc3.raiseIntent("StartChat", context); +``` + +Agent A should then conduct the `findIntent` message exchange as described above, displaying its Intent resolver UI if necessary. Once an option is selected, the `raiseIntent` message exchange is conducted as if the API call had been made with a target app: + +```javascript +let appIntent = await fdc3.raiseIntent("StartChat", context, {"appId": "Slack", "desktopAgent": "agent-B"}); +``` + +Message exchange: + +:::note +Agent-C is not involved in the diagram below as the `raiseIntent` is now specified with target application and Desktop Agent. +::: + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: raiseIntent + DAB ->>+ DB: raiseIntent + DB -->>- DAB: raiseIntentResponse + DAB -->>- DA: raiseIntentResponse + DB ->>+ DAB: raiseIntentResultResponse + DAB ->>+ DA: raiseIntentResultResponse +``` + +#### Request format + +Outward message to the DAB: + +```JSON +// agent-A -> DAB +{ + "type": "raiseIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/}, + "app": { // AppIdentifier for chosen resolution including desktopAgent value + "appId": "Slack", + "desktopAgent": "agent-B" + //Note an instanceId may be included to target an already running instance + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + }, + "destination": { // duplicates the app argument so that the message is routed like any other + "appId": "Slack", + "desktopAgent": "agent-B" + } + } +} +``` + +The bridge fills in the `source.desktopAgent` field and forwards the request to the target Desktop Agent: + +```JSON +// DAB -> agent-B +{ + "type": "raiseIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/}, + "app": { + "appId": "Slack", + "desktopAgent": "agent-B" + //Note an instanceId may be included to target an already running instance + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { // duplicates the app argument so that the message is routed like any other + "appId": "Slack", + "desktopAgent": "agent-B" + } + } +} +``` + +#### Response format + +If the `raiseIntent` request were made locally, agent-B would deliver the intent and context to the target app's `IntentHandler` and respond to the raising application with an `IntentResolution`: + +```javascript +{ + "intent": "StartChat", + "source": { + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + }, + getResult: ƒ +} +``` + +This is encoded and sent to the bridge (omitting the `getResult()` function) as: + +```JSON +// agent-B -> DAB +{ + "type": "raiseIntentResponse", + "payload": { + "intentResolution": { + "intent": "StartChat", + "source": { + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + } + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-..." + } +} +``` + +:::note +When producing a response to a `raiseIntent` request, the instance of the receiving application MUST be initialized and an `instanceId` generated for it before the `IntentResolution` is generated so that it may include the `instanceId`. +::: + +The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.desktopAgent` and relay the message back to agent-A: + +```JSON +// DAB -> agent-A +{ + "type": "raiseIntentResponse", + "payload": { + "intentResolution": { + "intent": "StartChat", + "source": { + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", + "desktopAgent": "agent-B" // added by DAB + } + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ "desktopAgent": "agent-B" }] // added by DAB + } +} +``` + +When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application. + +```JSON +// agent-B -> DAB +{ + "type": "raiseIntentResultResponse", + "payload": { + "intentResult": { + "context": {/*contextObj*/} + /* for a channel IntentResult use: + "channel": { + "id": "channel 1", + "type": "system" + } + */ + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", //a different GUID should be used for the result response + "timestamp": "2020-03-...", + "sources": [{ + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" //instance Id should be included now that its known + }] + } +} +``` + +:::note +If intent result is private channel see [PrivateChannels](#privatechannels) for additional message exchanges that may be needed. +::: + +Finally, the bridge augments the response with `sources[0].desktopAgent` and passes it back to Agent-A. + +```JSON +// DAB -> agent-A +{ + "type": "raiseIntentResultResponse", + "payload": { + "intentResult": { + "context": {/*contextObj*/} + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", + "desktopAgent": "agent-B" // added by DAB + }] + } +} +``` + +If the `IntentHandler` returned `void` rather than an intent result `payload.intentResult` should be empty, e.g.: + +```JSON +// DAB -> agent-A +{ + "type": "raiseIntentResultResponse", + "payload": { + "intentResult": {} + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", + "desktopAgent": "agent-B" // added by DAB + }] + } +} +``` + +### open (on `fdc3`) + +Type: **Request Response (single)** + +Generated by API call: + +* [`open(app: AppIdentifier, context?: Context)`](../api/ref/DesktopAgent#open) + +e.g. + +```javascript +// Open an app without context, using an AppIdentifier object to specify the target and Desktop Agent +let AppIdentifier = {appId: 'myApp-v1.0.1', desktopAgent:"DesktopAgentB"}; +let instanceMetadata = await fdc3.open(AppIdentifier); + +// Open an app with context, using an AppIdentifier object to specify the target and Desktop Agent +let AppIdentifier = {appId: 'myApp-v1.0.1', desktopAgent:"DesktopAgentB"}; +let instanceMetadata = await fdc3.open(AppIdentifier, contextObj); +``` + +Note that it is not currently possible to identify resolve all available applications within a Desktop Agent via the FDC3 API. Hence, `fdc3.open` calls without a specified `desktopAgent` field in their `AppIdentifier`, e.g.: + +```javascript +// Open a target app via AppIdentifier, without a specified Desktop Agent +let AppIdentifier = {appId: 'myApp-v1.0.1'}; +let instanceMetadata = await fdc3.open(AppIdentifier); +``` + +should always be processed locally without be passed to the bridge. + +The `fdc3.open` command should result in a single copy of the specified app being opened and its instance data returned, or an error if it could not be opened. When receiving a response from invoking `fdc3.open` via the Desktop Agent Bridge, the new app instances MUST be initialized before responding as the responding Desktop Agent will need to return an `AppIdentifier` with an `instanceId` field set. + +Message exchange: + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: open + DAB ->>+ DB: open + DB -->>- DAB: openResponse + DAB -->>- DA: openResponse +``` + +#### Request format + +Outward message to the bridge: + +```JSON +// agent-A -> DAB +{ + "type": "open", + "payload": { + "app": { + "appId": "myApp", + "desktopAgent":"agent-B" + }, + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +which is repeated on to the target agent as: + +```JSON +// DAB -> agent-B +{ + "type": "open", + "payload": { + "app": { + "appId": "myApp", + "desktopAgent":"DesktopAgentB" + }, + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": 2020-03-..., + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +#### Response format + +Response message from target Desktop Agent: + +```JSON +// agent-B -> DAB +{ + "type": "openResponse", + "payload": { + "appIdentifier": { + "appId": "myApp", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-..." + } +} +``` + +which is augmented and repeated on by the bridge as: + +```JSON +// agent-B -> DAB +{ + "type": "openResponse", + "payload": { + "appIdentifier": { + "appId": "myApp", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ "desktopAgent": "agent-B" }] // added by DAB + } +} +``` + + +### findInstances + +Type: **Request Response (collated)** or **Request Response (single)** + +Generated by API call: + +* [`findInstances(app: AppIdentifier)`](../api/ref/DesktopAgent#findinstances) + +e.g. + +```javascript +// Retrieve a list of all instances of an application +let instances = await fdc3.findInstances({appId: "MyAppId"}); + +// Retrieve a list of instances of an application on a specified Desktop Agent +let instances = await fdc3.findInstances({appId: "MyAppId", desktopAgent: "agent-A"}); +``` + +Message exchange: + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: findInstances + DAB ->>+ DB: findInstances + DAB ->>+ DC: findInstances + DB ->> DAB: findInstancesResponse (B) + DC ->> DAB: findInstancesResponse (C) + DAB -->>- DA: findInstancesResponse (B + C) +``` + +#### Request format + +Outward message to the bridge: + +```JSON +// agent-A -> DAB +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp" + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +which is repeated on to the target agent as: + +```JSON +// DAB -> agent-B +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp" + } + }, + "meta": { + "requestGuid": "", + "timestamp": 2020-03-..., + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +If results should be constrained to a particular Desktop Agent, then set a `desktopAgent` field in `payload.app` and a matching `destination` field in `meta`: + +```JSON +// agent-A -> DAB +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp", + "desktopAgent": "agent-B" // destination agent + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "destination": { "desktopAgent": "agent-B"}, //destination agent + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +The Desktop Agent Bridge should only forward the request to the requested Desktop Agent and handle the message exchange as a **Request Response (single)**. + +#### Response format + +Response message from a Desktop Agent: + +```JSON +// agent-B -> DAB +{ + "type": "findInstancesResponse", + "payload": { + "appIdentifiers": [ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344"}, + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d"}, + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +The bridge receives and collates the responses, augmenting each appIdentifier with a `desktopAgent` field, producing the following collated response which it sends back to agent-A: + +```JSON +// DAB -> agent-A +{ + "type": "findIntentResponse", + "payload": { + "appIdentifiers": [ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + //"desktopAgent" added by DAB + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, + { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [ //added by DAB + { "desktopAgent": "agent-A" }, + { "desktopAgent": "agent-B" }, + ] + } +} +``` + +:::note +In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. +::: + +Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: + +```JSON +// DAB -> agent-A +[ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, + { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, + { "appId": "myApp", "instanceId": "688dbd5e-21dc-4469-b8cf-4b6a606f9a27" } //local response +] +``` + +### getAppMetadata + +Type: **Request Response (single)** + +Generated by API call: + +* [`getAppMetadata(app: AppIdentifier)`](../api/ref/DesktopAgent#getappmetadata) + +e.g. + +```javascript +// Retrieve a list of all instances of an application +let instances = await fdc3.findInstances({appId: "MyAppId"}); + +// Retrieve a list of instances of an application on a specified Desktop Agent +let instances = await fdc3.findInstances({appId: "MyAppId", desktopAgent: "agent-A"}); +``` + +Message exchange: + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: findInstances + DAB ->>+ DB: findInstances + DAB ->>+ DC: findInstances + DB ->> DAB: findInstancesResponse (B) + DC ->> DAB: findInstancesResponse (C) + DAB -->>- DA: findInstancesResponse (B + C) +``` + +#### Request format + +Outward message to the bridge: + +```JSON +// agent-A -> DAB +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp" + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +which is repeated on to the target agent as: + +```JSON +// DAB -> agent-B +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp" + } + }, + "meta": { + "requestGuid": "", + "timestamp": 2020-03-..., + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +If results should be constrained to a particular Desktop Agent, then set a `desktopAgent` field in `payload.app` and a matching `destination` field in `meta`: + +```JSON +// agent-A -> DAB +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp", + "desktopAgent": "agent-B" // destination agent + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "destination": { "desktopAgent": "agent-B"}, //destination agent + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +The Desktop Agent Bridge should only forward the request to the requested Desktop Agent and handle the message exchange as a **Request Response (single)**. + +#### Response format + +Response message from a Desktop Agent: + +```JSON +// agent-B -> DAB +{ + "type": "findInstancesResponse", + "payload": { + "appIdentifiers": [ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344"}, + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d"}, + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +The bridge receives and collates the responses, augmenting each appIdentifier with a `desktopAgent` field, producing the following collated response which it sends back to agent-A: + +```JSON +// DAB -> agent-A +{ + "type": "findIntentResponse", + "payload": { + "appIdentifiers": [ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + //"desktopAgent" added by DAB + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, + { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [ //added by DAB + { "desktopAgent": "agent-A" }, + { "desktopAgent": "agent-B" }, + ] + } +} +``` + +:::note +In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. +::: + +Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: + +```JSON +// DAB -> agent-A +[ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, + { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, + { "appId": "myApp", "instanceId": "688dbd5e-21dc-4469-b8cf-4b6a606f9a27" } //local response +] +``` + +//TODO: further work required on the below message exchanges: + +### PrivateChannels + +`PrivateChannels` are intended to provide a private communication channel for applications. In order to do so, there are differences in how their broadcasts MUST be handled and a number of additional message exchanges MUST be supported in order to handle events that are used to manage the channel's lifecycle. + +When a `ContextListener` is added to a remote `PrivateChannel`, removed from it or the `disconnect` function is called a notifications must be sent to the application that owns the channel. The bridge will add in the source agent (agent-A) and forward the message to destination (agent-B). + +Such notification messages should be addressed to the Desktop Agent that owns the channel, which will route it to the owning application and any other listeners. If any of those listeners are remote, the message should be repeated back to the bridge, once for each listener with the destination set as a full `AppIdentifier`. Both these messages and broadcast messages MUST NOT be repeated back to the application that generated them. The source information on repeated messages should be unmodified to ensure that the message is attributed to the original source. + +#### `broadcast` + +Type: **Request only** + +To maintain the privacy of PrivateChannel broadcasts, both Desktop Agents and Desktop Agent Bridge implementations SHOULD provide special handling for `PrivateChannel` broadcasts. Rather than broadcasting messages to all other Desktop Agents, broadcasts should be sent only to the Desktop Agent that owns the PrivateChannel, which will then repeat the broadcast message on to each `ContextListener` (both those that are local to the Desktop Agent and those added by remote Desktop Agents) - except for the source application. Doing so will require the Desktop Agent to track which applications have added a `ContextListener` to the `PrivateChannel`. + +Hence, the broadcast message should be modified such that it includes a destination and the `type` should indicate that it is a `PrivateChannel` broadcast: + +```JSON +// DAB -> agent-B +{ + "type": "PrivateChannel.broadcast", //modified type for PrivateChannel broadcasts + "payload": { + "channel": "private-channel-ABC123", + "context": { /*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { + "desktopAgent": "agent-B" + } + } +} +``` + +For a broadcast to a `PrivateChannel` owned by another agent the destination should just include the `DesktopAgentIdentifier`. The message should then be repeated (once for each listener) from that Desktop Agent to other remote listeners without modifying the source information (to ensure that the message is attributed to the original source), but with a destination set as a full `AppIdentifier` for each remote listener. + +#### `onAddContextListener` + +Type: **Request only** + +When a `ContextListener` is added to a remote `PrivateChannel` or a remote listener needs to be notified of the event use the following message: + +```JSON +// agent-A -> DAB +{ + "type": "PrivateChannel.onAddContextListener", + "payload": { + "channel": "private-channel-ABC123" + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { + "desktopAgent": "agent-B" //use DesktopAgentIdentifier to notify a remote PrivateChannel + //use a full AppIdentifier for event notifications to applications + } + } +} +``` + +#### `listener.unsubscribe` + +Type: **Request only** + +When a `ContextListener` is unsubscribed from a remote `PrivateChannel` or a remote listener needs to be notified of the event use the following message: + +```JSON +// DAB -> agent-B +{ + "type": "PrivateChannel.onUnsubscribe", + "payload": {}, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { // duplicates the app argument + "desktopAgent": "agent-B" //use DesktopAgentIdentifier to notify a remote PrivateChannel + //use a full AppIdentifier for event notifications to applications + } + } +} +``` + +#### `onDisconnect` + +Type: **Request only** + +When the `disconnect` function is is called on a remote `PrivateChannel` or a remote listener needs to be notified of the event use the following message: + +```JSON +// agent-A -> DAB +{ + "type": "PrivateChannel.onDisconnect", + "payload": {}, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { // duplicates the app argument + "desktopAgent": "agent-B" //use DesktopAgentIdentifier to notify a remote PrivateChannel + //use a full AppIdentifier for event notifications to applications + } + } +} +``` From a55c8d4ed0cd3d25ae198e23c8c08ed760f42fdf Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 23 Nov 2022 11:11:46 +0000 Subject: [PATCH 002/106] Clarify generation of responseGuid for collated messages, add message exchange for getAppMetadata --- docs/api-bridging/spec.md | 152 ++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 89 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index e41731894..83c151ec4 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -10,7 +10,9 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope ## Recent Changes -* Added/consolidated advice on handling error responses from Desktop Agents in Messaging protocol section +* Clarified that collated response messages should have their own `meta.responseGuid` generated by the DAB + * Corrected some related issues in the message handling pseudocode +* Add message exchange for getAppMetadata ## Open questions @@ -465,7 +467,7 @@ Response messages do not include a `meta.destination` as the routing of response There are a variety of message types need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Globally Unique Identifier (GUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. -Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestGuid` value. Response messages should quote that same value in the `meta.requestGuid` field and generate a further unique identity for their response, which is included in the `meta.responseGuid` field. +Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestGuid` value. Response messages should quote that same value in the `meta.requestGuid` field and generate a further unique identity for their response, which is included in the `meta.responseGuid` field. Where a response is collated by the Desktop Agent Bridge, the Bridge should generate its own `meta.responseGuid` for the colalted response message. Desktop Agent Bridge implementations should consider request messages that omit `meta.requestGuid` and response messages that omit either `meta.requestGuid` or `meta.responseGuid` to be invalid and should discard them. @@ -570,10 +572,11 @@ When handling request messages, it is the responsibility of the Desktop Agent Br For message exchanges that involve responses, it is the responsibility of the Desktop Agent Bridge to: -* Receive and collate response messages according the `meta.requestGuid` (allowing multiple message exchanges to be 'in-flight' at once). +* Receive and collate response messages (where necessary) according the `meta.requestGuid` (allowing multiple message exchanges to be 'in-flight' at once). +* Augment response messages with `meta.source.desktopAgent` information (as described above). * Apply a timeout to the receipt of response messages for each request. -* Produce a single collated response message that incorporates the output of each individual response received. -* Deliver the collated response message to the source Desktop Agent that sent the request. +* Produce a single collated response message (where necessary) that incorporates the output of each individual response received and has its own unique `meta.responseGuid` value. +* Deliver the collated and/or augemented response message to the source Desktop Agent that sent the request. Collated response messages generated by the bridge use the same format as individual response messages. @@ -590,19 +593,21 @@ The following pseudo-code defines how messages should be forwarded or collated b * await the response or the specified timeout. * else if the message is a response (both `meta.requestGuid` and `meta.responseGuid` are set) * if the `meta.requestGuid` is known, - * add the message to the collated responses for the request, - * augment any `AppIdentifier` types in the response message with a `desktopAgent` field matching that of the responding Desktop Agent, - * if `payload.error` is set in the response add the DesktopAgentIdentifier to the `meta.errorSources` element. - * else add the DesktopAgentIdentifier to the `meta.sources` element. + * augment any `AppIdentifier` types in the response message with a `desktopAgent` field matching that of the responding Desktop Agent, + * if `payload.error` is set in the response add the DesktopAgentIdentifier to the `meta.errorSources` element. + * else add the DesktopAgentIdentifier to the `meta.sources` element. + * if the message exchange requires collation, + * add the message to the collated responses for the request, * if all expected responses have been received (i.e. all connected agents or the specified agent has responded, as appropriate), * produce the collated response message and return to the requesting Desktop Agent. * else await the configured response timeout or further responses, * if the timeout is reached without any responses being received * produce and return an appropriate [error response](../api/ref/Errors), including details of all Desktop Agents in `errorSources`. * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. - * if the timeout is reached with a partial set of responses - * produce and return a collated response, but include details of Desktop Agents that timed out in `errorSources`. + * else if the timeout is reached with a partial set of responses, + * produce and return, to requesting Desktop Agent, a collated response and include details of Desktop Agents that timed out in `errorSources`. * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. + * else forward the response message on to requesting Desktop Agent. * else discard the response message (as it is a delayed to a request that has timed out or is otherwise invalid). * else the message is invalid and should be discarded. @@ -943,7 +948,7 @@ The bridge receives and collates the responses, producing the following collated }, "meta": { "requestGuid": "", - "responseGuid": "", + "responseGuid": "", "timestamp": "2020-03-...", "sources": [ //added by DAB { "desktopAgent": "agent-A" }, @@ -1150,7 +1155,7 @@ Each `AppMetadata` object is augmented by the bridge with a `desktopAgent` field }, "meta": { "requestGuid": "", - "responseGuid": "", + "responseGuid": "", "timestamp": "2020-03-...", "sources": [ { "desktopAgent": "agent-B" }, @@ -1677,7 +1682,7 @@ Response message from a Desktop Agent: }, "meta": { "requestGuid": "", - "responseGuid": "", + "responseGuid": "", "timestamp": "2020-03-...", } } @@ -1699,7 +1704,7 @@ The bridge receives and collates the responses, augmenting each appIdentifier wi }, "meta": { "requestGuid": "", - "responseGuid": "", + "responseGuid": "", "timestamp": "2020-03-...", "sources": [ //added by DAB { "desktopAgent": "agent-A" }, @@ -1713,6 +1718,10 @@ The bridge receives and collates the responses, augmenting each appIdentifier wi In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. ::: +:::note +If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.resoonseGuid` and cna quote that given by the responding Desktop Agent. +::: + Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: ```JSON @@ -1736,13 +1745,14 @@ Generated by API call: e.g. ```javascript -// Retrieve a list of all instances of an application -let instances = await fdc3.findInstances({appId: "MyAppId"}); - -// Retrieve a list of instances of an application on a specified Desktop Agent -let instances = await fdc3.findInstances({appId: "MyAppId", desktopAgent: "agent-A"}); +let appIdentifier = { appId: "myApp@my.appd.com", desktopAgent: "agent-B" } +let appMetadata = await fdc3.getAppMetadata(appIdentifier); ``` +:::note +`fdc3.getAppMetadata` calls should only involve the Destkop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. +::: + Message exchange: ```mermaid @@ -1751,12 +1761,10 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: findInstances - DAB ->>+ DB: findInstances - DAB ->>+ DC: findInstances + DA ->>+ DAB: getAppMetadata + DAB ->>+ DB: getAppMetadata DB ->> DAB: findInstancesResponse (B) - DC ->> DAB: findInstancesResponse (C) - DAB -->>- DA: findInstancesResponse (B + C) + DAB -->>- DA: findInstancesResponse (B) ``` #### Request format @@ -1766,10 +1774,10 @@ Outward message to the bridge: ```JSON // agent-A -> DAB { - "type": "findInstances", + "type": "getAppMetadata", "payload": { "app": { - "appId": "myApp" + { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } } }, "meta": { @@ -1788,15 +1796,15 @@ which is repeated on to the target agent as: ```JSON // DAB -> agent-B { - "type": "findInstances", + "type": "getAppMetadata", "payload": { "app": { - "appId": "myApp" + { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } } }, "meta": { "requestGuid": "", - "timestamp": 2020-03-..., + "timestamp": "2020-03-...", "source": { "appId": "AChatApp", "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", @@ -1805,33 +1813,6 @@ which is repeated on to the target agent as: } } ``` - -If results should be constrained to a particular Desktop Agent, then set a `desktopAgent` field in `payload.app` and a matching `destination` field in `meta`: - -```JSON -// agent-A -> DAB -{ - "type": "findInstances", - "payload": { - "app": { - "appId": "myApp", - "desktopAgent": "agent-B" // destination agent - } - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "destination": { "desktopAgent": "agent-B"}, //destination agent - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" - } - } -} -``` - -The Desktop Agent Bridge should only forward the request to the requested Desktop Agent and handle the message exchange as a **Request Response (single)**. - #### Response format Response message from a Desktop Agent: @@ -1839,62 +1820,55 @@ Response message from a Desktop Agent: ```JSON // agent-B -> DAB { - "type": "findInstancesResponse", + "type": "getAppMetadataResponse", "payload": { - "appIdentifiers": [ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344"}, - { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d"}, - ] + "appMetadata": { + "appId": "myApp@my.appd.com", + "name": "myApp", + "version": "1.0", + "title": "My example application", + "tooltip": " A tooltip for the application that can be used to render UI elements.", + "description": "A longer, multi-paragraph description for the application that could include mark-up.", + "icons": [..], + "screenshots": [...] + } }, "meta": { "requestGuid": "", - "responseGuid": "", + "responseGuid": "", "timestamp": "2020-03-...", } } ``` -The bridge receives and collates the responses, augmenting each appIdentifier with a `desktopAgent` field, producing the following collated response which it sends back to agent-A: +The bridge receives the response, augments the appMetadata with a `desktopAgent` field, producing the following response which it sends back to agent-A: ```JSON // DAB -> agent-A { - "type": "findIntentResponse", + "type": "getAppMetadataResponse", "payload": { - "appIdentifiers": [ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, - //"desktopAgent" added by DAB - { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, - { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, - ] + "appMetadata": { + "appId": "myApp@my.appd.com", + "name": "myApp", + "version": "1.0", + "title": "My example application", + "tooltip": " A tooltip for the application that can be used to render UI elements.", + "description": "A longer, multi-paragraph description for the application that could include mark-up.", + "icons": [..], + "screenshots": [...], + "desktopAgent": "agent-B" //added by DAB + } }, "meta": { "requestGuid": "", "responseGuid": "", "timestamp": "2020-03-...", - "sources": [ //added by DAB - { "desktopAgent": "agent-A" }, - { "desktopAgent": "agent-B" }, - ] } } ``` -:::note -In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. -::: - -Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: -```JSON -// DAB -> agent-A -[ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, - { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, - { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, - { "appId": "myApp", "instanceId": "688dbd5e-21dc-4469-b8cf-4b6a606f9a27" } //local response -] -``` //TODO: further work required on the below message exchanges: From 4368c323937ccf46583362202d44d7d648b83860 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 23 Nov 2022 11:36:38 +0000 Subject: [PATCH 003/106] Adding `meta.errorDetails` array to collate error messages, BridgingError enumeration and notes on raiseIntentForCOntext handling via findIntentsByContext and raiseIntent --- docs/api-bridging/spec.md | 43 ++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 83c151ec4..447ff4f12 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -13,15 +13,16 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope * Clarified that collated response messages should have their own `meta.responseGuid` generated by the DAB * Corrected some related issues in the message handling pseudocode * Add message exchange for getAppMetadata +* Added a `meta.errorDetails` array to response messages that are collated +* Added a `BridgingError` enumeration to the error enumerations to provide messages for workflows broken by disconnect or where response from a particular DA times out. +* Add notes on how to handle `raiseIntentForContext` via the `findIntentByContext` and `raiseIntent` flows. ## Open questions ## TODO list * Complete message exchange documentation for PrivateChannels -* Add notes about flows for raiseIntentForContext and findIntentByContext -* Add getAppMetadata to messages exchange -* Add error details to the error handling + * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: * Add new terms and acronyms to FDC3 glossary and ensure they are defined in this spec's introduction @@ -456,7 +457,12 @@ Response messages will be differentiated from requests by the presence of a `met /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned * to the bridge before the timeout or because an error occurred. * May be omitted if all sources responded. */ - errorSources: [AppIdentifier | DesktopAgentIdentifier] + errorSources: [AppIdentifier | DesktopAgentIdentifier], + /** Array of error message strings for responses that were not returned + * to the bridge before the timeout or because an error occurred. + * Should be the same length as the `errorSources array and ordered the same. + * May be omitted if all sources responded. */ + errorDetails: [string] } } ``` @@ -534,9 +540,9 @@ For example, a `raiseIntent` targeted at an app instance that no longer exists m For messages that target a specific agent, the Desktop Agent Bridge will augment the message with a `source` field and return it to the calling agent and the app that made the original request. -However, API calls that require a collated response from all agents where at least one agent returns a successful response, will result in a successful response from the Desktop Agent Bridge (i.e. no `error` element should be included), with the agents returning errors listed in the `errorSources` array. This allows for successful exchanges on API calls such as `fdc3.findIntent` where some agents do not have options to return and would normally respond with (for example) `ResolveError.NoAppsFound`. +However, API calls that require a collated response from all agents where at least one agent returns a successful response, will result in a successful response from the Desktop Agent Bridge (i.e. no `error` element should be included), with the agents returning errors listed in the `errorSources` array and the error message strings they returned (or that were applied becuase they timed out) listed in the `errorDetails` array (in the same order as `errorSources`). This allows for successful exchanges on API calls such as `fdc3.findIntent` where some agents do not have options to return and would normally respond with (for example) `ResolveError.NoAppsFound`. -Finally, to facilitate easier debugging, errors specific to Desktop Agent Bridge are added to those enumerations, including: +Finally, to facilitate easier debugging, errors specific to Desktop Agent Bridge are added to the Error enumerations, including: ```typescript enum OpenError { @@ -559,6 +565,15 @@ enum ResultError { Agent Bridge before a result was returned. */ DesktopAgentDisconnected = 'DesktopAgentDisconnected', } + +enum BridgingError { + /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, + * within the alloted timeout. */ + ResponseTimedOut = 'ResponseToBridgeTimedOut', + /** Returned if a Desktop Agent that has been targetted by a particular request has + * been disconnected from the Bridge before a response has been received from it. */ + AgentDisconnected = 'AgentDisconnectedFromBridge' +} ``` ### Forwarding of Messages and Collating Responses @@ -602,10 +617,10 @@ The following pseudo-code defines how messages should be forwarded or collated b * produce the collated response message and return to the requesting Desktop Agent. * else await the configured response timeout or further responses, * if the timeout is reached without any responses being received - * produce and return an appropriate [error response](../api/ref/Errors), including details of all Desktop Agents in `errorSources`. + * produce and return an appropriate [error response](../api/ref/Errors), including details of all Desktop Agents in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. * else if the timeout is reached with a partial set of responses, - * produce and return, to requesting Desktop Agent, a collated response and include details of Desktop Agents that timed out in `errorSources`. + * produce and return, to requesting Desktop Agent, a collated response and include details of Desktop Agents that timed out in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. * else forward the response message on to requesting Desktop Agent. * else discard the response message (as it is a delayed to a request that has timed out or is otherwise invalid). @@ -626,11 +641,12 @@ The latter two types embody workflows that may be broken by an agent disconnecti When processing the disconnection of an agent from the bridge, the bridge MUST examine requests currently 'in-flight' and: * For requests that require the bridge to collate multiple responses: - * complete those that no longer require further responses (all other agents have responded), or + * add the disconnected Desktop Agent's details to the `errorSources` array in teh response and the `BridgingError.AgentDisconnected` message to the `errorDetails` array. + * complete requests that no longer require further responses (all other agents have responded), or * continue to await the timeout (if other agents are yet to respond), or * return an 'empty' response in the expected format (if no other agents are connected and no data will be received). * For requests that target a specific agent: - * return an appropriate error (as the request cannot be completed). + * return the `BridgingError.AgentDisconnected` in the response's `payload.error` field (as the request cannot be completed). Finally, in the event that either a Desktop Agent or the bridge itself stops responding, but doesn't fully disconnect, the timeouts (specified earlier in this document) will be used to handle the request as if a disconnection had occurred. @@ -1171,9 +1187,10 @@ Finally agent-A combines the payload received with it own response and returns i Type: **Request Multiple Response (single)** -Generated by API call: +Generated by API calls: -* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseIntent) +* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintent) +* [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintentforcontext) For Desktop Agent Bridging, a `fdc3.raiseIntent` call MUST always pass a `app: AppIdentifier` argument to target the intent. If a target `app` is not passed, then the `findIntent` message exchange should be used to collect options for the local resolver to use (note that Desktop Agents MAY also support the deprecated `raiseIntent` signature that uses the app `name` field by using the `findIntent` message exchange to attempt to resolve the `name` to an `AppIdentifier`). Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. @@ -1189,6 +1206,8 @@ Agent A should then conduct the `findIntent` message exchange as described above let appIntent = await fdc3.raiseIntent("StartChat", context, {"appId": "Slack", "desktopAgent": "agent-B"}); ``` +A similar approach applies to `fdc3.raiseIntentForContext` calls, in that a `findIntentByContext` message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. + Message exchange: :::note From 939c29bbee905abc20b4a533fd1b787e79e141c0 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 23 Nov 2022 11:44:30 +0000 Subject: [PATCH 004/106] change in website dir to trigger preview generation --- docs/api-bridging/spec.md | 3 +-- website/README.md | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 447ff4f12..a9f1717ed 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -12,7 +12,7 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope * Clarified that collated response messages should have their own `meta.responseGuid` generated by the DAB * Corrected some related issues in the message handling pseudocode -* Add message exchange for getAppMetadata +* Added message exchange for getAppMetadata * Added a `meta.errorDetails` array to response messages that are collated * Added a `BridgingError` enumeration to the error enumerations to provide messages for workflows broken by disconnect or where response from a particular DA times out. * Add notes on how to handle `raiseIntentForContext` via the `findIntentByContext` and `raiseIntent` flows. @@ -22,7 +22,6 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope ## TODO list * Complete message exchange documentation for PrivateChannels - * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: * Add new terms and acronyms to FDC3 glossary and ensure they are defined in this spec's introduction diff --git a/website/README.md b/website/README.md index cc2ab633f..31131787c 100644 --- a/website/README.md +++ b/website/README.md @@ -287,3 +287,4 @@ iOS doesn't currently (July 2019) support .webp image files - so use .png - and # Full Documentation Full documentation can be found on the [website](https://docusaurus.io/). + From 9d07e8860eff08eecc8e6f278a053f9f0ddc7521 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Wed, 23 Nov 2022 15:40:35 +0000 Subject: [PATCH 005/106] Fixed typos --- docs/api-bridging/spec.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index a9f1717ed..c3e619041 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -472,7 +472,7 @@ Response messages do not include a `meta.destination` as the routing of response There are a variety of message types need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Globally Unique Identifier (GUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. -Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestGuid` value. Response messages should quote that same value in the `meta.requestGuid` field and generate a further unique identity for their response, which is included in the `meta.responseGuid` field. Where a response is collated by the Desktop Agent Bridge, the Bridge should generate its own `meta.responseGuid` for the colalted response message. +Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestGuid` value. Response messages should quote that same value in the `meta.requestGuid` field and generate a further unique identity for their response, which is included in the `meta.responseGuid` field. Where a response is collated by the Desktop Agent Bridge, the Bridge should generate its own `meta.responseGuid` for the collated response message. Desktop Agent Bridge implementations should consider request messages that omit `meta.requestGuid` and response messages that omit either `meta.requestGuid` or `meta.responseGuid` to be invalid and should discard them. @@ -539,7 +539,7 @@ For example, a `raiseIntent` targeted at an app instance that no longer exists m For messages that target a specific agent, the Desktop Agent Bridge will augment the message with a `source` field and return it to the calling agent and the app that made the original request. -However, API calls that require a collated response from all agents where at least one agent returns a successful response, will result in a successful response from the Desktop Agent Bridge (i.e. no `error` element should be included), with the agents returning errors listed in the `errorSources` array and the error message strings they returned (or that were applied becuase they timed out) listed in the `errorDetails` array (in the same order as `errorSources`). This allows for successful exchanges on API calls such as `fdc3.findIntent` where some agents do not have options to return and would normally respond with (for example) `ResolveError.NoAppsFound`. +However, API calls that require a collated response from all agents where at least one agent returns a successful response, will result in a successful response from the Desktop Agent Bridge (i.e. no `error` element should be included), with the agents returning errors listed in the `errorSources` array and the error message strings they returned (or that were applied because they timed out) listed in the `errorDetails` array (in the same order as `errorSources`). This allows for successful exchanges on API calls such as `fdc3.findIntent` where some agents do not have options to return and would normally respond with (for example) `ResolveError.NoAppsFound`. Finally, to facilitate easier debugging, errors specific to Desktop Agent Bridge are added to the Error enumerations, including: @@ -569,7 +569,7 @@ enum BridgingError { /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, * within the alloted timeout. */ ResponseTimedOut = 'ResponseToBridgeTimedOut', - /** Returned if a Desktop Agent that has been targetted by a particular request has + /** Returned if a Desktop Agent that has been targeted by a particular request has * been disconnected from the Bridge before a response has been received from it. */ AgentDisconnected = 'AgentDisconnectedFromBridge' } @@ -590,7 +590,7 @@ For message exchanges that involve responses, it is the responsibility of the De * Augment response messages with `meta.source.desktopAgent` information (as described above). * Apply a timeout to the receipt of response messages for each request. * Produce a single collated response message (where necessary) that incorporates the output of each individual response received and has its own unique `meta.responseGuid` value. -* Deliver the collated and/or augemented response message to the source Desktop Agent that sent the request. +* Deliver the collated and/or augmented response message to the source Desktop Agent that sent the request. Collated response messages generated by the bridge use the same format as individual response messages. @@ -1737,7 +1737,7 @@ In the event that an agent times out or returns an error, where others respond, ::: :::note -If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.resoonseGuid` and cna quote that given by the responding Desktop Agent. +If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.responseGuid` and cna quote that given by the responding Desktop Agent. ::: Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: @@ -1768,7 +1768,7 @@ let appMetadata = await fdc3.getAppMetadata(appIdentifier); ``` :::note -`fdc3.getAppMetadata` calls should only involve the Destkop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. +`fdc3.getAppMetadata` calls should only involve the Desktop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. ::: Message exchange: @@ -1781,8 +1781,8 @@ sequenceDiagram participant DC as Desktop Agent C DA ->>+ DAB: getAppMetadata DAB ->>+ DB: getAppMetadata - DB ->> DAB: findInstancesResponse (B) - DAB -->>- DA: findInstancesResponse (B) + DB ->> DAB: getAppMetadataResponse (B) + DAB -->>- DA: getAppMetadataResponse (B) ``` #### Request format From 65c701b2dc67f58701b9732969dfa770f966953b Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Tue, 24 Jan 2023 11:34:58 +0000 Subject: [PATCH 006/106] proposal update --- docs/api-bridging/spec.md | 155 +++++++++++++++++++++++++------------- 1 file changed, 103 insertions(+), 52 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index c3e619041..2141723de 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -10,20 +10,14 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope ## Recent Changes -* Clarified that collated response messages should have their own `meta.responseGuid` generated by the DAB - * Corrected some related issues in the message handling pseudocode -* Added message exchange for getAppMetadata -* Added a `meta.errorDetails` array to response messages that are collated -* Added a `BridgingError` enumeration to the error enumerations to provide messages for workflows broken by disconnect or where response from a particular DA times out. -* Add notes on how to handle `raiseIntentForContext` via the `findIntentByContext` and `raiseIntent` flows. - -## Open questions +* Completed message exchange documentation for PrivateChannels +* Ensured `BridgingError` is used in relevant cases. ## TODO list -* Complete message exchange documentation for PrivateChannels * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: + * Create schema files defining messages * Add new terms and acronyms to FDC3 glossary and ensure they are defined in this spec's introduction * Add new errors to Error enumerations specified in this proposal * Add RFC 4122 - https://datatracker.ietf.org/doc/html/rfc4122 to FDC3 references page @@ -387,7 +381,9 @@ Request messages use the following format: /** Used as an argument to `open`, `raiseIntent`, `getAppMetadata`, and `findInstances` functions */ app?: AppIdentifier, /** Used as an argument to `findIntent` functions. */ - resultType?: string + resultType?: string, + /** Context type name used in Private Channel event messages. */ + contextType?: string }, /** Metadata used to uniquely identify the message and its sender. */ meta: { @@ -558,20 +554,13 @@ enum ResolveError { DesktopAgentNotFound = 'DesktopAgentNotFound', } -enum ResultError { - ... - /** Returned if the specified Desktop Agent disconnected from the Desktop - Agent Bridge before a result was returned. */ - DesktopAgentDisconnected = 'DesktopAgentDisconnected', -} - enum BridgingError { /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, * within the alloted timeout. */ ResponseTimedOut = 'ResponseToBridgeTimedOut', /** Returned if a Desktop Agent that has been targeted by a particular request has * been disconnected from the Bridge before a response has been received from it. */ - AgentDisconnected = 'AgentDisconnectedFromBridge' + AgentDisconnected = 'AgentDisconnected' } ``` @@ -1368,8 +1357,8 @@ When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent "context": {/*contextObj*/} /* for a channel IntentResult use: "channel": { - "id": "channel 1", - "type": "system" + "id": "app-channel xyz", + "type": "user" } */ } @@ -1576,7 +1565,6 @@ which is augmented and repeated on by the bridge as: } ``` - ### findInstances Type: **Request Response (collated)** or **Request Response (single)** @@ -1768,7 +1756,7 @@ let appMetadata = await fdc3.getAppMetadata(appIdentifier); ``` :::note -`fdc3.getAppMetadata` calls should only involve the Desktop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. +`fdc3.getAppMetadata` calls should only involve the Desktop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. ::: Message exchange: @@ -1831,6 +1819,7 @@ which is repeated on to the target agent as: } } ``` + #### Response format Response message from a Desktop Agent: @@ -1886,25 +1875,21 @@ The bridge receives the response, augments the appMetadata with a `desktopAgent` } ``` - - -//TODO: further work required on the below message exchanges: - ### PrivateChannels -`PrivateChannels` are intended to provide a private communication channel for applications. In order to do so, there are differences in how their broadcasts MUST be handled and a number of additional message exchanges MUST be supported in order to handle events that are used to manage the channel's lifecycle. +`PrivateChannels` are intended to provide a private communication channel for applications. In order to do so, there are differences in how their broadcasts and event messages (used to manage the channel's lifecycle) MUST be handled. -When a `ContextListener` is added to a remote `PrivateChannel`, removed from it or the `disconnect` function is called a notifications must be sent to the application that owns the channel. The bridge will add in the source agent (agent-A) and forward the message to destination (agent-B). +Broadcasts and event messages should be addressed to the Desktop Agent that created the channel, which will route it to the relevant application and any other listeners. If any of those listeners are remote, the message should be repeated back to the bridge, once for each listener with the destination set as a full `AppIdentifier`. Both these messages and broadcast messages MUST NOT be repeated back to the application that generated them. The source information on repeated messages should be unmodified to ensure that the message is attributed to the original source. -Such notification messages should be addressed to the Desktop Agent that owns the channel, which will route it to the owning application and any other listeners. If any of those listeners are remote, the message should be repeated back to the bridge, once for each listener with the destination set as a full `AppIdentifier`. Both these messages and broadcast messages MUST NOT be repeated back to the application that generated them. The source information on repeated messages should be unmodified to ensure that the message is attributed to the original source. +To facilitate the addressing of messages to the relevant Desktop Agent and `AppIdentifier` some additional tracking of private channel metadata is necessary in each Desktop Agent (or Desktop Agent Bridge Client implementation). For applications receiving a private channel as an `IntentResult`, the `AppIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id. This data MUST be retained until the receiving application sends a `disconnect` message, after which it can be discarded. For applications that have created and returned a private channel, and have subsequently received event messages subscriptions (`onAddContextListener`, `onSubscribe`, `onDisconnect`) the `appIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id and listener type, which will facilitate repeating of messages to registered listeners. This data MUST be retained until the remote application sends a `disconnect` message or a message indicating that the listener has been removed. -#### `broadcast` +#### `PrivateChannel.broadcast` Type: **Request only** -To maintain the privacy of PrivateChannel broadcasts, both Desktop Agents and Desktop Agent Bridge implementations SHOULD provide special handling for `PrivateChannel` broadcasts. Rather than broadcasting messages to all other Desktop Agents, broadcasts should be sent only to the Desktop Agent that owns the PrivateChannel, which will then repeat the broadcast message on to each `ContextListener` (both those that are local to the Desktop Agent and those added by remote Desktop Agents) - except for the source application. Doing so will require the Desktop Agent to track which applications have added a `ContextListener` to the `PrivateChannel`. +Broadcast messages that are sent from Agents that received the private channel from a remote agent are sent to the Desktop Agent that created the channel and returned it as an `IntentResult`, which is responsible for forwarding them onto other subscribers. If a broadcast message is generated on the Agent that created the channel it simply forwards it onto each subscriber. -Hence, the broadcast message should be modified such that it includes a destination and the `type` should indicate that it is a `PrivateChannel` broadcast: +Hence, the broadcast message should be repeated once for each subscriber, and modified such that it includes a destination, specified as a full `AppIdentifier`, and the `type` should indicate that it is a `PrivateChannel` broadcast: ```JSON // DAB -> agent-B @@ -1923,26 +1908,58 @@ Hence, the broadcast message should be modified such that it includes a destinat "desktopAgent": "agent-A" //added by DAB }, "destination": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", "desktopAgent": "agent-B" } } } ``` -For a broadcast to a `PrivateChannel` owned by another agent the destination should just include the `DesktopAgentIdentifier`. The message should then be repeated (once for each listener) from that Desktop Agent to other remote listeners without modifying the source information (to ensure that the message is attributed to the original source), but with a destination set as a full `AppIdentifier` for each remote listener. +#### `PrivateChannel.eventListenerAdded` + +Type: **Request only** + +Private channels support a number of additional event listeners (`onAddContextListener`, `onUnsubscribe`, `onDisconnect`), when an application adds one of these event listeners to a private channel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel to facilitate routing of event messages. A single message type is used for this with a `payload.listenerType` field. + +```JSON +// agent-A -> DAB +{ + "type": "PrivateChannel.eventListenerAdded", + "payload": { + "channel": "private-channel-ABC123", + "listenerType": "onAddContextListener" + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" + } + } +} +``` -#### `onAddContextListener` +#### `PrivateChannel.eventListenerRemoved` Type: **Request only** -When a `ContextListener` is added to a remote `PrivateChannel` or a remote listener needs to be notified of the event use the following message: +When an application removed an event listener from a private channel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel so it can discard retained routing information. A single message type is used for this with a `payload.listenerType` field. ```JSON // agent-A -> DAB { - "type": "PrivateChannel.onAddContextListener", + "type": "PrivateChannel.eventListenerRemoved", "payload": { - "channel": "private-channel-ABC123" + "channel": "private-channel-ABC123", + "listenerType": "onAddContextListener" }, "meta": { "requestGuid": "", @@ -1953,18 +1970,50 @@ When a `ContextListener` is added to a remote `PrivateChannel` or a remote liste "desktopAgent": "agent-A" //added by DAB }, "destination": { - "desktopAgent": "agent-B" //use DesktopAgentIdentifier to notify a remote PrivateChannel - //use a full AppIdentifier for event notifications to applications + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" } } } ``` -#### `listener.unsubscribe` +#### `PrivateChannel.onAddContextListener` Type: **Request only** -When a `ContextListener` is unsubscribed from a remote `PrivateChannel` or a remote listener needs to be notified of the event use the following message: +When a `ContextListener` is added to a `PrivateChannel` any applications that have added an `onAddContextListener` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. + +```JSON +// agent-A -> DAB +{ + "type": "PrivateChannel.onAddContextListener", + "payload": { + "channel": "private-channel-ABC123", + "contextType": "fdc3.instrument" + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" //added by DAB + }, + "destination": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" + } + } +} +``` + +#### `PrivateChannel.onUnsubscribe` + +Type: **Request only** + +When a `ContextListener` is removed from a `PrivateChannel` (via `listener.unsubscribe`) any applications that have added an `onSubscribe` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. ```JSON // DAB -> agent-B @@ -1975,13 +2024,14 @@ When a `ContextListener` is unsubscribed from a remote `PrivateChannel` or a rem "requestGuid": "", "timestamp": "2020-03-...", "source": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" //added by DAB + }, + "destination": { "appId": "AChatApp", "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - }, - "destination": { // duplicates the app argument - "desktopAgent": "agent-B" //use DesktopAgentIdentifier to notify a remote PrivateChannel - //use a full AppIdentifier for event notifications to applications + "desktopAgent": "agent-A" } } } @@ -1991,7 +2041,7 @@ When a `ContextListener` is unsubscribed from a remote `PrivateChannel` or a rem Type: **Request only** -When the `disconnect` function is is called on a remote `PrivateChannel` or a remote listener needs to be notified of the event use the following message: +When the `disconnect` function is is called on a `PrivateChannel` any applications that have added an `onDisconnect` handler or an `onUnsubscribe` handler (which is automatically called when an application disconnects) MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. If the `PrivateChannel` was created by a remote agent, only the single `PrivateChannel.onDisconnect` is required. It is the responsibility of the Desktop Agent that created the channel to ensure that any relevant `onUnsubscribe` handlers are also called by sending additional `PrivateChannel.onUnsubscribe` messages to them before forwarding the `PrivateChannel.onDisconnect`. This applies whether the disconnection occurred on that agent or on a remote agent. ```JSON // agent-A -> DAB @@ -2002,13 +2052,14 @@ When the `disconnect` function is is called on a remote `PrivateChannel` or a re "requestGuid": "", "timestamp": "2020-03-...", "source": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" //added by DAB + }, + "destination": { "appId": "AChatApp", "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - }, - "destination": { // duplicates the app argument - "desktopAgent": "agent-B" //use DesktopAgentIdentifier to notify a remote PrivateChannel - //use a full AppIdentifier for event notifications to applications + "desktopAgent": "agent-A" } } } From 01a4cb8fc033c28e400bf5a8a4560274c8eb2cca Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Wed, 22 Feb 2023 18:02:06 +0000 Subject: [PATCH 007/106] fix type definition typo --- docs/api-bridging/spec.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 2141723de..f0c3a3cb7 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -231,7 +231,7 @@ The DAB will extract the authentication token `sub` from the JWT token's claims type: "authenticationFailed", meta: { /** Timestamp at which response was generated */ - timestamp: date, + timestamp: Date, /** GUID for the handshake request */ requestGuid: string, /** Unique GUID for this message */ @@ -448,16 +448,16 @@ Response messages will be differentiated from requests by the presence of a `met /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and * multiple values for responses that were collated by the bridge.*/ - sources: [AppIdentifier | DesktopAgentIdentifier], + sources: (AppIdentifier | DesktopAgentIdentifier)[], /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned * to the bridge before the timeout or because an error occurred. * May be omitted if all sources responded. */ - errorSources: [AppIdentifier | DesktopAgentIdentifier], + errorSources: (AppIdentifier | DesktopAgentIdentifier)[], /** Array of error message strings for responses that were not returned * to the bridge before the timeout or because an error occurred. * Should be the same length as the `errorSources array and ordered the same. * May be omitted if all sources responded. */ - errorDetails: [string] + errorDetails: string[] } } ``` @@ -1699,7 +1699,7 @@ The bridge receives and collates the responses, augmenting each appIdentifier wi ```JSON // DAB -> agent-A { - "type": "findIntentResponse", + "type": "findInstancesResponse", "payload": { "appIdentifiers": [ { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, From d0b5e5fd979fd96f5e596a823f96b71acfa61764 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Fri, 24 Feb 2023 15:06:01 +0000 Subject: [PATCH 008/106] Adding schemas for types --- src/api/schemas/appIdentifier.schema.json | 19 +++++++ src/api/schemas/appIntent.schema.json | 23 ++++++++ src/api/schemas/appMetadata.schema.json | 55 +++++++++++++++++++ src/api/schemas/channel.schema.json | 28 ++++++++++ src/api/schemas/contextMetadata.schema.json | 16 ++++++ src/api/schemas/displayMetadata.schema.json | 19 +++++++ src/api/schemas/errors.schema.json | 46 ++++++++++++++++ src/api/schemas/icon.schema.json | 22 ++++++++ src/api/schemas/image.schema.json | 25 +++++++++ .../implementationMetadata.schema.json | 44 +++++++++++++++ src/api/schemas/intentMetadata.schema.json | 20 +++++++ src/api/schemas/intentResolution.schema.json | 23 ++++++++ src/api/schemas/intentResult.schema.json | 15 +++++ 13 files changed, 355 insertions(+) create mode 100644 src/api/schemas/appIdentifier.schema.json create mode 100644 src/api/schemas/appIntent.schema.json create mode 100644 src/api/schemas/appMetadata.schema.json create mode 100644 src/api/schemas/channel.schema.json create mode 100644 src/api/schemas/contextMetadata.schema.json create mode 100644 src/api/schemas/displayMetadata.schema.json create mode 100644 src/api/schemas/errors.schema.json create mode 100644 src/api/schemas/icon.schema.json create mode 100644 src/api/schemas/image.schema.json create mode 100644 src/api/schemas/implementationMetadata.schema.json create mode 100644 src/api/schemas/intentMetadata.schema.json create mode 100644 src/api/schemas/intentResolution.schema.json create mode 100644 src/api/schemas/intentResult.schema.json diff --git a/src/api/schemas/appIdentifier.schema.json b/src/api/schemas/appIdentifier.schema.json new file mode 100644 index 000000000..f23f2c941 --- /dev/null +++ b/src/api/schemas/appIdentifier.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/appIdentifier.schema.json", + "title": "AppIdentifier", + "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls at specific applications.", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "instanceId": { + "type": "string" + } + }, + "required": [ + "appId" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/appIntent.schema.json b/src/api/schemas/appIntent.schema.json new file mode 100644 index 000000000..41a68cf89 --- /dev/null +++ b/src/api/schemas/appIntent.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/appIntent.schema.json", + "title": "AppIntent", + "description": "Represents the binding of an intent to apps", + "type": "object", + "properties": { + "intent": { + "$ref": "https://fdc3.finos.org/schemas/next/intentMetadata.schema.json" + }, + "apps": { + "type": "array", + "items": { + "$ref": "https://fdc3.finos.org/schemas/next/appMetadata.schema.json" + } + } + }, + "required": [ + "intent", + "apps" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/appMetadata.schema.json b/src/api/schemas/appMetadata.schema.json new file mode 100644 index 000000000..6b76a2376 --- /dev/null +++ b/src/api/schemas/appMetadata.schema.json @@ -0,0 +1,55 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/appMetadata.schema.json", + "title": "AppMetadata", + "description": "Extends an AppIdentifier, describing an application or instance of an application.", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "instanceId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "instanceMetadata": { + "type": "object" + }, + "title": { + "type": "string" + }, + "tooltip": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icons": { + "type": "array", + "items": { + "$ref": "https://fdc3.finos.org/schemas/next/icon.schema.json" + } + }, + "screenshots": { + "type": "array", + "items": { + "$ref": "https://fdc3.finos.org/schemas/next/image.schema.json" + } + }, + "resultType": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false, + "required": [ + "appId" + ] +} \ No newline at end of file diff --git a/src/api/schemas/channel.schema.json b/src/api/schemas/channel.schema.json new file mode 100644 index 000000000..9c18e46f8 --- /dev/null +++ b/src/api/schemas/channel.schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/channel.schema.json", + "title": "Channel", + "description": "Represents a context channel that applications can join to share context data.", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "user", + "app", + "private" + ] + }, + "displayMetadata": { + "$ref": "https://fdc3.finos.org/schemas/next/displayMetadata.schema.json" + } + }, + "required": [ + "id", + "type" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/contextMetadata.schema.json b/src/api/schemas/contextMetadata.schema.json new file mode 100644 index 000000000..ce5b80102 --- /dev/null +++ b/src/api/schemas/contextMetadata.schema.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/contextMetadata.schema.json", + "title": "ContextMetadata", + "description": "Metadata relating to a context or intent & context received through the addContextListener and addIntentListener functions.", + "type": "object", + "properties": { + "source": { + "$ref": "https://fdc3.finos.org/schemas/next/appIdentifier.schema.json" + } + }, + "required": [ + "source" + ], + "additionalProperties": false +} diff --git a/src/api/schemas/displayMetadata.schema.json b/src/api/schemas/displayMetadata.schema.json new file mode 100644 index 000000000..dd266653c --- /dev/null +++ b/src/api/schemas/displayMetadata.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/displayMetadata.schema.json", + "title": "DisplayMetadata", + "description": "A desktop agent (typically for user channels) may want to provide additional information about how a channel can be represented in a UI. A common use case is for color linking.", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "glyph": { + "type": "string" + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/errors.schema.json b/src/api/schemas/errors.schema.json new file mode 100644 index 000000000..dc1215ea0 --- /dev/null +++ b/src/api/schemas/errors.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/errors.schema.json", + "definitions": { + "OpenError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling the open method on the DesktopAgent object.", + "enum": [ + "AppNotFound", + "ErrorOnLaunch", + "AppTimeout", + "ResolverUnavailable" + ] + }, + "ResolveError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling the findIntent, findIntentsByContext, raiseIntent or raiseIntentForContext methods on the DesktopAgent.", + "enum": [ + "NoAppsFound", + "ResolverUnavailable", + "UserCancelledResolution", + "ResolverTimeout", + "TargetAppUnavailable", + "TargetInstanceUnavailable", + "IntentDeliveryFailed" + ] + }, + "ResultError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling the getResult method on the IntentResolution Object.", + "enum": [ + "NoResultReturned", + "IntentHandlerRejected" + ] + }, + "ChannelError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling channels using the joinUserChannel or getOrCreateChannel methods, or the getCurrentContext, broadcast or addContextListener methods on the Channel object.", + "enum": [ + "NoChannelFound", + "AccessDenied", + "CreationFailed" + ] + } + } +} \ No newline at end of file diff --git a/src/api/schemas/icon.schema.json b/src/api/schemas/icon.schema.json new file mode 100644 index 000000000..064cc5bae --- /dev/null +++ b/src/api/schemas/icon.schema.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/icon.schema.json", + "title": "Icon", + "description": "Metadata relating to a single icon image at a remote URL, used to represent an application in a user interface.", + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "size": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "src" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/image.schema.json b/src/api/schemas/image.schema.json new file mode 100644 index 000000000..6640bdc8a --- /dev/null +++ b/src/api/schemas/image.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/image.schema.json", + "title": "Image", + "description": "Metadata relating to a single image at a remote URL, used to represent screenshot images.", + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "size": { + "type": "string" + }, + "type": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "required": [ + "src" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/implementationMetadata.schema.json b/src/api/schemas/implementationMetadata.schema.json new file mode 100644 index 000000000..0e8f5172b --- /dev/null +++ b/src/api/schemas/implementationMetadata.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/implementationMetadata.schema.json", + "title": "ImplementationMetadata", + "description": "Metadata relating to the FDC3 DesktopAgent object and its provider", + "type": "object", + "properties": { + "fdc3Version": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "providerVersion": { + "type": "string" + }, + "optionalFeatures": { + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "type": "boolean" + }, + "UserChannelMembershipAPIs": { + "type": "boolean" + } + }, + "required": [ + "OriginatingAppMetadata", + "UserChannelMembershipAPIs" + ], + "additionalProperties": false + }, + "appMetadata": { + "$ref": "https://fdc3.finos.org/schemas/next/appMetadata.schema.json" + } + }, + "required": [ + "fdc3Version", + "provider", + "optionalFeatures", + "appMetadata" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/intentMetadata.schema.json b/src/api/schemas/intentMetadata.schema.json new file mode 100644 index 000000000..98b2ba64f --- /dev/null +++ b/src/api/schemas/intentMetadata.schema.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/intentMetadata.schema.json", + "title": "IntentMetadata", + "description": "The interface used to describe an intent within the platform.", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "displayName": { + "type": "string" + } + }, + "required": [ + "name", + "displayName" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/intentResolution.schema.json b/src/api/schemas/intentResolution.schema.json new file mode 100644 index 000000000..9f98e7c84 --- /dev/null +++ b/src/api/schemas/intentResolution.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/intentResolution.schema.json", + "title": "IntentResolution", + "description": "IntentResolution provides a standard format for data returned upon resolving an intent.", + "type": "object", + "properties": { + "source": { + "$ref": "https://fdc3.finos.org/schemas/next/appIdentifier.schema.json" + }, + "intent": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "source", + "intent" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/intentResult.schema.json b/src/api/schemas/intentResult.schema.json new file mode 100644 index 000000000..12dd01f40 --- /dev/null +++ b/src/api/schemas/intentResult.schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/intentResult.schema.json", + "title": "IntentResult", + "description": "Describes results that an Intent handler may optionally return that should be communicated back to the app that raised the intent, via the IntentResolution.", + "type": "object", + "anyOf": [ + { + "$ref": "https://fdc3.finos.org/schemas/next/context.schema.json" + }, + { + "$ref": "https://fdc3.finos.org/schemas/next/channel.schema.json" + } + ] +} \ No newline at end of file From e19265827f6c628fb3884d06d15f75aaf7f169f6 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 19 Apr 2023 18:26:10 +0100 Subject: [PATCH 009/106] add support for mermaid diagrams to website --- website/docusaurus.config.js | 4 ++++ website/package.json | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 63d7a3ada..65c936f38 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -43,6 +43,10 @@ module.exports={ } ] ], + markdown: { + mermaid: true, + }, + themes: ['@docusaurus/theme-mermaid'], "plugins": [], "themeConfig": { "navbar": { diff --git a/website/package.json b/website/package.json index 9758225c6..859ea12e9 100644 --- a/website/package.json +++ b/website/package.json @@ -39,8 +39,9 @@ "is-svg": "4.2.2" }, "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/preset-classic": "2.3.1", + "@docusaurus/core": "2.4.0", + "@docusaurus/preset-classic": "2.4.0", + "@docusaurus/theme-mermaid": "^2.4.0", "clsx": "^1.1.1", "react": "^17.0.2", "react-dom": "^17.0.2" From 86e8f2880fef8f1fc2041f47ab4b3da1bb1920cf Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 19 Apr 2023 18:26:48 +0100 Subject: [PATCH 010/106] breakout message exchange in reference pages --- .../ref/PrivateChannel.broadcast.md | 61 + .../ref/PrivateChannel.eventListenerAdded.md | 46 + .../PrivateChannel.eventListenerRemoved.md | 49 + .../PrivateChannel.onAddContextListener.md | 44 + .../ref/PrivateChannel.onDisconnect.md | 41 + .../ref/PrivateChannel.onUnsubscribe.md | 44 + docs/api-bridging/ref/broadcast.md | 89 ++ docs/api-bridging/ref/findInstances.md | 178 +++ docs/api-bridging/ref/findIntent.md | 233 +++ docs/api-bridging/ref/findIntentsByContext.md | 201 +++ docs/api-bridging/ref/getAppMetadata.md | 138 ++ docs/api-bridging/ref/open.md | 143 ++ docs/api-bridging/ref/raiseIntent.md | 267 ++++ docs/api-bridging/spec.md | 1409 +---------------- docs/api/ref/PrivateChannel.md | 2 +- website/sidebars.json | 20 + 16 files changed, 1577 insertions(+), 1388 deletions(-) create mode 100644 docs/api-bridging/ref/PrivateChannel.broadcast.md create mode 100644 docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md create mode 100644 docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md create mode 100644 docs/api-bridging/ref/PrivateChannel.onAddContextListener.md create mode 100644 docs/api-bridging/ref/PrivateChannel.onDisconnect.md create mode 100644 docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md create mode 100644 docs/api-bridging/ref/broadcast.md create mode 100644 docs/api-bridging/ref/findInstances.md create mode 100644 docs/api-bridging/ref/findIntent.md create mode 100644 docs/api-bridging/ref/findIntentsByContext.md create mode 100644 docs/api-bridging/ref/getAppMetadata.md create mode 100644 docs/api-bridging/ref/open.md create mode 100644 docs/api-bridging/ref/raiseIntent.md diff --git a/docs/api-bridging/ref/PrivateChannel.broadcast.md b/docs/api-bridging/ref/PrivateChannel.broadcast.md new file mode 100644 index 000000000..59a5f1116 --- /dev/null +++ b/docs/api-bridging/ref/PrivateChannel.broadcast.md @@ -0,0 +1,61 @@ +--- +id: PrivateChannel.broadcast +sidebar_label: PC.broadcast +title: PrivateChannel.broadcast +--- + +Desktop Agent bridging message exchange for a `broadcast` API call on a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: + +* [`PrivateChannel.broadcast(context: Context)`](../../api/ref/Channel#broadcast) (inherited from the [Channel](../../api/ref/Channel#broadcast) class) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request only** + +E.g. + +```javascript +fdc3.addIntentListener("QuoteStream", async (context) => { + const privateChannel: PrivateChannel = await fdc3.createPrivateChannel(); + const symbol = context.id.ticker; + + // This gets called when the remote side adds a context listener + const addContextListener = privateChannel.onAddContextListener((contextType) => { + // broadcast price quotes as they come in from our quote feed + feed.onQuote(symbol, (price) => { + privateChannel.broadcast({ type: "price", price}); + }); + }); + + ... + + return channel; +}); +``` + +Broadcast messages that are sent from Agents that received the private channel from a remote agent are sent to the Desktop Agent that created the channel and returned it as an `IntentResult`, which is responsible for forwarding them onto other subscribers. If a broadcast message is generated on the Agent that created the channel it simply forwards it onto each subscriber. + +Hence, the broadcast message should be repeated once for each subscriber, and modified such that it includes a destination, specified as a full `AppIdentifier`, and the `type` should indicate that it is a `PrivateChannel` broadcast: + +```json +// DAB -> agent-B +{ + "type": "PrivateChannel.broadcast", //modified type for PrivateChannel broadcasts + "payload": { + "channel": "private-channel-ABC123", + "context": { /*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" + } + } +} +``` diff --git a/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md b/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md new file mode 100644 index 000000000..c41a6fe2c --- /dev/null +++ b/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md @@ -0,0 +1,46 @@ +--- +id: PrivateChannel.eventListenerAdded +sidebar_label: PC.eventListenerAdded +title: PrivateChannel.eventListenerAdded +--- + +Desktop Agent bridging message exchange for the addition of an event handler to a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: + +* [`PrivateChannel.onAddContextListener(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onaddcontextlistener) +* [`PrivateChannel.onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) +* [`PrivateChannel.onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request only** + +:::caution + +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. + +::: + +Private channels support a number of additional event listeners (`onAddContextListener`, `onUnsubscribe`, `onDisconnect`), when an application adds one of these event listeners to a private channel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel to facilitate routing of event messages. A single message type is used for this with a `payload.listenerType` field. + +```json +// agent-A -> DAB +{ + "type": "PrivateChannel.eventListenerAdded", + "payload": { + "channel": "private-channel-ABC123", + "listenerType": "onAddContextListener" + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" + } + } +} +``` diff --git a/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md new file mode 100644 index 000000000..32537f1df --- /dev/null +++ b/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -0,0 +1,49 @@ +--- +id: PrivateChannel.eventListenerRemoved +sidebar_label: PC.eventListenerRemoved +title: PrivateChannel.eventListenerRemoved +--- + +Desktop Agent bridging message exchange for the removal of an event handler from a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: + +* [`listener.unsubscribe()`](../../api/ref/Types#listener) + * for []`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: + * [onAddContextListener(handler: (contextType?: string)](../../api/ref/PrivateChannel#onaddcontextlistener) + * [`onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) + * [`onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) +* [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request only** + +:::caution + +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. + +::: + +Private channels support a number of additional event listeners (`onAddContextListener`, `onUnsubscribe`, `onDisconnect`), when an application removes an event listener from a PrivateChannel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel so it can discard retained routing information. A single message type is used for this with a `payload.listenerType` field. + +```json +// agent-A -> DAB +{ + "type": "PrivateChannel.eventListenerRemoved", + "payload": { + "channel": "private-channel-ABC123", + "listenerType": "onAddContextListener" + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" + } + } +} +``` diff --git a/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md b/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md new file mode 100644 index 000000000..0ae8120c4 --- /dev/null +++ b/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md @@ -0,0 +1,44 @@ +--- +id: PrivateChannel.onAddContextListener +sidebar_label: PC.onAddContextListener +title: PrivateChannel.onAddContextListener +--- + +Desktop Agent bridging message exchange for the addition of a [`ContextHandler`](../../api/ref/Types#contexthandler) to a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API call: + +* [`PrivateChannel.addContextListener(contextType: string | null, handler: ContextHandler)`](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request only** + +:::caution + +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. + +::: + +When a `ContextListener` is added to a `PrivateChannel` any applications that have added an `onAddContextListener` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. + +```json +// agent-A -> DAB +{ + "type": "PrivateChannel.onAddContextListener", + "payload": { + "channel": "private-channel-ABC123", + "contextType": "fdc3.instrument" + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" //added by DAB + }, + "destination": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" + } + } +} +``` diff --git a/docs/api-bridging/ref/PrivateChannel.onDisconnect.md b/docs/api-bridging/ref/PrivateChannel.onDisconnect.md new file mode 100644 index 000000000..73fcc8858 --- /dev/null +++ b/docs/api-bridging/ref/PrivateChannel.onDisconnect.md @@ -0,0 +1,41 @@ +--- +id: PrivateChannel.onDisconnect +sidebar_label: PC.onDisconnect +title: PrivateChannel.onDisconnect +--- + +Desktop Agent bridging message exchange for a `disconnect()` API call on [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API call: + +* [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request only** + +:::caution + +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. + +::: + +When the `disconnect` function is is called on a `PrivateChannel` any applications that have added an `onDisconnect` handler or an `onUnsubscribe` handler (which is automatically called when an application disconnects) MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. If the `PrivateChannel` was created by a remote agent, only the single `PrivateChannel.onDisconnect` is required. It is the responsibility of the Desktop Agent that created the channel to ensure that any relevant `onUnsubscribe` handlers are also called by sending additional `PrivateChannel.onUnsubscribe` messages to them before forwarding the `PrivateChannel.onDisconnect`. This applies whether the disconnection occurred on that agent or on a remote agent. + +```json +// agent-A -> DAB +{ + "type": "PrivateChannel.onDisconnect", + "payload": {}, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" //added by DAB + }, + "destination": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" + } + } +} +``` diff --git a/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md new file mode 100644 index 000000000..43331d43c --- /dev/null +++ b/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -0,0 +1,44 @@ +--- +id: PrivateChannel.onUnsubscribe +sidebar_label: PC.onUnsubscribe +title: PrivateChannel.onUnsubscribe +--- + +Desktop Agent bridging message exchange for the removal of a [`ContextHandler`](../../api/ref/Types#contexthandler) from a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: + +* [`listener.unsubscribe()`](../../api/ref/Types#listener) + * for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: + * [addContextListener(handler: (contextType?: string)](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) +* [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request only** + +:::caution + +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. + +::: + +When a `ContextListener` is removed from a `PrivateChannel` (via `listener.unsubscribe`) any applications that have added an `onSubscribe` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. + +```json +// DAB -> agent-B +{ + "type": "PrivateChannel.onUnsubscribe", + "payload": {}, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AnotherApp", + "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", + "desktopAgent": "agent-B" //added by DAB + }, + "destination": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" + } + } +} +``` diff --git a/docs/api-bridging/ref/broadcast.md b/docs/api-bridging/ref/broadcast.md new file mode 100644 index 000000000..6dae62c10 --- /dev/null +++ b/docs/api-bridging/ref/broadcast.md @@ -0,0 +1,89 @@ +--- +id: broadcast +sidebar_label: broadcast +title: broadcast +--- + +Desktop Agent bridging message exchange for a `broadcast()` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent) or a [`Channel`](../../api/ref/Channel). Generated by API calls: + +* [`fdc3.broadcast(context: Context)`](../../api/ref/DesktopAgent#broadcast) +* [`Channel.broadcast(context: Context)`](../../api/ref/Channel#broadcast) + +:::caution + +Broadcasts on a [`PrivateChannel`](../../api/ref/PrivateChannel) have a separate message exchange, see [`PrivateChannel.broadcast`](ref/PrivateChannel.broadcast). + +::: + +[Message Exchange Type](../spec#individual-message-exchanges): **Request only** + +E.g. + +```javascript +fdc3.broadcast(contextObj); +``` + +or + +```javascript +(await fdc3.getOrCreateChannel("myChannel")).broadcast(contextObj) +``` + +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: broadcast + DAB ->>+ DB: broadcast + DAB ->>+ DC: broadcast +``` + +## Request format + +Outward message to the DAB: + +```json +// agent-A -> DAB +{ + "type": "broadcast", + "payload": { + "channel": "myChannel", + "context": { /*contextObj*/ } + }, + "meta": { + "requestGuid": "", + "timestamp": "2022-03-...", + "source": [{ + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + }] + } +} +``` + +which it repeats on to agent-B AND agent-C with the `source.desktopAgent` metadata added. + +```json +// DAB -> agent-B +// DAB -> agent-C +{ + "type": "broadcast", + "payload": { + "channel": "myChannel", + "context": { /*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": [{ + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + }] + } +} +``` diff --git a/docs/api-bridging/ref/findInstances.md b/docs/api-bridging/ref/findInstances.md new file mode 100644 index 000000000..a3fac4694 --- /dev/null +++ b/docs/api-bridging/ref/findInstances.md @@ -0,0 +1,178 @@ +--- +id: findInstances +sidebar_label: findInstances +title: findInstances +--- + +Desktop Agent bridging message exchange for a `findInstances` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: + +* [`findInstances(app: AppIdentifier)`](../../api/ref/DesktopAgent#findinstances) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** or **Request Response (single)** + +E.g. + +```javascript +// Retrieve a list of all instances of an application +let instances = await fdc3.findInstances({appId: "MyAppId"}); + +// Retrieve a list of instances of an application on a specified Desktop Agent +let instances = await fdc3.findInstances({appId: "MyAppId", desktopAgent: "agent-A"}); +``` + +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: findInstances + DAB ->>+ DB: findInstances + DAB ->>+ DC: findInstances + DB ->> DAB: findInstancesResponse (B) + DC ->> DAB: findInstancesResponse (C) + DAB -->>- DA: findInstancesResponse (B + C) +``` + +## Request format + +Outward message to the bridge: + +```json +// agent-A -> DAB +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp" + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +which is repeated on to the target agent as: + +```json +// DAB -> agent-B +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp" + } + }, + "meta": { + "requestGuid": "", + "timestamp": 2020-03-..., + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +If results should be constrained to a particular Desktop Agent, then set a `desktopAgent` field in `payload.app` and a matching `destination` field in `meta`: + +```json +// agent-A -> DAB +{ + "type": "findInstances", + "payload": { + "app": { + "appId": "myApp", + "desktopAgent": "agent-B" // destination agent + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "destination": { "desktopAgent": "agent-B"}, //destination agent + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +The Desktop Agent Bridge should only forward the request to the requested Desktop Agent and handle the message exchange as a **Request Response (single)**. + +## Response format + +Response message from a Desktop Agent: + +```json +// agent-B -> DAB +{ + "type": "findInstancesResponse", + "payload": { + "appIdentifiers": [ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344"}, + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d"}, + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +The bridge receives and collates the responses, augmenting each appIdentifier with a `desktopAgent` field, producing the following collated response which it sends back to agent-A: + +```json +// DAB -> agent-A +{ + "type": "findInstancesResponse", + "payload": { + "appIdentifiers": [ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + //"desktopAgent" added by DAB + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, + { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [ //added by DAB + { "desktopAgent": "agent-A" }, + { "desktopAgent": "agent-B" }, + ] + } +} +``` + +:::info +If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.responseGuid` and can quote that given by the responding Desktop Agent. +::: + +:::note +In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. +::: + +Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: + +```json +// DAB -> agent-A +[ + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, + { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, + { "appId": "myApp", "instanceId": "688dbd5e-21dc-4469-b8cf-4b6a606f9a27" } //local response +] +``` diff --git a/docs/api-bridging/ref/findIntent.md b/docs/api-bridging/ref/findIntent.md new file mode 100644 index 000000000..862846f49 --- /dev/null +++ b/docs/api-bridging/ref/findIntent.md @@ -0,0 +1,233 @@ +--- +id: findIntent +sidebar_label: findIntent +title: findIntent +--- + +Desktop Agent bridging message exchange for a `findIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API call: + +* [`findIntent(intent: string, context?: Context, resultType?: string)`](../../api/ref/DesktopAgent#findintent) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** + +E.g. An application with `appId: "agentA-app1"` and `instanceId: "c6ad5174-6f78-4582-8e96-728d93a4d7d7"` makes the following API call: + +```javascript +let appIntent = await fdc3.findIntent("StartChat", context); +``` + +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: findIntent + DAB ->>+ DB: findIntent + DB -->>- DAB: findIntentResponse (B) + DAB ->>+ DC: findIntent + DC -->>- DAB: findIntentResponse (C) + DAB -->>- DA: findIntentResponse (B + C) +``` + +## Request format + +Outward message to the DAB: + +```json +// agent-A -> DAB +{ + "type": "findIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": [{ + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + }] + } +} +``` + +The DAB fills in the `source.desktopAgent` field and forwards the request to the other Desktop Agents (agent-B AND agent-C): + +```json +// DAB -> agent-B +// DAB -> agent-C +{ + "type": "findIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +Note that the `source.desktopAgent` field has been populated with the id of the agent that raised the requests, enabling the routing of responses. + +## Response format + +Normal response from agent-A, where the request was raised. + +```json +{ + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "myChat" } + ] +} +``` + +DA agent-B would produce the following response if the request was generated locally: + +```json +{ + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] +} +``` + +Hence, the response it sends to the bridge is encoded as follows: + +```json +// agent-B -> DAB +{ + "type": "findIntentResponse", + "payload": { + "appIntent": { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */ }, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +Note the response GUID generated by the agent-B and the reference to the request GUID produced by agent-A where the request was originated. Further, note that the `AppMetadata` elements in the `AppIntent` do not have a `desktopAgent` field yet, and the `meta` element does not contain a `sources` element, both of which the bridge will add. + +DA agent-C would produce the following response locally: + +```json +{ + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "WebIce"} + ] +} +``` + +which is sent back over the bridge as a response to the request message as: + +```json +// agent-C -> DAB +{ + "type": "findIntentResponse", + "payload": { + "appIntent": { + "intent": { "appId": "StartChat" }, + "apps": [ + { "appId": "WebIce"} + ] + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +The bridge receives and collates the responses, producing the following collated response which is sends back to agent-A: + +```json +// DAB -> agent-A +{ + "type": "findIntentResponse", + "payload": { + "intent": "StartChat", + "appIntent": { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, //desktopAgent added by DAB + { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony", + "desktopAgent": "agent-B" }, + { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, + { "appId": "WebIce", "desktopAgent": "agent-C"} + ] + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [ //added by DAB + { "desktopAgent": "agent-A" }, + { "desktopAgent": "agent-B" }, + ] + } +} +``` + +:::note +In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. +::: + +Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: + +```json +// agent-A -> requesting App +{ + "intent": { "name": "StartChat", "displayName": "Chat" }, + "apps": [ + // local to this agent + { "appId": "myChat" }, + //agent-B responses + { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, + { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony", + "desktopAgent": "agent-B" }, + { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, + //agent-C responses + { "appId": "WebIce", "desktopAgent": "agent-C"} + ] +} +``` diff --git a/docs/api-bridging/ref/findIntentsByContext.md b/docs/api-bridging/ref/findIntentsByContext.md new file mode 100644 index 000000000..26f37adf5 --- /dev/null +++ b/docs/api-bridging/ref/findIntentsByContext.md @@ -0,0 +1,201 @@ +--- +id: findIntentsByContext +sidebar_label: findIntentsByContext +title: findIntentsByContext +--- + +Desktop Agent bridging message exchange for a `findIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API call: + +* [`findIntentsByContext(context: Context)`](../api/ref/DesktopAgent#findintentsbycontext) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** + +E.g. An application with appId `agentA-app1` makes the following API call: + +```javascript +let appIntentArr = await fdc3.findIntentsByContext(context); +``` + +:::note +The message exchanges for this API call are nearly identical to that used for [`findIntent()`](findIntent), differing only by the lack of an `intent` field in the request message payload and the structure of the response message (where an array of `AppIntents` is returned). +::: + +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: findInfindIntentsByContexttent + DAB ->>+ DB: findIntentsByContext + DB -->>- DAB: findIntentsByContextResponse (B) + DAB ->>+ DC: findIntentsByContext + DC -->>- DAB: findIntentsByContextResponse (C) + DAB -->>- DA: findIntentsByContextResponse (B + C) +``` + +## Request format + +Outward message to the DAB: + +```json +// agent-A -> DAB +{ + "type": "findIntentsForContext", + "payload": { + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + } + } +} +``` + +The DAB fills in the `source.desktopAgent` field and forwards the request to the other Desktop Agents (agent-B AND agent-C). + +```json +// DAB -> agent-B +// DAB -> agent-C +{ + "type": "findIntentsForContext", + "payload": { + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +## Response format + +An individual agent (for example agentB) would generate a local response as an array of `AppIntent` objects: + +```json +[ + { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] + }, + { + "intent": { "name": "ViewProfile" }, + "apps": [ + { "appId": "myCRM", "title": "My CRM" }, + { "appId": "myCRM", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "My CRM" } + ] + } +] +``` + +This response is encoded and sent to the bridge as: + +```json +// agent-B -> DAB +{ + "type": "findIntentsForContextResponse", + "payload": { + "appIntents": [ + { + "intent": { "name": "StartChat" }, + "apps": [ + { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, + { "appId": "Symphony", "title": "Symphony" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony" }, + { "appId": "Slack", "title": "Slack" } + ] + }, + { + "intent": { "name": "ViewProfile" }, + "apps": [ + { "appId": "myCRM", "title": "My CRM" }, + { "appId": "myCRM", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "My CRM" } + ] + } + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +Each `AppMetadata` object is augmented by the bridge with a `desktopAgent` field, the responding `DesktopAgentIdentifier` value is added to the `meta.sources` element and the message payload is collated with responses from other agents into a response to the requesting agent: + +```json +// DAB -> agent-A +{ + "type": "findIntentsForContextResponse", + "payload": { + "appIntents": [ + { + "intent": { "name": "StartChat" }, + "apps": [ + //agent-B responses + { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, + { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, + { "appId": "Symphony", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "Symphony", + "desktopAgent": "agent-B" }, + { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, + //agent-C response + { "appId": "WebIce", "desktopAgent": "agent-C"} + ] + }, + { + "intent": { "name": "ViewProfile" }, + "apps": [ + //agent-A responses + { "appId": "myCRM", "title": "My CRM", "desktopAgent": "agent-B" }, + { "appId": "myCRM", + "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", + "title": "My CRM", + "desktopAgent": "agent-B" } + //agent-C responses + { "appId": "riskToolkit", "title": "Client Risk Toolkit", "desktopAgent": "agent-C" }, + { "appId": "linkedIn", "title": "LinkedIn", "desktopAgent": "agent-C" } + ] + } + ] + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [ + { "desktopAgent": "agent-B" }, + { "desktopAgent": "agent-C" } + ] + } +} +``` + +Finally agent-A combines the payload received with it own response and returns it to the requesting application. diff --git a/docs/api-bridging/ref/getAppMetadata.md b/docs/api-bridging/ref/getAppMetadata.md new file mode 100644 index 000000000..c000793bd --- /dev/null +++ b/docs/api-bridging/ref/getAppMetadata.md @@ -0,0 +1,138 @@ +--- +id: getAppMetadata +sidebar_label: getAppMetadata +title: getAppMetadata +--- + +Desktop Agent bridging message exchange for a `getAppMetadata` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: + +* [`getAppMetadata(app: AppIdentifier)`](../api/ref/DesktopAgent#getappmetadata) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request Response (single)** + +E.g. + +```javascript +let appIdentifier = { appId: "myApp@my.appd.com", desktopAgent: "agent-B" } +let appMetadata = await fdc3.getAppMetadata(appIdentifier); +``` + +:::info +`fdc3.getAppMetadata` calls should only involve the Desktop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. +::: + +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: getAppMetadata + DAB ->>+ DB: getAppMetadata + DB ->> DAB: getAppMetadataResponse (B) + DAB -->>- DA: getAppMetadataResponse (B) +``` + +## Request format + +Outward message to the bridge: + +```json +// agent-A -> DAB +{ + "type": "getAppMetadata", + "payload": { + "app": { + { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +which is repeated on to the target agent as: + +```json +// DAB -> agent-B +{ + "type": "getAppMetadata", + "payload": { + "app": { + { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +## Response format + +Response message from a Desktop Agent: + +```json +// agent-B -> DAB +{ + "type": "getAppMetadataResponse", + "payload": { + "appMetadata": { + "appId": "myApp@my.appd.com", + "name": "myApp", + "version": "1.0", + "title": "My example application", + "tooltip": " A tooltip for the application that can be used to render UI elements.", + "description": "A longer, multi-paragraph description for the application that could include mark-up.", + "icons": [..], + "screenshots": [...] + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` + +The bridge receives the response, augments the appMetadata with a `desktopAgent` field, producing the following response which it sends back to agent-A: + +```json +// DAB -> agent-A +{ + "type": "getAppMetadataResponse", + "payload": { + "appMetadata": { + "appId": "myApp@my.appd.com", + "name": "myApp", + "version": "1.0", + "title": "My example application", + "tooltip": " A tooltip for the application that can be used to render UI elements.", + "description": "A longer, multi-paragraph description for the application that could include mark-up.", + "icons": [..], + "screenshots": [...], + "desktopAgent": "agent-B" //added by DAB + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + } +} +``` diff --git a/docs/api-bridging/ref/open.md b/docs/api-bridging/ref/open.md new file mode 100644 index 000000000..2be890918 --- /dev/null +++ b/docs/api-bridging/ref/open.md @@ -0,0 +1,143 @@ +--- +id: open +sidebar_label: open +title: open +--- + +Desktop Agent bridging message exchange for a `open` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: + +* [`open(app: AppIdentifier, context?: Context)`](../../api/ref/DesktopAgent#open) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request Response (single)** + +E.g. + +```javascript +// Open an app without context, using an AppIdentifier object to specify the target and Desktop Agent +let AppIdentifier = {appId: 'myApp-v1.0.1', desktopAgent:"DesktopAgentB"}; +let instanceMetadata = await fdc3.open(AppIdentifier); + +// Open an app with context, using an AppIdentifier object to specify the target and Desktop Agent +let AppIdentifier = {appId: 'myApp-v1.0.1', desktopAgent:"DesktopAgentB"}; +let instanceMetadata = await fdc3.open(AppIdentifier, contextObj); +``` + +Note that it is not currently possible to identify resolve all available applications within a Desktop Agent via the FDC3 API. Hence, `fdc3.open` calls without a specified `desktopAgent` field in their `AppIdentifier`, e.g.: + +```javascript +// Open a target app via AppIdentifier, without a specified Desktop Agent +let AppIdentifier = {appId: 'myApp-v1.0.1'}; +let instanceMetadata = await fdc3.open(AppIdentifier); +``` + +should always be processed locally without be passed to the bridge. + +The `fdc3.open` command should result in a single copy of the specified app being opened and its instance data returned, or an error if it could not be opened. When receiving a response from invoking `fdc3.open` via the Desktop Agent Bridge, the new app instances MUST be initialized before responding as the responding Desktop Agent will need to return an `AppIdentifier` with an `instanceId` field set. + +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: open + DAB ->>+ DB: open + DB -->>- DAB: openResponse + DAB -->>- DA: openResponse +``` + +## Request format + +Outward message to the bridge: + +```json +// agent-A -> DAB +{ + "type": "open", + "payload": { + "app": { + "appId": "myApp", + "desktopAgent":"agent-B" + }, + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" + } + } +} +``` + +which is repeated on to the target agent as: + +```json +// DAB -> agent-B +{ + "type": "open", + "payload": { + "app": { + "appId": "myApp", + "desktopAgent":"DesktopAgentB" + }, + "context": {/*contextObj*/} + }, + "meta": { + "requestGuid": "", + "timestamp": 2020-03-..., + "source": { + "appId": "AChatApp", + "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", + "desktopAgent": "agent-A" //added by DAB + } + } +} +``` + +## Response format + +Response message from target Desktop Agent: + +```json +// agent-B -> DAB +{ + "type": "openResponse", + "payload": { + "appIdentifier": { + "appId": "myApp", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-..." + } +} +``` + +which is augmented and repeated on by the bridge as: + +```json +// agent-B -> DAB +{ + "type": "openResponse", + "payload": { + "appIdentifier": { + "appId": "myApp", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ "desktopAgent": "agent-B" }] // added by DAB + } +} +``` diff --git a/docs/api-bridging/ref/raiseIntent.md b/docs/api-bridging/ref/raiseIntent.md new file mode 100644 index 000000000..ef6b81d6e --- /dev/null +++ b/docs/api-bridging/ref/raiseIntent.md @@ -0,0 +1,267 @@ +--- +id: raiseIntent +sidebar_label: raiseIntent +title: raiseIntent +--- + +Desktop Agent bridging message exchange for a `raiseIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: + +* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintent) +* [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintentforcontext) + +[Message Exchange Type](../spec#individual-message-exchanges): **Request Multiple Response (single)** + +For Desktop Agent Bridging, a `fdc3.raiseIntent` call MUST always pass a `app: AppIdentifier` argument to target the intent. If a target `app` is not passed, then the `findIntent` message exchange should be used to collect options for the local resolver to use (note that Desktop Agents MAY also support the deprecated `raiseIntent` signature that uses the app `name` field by using the `findIntent` message exchange to attempt to resolve the `name` to an `AppIdentifier`). Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. + +e.g. An application with appId `agentA-app1` makes the following API call: + +```javascript +let appIntent = await fdc3.raiseIntent("StartChat", context); +``` + +Agent A should then conduct the `findIntent` message exchange as described above, displaying its Intent resolver UI if necessary. Once an option is selected, the `raiseIntent` message exchange is conducted as if the API call had been made with a target app: + +```javascript +let appIntent = await fdc3.raiseIntent("StartChat", context, {"appId": "Slack", "desktopAgent": "agent-B"}); +``` + +:::info + +The same approach applies to `fdc3.raiseIntentForContext` calls, in that a `findIntentByContext` message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange is then used (if a remote option was selected as the resolution) to raise the intent. + +::: + +## Message exchange + +:::note + +Agent-C is not involved in the diagram below as the `raiseIntent` is always specified with a target application and Desktop Agent. + +::: + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: raiseIntent + DAB ->>+ DB: raiseIntent + DB -->>- DAB: raiseIntentResponse + DAB -->>- DA: raiseIntentResponse + DB ->>+ DAB: raiseIntentResultResponse + DAB ->>+ DA: raiseIntentResultResponse +``` + +## Request format + +Outward message to the DAB: + +```json +// agent-A -> DAB +{ + "type": "raiseIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/}, + "app": { // AppIdentifier for chosen resolution including desktopAgent value + "appId": "Slack", + "desktopAgent": "agent-B" + //Note an instanceId may be included to target an already running instance + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" + }, + "destination": { // duplicates the app argument so that the message is routed like any other + "appId": "Slack", + "desktopAgent": "agent-B" + } + } +} +``` + +The bridge fills in the `source.desktopAgent` field and forwards the request to the target Desktop Agent: + +```json +// DAB -> agent-B +{ + "type": "raiseIntent", + "payload": { + "intent": "StartChat", + "context": {/*contextObj*/}, + "app": { + "appId": "Slack", + "desktopAgent": "agent-B" + //Note an instanceId may be included to target an already running instance + } + }, + "meta": { + "requestGuid": "", + "timestamp": "2020-03-...", + "source": { + "appId": "agentA-app1", + "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", + "desktopAgent": "agent-A" //added by DAB + }, + "destination": { // duplicates the app argument so that the message is routed like any other + "appId": "Slack", + "desktopAgent": "agent-B" + } + } +} +``` + +## Response format + +If the `raiseIntent` request were made locally, agent-B would deliver the intent and context to the target app's `IntentHandler` and respond to the raising application with an `IntentResolution`: + +```javascript +{ + "intent": "StartChat", + "source": { + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + }, + getResult: ƒ +} +``` + +This is encoded and sent to the bridge (omitting the `getResult()` function) as: + +```json +// agent-B -> DAB +{ + "type": "raiseIntentResponse", + "payload": { + "intentResolution": { + "intent": "StartChat", + "source": { + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" + } + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-..." + } +} +``` + +:::note + +When producing a response to a `raiseIntent` request, the instance of the receiving application MUST be initialized and an `instanceId` generated for it before the `IntentResolution` is generated so that it may include the `instanceId`. + +::: + +The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.desktopAgent` and relay the message back to agent-A: + +```json +// DAB -> agent-A +{ + "type": "raiseIntentResponse", + "payload": { + "intentResolution": { + "intent": "StartChat", + "source": { + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", + "desktopAgent": "agent-B" // added by DAB + } + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ "desktopAgent": "agent-B" }] // added by DAB + } +} +``` + +When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application. + +```json +// agent-B -> DAB +{ + "type": "raiseIntentResultResponse", + "payload": { + "intentResult": { + "context": {/*contextObj*/} + /* for a channel IntentResult use: + "channel": { + "id": "app-channel xyz", + "type": "user" + } + */ + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", //a different GUID should be used for the result response + "timestamp": "2020-03-...", + "sources": [{ + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" //instance Id should be included now that its known + }] + } +} +``` + +:::tip + +If intent result is private channel see [PrivateChannels](../spec#privatechannels) for additional message exchanges that may be needed. + +::: + +Finally, the bridge augments the response with `sources[0].desktopAgent` and passes it back to Agent-A. + +```json +// DAB -> agent-A +{ + "type": "raiseIntentResultResponse", + "payload": { + "intentResult": { + "context": {/*contextObj*/} + } + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", + "desktopAgent": "agent-B" // added by DAB + }] + } +} +``` + +If the `IntentHandler` returned `void` rather than an intent result `payload.intentResult` should be empty, e.g.: + +```json +// DAB -> agent-A +{ + "type": "raiseIntentResultResponse", + "payload": { + "intentResult": {} + }, + "meta": { + "requestGuid": "", + "responseGuid": "", + "timestamp": "2020-03-...", + "sources": [{ + "appId": "Slack", + "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", + "desktopAgent": "agent-B" // added by DAB + }] + } +} +``` diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index f0c3a3cb7..8d8d3a5ad 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -8,11 +8,6 @@ The FDC3 Desktop Agent API addresses interoperability between apps running withi In any Desktop Agent bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. -## Recent Changes - -* Completed message exchange documentation for PrivateChannels -* Ensured `BridgingError` is used in relevant cases. - ## TODO list * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. @@ -213,7 +208,7 @@ If requested by the server, the JWT auth token payload should take the form: e.g. -```JSON +```json { "sub": "65141135-7200-47d3-9777-eb8786dd31c7", "iat": "2022-07-06T10:11:43.492Z" @@ -518,7 +513,7 @@ The FDC3 Desktop Agent API specifies a number of error enumerations that define For example, a `raiseIntent` targeted at an app instance that no longer exists might generate the following response from the Desktop Agent: -```JSON +```json // e.g. agent-B -> DAB in response to a raiseIntent call { "type": "raiseIntentResponse", @@ -665,7 +660,7 @@ However, `PrivateChannel` instances allow the registration of additional event h ## Individual message exchanges -The sections below cover most scenarios for each of the Desktop Agent methods in order to explore how this protocol might work. +Individual message exchanges are defined for each of the Desktop Agent methods that require bridging in the reference section of this Part. Each section assumes that we have 3 agents connected by a bridge: @@ -676,1391 +671,31 @@ Each section assumes that we have 3 agents connected by a bridge: Message exchanges come in a number of formats, which are known as: -* **Request only**: A request message that does not require a response ('fire and forget'), such as a `broadcast`. +* **Request only**: A request message that does not require a response ('fire and forget'), such as a [`broadcast`](ref/broadcast). * **Request Response (single)**: A request message that expects a single response from a single Desktop Agent, such as `open` or `getAppMetadata`. * **Request Response (collated)**: A request message that expects responses from all other Desktop Agents that are collated by the bridge and returned as a single response to the requestor, such as `findIntent` or `findInstances`. * **Request Multiple Response (single)**: A request message that expects multiple responses from a single Desktop Agent, such as `raiseIntent`. -### `broadcast` (on `fdc3`, a `Channel` or `PrivateChannel`) - -Type: **Request only** - -Generated by API calls: - -* [`fdc3.broadcast(context: Context)`](../api/ref/DesktopAgent#broadcast) -* [`Channel.broadcast(context: Context)`](../api/ref/Channel#broadcast) - -e.g. - -```javascript -fdc3.broadcast(contextObj); -``` - -or - -```javascript -(await fdc3.getOrCreateChannel("myChannel")).broadcast(contextObj) -``` - -Message exchange: - -```mermaid -sequenceDiagram - participant DA as Desktop Agent A - participant DAB as Desktop Agent Bridge - participant DB as Desktop Agent B - participant DC as Desktop Agent C - DA ->>+ DAB: broadcast - DAB ->>+ DB: broadcast - DAB ->>+ DC: broadcast -``` - -It encodes this as a message which it sends to the DAB - -```JSON -// agent-A -> DAB -{ - "type": "broadcast", - "payload": { - "channel": "myChannel", - "context": { /*contextObj*/ } - }, - "meta": { - "requestGuid": "", - "timestamp": "2022-03-...", - "source": [{ - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" - }] - } -} -``` - -which it repeats on to agent-B AND agent-C with the `source.desktopAgent` metadata added. - -```JSON -// DAB -> agent-B -// DAB -> agent-C -{ - "type": "broadcast", - "payload": { - "channel": "myChannel", - "context": { /*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": [{ - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", - "desktopAgent": "agent-A" //added by DAB - }] - } -} -``` - -### `findIntent` (on `fdc3`) - -Type: **Request Response (collated)** - -Generated by API call: - -* [`findIntent(intent: string, context: Context)`](../api/ref/DesktopAgent#findintent) - -e.g. An application with `appId: "agentA-app1"` and `instanceId: "c6ad5174-6f78-4582-8e96-728d93a4d7d7"` makes the following API call: - -```javascript -let appIntent = await fdc3.findIntent("StartChat", context); -``` - -Message exchange: - -```mermaid -sequenceDiagram - participant DA as Desktop Agent A - participant DAB as Desktop Agent Bridge - participant DB as Desktop Agent B - participant DC as Desktop Agent C - DA ->>+ DAB: findIntent - DAB ->>+ DB: findIntent - DB -->>- DAB: findIntentResponse (B) - DAB ->>+ DC: findIntent - DC -->>- DAB: findIntentResponse (C) - DAB -->>- DA: findIntentResponse (B + C) -``` - -#### Request format - -Outward message to the DAB: - -```JSON -// agent-A -> DAB -{ - "type": "findIntent", - "payload": { - "intent": "StartChat", - "context": {/*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": [{ - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" - }] - } -} -``` - -The DAB fills in the `source.desktopAgent` field and forwards the request to the other Desktop Agents (agent-B AND agent-C): - -```JSON -// DAB -> agent-B -// DAB -> agent-C -{ - "type": "findIntent", - "payload": { - "intent": "StartChat", - "context": {/*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", - "desktopAgent": "agent-A" //added by DAB - } - } -} -``` - -Note that the `source.desktopAgent` field has been populated with the id of the agent that raised the requests, enabling the routing of responses. - -#### Response format - -Normal response from agent-A, where the request was raised. - -```JSON -{ - "intent": { "name": "StartChat" }, - "apps": [ - { "appId": "myChat" } - ] -} -``` - -DA agent-B would produce the following response if the request was generated locally: - -```JSON -{ - "intent": { "name": "StartChat" }, - "apps": [ - { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, - { "appId": "Symphony", "title": "Symphony" }, - { "appId": "Symphony", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "Symphony" }, - { "appId": "Slack", "title": "Slack" } - ] -} -``` - -Hence, the response it sends to the bridge is encoded as follows: - -```JSON -// agent-B -> DAB -{ - "type": "findIntentResponse", - "payload": { - "appIntent": { - "intent": { "name": "StartChat" }, - "apps": [ - { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */ }, - { "appId": "Symphony", "title": "Symphony" }, - { "appId": "Symphony", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "Symphony" }, - { "appId": "Slack", "title": "Slack" } - ] - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - } -} -``` - -Note the response GUID generated by the agent-B and the reference to the request GUID produced by agent-A where the request was originated. Further, note that the `AppMetadata` elements in the `AppIntent` do not have a `desktopAgent` field yet, and the `meta` element does not contain a `sources` element, both of which the bridge will add. - -DA agent-C would produce the following response locally: - -```JSON -{ - "intent": { "name": "StartChat" }, - "apps": [ - { "appId": "WebIce"} - ] -} -``` - -which is sent back over the bridge as a response to the request message as: - -```JSON -// agent-C -> DAB -{ - "type": "findIntentResponse", - "payload": { - "appIntent": { - "intent": { "appId": "StartChat" }, - "apps": [ - { "appId": "WebIce"} - ] - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - } -} -``` - -The bridge receives and collates the responses, producing the following collated response which is sends back to agent-A: - -```JSON -// DAB -> agent-A -{ - "type": "findIntentResponse", - "payload": { - "intent": "StartChat", - "appIntent": { - "intent": { "name": "StartChat" }, - "apps": [ - { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, //desktopAgent added by DAB - { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, - { "appId": "Symphony", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "Symphony", - "desktopAgent": "agent-B" }, - { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, - { "appId": "WebIce", "desktopAgent": "agent-C"} - ] - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - "sources": [ //added by DAB - { "desktopAgent": "agent-A" }, - { "desktopAgent": "agent-B" }, - ] - } -} -``` - -:::note -In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. -::: - -Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: - -```JSON -// agent-A -> requesting App -{ - "intent": { "name": "StartChat", "displayName": "Chat" }, - "apps": [ - // local to this agent - { "appId": "myChat" }, - //agent-B responses - { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, - { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, - { "appId": "Symphony", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "Symphony", - "desktopAgent": "agent-B" }, - { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, - //agent-C responses - { "appId": "WebIce", "desktopAgent": "agent-C"} - ] -} -``` - -### `findIntentsByContext` (on `fdc3`) - -Type: **Request Response (collated)** - -Generated by API call: - -* [`findIntentsByContext(context: Context)`](../api/ref/DesktopAgent#findintentsbycontext) - -e.g. An application with appId `agentA-app1` makes the following API call: - -```javascript -let appIntentArr = await fdc3.findIntentsByContext(context); -``` - -:::note -The message exchanges for this API call are nearly identical to that used for `findIntent()`, differing only by the lack of an `intent` field in the request message payload and the structure of the response message (where an array of `AppIntents` is returned). -::: - -#### Request format - -Outward message to the DAB: - -```JSON -// agent-A -> DAB -{ - "type": "findIntentsForContext", - "payload": { - "context": {/*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" - } - } -} -``` - -The DAB fills in the `source.desktopAgent` field and forwards the request to the other Desktop Agents (agent-B AND agent-C). - -```JSON -// DAB -> agent-B -// DAB -> agent-C -{ - "type": "findIntentsForContext", - "payload": { - "context": {/*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", - "desktopAgent": "agent-A" //added by DAB - } - } -} -``` - -#### Response format - -An individual agent (for example agentB) would generate a local response as an array of `AppIntent` objects: - -```JSON -[ - { - "intent": { "name": "StartChat" }, - "apps": [ - { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, - { "appId": "Symphony", "title": "Symphony" }, - { "appId": "Symphony", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "Symphony" }, - { "appId": "Slack", "title": "Slack" } - ] - }, - { - "intent": { "name": "ViewProfile" }, - "apps": [ - { "appId": "myCRM", "title": "My CRM" }, - { "appId": "myCRM", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "My CRM" } - ] - } -] -``` - -This response is encoded and sent to the bridge as: - -```JSON -// agent-B -> DAB -{ - "type": "findIntentsForContextResponse", - "payload": { - "appIntents": [ - { - "intent": { "name": "StartChat" }, - "apps": [ - { "appId": "Skype", "title": "Skype" /* other AppMetadata fields may be included */}, - { "appId": "Symphony", "title": "Symphony" }, - { "appId": "Symphony", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "Symphony" }, - { "appId": "Slack", "title": "Slack" } - ] - }, - { - "intent": { "name": "ViewProfile" }, - "apps": [ - { "appId": "myCRM", "title": "My CRM" }, - { "appId": "myCRM", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "My CRM" } - ] - } - ] - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - } -} -``` - -Each `AppMetadata` object is augmented by the bridge with a `desktopAgent` field, the responding `DesktopAgentIdentifier` value is added to the `meta.sources` element and the message payload is collated with responses from other agents into a response to the requesting agent: - -```JSON -// DAB -> agent-A -{ - "type": "findIntentsForContextResponse", - "payload": { - "appIntents": [ - { - "intent": { "name": "StartChat" }, - "apps": [ - //agent-B responses - { "appId": "Skype", "title": "Skype", "desktopAgent": "agent-B" }, - { "appId": "Symphony", "title": "Symphony", "desktopAgent": "agent-B" }, - { "appId": "Symphony", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "Symphony", - "desktopAgent": "agent-B" }, - { "appId": "Slack", "title": "Slack", "desktopAgent": "agent-B" }, - //agent-C response - { "appId": "WebIce", "desktopAgent": "agent-C"} - ] - }, - { - "intent": { "name": "ViewProfile" }, - "apps": [ - //agent-A responses - { "appId": "myCRM", "title": "My CRM", "desktopAgent": "agent-B" }, - { "appId": "myCRM", - "instanceId": "93d2fe3e-a66c-41e1-b80b-246b87120859", - "title": "My CRM", - "desktopAgent": "agent-B" } - //agent-C responses - { "appId": "riskToolkit", "title": "Client Risk Toolkit", "desktopAgent": "agent-C" }, - { "appId": "linkedIn", "title": "LinkedIn", "desktopAgent": "agent-C" } - ] - } - ] - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - "sources": [ - { "desktopAgent": "agent-B" }, - { "desktopAgent": "agent-C" } - ] - } -} -``` - -Finally agent-A combines the payload received with it own response and returns it to the requesting application. - -### raiseIntent (on `fdc3`) - -Type: **Request Multiple Response (single)** +The message exchanges defined are: + +* [`broadcast`](ref/broadcast) +* [`findInstances](ref/findInstances) +* [`findIntent`](ref/findIntent) +* [`findIntentsByContext`](ref/findIntentsByContext) +* [`getAppMetadata`](ref/getAppMetadata) +* [`open`](ref/open) +* [`raiseIntent`](ref/raiseIntent) +* [`PrivateChannel.broadcast`](ref/PrivateChannel.broadcast) +* [`PrivateChannel.eventListenerAdded`](ref/PrivateChannel.eventListenerAdded) +* [`PrivateChannel.eventListenerRemoved`](ref/PrivateChannel.eventListenerRemoved) +* [`PrivateChannel.onAddContextListener`](ref/PrivateChannel.onAddContextListener) +* [`PrivateChannel.onUnsubscribe`](ref/PrivateChannel.onUnsubscribe) +* [`PrivateChannel.onDisconnect`](ref/PrivateChannel.onDisconnect) -Generated by API calls: - -* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintent) -* [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintentforcontext) - -For Desktop Agent Bridging, a `fdc3.raiseIntent` call MUST always pass a `app: AppIdentifier` argument to target the intent. If a target `app` is not passed, then the `findIntent` message exchange should be used to collect options for the local resolver to use (note that Desktop Agents MAY also support the deprecated `raiseIntent` signature that uses the app `name` field by using the `findIntent` message exchange to attempt to resolve the `name` to an `AppIdentifier`). Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. - -e.g. An application with appId `agentA-app1` makes the following API call: - -```javascript -let appIntent = await fdc3.raiseIntent("StartChat", context); -``` - -Agent A should then conduct the `findIntent` message exchange as described above, displaying its Intent resolver UI if necessary. Once an option is selected, the `raiseIntent` message exchange is conducted as if the API call had been made with a target app: - -```javascript -let appIntent = await fdc3.raiseIntent("StartChat", context, {"appId": "Slack", "desktopAgent": "agent-B"}); -``` - -A similar approach applies to `fdc3.raiseIntentForContext` calls, in that a `findIntentByContext` message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. - -Message exchange: - -:::note -Agent-C is not involved in the diagram below as the `raiseIntent` is now specified with target application and Desktop Agent. -::: - -```mermaid -sequenceDiagram - participant DA as Desktop Agent A - participant DAB as Desktop Agent Bridge - participant DB as Desktop Agent B - participant DC as Desktop Agent C - DA ->>+ DAB: raiseIntent - DAB ->>+ DB: raiseIntent - DB -->>- DAB: raiseIntentResponse - DAB -->>- DA: raiseIntentResponse - DB ->>+ DAB: raiseIntentResultResponse - DAB ->>+ DA: raiseIntentResultResponse -``` - -#### Request format - -Outward message to the DAB: - -```JSON -// agent-A -> DAB -{ - "type": "raiseIntent", - "payload": { - "intent": "StartChat", - "context": {/*contextObj*/}, - "app": { // AppIdentifier for chosen resolution including desktopAgent value - "appId": "Slack", - "desktopAgent": "agent-B" - //Note an instanceId may be included to target an already running instance - } - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7" - }, - "destination": { // duplicates the app argument so that the message is routed like any other - "appId": "Slack", - "desktopAgent": "agent-B" - } - } -} -``` - -The bridge fills in the `source.desktopAgent` field and forwards the request to the target Desktop Agent: - -```JSON -// DAB -> agent-B -{ - "type": "raiseIntent", - "payload": { - "intent": "StartChat", - "context": {/*contextObj*/}, - "app": { - "appId": "Slack", - "desktopAgent": "agent-B" - //Note an instanceId may be included to target an already running instance - } - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "agentA-app1", - "instanceId": "c6ad5174-6f78-4582-8e96-728d93a4d7d7", - "desktopAgent": "agent-A" //added by DAB - }, - "destination": { // duplicates the app argument so that the message is routed like any other - "appId": "Slack", - "desktopAgent": "agent-B" - } - } -} -``` - -#### Response format - -If the `raiseIntent` request were made locally, agent-B would deliver the intent and context to the target app's `IntentHandler` and respond to the raising application with an `IntentResolution`: - -```javascript -{ - "intent": "StartChat", - "source": { - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" - }, - getResult: ƒ -} -``` +### PrivateChannels -This is encoded and sent to the bridge (omitting the `getResult()` function) as: +`PrivateChannels` are intended to provide a private communication channel for applications. In order to do so, there are differences in how their broadcasts and event messages (used to manage the channel's lifecycle) MUST be handled. -```JSON -// agent-B -> DAB -{ - "type": "raiseIntentResponse", - "payload": { - "intentResolution": { - "intent": "StartChat", - "source": { - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" - } - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-..." - } -} -``` - -:::note -When producing a response to a `raiseIntent` request, the instance of the receiving application MUST be initialized and an `instanceId` generated for it before the `IntentResolution` is generated so that it may include the `instanceId`. -::: - -The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.desktopAgent` and relay the message back to agent-A: - -```JSON -// DAB -> agent-A -{ - "type": "raiseIntentResponse", - "payload": { - "intentResolution": { - "intent": "StartChat", - "source": { - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", - "desktopAgent": "agent-B" // added by DAB - } - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - "sources": [{ "desktopAgent": "agent-B" }] // added by DAB - } -} -``` - -When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application. - -```JSON -// agent-B -> DAB -{ - "type": "raiseIntentResultResponse", - "payload": { - "intentResult": { - "context": {/*contextObj*/} - /* for a channel IntentResult use: - "channel": { - "id": "app-channel xyz", - "type": "user" - } - */ - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", //a different GUID should be used for the result response - "timestamp": "2020-03-...", - "sources": [{ - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" //instance Id should be included now that its known - }] - } -} -``` - -:::note -If intent result is private channel see [PrivateChannels](#privatechannels) for additional message exchanges that may be needed. -::: - -Finally, the bridge augments the response with `sources[0].desktopAgent` and passes it back to Agent-A. - -```JSON -// DAB -> agent-A -{ - "type": "raiseIntentResultResponse", - "payload": { - "intentResult": { - "context": {/*contextObj*/} - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - "sources": [{ - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", - "desktopAgent": "agent-B" // added by DAB - }] - } -} -``` - -If the `IntentHandler` returned `void` rather than an intent result `payload.intentResult` should be empty, e.g.: - -```JSON -// DAB -> agent-A -{ - "type": "raiseIntentResultResponse", - "payload": { - "intentResult": {} - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - "sources": [{ - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", - "desktopAgent": "agent-B" // added by DAB - }] - } -} -``` - -### open (on `fdc3`) - -Type: **Request Response (single)** - -Generated by API call: - -* [`open(app: AppIdentifier, context?: Context)`](../api/ref/DesktopAgent#open) - -e.g. - -```javascript -// Open an app without context, using an AppIdentifier object to specify the target and Desktop Agent -let AppIdentifier = {appId: 'myApp-v1.0.1', desktopAgent:"DesktopAgentB"}; -let instanceMetadata = await fdc3.open(AppIdentifier); - -// Open an app with context, using an AppIdentifier object to specify the target and Desktop Agent -let AppIdentifier = {appId: 'myApp-v1.0.1', desktopAgent:"DesktopAgentB"}; -let instanceMetadata = await fdc3.open(AppIdentifier, contextObj); -``` - -Note that it is not currently possible to identify resolve all available applications within a Desktop Agent via the FDC3 API. Hence, `fdc3.open` calls without a specified `desktopAgent` field in their `AppIdentifier`, e.g.: - -```javascript -// Open a target app via AppIdentifier, without a specified Desktop Agent -let AppIdentifier = {appId: 'myApp-v1.0.1'}; -let instanceMetadata = await fdc3.open(AppIdentifier); -``` - -should always be processed locally without be passed to the bridge. - -The `fdc3.open` command should result in a single copy of the specified app being opened and its instance data returned, or an error if it could not be opened. When receiving a response from invoking `fdc3.open` via the Desktop Agent Bridge, the new app instances MUST be initialized before responding as the responding Desktop Agent will need to return an `AppIdentifier` with an `instanceId` field set. - -Message exchange: - -```mermaid -sequenceDiagram - participant DA as Desktop Agent A - participant DAB as Desktop Agent Bridge - participant DB as Desktop Agent B - participant DC as Desktop Agent C - DA ->>+ DAB: open - DAB ->>+ DB: open - DB -->>- DAB: openResponse - DAB -->>- DA: openResponse -``` - -#### Request format - -Outward message to the bridge: - -```JSON -// agent-A -> DAB -{ - "type": "open", - "payload": { - "app": { - "appId": "myApp", - "desktopAgent":"agent-B" - }, - "context": {/*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" - } - } -} -``` - -which is repeated on to the target agent as: - -```JSON -// DAB -> agent-B -{ - "type": "open", - "payload": { - "app": { - "appId": "myApp", - "desktopAgent":"DesktopAgentB" - }, - "context": {/*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": 2020-03-..., - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - } - } -} -``` - -#### Response format - -Response message from target Desktop Agent: - -```JSON -// agent-B -> DAB -{ - "type": "openResponse", - "payload": { - "appIdentifier": { - "appId": "myApp", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-..." - } -} -``` - -which is augmented and repeated on by the bridge as: - -```JSON -// agent-B -> DAB -{ - "type": "openResponse", - "payload": { - "appIdentifier": { - "appId": "myApp", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - "sources": [{ "desktopAgent": "agent-B" }] // added by DAB - } -} -``` - -### findInstances - -Type: **Request Response (collated)** or **Request Response (single)** - -Generated by API call: - -* [`findInstances(app: AppIdentifier)`](../api/ref/DesktopAgent#findinstances) - -e.g. - -```javascript -// Retrieve a list of all instances of an application -let instances = await fdc3.findInstances({appId: "MyAppId"}); - -// Retrieve a list of instances of an application on a specified Desktop Agent -let instances = await fdc3.findInstances({appId: "MyAppId", desktopAgent: "agent-A"}); -``` - -Message exchange: - -```mermaid -sequenceDiagram - participant DA as Desktop Agent A - participant DAB as Desktop Agent Bridge - participant DB as Desktop Agent B - participant DC as Desktop Agent C - DA ->>+ DAB: findInstances - DAB ->>+ DB: findInstances - DAB ->>+ DC: findInstances - DB ->> DAB: findInstancesResponse (B) - DC ->> DAB: findInstancesResponse (C) - DAB -->>- DA: findInstancesResponse (B + C) -``` - -#### Request format - -Outward message to the bridge: - -```JSON -// agent-A -> DAB -{ - "type": "findInstances", - "payload": { - "app": { - "appId": "myApp" - } - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" - } - } -} -``` - -which is repeated on to the target agent as: - -```JSON -// DAB -> agent-B -{ - "type": "findInstances", - "payload": { - "app": { - "appId": "myApp" - } - }, - "meta": { - "requestGuid": "", - "timestamp": 2020-03-..., - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - } - } -} -``` - -If results should be constrained to a particular Desktop Agent, then set a `desktopAgent` field in `payload.app` and a matching `destination` field in `meta`: - -```JSON -// agent-A -> DAB -{ - "type": "findInstances", - "payload": { - "app": { - "appId": "myApp", - "desktopAgent": "agent-B" // destination agent - } - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "destination": { "desktopAgent": "agent-B"}, //destination agent - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" - } - } -} -``` - -The Desktop Agent Bridge should only forward the request to the requested Desktop Agent and handle the message exchange as a **Request Response (single)**. - -#### Response format - -Response message from a Desktop Agent: - -```JSON -// agent-B -> DAB -{ - "type": "findInstancesResponse", - "payload": { - "appIdentifiers": [ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344"}, - { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d"}, - ] - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - } -} -``` - -The bridge receives and collates the responses, augmenting each appIdentifier with a `desktopAgent` field, producing the following collated response which it sends back to agent-A: - -```JSON -// DAB -> agent-A -{ - "type": "findInstancesResponse", - "payload": { - "appIdentifiers": [ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, - //"desktopAgent" added by DAB - { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, - { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, - ] - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - "sources": [ //added by DAB - { "desktopAgent": "agent-A" }, - { "desktopAgent": "agent-B" }, - ] - } -} -``` - -:::note -In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. -::: - -:::note -If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.responseGuid` and cna quote that given by the responding Desktop Agent. -::: - -Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: - -```JSON -// DAB -> agent-A -[ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, - { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, - { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, - { "appId": "myApp", "instanceId": "688dbd5e-21dc-4469-b8cf-4b6a606f9a27" } //local response -] -``` - -### getAppMetadata - -Type: **Request Response (single)** - -Generated by API call: - -* [`getAppMetadata(app: AppIdentifier)`](../api/ref/DesktopAgent#getappmetadata) - -e.g. - -```javascript -let appIdentifier = { appId: "myApp@my.appd.com", desktopAgent: "agent-B" } -let appMetadata = await fdc3.getAppMetadata(appIdentifier); -``` - -:::note -`fdc3.getAppMetadata` calls should only involve the Desktop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. -::: - -Message exchange: - -```mermaid -sequenceDiagram - participant DA as Desktop Agent A - participant DAB as Desktop Agent Bridge - participant DB as Desktop Agent B - participant DC as Desktop Agent C - DA ->>+ DAB: getAppMetadata - DAB ->>+ DB: getAppMetadata - DB ->> DAB: getAppMetadataResponse (B) - DAB -->>- DA: getAppMetadataResponse (B) -``` - -#### Request format - -Outward message to the bridge: - -```JSON -// agent-A -> DAB -{ - "type": "getAppMetadata", - "payload": { - "app": { - { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } - } - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" - } - } -} -``` - -which is repeated on to the target agent as: - -```JSON -// DAB -> agent-B -{ - "type": "getAppMetadata", - "payload": { - "app": { - { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } - } - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - } - } -} -``` - -#### Response format - -Response message from a Desktop Agent: - -```JSON -// agent-B -> DAB -{ - "type": "getAppMetadataResponse", - "payload": { - "appMetadata": { - "appId": "myApp@my.appd.com", - "name": "myApp", - "version": "1.0", - "title": "My example application", - "tooltip": " A tooltip for the application that can be used to render UI elements.", - "description": "A longer, multi-paragraph description for the application that could include mark-up.", - "icons": [..], - "screenshots": [...] - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - } -} -``` - -The bridge receives the response, augments the appMetadata with a `desktopAgent` field, producing the following response which it sends back to agent-A: - -```JSON -// DAB -> agent-A -{ - "type": "getAppMetadataResponse", - "payload": { - "appMetadata": { - "appId": "myApp@my.appd.com", - "name": "myApp", - "version": "1.0", - "title": "My example application", - "tooltip": " A tooltip for the application that can be used to render UI elements.", - "description": "A longer, multi-paragraph description for the application that could include mark-up.", - "icons": [..], - "screenshots": [...], - "desktopAgent": "agent-B" //added by DAB - } - }, - "meta": { - "requestGuid": "", - "responseGuid": "", - "timestamp": "2020-03-...", - } -} -``` - -### PrivateChannels - -`PrivateChannels` are intended to provide a private communication channel for applications. In order to do so, there are differences in how their broadcasts and event messages (used to manage the channel's lifecycle) MUST be handled. - -Broadcasts and event messages should be addressed to the Desktop Agent that created the channel, which will route it to the relevant application and any other listeners. If any of those listeners are remote, the message should be repeated back to the bridge, once for each listener with the destination set as a full `AppIdentifier`. Both these messages and broadcast messages MUST NOT be repeated back to the application that generated them. The source information on repeated messages should be unmodified to ensure that the message is attributed to the original source. +Broadcasts and event messages should be addressed to the Desktop Agent that created the channel, which will route it to the relevant application and any other listeners. If any of those listeners are remote, the message should be repeated back to the bridge, once for each listener with the destination set as a full `AppIdentifier`. Both these messages and broadcast messages MUST NOT be repeated back to the application that generated them. The source information on repeated messages should be unmodified to ensure that the message is attributed to the original source. To facilitate the addressing of messages to the relevant Desktop Agent and `AppIdentifier` some additional tracking of private channel metadata is necessary in each Desktop Agent (or Desktop Agent Bridge Client implementation). For applications receiving a private channel as an `IntentResult`, the `AppIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id. This data MUST be retained until the receiving application sends a `disconnect` message, after which it can be discarded. For applications that have created and returned a private channel, and have subsequently received event messages subscriptions (`onAddContextListener`, `onSubscribe`, `onDisconnect`) the `appIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id and listener type, which will facilitate repeating of messages to registered listeners. This data MUST be retained until the remote application sends a `disconnect` message or a message indicating that the listener has been removed. - -#### `PrivateChannel.broadcast` - -Type: **Request only** - -Broadcast messages that are sent from Agents that received the private channel from a remote agent are sent to the Desktop Agent that created the channel and returned it as an `IntentResult`, which is responsible for forwarding them onto other subscribers. If a broadcast message is generated on the Agent that created the channel it simply forwards it onto each subscriber. - -Hence, the broadcast message should be repeated once for each subscriber, and modified such that it includes a destination, specified as a full `AppIdentifier`, and the `type` should indicate that it is a `PrivateChannel` broadcast: - -```JSON -// DAB -> agent-B -{ - "type": "PrivateChannel.broadcast", //modified type for PrivateChannel broadcasts - "payload": { - "channel": "private-channel-ABC123", - "context": { /*contextObj*/} - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - }, - "destination": { - "appId": "AnotherApp", - "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", - "desktopAgent": "agent-B" - } - } -} -``` - -#### `PrivateChannel.eventListenerAdded` - -Type: **Request only** - -Private channels support a number of additional event listeners (`onAddContextListener`, `onUnsubscribe`, `onDisconnect`), when an application adds one of these event listeners to a private channel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel to facilitate routing of event messages. A single message type is used for this with a `payload.listenerType` field. - -```JSON -// agent-A -> DAB -{ - "type": "PrivateChannel.eventListenerAdded", - "payload": { - "channel": "private-channel-ABC123", - "listenerType": "onAddContextListener" - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - }, - "destination": { - "appId": "AnotherApp", - "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", - "desktopAgent": "agent-B" - } - } -} -``` - -#### `PrivateChannel.eventListenerRemoved` - -Type: **Request only** - -When an application removed an event listener from a private channel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel so it can discard retained routing information. A single message type is used for this with a `payload.listenerType` field. - -```JSON -// agent-A -> DAB -{ - "type": "PrivateChannel.eventListenerRemoved", - "payload": { - "channel": "private-channel-ABC123", - "listenerType": "onAddContextListener" - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" //added by DAB - }, - "destination": { - "appId": "AnotherApp", - "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", - "desktopAgent": "agent-B" - } - } -} -``` - -#### `PrivateChannel.onAddContextListener` - -Type: **Request only** - -When a `ContextListener` is added to a `PrivateChannel` any applications that have added an `onAddContextListener` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. - -```JSON -// agent-A -> DAB -{ - "type": "PrivateChannel.onAddContextListener", - "payload": { - "channel": "private-channel-ABC123", - "contextType": "fdc3.instrument" - }, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AnotherApp", - "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", - "desktopAgent": "agent-B" //added by DAB - }, - "destination": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" - } - } -} -``` - -#### `PrivateChannel.onUnsubscribe` - -Type: **Request only** - -When a `ContextListener` is removed from a `PrivateChannel` (via `listener.unsubscribe`) any applications that have added an `onSubscribe` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. - -```JSON -// DAB -> agent-B -{ - "type": "PrivateChannel.onUnsubscribe", - "payload": {}, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AnotherApp", - "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", - "desktopAgent": "agent-B" //added by DAB - }, - "destination": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" - } - } -} -``` - -#### `onDisconnect` - -Type: **Request only** - -When the `disconnect` function is is called on a `PrivateChannel` any applications that have added an `onDisconnect` handler or an `onUnsubscribe` handler (which is automatically called when an application disconnects) MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. If the `PrivateChannel` was created by a remote agent, only the single `PrivateChannel.onDisconnect` is required. It is the responsibility of the Desktop Agent that created the channel to ensure that any relevant `onUnsubscribe` handlers are also called by sending additional `PrivateChannel.onUnsubscribe` messages to them before forwarding the `PrivateChannel.onDisconnect`. This applies whether the disconnection occurred on that agent or on a remote agent. - -```JSON -// agent-A -> DAB -{ - "type": "PrivateChannel.onDisconnect", - "payload": {}, - "meta": { - "requestGuid": "", - "timestamp": "2020-03-...", - "source": { - "appId": "AnotherApp", - "instanceId": "02e235ba-acad-4b66-4c3a-547073be23f1", - "desktopAgent": "agent-B" //added by DAB - }, - "destination": { - "appId": "AChatApp", - "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6", - "desktopAgent": "agent-A" - } - } -} -``` diff --git a/docs/api/ref/PrivateChannel.md b/docs/api/ref/PrivateChannel.md index 64c5e1882..7c28d5721 100644 --- a/docs/api/ref/PrivateChannel.md +++ b/docs/api/ref/PrivateChannel.md @@ -102,7 +102,7 @@ try { } catch (resolverError) { console.error(`Error: Intent was not resolved: ${resolverError}`); } - +``` ## Methods diff --git a/website/sidebars.json b/website/sidebars.json index cc3fe6972..fbb7b3abd 100644 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -25,6 +25,26 @@ "api/ref/Errors" ] }, + { + "type": "category", + "label": "API Bridging Part", + "items": [ + "api-bridging/spec", + "api-bridging/ref/broadcast", + "api-bridging/ref/findIntent", + "api-bridging/ref/findIntentsByContext", + "api-bridging/ref/raiseIntent", + "api-bridging/ref/open", + "api-bridging/ref/findInstances", + "api-bridging/ref/getAppMetadata", + "api-bridging/ref/PrivateChannel.broadcast", + "api-bridging/ref/PrivateChannel.eventListenerAdded", + "api-bridging/ref/PrivateChannel.eventListenerRemoved", + "api-bridging/ref/PrivateChannel.onAddContextListener", + "api-bridging/ref/PrivateChannel.onDisconnect", + "api-bridging/ref/PrivateChannel.onUnsubscribe" + ] + }, { "type": "category", "label": "App Directory Part", From c02a9eabefa986b11a222ffa6c85b9f075fcfe02 Mon Sep 17 00:00:00 2001 From: Kris West Date: Thu, 20 Apr 2023 15:41:08 +0100 Subject: [PATCH 011/106] Updated front page icons and added bridging icon --- website/data/features/bridging.mdx | 7 + website/src/components/GridBlock/index.js | 2 +- website/src/css/customTheme.css | 15 +-- website/src/pages/index.js | 2 + website/static/img/feature-api.svg | 30 ++--- website/static/img/feature-appd.svg | 152 +++++++++------------- website/static/img/feature-bridging.svg | 84 ++++++++++++ website/static/img/feature-context.svg | 28 ++-- website/static/img/feature-intents.svg | 38 +++--- 9 files changed, 210 insertions(+), 148 deletions(-) create mode 100644 website/data/features/bridging.mdx create mode 100644 website/static/img/feature-bridging.svg diff --git a/website/data/features/bridging.mdx b/website/data/features/bridging.mdx new file mode 100644 index 000000000..6453a2faf --- /dev/null +++ b/website/data/features/bridging.mdx @@ -0,0 +1,7 @@ + +
+ +
API Bridging
+
+
+(Experimental) Link to or more Desktop Agents together via a bridge to extend interop across them. \ No newline at end of file diff --git a/website/src/components/GridBlock/index.js b/website/src/components/GridBlock/index.js index e6137cec3..c292b8884 100644 --- a/website/src/components/GridBlock/index.js +++ b/website/src/components/GridBlock/index.js @@ -6,7 +6,7 @@ export default ({items}) => {
{ items.map((sl, key) => -
+
{sl}
diff --git a/website/src/css/customTheme.css b/website/src/css/customTheme.css index 5a3867143..3d4452571 100644 --- a/website/src/css/customTheme.css +++ b/website/src/css/customTheme.css @@ -202,7 +202,7 @@ header.postHeader:empty + article h1 { } .blockContent { - margin: 40px 20px; + margin: 40px 10px; } .blockTitle { @@ -465,7 +465,7 @@ article iframe { box-sizing:border-box } -.gridBlock .fourByGridBlock img, .gridBlock .threeByGridBlock img, .gridBlock .twoByGridBlock img { +.gridBlock .fiveByGridBlock img, .fourByGridBlock img, .gridBlock .threeByGridBlock img, .gridBlock .twoByGridBlock img { max-width:100% } @@ -473,13 +473,6 @@ article iframe { clear:both } - -@media only screen and (max-width: 735px) { - .gridBlock .fourByGridBlock { - flex:1 0 26% - } -} - @media only screen and (min-width: 736px) { .gridBlock { display: flex; @@ -511,6 +504,10 @@ article iframe { flex:1 0 20% } + .gridBlock .fiveByGridBlock { + flex:1 0 16% + } + h2 + .gridBlock { padding-top:20px } diff --git a/website/src/pages/index.js b/website/src/pages/index.js index c7efc11bd..1706f85d0 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -9,6 +9,7 @@ const React = require('react'); import Layout from "@theme/Layout"; import HomeSplash from '../components/HomeSplash'; import Api from '../../data/features/api.mdx' +import Bridging from '../../data/features/bridging.mdx' import Intents from '../../data/features/intents.mdx' import Directory from '../../data/features/app-directory.mdx' import ContextData from '../../data/features/context-data.mdx' @@ -44,6 +45,7 @@ export default () => { , + , , , diff --git a/website/static/img/feature-api.svg b/website/static/img/feature-api.svg index 3dba5d54d..319088478 100644 --- a/website/static/img/feature-api.svg +++ b/website/static/img/feature-api.svg @@ -1,22 +1,22 @@ - + + width="800px" height="628px" viewBox="0 0 800 628" style="enable-background:new 0 0 800 628;" xml:space="preserve"> - - - + + + diff --git a/website/static/img/feature-appd.svg b/website/static/img/feature-appd.svg index 63da760cc..e2eda388a 100644 --- a/website/static/img/feature-appd.svg +++ b/website/static/img/feature-appd.svg @@ -1,97 +1,69 @@ - + + width="800px" height="628px" viewBox="0 0 800 628" style="enable-background:new 0 0 800 628;" xml:space="preserve"> + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/website/static/img/feature-bridging.svg b/website/static/img/feature-bridging.svg new file mode 100644 index 000000000..ec1032f26 --- /dev/null +++ b/website/static/img/feature-bridging.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/feature-context.svg b/website/static/img/feature-context.svg index b4ec04644..afdfa39af 100644 --- a/website/static/img/feature-context.svg +++ b/website/static/img/feature-context.svg @@ -1,22 +1,22 @@ - + + width="800px" height="628px" viewBox="0 0 800 628" style="enable-background:new 0 0 800 628;" xml:space="preserve"> - - + - - - - + + + + diff --git a/website/static/img/feature-intents.svg b/website/static/img/feature-intents.svg index f22131e32..a7bebd46a 100644 --- a/website/static/img/feature-intents.svg +++ b/website/static/img/feature-intents.svg @@ -1,27 +1,27 @@ - + + width="800px" height="628px" viewBox="0 0 800 628" style="enable-background:new 0 0 800 628;" xml:space="preserve"> - - - - + + + - + From 19ab450648e8218aaf97ce94ebf751c7a07a97ed Mon Sep 17 00:00:00 2001 From: Kris West Date: Fri, 21 Apr 2023 11:11:33 +0100 Subject: [PATCH 012/106] update cpy-cli version to resolve vulnerable dep --- website/package.json | 2 +- website/yarn.lock | 9801 ------------------------------------------ 2 files changed, 1 insertion(+), 9802 deletions(-) delete mode 100644 website/yarn.lock diff --git a/website/package.json b/website/package.json index 859ea12e9..ddf998fc2 100644 --- a/website/package.json +++ b/website/package.json @@ -25,7 +25,7 @@ "docusaurus": "docusaurus" }, "devDependencies": { - "cpy-cli": "3.1.1", + "cpy-cli": "4.2.0", "del-cli": "4.0.1", "docusaurus-delete-version": "0.1.1", "redoc-cli": "0.13.10", diff --git a/website/yarn.lock b/website/yarn.lock deleted file mode 100644 index 135914435..000000000 --- a/website/yarn.lock +++ /dev/null @@ -1,9801 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@algolia/autocomplete-core@1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz#85ff36b2673654a393c8c505345eaedd6eaa4f70" - integrity sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg== - dependencies: - "@algolia/autocomplete-shared" "1.7.4" - -"@algolia/autocomplete-preset-algolia@1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz#610ee1d887962f230b987cba2fd6556478000bc3" - integrity sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ== - dependencies: - "@algolia/autocomplete-shared" "1.7.4" - -"@algolia/autocomplete-shared@1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz#78aea1140a50c4d193e1f06a13b7f12c5e2cbeea" - integrity sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg== - -"@algolia/cache-browser-local-storage@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.15.0.tgz#84f12aec6b6aa69542a3bfd3a4ba458ed2cc8230" - integrity sha512-uxxFhTWh4JJDb2+FFSmNMfEQ8p9o2vjSpU7iW007QX3OvqljPPN68lk3bpZVaG8pwr5MU1DqpkZ71FcQdVTjgQ== - dependencies: - "@algolia/cache-common" "4.15.0" - -"@algolia/cache-common@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.15.0.tgz#a198098c4b8fa6ef661879ec22d2a2d1ad77d2bb" - integrity sha512-Me3PbI4QurAM+3D+htIE0l1xt6+bl/18SG6Wc7bPQEZAtN7DTGz22HqhKNyLF2lR/cOfpaH7umXZlZEhIHf7gQ== - -"@algolia/cache-in-memory@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.15.0.tgz#77cac4db36a0aa0837f7a7ceb760188191e35268" - integrity sha512-B9mg1wd7CKMfpkbiTQ8KlcKkH6ut/goVaI6XmDCUczOOqeuZlV34tuEi7o3Xo1j66KWr/d9pMjjGYcoVPCVeOA== - dependencies: - "@algolia/cache-common" "4.15.0" - -"@algolia/client-account@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.15.0.tgz#8e0723052169665b4449dc2f8bcf3075feb6a424" - integrity sha512-8wqI33HRZy5ydfFt6F5vMhtkOiAUhVfSCYXx4U3Go5RALqWLgVUp6wzOo0mr1z08POCkHDpbQMQvyayb1CZ/kw== - dependencies: - "@algolia/client-common" "4.15.0" - "@algolia/client-search" "4.15.0" - "@algolia/transporter" "4.15.0" - -"@algolia/client-analytics@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.15.0.tgz#6b8fe450e1bba114b0d0598cbf9acac482798a36" - integrity sha512-jrPjEeNEIIQKeA1XCZXx3f3aybtwF7wjYlnfHbLARuZ9AuHzimOKjX0ZwqvMmvTsHivpcZ2rqY+j1E8HoH1ELA== - dependencies: - "@algolia/client-common" "4.15.0" - "@algolia/client-search" "4.15.0" - "@algolia/requester-common" "4.15.0" - "@algolia/transporter" "4.15.0" - -"@algolia/client-common@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.15.0.tgz#27dd9441aedf481736696d519e55ea8e2f5a4432" - integrity sha512-PlsJMObZuYw4JlG5EhYv1PHDOv7n5mD5PzqFyoNfSOYaEPRZepa3W579ya29yOu3FZ0VGMNJmB7Q5v/+/fwvIw== - dependencies: - "@algolia/requester-common" "4.15.0" - "@algolia/transporter" "4.15.0" - -"@algolia/client-personalization@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.15.0.tgz#6f10eda827d2607ab6c2341464cd35107bf8cf99" - integrity sha512-Bf0bhRAiNL9LWurzyHRH8UBi4fDt3VbCNkInxVngKQT1uCZWXecwoPWGhcSSpdanBqFJA/1WBt+BWx7a50Bhlg== - dependencies: - "@algolia/client-common" "4.15.0" - "@algolia/requester-common" "4.15.0" - "@algolia/transporter" "4.15.0" - -"@algolia/client-search@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.15.0.tgz#2d849faae7943fcc983ac923eac767666a9e6a9a" - integrity sha512-dTwZD4u53WdmexnMcoO2Qd/+YCP3ESXKOtD2MryQ1a9dHwB2Y3Qob0kyS1PG82idwM3enbznvscI9Sf4o9PUWQ== - dependencies: - "@algolia/client-common" "4.15.0" - "@algolia/requester-common" "4.15.0" - "@algolia/transporter" "4.15.0" - -"@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== - -"@algolia/logger-common@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.15.0.tgz#a2cf3d3abbdd00594006164302600ba46d75059f" - integrity sha512-D8OFwn/HpvQz66goIcjxOKsYBMuxiruxJ3cA/bnc0EiDvSA2P2z6bNQWgS5gbstuTZIJmbhr+53NyOxFkmMNAA== - -"@algolia/logger-console@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.15.0.tgz#8a0948b0c16ad546af9dd14b9021f21f42737c97" - integrity sha512-pQOvVaRSEJQJRXKTnxEA6nN1hipSQadJJ4einw0nIlfMOGZh/kps1ybh8vRUlUGyfEuN/3dyFs0W3Ac7hIItlg== - dependencies: - "@algolia/logger-common" "4.15.0" - -"@algolia/requester-browser-xhr@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.15.0.tgz#38b5956d01408ad4291d89915df921ff8534cca6" - integrity sha512-va186EfALF+6msYZXaoBSxcnFCg3SoWJ+uv1yMyhQRJRe7cZSHWSVT3s40vmar90gxlBu80KMVwVlsvJhJv6ew== - dependencies: - "@algolia/requester-common" "4.15.0" - -"@algolia/requester-common@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.15.0.tgz#c68ad3dccc1de71b5be9b08a07e2baf58ec49d82" - integrity sha512-w0UUzxElbo4hrKg4QP/jiXDNbIJuAthxdlkos9nS8KAPK2XI3R9BlUjLz/ZVs4F9TDGI0mhjrNHhZ12KXcoyhg== - -"@algolia/requester-node-http@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.15.0.tgz#02f841586e620c7b4e4e555f315cd52dd815f330" - integrity sha512-eeEOhFtgwKcgAlKAZpgBRZJ0ILSEBCXxZ9uwfVWPD24W1b6z08gVoTJ6J7lCeCnJmudg+tMElDnGzHkjup9CJA== - dependencies: - "@algolia/requester-common" "4.15.0" - -"@algolia/transporter@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.15.0.tgz#c65c512206c66aadc2897337220ae5454001967e" - integrity sha512-JoWR+ixG3EmA0UPntQFN/FV5TasYcYu93d5+oKzHFeZ6Z7rtW5Im9iy/Oh/ggk1AAN5fTdqKewtbBpdaYDbKsQ== - dependencies: - "@algolia/cache-common" "4.15.0" - "@algolia/logger-common" "4.15.0" - "@algolia/requester-common" "4.15.0" - -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" - integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.0" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.0" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== - dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" - integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" - integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== - dependencies: - "@babel/types" "^7.21.0" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.20.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" - -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-for-of@^7.18.8": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== - dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" - -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" - integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" - integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.21.0" - -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-runtime@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz#2a884f29556d0a68cd3d152dcc9e6c71dfb6eee8" - integrity sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typescript@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz#f0956a153679e3b377ae5b7f0143427151e4c848" - integrity sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" - -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz#bcbbca513e8213691fe5d4b23d9251e01f00ebff" - integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-typescript" "^7.21.0" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime-corejs3@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz#6e4939d9d9789ff63e2dc58e88f13a3913a24eba" - integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.8.4": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.12.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.5": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.4.4": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@docsearch/css@3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.3.3.tgz#f9346c9e24602218341f51b8ba91eb9109add434" - integrity sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg== - -"@docsearch/react@^3.1.1": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.3.3.tgz#907b6936a565f880b4c0892624b4f7a9f132d298" - integrity sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q== - dependencies: - "@algolia/autocomplete-core" "1.7.4" - "@algolia/autocomplete-preset-algolia" "1.7.4" - "@docsearch/css" "3.3.3" - algoliasearch "^4.0.0" - -"@docusaurus/core@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.3.1.tgz#32849f2ffd2f086a4e55739af8c4195c5eb386f2" - integrity sha512-0Jd4jtizqnRAr7svWaBbbrCCN8mzBNd2xFLoT/IM7bGfFie5y58oz97KzXliwiLY3zWjqMXjQcuP1a5VgCv2JA== - dependencies: - "@babel/core" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.6" - "@babel/preset-env" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@babel/runtime" "^7.18.6" - "@babel/runtime-corejs3" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" - babel-plugin-dynamic-import-node "^2.3.3" - boxen "^6.2.1" - chalk "^4.1.2" - chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" - combine-promises "^1.1.0" - commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" - del "^6.1.1" - detect-port "^1.3.0" - escape-html "^1.0.3" - eta "^2.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" - leven "^3.1.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" - prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" - react-router-config "^5.1.1" - react-router-dom "^5.3.3" - rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" - url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" - webpackbar "^5.0.2" - -"@docusaurus/cssnano-preset@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.3.1.tgz#e042487655e3e062417855e12edb3f6eee8f5ecb" - integrity sha512-7mIhAROES6CY1GmCjR4CZkUfjTL6B3u6rKHK0ChQl2d1IevYXq/k/vFgvOrJfcKxiObpMnE9+X6R2Wt1KqxC6w== - dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" - -"@docusaurus/logger@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.3.1.tgz#d76aefb452e3734b4e0e645efc6cbfc0aae52869" - integrity sha512-2lAV/olKKVr9qJhfHFCaqBIl8FgYjbUFwgUnX76+cULwQYss+42ZQ3grHGFvI0ocN2X55WcYe64ellQXz7suqg== - dependencies: - chalk "^4.1.2" - tslib "^2.4.0" - -"@docusaurus/mdx-loader@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.3.1.tgz#7ec6acee5eff0a280e1b399ea4dd690b15a793f7" - integrity sha512-Gzga7OsxQRpt3392K9lv/bW4jGppdLFJh3luKRknCKSAaZrmVkOQv2gvCn8LAOSZ3uRg5No7AgYs/vpL8K94lA== - dependencies: - "@babel/parser" "^7.18.8" - "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@mdx-js/mdx" "^1.6.22" - escape-html "^1.0.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" - stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@docusaurus/module-type-aliases@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.3.1.tgz#986186200818fed999be2e18d6c698eaf4683a33" - integrity sha512-6KkxfAVOJqIUynTRb/tphYCl+co3cP0PlHiMDbi+SzmYxMdgIrwYqH9yAnGSDoN6Jk2ZE/JY/Azs/8LPgKP48A== - dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.3.1" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - -"@docusaurus/plugin-content-blog@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.3.1.tgz#236b8ee4f20f7047aa9c285ae77ae36683ad48a3" - integrity sha512-f5LjqX+9WkiLyGiQ41x/KGSJ/9bOjSD8lsVhPvYeUYHCtYpuiDKfhZE07O4EqpHkBx4NQdtQDbp+aptgHSTuiw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - cheerio "^1.0.0-rc.12" - feed "^4.2.2" - fs-extra "^10.1.0" - lodash "^4.17.21" - reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-docs@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.3.1.tgz#feae1555479558a55182f22f8a07acc5e0d7444d" - integrity sha512-DxztTOBEruv7qFxqUtbsqXeNcHqcVEIEe+NQoI1oi2DBmKBhW/o0MIal8lt+9gvmpx3oYtlwmLOOGepxZgJGkw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/module-type-aliases" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - "@types/react-router-config" "^5.0.6" - combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-pages@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.3.1.tgz#f534a37862be5b3f2ba5b150458d7527646b6f39" - integrity sha512-E80UL6hvKm5VVw8Ka8YaVDtO6kWWDVUK4fffGvkpQ/AJQDOg99LwOXKujPoICC22nUFTsZ2Hp70XvpezCsFQaA== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" - -"@docusaurus/plugin-debug@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.3.1.tgz#26fef904713e148f6dee44957506280f8b7853bb" - integrity sha512-Ujpml1Ppg4geB/2hyu2diWnO49az9U2bxM9Shen7b6qVcyFisNJTkVG2ocvLC7wM1efTJcUhBO6zAku2vKJGMw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - fs-extra "^10.1.0" - react-json-view "^1.21.3" - tslib "^2.4.0" - -"@docusaurus/plugin-google-analytics@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.3.1.tgz#e2e7db4cf6a7063e8ba5e128d4e413f4d6a0c862" - integrity sha512-OHip0GQxKOFU8n7gkt3TM4HOYTXPCFDjqKbMClDD3KaDnyTuMp/Zvd9HSr770lLEscgPWIvzhJByRAClqsUWiQ== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - tslib "^2.4.0" - -"@docusaurus/plugin-google-gtag@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.3.1.tgz#b8da54a60c0a50aca609c3643faef78cb4f247a0" - integrity sha512-uXtDhfu4+Hm+oqWUySr3DNI5cWC/rmP6XJyAk83Heor3dFjZqDwCbkX8yWPywkRiWev3Dk/rVF8lEn0vIGVocA== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - tslib "^2.4.0" - -"@docusaurus/plugin-google-tag-manager@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.3.1.tgz#f19bc01cc784fa4734187c5bc637f0574857e15d" - integrity sha512-Ww2BPEYSqg8q8tJdLYPFFM3FMDBCVhEM4UUqKzJaiRMx3NEoly3qqDRAoRDGdIhlC//Rf0iJV9cWAoq2m6k3sw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - tslib "^2.4.0" - -"@docusaurus/plugin-sitemap@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.3.1.tgz#f526ab517ca63b7a3460d585876f5952cb908aa0" - integrity sha512-8Yxile/v6QGYV9vgFiYL+8d2N4z4Er3pSHsrD08c5XI8bUXxTppMwjarDUTH/TRTfgAWotRbhJ6WZLyajLpozA== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - fs-extra "^10.1.0" - sitemap "^7.1.1" - tslib "^2.4.0" - -"@docusaurus/preset-classic@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.3.1.tgz#f0193f06093eb55cafef66bd1ad9e0d33198bf95" - integrity sha512-OQ5W0AHyfdUk0IldwJ3BlnZ1EqoJuu2L2BMhqLbqwNWdkmzmSUvlFLH1Pe7CZSQgB2YUUC/DnmjbPKk/qQD0lQ== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/plugin-content-blog" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/plugin-content-pages" "2.3.1" - "@docusaurus/plugin-debug" "2.3.1" - "@docusaurus/plugin-google-analytics" "2.3.1" - "@docusaurus/plugin-google-gtag" "2.3.1" - "@docusaurus/plugin-google-tag-manager" "2.3.1" - "@docusaurus/plugin-sitemap" "2.3.1" - "@docusaurus/theme-classic" "2.3.1" - "@docusaurus/theme-common" "2.3.1" - "@docusaurus/theme-search-algolia" "2.3.1" - "@docusaurus/types" "2.3.1" - -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -"@docusaurus/theme-classic@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.3.1.tgz#8e6e194236e702c0d4e8d7b7cbb6886ae456e598" - integrity sha512-SelSIDvyttb7ZYHj8vEUhqykhAqfOPKk+uP0z85jH72IMC58e7O8DIlcAeBv+CWsLbNIl9/Hcg71X0jazuxJug== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/module-type-aliases" "2.3.1" - "@docusaurus/plugin-content-blog" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/plugin-content-pages" "2.3.1" - "@docusaurus/theme-common" "2.3.1" - "@docusaurus/theme-translations" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - "@mdx-js/react" "^1.6.22" - clsx "^1.2.1" - copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.42" - lodash "^4.17.21" - nprogress "^0.2.0" - postcss "^8.4.14" - prism-react-renderer "^1.3.5" - prismjs "^1.28.0" - react-router-dom "^5.3.3" - rtlcss "^3.5.0" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-common@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.3.1.tgz#82f52d80226efef8c4418c4eacfc5051aa215f7f" - integrity sha512-RYmYl2OR2biO+yhmW1aS5FyEvnrItPINa+0U2dMxcHpah8reSCjQ9eJGRmAgkZFchV1+aIQzXOI1K7LCW38O0g== - dependencies: - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/module-type-aliases" "2.3.1" - "@docusaurus/plugin-content-blog" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/plugin-content-pages" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - clsx "^1.2.1" - parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" - use-sync-external-store "^1.2.0" - utility-types "^3.10.0" - -"@docusaurus/theme-search-algolia@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.3.1.tgz#d587b40913119e9287d14670e277b933d8f453f0" - integrity sha512-JdHaRqRuH1X++g5fEMLnq7OtULSGQdrs9AbhcWRQ428ZB8/HOiaN6mj3hzHvcD3DFgu7koIVtWPQnvnN7iwzHA== - dependencies: - "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/theme-common" "2.3.1" - "@docusaurus/theme-translations" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - algoliasearch "^4.13.1" - algoliasearch-helper "^3.10.0" - clsx "^1.2.1" - eta "^2.0.0" - fs-extra "^10.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-translations@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.3.1.tgz#b2b1ecc00a737881b5bfabc19f90b20f0fe02bb3" - integrity sha512-BsBZzAewJabVhoGG1Ij2u4pMS3MPW6gZ6sS4pc+Y7czevRpzxoFNJXRtQDVGe7mOpv/MmRmqg4owDK+lcOTCVQ== - dependencies: - fs-extra "^10.1.0" - tslib "^2.4.0" - -"@docusaurus/types@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.3.1.tgz#785ade2e0f4e35e1eb7fb0d04c27d11c3991a2e8" - integrity sha512-PREbIRhTaNNY042qmfSE372Jb7djZt+oVTZkoqHJ8eff8vOIc2zqqDqBVc5BhOfpZGPTrE078yy/torUEZy08A== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - commander "^5.1.0" - joi "^17.6.0" - react-helmet-async "^1.3.0" - utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" - -"@docusaurus/utils-common@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.3.1.tgz#1abe66846eb641547e4964d44f3011938e58e50b" - integrity sha512-pVlRpXkdNcxmKNxAaB1ya2hfCEvVsLDp2joeM6K6uv55Oc5nVIqgyYSgSNKZyMdw66NnvMfsu0RBylcwZQKo9A== - dependencies: - tslib "^2.4.0" - -"@docusaurus/utils-validation@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.3.1.tgz#b65c718ba9b84b7a891bccf5ac6d19b57ee7d887" - integrity sha512-7n0208IG3k1HVTByMHlZoIDjjOFC8sbViHVXJx0r3Q+3Ezrx+VQ1RZ/zjNn6lT+QBCRCXlnlaoJ8ug4HIVgQ3w== - dependencies: - "@docusaurus/logger" "2.3.1" - "@docusaurus/utils" "2.3.1" - joi "^17.6.0" - js-yaml "^4.1.0" - tslib "^2.4.0" - -"@docusaurus/utils@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.3.1.tgz#24b9cae3a23b1e6dc88f95c45722c7e82727b032" - integrity sha512-9WcQROCV0MmrpOQDXDGhtGMd52DHpSFbKLfkyaYumzbTstrbA5pPOtiGtxK1nqUHkiIv8UwexS54p0Vod2I1lg== - dependencies: - "@docusaurus/logger" "2.3.1" - "@svgr/webpack" "^6.2.1" - escape-string-regexp "^4.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" - globby "^11.1.0" - gray-matter "^4.0.3" - js-yaml "^4.1.0" - lodash "^4.17.21" - micromatch "^4.0.5" - resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.4.0" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@emotion/is-prop-valid@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== - dependencies: - "@emotion/memoize" "^0.8.0" - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@exodus/schemasafe@^1.0.0-rc.2": - version "1.0.0-rc.11" - resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.0.0-rc.11.tgz#348a7bd2432edc9470afd47b0cda865308c40779" - integrity sha512-jlDglM3cbjrpq+D4oDBP/tztQDJn2hNqOak/wIOIVxbv8+d9Yn8or4Misr0zx9UEsvVFYNCQsE97zVvIU0/Idw== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== - dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - -"@redocly/ajv@^8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.0.tgz#2fad322888dc0113af026e08fceb3e71aae495ae" - integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -"@redocly/openapi-core@^1.0.0-beta.88": - version "1.0.0-beta.123" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.0.0-beta.123.tgz#0c29ae9fabe5f143f571caf608a7d025f41125db" - integrity sha512-W6MbUWpb/VaV+Kf0c3jmMIJw3WwwF7iK5nAfcOS+ZwrlbxtIl37+1hEydFlJ209vCR9HL12PaMwdh2Vpihj6Jw== - dependencies: - "@redocly/ajv" "^8.11.0" - "@types/node" "^14.11.8" - colorette "^1.2.0" - js-levenshtein "^1.1.6" - js-yaml "^4.1.0" - lodash.isequal "^4.5.0" - minimatch "^5.0.1" - node-fetch "^2.6.1" - pluralize "^8.0.0" - yaml-ast-parser "0.0.43" - -"@redocly/react-dropdown-aria@^2.0.11": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@redocly/react-dropdown-aria/-/react-dropdown-aria-2.0.12.tgz#2e3af2b1b8e9123487109400d6117f0d4a8445a6" - integrity sha512-feQEZlyBvQsbT/fvpJ4jJ5OLGaUPpnskHYDsY8DGpPymN+HUeDQrqkBEbbKRwMKidFTI2cxk2kJNNTnvdS9jyw== - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== - dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" - -"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== - -"@svgr/babel-plugin-remove-jsx-attribute@*": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e" - integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8" - integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== - -"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== - -"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== - -"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== - -"@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== - -"@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute" "*" - "@svgr/babel-plugin-remove-jsx-empty-expression" "*" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" - "@svgr/babel-plugin-transform-svg-component" "^6.5.1" - -"@svgr/core@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - camelcase "^6.2.0" - cosmiconfig "^7.0.1" - -"@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== - dependencies: - "@babel/types" "^7.20.0" - entities "^4.4.0" - -"@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/hast-util-to-babel-ast" "^6.5.1" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== - dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" - -"@svgr/webpack@^6.2.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== - dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-constant-elements" "^7.18.12" - "@babel/preset-env" "^7.19.4" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@svgr/core" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - "@svgr/plugin-svgo" "^6.5.1" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.21.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" - integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-proxy@^1.17.8": - version "1.17.10" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" - integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/minimist@^1.2.0", "@types/minimist@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/node@*": - version "18.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.6.tgz#ae1973dd2b1eeb1825695bb11ebfb746d27e3e93" - integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA== - -"@types/node@^14.11.8": - version "14.18.37" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.37.tgz#0bfcd173e8e1e328337473a8317e37b3b14fd30d" - integrity sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg== - -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-router-config@*", "@types/react-router-config@^5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" - integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router-dom@*": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*": - version "5.1.20" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" - integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - -"@types/react@*": - version "18.0.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" - integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/sax@^1.2.1": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" - integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.22" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" - integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -address@^1.0.1, address@^1.1.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -algoliasearch-helper@^3.10.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz#0fe39d49b0290e4aa5e1fe733bd24d857d258e94" - integrity sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ== - dependencies: - "@algolia/events" "^4.0.1" - -algoliasearch@^4.0.0, algoliasearch@^4.13.1: - version "4.15.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.15.0.tgz#8279576f06667a1d0705e8c22a17daa8e707b469" - integrity sha512-+vgKQF5944dYsz9zhKk07JbOYeNdKisoD5GeG0woBL3nLzbn2a+nGwki60DXg7CXvaFXBcTXyJG4C+VaBVd44g== - dependencies: - "@algolia/cache-browser-local-storage" "4.15.0" - "@algolia/cache-common" "4.15.0" - "@algolia/cache-in-memory" "4.15.0" - "@algolia/client-account" "4.15.0" - "@algolia/client-analytics" "4.15.0" - "@algolia/client-common" "4.15.0" - "@algolia/client-personalization" "4.15.0" - "@algolia/client-search" "4.15.0" - "@algolia/logger-common" "4.15.0" - "@algolia/logger-console" "4.15.0" - "@algolia/requester-browser-xhr" "4.15.0" - "@algolia/requester-common" "4.15.0" - "@algolia/requester-node-http" "4.15.0" - "@algolia/transporter" "4.15.0" - -ansi-align@^3.0.0, ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.7: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== - dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== - dependencies: - follow-redirects "^1.14.7" - -babel-loader@^8.2.5: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" - integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.0.tgz#424170268d68af26ff83a5c640b95def01803a13" - integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -boxen@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" - integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== - dependencies: - ansi-align "^3.0.1" - camelcase "^6.2.0" - chalk "^4.1.2" - cli-boxes "^3.0.0" - string-width "^5.0.1" - type-fest "^2.5.0" - widest-line "^4.0.1" - wrap-ansi "^8.0.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" - integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase-keys@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252" - integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg== - dependencies: - camelcase "^6.3.0" - map-obj "^4.1.0" - quick-lru "^5.1.1" - type-fest "^1.2.1" - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0, camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: - version "1.0.30001464" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz#888922718df48ce5e33dcfe1a2af7d42676c5eb7" - integrity sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.12: - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -clean-css@^5.2.2, clean-css@^5.3.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-table3@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -colorette@^2.0.10: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -combine-promises@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" - integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@^2.19.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -copy-text-to-clipboard@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" - integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - -core-js-compat@^3.25.1: - version "3.29.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" - integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== - dependencies: - browserslist "^4.21.5" - -core-js-pure@^3.25.1: - version "3.29.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.29.0.tgz#0e1ac889214398641ea4bb1c6cf25ff0959ec1d2" - integrity sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ== - -core-js@^3.23.3: - version "3.29.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.29.0.tgz#0273e142b67761058bcde5615c503c7406b572d6" - integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cp-file@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" - integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== - dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" - -cpy-cli@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-3.1.1.tgz#2adb06544102c948ce098e522d5b8ddcf4f7c0b4" - integrity sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg== - dependencies: - cpy "^8.0.0" - meow "^6.1.1" - -cpy@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" - integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== - dependencies: - arrify "^2.0.1" - cp-file "^7.0.0" - globby "^9.2.0" - has-glob "^1.0.0" - junk "^3.1.0" - nested-error-stacks "^2.1.0" - p-all "^2.1.0" - p-filter "^2.1.0" - p-map "^3.0.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-declaration-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" - integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== - -css-loader@^6.7.1: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.19" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== - dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-to-react-native@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1, css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-advanced@^5.3.8: - version "5.3.10" - resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" - integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== - dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.14" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.1.12, cssnano@^5.1.8: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9" - integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== - -decko@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" - integrity sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ== - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" - integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del-cli@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-4.0.1.tgz#2303ccaa45708ee8c6211568344cf87336abf30a" - integrity sha512-KtR/6cBfZkGDAP2NA7z+bP4p1OMob3wjN9mq13+SWvExx6jT9gFWfLgXEeX8J2B47OKeNCq9yTONmtryQ+m+6g== - dependencies: - del "^6.0.0" - meow "^10.1.0" - -del@^6.0.0, del@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detab@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -docusaurus-delete-version@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/docusaurus-delete-version/-/docusaurus-delete-version-0.1.1.tgz#34cdc9416e7e506dbdd36f7e0e47b57ccc1c8d46" - integrity sha512-miqFatGyNWfEP5dn4oHN7O6Xa0R2Ij5lbz3/nBkDorG+oHU6Ezx/WXujbEHmGgEeKnpvkloQWwAvAef3POKVUQ== - dependencies: - chalk "^2.4.2" - commander "^2.20.0" - fs-extra "^8.0.1" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -dompurify@^2.2.8: - version "2.4.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87" - integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.284: - version "1.4.325" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.325.tgz#7b97238a61192d85d055d97f3149832b3617d37b" - integrity sha512-K1C03NT4I7BuzsRdCU5RWkgZxtswnKDYM6/eMhkEXqKu4e5T+ck610x3FPzu1y7HVFSiQKZqP16gnJzPpji1TQ== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -es6-promise@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eta@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/eta/-/eta-2.0.1.tgz#199e675359cb6e19d38f29e1f405e1ba0e79a6df" - integrity sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eval@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" - integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== - dependencies: - "@types/node" "*" - require-like ">= 0.1.1" - -eventemitter3@^4.0.0, eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.0.0, events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -feed@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" - integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== - dependencies: - xml-js "^1.6.11" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flux@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" - integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@^1.0.0, follow-redirects@^1.14.7: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -foreach@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" - integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -github-slugger@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" - integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.1: - version "13.1.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" - integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g== - dependencies: - is-glob "^3.0.0" - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -highlight.js@^10.4.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-comment-regex@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" - integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http2-client@^1.2.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" - integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.3: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -image-size@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== - dependencies: - queue "6.0.2" - -immer@^8.0.1, immer@^9.0.7: - version "8.0.4" - resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a" - integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ== - -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -infima@0.2.0-alpha.42: - version "0.2.0-alpha.42" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.42.tgz#f6e86a655ad40877c6b4d11b2ede681eb5470aa5" - integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^3.0.0, is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-svg@4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-4.2.2.tgz#a4ea0f3f78dada7085db88f1e85b6f845626cfae" - integrity sha512-JlA7Mc7mfWjdxxTkJ094oUK9amGD7gQaj5xA/NCY0vlVvZ1stmj4VX+bRuwOMN93IHRZ2ctpPH/0FO6DqvQ5Rw== - dependencies: - html-comment-regex "^1.1.2" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.1.2: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -joi@^17.6.0: - version "17.8.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.8.3.tgz#d772fe27a87a5cda21aace5cf11eee8671ca7e6f" - integrity sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-pointer@0.6.2, json-pointer@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" - integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== - dependencies: - foreach "^2.0.4" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-5.0.0.tgz#e6b718f73da420d612823996fdf14a03f6ff6922" - integrity sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w== - dependencies: - universalify "^0.1.2" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.11, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0, map-obj@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -mark.js@^8.11.1: - version "8.11.1" - resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" - integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -marked@^4.0.10: - version "4.2.12" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" - integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== - dependencies: - unist-util-remove "^2.0.0" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.4.13" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" - integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== - dependencies: - fs-monkey "^1.0.3" - -meow@^10.1.0: - version "10.1.5" - resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.5.tgz#be52a1d87b5f5698602b0f32875ee5940904aa7f" - integrity sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw== - dependencies: - "@types/minimist" "^1.2.2" - camelcase-keys "^7.0.0" - decamelize "^5.0.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.2" - read-pkg-up "^8.0.0" - redent "^4.0.0" - trim-newlines "^4.0.2" - type-fest "^1.2.2" - yargs-parser "^20.2.9" - -meow@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" - integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -meow@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" - integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -min-indent@^1.0.0, min-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-css-extract-plugin@^2.6.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.3.tgz#794aa4d598bf178a66b2a35fe287c3df3eac394e" - integrity sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w== - dependencies: - schema-utils "^4.0.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0, minimist-options@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mobx-react-lite@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz#3a4c22c30bfaa8b1b2aa48d12b2ba811c0947ab7" - integrity sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg== - -mobx-react@^7.2.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.6.0.tgz#ebf0456728a9bd2e5c24fdcf9b36e285a222a7d6" - integrity sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA== - dependencies: - mobx-react-lite "^3.4.0" - -mobx@^6.3.2: - version "6.8.0" - resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.8.0.tgz#59051755fdb5c8a9f3f2e0a9b6abaf86bab7f843" - integrity sha512-+o/DrHa4zykFMSKfS8Z+CPSEg5LW9tSNGTuN8o6MF1GKxlfkSHSeJn5UtgxvPkGgaouplnrLXCF+duAsmm6FHQ== - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0, neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" - integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch-h2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" - integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== - dependencies: - http2-client "^1.2.5" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.1: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-readfiles@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" - integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== - dependencies: - es6-promise "^3.2.1" - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -oas-kit-common@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" - integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== - dependencies: - fast-safe-stringify "^2.0.7" - -oas-linter@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" - integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== - dependencies: - "@exodus/schemasafe" "^1.0.0-rc.2" - should "^13.2.1" - yaml "^1.10.0" - -oas-resolver@^2.5.6: - version "2.5.6" - resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" - integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== - dependencies: - node-fetch-h2 "^2.3.0" - oas-kit-common "^1.0.8" - reftools "^1.1.9" - yaml "^1.10.0" - yargs "^17.0.1" - -oas-schema-walker@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" - integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== - -oas-validator@^5.0.8: - version "5.0.8" - resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" - integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== - dependencies: - call-me-maybe "^1.0.1" - oas-kit-common "^1.0.8" - oas-linter "^3.2.2" - oas-resolver "^2.5.6" - oas-schema-walker "^1.1.5" - reftools "^1.1.9" - should "^13.2.1" - yaml "^1.10.0" - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -openapi-sampler@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.3.1.tgz#eebb2a1048f830cc277398bc8022b415f887e859" - integrity sha512-Ert9mvc2tLPmmInwSyGZS+v4Ogu9/YoZuq9oP3EdUklg2cad6+IGndP9yqJJwbgdXwZibiq5fpv6vYujchdJFg== - dependencies: - "@types/json-schema" "^7.0.7" - json-pointer "0.6.2" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -p-all@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" - integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== - dependencies: - p-map "^2.0.0" - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-event@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-timeout@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-numeric-range@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" - integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -perfect-scrollbar@^1.5.1: - version "1.5.5" - resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz#41a211a2fb52a7191eff301432134ea47052b27f" - integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -polished@^4.1.3: - version "4.2.2" - resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" - integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== - dependencies: - "@babel/runtime" "^7.17.8" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-loader@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.0.2.tgz#b53ff44a26fba3688eee92a048c7f2d4802e23bb" - integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.8" - -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-sort-media-queries@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz#f48a77d6ce379e86676fc3f140cf1b10a06f6051" - integrity sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg== - dependencies: - sort-css-media-queries "2.1.0" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== - -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-time@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" - integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== - -prism-react-renderer@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== - -prismjs@^1.27.0, prismjs@^1.28.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^1.2.4, punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@1.2.8, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^17.0.1, react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-fast-compare@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" - integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== - -react-helmet-async@*, react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== - dependencies: - "@babel/runtime" "^7.10.3" - -react-router-config@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" - integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== - dependencies: - "@babel/runtime" "^7.1.2" - -react-router-dom@^5.3.3: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.3.3: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-tabs@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.3.tgz#ccbb3e1241ad3f601047305c75db661239977f2f" - integrity sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg== - dependencies: - clsx "^1.1.0" - prop-types "^15.5.0" - -react-textarea-autosize@^8.3.2: - version "8.4.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz#4d0244d6a50caa897806b8c44abc0540a69bfc8c" - integrity sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ== - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^17.0.1, react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg-up@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" - integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== - dependencies: - find-up "^5.0.0" - read-pkg "^6.0.0" - type-fest "^1.0.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -read-pkg@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" - integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^3.0.2" - parse-json "^5.2.0" - type-fest "^1.0.1" - -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" - integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -redent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" - integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== - dependencies: - indent-string "^5.0.0" - strip-indent "^4.0.0" - -redoc-cli@0.13.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/redoc-cli/-/redoc-cli-0.13.10.tgz#188a9b0f3b43a80bc0ad62ee0b12bb6352179aa0" - integrity sha512-txYchKO6rpXJapD6Kg/Vd6mEg3ZJDz+TLCev8dvj8cGQxiSZDJ/V/x3uRfg03EH5FrC71kHC4ETI97MUlye9NQ== - dependencies: - chokidar "^3.5.1" - handlebars "^4.7.7" - isarray "^2.0.5" - mkdirp "^1.0.4" - mobx "^6.3.2" - node-libs-browser "^2.2.1" - react "^17.0.1" - react-dom "^17.0.1" - redoc "2.0.0-rc.66" - styled-components "^5.3.0" - yargs "^17.3.1" - -redoc@2.0.0-rc.66: - version "2.0.0-rc.66" - resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.0.0-rc.66.tgz#f38495c408ab1b9d1f9bd5db2cdae09a21047018" - integrity sha512-ZjmZhYkg46QAkza4SYCouY3TEuqnkjf50uyJBiz6Dyaz55RLClofAKokPoy5uEBo0RkPjxebKf9HTGyrxNqJ8A== - dependencies: - "@redocly/openapi-core" "^1.0.0-beta.88" - "@redocly/react-dropdown-aria" "^2.0.11" - classnames "^2.3.1" - decko "^1.2.0" - dompurify "^2.2.8" - eventemitter3 "^4.0.7" - json-pointer "^0.6.2" - lunr "^2.3.9" - mark.js "^8.11.1" - marked "^4.0.10" - mobx-react "^7.2.0" - openapi-sampler "^1.2.1" - path-browserify "^1.0.1" - perfect-scrollbar "^1.5.1" - polished "^4.1.3" - prismjs "^1.27.0" - prop-types "^15.7.2" - react-tabs "^3.2.2" - slugify "~1.4.7" - stickyfill "^1.1.1" - style-loader "^3.3.1" - swagger2openapi "^7.0.6" - url-template "^2.0.8" - -reftools@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" - integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" - integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== - dependencies: - rc "1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remark-emoji@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== - dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== - dependencies: - mdast-squeeze-paragraphs "^4.0.0" - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.5.4, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -replace-in-files-cli@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-in-files-cli/-/replace-in-files-cli-1.0.0.tgz#5251f1f320c6e0622bcbb6802d7d39bed7e60362" - integrity sha512-/HMPLZeCA24CBUQ59ymHji6LyMKM+gEgDZlYsiPvXW6+3PdfOw6SsMCVd9KC2B+KlAEe/8vkJA6gfnexVdF15A== - dependencies: - arrify "^2.0.1" - escape-string-regexp "^4.0.0" - globby "^11.0.1" - meow "^7.1.1" - normalize-path "^3.0.0" - write-file-atomic "^3.0.0" - -replace-json-property@1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/replace-json-property/-/replace-json-property-1.6.3.tgz#8bac0d4ea1695ef8571e76b87c5609a2c32d8b35" - integrity sha512-i4p43kXJaZyP6UUzsNKahpwo0eQRqxcpOm1GMaTAyJUyfh44T7xRO1IUt/p45PYmnl7CjD36ME6OY45vGaQHAw== - dependencies: - chalk "^4.1.0" - commander "^2.19.0" - jsonfile "^5.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -"require-like@>= 0.1.1": - version "0.1.2" - resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" - integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@3.0.2, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rtl-detect@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" - integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== - -rtlcss@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" - integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== - dependencies: - find-up "^5.0.0" - picocolors "^1.0.0" - postcss "^8.3.11" - strip-json-comments "^3.1.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.4: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-handler@^6.1.3: - version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.1.2" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -should-equal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" - integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== - dependencies: - should-type "^1.4.0" - -should-format@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" - integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== - dependencies: - should-type "^1.3.0" - should-type-adaptors "^1.0.1" - -should-type-adaptors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" - integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== - dependencies: - should-type "^1.3.0" - should-util "^1.0.0" - -should-type@^1.3.0, should-type@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" - integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== - -should-util@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" - integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== - -should@^13.2.1: - version "13.2.3" - resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" - integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== - dependencies: - should-equal "^2.0.0" - should-format "^3.0.3" - should-type "^1.4.0" - should-type-adaptors "^1.0.1" - should-util "^1.0.0" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -sitemap@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" - integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== - dependencies: - "@types/node" "^17.0.5" - "@types/sax" "^1.2.1" - arg "^5.0.0" - sax "^1.2.4" - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slugify@~1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.7.tgz#e42359d505afd84a44513280868e31202a79a628" - integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -sort-css-media-queries@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" - integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -std-env@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.2.tgz#af27343b001616015534292178327b202b9ee955" - integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== - -stickyfill@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02" - integrity sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA== - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" - integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== - dependencies: - min-indent "^1.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-loader@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -styled-components@^5.3.0: - version "5.3.8" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.8.tgz#b92e2d10352dc9ecf3b1bc5d27c7500832dcf870" - integrity sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -swagger2openapi@^7.0.6: - version "7.0.8" - resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" - integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== - dependencies: - call-me-maybe "^1.0.1" - node-fetch "^2.6.1" - node-fetch-h2 "^2.3.0" - node-readfiles "^0.2.0" - oas-kit-common "^1.0.8" - oas-resolver "^2.5.6" - oas-schema-walker "^1.1.5" - oas-validator "^5.0.8" - reftools "^1.1.9" - yaml "^1.10.0" - yargs "^17.0.1" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: - version "5.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.5" - -terser@^5.10.0, terser@^5.16.5: - version "5.16.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.6.tgz#f6c7a14a378ee0630fbe3ac8d1f41b4681109533" - integrity sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -trim-newlines@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.0.2.tgz#d6aaaf6a0df1b4b536d183879a6b939489808c7c" - integrity sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^2.5.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -ua-parser-js@^0.7.30: - version "0.7.34" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.34.tgz#afb439e2e3e394bdc90080acb661a39c685b67d7" - integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -unified@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== - dependencies: - unist-util-is "^4.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^0.1.0, universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -use-sync-external-store@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== - dependencies: - axios "^0.25.0" - joi "^17.6.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-bundle-analyzer@^4.5.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz#951b8aaf491f665d2ae325d8b84da229157b1d04" - integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.9.3: - version "4.11.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.4.2" - -webpack-merge@^5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.2, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.73.0: - version "5.76.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" - integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== - dependencies: - chalk "^4.1.0" - consola "^2.15.3" - pretty-time "^1.1.0" - std-env "^3.0.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.4.2: - version "8.12.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" - integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml-ast-parser@0.0.43: - version "0.0.43" - resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" - integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^18.1.3: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.0.1, yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From 2bcea49951f287ca8a159b8f78e5d1f0db023bd0 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 14:03:47 +0100 Subject: [PATCH 013/106] Adjust markdown linting rules and apply fixes to API docs where needed --- docs/.markdownlint.jsonc | 11 +++++ docs/api/ref/Channel.md | 20 ++++----- docs/api/ref/DesktopAgent.md | 79 +++++++++++++++++----------------- docs/api/ref/Errors.md | 8 ++-- docs/api/ref/Globals.md | 9 ++-- docs/api/ref/Metadata.md | 28 ++++++------ docs/api/ref/PrivateChannel.md | 10 ++--- docs/api/ref/Types.md | 12 +++--- docs/api/spec.md | 50 +++++++++++---------- 9 files changed, 120 insertions(+), 107 deletions(-) create mode 100644 docs/.markdownlint.jsonc diff --git a/docs/.markdownlint.jsonc b/docs/.markdownlint.jsonc new file mode 100644 index 000000000..a97dd0d88 --- /dev/null +++ b/docs/.markdownlint.jsonc @@ -0,0 +1,11 @@ +{ + //Disabled as we often use manual H1 heading for reference pages, + // where the markdown metadata is picked up as the top level heading + "single-h1": false, + //Many lines in md files are longer than 80 chars + "line-length": false, + //We have repeated headings, like 'Properties' or 'Fields' in reference docs. + "no-duplicate-header": { + "siblings_only": true + } +} \ No newline at end of file diff --git a/docs/api/ref/Channel.md b/docs/api/ref/Channel.md index ec16de63e..800f4a150 100644 --- a/docs/api/ref/Channel.md +++ b/docs/api/ref/Channel.md @@ -32,7 +32,7 @@ interface Channel { } ``` -#### See also +**See also:** * [`Context`](Types#context) * [`Listener`](Types#listener) @@ -66,7 +66,7 @@ public readonly displayMetadata?: DisplayMetadata; DisplayMetadata can be used to provide display hints for User Channels intended to be visualized and selectable by end users. -#### See also +**See also:** * [`DisplayMetadata`](Metadata#displaymetadata) @@ -84,7 +84,7 @@ If, when this function is called, the channel already contains context that woul Optional metadata about each context message received, including the app that originated the message, SHOULD be provided by the desktop agent implementation. -#### Examples +**Examples:** Add a listener for any context that is broadcast on the channel: @@ -117,7 +117,7 @@ contactListener.unsubscribe(); instrumentListener.unsubscribe(); ``` -#### See also +**See also:** * [`Listener`](Types#listener) * [`ContextHandler`](Types#contexthandler) @@ -138,7 +138,7 @@ Channel implementations should ensure that context messages broadcast by an appl If you are working with complex context types composed of other simpler types (as recommended by the [FDC3 Context Data specification](../../context/spec#assumptions)) then you should broadcast each individual type (starting with the simpler types, followed by the complex type) that you want other apps to be able to respond to. Doing so allows applications to filter the context types they receive by adding listeners for specific context types. -#### Example +**Example:** ```javascript const instrument = { @@ -155,7 +155,7 @@ try { } ``` -#### See also +**See also:** * [`ChannelError`](Errors#channelerror) * [`getCurrentContext`](#getcurrentcontext) @@ -175,7 +175,7 @@ It is up to the specific Desktop Agent implementation whether and how recent con If getting the current context fails, the promise will be rejected with an `Error` with a `message` string from the [`ChannelError`](Errors#channelerror) enumeration. -#### Examples +**Examples:** Without specifying a context type: @@ -197,7 +197,7 @@ try { } ``` -#### See also +**See also:** * [`ChannelError`](Errors#channelerror) * [`broadcast`](#broadcast) @@ -216,6 +216,6 @@ public addContextListener(handler: ContextHandler): Promise; Adds a listener for incoming contexts whenever a broadcast happens on the channel. -#### See also +**See also:** -* [`addContextListener`](#addcontextlistener) \ No newline at end of file +* [`addContextListener`](#addcontextlistener) diff --git a/docs/api/ref/DesktopAgent.md b/docs/api/ref/DesktopAgent.md index d00c90a04..247eee4bc 100644 --- a/docs/api/ref/DesktopAgent.md +++ b/docs/api/ref/DesktopAgent.md @@ -67,7 +67,7 @@ Context broadcasts are only received from apps that are joined to the same User Optional metadata about each context message received, including the app that originated the message, SHOULD be provided by the desktop agent implementation. -#### Examples +**Examples:** ```js // any context @@ -83,7 +83,7 @@ const contactListener = await fdc3.addContextListener('fdc3.contact', (contact, }); ``` -#### See also +**See also:** * [`Listener`](Types#listener) * [`Context`](Types#context) @@ -97,7 +97,8 @@ addIntentListener(intent: string, handler: IntentHandler): Promise; Adds a listener for incoming intents from the Desktop Agent. The handler function may return void or a promise that resolves to a [`IntentResult`](Types#intentresult), which is either a [`Context`](Types#context) object, representing any data that should be returned to the app that raised the intent, or a [`Channel`](Channel) or [`PrivateChannel`](PrivateChannel) over which data responses will be sent. The `IntentResult` will be returned to the app that raised the intent via the [`IntentResolution`](Metadata#intentresolution) and retrieved from it using the `getResult()` function. -The Desktop Agent MUST reject the promise returned by the `getResult()` function of `IntentResolution` if any of the following is true: +The Desktop Agent MUST reject the promise returned by the `getResult()` function of `IntentResolution` if any of the following is true: + 1. The intent handling function's returned promise rejects. 2. The intent handling function doesn't return a promise. 3. The returned promise resolves to an invalid type. @@ -106,7 +107,7 @@ The [`PrivateChannel`](PrivateChannel) type is provided to support synchronisati Optional metadata about each intent & context message received, including the app that originated the message, SHOULD be provided by the desktop agent implementation. -#### Examples +**Examples:** ```js //Handle a raised intent @@ -151,7 +152,7 @@ fdc3.addIntentListener("QuoteStream", async (context) => { }); ``` -#### See also +**See also:** * [Register an Intent Handler](../spec#register-an-intent-handler) * [`PrivateChannel`](PrivateChannel) @@ -171,7 +172,7 @@ DesktopAgent implementations should ensure that context messages broadcast to a If you are working with complex context types composed of other simpler types (as recommended by the [Context Data specification](../../context/spec#assumptions)) then you should broadcast each individual type (starting with the simpler types, followed by the complex type) that you want other apps to be able to respond to. Doing so allows applications to filter the context types they receive by adding listeners for specific context types. -#### Example +**Example:** ```js const instrument = { @@ -184,7 +185,7 @@ const instrument = { fdc3.broadcast(instrument); ``` -#### See also +**See also:** * [addContextListener](#addcontextlistener) @@ -206,7 +207,7 @@ It is intended that Desktop Agent implementations: * MUST prevent `PrivateChannels` from being retrieved via fdc3.getOrCreateChannel. * MUST provide the `id` value for the channel as required by the `Channel` interface. -#### Example +**Example:** ```js fdc3.addIntentListener("QuoteStream", async (context) => { @@ -235,7 +236,7 @@ fdc3.addIntentListener("QuoteStream", async (context) => { }); ``` -#### See also +**See also:** * [`PrivateChannel`](PrivateChannel) * [`raiseIntent`](#raiseintent) @@ -253,7 +254,7 @@ If there are no instances of the specified application the returned promise shou If the request fails for another reason, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration. -#### Example +**Example:** ```js // Retrieve a list of instances of an application @@ -278,7 +279,7 @@ If the resolution fails, the promise MUST be rejected with an `Error` Object wit Result types may be a type name, the string `"channel"` (which indicates that the app will return a channel) or a string indicating a channel that returns a specific type, e.g. `"channel"`. If intent resolution to an app returning a channel is requested, the desktop agent MUST include both apps that are registered as returning a channel and those registered as returning a channel with a specific type in the response. -#### Examples +**Examples:** I know 'StartChat' exists as a concept, and want to know which apps can resolve it: @@ -337,7 +338,7 @@ const appIntent = await fdc3.findIntent("QuoteStream", instrument, "channel"`. If intent resolution to an app returning a channel is requested without a specified context type, the desktop agent MUST include both apps that are registered as returning a channel and those registered as returning a channel with a specific type in the response. -#### Example +**Example:** I have a context object, and I want to know what I can do with it, hence, I look for intents and apps to resolve them... @@ -405,7 +406,7 @@ const selectedApp = startChat.apps[2]; await fdc3.raiseIntent(startChat.intent.name, context, selectedApp); ``` -#### See also +**See also:** * [`findIntent()`](#findintent) * [`ResolveError`](Errors#resolveerror) @@ -418,14 +419,14 @@ getAppMetadata(app: AppIdentifier): Promise; Retrieves the [`AppMetadata`](Metadata#appmetadata) for an [`AppIdentifier`](Types#appidentifier), which provides additional metadata (such as icons, a title and description) from the App Directory record for the application, that may be used for display purposes. -#### Examples +**Examples:** ```js let appIdentifier = { appId: "MyAppId@my.appd.com" } let appMetadata = await fdc3.getAppMetadata(appIdentifier); ``` -#### See also +**See also:** * [`AppMetadata`](Metadata#appmetadata) * [`AppIdentifier`](Types#appidentifier) @@ -440,14 +441,14 @@ OPTIONAL function that returns the `Channel` object for the current User channel Returns `null` if the app is not joined to a channel. -#### Examples +**Examples:** ```js // get the current channel membership let current = await fdc3.getCurrentChannel(); ``` -#### See also +**See also:** * [`Channel`](Channel) @@ -461,7 +462,7 @@ Retrieves information about the FDC3 Desktop Agent implementation, including the Returns an [`ImplementationMetadata`](Metadata#implementationmetadata) object. This metadata object can be used to vary the behavior of an application based on the version supported by the Desktop Agent and for logging purposes. -#### Example +**Example:** ```js import {compareVersionNumbers, versionIsAtLeast} from '@finos/fdc3'; @@ -480,7 +481,7 @@ let implementationMetadata = await fdc3.getInfo(); let {appId, instanceId} = implementationMetadata.appMetadata; ``` -#### See also +**See also:** * [`ImplementationMetadata`](Metadata#implementationmetadata) * [`AppMetadata`](Metadata#appmetadata) @@ -495,7 +496,7 @@ Returns a `Channel` object for the specified channel, creating it (as an _App_ c If the Channel cannot be created or access was denied, the returned promise MUST be rejected with an `Error` Object with a `message` chosen from the `ChannelError` enumeration. -#### Example +**Example:** ```js try { @@ -507,7 +508,7 @@ catch (err){ } ``` -#### See also +**See also:** * [`Channel`](Channel) @@ -519,14 +520,14 @@ getUserChannels() : Promise>; Retrieves a list of the User Channels available for the app to join. -#### Example +**Example:** ```js const userChannels = await fdc3.getUserChannels(); const redChannel = userChannels.find(c => c.id === 'red'); ``` -#### See also +**See also:** * [`Channel`](Channel) @@ -546,7 +547,7 @@ An app can only be joined to one channel at a time. If an error occurs (such as the channel is unavailable or the join request is denied) the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`ChannelError`](Errors#channelerror) enumeration. -#### Examples +**Examples:** ```js // get all user channels @@ -559,7 +560,7 @@ fdc3.joinUserChannel(selectedChannel.id); ``` -#### See also +**See also:** * [`getUserChannels`](#getuserchannels) @@ -573,7 +574,7 @@ OPTIONAL function that removes the app from any User channel membership. In mos Context broadcast and listening through the top-level `fdc3.broadcast` and `fdc3.addContextListener` will be a no-op when the app is not joined to a User channel. -#### Examples +**Examples:** ```js //desktop-agent scope context listener @@ -605,7 +606,7 @@ Returns an [`AppIdentifier`](Types#appidentifier) object with the `instanceId` f If an error occurs while opening the app, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`OpenError`](Errors#openerror) enumeration. -#### Example +**Example:** ```js // Open an app without context, using an AppIdentifier object to specify the target @@ -616,7 +617,7 @@ let instanceIdentifier = await fdc3.open(appIdentifier); let instanceIdentifier = await fdc3.open(appIdentifier, context); ``` -#### See also +**See also:** * [`Context`](Types#context) * [`AppIdentifier`](Types#appidentifier) @@ -642,7 +643,7 @@ Returns an [`IntentResolution`](Metadata#intentresolution) object with details o Issuing apps may optionally wait on the promise that is returned by the `getResult()` member of the IntentResolution. This promise will resolve when the _receiving app's_ intent handler function returns and resolves a promise. The Desktop Agent resolves the issuing app's promise with the Context object or Channel that is provided as resolution by the receiving app. The Desktop Agent MUST reject the issuing app's promise, with a string from the [`ResultError`](Errors#resulterror) enumeration, if: (1) the intent handling function's returned promise rejects, (2) the intent handling function doesn't return a promise, or (3) the returned promise resolves to an invalid type. -#### Example +**Example:** ```js // raise an intent for resolution by the desktop agent @@ -675,7 +676,7 @@ try { } ``` -#### See also +**See also:** * [Raising Intents](../spec#raising-intents) * [`Context`](Types#context) @@ -702,7 +703,7 @@ Returns an `IntentResolution` object, see [`raiseIntent()`](#raiseintent) for de If a target intent and app cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. -#### Example +**Example:** ```js // Display a resolver UI for the user to select an intent and application to resolve it @@ -712,7 +713,7 @@ const intentResolution = await fdc3.raiseIntentForContext(context); await fdc3.raiseIntentForContext(context, targetAppIdentifier); ``` -#### See also +**See also:** * [Raising Intents](../spec#raising-intents) * [`raiseIntent()`](#raiseintent) @@ -731,7 +732,7 @@ addContextListener(handler: ContextHandler): Promise; Adds a listener for incoming context broadcasts from the Desktop Agent. Provided for backwards compatibility with versions FDC3 standard <2.0. -#### See also +**See also:** * [`addContextListener`](#addcontextlistener) @@ -742,7 +743,7 @@ getSystemChannels() : Promise>; ``` Alias to the [`getUserChannels`](#getuserchannels) function provided for backwards compatibility with version 1.1 & 1.2 of the FDC3 standard. -#### See also +**See also:** * [`getUserChannels`](#getuserchannels) @@ -754,7 +755,7 @@ joinChannel(channelId: string) : Promise; Alias to the [`joinUserChannel`](#joinuserchannel) function provided for backwards compatibility with version 1.1 & 1.2 of the FDC3 standard. -#### See also +**See also:** * [`joinUserChannel`](#joinuserchannel) @@ -766,7 +767,7 @@ open(name: string, context?: Context): Promise; Version of `open` that launches an app by name rather than `AppIdentifier`. Provided for backwards compatibility with versions of the FDC3 Standard <2.0. -#### See also +**See also:** * [`open`](#open) @@ -778,7 +779,7 @@ raiseIntent(intent: string, context: Context, name: string): Promise Version of `raiseIntentForContext` that targets an app by name rather than `AppIdentifier`. Provided for backwards compatibility with versions of the FDC3 Standard <2.0. -#### See also +**See also:** * [`raiseIntentForContext`](#raiseintentforcontext) diff --git a/docs/api/ref/Errors.md b/docs/api/ref/Errors.md index 22408d35d..0f394535d 100644 --- a/docs/api/ref/Errors.md +++ b/docs/api/ref/Errors.md @@ -28,7 +28,7 @@ enum ChannelError { Contains constants representing the errors that can be encountered when calling channels using the [`joinUserChannel`](DesktopAgent#joinuserchannel) or [`getOrCreateChannel`](DesktopAgent#getorcreatechannel) methods, or the [`getCurrentContext`](Channel#getcurrentcontext), [`broadcast`](Channel#broadcast) or [`addContextListener`](Channel#addcontextlistener) methods on the `Channel` object. -#### See also +**See also:** * [`DesktopAgent.createPrivateChannel`](DesktopAgent#createprivatechannel) * [`DesktopAgent.joinUserChannel`](DesktopAgent#joinuserchannel) @@ -61,7 +61,7 @@ enum OpenError { Contains constants representing the errors that can be encountered when calling the [`open`](DesktopAgent#open) method on the [DesktopAgent](DesktopAgent) object. -#### See also +**See also:** * [`DesktopAgent.open`](DesktopAgent#open) @@ -110,7 +110,7 @@ export enum ResolveError { Contains constants representing the errors that can be encountered when calling the [`findIntent`](DesktopAgent#findintent), [`findIntentsByContext`](DesktopAgent#findintentsbycontext), [`raiseIntent`](DesktopAgent#raiseintent) or [`raiseIntentForContext`](DesktopAgent#raiseintentforcontext) methods on the [DesktopAgent](DesktopAgent). -#### See also +**See also:** * [`DesktopAgent.findIntent`](DesktopAgent#findintent) * [`DesktopAgent.findIntentsByContext`](DesktopAgent#findintentsbycontext) @@ -135,7 +135,7 @@ enum ResultError { Contains constants representing the errors that can be encountered when calling the [`getResult`](DesktopAgent#findintent) method on the [IntentResolution](Metadata#intentresolution) Object. -#### See also +**See also:** * [`DesktopAgent.addIntentListener`](DesktopAgent#addintentlistener) * [`DesktopAgent.raiseIntent`](DesktopAgent#raiseintent) diff --git a/docs/api/ref/Globals.md b/docs/api/ref/Globals.md index ec9e4c605..4e419c9af 100644 --- a/docs/api/ref/Globals.md +++ b/docs/api/ref/Globals.md @@ -8,7 +8,7 @@ Since FDC3 is typically available to the whole web application, desktop agents a The global `fdc3` object can be used to access FDC3 API operations, if the current desktop agent supports FDC3. -### Example +**Example:** ```ts // check if fdc3 is available @@ -25,7 +25,7 @@ if (window.fdc3) { The global `window.fdc3` should only be available after the API is ready to use. To prevent the API from being used before it is ready, implementors should provide an `fdc3Ready` event. -### Example +**Example:** ```ts function fdc3Action() { @@ -45,7 +45,7 @@ If you are using the `@finos/fdc3` NPM package, it includes a handy wrapper func It returns a promise that will resolve immediately if the `window.fdc3` global is already defined, or reject with an error if the `fdc3Ready` event doesn't fire after a specified timeout period (default: 5 seconds). -### Example +**Example:** ```ts import { fdc3Ready, broadcast } from '@finos/fdc3' @@ -62,6 +62,3 @@ async function fdc3Action() { } } ``` - - - diff --git a/docs/api/ref/Metadata.md b/docs/api/ref/Metadata.md index cb11fda52..48d778d97 100644 --- a/docs/api/ref/Metadata.md +++ b/docs/api/ref/Metadata.md @@ -21,7 +21,7 @@ interface AppIntent { An interface that represents the binding of an intent to apps, returned as part of intent disocvery. For each intent, it reference the applications that support that intent. -#### See also +**See also:** * [`AppMetadata`](#appmetadata) * [`IntentMetadata`](#intentmetadata) @@ -87,7 +87,7 @@ The additional information from an app directory can aid in rendering UI element Note that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc.. -#### See also +**See also:** * [`AppIdentifier`](Types#AppIdentifier) * [`AppIntent.apps`](#appintent) @@ -112,7 +112,7 @@ Metadata relating to a context or intent & context received through the `addCont [`@experimental`](../../fdc3-compliance#experimental-features) Introduced in FDC3 2.0 and may be refined by further changes outside the normal FDC3 versioning policy. -#### See also +**See also:** * [`AppMetadata`](#appmetadata) * [`ContextHandler`](Types#contexthandler) @@ -143,7 +143,7 @@ interface DisplayMetadata { A desktop agent (typically for _system_ channels) may want to provide additional information about how a channel can be represented in a UI. A common use case is for color linking. -#### See also +**See also:** * [`Channel`](Channel) * [`DesktopAgent.getUserChannels`](DesktopAgent#getuserchannels) @@ -162,7 +162,7 @@ Metadata relating to a single icon image at a remote URL, used to represent an a AppMetadata includes an icons property allowing multiple icon types to be specified. Various properties may be used by the Desktop Agent to decide which icon is the most suitable to be used considering the application chooser UI, device DPI and formats supported by the system. -#### Example +**Example:** ```js "icons": [ @@ -179,7 +179,7 @@ AppMetadata includes an icons property allowing multiple icon types to be specif ] ``` -#### Properties +### Properties #### `src` @@ -193,7 +193,7 @@ The dimensions of the Icon formatted as `x`. The media type of the icon. If not provided the Desktop Agent may refer to the src file extension. -#### See also +**See also:** * [`AppMetadata`](Metadata#appmetadata) @@ -212,7 +212,7 @@ Metadata relating to a single image at a remote URL, used to represent screensho AppMetadata includes a screenshots property allowing multiple images to be specified. Various properties may be used by the Desktop Agent to decide which image(s) are the most suitable to be used considering the application chooser UI, device DPI and formats supported by the system. -#### Example +**Example:** ```js "screenshots": [ @@ -231,7 +231,7 @@ AppMetadata includes a screenshots property allowing multiple images to be speci ] ``` -#### Properties +### Properties #### `src` @@ -245,7 +245,7 @@ The dimensions of the image formatted as `x`. The media type of the image. If not provided the Desktop Agent may refer to the src file extension. -#### See also +**See also:** * [`AppMetadata`](Metadata#appmetadata) @@ -290,7 +290,7 @@ interface ImplementationMetadata { Metadata relating to the FDC3 [DesktopAgent](DesktopAgent) object and its provider, including the supported version of the FDC3 specification, the name of the provider of the implementation, its own version number and the metadata of the calling application according to the desktop agent. -#### See also +**See also:** * [`AppMetadata`](#appmetadata) * [`DesktopAgent.getInfo`](DesktopAgent#getinfo) @@ -311,7 +311,7 @@ interface IntentMetadata { The interface used to describe an intent within the platform. -#### See also +**See also:** * [`AppIntent.intent`](#appintent) @@ -355,7 +355,7 @@ interface IntentResolution { IntentResolution provides a standard format for data returned upon resolving an intent. -#### Examples +**Examples:** ```js // Resolve a "Chain" type intent @@ -387,7 +387,7 @@ try { } ``` -#### See also +**See also:** * [`IntentResult`](Types#intentresult) * [`DesktopAgent.raiseIntent`](DesktopAgent#raiseintent) diff --git a/docs/api/ref/PrivateChannel.md b/docs/api/ref/PrivateChannel.md index 4adad2e17..507e2004c 100644 --- a/docs/api/ref/PrivateChannel.md +++ b/docs/api/ref/PrivateChannel.md @@ -24,7 +24,7 @@ interface PrivateChannel extends Channel { } ``` -#### See also +**See also:** - [`Channel`](Channel) - [`Listener`](Types#listener) @@ -116,7 +116,7 @@ Adds a listener that will be called each time that the remote app invokes addCon Desktop Agents MUST call this for each invocation of addContextListener on this channel, including those that occurred before this handler was registered (to prevent race conditions). -#### See also +**See also:** - [`Channel.addContextListener`](Channel#addcontextlistener) @@ -130,7 +130,7 @@ Adds a listener that will be called whenever the remote app invokes `Listener.un Desktop Agents MUST call this when disconnect() is called by the other party, for each listener that they had added. -#### See also +**See also:** - [`Listener`](Types#listener) @@ -142,7 +142,7 @@ onDisconnect(handler: () => void): Listener; Adds a listener that will be called when the remote app terminates, for example when its window is closed or because disconnect was called. This is in addition to calls that will be made to onUnsubscribe listeners. -#### See also +**See also:** - [`disconnect`](#disconnect) @@ -156,7 +156,7 @@ May be called to indicate that a participant will no longer interact with this c After this function has been called, Desktop Agents SHOULD prevent apps from broadcasting on this channel and MUST automatically call Listener.unsubscribe() for each listener that they've added (causing any `onUnsubscribe` handler added by the other party to be called) before triggering any onDisconnect handler added by the other party. -#### See also +**See also:** - [`onUnsubscribe`](#onunsubscribe) - [`Listener`](Types#listener) diff --git a/docs/api/ref/Types.md b/docs/api/ref/Types.md index 9d4c5868f..a35901140 100644 --- a/docs/api/ref/Types.md +++ b/docs/api/ref/Types.md @@ -24,7 +24,7 @@ interface AppIdentifier { } ``` -#### See also +**See also:** * [`AppMetadata`](Metadata#appmetadata) * [`DesktopAgent.open`](DesktopAgent#open) @@ -46,7 +46,7 @@ The base interface that all contexts should extend: a context data object adheri This means that it must at least have a `type` property that indicates what type of data it represents, e.g. `'fdc3.contact'`. The `type` property of context objects is important for certain FDC3 operations, like [`Channel.getCurrentContext`](Channel#getCurrentContext) and [`DesktopAgent.addContextListener`](DesktopAgent#addContextListener), which allows you to filter contexts by their type. -#### See also +**See also:** * [`ContextHandler`](#contexthandler) * [`DesktopAgent.open`](DesktopAgent#open) @@ -73,7 +73,7 @@ Used when attaching listeners for context broadcasts. Optional metadata about the context message, including the app that originated the message, SHOULD be provided by the desktop agent implementation. -#### See also +**See also:** * [`Context`](#context) * [`ContextMetadata`](Metadata#contextmetadata) @@ -92,7 +92,7 @@ Used when attaching listeners for raised intents. Optional metadata about the intent & context message, including the app that originated the message, SHOULD be provided by the desktop agent implementation. -#### See also +**See also:** * [`Context`](#context) * [`ContextMetadata`](Metadata#contextmetadata) @@ -110,7 +110,7 @@ Describes results that an Intent handler may optionally return that should be co Represented as a union type in TypeScript, however, this type may be rendered as an interface in other languages that both the `Context` and `Channel` types implement, allowing either to be returned by an `IntentHandler`. -#### See also +**See also:** * [`Context`](#context) * [`Channel`](Channel) @@ -137,7 +137,7 @@ unsubscribe(): void; Allows an application to unsubscribe from listening to intents or context broadcasts. -#### See also +**See also:** * [`DesktopAgent.addIntentListener`](DesktopAgent#addintentlistener) * [`DesktopAgent.addContextListener`](DesktopAgent#addcontextlistener) diff --git a/docs/api/spec.md b/docs/api/spec.md index 94d8190c3..f37baab1f 100644 --- a/docs/api/spec.md +++ b/docs/api/spec.md @@ -40,7 +40,7 @@ Examples of endpoints include: ## Desktop Agent Implementation -The FDC3 API specification consists of interfaces. It is expected that each Desktop Agent will implement these interfaces. A typical implemention would provide implementations for the following interfaces: +The FDC3 API specification consists of interfaces. It is expected that each Desktop Agent will implement these interfaces, and those referenced by them: - [`DesktopAgent`](ref/DesktopAgent) - [`Channel`](ref/Channel) @@ -102,7 +102,7 @@ An FDC3 Standard compliant Desktop Agent implementation **MUST**: - Intent resolution MUST take into account any specified input or return context types - Requests for resolution to apps returning a channel MUST include any apps that are registered as returning a channel with a specific type. - Return (JavaScript or platform appropriate) Error Objects with messages from the [`ChannelError`](ref/Errors#channelerror), [`OpenError`](ref/Errors#openerror), [`ResolveError`](ref/Errors#resolveerror) and [`ResultError`](ref/Errors#resulterror) enumerations as appropriate. -- Accept as input and return as output data structures that are compatibile with the interfaces defined in this Standard. +- Accept as input and return as output data structures that are compatible with the interfaces defined in this Standard. - Include implementations of the following [Desktop Agent](ref/DesktopAgent) API functions, as defined in this Standard: - [`addContextListener`](ref/DesktopAgent#addcontextlistener) - [`addIntentListener`](ref/DesktopAgent#addintentlistener) @@ -175,7 +175,7 @@ In some cases, an application may want to communicate with a single application ### Retrieve Metadata about the Desktop Agent implementation -An application may wish to retrieve information about the version of the FDC3 Standard supported by a Desktop Agent implementation and the name of the implementation provider. +An application may wish to retrieve information about the version of the FDC3 Standard supported by a Desktop Agent implementation and the name of the implementation provider. Since version 1.2 of the FDC3 Standard it may do so via the [`fdc3.getInfo()`](ref/DesktopAgent#getinfo) function. The metadata returned can be used, for example, to vary the behavior of an application based on the version supported by the Desktop Agent, e.g.: @@ -199,7 +199,7 @@ let {appId, instanceId} = implementationMetadata.appMetadata; ### Reference apps or app instance(s) and retrieve their metadata -To construct workflows between applications, you need to be able to reference specific applications and instances of those applications. +To construct workflows between applications, you need to be able to reference specific applications and instances of those applications. From version 2.0 of the FDC3 Standard, Desktop Agent functions that reference or return information about other applications do so via an [`AppIdentifier`](ref/Types#appidentifier) type. [`AppIdentifier`](ref/Types#appidentifier) references specific applications via an `appId` from an [App Directory](../app-directory/overview) record and instances of that application via an `instanceId` assigned by the Desktop Agent. @@ -223,7 +223,7 @@ As an alternative to raising a specific intent, you may also raise an unspecifie ### Intent Results -An optional [`IntentResult`](ref/Types#intentresult) may also be returned as output by an application handling an intent. Results maybe either a single `Context` object, or a `Channel` that may be used to send a stream of responses. The [`PrivateChannel`](ref/PrivateChannel) type is provided to support synchronisation of data transmitted over returned channels, by allowing both parties to listen for events denoting subscription and unsubscription from the returned channel. `PrivateChannels` are only retrievable via [raising an intent](ref/DesktopAgent#raiseintent). +An optional [`IntentResult`](ref/Types#intentresult) may also be returned as output by an application handling an intent. Results maybe either a single `Context` object, or a `Channel` that may be used to send a stream of responses. The [`PrivateChannel`](ref/PrivateChannel) type is provided to support synchronization of data transmitted over returned channels, by allowing both parties to listen for events denoting subscription and unsubscription from the returned channel. `PrivateChannels` are only retrievable via [raising an intent](ref/DesktopAgent#raiseintent). For example, an application handling a `CreateOrder` intent might return a context representing the order and including an ID, allowing the application that raised the intent to make further calls using that ID. @@ -358,7 +358,7 @@ Optional metadata about each intent & context message received, including the ap ### Compliance with Intent Standards -Intents represent a contract with expected behaviour if an app asserts that it supports the intent. Where this contract is enforceable by schema (for example, return object types), the FDC3 API implementation SHOULD enforce compliance and return an error if the interface is not met. +Intents represent a contract with expected behavior if an app asserts that it supports the intent. Where this contract is enforceable by schema (for example, return object types), the FDC3 API implementation SHOULD enforce compliance and return an error if the interface is not met. It is expected that App Directories SHOULD also curate listed apps and ensure that they are complying with declared intents. @@ -370,33 +370,37 @@ Context channels allows a set of apps to share a stateful piece of data between There are three types of channels, which have different visibility and discoverability semantics: -1. **_User channels_**, which: +1. **User channels**, which: - * facilitate the creation of user-controlled context links between applications (often via the selection of a color channel), - * are created and named by the desktop agent, - * are discoverable (via the [`getUserChannels()`](ref/DesktopAgent#getuserchannels) API call), - * can be 'joined' (via the [`joinUserChannel()`](ref/DesktopAgent#joinuserchannel) API call). +- facilitate the creation of user-controlled context links between applications (often via the selection of a color channel), +- are created and named by the desktop agent, +- are discoverable (via the [`getUserChannels()`](ref/DesktopAgent#getuserchannels) API call), +- can be 'joined' (via the [`joinUserChannel()`](ref/DesktopAgent#joinuserchannel) API call). :::note -Prior to FDC3 2.0, 'user' channels were known as 'system' channels. They were renamed in FDC3 2.0 to reflect their intended usage, rather than the fact that they are created by system (which could also create 'app' channels). + + Prior to FDC3 2.0, 'user' channels were known as 'system' channels. They were renamed in FDC3 2.0 to reflect their intended usage, rather than the fact that they are created by system (which could also create 'app' channels). + ::: :::note -Earlier versions of FDC3 included the concept of a 'global' system channel + + Earlier versions of FDC3 included the concept of a 'global' system channel which was deprecated in FDC3 1.2 and removed in FDC3 2.0. + ::: -2. **_App channels_**, which: +2. **App channels**, which: - * facilitate developer controlled messaging between applications, - * are created and named by applications (via the [`getOrCreateChannel()`](ref/DesktopAgent#getorcreatechannel) API call), - * are not discoverable, - * are interacted with via the [Channel API](ref/Channel) (accessed via the desktop agent [`getOrCreateChannel`](ref/DesktopAgent#getorcreatechannel) API call) +- facilitate developer controlled messaging between applications, +- are created and named by applications (via the [`getOrCreateChannel()`](ref/DesktopAgent#getorcreatechannel) API call), +- are not discoverable, +- are interacted with via the [Channel API](ref/Channel) (accessed via the desktop agent [`getOrCreateChannel`](ref/DesktopAgent#getorcreatechannel) API call) -3. **_Private_** channels, which: +3. **Private** channels, which: - * facilitate private communication between two parties, - * have an auto-generated identity and can only be retrieved via a raised intent. + - facilitate private communication between two parties, + - have an auto-generated identity and can only be retrieved via a raised intent. Channels are interacted with via `broadcast` and `addContextListener` functions, allowing an application to send and receive Context objects via the channel. For User channels, these functions are provided on the Desktop Agent, e.g. [`fdc3.broadcast(context)`](ref/DesktopAgent#broadcast), and apply to channels joined via [`fdc3.joinUserChannel`](ref/DesktopAgent#joinuserchannel). For App channels, a channel object must be retrieved, via [`fdc3.getOrCreateChannel(channelName)`](ref/DesktopAgent#getorcreatechannel), which provides the functions, i.e. [`myChannel.broadcast(context)`](ref/Channel#broadcast) and [`myChannel.addContextListener(context)`](ref/Channel#addcontextlistener). For `PrivateChannels`, a channel object must also be retrieved, but via an intent raised with [`fdc3.raiseIntent(intent, context)`](ref/DesktopAgent#raiseintent) and returned as an [`IntentResult`](ref/Types#intentresult). @@ -525,7 +529,7 @@ const recommendedChannels = [ ### Direct Listening and Broadcast on Channels -While joining User channels (using fdc3.joinUserChannel) automates a lot of the channel behaviour for an app, it has the limitation that an app can only be 'joined' to one channel at a time. However, an app may instead retrieve a `Channel` Object via the [`fdc3.getOrCreateChannel`](ref/DesktopAgent#getorcreatechannel) API, or by raising an intent that returns a channel. The `Channel` object may then be used to listen to and broadcast on that channel directly using the [`Channel.addContextListener`](ref/Channel#addcontextlistener) and the [`Channel.broadcast`](ref/Channel#broadcast) APIs. This is especially useful for working with dynamic *App Channels*. FDC3 imposes no restriction on adding context listeners or broadcasting to multiple channels. +While joining User channels (using fdc3.joinUserChannel) automates a lot of the channel behavior for an app, it has the limitation that an app can only be 'joined' to one channel at a time. However, an app may instead retrieve a `Channel` Object via the [`fdc3.getOrCreateChannel`](ref/DesktopAgent#getorcreatechannel) API, or by raising an intent that returns a channel. The `Channel` object may then be used to listen to and broadcast on that channel directly using the [`Channel.addContextListener`](ref/Channel#addcontextlistener) and the [`Channel.broadcast`](ref/Channel#broadcast) APIs. This is especially useful for working with dynamic *App Channels*. FDC3 imposes no restriction on adding context listeners or broadcasting to multiple channels. ### App Channels @@ -574,7 +578,7 @@ It is intended that Desktop Agent implementations: - MUST prevent `PrivateChannels` from being retrieved via `fdc3.getOrCreateChannel`. - MUST provide the `id` value for the channel as required by the `Channel` interface. -The `PrivateChannel` type also supports synchronisation of data transmitted over returned channels. They do so by extending the `Channel` interface with event handlers which provide information on the connection state of both parties, ensuring that desktop agents do not need to queue or retain messages that are broadcast before a context listener is added and that applications are able to stop broadcasting messages when the other party has disconnected. +The `PrivateChannel` type also supports synchronization of data transmitted over returned channels. They do so by extending the `Channel` interface with event handlers which provide information on the connection state of both parties, ensuring that desktop agents do not need to queue or retain messages that are broadcast before a context listener is added and that applications are able to stop broadcasting messages when the other party has disconnected. ### Broadcasting and listening for multiple context types From 6c30424fbae670b64620fb74e0f119956a540ff5 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 14:04:16 +0100 Subject: [PATCH 014/106] more minor linting fixes --- docs/api-bridging/spec.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 8d8d3a5ad..b9cb4f03e 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -201,7 +201,7 @@ If requested by the server, the JWT auth token payload should take the form: ```typescript { - "sub": string, // GUID for the keypair used to sign the token + "sub": string, // GUID for the key pair used to sign the token "iat": date // timestamp at which the the token was generated as specified in ISO 8601 } ``` @@ -215,7 +215,7 @@ e.g. } ``` -Note that the `sub` SHOULD be a GUID that does NOT need to match the name requested by the Desktop Agent. It will be used to identify the keypair that should be used to validate the JWT token. Further, multiple Desktop Agent's MAY share the same keys for authentication and hence the same `sub`, but they will be assigned different names for routing purposes by the DAB. If an agent disconnects from the bridge and later re-connects it MAY request and be assigned the same name it connected with before. +Note that the `sub` SHOULD be a GUID that does NOT need to match the name requested by the Desktop Agent. It will be used to identify the key pair that should be used to validate the JWT token. Further, multiple Desktop Agent's MAY share the same keys for authentication and hence the same `sub`, but they will be assigned different names for routing purposes by the DAB. If an agent disconnects from the bridge and later re-connects it MAY request and be assigned the same name it connected with before. ### Step 4. Auth Confirmation and Name Assignment From 2837ffe75f7f5658af20e6635bead64033a323fb Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 14:42:08 +0100 Subject: [PATCH 015/106] Add a UUID standard reference to docs (referred to in bridging spec) --- docs/references.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/references.md b/docs/references.md index 4614222e9..03e138e3e 100644 --- a/docs/references.md +++ b/docs/references.md @@ -7,28 +7,28 @@ sidebar_label: References The following normative documents contain provisions, which, through reference in this text, constitute provisions of this Standard. For dated references, subsequent amendments to, or revisions of, any of these publications do not apply. However, parties to agreements based on this Standard are encouraged to investigate the possibility of applying the most recent editions of the normative documents indicated below. For undated references, the latest edition of the normative document referred to applies: -- **Apache 2.0 open-source license**, [https://www.apache.org/licenses/LICENSE-2.0]. -- **Community Specification license**, [https://github.com/CommunitySpecification/1.0] -- **ISO 3166-1**, _Codes for the representation of names of countries and their subdivisions – Part 1: Country codes_, [https://www.iso.org/iso-3166-country-codes.html]. -- **ISO 8601-1:2019**, _Date and time — Representations for information interchange — Part 1: Basic rules_, [https://www.iso.org/standard/70907.html] -- **ISO 10383:2012**, _Securities and related financial instruments — Codes for exchanges and market identification (MIC)_, [https://www.iso.org/standard/61067.html] -- **JSON Schema**, [https://json-schema.org/]. -- **OpenAPI Standard v3.0**, [https://www.openapis.org/]. -- **RFC 2119**, _Keywords for use in RFCs to Indicate Requirement Levels, March 1997_, [https://datatracker.ietf.org/doc/html/rfc2119]. -- **RFC 2782**, _A DNS RR for specifying the location of services (DNS SRV), February 2000_, [https://datatracker.ietf.org/doc/html/rfc2782]. -- **RFC 5646**, _Tags for Identifying Languages, September 2009_, [https://datatracker.ietf.org/doc/html/rfc5646]. -- **TypeScript Programming Language**, [https://www.typescriptlang.org/]. -- **Web Application Manifest**, _W3C Working Draft_, February 2022 [https://www.w3.org/TR/appmanifest/] +- **Apache 2.0 open-source license**, [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0). +- **Community Specification license**, [https://github.com/CommunitySpecification/1.0](https://github.com/CommunitySpecification/1.0) +- **ISO 3166-1**, _Codes for the representation of names of countries and their subdivisions – Part 1: Country codes_, [https://www.iso.org/iso-3166-country-codes.html](https://www.iso.org/iso-3166-country-codes.html). +- **ISO 8601-1:2019**, _Date and time — Representations for information interchange — Part 1: Basic rules_, [https://www.iso.org/standard/70907.html](https://www.iso.org/standard/70907.html) +- **JSON Schema**, [https://json-schema.org/](https://json-schema.org/). +- **OpenAPI Standard v3.0**, [https://www.openapis.org/](https://www.openapis.org/). +- **RFC 2119**, _Keywords for use in RFCs to Indicate Requirement Levels, March 1997_, [https://datatracker.ietf.org/doc/html/rfc2119](https://datatracker.ietf.org/doc/html/rfc2119). +- **RFC 2782**, _A DNS RR for specifying the location of services (DNS SRV), February 2000_, [https://datatracker.ietf.org/doc/html/rfc2782](https://datatracker.ietf.org/doc/html/rfc2782). +- **RFC 4122**, _A Universally Unique IDentifier (UUID) URN Namespace, July 2005_, [https://datatracker.ietf.org/doc/html/rfc4122](https://datatracker.ietf.org/doc/html/rfc4122). +- **RFC 5646**, _Tags for Identifying Languages, September 2009_, [https://datatracker.ietf.org/doc/html/rfc5646](https://datatracker.ietf.org/doc/html/rfc5646). +- **TypeScript Programming Language**, [https://www.typescriptlang.org/](https://www.typescriptlang.org/). +- **Web Application Manifest**, _W3C Working Draft_, February 2022 [https://www.w3.org/TR/appmanifest/](https://www.w3.org/TR/appmanifest/) The following documents may be useful in understanding certain aspects of this Standard; however, knowledge of them is not essential to the creation of a compliant implementation of this Standard: -- **CUSIP**, _Committee on Uniform Security Identification Procedures_, [https://www.cusip.com/identifiers.html#/CUSIP]. -- **FIGI**, _Financial Instrument Global Identifier_, [https://www.openfigi.com/about/figi]. -- **ISIN**, _International Securities Identification Number_, [https://www.isin.org/isin/] -- **LEI**, _Legal Entity Identifier based on the ISO 17442 standard_, [https://www.legalentityidentifier.co.uk/what-is-lei-code/]. -- **npm**, [https://docs.npmjs.com/about-npm]. -- **PermID**, _Permanent Identifiers_, [https://permid.org/]. -- **pnpm**, [https://pnpm.io/motivation]. -- **REST**, [https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm], [https://restfulapi.net/]. -- **SEDOL**, _Stock Exchange Daily Official List_, [https://www.lseg.com/sedol]. -- **yarn**, [https://yarnpkg.com/getting-started]. +- **CUSIP**, _Committee on Uniform Security Identification Procedures_, [https://www.cusip.com/identifiers.html#/CUSIP](https://www.cusip.com/identifiers.html#/CUSIP). +- **FIGI**, _Financial Instrument Global Identifier_, [https://www.openfigi.com/about/figi](https://www.openfigi.com/about/figi). +- **ISIN**, _International Securities Identification Number_, [https://www.isin.org/isin/](https://www.isin.org/isin/) +- **LEI**, _Legal Entity Identifier based on the ISO 17442 standard_, [https://www.legalentityidentifier.co.uk/what-is-lei-code/](https://www.legalentityidentifier.co.uk/what-is-lei-code/). +- **npm**, [https://docs.npmjs.com/about-npm](https://docs.npmjs.com/about-npm). +- **PermID**, _Permanent Identifiers_, [https://permid.org/](https://permid.org/). +- **pnpm**, [https://pnpm.io/motivation](https://pnpm.io/motivation]). +- **REST**, [https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm), [https://restfulapi.net/](https://restfulapi.net/). +- **SEDOL**, _Stock Exchange Daily Official List_, [https://www.lseg.com/sedol](https://www.lseg.com/sedol). +- **yarn**, [https://yarnpkg.com/getting-started](https://yarnpkg.com/getting-started). From 42c3da2bb77a0ef3d43554920aa13284048a1c92 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 14:42:29 +0100 Subject: [PATCH 016/106] Add missing theme for mermaid diagrams to website/package.json --- website/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/website/package.json b/website/package.json index 558ae83bd..a16b08fe0 100644 --- a/website/package.json +++ b/website/package.json @@ -31,16 +31,17 @@ "rimraf": "5.0.0" }, "resolutions": { - "got": "^11.8.5", + "got": "^11.8.5", "trim": "1.0.1" }, "overrides": { - "got": "^11.8.5", + "got": "^11.8.5", "trim": "1.0.1" }, "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", + "@docusaurus/theme-mermaid": "^2.4.0", "clsx": "^1.2.1", "react": "^17.0.2", "react-dom": "^17.0.2" From 654935a78be356ea17903aa95a79d8071633fd87 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 14:43:02 +0100 Subject: [PATCH 017/106] Integrate new error details into api spec and api-bridging reference files --- docs/api-bridging/ref/findIntent.md | 4 +++- docs/api-bridging/ref/open.md | 4 +++- docs/api-bridging/ref/raiseIntent.md | 6 ++++++ docs/api-bridging/spec.md | 5 +---- docs/api/ref/Errors.md | 27 +++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/docs/api-bridging/ref/findIntent.md b/docs/api-bridging/ref/findIntent.md index 862846f49..72d05d46c 100644 --- a/docs/api-bridging/ref/findIntent.md +++ b/docs/api-bridging/ref/findIntent.md @@ -206,7 +206,9 @@ The bridge receives and collates the responses, producing the following collated ``` :::note -In the event that an agent times out or returns an error, where others respond, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources`. + +In the event that an agent referred to in the API call is not connected to the bridge, an agent that was connected times out or returns an error, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources` and the appropriate error ([`ResolveError.DesktopAgentNotFound`](../../api/ref/Errors#resolveerror), [`BridgingError.ResponseTimedOut`](../../api/ref/Errors#bridgingerror) or [`BridgingError.AgentDisconnected`](../../api/ref/Errors#bridgingerror)) should be added to `meta.errorDetails`. + ::: Finally, agent-A combines the data received from the bridge, with its own local response to produce the response to the requesting application: diff --git a/docs/api-bridging/ref/open.md b/docs/api-bridging/ref/open.md index 2be890918..90b985751 100644 --- a/docs/api-bridging/ref/open.md +++ b/docs/api-bridging/ref/open.md @@ -32,7 +32,9 @@ let instanceMetadata = await fdc3.open(AppIdentifier); should always be processed locally without be passed to the bridge. -The `fdc3.open` command should result in a single copy of the specified app being opened and its instance data returned, or an error if it could not be opened. When receiving a response from invoking `fdc3.open` via the Desktop Agent Bridge, the new app instances MUST be initialized before responding as the responding Desktop Agent will need to return an `AppIdentifier` with an `instanceId` field set. +The `fdc3.open` command should result in a single copy of the specified app being opened and its instance data returned, or an error if it could not be opened. When receiving a response from invoking `fdc3.open` via the Desktop Agent Bridge, the new app instances MUST be initialized before responding as the responding Desktop Agent will need to return an `AppIdentifier` with an `instanceId` field set. + +If the remote Desktop Agent is not currently connected from the bridge, the [`OpenError.DesktopAgentNotFound` error](../../api/ref/Errors#openerror) should be returned in the response from the bridge and the promise returned from the call to `fdc3.open` rejected with it. ## Message exchange diff --git a/docs/api-bridging/ref/raiseIntent.md b/docs/api-bridging/ref/raiseIntent.md index ef6b81d6e..8287fc5d3 100644 --- a/docs/api-bridging/ref/raiseIntent.md +++ b/docs/api-bridging/ref/raiseIntent.md @@ -265,3 +265,9 @@ If the `IntentHandler` returned `void` rather than an intent result `payload.int } } ``` + +:::note + +In the event that an agent referred to in the API call is not connected to the bridge, it is connected but times out or returns an error, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources` in the `raiseIntentResponse` and the appropriate error (which might include any error from the [`ResolveError`](../../api/ref/Errors#resolveerror) enumeration, [`BridgingError.ResponseTimedOut`](../../api/ref/Errors#bridgingerror) or [`BridgingError.AgentDisconnected`](../../api/ref/Errors#bridgingerror)) should be added to `meta.errorDetails`. + +::: diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index b9cb4f03e..cf0cab1f1 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -12,10 +12,7 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: - * Create schema files defining messages * Add new terms and acronyms to FDC3 glossary and ensure they are defined in this spec's introduction - * Add new errors to Error enumerations specified in this proposal - * Add RFC 4122 - https://datatracker.ietf.org/doc/html/rfc4122 to FDC3 references page ## Implementing a Desktop Agent Bridge @@ -624,7 +621,7 @@ The latter two types embody workflows that may be broken by an agent disconnecti When processing the disconnection of an agent from the bridge, the bridge MUST examine requests currently 'in-flight' and: * For requests that require the bridge to collate multiple responses: - * add the disconnected Desktop Agent's details to the `errorSources` array in teh response and the `BridgingError.AgentDisconnected` message to the `errorDetails` array. + * add the disconnected Desktop Agent's details to the `errorSources` array in the response and the `BridgingError.AgentDisconnected` message to the `errorDetails` array. * complete requests that no longer require further responses (all other agents have responded), or * continue to await the timeout (if other agents are yet to respond), or * return an 'empty' response in the expected format (if no other agents are connected and no data will be received). diff --git a/docs/api/ref/Errors.md b/docs/api/ref/Errors.md index 0f394535d..517717f24 100644 --- a/docs/api/ref/Errors.md +++ b/docs/api/ref/Errors.md @@ -56,6 +56,10 @@ enum OpenError { * to handle the request. */ ResolverUnavailable = 'ResolverUnavailable', + + /** Returned if the specified Desktop Agent is not found, via a connected + Desktop Agent Bridge. */ + DesktopAgentNotFound = 'DesktopAgentNotFound', } ``` @@ -105,6 +109,10 @@ export enum ResolveError { * handler within a timeout. */ IntentDeliveryFailed = 'IntentDeliveryFailed', + + /** Returned if the specified Desktop Agent is not found, via a connected + Desktop Agent Bridge. */ + DesktopAgentNotFound = 'DesktopAgentNotFound', } ``` @@ -140,3 +148,22 @@ Contains constants representing the errors that can be encountered when calling * [`DesktopAgent.addIntentListener`](DesktopAgent#addintentlistener) * [`DesktopAgent.raiseIntent`](DesktopAgent#raiseintent) * [`IntentResolution`](Metadata#intentresolution) + +## `BridgingError` + +```typescript +enum BridgingError { + /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, + * within the alloted timeout. */ + ResponseTimedOut = 'ResponseToBridgeTimedOut', + /** Returned if a Desktop Agent that has been targeted by a particular request has + * been disconnected from the Bridge before a response has been received from it. */ + AgentDisconnected = 'AgentDisconnected' +} +``` + +Contains constants representing the errors that can be encountered when queries are forwarded to a Desktop Agent bridge, but one or more remote Desktop Agents connected to it disconnects or times-out while a particular request is in flight. + +**See also:** + +* [API Bridging - Workflows broken by disconnects](../../api-bridging/spec##workflows-broken-by-disconnects) \ No newline at end of file From b9e950f04efcc28e49190d091f86a7849d8c034f Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 14:57:36 +0100 Subject: [PATCH 018/106] Adding new terms and acronyms for bridging to glossary --- docs/api-bridging/spec.md | 35 +++++++++++++++++------------------ docs/fdc3-glossary.md | 12 +++++++++--- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index cf0cab1f1..db382a687 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -76,9 +76,9 @@ Whilst some FDC3 requests are 'fire and forget' (e.g. broadcast) the main reques A set of classifications for message exchange types are provided in the [Individual message exchanges](#individual-message-exchanges) section. ::: -The DAB is the responsible entity for collating responses together from all DAs. Whilst this approach may add some complexity to bridge implementations, it will simplify DA implementations since they only need to handle one response. +The Desktop Agent Bridge is the responsible entity for collating responses together from all DAs. Whilst this approach may add some complexity to bridge implementations, it will simplify DA implementations since they only need to handle one response. -The DAB MUST allow for timeout configuration. +The Desktop Agent Bridge MUST allow for timeout configuration. The Bridge SHOULD also implement timeout for waiting on DA responses. Assuming the message exchange will be all intra-machine, a recommended timeout of 1500ms SHOULD be used. Similarly, Desktop Agents SHOULD apply a timeout to requests made to the bridge that require a response (collated or otherwise), to handle situations where the bridge is not responding as expected. A recommended timeout of 3000ms SHOULD be used in this case. @@ -88,7 +88,7 @@ It is assumed that Desktop Agents SHOULD adopt the recommended 8 channel set (an The Desktop Agent Bridge MAY support channel mapping ability, to deal with issues caused by differing channel sets. -A key responsibility of the DAB is ensuring that the channel state of the connected agents is kept in-sync, which requires an initial synchronization step as part of the connection protocol. +A key responsibility of the Desktop Agent Bridge is ensuring that the channel state of the connected agents is kept in-sync, which requires an initial synchronization step as part of the connection protocol. #### Bridging Desktop Agent on Multiple Machines @@ -101,7 +101,7 @@ However, cross-machine routing is an internal concern of the Desktop Agent Bridg On connection to the bridge's websocket, a handshake must be completed that may include an authentication step before a name is assigned to the Desktop Agent for use in routing messages. The purpose of the handshake is to allow: * The Desktop Agent to confirm that it is connecting to Desktop Agent Bridge, rather than another service exposed via a websocket. -* The DAB to require that the Desktop Agent authenticate itself, allowing it to control access to the network of bridged Desktop Agents. +* The Desktop Agent Bridge to require that the Desktop Agent authenticate itself, allowing it to control access to the network of bridged Desktop Agents. * The Desktop Agent to request a particular name by which it will be addressed by other agents and for the bridge to assign the requested name, after confirming that no other agent is connected with that name, or a derivative of that name if it is already in use. The bridge is ultimately responsible for assigning each Desktop Agent a name and for routing messages using those names. Desktop Agents MUST accept the name they are assigned by the bridge. @@ -140,7 +140,7 @@ Note, if the Desktop Agent is configured to run at startup (of the user's machin ### Step 2. Hello -When a new connection is made to the DAB websocket, it sends a `hello` message, including its metadata. +When a new connection is made to the Desktop Agent Bridge websocket, it sends a `hello` message, including its metadata. ```typescript { @@ -192,7 +192,7 @@ The DA must then respond to the `hello` message with a `handshake` request to th } ``` -Note that the `meta` element of of the handshake message contains both a `timestamp` field (for logging purposes) and a `requestGuid` field that should be populated with a Globally Unique Identifier (GUID), generated by the Desktop Agent. This `responseGuid` will be used to link the handshake message to a response from the DAB that assigns it a name. For more details on GUID generation see [Globally Unique Identifier](#globally-unique-identifier) section. +Note that the `meta` element of of the handshake message contains both a `timestamp` field (for logging purposes) and a `requestGuid` field that should be populated with a Globally Unique Identifier (GUID), generated by the Desktop Agent. This `responseGuid` will be used to link the handshake message to a response from the Desktop Agent Bridge that assigns it a name. For more details on GUID generation see [Globally Unique Identifier](#globally-unique-identifier) section. If requested by the server, the JWT auth token payload should take the form: @@ -212,11 +212,11 @@ e.g. } ``` -Note that the `sub` SHOULD be a GUID that does NOT need to match the name requested by the Desktop Agent. It will be used to identify the key pair that should be used to validate the JWT token. Further, multiple Desktop Agent's MAY share the same keys for authentication and hence the same `sub`, but they will be assigned different names for routing purposes by the DAB. If an agent disconnects from the bridge and later re-connects it MAY request and be assigned the same name it connected with before. +Note that the `sub` SHOULD be a GUID that does NOT need to match the name requested by the Desktop Agent. It will be used to identify the key pair that should be used to validate the JWT token. Further, multiple Desktop Agent's MAY share the same keys for authentication and hence the same `sub`, but they will be assigned different names for routing purposes by the Desktop Agent Bridge. If an agent disconnects from the bridge and later re-connects it MAY request and be assigned the same name it connected with before. ### Step 4. Auth Confirmation and Name Assignment -The DAB will extract the authentication token `sub` from the JWT token's claims and then verify the token's signature against any public key it has been configured with. If the signature can't be verified, the bridge should respond with the below authentication failed message and the socket should be disconnected by the bridge. +The Desktop Agent Bridge will extract the authentication token `sub` from the JWT token's claims and then verify the token's signature against any public key it has been configured with. If the signature can't be verified, the bridge should respond with the below authentication failed message and the socket should be disconnected by the bridge. ```typescript { @@ -232,11 +232,11 @@ The DAB will extract the authentication token `sub` from the JWT token's claims } ``` -If authentication succeeds (or is not required), then the DAB should assign the Desktop Agent the name requested in the `handshake` message, unless another agent is already connected with that name in which case it should generate a new name which MAY be derived from the requested name. Note that the assigned name is not communicated to the connecting agent until step 5. +If authentication succeeds (or is not required), then the Desktop Agent Bridge should assign the Desktop Agent the name requested in the `handshake` message, unless another agent is already connected with that name in which case it should generate a new name which MAY be derived from the requested name. Note that the assigned name is not communicated to the connecting agent until step 5. ### Step 5. Synchronize the Bridge's Channel State -Channels are the main stateful mechanism in the FDC3 that we have to consider. A key responsibility of the DAB is ensuring that the channel state of the connected agents is kept in-sync. To do so, the states must be synchronized whenever a new agent connects. Hence, the Bridge MUST process the `channelState` provided by the new agent in the `handshake` request, which MUST contain details of each known User Channel or App Channel and its state. The bridge MUST compare the received channel names and states to its own representation of the current state of channels in connected agents, merge that state with that of the new agent and communicate the updated state to all connected agents to ensure that they are synchronized with it. +Channels are the main stateful mechanism in the FDC3 that we have to consider. A key responsibility of the Desktop Agent Bridge is ensuring that the channel state of the connected agents is kept in-sync. To do so, the states must be synchronized whenever a new agent connects. Hence, the Bridge MUST process the `channelState` provided by the new agent in the `handshake` request, which MUST contain details of each known User Channel or App Channel and its state. The bridge MUST compare the received channel names and states to its own representation of the current state of channels in connected agents, merge that state with that of the new agent and communicate the updated state to all connected agents to ensure that they are synchronized with it. Hence, if we assume that the state of each channel can be represented by an ordered array of context objects (most recent first - noting that only the first position, that of the most recent context broadcast, matters), the Desktop Agent Bridge MUST merge the incoming `channelsState` with the `existingChannelsState` as follows: @@ -261,7 +261,7 @@ Object.keys(channelsState).forEach((channelId) => { }); ``` -When multiple agents attempt to connect to the Desktop Agent Bridge at the same time, steps 3-6 of the connection protocol MUST be handled by the DAB serially to ensure correct channel state synchronization. +When multiple agents attempt to connect to the Desktop Agent Bridge at the same time, steps 3-6 of the connection protocol MUST be handled by the Desktop Agent Bridge serially to ensure correct channel state synchronization. ### Step 6. Connected Agents Update @@ -310,13 +310,13 @@ In summary, updating listeners for a known channel should be performed as follow 3. If there is a current context of that type, and it does not match the incoming object exactly, broadcast it to listeners of that specific type only. 4. If the most recent (first in the incoming array) type OR value of that type doesn't match the most recent context broadcast on the channel, broadcast it to un-typed listeners only. -This procedure is the same for both previously connected and connecting agents, however, the merging procedure used by the DAB in step 5 will result in apps managed by previously connected agents only rarely receiving context broadcasts (and only for types they have not yet seen on a channel). +This procedure is the same for both previously connected and connecting agents, however, the merging procedure used by the Desktop Agent Bridge in step 5 will result in apps managed by previously connected agents only rarely receiving context broadcasts (and only for types they have not yet seen on a channel). After applying the `connectedAgentsUpdate` message, the newly connected Desktop Agent and other already connected agents are able to begin communicating through the bridge. #### Atomicity and handling concurrent operations -Handling by the Desktop Agent of the synchronization message from the DAB in step 6 of the connection protocol should be atomic to prevent message overlap with `fdc3.broadcast`, `channel.broadcast`, `fdc3.addContextListener` or `channel.getCurrentContext`. I.e. the `connectedAgentsUpdate` message must be processed immediately on receipt by Desktop Agents and updates applied before any other messages are sent or responses processed. +Handling by the Desktop Agent of the synchronization message from the Desktop Agent Bridge in step 6 of the connection protocol should be atomic to prevent message overlap with `fdc3.broadcast`, `channel.broadcast`, `fdc3.addContextListener` or `channel.getCurrentContext`. I.e. the `connectedAgentsUpdate` message must be processed immediately on receipt by Desktop Agents and updates applied before any other messages are sent or responses processed. Similarly, the Desktop Agent Bridge must process steps 3-6 of the connection protocol (receiving a `handshake` messages up to issuing the `connectedAgentsUpdate` messages to all participants) as a single atomic unit, allowing no overlap with the processing of other messages from connected agents (as they might modify the state information it is processing during those steps). @@ -659,12 +659,11 @@ However, `PrivateChannel` instances allow the registration of additional event h Individual message exchanges are defined for each of the Desktop Agent methods that require bridging in the reference section of this Part. -Each section assumes that we have 3 agents connected by a bridge: +Each section assumes that we have 3 agents connected by a bridge (itself denoted by `DAB` in diagrams): -* agent-A -* agent-B -* agent-C -* DAB +* agent-A (denoted by `DA A` in diagrams) +* agent-B (denoted by `DA A` in diagrams) +* agent-C (denoted by `DA A` in diagrams) Message exchanges come in a number of formats, which are known as: diff --git a/docs/fdc3-glossary.md b/docs/fdc3-glossary.md index dde0a1219..2840974fa 100644 --- a/docs/fdc3-glossary.md +++ b/docs/fdc3-glossary.md @@ -6,7 +6,7 @@ sidebar_label: Glossary For the purposes of this Standard, the following definitions apply. Other terms are defined when first used, at which place they appear in bold and italic type. Terms explicitly defined in this Standard are not to be presumed to refer implicitly to similar terms defined elsewhere. Terms not defined are assumed to be well-known in the financial services or software industries. - +- **API Bridge**: Shorthand for Desktop Agent Bridge. - **app**: Shorthand for application. - **app directory**: A repository of application metadata supporting discovery, for example via name or intent, and retrieval of metadata necessary to launch an application. - **app directory record**: Metadata relating to a single application, encoded in JSON. @@ -14,16 +14,21 @@ For the purposes of this Standard, the following definitions apply. Other terms - **appD record**: Shorthand for app directory record. - **application**: Any endpoint on the desktop that is registered with/known by a Desktop Agent, launchable by a Desktop Agent, addressable by a Desktop Agent or otherwise able to interact with the Desktop Agent. - **application, hybrid**: Any web application running within the context of a standalone native application that embeds a web view, typically based on Chromium. -- **application, native**: A non-web-based application; i.e., one that runs outside the context of web browser, web view or web container. A user-written program—typically implemented in a language such as C++, C#, Java, or Python, rather than JavaScript or TypeScript. +- **application, native**: A non-web-based application; i.e., one that runs outside the context of web browser, web view or web container. A user-written program, typically implemented in a language such as C++, C#, Java, or Python, rather than JavaScript or TypeScript. - **application, web**: An application written in TypeScript or JavaScript, HTML and CSS, which runs within the context of a web browser or a web container. - **Application Provider**: A downstream consumer of FDC3 Standards that can understand and use the FDC3 API (supplied by a Platform Provider), context data, and/or intents. - **application-specific intent**: A custom intent defined by an application or applications, independent of the Standard. +- **Bridge**: Shorthand for Desktop Agent Bridge. +- **bridging**: Shorthand for the exchange of messages across a Desktop Agent API Bridge for the purposes of extending interop between apps managed by different Desktop Agents. - **Channel**: A grouping of apps for the purposes of sharing stateful pieces of data. A secondary interface of the FDC3 API. - **context channels**: A mechanism to allow sets of apps to share stateful pieces of data among themselves, and to be alerted when that data changes. - **context**: Shorthand for context data. -- **context data**: Objects encoding common identifiers and data in a standardized format that can be passed between apps via context channels or used in conjunction with intents to invoke actions creating a seamless cross-application workflow. Diverse context data types are created to encode different types of data, each having their own _type_ field and unique set of data fields. +- **context data**: Objects encoding common identifiers and data in a standardized format that can be passed between apps via context channels or used in conjunction with intents to invoke actions creating a seamless cross-application workflow. Diverse context data types are created to encode different types of data, each having their own _type_ field and unique set of data fields. +- **DAB**: Acronym of Desktop Agent Bridge. - **Desktop Agent**: A desktop component (or aggregate of components) that serves as a launcher and message router (broker) for applications in its domain. The primary interface of the FDC3 API. +- **Desktop Agent Bridge**: An independent service that Desktop Agents connect to which allows them to relay requests to other Desktop Agents also connected to the bridge, allowing FDC3-based interop to extend across multiple Desktop Agents and machines. - **FDC3 API**: A baseline, consistent developer interface for interoperability between applications. +- **GUID**: Globally Unique IDentifier, synonymous with UUID. Defined by [IETF RFC4122](references). - **interop**: Shorthand for interoperability. - **interoperability**: the ability of software applications to exchange and make use of information and invoke specified actions. - **intent**: A verb, with a pre-agreed meaning (expected behavior), used to invoke an action between applications. A set of such verbs can, in conjunction with Context Data acting as nouns, be used to put together common cross-application workflows on the financial desktop. @@ -34,3 +39,4 @@ For the purposes of this Standard, the following definitions apply. Other terms - **resolver**: A facility of a Desktop Agent used to map a raised intent and associated context object to an application that will perform the action represented by the intent, using the context object as input. Where multiple applications can resolve the intent, a resolver will often display a user-interface allowing a user to pick from the available applications that support the intent and type of context supplied. - **resolving an intent**: The act of mapping a specified intent and context object to an application. - **standard intent**: An intent defined by this Standard. +- **UUID**: Universally Unique IDentifier, synonymous with GUID. Defined by [IETF RFC4122](references). From b4e50fc6d884e5f73420126eae8262239ab7d16e Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 14:58:44 +0100 Subject: [PATCH 019/106] adjusting TODOs in spec --- docs/api-bridging/spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index db382a687..9ca44aff5 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -12,7 +12,7 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: - * Add new terms and acronyms to FDC3 glossary and ensure they are defined in this spec's introduction + * Add DesktopAgentIdentifier to API types page and adjust relevant API types. ## Implementing a Desktop Agent Bridge From ae809b9bf014c5e3f9b72f8fd0e777e9894cdcdf Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 15:21:25 +0100 Subject: [PATCH 020/106] adding a missing error and adjusting TODOs --- docs/api-bridging/spec.md | 11 +++++++++-- docs/api/ref/Errors.md | 15 ++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 9ca44aff5..85bc4510a 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -12,7 +12,9 @@ In any Desktop Agent bridging scenario, it is expected that each DA is being ope * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: - * Add DesktopAgentIdentifier to API types page and adjust relevant API types. + * Add DesktopAgentIdentifier to API types page and adjust docs for existing types that will need it. + * Add DesktopAgentIdentifier to API sources and adjust existing types that will need it. + * Add new Errors to API sources. ## Implementing a Desktop Agent Bridge @@ -552,7 +554,12 @@ enum BridgingError { ResponseTimedOut = 'ResponseToBridgeTimedOut', /** Returned if a Desktop Agent that has been targeted by a particular request has * been disconnected from the Bridge before a response has been received from it. */ - AgentDisconnected = 'AgentDisconnected' + AgentDisconnected = 'AgentDisconnected', + /** Returned for FDC3 API calls that are specified with arguments indicating that + * a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a + * remote DesktopAgent targeted), when the local Desktop Agent is not connected to + * a bridge. */ + NotConnectedToBridge = 'NotConnectedToBridge' } ``` diff --git a/docs/api/ref/Errors.md b/docs/api/ref/Errors.md index 517717f24..daaf84307 100644 --- a/docs/api/ref/Errors.md +++ b/docs/api/ref/Errors.md @@ -58,7 +58,7 @@ enum OpenError { ResolverUnavailable = 'ResolverUnavailable', /** Returned if the specified Desktop Agent is not found, via a connected - Desktop Agent Bridge. */ + * Desktop Agent Bridge. */ DesktopAgentNotFound = 'DesktopAgentNotFound', } ``` @@ -111,7 +111,7 @@ export enum ResolveError { IntentDeliveryFailed = 'IntentDeliveryFailed', /** Returned if the specified Desktop Agent is not found, via a connected - Desktop Agent Bridge. */ + * Desktop Agent Bridge. */ DesktopAgentNotFound = 'DesktopAgentNotFound', } ``` @@ -154,11 +154,16 @@ Contains constants representing the errors that can be encountered when calling ```typescript enum BridgingError { /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, - * within the alloted timeout. */ + * within the alloted timeout. */ ResponseTimedOut = 'ResponseToBridgeTimedOut', /** Returned if a Desktop Agent that has been targeted by a particular request has - * been disconnected from the Bridge before a response has been received from it. */ - AgentDisconnected = 'AgentDisconnected' + * been disconnected from the Bridge before a response has been received from it. */ + AgentDisconnected = 'AgentDisconnected', + /** Returned for FDC3 API calls that are specified with arguments indicating that + * a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a + * remote DesktopAgent targeted), when the local Desktop Agent is not connected to + * a bridge. */ + NotConnectedToBridge = 'NotConnectedToBridge' } ``` From 3662f732f48cc50bd200b35e2ee20782d78cb614 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 16:01:21 +0100 Subject: [PATCH 021/106] Adding new errors to API sources --- src/api/Errors.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/api/Errors.ts b/src/api/Errors.ts index c49881889..107040ddd 100644 --- a/src/api/Errors.ts +++ b/src/api/Errors.ts @@ -13,6 +13,8 @@ export enum OpenError { AppTimeout = 'AppTimeout', /** Returned if the FDC3 desktop agent implementation is not currently able to handle the request.*/ ResolverUnavailable = 'ResolverUnavailable', + /** Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ + DesktopAgentNotFound = 'DesktopAgentNotFound', } /** Constants representing the errors that can be encountered when calling the `findIntent`, `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the DesktopAgent (`fdc3`). */ @@ -31,6 +33,8 @@ export enum ResolveError { TargetInstanceUnavailable = 'TargetInstanceUnavailable', /** Returned if the intent and context could not be delivered to the selected application or instance, for example because it has not added an intent handler within a timeout.*/ IntentDeliveryFailed = 'IntentDeliveryFailed', + /** Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ + DesktopAgentNotFound = 'DesktopAgentNotFound', } export enum ResultError { @@ -48,3 +52,12 @@ export enum ChannelError { /** SHOULD be returned when a channel cannot be created or retrieved via the `getOrCreateChannel` method of the DesktopAgent (`fdc3`).*/ CreationFailed = 'CreationFailed', } + +export enum BridgingError { + /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, within the alloted timeout. */ + ResponseTimedOut = 'ResponseToBridgeTimedOut', + /** Returned if a Desktop Agent that has been targeted by a particular request has been disconnected from the Bridge before a response has been received from it. */ + AgentDisconnected = 'AgentDisconnected', + /** Returned for FDC3 API calls that are specified with arguments indicating that a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a remote DesktopAgent targeted), when the local Desktop Agent is not connected to a bridge. */ + NotConnectedToBridge = 'NotConnectedToBridge' +} From b35f7a1483d64cad9c166c10a874d90610474586 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 17:46:22 +0100 Subject: [PATCH 022/106] Adding bridging errors, DesktopAgentIdentifier to API specs and sources --- docs/api-bridging/spec.md | 17 ++++++++--------- docs/api/ref/Errors.md | 6 ++++-- docs/api/ref/Types.md | 22 +++++++++++++++++++++- src/api/AppIdentifier.ts | 3 +++ src/api/DesktopAgentIdentifier.ts | 16 ++++++++++++++++ src/api/Errors.ts | 10 +++++----- 6 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 src/api/DesktopAgentIdentifier.ts diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 85bc4510a..be3f3f071 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -4,17 +4,18 @@ sidebar_label: Overview title: API Bridging Overview (next) --- -The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent API Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. +(Experimental) The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. -In any Desktop Agent bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. +In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. ## TODO list * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: - * Add DesktopAgentIdentifier to API types page and adjust docs for existing types that will need it. - * Add DesktopAgentIdentifier to API sources and adjust existing types that will need it. - * Add new Errors to API sources. + * Reference DAB from the API spec, updating previous content about interconnecting desktop agents. + * Link to BackPlane project + * Apply Experimental labels where needed +* Refactor spec to separate channel (websocket) and protocol. ## Implementing a Desktop Agent Bridge @@ -487,13 +488,11 @@ interface AppIdentifier { } ``` -Further, a new `DesktopAgentIdentifier` type is introduced to handle cases where a response message is returned by the Desktop Agent (or more specifically its resolver) rather than a specific app. This is particularly relevant for `findIntent` responses: +Further, a new `DesktopAgentIdentifier` type is introduced to handle cases where a request needs to be directed to a Desktop Agent rather than a specific app, or a response message is returned by the Desktop Agent (or more specifically its resolver) rather than a specific app. This is particularly relevant for `findIntent` message exchanges: ```typescript interface DesktopAgentIdentifier { - /** A string filled in by the Desktop Agent Bridge on receipt of a message, that represents - * the Desktop Agent Identifier that is the source of the message. - **/ + /** A field that represents the Desktop Agent that should be targeted or that a response was received from. **/ readonly desktopAgent: string; } ``` diff --git a/docs/api/ref/Errors.md b/docs/api/ref/Errors.md index daaf84307..3d78ccda9 100644 --- a/docs/api/ref/Errors.md +++ b/docs/api/ref/Errors.md @@ -57,7 +57,7 @@ enum OpenError { */ ResolverUnavailable = 'ResolverUnavailable', - /** Returned if the specified Desktop Agent is not found, via a connected + /** (Experimental) Returned if the specified Desktop Agent is not found, via a connected * Desktop Agent Bridge. */ DesktopAgentNotFound = 'DesktopAgentNotFound', } @@ -110,7 +110,7 @@ export enum ResolveError { */ IntentDeliveryFailed = 'IntentDeliveryFailed', - /** Returned if the specified Desktop Agent is not found, via a connected + /** (Experimental) Returned if the specified Desktop Agent is not found, via a connected * Desktop Agent Bridge. */ DesktopAgentNotFound = 'DesktopAgentNotFound', } @@ -151,6 +151,8 @@ Contains constants representing the errors that can be encountered when calling ## `BridgingError` +_(Experimental)_ + ```typescript enum BridgingError { /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, diff --git a/docs/api/ref/Types.md b/docs/api/ref/Types.md index a35901140..716aed22b 100644 --- a/docs/api/ref/Types.md +++ b/docs/api/ref/Types.md @@ -21,6 +21,10 @@ interface AppIdentifier { * specific instance of the application described. */ readonly instanceId?: string; + + /** (Experimental) Field that represents the Desktop Agent that the app is + * available on. Used in Desktop Agent Bridging.**/ + readonly desktopAgent?: string; } ``` @@ -80,6 +84,22 @@ Optional metadata about the context message, including the app that originated t * [`DesktopAgent.addContextListener`](DesktopAgent#addcontextlistener) * [`Channel.addContextListener`](Channel#addcontextlistener) +## `DesktopAgentIdentifier` + +```typescript +interface DesktopAgentIdentifier { + /** (Experimental) Field that represents the Desktop Agent that the app is + * available on.**/ + readonly desktopAgent: string; +} +``` + +(Experimental) Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios where a request needs to be directed to a Desktop Agent rather than a specific app, or a response message is returned by the Desktop Agent (or more specifically its resolver) rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no app details are available or are appropriate. + +**See also:** + +* [API Bridging - Identifying Desktop Agents Identity and Message Sources](../../api-bridging/spec#identifying-desktop-agents-identity-and-message-sources) + ## `IntentHandler` ```typescript @@ -121,7 +141,7 @@ Represented as a union type in TypeScript, however, this type may be rendered as ## `Listener` -A Listener object is returned when an application subscribes to intents or context broadcasts via the [`addIntentListener`](#addintentlistener) or [`addContextListener`](#addcontextlistener) methods on the [DesktopAgent](DesktopAgent) object. +A Listener object is returned when an application subscribes to intents or context broadcasts via the [`addIntentListener`](DesktopAgent#addintentlistener) or [`addContextListener`](DesktopAgent#addcontextlistener) methods on the [DesktopAgent](DesktopAgent) object. ```typescript interface Listener { diff --git a/src/api/AppIdentifier.ts b/src/api/AppIdentifier.ts index d63fb1e1c..1bf9cb7a6 100644 --- a/src/api/AppIdentifier.ts +++ b/src/api/AppIdentifier.ts @@ -16,4 +16,7 @@ export interface AppIdentifier { /** An optional instance identifier, indicating that this object represents a specific instance of the application described.*/ readonly instanceId?: string; + + /** (Experimental) Field that represents the Desktop Agent that the app is available on. Used in Desktop Agent Bridging.**/ + readonly desktopAgent?: string; } diff --git a/src/api/DesktopAgentIdentifier.ts b/src/api/DesktopAgentIdentifier.ts new file mode 100644 index 000000000..850c2f948 --- /dev/null +++ b/src/api/DesktopAgentIdentifier.ts @@ -0,0 +1,16 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * Copyright FINOS FDC3 contributors - see NOTICE file + */ + +/** + * (Experimental) Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + */ +export interface DesktopAgentIdentifier { + /** (Experimental) Field that represents the Desktop Agent that the app is available on. Used in Desktop Agent Bridging. */ + readonly desktopAgent: string; +} diff --git a/src/api/Errors.ts b/src/api/Errors.ts index 107040ddd..2e70373f6 100644 --- a/src/api/Errors.ts +++ b/src/api/Errors.ts @@ -13,7 +13,7 @@ export enum OpenError { AppTimeout = 'AppTimeout', /** Returned if the FDC3 desktop agent implementation is not currently able to handle the request.*/ ResolverUnavailable = 'ResolverUnavailable', - /** Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ + /** (Experimental) Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ DesktopAgentNotFound = 'DesktopAgentNotFound', } @@ -33,7 +33,7 @@ export enum ResolveError { TargetInstanceUnavailable = 'TargetInstanceUnavailable', /** Returned if the intent and context could not be delivered to the selected application or instance, for example because it has not added an intent handler within a timeout.*/ IntentDeliveryFailed = 'IntentDeliveryFailed', - /** Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ + /** (Experimental) Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ DesktopAgentNotFound = 'DesktopAgentNotFound', } @@ -54,10 +54,10 @@ export enum ChannelError { } export enum BridgingError { - /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, within the alloted timeout. */ + /** (Experimental) Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, within the alloted timeout. */ ResponseTimedOut = 'ResponseToBridgeTimedOut', - /** Returned if a Desktop Agent that has been targeted by a particular request has been disconnected from the Bridge before a response has been received from it. */ + /** (Experimental) Returned if a Desktop Agent that has been targeted by a particular request has been disconnected from the Bridge before a response has been received from it. */ AgentDisconnected = 'AgentDisconnected', - /** Returned for FDC3 API calls that are specified with arguments indicating that a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a remote DesktopAgent targeted), when the local Desktop Agent is not connected to a bridge. */ + /** (Experimental) Returned for FDC3 API calls that are specified with arguments indicating that a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a remote DesktopAgent targeted), when the local Desktop Agent is not connected to a bridge. */ NotConnectedToBridge = 'NotConnectedToBridge' } From 1b2e110f17e030415f84068695ed1f24dc9d8dab Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 18:19:50 +0100 Subject: [PATCH 023/106] Comment cleanup --- docs/api-bridging/spec.md | 77 +++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index be3f3f071..2adad62ce 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -277,14 +277,18 @@ The `connectedAgentsUpdate` message will take the form: type: "connectedAgentsUpdate", /** Request body, containing the arguments to the function called.*/ payload: { - /** Should be set when an agent first connects to the bridge and provide its assigned name. */ + /** Should be set when an agent first connects to the bridge and provide + * its assigned name. */ addAgent?: string, - /** Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned. */ + /** Should be set when an agent disconnects from the bridge and provide + * the name that no longer is assigned. */ removeAgent?: string, /** Desktop Agent Bridge implementation metadata of all connected agents. - * Note that this object is extended to include a `desktopAgent` field with the name assigned by the DAB. */ + * Note that this object is extended to include a `desktopAgent` field + * with the name assigned by the DAB. */ allAgents: ImplementationMetadata[], - /** The updated state of channels that should be adopted by the agents. SHOULD only be set when an agent is connecting to the bridge. */ + /** The updated state of channels that should be adopted by the agents. + * SHOULD only be set when an agent is connecting to the bridge. */ channelsState?: ChannelState[] // see step4 }, meta: { @@ -363,17 +367,20 @@ Request messages use the following format: ```typescript { - /** Typically set to the FDC3 function name that the message relates to, e.g. "findIntent" */ + /** Typically set to the FDC3 function name that the message relates to, e.g. + * "findIntent" */ type: string, /** Request body, typically containing the arguments to the function called.*/ payload: { - /** Used to indicate which channel `broadcast` functions were called on. */ + /** Used to indicate which channel `broadcast` functions were called on.*/ channel?: string, /** Used as an argument to `findIntent` and `raiseIntent` functions.`*/ intent?: string, - /** Used as an argument to `broadcast`, `findIntent` and `raiseIntent` functions. */ + /** Used as an argument to `broadcast`, `findIntent` and `raiseIntent` + * functions.*/ context?: Context, - /** Used as an argument to `open`, `raiseIntent`, `getAppMetadata`, and `findInstances` functions */ + /** Used as an argument to `open`, `raiseIntent`, `getAppMetadata`, and + * `findInstances` functions.*/ app?: AppIdentifier, /** Used as an argument to `findIntent` functions. */ resultType?: string, @@ -386,14 +393,15 @@ Request messages use the following format: requestGuid: string, /** Timestamp at which request was generated */ timestamp: date, - /** AppIdentifier OR DesktopAgentIdentifier for the source application that the request was - * received from and will be augmented with the assigned name of the - * Desktop Agent by the Desktop Agent Bridge, rather than the sender. */ + /** AppIdentifier OR DesktopAgentIdentifier for the source application + * that the request was received from and will be augmented with the + * assigned name of the Desktop Agent by the Desktop Agent Bridge, + * rather than the sender. */ source: AppIdentifier | DesktopAgentIdentifier, - /** Optional AppIdentifier or DesktopAgentIdentifier for the destination that the request should be - * routed to, which MUST be set by the Desktop Agent for API calls that - * include a target (`app`) parameter. MUST include the name of the - * Desktop Agent hosting the target application. */ + /** Optional AppIdentifier or DesktopAgentIdentifier for the destination + * that the request should be routed to, which MUST be set by the Desktop + * Agent for API calls that include a target (`app`) parameter. MUST + * include the name of the Desktop Agent hosting the target application. */ destination?: AppIdentifier | DesktopAgentIdentifier } } @@ -409,11 +417,12 @@ Response messages will be differentiated from requests by the presence of a `met ```typescript { - /** FDC3 function name the original request related to, e.g. "findIntent" */ + /** FDC3 function name the original request related to, e.g. "findIntent"*/ type: string, /** Response body, containing the actual response data. */ payload: { - /** Standardized error strings from an appropriate FDC3 API Error enumeration. */ + /** Standardized error strings from an appropriate FDC3 API Error + * enumeration. */ error?: string, /** Response to `open` */ appIdentifier?: AppIdentifier, @@ -425,12 +434,16 @@ Response messages will be differentiated from requests by the presence of a `met appIntent?: AppIntent, /** Response to `findIntentsByContext`*/ appIntents?: AppIntent[], - /** Response to `raiseIntent` functions, returned on delivery of the intent and context to the target app. + /** Response to `raiseIntent` functions, returned on delivery of the + * intent and context to the target app. * Note `getResult()` function should not / can not be included in JSON. */ intentResolution?: IntentResolution, - /** Secondary response to `raiseIntent`, sent when the `IntentHandler` has returned. - * Note return an empty object if the `IntentHandler` returned void. - * Note `Channel` functions (`broadcast`, `getCurrentContext`, `addContextListener` should not / can not be included in JSON)*/ + /** Secondary response to `raiseIntent`, sent when the `IntentHandler` + * has returned. + * Note: + * - return an empty object if the `IntentHandler` returned void. + * - `Channel` functions (`broadcast`, `getCurrentContext`, + * `addContextListener` do not need to be included in JSON).*/ intentResult?: {context?: Context, channel?: Channel}, }, meta: { @@ -440,18 +453,19 @@ Response messages will be differentiated from requests by the presence of a `met responseGuid: string, /** Timestamp at which request was generated */ timestamp: Date, - /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge.*/ + /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources + * that generated responses to the request. Will contain a single value + * for individual responses and multiple values for responses that were + * collated by the bridge.*/ sources: (AppIdentifier | DesktopAgentIdentifier)[], - /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. - * May be omitted if all sources responded. */ + /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that + * were not returned to the bridge before the timeout or because an error + * occurred. May be omitted if all sources responded. */ errorSources: (AppIdentifier | DesktopAgentIdentifier)[], /** Array of error message strings for responses that were not returned * to the bridge before the timeout or because an error occurred. - * Should be the same length as the `errorSources array and ordered the same. - * May be omitted if all sources responded. */ + * Should be the same length as the `errorSources` array and ordered the + * same. May be omitted if all sources responded. */ errorDetails: string[] } } @@ -475,7 +489,7 @@ There are several types of GUIDs, which vary how they are generated. As Desktop ### Identifying Desktop Agents Identity and Message Sources -Desktop Agents will prepare messages in the above format and transmit them to the bridge. However, to target intents and perform other actions that require specific routing between DAs, DAs need to have an identity. Identities should be assigned to clients when they connect to the bridge. This allows for multiple copies of the same underlying Desktop Agent implementation to be bridged and ensures that id clashes can be avoided. +Desktop Agents will prepare messages in the above format and transmit them to the bridge. However, to target intents and perform other actions that require specific routing between DAs, DAs need to have an identity. Identities should be assigned to Desktop Agents when they connect to the bridge. This allows for multiple copies of the same underlying Desktop Agent implementation to be bridged and ensures that identity clashes can be avoided. To facilitate routing of messages between agents, the `AppIdentifier` is expanded to contain an optional `desktopAgent` field: @@ -492,7 +506,8 @@ Further, a new `DesktopAgentIdentifier` type is introduced to handle cases where ```typescript interface DesktopAgentIdentifier { - /** A field that represents the Desktop Agent that should be targeted or that a response was received from. **/ + /** A field that represents the Desktop Agent that should be targeted or that + * a response was received from. **/ readonly desktopAgent: string; } ``` From d7c225176b472b41cb87c442767ea6183b797afa Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Apr 2023 18:20:02 +0100 Subject: [PATCH 024/106] Update details on inter-agent communication --- docs/api/spec.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/api/spec.md b/docs/api/spec.md index f37baab1f..c68e6fc37 100644 --- a/docs/api/spec.md +++ b/docs/api/spec.md @@ -84,13 +84,13 @@ Are all areas of functionality that any feature-complete desktop agent would imp ### Inter-Agent Communication -A goal of FDC3 standards is that applications running in different Desktop Agent contexts on the same desktop would be able to interoperate. And that one Desktop Agent context would be able to discover and launch an application in another Desktop Application context. +A goal of the FDC3 Standard is that applications running in different Desktop Agent contexts on the same desktop, or operated by the same user, would be able to interoperate. And that one Desktop Agent context would be able to discover and launch an application in another Desktop Application context. As Desktop Agent interop is supported by common standards for APIs for App discovery and launching. So, an App in one Desktop Agent context would not need to know a different syntax to call an App in another Desktop Agent context. -![Desktop Agent - Interop](/assets/api-2.png) +Inter-agent communication at the API layer may be achieved via the [Desktop Agent Bridging Part of the FDC3 Standard](../api-bridging/spec) *(Experimental)*, which defines an independent service that Desktop Agents may connect to, and a protocol for the exchange of messages relating to FDC3 API calls that are currently in-flight. Hence, by implementing support for Desktop Agent Bridging a platform may extend interop across applications running in multiple Desktop Agent contexts. -Desktop Agent interop is supported by common standards for APIs for App discovery and launching. So, an App in one Desktop Agent context would not need to know a different syntax to call an App in another Desktop Agent context. +Desktop Agent Bridging provide message exchanges and a workflow for performing intent resolution across multiple agents, allowing programmatic or UI based access to intent resolution options across multiple agents. Hence, app discovery is supported across the agents for intent-based workflows. Further, as channels are also supported by bridging, context sharing also works across multiple agents. However, as there is no method of discovering all the apps supported by a Desktop Agent in the FDC3 API nor bridging application details must be known in advance to support `fdc3.open` calls. -An actual connection protocol between Desktop Agents is not currently available in the FDC3 standard, but work on creating one for a future version of the standard is underway (see [GitHub discussion #544](https://github.com/finos/FDC3/discussions/544) for details). +![Desktop Agent - Interop](/assets/api-2.png) ### Desktop Agent API Standard Compliance @@ -399,8 +399,8 @@ There are three types of channels, which have different visibility and discovera 3. **Private** channels, which: - - facilitate private communication between two parties, - - have an auto-generated identity and can only be retrieved via a raised intent. +- facilitate private communication between two parties, +- have an auto-generated identity and can only be retrieved via a raised intent. Channels are interacted with via `broadcast` and `addContextListener` functions, allowing an application to send and receive Context objects via the channel. For User channels, these functions are provided on the Desktop Agent, e.g. [`fdc3.broadcast(context)`](ref/DesktopAgent#broadcast), and apply to channels joined via [`fdc3.joinUserChannel`](ref/DesktopAgent#joinuserchannel). For App channels, a channel object must be retrieved, via [`fdc3.getOrCreateChannel(channelName)`](ref/DesktopAgent#getorcreatechannel), which provides the functions, i.e. [`myChannel.broadcast(context)`](ref/Channel#broadcast) and [`myChannel.addContextListener(context)`](ref/Channel#addcontextlistener). For `PrivateChannels`, a channel object must also be retrieved, but via an intent raised with [`fdc3.raiseIntent(intent, context)`](ref/DesktopAgent#raiseintent) and returned as an [`IntentResult`](ref/Types#intentresult). @@ -408,7 +408,7 @@ Channel implementations SHOULD ensure that context messages broadcast by an appl ### Joining User Channels -Apps can join _User channels_. An app can only be joined to one User channel at a time. +Apps can join *User channels*. An app can only be joined to one User channel at a time. When an app is joined to a User channel, calls to [`fdc3.broadcast`](ref/DesktopAgent#broadcast) will be routed to that channel and listeners added through [`fdc3.addContextListener`](ref/DesktopAgent#addcontextlistener) will receive context broadcasts from other apps also joined to that channel. If an app is not joined to a User channel [`fdc3.broadcast`](ref/DesktopAgent#broadcast) will be a no-op and handler functions added with [`fdc3.addContextListener`](ref/DesktopAgent#addcontextlistener) will not receive any broadcasts. However, apps can still choose to listen and broadcast to specific channels (both User and App channels) via the methods on the [`Channel`](ref/Channel) class. From 6830c73b187d3d1d0ae39743c3ffc856edeb3746 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 17:23:43 +0100 Subject: [PATCH 025/106] Experimental flags + improving some comments --- docs/api-bridging/ref/raiseIntent.md | 26 ++++----- docs/api-bridging/spec.md | 87 +++++++++++++++++----------- docs/api/ref/Types.md | 11 ++-- docs/api/spec.md | 8 ++- src/api/AppIdentifier.ts | 4 +- src/api/DesktopAgentIdentifier.ts | 6 +- website/data/features/bridging.mdx | 4 +- 7 files changed, 85 insertions(+), 61 deletions(-) diff --git a/docs/api-bridging/ref/raiseIntent.md b/docs/api-bridging/ref/raiseIntent.md index 8287fc5d3..ab73d43b2 100644 --- a/docs/api-bridging/ref/raiseIntent.md +++ b/docs/api-bridging/ref/raiseIntent.md @@ -185,22 +185,20 @@ The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.des } ``` -When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application. +When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application (setting either `payload.context` or `payload.channel` to indicate the type of the `IntentResult`). ```json // agent-B -> DAB { "type": "raiseIntentResultResponse", "payload": { - "intentResult": { - "context": {/*contextObj*/} - /* for a channel IntentResult use: - "channel": { - "id": "app-channel xyz", - "type": "user" - } - */ + "context": {/*contextObj*/} + /* for a channel IntentResult use: + "channel": { + "id": "app-channel xyz", + "type": "user" } + */ }, "meta": { "requestGuid": "", @@ -227,9 +225,7 @@ Finally, the bridge augments the response with `sources[0].desktopAgent` and pas { "type": "raiseIntentResultResponse", "payload": { - "intentResult": { - "context": {/*contextObj*/} - } + "context": {/*contextObj*/} }, "meta": { "requestGuid": "", @@ -244,15 +240,13 @@ Finally, the bridge augments the response with `sources[0].desktopAgent` and pas } ``` -If the `IntentHandler` returned `void` rather than an intent result `payload.intentResult` should be empty, e.g.: +If the `IntentHandler` returned `void` rather than an intent result `payload` should be empty, e.g.: ```json // DAB -> agent-A { "type": "raiseIntentResultResponse", - "payload": { - "intentResult": {} - }, + "payload": {}, "meta": { "requestGuid": "", "responseGuid": "", diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 2adad62ce..87cd830d8 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -4,7 +4,13 @@ sidebar_label: Overview title: API Bridging Overview (next) --- -(Experimental) The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. +:::info _[Experimental](../fdc3-compliance#experimental-features)_ + +Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, it's design may change in future and it is exempted from the FDC3 Standards's normal versioning and deprecation polices in order to facilitate any necessary change. + +::: + +The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. @@ -12,10 +18,10 @@ In any Desktop Agent Bridging scenario, it is expected that each DA is being ope * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: - * Reference DAB from the API spec, updating previous content about interconnecting desktop agents. * Link to BackPlane project - * Apply Experimental labels where needed -* Refactor spec to separate channel (websocket) and protocol. + * Refactor spec to separate channel (websocket) and protocol. + * Add schema links to each message exchange + * Add detail about Typescript generated from the schemas ## Implementing a Desktop Agent Bridge @@ -441,10 +447,13 @@ Response messages will be differentiated from requests by the presence of a `met /** Secondary response to `raiseIntent`, sent when the `IntentHandler` * has returned. * Note: - * - return an empty object if the `IntentHandler` returned void. + * - return an empty payload object if the `IntentHandler` returned void. * - `Channel` functions (`broadcast`, `getCurrentContext`, - * `addContextListener` do not need to be included in JSON).*/ - intentResult?: {context?: Context, channel?: Channel}, + * `addContextListener` do not need to be included in JSON).*/ + intentResult?: { + context?: Context, + channel?: Channel + } }, meta: { /** requestGuid from the original request being responded to*/ @@ -456,17 +465,18 @@ Response messages will be differentiated from requests by the presence of a `met /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources * that generated responses to the request. Will contain a single value * for individual responses and multiple values for responses that were - * collated by the bridge.*/ - sources: (AppIdentifier | DesktopAgentIdentifier)[], + * collated by the bridge. May be ommitted if all sources returned an + * error. */ + sources?: (AppIdentifier | DesktopAgentIdentifier)[], /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that * were not returned to the bridge before the timeout or because an error * occurred. May be omitted if all sources responded. */ - errorSources: (AppIdentifier | DesktopAgentIdentifier)[], + errorSources?: (AppIdentifier | DesktopAgentIdentifier)[], /** Array of error message strings for responses that were not returned * to the bridge before the timeout or because an error occurred. * Should be the same length as the `errorSources` array and ordered the * same. May be omitted if all sources responded. */ - errorDetails: string[] + errorDetails?: string[] } } ``` @@ -497,7 +507,11 @@ To facilitate routing of messages between agents, the `AppIdentifier` is expande interface AppIdentifier { readonly appId: string; readonly instanceId?: string; - /** Field that represents the Desktop Agent that the app is available on.**/ + /** The Desktop Agent that the app is available on. Used in Desktop Agent + * Bridging to identify the Desktop Agent to target. + * @experimental Introduced in FDC3 2.1 and may be refined by further changes + * outside the normal FDC3 versioning policy. + **/ readonly desktopAgent?: string; } ``` @@ -505,9 +519,11 @@ interface AppIdentifier { Further, a new `DesktopAgentIdentifier` type is introduced to handle cases where a request needs to be directed to a Desktop Agent rather than a specific app, or a response message is returned by the Desktop Agent (or more specifically its resolver) rather than a specific app. This is particularly relevant for `findIntent` message exchanges: ```typescript +/** @experimental Introduced in FDC3 2.1 and may be refined by further changes + * outside the normal FDC3 versioning policy. interface DesktopAgentIdentifier { - /** A field that represents the Desktop Agent that should be targeted or that - * a response was received from. **/ + /** Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. */ readonly desktopAgent: string; } ``` @@ -598,34 +614,39 @@ Collated response messages generated by the bridge use the same format as indivi The following pseudo-code defines how messages should be forwarded or collated by the bridge: -* if the message is a request (`meta.requestGuid` is set, but `meta.responseGuid` is not), - * and the message does not include a `meta.destination` field, - * forward it to all other Desktop Agents (not including the source), - * annotate the request as requiring responses from all other connected agents, - * await responses or the specified timeout. - * else if a `meta.destination` was included, +* **if** the message is a request (`meta.requestGuid` is set, but `meta.responseGuid` is not), + * **if** the message includes a `meta.destination` field, * forward it to the specified destination agent, * annotate the request as requiring only a response from the specified agent, * await the response or the specified timeout. -* else if the message is a response (both `meta.requestGuid` and `meta.responseGuid` are set) - * if the `meta.requestGuid` is known, + * **else** + * forward it to all other Desktop Agents (not including the source), + * annotate the request as requiring responses from all other connected agents, + * await responses or the specified timeout. +* **else if** the message is a response (both `meta.requestGuid` and `meta.responseGuid` are set) + * **if** the `meta.requestGuid` is known, * augment any `AppIdentifier` types in the response message with a `desktopAgent` field matching that of the responding Desktop Agent, - * if `payload.error` is set in the response add the DesktopAgentIdentifier to the `meta.errorSources` element. - * else add the DesktopAgentIdentifier to the `meta.sources` element. - * if the message exchange requires collation, + * **if** `payload.error` is set in the response add the DesktopAgentIdentifier to the `meta.errorSources` element. + * **else** + * add the DesktopAgentIdentifier to the `meta.sources` element. + * **if** the message exchange requires collation, * add the message to the collated responses for the request, - * if all expected responses have been received (i.e. all connected agents or the specified agent has responded, as appropriate), + * **if** all expected responses have been received (i.e. all connected agents or the specified agent has responded, as appropriate), * produce the collated response message and return to the requesting Desktop Agent. - * else await the configured response timeout or further responses, - * if the timeout is reached without any responses being received + * **else** + * await the configured response timeout or further responses, + * **if** the timeout is reached without any responses being received * produce and return an appropriate [error response](../api/ref/Errors), including details of all Desktop Agents in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. - * else if the timeout is reached with a partial set of responses, + * **else if** the timeout is reached with a partial set of responses, * produce and return, to requesting Desktop Agent, a collated response and include details of Desktop Agents that timed out in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. - * else forward the response message on to requesting Desktop Agent. - * else discard the response message (as it is a delayed to a request that has timed out or is otherwise invalid). -* else the message is invalid and should be discarded. + * **else** + * forward the response message on to requesting Desktop Agent. + * **else** + * discard the response message (as it is a delayed to a request that has timed out or is otherwise invalid). +* **else** + * the message is invalid and should be discarded. ### Workflows Broken By Disconnects @@ -696,7 +717,7 @@ Message exchanges come in a number of formats, which are known as: The message exchanges defined are: * [`broadcast`](ref/broadcast) -* [`findInstances](ref/findInstances) +* [`findInstances`](ref/findInstances) * [`findIntent`](ref/findIntent) * [`findIntentsByContext`](ref/findIntentsByContext) * [`getAppMetadata`](ref/getAppMetadata) diff --git a/docs/api/ref/Types.md b/docs/api/ref/Types.md index 716aed22b..34c8ca8a3 100644 --- a/docs/api/ref/Types.md +++ b/docs/api/ref/Types.md @@ -22,8 +22,10 @@ interface AppIdentifier { */ readonly instanceId?: string; - /** (Experimental) Field that represents the Desktop Agent that the app is - * available on. Used in Desktop Agent Bridging.**/ + /** The Desktop Agent that the app is available on. Used in Desktop Agent + * Bridging to identify the Desktop Agent to target. + * @experimental + **/ readonly desktopAgent?: string; } ``` @@ -87,9 +89,10 @@ Optional metadata about the context message, including the app that originated t ## `DesktopAgentIdentifier` ```typescript +/** @experimental */ interface DesktopAgentIdentifier { - /** (Experimental) Field that represents the Desktop Agent that the app is - * available on.**/ + /** Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent.**/ readonly desktopAgent: string; } ``` diff --git a/docs/api/spec.md b/docs/api/spec.md index c68e6fc37..ffc82685e 100644 --- a/docs/api/spec.md +++ b/docs/api/spec.md @@ -84,11 +84,13 @@ Are all areas of functionality that any feature-complete desktop agent would imp ### Inter-Agent Communication -A goal of the FDC3 Standard is that applications running in different Desktop Agent contexts on the same desktop, or operated by the same user, would be able to interoperate. And that one Desktop Agent context would be able to discover and launch an application in another Desktop Application context. As Desktop Agent interop is supported by common standards for APIs for App discovery and launching. So, an App in one Desktop Agent context would not need to know a different syntax to call an App in another Desktop Agent context. +A goal of the FDC3 Standard is that applications running in different Desktop Agent contexts on the same desktop, or operated by the same user, would be able to interoperate and that one Desktop Agent context would be able to discover and launch an application in another Desktop Application context. As Desktop Agent interop is supported by common standards for APIs an App in one Desktop Agent context would not need to know a different syntax to launch or interact with an App in another Desktop Agent context. -Inter-agent communication at the API layer may be achieved via the [Desktop Agent Bridging Part of the FDC3 Standard](../api-bridging/spec) *(Experimental)*, which defines an independent service that Desktop Agents may connect to, and a protocol for the exchange of messages relating to FDC3 API calls that are currently in-flight. Hence, by implementing support for Desktop Agent Bridging a platform may extend interop across applications running in multiple Desktop Agent contexts. +Inter-agent communication at the API layer may be achieved via the [Desktop Agent Bridging Part of the FDC3 Standard](../api-bridging/spec) *([Experimental](../fdc3-compliance#experimental-features))*, which defines an independent service that Desktop Agents may connect to, and a protocol for the exchange of messages relating to FDC3 API calls. Hence, by implementing support for Desktop Agent Bridging, a platform may extend interop across applications running in multiple Desktop Agent contexts. -Desktop Agent Bridging provide message exchanges and a workflow for performing intent resolution across multiple agents, allowing programmatic or UI based access to intent resolution options across multiple agents. Hence, app discovery is supported across the agents for intent-based workflows. Further, as channels are also supported by bridging, context sharing also works across multiple agents. However, as there is no method of discovering all the apps supported by a Desktop Agent in the FDC3 API nor bridging application details must be known in advance to support `fdc3.open` calls. +Desktop Agent Bridging provides message exchanges and a workflow for performing intent resolution across multiple agents. Hence, app discovery is supported across the agents connected to the bridge for intent-based workflows. Further, as channels are also supported by bridging, context sharing also works across multiple agents. + +There is currently no method of discovering all the apps supported by a Desktop Agent in the FDC3 API nor bridging. Hence, to support launching, vis `fdc3.open` across the connected Desktop Agents, application details must be known in advance. This may be achieved by connecting Desktop Agents to the same App Directories. ![Desktop Agent - Interop](/assets/api-2.png) diff --git a/src/api/AppIdentifier.ts b/src/api/AppIdentifier.ts index 1bf9cb7a6..6cfdfe12b 100644 --- a/src/api/AppIdentifier.ts +++ b/src/api/AppIdentifier.ts @@ -17,6 +17,8 @@ export interface AppIdentifier { /** An optional instance identifier, indicating that this object represents a specific instance of the application described.*/ readonly instanceId?: string; - /** (Experimental) Field that represents the Desktop Agent that the app is available on. Used in Desktop Agent Bridging.**/ + /** The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to identify the Desktop Agent to target. + * @experimental Introduced in FDC3 2.1 and may be refined by further changes outside the normal FDC3 versioning policy. + **/ readonly desktopAgent?: string; } diff --git a/src/api/DesktopAgentIdentifier.ts b/src/api/DesktopAgentIdentifier.ts index 850c2f948..2c073b32d 100644 --- a/src/api/DesktopAgentIdentifier.ts +++ b/src/api/DesktopAgentIdentifier.ts @@ -4,13 +4,15 @@ */ /** - * (Experimental) Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. + * @experimental */ export interface DesktopAgentIdentifier { - /** (Experimental) Field that represents the Desktop Agent that the app is available on. Used in Desktop Agent Bridging. */ + /** Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. */ readonly desktopAgent: string; } diff --git a/website/data/features/bridging.mdx b/website/data/features/bridging.mdx index 6453a2faf..243384e19 100644 --- a/website/data/features/bridging.mdx +++ b/website/data/features/bridging.mdx @@ -1,7 +1,7 @@ - +
API Bridging
-(Experimental) Link to or more Desktop Agents together via a bridge to extend interop across them. \ No newline at end of file +(Experimental) Link to or more Desktop Agents together via a bridge to extend interop across them. \ No newline at end of file From 37d2f53c9c557514039bb855a74cd705f0c4f7e3 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Tue, 25 Apr 2023 09:51:06 -0700 Subject: [PATCH 026/106] new schema structure (#65) * new schema structure quicktypeUtils update npm scripts update * PR feedback * cleanup * typos * fix type generation folder * Fixed schema structures * copy schemas to website * package json update * removed defunct file * make sources optional * cleanup * Update schemas/bridging/raiseIntentResultResponse.schema.json Co-authored-by: Kris West * cleanup * regenerated types * PR feedback * Fixe meta for requests * Apply suggestions from code review * Regenerating bridging typescript * Apply suggestions from code review * adjust OptionalFeatures and IntentResult schemas --------- Co-authored-by: Kris West --- docs/api-bridging/spec.md | 1 + docs/api/ref/Metadata.md | 3 + package-lock.json | 4 +- package.json | 5 +- quicktypeUtil.js | 54 +- .../api}/appIdentifier.schema.json | 7 +- .../api}/appIntent.schema.json | 6 +- .../api}/appMetadata.schema.json | 25 +- .../api}/channel.schema.json | 4 +- .../api}/contextMetadata.schema.json | 4 +- .../api/desktopAgentIdentifier.schema.json | 16 + .../api}/displayMetadata.schema.json | 2 +- .../api}/errors.schema.json | 17 +- .../schemas => schemas/api}/icon.schema.json | 2 +- .../schemas => schemas/api}/image.schema.json | 2 +- .../api/implementationMetadata.schema.json | 47 + .../api}/intentMetadata.schema.json | 3 +- .../api}/intentResolution.schema.json | 4 +- .../api}/intentResult.schema.json | 8 +- schemas/bridging/bridgeRequest.schema.json | 61 + schemas/bridging/bridgeResponse.schema.json | 79 + schemas/bridging/broadcastRequest.schema.json | 44 + .../bridging/findInstancesRequest.schema.json | 41 + .../findInstancesResponse.schema.json | 49 + .../bridging/findIntentRequest.schema.json | 44 + .../bridging/findIntentResponse.schema.json | 45 + .../findIntentsForContextRequest.schema.json | 41 + .../findIntentsForContextResponse.schema.json | 48 + .../getAppMetadataRequest.schema.json | 41 + .../getAppMetadataResponse.schema.json | 46 + schemas/bridging/openRequest.schema.json | 46 + schemas/bridging/openResponse.schema.json | 46 + .../bridging/raiseIntentRequest.schema.json | 44 + .../bridging/raiseIntentResponse.schema.json | 46 + .../raiseIntentResultResponse.schema.json | 61 + .../context}/chart.schema.json | 2 +- .../context}/chatInitSettings.schema.json | 2 +- .../context}/contact.schema.json | 2 +- .../context}/contactList.schema.json | 2 +- .../context}/context.schema.json | 3 +- .../context}/country.schema.json | 2 +- .../context}/currency.schema.json | 2 +- .../context}/email.schema.json | 2 +- .../context}/instrument.schema.json | 2 +- .../context}/instrumentList.schema.json | 2 +- .../context}/nothing.schema.json | 2 +- .../context}/organization.schema.json | 2 +- .../context}/portfolio.schema.json | 2 +- .../context}/position.schema.json | 2 +- .../context}/timerange.schema.json | 2 +- .../context}/valuation.schema.json | 2 +- src/api/ImplementationMetadata.ts | 3 + src/bridging/BridgingTypes.ts | 2126 +++++++++++++++++ src/context/README.md | 6 +- src/context/schemas.json | 18 - website/package.json | 2 +- .../next/api/appIdentifier.schema.json | 22 + .../schemas/next/api/appIntent.schema.json | 23 + .../schemas/next/api/appMetadata.schema.json | 54 + .../schemas/next/api/channel.schema.json | 28 + .../next/api/contextMetadata.schema.json | 16 + .../api/desktopAgentIdentifier.schema.json | 16 + .../next/api/displayMetadata.schema.json | 19 + .../schemas/next/api/errors.schema.json | 57 + .../static/schemas/next/api/icon.schema.json | 22 + .../static/schemas/next/api/image.schema.json | 25 + .../api}/implementationMetadata.schema.json | 4 +- .../next/api/intentMetadata.schema.json | 19 + .../next/api/intentResolution.schema.json | 23 + .../schemas/next/api/intentResult.schema.json | 15 + .../next/bridging/bridgeRequest.schema.json | 60 + .../next/bridging/bridgeResponse.schema.json | 79 + .../bridging/broadcastRequest.schema.json | 44 + .../bridging/findInstancesRequest.schema.json | 41 + .../findInstancesResponse.schema.json | 49 + .../bridging/findIntentRequest.schema.json | 44 + .../bridging/findIntentResponse.schema.json | 45 + .../findIntentsForContextRequest.schema.json | 41 + .../findIntentsForContextResponse.schema.json | 48 + .../getAppMetadataRequest.schema.json | 41 + .../getAppMetadataResponse.schema.json | 46 + .../next/bridging/openRequest.schema.json | 46 + .../next/bridging/openResponse.schema.json | 46 + .../bridging/raiseIntentRequest.schema.json | 44 + .../bridging/raiseIntentResponse.schema.json | 46 + .../raiseIntentResultResponse.schema.json | 61 + .../next/{ => context}/chart.schema.json | 2 +- .../chatInitSettings.schema.json | 2 +- .../schemas/next/context}/contact.schema.json | 2 +- .../next/context}/contactList.schema.json | 2 +- .../next/{ => context}/context.schema.json | 5 +- .../schemas/next/context}/country.schema.json | 2 +- .../next/{ => context}/currency.schema.json | 2 +- .../schemas/next/context}/email.schema.json | 2 +- .../next/{ => context}/instrument.schema.json | 6 +- .../next/context}/instrumentList.schema.json | 2 +- .../schemas/next/context}/nothing.schema.json | 2 +- .../next/context}/organization.schema.json | 2 +- .../next/{ => context}/portfolio.schema.json | 2 +- .../next/context}/position.schema.json | 2 +- .../next/{ => context}/timerange.schema.json | 2 +- .../next/{ => context}/valuation.schema.json | 2 +- 102 files changed, 4230 insertions(+), 117 deletions(-) rename {src/api/schemas => schemas/api}/appIdentifier.schema.json (71%) rename {src/api/schemas => schemas/api}/appIntent.schema.json (63%) rename {src/api/schemas => schemas/api}/appMetadata.schema.json (68%) rename {src/api/schemas => schemas/api}/channel.schema.json (78%) rename {src/api/schemas => schemas/api}/contextMetadata.schema.json (70%) create mode 100644 schemas/api/desktopAgentIdentifier.schema.json rename {src/api/schemas => schemas/api}/displayMetadata.schema.json (87%) rename {src/api/schemas => schemas/api}/errors.schema.json (74%) rename {src/api/schemas => schemas/api}/icon.schema.json (87%) rename {src/api/schemas => schemas/api}/image.schema.json (88%) create mode 100644 schemas/api/implementationMetadata.schema.json rename {src/api/schemas => schemas/api}/intentMetadata.schema.json (82%) rename {src/api/schemas => schemas/api}/intentResolution.schema.json (75%) rename {src/api/schemas => schemas/api}/intentResult.schema.json (57%) create mode 100644 schemas/bridging/bridgeRequest.schema.json create mode 100644 schemas/bridging/bridgeResponse.schema.json create mode 100644 schemas/bridging/broadcastRequest.schema.json create mode 100644 schemas/bridging/findInstancesRequest.schema.json create mode 100644 schemas/bridging/findInstancesResponse.schema.json create mode 100644 schemas/bridging/findIntentRequest.schema.json create mode 100644 schemas/bridging/findIntentResponse.schema.json create mode 100644 schemas/bridging/findIntentsForContextRequest.schema.json create mode 100644 schemas/bridging/findIntentsForContextResponse.schema.json create mode 100644 schemas/bridging/getAppMetadataRequest.schema.json create mode 100644 schemas/bridging/getAppMetadataResponse.schema.json create mode 100644 schemas/bridging/openRequest.schema.json create mode 100644 schemas/bridging/openResponse.schema.json create mode 100644 schemas/bridging/raiseIntentRequest.schema.json create mode 100644 schemas/bridging/raiseIntentResponse.schema.json create mode 100644 schemas/bridging/raiseIntentResultResponse.schema.json rename {src/context/schemas => schemas/context}/chart.schema.json (89%) rename {src/context/schemas => schemas/context}/chatInitSettings.schema.json (88%) rename {website/static/schemas/next => schemas/context}/contact.schema.json (83%) rename {website/static/schemas/next => schemas/context}/contactList.schema.json (81%) rename {src/context/schemas => schemas/context}/context.schema.json (75%) rename {website/static/schemas/next => schemas/context}/country.schema.json (86%) rename {src/context/schemas => schemas/context}/currency.schema.json (84%) rename {website/static/schemas/next => schemas/context}/email.schema.json (86%) rename {src/context/schemas => schemas/context}/instrument.schema.json (92%) rename {website/static/schemas/next => schemas/context}/instrumentList.schema.json (81%) rename {website/static/schemas/next => schemas/context}/nothing.schema.json (73%) rename {website/static/schemas/next => schemas/context}/organization.schema.json (84%) rename {src/context/schemas => schemas/context}/portfolio.schema.json (81%) rename {website/static/schemas/next => schemas/context}/position.schema.json (82%) rename {src/context/schemas => schemas/context}/timerange.schema.json (86%) rename {src/context/schemas => schemas/context}/valuation.schema.json (87%) create mode 100644 src/bridging/BridgingTypes.ts delete mode 100644 src/context/schemas.json create mode 100644 website/static/schemas/next/api/appIdentifier.schema.json create mode 100644 website/static/schemas/next/api/appIntent.schema.json create mode 100644 website/static/schemas/next/api/appMetadata.schema.json create mode 100644 website/static/schemas/next/api/channel.schema.json create mode 100644 website/static/schemas/next/api/contextMetadata.schema.json create mode 100644 website/static/schemas/next/api/desktopAgentIdentifier.schema.json create mode 100644 website/static/schemas/next/api/displayMetadata.schema.json create mode 100644 website/static/schemas/next/api/errors.schema.json create mode 100644 website/static/schemas/next/api/icon.schema.json create mode 100644 website/static/schemas/next/api/image.schema.json rename {src/api/schemas => website/static/schemas/next/api}/implementationMetadata.schema.json (86%) create mode 100644 website/static/schemas/next/api/intentMetadata.schema.json create mode 100644 website/static/schemas/next/api/intentResolution.schema.json create mode 100644 website/static/schemas/next/api/intentResult.schema.json create mode 100644 website/static/schemas/next/bridging/bridgeRequest.schema.json create mode 100644 website/static/schemas/next/bridging/bridgeResponse.schema.json create mode 100644 website/static/schemas/next/bridging/broadcastRequest.schema.json create mode 100644 website/static/schemas/next/bridging/findInstancesRequest.schema.json create mode 100644 website/static/schemas/next/bridging/findInstancesResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentRequest.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentsForContextResponse.schema.json create mode 100644 website/static/schemas/next/bridging/getAppMetadataRequest.schema.json create mode 100644 website/static/schemas/next/bridging/getAppMetadataResponse.schema.json create mode 100644 website/static/schemas/next/bridging/openRequest.schema.json create mode 100644 website/static/schemas/next/bridging/openResponse.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentRequest.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json rename website/static/schemas/next/{ => context}/chart.schema.json (89%) rename website/static/schemas/next/{ => context}/chatInitSettings.schema.json (88%) rename {src/context/schemas => website/static/schemas/next/context}/contact.schema.json (83%) rename {src/context/schemas => website/static/schemas/next/context}/contactList.schema.json (81%) rename website/static/schemas/next/{ => context}/context.schema.json (62%) rename {src/context/schemas => website/static/schemas/next/context}/country.schema.json (86%) rename website/static/schemas/next/{ => context}/currency.schema.json (84%) rename {src/context/schemas => website/static/schemas/next/context}/email.schema.json (86%) rename website/static/schemas/next/{ => context}/instrument.schema.json (86%) rename {src/context/schemas => website/static/schemas/next/context}/instrumentList.schema.json (81%) rename {src/context/schemas => website/static/schemas/next/context}/nothing.schema.json (73%) rename {src/context/schemas => website/static/schemas/next/context}/organization.schema.json (84%) rename website/static/schemas/next/{ => context}/portfolio.schema.json (81%) rename {src/context/schemas => website/static/schemas/next/context}/position.schema.json (82%) rename website/static/schemas/next/{ => context}/timerange.schema.json (86%) rename website/static/schemas/next/{ => context}/valuation.schema.json (87%) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 87cd830d8..b8744b915 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -476,6 +476,7 @@ Response messages will be differentiated from requests by the presence of a `met * to the bridge before the timeout or because an error occurred. * Should be the same length as the `errorSources` array and ordered the * same. May be omitted if all sources responded. */ + errorDetails?: string[] } } diff --git a/docs/api/ref/Metadata.md b/docs/api/ref/Metadata.md index 48d778d97..637454b40 100644 --- a/docs/api/ref/Metadata.md +++ b/docs/api/ref/Metadata.md @@ -279,6 +279,9 @@ interface ImplementationMetadata { * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by * the Desktop Agent.*/ "UserChannelMembershipAPIs": boolean; + /** Used to indicate whether the experimental Desktop Agent Bridging + * feature is implemented by the Desktop Agent.*/ + DesktopAgentBridging: boolean; }; /** The calling application instance's own metadata, according to the diff --git a/package-lock.json b/package-lock.json index 25760cb56..d4f6cd8d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@finos/fdc3", - "version": "2.0.0-beta.5", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@finos/fdc3", - "version": "2.0.0-beta.5", + "version": "2.0.0", "license": "Apache-2.0", "devDependencies": { "husky": "^4.3.0", diff --git a/package.json b/package.json index af65b08da..c6bc4b5c7 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,14 @@ }, "scripts": { "start": "tsdx watch", + "prebuild": "npm run typegen && npm run typegen-bridging", "build": "tsdx build", "test": "tsdx test --verbose", "lint": "tsdx lint src/api test", + "preprepare": "npm run typegen && npm run typegen-bridging", "prepare": "tsdx build", - "typegen": "node quicktypeUtil.js src/context/schemas src/context/ContextTypes.ts && tsdx lint src/context --fix" + "typegen": "node quicktypeUtil.js schemas/context src/context/ContextTypes.ts && tsdx lint src/context/ --fix", + "typegen-bridging": "node quicktypeUtil.js schemas/api schemas/bridging schemas/context/context.schema.json src/bridging/BridgingTypes.ts && tsdx lint src/bridging/ --fix" }, "peerDependencies": {}, "husky": { diff --git a/quicktypeUtil.js b/quicktypeUtil.js index 735918780..e8c9e073a 100644 --- a/quicktypeUtil.js +++ b/quicktypeUtil.js @@ -1,37 +1,51 @@ -/** Utility for preparing arguments to quicktype, which workaround a specific - * quicktype bug in command line argument handling (where a directory is used +/** Utility for preparing arguments to quicktype, which workaround a specific + * quicktype bug in command line argument handling (where a directory is used * as input the source language argument is ignored which causes our schemas * to be interpreted as JSON input, rather than JSONSchema). - * Bug issue: + * Bug issue: * */ const path = require('path'); const fs = require('fs'); const exec = require('child_process').exec; -const args = process.argv; -const inputFolder = args[2] -const outputFile = args[3]; +const args = process.argv.slice(2); +const outputFile = args.pop(); +const inputs = args; -console.log("Input folder argument: " + inputFolder); -console.log("Output file argument: " + outputFile); +console.log('Inputs: ' + inputs.join(' | ')); +console.log('Output file argument: ' + outputFile); -let srcs = ""; -fs.readdirSync(inputFolder).forEach(file => { - srcs += `--src ${path.join(inputFolder, file)} `; -}); +let sources = ''; + +let dirIndex = 0; + +while (dirIndex < inputs.length) { + if (inputs[dirIndex].endsWith('.schema.json')) { + sources += `--src ${path.join(inputs[dirIndex])} `; + } else { + fs.readdirSync(inputs[dirIndex], { withFileTypes: true }).forEach(file => { + if (file.isDirectory()) { + inputs.push(path.join(inputs[dirIndex], file.name)); + } else { + sources += `--src ${path.join(inputs[dirIndex], file.name)} `; + } + }); + } + dirIndex++; +} // Normalise path to local quicktype executable. const quicktypeExec = ['.', 'node_modules', '.bin', 'quicktype'].join(path.sep); -const command = `${quicktypeExec} -s schema -o ${outputFile} ${srcs}`; -console.log("command to run: " + command); +const command = `${quicktypeExec} -s schema -o ${outputFile} ${sources}`; +console.log('command to run: ' + command); exec(command, function(error, stdout, stderr) { - if (stdout) { - console.log(stdout); - } - if (stderr) { - console.log(stderr); - } + if (stdout) { + console.log(stdout); + } + if (stderr) { + console.log(stderr); + } }); diff --git a/src/api/schemas/appIdentifier.schema.json b/schemas/api/appIdentifier.schema.json similarity index 71% rename from src/api/schemas/appIdentifier.schema.json rename to schemas/api/appIdentifier.schema.json index f23f2c941..29ef4c7d0 100644 --- a/src/api/schemas/appIdentifier.schema.json +++ b/schemas/api/appIdentifier.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/appIdentifier.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/appIdentifier.schema.json", "title": "AppIdentifier", "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls at specific applications.", "type": "object", @@ -10,10 +10,13 @@ }, "instanceId": { "type": "string" + }, + "desktopAgent": { + "type": "string" } }, "required": [ "appId" ], - "additionalProperties": false + "unevaluatedProperties": false } \ No newline at end of file diff --git a/src/api/schemas/appIntent.schema.json b/schemas/api/appIntent.schema.json similarity index 63% rename from src/api/schemas/appIntent.schema.json rename to schemas/api/appIntent.schema.json index 41a68cf89..1f2315d37 100644 --- a/src/api/schemas/appIntent.schema.json +++ b/schemas/api/appIntent.schema.json @@ -1,17 +1,17 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/appIntent.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/appIntent.schema.json", "title": "AppIntent", "description": "Represents the binding of an intent to apps", "type": "object", "properties": { "intent": { - "$ref": "https://fdc3.finos.org/schemas/next/intentMetadata.schema.json" + "$ref": "intentMetadata.schema.json" }, "apps": { "type": "array", "items": { - "$ref": "https://fdc3.finos.org/schemas/next/appMetadata.schema.json" + "$ref": "appMetadata.schema.json" } } }, diff --git a/src/api/schemas/appMetadata.schema.json b/schemas/api/appMetadata.schema.json similarity index 68% rename from src/api/schemas/appMetadata.schema.json rename to schemas/api/appMetadata.schema.json index 6b76a2376..14bfc1a8f 100644 --- a/src/api/schemas/appMetadata.schema.json +++ b/schemas/api/appMetadata.schema.json @@ -1,16 +1,18 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/appMetadata.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/appMetadata.schema.json", "title": "AppMetadata", "description": "Extends an AppIdentifier, describing an application or instance of an application.", "type": "object", + "allOf": [ + { + "$ref": "appIdentifier.schema.json" + } + ], "properties": { - "appId": { - "type": "string" - }, - "instanceId": { - "type": "string" - }, + "appId": true, + "instanceId": true, + "desktopAgent": true, "name": { "type": "string" }, @@ -32,13 +34,13 @@ "icons": { "type": "array", "items": { - "$ref": "https://fdc3.finos.org/schemas/next/icon.schema.json" + "$ref": "icon.schema.json" } }, "screenshots": { "type": "array", "items": { - "$ref": "https://fdc3.finos.org/schemas/next/image.schema.json" + "$ref": "image.schema.json" } }, "resultType": { @@ -48,8 +50,5 @@ ] } }, - "additionalProperties": false, - "required": [ - "appId" - ] + "additionalProperties": false } \ No newline at end of file diff --git a/src/api/schemas/channel.schema.json b/schemas/api/channel.schema.json similarity index 78% rename from src/api/schemas/channel.schema.json rename to schemas/api/channel.schema.json index 9c18e46f8..76c80ce80 100644 --- a/src/api/schemas/channel.schema.json +++ b/schemas/api/channel.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/channel.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/channel.schema.json", "title": "Channel", "description": "Represents a context channel that applications can join to share context data.", "type": "object", @@ -17,7 +17,7 @@ ] }, "displayMetadata": { - "$ref": "https://fdc3.finos.org/schemas/next/displayMetadata.schema.json" + "$ref": "displayMetadata.schema.json" } }, "required": [ diff --git a/src/api/schemas/contextMetadata.schema.json b/schemas/api/contextMetadata.schema.json similarity index 70% rename from src/api/schemas/contextMetadata.schema.json rename to schemas/api/contextMetadata.schema.json index ce5b80102..29dd86436 100644 --- a/src/api/schemas/contextMetadata.schema.json +++ b/schemas/api/contextMetadata.schema.json @@ -1,12 +1,12 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/contextMetadata.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/contextMetadata.schema.json", "title": "ContextMetadata", "description": "Metadata relating to a context or intent & context received through the addContextListener and addIntentListener functions.", "type": "object", "properties": { "source": { - "$ref": "https://fdc3.finos.org/schemas/next/appIdentifier.schema.json" + "$ref": "appIdentifier.schema.json" } }, "required": [ diff --git a/schemas/api/desktopAgentIdentifier.schema.json b/schemas/api/desktopAgentIdentifier.schema.json new file mode 100644 index 000000000..c07c0d341 --- /dev/null +++ b/schemas/api/desktopAgentIdentifier.schema.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/desktopAgentIdentifier.schema.json", + "title": "DesktopAgentIdentifier", + "description": "Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the source or destination of a message which was produced by or should be processed by the Desktop Agent itself rather than a specific application. Often added to messages by the Desktop Agent Bridge.", + "type": "object", + "properties": { + "desktopAgent": { + "type": "string" + } + }, + "required": [ + "desktopAgent" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/displayMetadata.schema.json b/schemas/api/displayMetadata.schema.json similarity index 87% rename from src/api/schemas/displayMetadata.schema.json rename to schemas/api/displayMetadata.schema.json index dd266653c..a83f5ef9a 100644 --- a/src/api/schemas/displayMetadata.schema.json +++ b/schemas/api/displayMetadata.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/displayMetadata.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/displayMetadata.schema.json", "title": "DisplayMetadata", "description": "A desktop agent (typically for user channels) may want to provide additional information about how a channel can be represented in a UI. A common use case is for color linking.", "type": "object", diff --git a/src/api/schemas/errors.schema.json b/schemas/api/errors.schema.json similarity index 74% rename from src/api/schemas/errors.schema.json rename to schemas/api/errors.schema.json index dc1215ea0..2c50b00b1 100644 --- a/src/api/schemas/errors.schema.json +++ b/schemas/api/errors.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/errors.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/errors.schema.json", "definitions": { "OpenError": { "type": "string", @@ -9,7 +9,8 @@ "AppNotFound", "ErrorOnLaunch", "AppTimeout", - "ResolverUnavailable" + "ResolverUnavailable", + "DesktopAgentNotFound" ] }, "ResolveError": { @@ -22,7 +23,8 @@ "ResolverTimeout", "TargetAppUnavailable", "TargetInstanceUnavailable", - "IntentDeliveryFailed" + "IntentDeliveryFailed", + "DesktopAgentNotFound" ] }, "ResultError": { @@ -41,6 +43,15 @@ "AccessDenied", "CreationFailed" ] + }, + "BridgingError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered by Desktop Agents when exchanging bridging messages.", + "enum": [ + "ResponseToBridgeTimedOut", + "AgentDisconnected", + "NotConnectedToBridge" + ] } } } \ No newline at end of file diff --git a/src/api/schemas/icon.schema.json b/schemas/api/icon.schema.json similarity index 87% rename from src/api/schemas/icon.schema.json rename to schemas/api/icon.schema.json index 064cc5bae..951356324 100644 --- a/src/api/schemas/icon.schema.json +++ b/schemas/api/icon.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/icon.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/icon.schema.json", "title": "Icon", "description": "Metadata relating to a single icon image at a remote URL, used to represent an application in a user interface.", "type": "object", diff --git a/src/api/schemas/image.schema.json b/schemas/api/image.schema.json similarity index 88% rename from src/api/schemas/image.schema.json rename to schemas/api/image.schema.json index 6640bdc8a..1f962a601 100644 --- a/src/api/schemas/image.schema.json +++ b/schemas/api/image.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/image.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/image.schema.json", "title": "Image", "description": "Metadata relating to a single image at a remote URL, used to represent screenshot images.", "type": "object", diff --git a/schemas/api/implementationMetadata.schema.json b/schemas/api/implementationMetadata.schema.json new file mode 100644 index 000000000..b09a040ed --- /dev/null +++ b/schemas/api/implementationMetadata.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", + "title": "ImplementationMetadata", + "description": "Metadata relating to the FDC3 DesktopAgent object and its provider", + "type": "object", + "properties": { + "fdc3Version": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "providerVersion": { + "type": "string" + }, + "optionalFeatures": { + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "type": "boolean" + }, + "UserChannelMembershipAPIs": { + "type": "boolean" + }, + "DesktopAgentBridging": { + "type": "boolean" + } + }, + "required": [ + "OriginatingAppMetadata", + "UserChannelMembershipAPIs" + ], + "additionalProperties": false + }, + "appMetadata": { + "$ref": "appMetadata.schema.json" + } + }, + "required": [ + "fdc3Version", + "provider", + "optionalFeatures", + "appMetadata" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/intentMetadata.schema.json b/schemas/api/intentMetadata.schema.json similarity index 82% rename from src/api/schemas/intentMetadata.schema.json rename to schemas/api/intentMetadata.schema.json index 98b2ba64f..61cba896c 100644 --- a/src/api/schemas/intentMetadata.schema.json +++ b/schemas/api/intentMetadata.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/intentMetadata.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/intentMetadata.schema.json", "title": "IntentMetadata", "description": "The interface used to describe an intent within the platform.", "type": "object", @@ -13,7 +13,6 @@ } }, "required": [ - "name", "displayName" ], "additionalProperties": false diff --git a/src/api/schemas/intentResolution.schema.json b/schemas/api/intentResolution.schema.json similarity index 75% rename from src/api/schemas/intentResolution.schema.json rename to schemas/api/intentResolution.schema.json index 9f98e7c84..65a6138ed 100644 --- a/src/api/schemas/intentResolution.schema.json +++ b/schemas/api/intentResolution.schema.json @@ -1,12 +1,12 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/intentResolution.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/intentResolution.schema.json", "title": "IntentResolution", "description": "IntentResolution provides a standard format for data returned upon resolving an intent.", "type": "object", "properties": { "source": { - "$ref": "https://fdc3.finos.org/schemas/next/appIdentifier.schema.json" + "$ref": "appIdentifier.schema.json" }, "intent": { "type": "string" diff --git a/src/api/schemas/intentResult.schema.json b/schemas/api/intentResult.schema.json similarity index 57% rename from src/api/schemas/intentResult.schema.json rename to schemas/api/intentResult.schema.json index 12dd01f40..4d8d89ea9 100644 --- a/src/api/schemas/intentResult.schema.json +++ b/schemas/api/intentResult.schema.json @@ -1,15 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/intentResult.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/intentResult.schema.json", "title": "IntentResult", "description": "Describes results that an Intent handler may optionally return that should be communicated back to the app that raised the intent, via the IntentResolution.", "type": "object", - "anyOf": [ + "oneOf": [ { - "$ref": "https://fdc3.finos.org/schemas/next/context.schema.json" + "$ref": "../context/context.schema.json" }, { - "$ref": "https://fdc3.finos.org/schemas/next/channel.schema.json" + "$ref": "channel.schema.json" } ] } \ No newline at end of file diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json new file mode 100644 index 000000000..6115cbaa0 --- /dev/null +++ b/schemas/bridging/bridgeRequest.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json", + "title": "BridgeRequest", + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." + }, + "payload": { + "type": "object", + "description": "The message payload typically contains the arguments to FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/RequestMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "RequestMeta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + }, + "source": { + "description": "Field that represents the source application that the request was received from.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "destination": { + "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ], + "additionalProperties": false + } + }, + "required": ["requestGuid", "timestamp", "source"] + } + } +} diff --git a/schemas/bridging/bridgeResponse.schema.json b/schemas/bridging/bridgeResponse.schema.json new file mode 100644 index 000000000..62b332855 --- /dev/null +++ b/schemas/bridging/bridgeResponse.schema.json @@ -0,0 +1,79 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json", + "title": "BridgeResponse", + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "type": "object", + "description": "The message payload typically contains return values for FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/ResponseMeta" + } + }, + "additionalProperties": false, + "required": ["type", "payload", "meta"], + "$defs": { + "ResponseMeta": { + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json#/$defs/RequestMeta" + }, + { + "type": "object", + "properties": { + "requestGuid": true, + "timestamp": true, + "responseGuid": { + "type": "string", + "description": "Unique GUID for the response" + }, + "sources": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored." + }, + "errorSources": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors." + }, + "errorDetails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + } + }, + "required": ["requestGuid", "responseGuid", "timestamp"], + "additionalProperties": false + } + ] + } + } +} diff --git a/schemas/bridging/broadcastRequest.schema.json b/schemas/bridging/broadcastRequest.schema.json new file mode 100644 index 000000000..058539666 --- /dev/null +++ b/schemas/bridging/broadcastRequest.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json", + "title": "BroadcastRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type":"object", + "properties": { + "type": { + "const": "broadcastRequest" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "$ref": "../api/channel.schema.json" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "additionalProperties": false, + "required": ["channel", "context"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties":false + } + ] +} diff --git a/schemas/bridging/findInstancesRequest.schema.json b/schemas/bridging/findInstancesRequest.schema.json new file mode 100644 index 000000000..1af8e5420 --- /dev/null +++ b/schemas/bridging/findInstancesRequest.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json", + "title": "FindInstancesRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findInstancesRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["app"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schemas/bridging/findInstancesResponse.schema.json b/schemas/bridging/findInstancesResponse.schema.json new file mode 100644 index 000000000..801c35645 --- /dev/null +++ b/schemas/bridging/findInstancesResponse.schema.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesResponse.schema.json", + "title": "findInstancesResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findInstancesResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIdentifiers": { + "type": "array", + "items": { + "$ref": "../api/appMetadata.schema.json" + } + } + }, + "required": ["appIdentifiers"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + } + ] +} diff --git a/schemas/bridging/findIntentRequest.schema.json b/schemas/bridging/findIntentRequest.schema.json new file mode 100644 index 000000000..53bc7a2c0 --- /dev/null +++ b/schemas/bridging/findIntentRequest.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json", + "title": "FindIntentRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findIntentRequest" + }, + "payload": { + "type": "object", + "properties": { + "intent": { + "type": "string" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["intent", "context"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schemas/bridging/findIntentResponse.schema.json b/schemas/bridging/findIntentResponse.schema.json new file mode 100644 index 000000000..9e6318bd0 --- /dev/null +++ b/schemas/bridging/findIntentResponse.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json", + "title": "FindIntentResponse", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findIntentResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIntent": { + "$ref": "../api/appIntent.schema.json" + } + }, + "required": ["appIntent"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/schemas/bridging/findIntentsForContextRequest.schema.json b/schemas/bridging/findIntentsForContextRequest.schema.json new file mode 100644 index 000000000..e2444f4c7 --- /dev/null +++ b/schemas/bridging/findIntentsForContextRequest.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextRequest.schema.json", + "title": "FindIntentsForContextRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findIntentsForContextRequest" + }, + "payload": { + "type": "object", + "properties": { + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["context"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schemas/bridging/findIntentsForContextResponse.schema.json b/schemas/bridging/findIntentsForContextResponse.schema.json new file mode 100644 index 000000000..2bcb1073d --- /dev/null +++ b/schemas/bridging/findIntentsForContextResponse.schema.json @@ -0,0 +1,48 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextResponse.schema.json", + "title": "FindIntentsForContextResponse", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "properties": { + "type": { + "const": "findIntentsForContextResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIntents": { + "type": "array", + "items": { + "$ref": "../api/appIntent.schema.json" + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": ["appIntents"] + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/schemas/bridging/getAppMetadataRequest.schema.json b/schemas/bridging/getAppMetadataRequest.schema.json new file mode 100644 index 000000000..8f4b551ce --- /dev/null +++ b/schemas/bridging/getAppMetadataRequest.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json", + "title": "GetAppMetadataRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "getAppMetadataRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["app"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schemas/bridging/getAppMetadataResponse.schema.json b/schemas/bridging/getAppMetadataResponse.schema.json new file mode 100644 index 000000000..26d2dc468 --- /dev/null +++ b/schemas/bridging/getAppMetadataResponse.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json", + "title": "GetAppMetadataResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "getAppMetadataResponse" + }, + "payload": { + "type": "object", + "properties": { + "appMetadata": { + "$ref": "../api/appMetadata.schema.json" + } + }, + "required": ["appMetadata"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/schemas/bridging/openRequest.schema.json b/schemas/bridging/openRequest.schema.json new file mode 100644 index 000000000..578c49c6a --- /dev/null +++ b/schemas/bridging/openRequest.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openRequest.schema.json", + "title": "openRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "openRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["app"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schemas/bridging/openResponse.schema.json b/schemas/bridging/openResponse.schema.json new file mode 100644 index 000000000..9c6c80dd9 --- /dev/null +++ b/schemas/bridging/openResponse.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json", + "title": "OpenResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "openResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIdentifier": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["appIdentifier"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/schemas/bridging/raiseIntentRequest.schema.json b/schemas/bridging/raiseIntentRequest.schema.json new file mode 100644 index 000000000..b8d1b9449 --- /dev/null +++ b/schemas/bridging/raiseIntentRequest.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json", + "title": "RaiseIntentRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "raiseIntentRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["app", "context"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schemas/bridging/raiseIntentResponse.schema.json b/schemas/bridging/raiseIntentResponse.schema.json new file mode 100644 index 000000000..82398d3c3 --- /dev/null +++ b/schemas/bridging/raiseIntentResponse.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json", + "title": "RaiseIntentResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "raiseIntentResponse" + }, + "payload": { + "type": "object", + "properties": { + "intentResolution": { + "$ref": "../api/intentResolution.schema.json" + } + }, + "required": ["intentResolution"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + } + ] +} diff --git a/schemas/bridging/raiseIntentResultResponse.schema.json b/schemas/bridging/raiseIntentResultResponse.schema.json new file mode 100644 index 000000000..bcd88e3d4 --- /dev/null +++ b/schemas/bridging/raiseIntentResultResponse.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json", + "title": "RaiseIntentResultResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "raiseIntentResultResponse" + }, + "payload": { + "type": "object", + "properties": { + "intentResult": { + "oneOf": [ + { + "type": "object", + "properties": { + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["context"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "channel": { + "$ref": "../api/channel.schema.json" + } + }, + "required": ["channel"], + "additionalProperties": false + } + ] + } + }, + "required": ["intentResult"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/appIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/src/context/schemas/chart.schema.json b/schemas/context/chart.schema.json similarity index 89% rename from src/context/schemas/chart.schema.json rename to schemas/context/chart.schema.json index ab541e70c..d5b493a7d 100644 --- a/src/context/schemas/chart.schema.json +++ b/schemas/context/chart.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chart.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chart.schema.json", "type": "object", "title": "Chart", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/chatInitSettings.schema.json b/schemas/context/chatInitSettings.schema.json similarity index 88% rename from src/context/schemas/chatInitSettings.schema.json rename to schemas/context/chatInitSettings.schema.json index 044068dbd..249fb7e76 100644 --- a/src/context/schemas/chatInitSettings.schema.json +++ b/schemas/context/chatInitSettings.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatInitSettings.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatInitSettings.schema.json", "type": "object", "title": "ChatInitSettings", "properties": { diff --git a/website/static/schemas/next/contact.schema.json b/schemas/context/contact.schema.json similarity index 83% rename from website/static/schemas/next/contact.schema.json rename to schemas/context/contact.schema.json index 154ed146f..6aef5f52e 100644 --- a/website/static/schemas/next/contact.schema.json +++ b/schemas/context/contact.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/contact.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/contact.schema.json", "type": "object", "title": "Contact", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/contactList.schema.json b/schemas/context/contactList.schema.json similarity index 81% rename from website/static/schemas/next/contactList.schema.json rename to schemas/context/contactList.schema.json index f09080f5c..57bf2a532 100644 --- a/website/static/schemas/next/contactList.schema.json +++ b/schemas/context/contactList.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/contactList.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/contactList.schema.json", "type": "object", "title": "ContactList", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/context.schema.json b/schemas/context/context.schema.json similarity index 75% rename from src/context/schemas/context.schema.json rename to schemas/context/context.schema.json index 2f0d9e0e6..b14861b52 100644 --- a/src/context/schemas/context.schema.json +++ b/schemas/context/context.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/context.schema.json", "type": "object", "title": "Context", "properties": { @@ -11,5 +11,6 @@ "unevaluatedProperties": { "type": "string" } } }, + "additionalItems": true, "required": ["type"] } diff --git a/website/static/schemas/next/country.schema.json b/schemas/context/country.schema.json similarity index 86% rename from website/static/schemas/next/country.schema.json rename to schemas/context/country.schema.json index f29ae7611..2a0a6a763 100644 --- a/website/static/schemas/next/country.schema.json +++ b/schemas/context/country.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/country.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/country.schema.json", "type": "object", "title": "Country", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/currency.schema.json b/schemas/context/currency.schema.json similarity index 84% rename from src/context/schemas/currency.schema.json rename to schemas/context/currency.schema.json index 8d87f517a..aa0c08455 100644 --- a/src/context/schemas/currency.schema.json +++ b/schemas/context/currency.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/currency.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/currency.schema.json", "type": "object", "title": "Currency", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/email.schema.json b/schemas/context/email.schema.json similarity index 86% rename from website/static/schemas/next/email.schema.json rename to schemas/context/email.schema.json index a885680d9..4ec814dcf 100644 --- a/website/static/schemas/next/email.schema.json +++ b/schemas/context/email.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/email.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/email.schema.json", "type": "object", "title": "Email", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/instrument.schema.json b/schemas/context/instrument.schema.json similarity index 92% rename from src/context/schemas/instrument.schema.json rename to schemas/context/instrument.schema.json index ed25d4274..eee0f800f 100644 --- a/src/context/schemas/instrument.schema.json +++ b/schemas/context/instrument.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/instrument.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/instrument.schema.json", "type": "object", "title": "Instrument", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/instrumentList.schema.json b/schemas/context/instrumentList.schema.json similarity index 81% rename from website/static/schemas/next/instrumentList.schema.json rename to schemas/context/instrumentList.schema.json index 6aa927fd1..ceca78935 100644 --- a/website/static/schemas/next/instrumentList.schema.json +++ b/schemas/context/instrumentList.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/instrumentList.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/instrumentList.schema.json", "type": "object", "title": "InstrumentList", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/nothing.schema.json b/schemas/context/nothing.schema.json similarity index 73% rename from website/static/schemas/next/nothing.schema.json rename to schemas/context/nothing.schema.json index d13c3f05e..a7d67095e 100644 --- a/website/static/schemas/next/nothing.schema.json +++ b/schemas/context/nothing.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/nothing.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/nothing.schema.json", "type": "object", "title": "Nothing", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/organization.schema.json b/schemas/context/organization.schema.json similarity index 84% rename from website/static/schemas/next/organization.schema.json rename to schemas/context/organization.schema.json index 986eb9c96..7a791496e 100644 --- a/website/static/schemas/next/organization.schema.json +++ b/schemas/context/organization.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/organization.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/organization.schema.json", "type": "object", "title": "Organization", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/portfolio.schema.json b/schemas/context/portfolio.schema.json similarity index 81% rename from src/context/schemas/portfolio.schema.json rename to schemas/context/portfolio.schema.json index 69ee04e81..64202e02f 100644 --- a/src/context/schemas/portfolio.schema.json +++ b/schemas/context/portfolio.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/portfolio.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/portfolio.schema.json", "type": "object", "title": "Portfolio", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/position.schema.json b/schemas/context/position.schema.json similarity index 82% rename from website/static/schemas/next/position.schema.json rename to schemas/context/position.schema.json index 262cbbc95..e2a948aee 100644 --- a/website/static/schemas/next/position.schema.json +++ b/schemas/context/position.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/position.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/position.schema.json", "type": "object", "title": "Position", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/timerange.schema.json b/schemas/context/timerange.schema.json similarity index 86% rename from src/context/schemas/timerange.schema.json rename to schemas/context/timerange.schema.json index a17c5fbff..5b6b326f5 100644 --- a/src/context/schemas/timerange.schema.json +++ b/schemas/context/timerange.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/timerange.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/timerange.schema.json", "type": "object", "title": "TimeRange", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/valuation.schema.json b/schemas/context/valuation.schema.json similarity index 87% rename from src/context/schemas/valuation.schema.json rename to schemas/context/valuation.schema.json index e9a2f57ba..7ad55be71 100644 --- a/src/context/schemas/valuation.schema.json +++ b/schemas/context/valuation.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/valuation.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/valuation.schema.json", "type": "object", "title": "Valuation", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/api/ImplementationMetadata.ts b/src/api/ImplementationMetadata.ts index 3f428e787..72a5c3021 100644 --- a/src/api/ImplementationMetadata.ts +++ b/src/api/ImplementationMetadata.ts @@ -31,6 +31,9 @@ export interface ImplementationMetadata { * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by * the Desktop Agent.*/ UserChannelMembershipAPIs: boolean; + /** Used to indicate whether the experimental Desktop Agent Bridging + * feature is implemented by the Desktop Agent.*/ + DesktopAgentBridging: boolean; }; /** The calling application instance's own metadata, according to the Desktop Agent (MUST include at least the `appId` and `instanceId`). */ diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts new file mode 100644 index 000000000..7708d1852 --- /dev/null +++ b/src/bridging/BridgingTypes.ts @@ -0,0 +1,2126 @@ +// To parse this data: +// +// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsForContextRequest, FindIntentsForContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; +// +// const appIdentifier = Convert.toAppIdentifier(json); +// const appIntent = Convert.toAppIntent(json); +// const appMetadata = Convert.toAppMetadata(json); +// const channel = Convert.toChannel(json); +// const contextMetadata = Convert.toContextMetadata(json); +// const desktopAgentIdentifier = Convert.toDesktopAgentIdentifier(json); +// const displayMetadata = Convert.toDisplayMetadata(json); +// const schemasAPIErrorsSchema = Convert.toSchemasAPIErrorsSchema(json); +// const icon = Convert.toIcon(json); +// const image = Convert.toImage(json); +// const implementationMetadata = Convert.toImplementationMetadata(json); +// const intentMetadata = Convert.toIntentMetadata(json); +// const intentResolution = Convert.toIntentResolution(json); +// const intentResult = Convert.toIntentResult(json); +// const bridgeRequest = Convert.toBridgeRequest(json); +// const bridgeResponse = Convert.toBridgeResponse(json); +// const broadcastRequest = Convert.toBroadcastRequest(json); +// const findInstancesRequest = Convert.toFindInstancesRequest(json); +// const findInstancesResponse = Convert.toFindInstancesResponse(json); +// const findIntentRequest = Convert.toFindIntentRequest(json); +// const findIntentResponse = Convert.toFindIntentResponse(json); +// const findIntentsForContextRequest = Convert.toFindIntentsForContextRequest(json); +// const findIntentsForContextResponse = Convert.toFindIntentsForContextResponse(json); +// const getAppMetadataRequest = Convert.toGetAppMetadataRequest(json); +// const getAppMetadataResponse = Convert.toGetAppMetadataResponse(json); +// const openRequest = Convert.toOpenRequest(json); +// const openResponse = Convert.toOpenResponse(json); +// const raiseIntentRequest = Convert.toRaiseIntentRequest(json); +// const raiseIntentResponse = Convert.toRaiseIntentResponse(json); +// const raiseIntentResultResponse = Convert.toRaiseIntentResultResponse(json); +// const context = Convert.toContext(json); +// +// These functions will throw an error if the JSON doesn't +// match the expected interface, even if the JSON is valid. + +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + */ +export interface AppIdentifier { + appId: string; + desktopAgent?: string; + instanceId?: string; + [property: string]: any; +} + +/** + * Represents the binding of an intent to apps + */ +export interface AppIntent { + apps: AppMetadataElement[]; + intent: IntentClass; +} + +/** + * Extends an AppIdentifier, describing an application or instance of an application. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + */ +export interface AppMetadataElement { + appId: string; + description?: string; + desktopAgent?: string; + icons?: IconElement[]; + instanceId?: string; + instanceMetadata?: { [key: string]: any }; + name?: string; + resultType?: null | string; + screenshots?: ScreenshotElement[]; + title?: string; + tooltip?: string; + version?: string; +} + +/** + * Metadata relating to a single icon image at a remote URL, used to represent an + * application in a user interface. + */ +export interface IconElement { + size?: string; + src: string; + type?: string; +} + +/** + * Metadata relating to a single image at a remote URL, used to represent screenshot images. + */ +export interface ScreenshotElement { + label?: string; + size?: string; + src: string; + type?: string; +} + +/** + * The interface used to describe an intent within the platform. + */ +export interface IntentClass { + displayName: string; + name?: string; +} + +/** + * Extends an AppIdentifier, describing an application or instance of an application. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + */ +export interface AppMetadata { + appId: string; + description?: string; + desktopAgent?: string; + icons?: IconElement[]; + instanceId?: string; + instanceMetadata?: { [key: string]: any }; + name?: string; + resultType?: null | string; + screenshots?: ScreenshotElement[]; + title?: string; + tooltip?: string; + version?: string; +} + +/** + * Represents a context channel that applications can join to share context data. + */ +export interface Channel { + displayMetadata?: DisplayMetadataClass; + id: string; + type: Type; +} + +/** + * A desktop agent (typically for user channels) may want to provide additional information + * about how a channel can be represented in a UI. A common use case is for color linking. + */ +export interface DisplayMetadataClass { + color?: string; + glyph?: string; + name?: string; +} + +export enum Type { + App = 'app', + Private = 'private', + User = 'user', +} + +/** + * Metadata relating to a context or intent & context received through the + * addContextListener and addIntentListener functions. + */ +export interface ContextMetadata { + source: SourceElement; +} + +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + */ +export interface SourceElement { + appId: string; + desktopAgent?: string; + instanceId?: string; + [property: string]: any; +} + +/** + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface DesktopAgentIdentifier { + desktopAgent: string; +} + +/** + * A desktop agent (typically for user channels) may want to provide additional information + * about how a channel can be represented in a UI. A common use case is for color linking. + */ +export interface DisplayMetadata { + color?: string; + glyph?: string; + name?: string; +} + +/** + * Metadata relating to a single icon image at a remote URL, used to represent an + * application in a user interface. + */ +export interface Icon { + size?: string; + src: string; + type?: string; +} + +/** + * Metadata relating to a single image at a remote URL, used to represent screenshot images. + */ +export interface Image { + label?: string; + size?: string; + src: string; + type?: string; +} + +/** + * Metadata relating to the FDC3 DesktopAgent object and its provider + */ +export interface ImplementationMetadata { + appMetadata: AppMetadataElement; + fdc3Version: string; + optionalFeatures: OptionalFeatures; + provider: string; + providerVersion?: string; +} + +export interface OptionalFeatures { + DesktopAgentBridging?: boolean; + OriginatingAppMetadata: boolean; + UserChannelMembershipAPIs: boolean; +} + +/** + * The interface used to describe an intent within the platform. + */ +export interface IntentMetadata { + displayName: string; + name?: string; +} + +/** + * IntentResolution provides a standard format for data returned upon resolving an intent. + */ +export interface IntentResolution { + intent: string; + source: SourceElement; + version?: string; +} + +/** + * Describes results that an Intent handler may optionally return that should be + * communicated back to the app that raised the intent, via the IntentResolution. + * + * Represents a context channel that applications can join to share context data. + */ +export interface IntentResult { + id?: { [key: string]: any } | string; + name?: string; + type: string; + displayMetadata?: DisplayMetadataClass; + [property: string]: any; +} + +export interface BridgeRequest { + meta: MetaObject; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface MetaObject { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: Destination; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: ErrorSourceElement; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + [property: string]: any; +} + +/** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Field that represents the source application that the request was received from. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface Destination {} + +/** + * Field that represents the source application that the request was received from. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface ErrorSourceElement { + appId?: string; + desktopAgent?: string; + instanceId?: string; + [property: string]: any; +} + +export interface BridgeResponse { + meta: BridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface BridgeResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: ErrorSourceElement[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: ErrorSourceElement[]; +} + +export interface BroadcastRequest { + meta: BroadcastRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: BroadcastRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface BroadcastRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: Destination; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * Field that represents the source application that the request was received from. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface PurpleIdentifier { + appId: string; + desktopAgent?: string; + instanceId?: string; + [property: string]: any; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface BroadcastRequestPayload { + channel: ChannelClass; + context: ContextObject; +} + +/** + * Represents a context channel that applications can join to share context data. + */ +export interface ChannelClass { + displayMetadata?: DisplayMetadataClass; + id: string; + type: Type; +} + +export interface ContextObject { + id?: { [key: string]: any }; + name?: string; + type: string; + [property: string]: any; +} + +export interface FindInstancesRequest { + meta: FindInstancesRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindInstancesRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface FindInstancesRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: Destination; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindInstancesRequestPayload { + app: SourceElement; +} + +export interface FindInstancesResponse { + meta: FindInstancesResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindInstancesResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface FindInstancesResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: ErrorSourceElement[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: SourceClass[]; +} + +/** + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface SourceClass { + desktopAgent: string; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindInstancesResponsePayload { + appIdentifiers: AppMetadataElement[]; +} + +export interface FindIntentRequest { + meta: FindIntentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface FindIntentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: Destination; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentRequestPayload { + context: ContextObject; + intent: string; +} + +export interface FindIntentResponse { + meta: FindIntentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindIntentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface FindIntentResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: SourceClass[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: SourceClass[]; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindIntentResponsePayload { + appIntent: AppIntentElement; +} + +/** + * Represents the binding of an intent to apps + */ +export interface AppIntentElement { + apps: AppMetadataElement[]; + intent: IntentClass; +} + +export interface FindIntentsForContextRequest { + meta: FindIntentsForContextRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentsForContextRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface FindIntentsForContextRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: Destination; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentsForContextRequestPayload { + context: ContextObject; +} + +export interface FindIntentsForContextResponse { + meta: FindIntentsForContextResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindIntentsForContextResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface FindIntentsForContextResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: SourceClass[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: SourceClass[]; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindIntentsForContextResponsePayload { + appIntents: AppIntentElement[]; +} + +export interface GetAppMetadataRequest { + meta: GetAppMetadataRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetAppMetadataRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface GetAppMetadataRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: Destination; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetAppMetadataRequestPayload { + app: SourceElement; +} + +export interface GetAppMetadataResponse { + meta: GetAppMetadataResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: GetAppMetadataResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface GetAppMetadataResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: SourceClass[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: SourceClass[]; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface GetAppMetadataResponsePayload { + appMetadata: AppMetadataElement; +} + +export interface OpenRequest { + meta: OpenRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: OpenRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface OpenRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Field that represents the source application that the request was received from. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface DestinationClass {} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface OpenRequestPayload { + app: SourceElement; + context?: ContextObject; +} + +export interface OpenResponse { + meta: OpenResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: OpenResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface OpenResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: SourceClass[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: SourceClass[]; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface OpenResponsePayload { + appIdentifier: SourceElement; +} + +export interface RaiseIntentRequest { + meta: RaiseIntentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: RaiseIntentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface RaiseIntentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: Destination; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface RaiseIntentRequestPayload { + app: SourceElement; + context: ContextObject; +} + +export interface RaiseIntentResponse { + meta: RaiseIntentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface RaiseIntentResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: ErrorSourceElement[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: SourceClass[]; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentResponsePayload { + intentResolution: IntentResolutionClass; +} + +/** + * IntentResolution provides a standard format for data returned upon resolving an intent. + */ +export interface IntentResolutionClass { + intent: string; + source: SourceElement; + version?: string; +} + +export interface RaiseIntentResultResponse { + meta: RaiseIntentResultResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentResultResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +export interface RaiseIntentResultResponseMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. + */ + errorSources?: ErrorSourceElement[]; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. + */ + sources?: SourceElement[]; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentResultResponsePayload { + intentResult: IntentResultClass; +} + +export interface IntentResultClass { + context?: ContextObject; + channel?: ChannelClass; +} + +export interface Context { + id?: { [key: string]: any }; + name?: string; + type: string; + [property: string]: any; +} + +// Converts JSON strings to/from your types +// and asserts the results of JSON.parse at runtime +export class Convert { + public static toAppIdentifier(json: string): AppIdentifier { + return cast(JSON.parse(json), r('AppIdentifier')); + } + + public static appIdentifierToJson(value: AppIdentifier): string { + return JSON.stringify(uncast(value, r('AppIdentifier')), null, 2); + } + + public static toAppIntent(json: string): AppIntent { + return cast(JSON.parse(json), r('AppIntent')); + } + + public static appIntentToJson(value: AppIntent): string { + return JSON.stringify(uncast(value, r('AppIntent')), null, 2); + } + + public static toAppMetadata(json: string): AppMetadata { + return cast(JSON.parse(json), r('AppMetadata')); + } + + public static appMetadataToJson(value: AppMetadata): string { + return JSON.stringify(uncast(value, r('AppMetadata')), null, 2); + } + + public static toChannel(json: string): Channel { + return cast(JSON.parse(json), r('Channel')); + } + + public static channelToJson(value: Channel): string { + return JSON.stringify(uncast(value, r('Channel')), null, 2); + } + + public static toContextMetadata(json: string): ContextMetadata { + return cast(JSON.parse(json), r('ContextMetadata')); + } + + public static contextMetadataToJson(value: ContextMetadata): string { + return JSON.stringify(uncast(value, r('ContextMetadata')), null, 2); + } + + public static toDesktopAgentIdentifier(json: string): DesktopAgentIdentifier { + return cast(JSON.parse(json), r('DesktopAgentIdentifier')); + } + + public static desktopAgentIdentifierToJson(value: DesktopAgentIdentifier): string { + return JSON.stringify(uncast(value, r('DesktopAgentIdentifier')), null, 2); + } + + public static toDisplayMetadata(json: string): DisplayMetadata { + return cast(JSON.parse(json), r('DisplayMetadata')); + } + + public static displayMetadataToJson(value: DisplayMetadata): string { + return JSON.stringify(uncast(value, r('DisplayMetadata')), null, 2); + } + + public static toSchemasAPIErrorsSchema(json: string): any { + return cast(JSON.parse(json), 'any'); + } + + public static schemasAPIErrorsSchemaToJson(value: any): string { + return JSON.stringify(uncast(value, 'any'), null, 2); + } + + public static toIcon(json: string): Icon { + return cast(JSON.parse(json), r('Icon')); + } + + public static iconToJson(value: Icon): string { + return JSON.stringify(uncast(value, r('Icon')), null, 2); + } + + public static toImage(json: string): Image { + return cast(JSON.parse(json), r('Image')); + } + + public static imageToJson(value: Image): string { + return JSON.stringify(uncast(value, r('Image')), null, 2); + } + + public static toImplementationMetadata(json: string): ImplementationMetadata { + return cast(JSON.parse(json), r('ImplementationMetadata')); + } + + public static implementationMetadataToJson(value: ImplementationMetadata): string { + return JSON.stringify(uncast(value, r('ImplementationMetadata')), null, 2); + } + + public static toIntentMetadata(json: string): IntentMetadata { + return cast(JSON.parse(json), r('IntentMetadata')); + } + + public static intentMetadataToJson(value: IntentMetadata): string { + return JSON.stringify(uncast(value, r('IntentMetadata')), null, 2); + } + + public static toIntentResolution(json: string): IntentResolution { + return cast(JSON.parse(json), r('IntentResolution')); + } + + public static intentResolutionToJson(value: IntentResolution): string { + return JSON.stringify(uncast(value, r('IntentResolution')), null, 2); + } + + public static toIntentResult(json: string): IntentResult { + return cast(JSON.parse(json), r('IntentResult')); + } + + public static intentResultToJson(value: IntentResult): string { + return JSON.stringify(uncast(value, r('IntentResult')), null, 2); + } + + public static toBridgeRequest(json: string): BridgeRequest { + return cast(JSON.parse(json), r('BridgeRequest')); + } + + public static bridgeRequestToJson(value: BridgeRequest): string { + return JSON.stringify(uncast(value, r('BridgeRequest')), null, 2); + } + + public static toBridgeResponse(json: string): BridgeResponse { + return cast(JSON.parse(json), r('BridgeResponse')); + } + + public static bridgeResponseToJson(value: BridgeResponse): string { + return JSON.stringify(uncast(value, r('BridgeResponse')), null, 2); + } + + public static toBroadcastRequest(json: string): BroadcastRequest { + return cast(JSON.parse(json), r('BroadcastRequest')); + } + + public static broadcastRequestToJson(value: BroadcastRequest): string { + return JSON.stringify(uncast(value, r('BroadcastRequest')), null, 2); + } + + public static toFindInstancesRequest(json: string): FindInstancesRequest { + return cast(JSON.parse(json), r('FindInstancesRequest')); + } + + public static findInstancesRequestToJson(value: FindInstancesRequest): string { + return JSON.stringify(uncast(value, r('FindInstancesRequest')), null, 2); + } + + public static toFindInstancesResponse(json: string): FindInstancesResponse { + return cast(JSON.parse(json), r('FindInstancesResponse')); + } + + public static findInstancesResponseToJson(value: FindInstancesResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesResponse')), null, 2); + } + + public static toFindIntentRequest(json: string): FindIntentRequest { + return cast(JSON.parse(json), r('FindIntentRequest')); + } + + public static findIntentRequestToJson(value: FindIntentRequest): string { + return JSON.stringify(uncast(value, r('FindIntentRequest')), null, 2); + } + + public static toFindIntentResponse(json: string): FindIntentResponse { + return cast(JSON.parse(json), r('FindIntentResponse')); + } + + public static findIntentResponseToJson(value: FindIntentResponse): string { + return JSON.stringify(uncast(value, r('FindIntentResponse')), null, 2); + } + + public static toFindIntentsForContextRequest(json: string): FindIntentsForContextRequest { + return cast(JSON.parse(json), r('FindIntentsForContextRequest')); + } + + public static findIntentsForContextRequestToJson(value: FindIntentsForContextRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsForContextRequest')), null, 2); + } + + public static toFindIntentsForContextResponse(json: string): FindIntentsForContextResponse { + return cast(JSON.parse(json), r('FindIntentsForContextResponse')); + } + + public static findIntentsForContextResponseToJson(value: FindIntentsForContextResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsForContextResponse')), null, 2); + } + + public static toGetAppMetadataRequest(json: string): GetAppMetadataRequest { + return cast(JSON.parse(json), r('GetAppMetadataRequest')); + } + + public static getAppMetadataRequestToJson(value: GetAppMetadataRequest): string { + return JSON.stringify(uncast(value, r('GetAppMetadataRequest')), null, 2); + } + + public static toGetAppMetadataResponse(json: string): GetAppMetadataResponse { + return cast(JSON.parse(json), r('GetAppMetadataResponse')); + } + + public static getAppMetadataResponseToJson(value: GetAppMetadataResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataResponse')), null, 2); + } + + public static toOpenRequest(json: string): OpenRequest { + return cast(JSON.parse(json), r('OpenRequest')); + } + + public static openRequestToJson(value: OpenRequest): string { + return JSON.stringify(uncast(value, r('OpenRequest')), null, 2); + } + + public static toOpenResponse(json: string): OpenResponse { + return cast(JSON.parse(json), r('OpenResponse')); + } + + public static openResponseToJson(value: OpenResponse): string { + return JSON.stringify(uncast(value, r('OpenResponse')), null, 2); + } + + public static toRaiseIntentRequest(json: string): RaiseIntentRequest { + return cast(JSON.parse(json), r('RaiseIntentRequest')); + } + + public static raiseIntentRequestToJson(value: RaiseIntentRequest): string { + return JSON.stringify(uncast(value, r('RaiseIntentRequest')), null, 2); + } + + public static toRaiseIntentResponse(json: string): RaiseIntentResponse { + return cast(JSON.parse(json), r('RaiseIntentResponse')); + } + + public static raiseIntentResponseToJson(value: RaiseIntentResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResponse')), null, 2); + } + + public static toRaiseIntentResultResponse(json: string): RaiseIntentResultResponse { + return cast(JSON.parse(json), r('RaiseIntentResultResponse')); + } + + public static raiseIntentResultResponseToJson(value: RaiseIntentResultResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultResponse')), null, 2); + } + + public static toContext(json: string): Context { + return cast(JSON.parse(json), r('Context')); + } + + public static contextToJson(value: Context): string { + return JSON.stringify(uncast(value, r('Context')), null, 2); + } +} + +function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { + const prettyTyp = prettyTypeName(typ); + const parentText = parent ? ` on ${parent}` : ''; + const keyText = key ? ` for key "${key}"` : ''; + throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); +} + +function prettyTypeName(typ: any): string { + if (Array.isArray(typ)) { + if (typ.length === 2 && typ[0] === undefined) { + return `an optional ${prettyTypeName(typ[1])}`; + } else { + return `one of [${typ + .map(a => { + return prettyTypeName(a); + }) + .join(', ')}]`; + } + } else if (typeof typ === 'object' && typ.literal !== undefined) { + return typ.literal; + } else { + return typeof typ; + } +} + +function jsonToJSProps(typ: any): any { + if (typ.jsonToJS === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.json] = { key: p.js, typ: p.typ })); + typ.jsonToJS = map; + } + return typ.jsonToJS; +} + +function jsToJSONProps(typ: any): any { + if (typ.jsToJSON === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.js] = { key: p.json, typ: p.typ })); + typ.jsToJSON = map; + } + return typ.jsToJSON; +} + +function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { + function transformPrimitive(typ: string, val: any): any { + if (typeof typ === typeof val) return val; + return invalidValue(typ, val, key, parent); + } + + function transformUnion(typs: any[], val: any): any { + // val must validate against one typ in typs + const l = typs.length; + for (let i = 0; i < l; i++) { + const typ = typs[i]; + try { + return transform(val, typ, getProps); + } catch (_) {} + } + return invalidValue(typs, val, key, parent); + } + + function transformEnum(cases: string[], val: any): any { + if (cases.indexOf(val) !== -1) return val; + return invalidValue( + cases.map(a => { + return l(a); + }), + val, + key, + parent + ); + } + + function transformArray(typ: any, val: any): any { + // val must be an array with no invalid elements + if (!Array.isArray(val)) return invalidValue(l('array'), val, key, parent); + return val.map(el => transform(el, typ, getProps)); + } + + function transformDate(val: any): any { + if (val === null) { + return null; + } + const d = new Date(val); + if (isNaN(d.valueOf())) { + return invalidValue(l('Date'), val, key, parent); + } + return d; + } + + function transformObject(props: { [k: string]: any }, additional: any, val: any): any { + if (val === null || typeof val !== 'object' || Array.isArray(val)) { + return invalidValue(l(ref || 'object'), val, key, parent); + } + const result: any = {}; + Object.getOwnPropertyNames(props).forEach(key => { + const prop = props[key]; + const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; + result[prop.key] = transform(v, prop.typ, getProps, key, ref); + }); + Object.getOwnPropertyNames(val).forEach(key => { + if (!Object.prototype.hasOwnProperty.call(props, key)) { + result[key] = transform(val[key], additional, getProps, key, ref); + } + }); + return result; + } + + if (typ === 'any') return val; + if (typ === null) { + if (val === null) return val; + return invalidValue(typ, val, key, parent); + } + if (typ === false) return invalidValue(typ, val, key, parent); + let ref: any = undefined; + while (typeof typ === 'object' && typ.ref !== undefined) { + ref = typ.ref; + typ = typeMap[typ.ref]; + } + if (Array.isArray(typ)) return transformEnum(typ, val); + if (typeof typ === 'object') { + return typ.hasOwnProperty('unionMembers') + ? transformUnion(typ.unionMembers, val) + : typ.hasOwnProperty('arrayItems') + ? transformArray(typ.arrayItems, val) + : typ.hasOwnProperty('props') + ? transformObject(getProps(typ), typ.additional, val) + : invalidValue(typ, val, key, parent); + } + // Numbers can be parsed by Date but shouldn't be. + if (typ === Date && typeof val !== 'number') return transformDate(val); + return transformPrimitive(typ, val); +} + +function cast(val: any, typ: any): T { + return transform(val, typ, jsonToJSProps); +} + +function uncast(val: T, typ: any): any { + return transform(val, typ, jsToJSONProps); +} + +function l(typ: any) { + return { literal: typ }; +} + +function a(typ: any) { + return { arrayItems: typ }; +} + +function u(...typs: any[]) { + return { unionMembers: typs }; +} + +function o(props: any[], additional: any) { + return { props, additional }; +} + +function m(additional: any) { + return { props: [], additional }; +} + +function r(name: string) { + return { ref: name }; +} + +const typeMap: any = { + AppIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + AppIntent: o( + [ + { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, + { json: 'intent', js: 'intent', typ: r('IntentClass') }, + ], + false + ), + AppMetadataElement: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'description', js: 'description', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'icons', js: 'icons', typ: u(undefined, a(r('IconElement'))) }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'instanceMetadata', js: 'instanceMetadata', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, u(null, '')) }, + { json: 'screenshots', js: 'screenshots', typ: u(undefined, a(r('ScreenshotElement'))) }, + { json: 'title', js: 'title', typ: u(undefined, '') }, + { json: 'tooltip', js: 'tooltip', typ: u(undefined, '') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + IconElement: o( + [ + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + ScreenshotElement: o( + [ + { json: 'label', js: 'label', typ: u(undefined, '') }, + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + IntentClass: o( + [ + { json: 'displayName', js: 'displayName', typ: '' }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + AppMetadata: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'description', js: 'description', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'icons', js: 'icons', typ: u(undefined, a(r('IconElement'))) }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'instanceMetadata', js: 'instanceMetadata', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, u(null, '')) }, + { json: 'screenshots', js: 'screenshots', typ: u(undefined, a(r('ScreenshotElement'))) }, + { json: 'title', js: 'title', typ: u(undefined, '') }, + { json: 'tooltip', js: 'tooltip', typ: u(undefined, '') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + Channel: o( + [ + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, + { json: 'id', js: 'id', typ: '' }, + { json: 'type', js: 'type', typ: r('Type') }, + ], + false + ), + DisplayMetadataClass: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + ContextMetadata: o([{ json: 'source', js: 'source', typ: r('SourceElement') }], false), + SourceElement: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), + DisplayMetadata: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + Icon: o( + [ + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + Image: o( + [ + { json: 'label', js: 'label', typ: u(undefined, '') }, + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + ImplementationMetadata: o( + [ + { json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }, + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('OptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + OptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: u(undefined, true) }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), + IntentMetadata: o( + [ + { json: 'displayName', js: 'displayName', typ: '' }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + IntentResolution: o( + [ + { json: 'intent', js: 'intent', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceElement') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + IntentResult: o( + [ + { json: 'id', js: 'id', typ: u(undefined, u(m('any'), '')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, + ], + 'any' + ), + BridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('MetaObject') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + MetaObject: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('ErrorSourceElement') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + 'any' + ), + Destination: o([], false), + ErrorSourceElement: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + BridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('BridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BridgeResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + ], + false + ), + BroadcastRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BroadcastRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PurpleIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + BroadcastRequestPayload: o( + [ + { json: 'channel', js: 'channel', typ: r('ChannelClass') }, + { json: 'context', js: 'context', typ: r('ContextObject') }, + ], + false + ), + ChannelClass: o( + [ + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, + { json: 'id', js: 'id', typ: '' }, + { json: 'type', js: 'type', typ: r('Type') }, + ], + false + ), + ContextObject: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + ], + 'any' + ), + FindInstancesRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindInstancesRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindInstancesRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + FindInstancesResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindInstancesResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + ], + false + ), + SourceClass: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), + FindInstancesResponsePayload: o( + [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadataElement')) }], + false + ), + FindIntentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindIntentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentRequestPayload: o( + [ + { json: 'context', js: 'context', typ: r('ContextObject') }, + { json: 'intent', js: 'intent', typ: '' }, + ], + false + ), + FindIntentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindIntentResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + ], + false + ), + FindIntentResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntentElement') }], false), + AppIntentElement: o( + [ + { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, + { json: 'intent', js: 'intent', typ: r('IntentClass') }, + ], + false + ), + FindIntentsForContextRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsForContextRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsForContextRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindIntentsForContextRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsForContextRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextObject') }], false), + FindIntentsForContextResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsForContextResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsForContextResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindIntentsForContextResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + ], + false + ), + FindIntentsForContextResponsePayload: o( + [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntentElement')) }], + false + ), + GetAppMetadataRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + GetAppMetadataRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + GetAppMetadataResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + GetAppMetadataResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + ], + false + ), + GetAppMetadataResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }], false), + OpenRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + OpenRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + DestinationClass: o([], false), + OpenRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextObject')) }, + ], + false + ), + OpenResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + OpenResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + ], + false + ), + OpenResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('SourceElement') }], false), + RaiseIntentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + RaiseIntentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'context', js: 'context', typ: r('ContextObject') }, + ], + false + ), + RaiseIntentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + RaiseIntentResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + ], + false + ), + RaiseIntentResponsePayload: o( + [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolutionClass') }], + false + ), + IntentResolutionClass: o( + [ + { json: 'intent', js: 'intent', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceElement') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + RaiseIntentResultResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + RaiseIntentResultResponseMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceElement'))) }, + ], + false + ), + RaiseIntentResultResponsePayload: o( + [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResultClass') }], + false + ), + IntentResultClass: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('ContextObject')) }, + { json: 'channel', js: 'channel', typ: u(undefined, r('ChannelClass')) }, + ], + false + ), + Context: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + ], + 'any' + ), + Type: ['app', 'private', 'user'], +}; diff --git a/src/context/README.md b/src/context/README.md index 4212bf479..94736706a 100644 --- a/src/context/README.md +++ b/src/context/README.md @@ -6,11 +6,11 @@ Please note that these definitions are provided to help developers working in Ty It is not always possible to perfectly replicate a type/interface defined in JSONSchema via TypeScript. Hence, in the event of any disagreement between the definitions, the JSONSchema should be assumed to be correct, rather than the Typescript. For example, JSONSchema may define optional fields on an object + a restriction on the type of additional properties (via `"additionalProperties": { "type": "string"}`), which will result in an index signature `[property: string]: string;` in generated TypeScript. That signature, is incompatible with with an optional properties (including string properties) as they have type `string | undefined`. A similar problem may occur in JSON Schema if the schema is used to create a subtype via composition as `additionalProperties` is not aware of teh subschema's definitions. Both issues can be worked around by using `unevaluatedProperties` in the schema, which will defer to the declared type of the optional property in the subschema, but is also currently ignored by quicktype - resulting in a type that will compile, but doesn't restrict the type of optional property values as defined in the schema. -Further, quicktype doesn't always perfectly replicate polymorphic fields specified with `oneOf` in JSONSchema as it will usually merge the different objects into a single type (where fields not in one of the constitutent schemas become optional) rather than creating a union type. In such situations, the type produced is usuable (has all the necessary fields) but may allow the construction of invalid instances which are missing required properties or include properties from the multiple schemas combined, which are not possible/valid according to JSONSchema. +Further, quicktype doesn't always perfectly replicate polymorphic fields specified with `oneOf` in JSONSchema as it will usually merge the different objects into a single type (where fields not in one of the constituent schemas become optional) rather than creating a union type. In such situations, the type produced is usable (has all the necessary fields) but may allow the construction of invalid instances which are missing required properties or include properties from the multiple schemas combined, which are not possible/valid according to JSONSchema. Hence, the Types provided here can be used to provide valid Context objects and to read/write their JSON encodings, but may not detect or prevent a limited set of invalid objects that would be identified by JSONSchema. -Finally, quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the main interface definition. These often do not have unique names (e.g. fields of the `id` object in the Context schema, defined for a specific context type such as fdc3.instrument). Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. PurpleId, FluffyMarket, TentacledIdentifer etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the main type, e.g.: +Finally, quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the main interface definition. These often do not have unique names (e.g. fields of the `id` object in the Context schema, defined for a specific context type such as fdc3.instrument). Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the main type, e.g.: ```TypeScript export interface Instrument { @@ -47,6 +47,6 @@ and should not be considered a planned part of the type structure (which should Finally, please note that the latest version of quicktype (at the time of writing `23.0.19`) has a number of bugs that must be worked around: -- Using a directory or .schema.json files as a source will cause the input type argument `-s schema` to be ignored, causing the files to be interpretted as JSON rather than JSON Schema. +- Using a directory or .schema.json files as a source will cause the input type argument `-s schema` to be ignored, causing the files to be interpreted as JSON rather than JSON Schema. - A utility is provided in this repository (_../../quicktypeUtil.js_) to work around this bug by listing directories and constructing a call to quicktype where each file is provided as an individual source. - Setting the `--nice-property-names` TypeScript output option will crash the generator and can't be used. diff --git a/src/context/schemas.json b/src/context/schemas.json deleted file mode 100644 index 4310f348d..000000000 --- a/src/context/schemas.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "Context": ["https://fdc3.finos.org/schemas/next/context.schema.json"], - "Chart": ["https://fdc3.finos.org/schemas/next/chart.schema.json"], - "ChatInitSettings": ["https://fdc3.finos.org/schemas/next/chatInitSettings.schema.json"], - "Contact": ["https://fdc3.finos.org/schemas/next/contact.schema.json"], - "ContactList": ["https://fdc3.finos.org/schemas/next/contactList.schema.json"], - "Country": ["https://fdc3.finos.org/schemas/next/country.schema.json"], - "Currency": ["https://fdc3.finos.org/schemas/next/currency.schema.json"], - "Email": ["https://fdc3.finos.org/schemas/next/email.schema.json"], - "Instrument": ["https://fdc3.finos.org/schemas/next/instrument.schema.json"], - "InstrumentList": ["https://fdc3.finos.org/schemas/next/instrumentList.schema.json"], - "Nothing": ["https://fdc3.finos.org/schemas/next/nothing.schema.json"], - "Organization": ["https://fdc3.finos.org/schemas/next/organization.schema.json"], - "Portfolio": ["https://fdc3.finos.org/schemas/next/portfolio.schema.json"], - "Position": ["https://fdc3.finos.org/schemas/next/position.schema.json"], - "TimeRange": ["https://fdc3.finos.org/schemas/next/timerange.schema.json"], - "Valuation": ["https://fdc3.finos.org/schemas/next/valuation.schema.json"] -} diff --git a/website/package.json b/website/package.json index a16b08fe0..68f4799b4 100644 --- a/website/package.json +++ b/website/package.json @@ -4,7 +4,7 @@ "start": "docusaurus start", "prebuild": "npm run copy-appd && npm run copy-schemas && npm run copy-workbench && npm run copy-explained", "build": "docusaurus build", - "copy-schemas": "cpy \"../src/context/schemas/*.json\" \"static/schemas/next/\"", + "copy-schemas": "del-cli static/schemas/next/*/ && cpy \"../schemas/**\" static/schemas/next/", "copy-appd": "cpy \"../src/app-directory/specification/*.yaml\" \"static/schemas/next/\" --rename app-directory.yaml", "build-workbench": "cd ../toolbox/fdc3-workbench && npm install && npm run build", "copy-workbench": "del-cli static/toolbox/fdc3-workbench && npm run build-workbench && cpy \"../toolbox/fdc3-workbench/build/**\" static/toolbox/fdc3-workbench", diff --git a/website/static/schemas/next/api/appIdentifier.schema.json b/website/static/schemas/next/api/appIdentifier.schema.json new file mode 100644 index 000000000..29ef4c7d0 --- /dev/null +++ b/website/static/schemas/next/api/appIdentifier.schema.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/appIdentifier.schema.json", + "title": "AppIdentifier", + "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls at specific applications.", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "instanceId": { + "type": "string" + }, + "desktopAgent": { + "type": "string" + } + }, + "required": [ + "appId" + ], + "unevaluatedProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/appIntent.schema.json b/website/static/schemas/next/api/appIntent.schema.json new file mode 100644 index 000000000..1f2315d37 --- /dev/null +++ b/website/static/schemas/next/api/appIntent.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/appIntent.schema.json", + "title": "AppIntent", + "description": "Represents the binding of an intent to apps", + "type": "object", + "properties": { + "intent": { + "$ref": "intentMetadata.schema.json" + }, + "apps": { + "type": "array", + "items": { + "$ref": "appMetadata.schema.json" + } + } + }, + "required": [ + "intent", + "apps" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/appMetadata.schema.json b/website/static/schemas/next/api/appMetadata.schema.json new file mode 100644 index 000000000..14bfc1a8f --- /dev/null +++ b/website/static/schemas/next/api/appMetadata.schema.json @@ -0,0 +1,54 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/appMetadata.schema.json", + "title": "AppMetadata", + "description": "Extends an AppIdentifier, describing an application or instance of an application.", + "type": "object", + "allOf": [ + { + "$ref": "appIdentifier.schema.json" + } + ], + "properties": { + "appId": true, + "instanceId": true, + "desktopAgent": true, + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "instanceMetadata": { + "type": "object" + }, + "title": { + "type": "string" + }, + "tooltip": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icons": { + "type": "array", + "items": { + "$ref": "icon.schema.json" + } + }, + "screenshots": { + "type": "array", + "items": { + "$ref": "image.schema.json" + } + }, + "resultType": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/channel.schema.json b/website/static/schemas/next/api/channel.schema.json new file mode 100644 index 000000000..76c80ce80 --- /dev/null +++ b/website/static/schemas/next/api/channel.schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/channel.schema.json", + "title": "Channel", + "description": "Represents a context channel that applications can join to share context data.", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "user", + "app", + "private" + ] + }, + "displayMetadata": { + "$ref": "displayMetadata.schema.json" + } + }, + "required": [ + "id", + "type" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/contextMetadata.schema.json b/website/static/schemas/next/api/contextMetadata.schema.json new file mode 100644 index 000000000..29dd86436 --- /dev/null +++ b/website/static/schemas/next/api/contextMetadata.schema.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/contextMetadata.schema.json", + "title": "ContextMetadata", + "description": "Metadata relating to a context or intent & context received through the addContextListener and addIntentListener functions.", + "type": "object", + "properties": { + "source": { + "$ref": "appIdentifier.schema.json" + } + }, + "required": [ + "source" + ], + "additionalProperties": false +} diff --git a/website/static/schemas/next/api/desktopAgentIdentifier.schema.json b/website/static/schemas/next/api/desktopAgentIdentifier.schema.json new file mode 100644 index 000000000..c07c0d341 --- /dev/null +++ b/website/static/schemas/next/api/desktopAgentIdentifier.schema.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/desktopAgentIdentifier.schema.json", + "title": "DesktopAgentIdentifier", + "description": "Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the source or destination of a message which was produced by or should be processed by the Desktop Agent itself rather than a specific application. Often added to messages by the Desktop Agent Bridge.", + "type": "object", + "properties": { + "desktopAgent": { + "type": "string" + } + }, + "required": [ + "desktopAgent" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/displayMetadata.schema.json b/website/static/schemas/next/api/displayMetadata.schema.json new file mode 100644 index 000000000..a83f5ef9a --- /dev/null +++ b/website/static/schemas/next/api/displayMetadata.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/displayMetadata.schema.json", + "title": "DisplayMetadata", + "description": "A desktop agent (typically for user channels) may want to provide additional information about how a channel can be represented in a UI. A common use case is for color linking.", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "glyph": { + "type": "string" + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/errors.schema.json b/website/static/schemas/next/api/errors.schema.json new file mode 100644 index 000000000..2c50b00b1 --- /dev/null +++ b/website/static/schemas/next/api/errors.schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/errors.schema.json", + "definitions": { + "OpenError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling the open method on the DesktopAgent object.", + "enum": [ + "AppNotFound", + "ErrorOnLaunch", + "AppTimeout", + "ResolverUnavailable", + "DesktopAgentNotFound" + ] + }, + "ResolveError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling the findIntent, findIntentsByContext, raiseIntent or raiseIntentForContext methods on the DesktopAgent.", + "enum": [ + "NoAppsFound", + "ResolverUnavailable", + "UserCancelledResolution", + "ResolverTimeout", + "TargetAppUnavailable", + "TargetInstanceUnavailable", + "IntentDeliveryFailed", + "DesktopAgentNotFound" + ] + }, + "ResultError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling the getResult method on the IntentResolution Object.", + "enum": [ + "NoResultReturned", + "IntentHandlerRejected" + ] + }, + "ChannelError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered when calling channels using the joinUserChannel or getOrCreateChannel methods, or the getCurrentContext, broadcast or addContextListener methods on the Channel object.", + "enum": [ + "NoChannelFound", + "AccessDenied", + "CreationFailed" + ] + }, + "BridgingError": { + "type": "string", + "description": "Contains constants representing the errors that can be encountered by Desktop Agents when exchanging bridging messages.", + "enum": [ + "ResponseToBridgeTimedOut", + "AgentDisconnected", + "NotConnectedToBridge" + ] + } + } +} \ No newline at end of file diff --git a/website/static/schemas/next/api/icon.schema.json b/website/static/schemas/next/api/icon.schema.json new file mode 100644 index 000000000..951356324 --- /dev/null +++ b/website/static/schemas/next/api/icon.schema.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/icon.schema.json", + "title": "Icon", + "description": "Metadata relating to a single icon image at a remote URL, used to represent an application in a user interface.", + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "size": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "src" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/image.schema.json b/website/static/schemas/next/api/image.schema.json new file mode 100644 index 000000000..1f962a601 --- /dev/null +++ b/website/static/schemas/next/api/image.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/image.schema.json", + "title": "Image", + "description": "Metadata relating to a single image at a remote URL, used to represent screenshot images.", + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "size": { + "type": "string" + }, + "type": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "required": [ + "src" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/api/schemas/implementationMetadata.schema.json b/website/static/schemas/next/api/implementationMetadata.schema.json similarity index 86% rename from src/api/schemas/implementationMetadata.schema.json rename to website/static/schemas/next/api/implementationMetadata.schema.json index 0e8f5172b..6f0b53bed 100644 --- a/src/api/schemas/implementationMetadata.schema.json +++ b/website/static/schemas/next/api/implementationMetadata.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/implementationMetadata.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", "title": "ImplementationMetadata", "description": "Metadata relating to the FDC3 DesktopAgent object and its provider", "type": "object", @@ -31,7 +31,7 @@ "additionalProperties": false }, "appMetadata": { - "$ref": "https://fdc3.finos.org/schemas/next/appMetadata.schema.json" + "$ref": "appMetadata.schema.json" } }, "required": [ diff --git a/website/static/schemas/next/api/intentMetadata.schema.json b/website/static/schemas/next/api/intentMetadata.schema.json new file mode 100644 index 000000000..61cba896c --- /dev/null +++ b/website/static/schemas/next/api/intentMetadata.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/intentMetadata.schema.json", + "title": "IntentMetadata", + "description": "The interface used to describe an intent within the platform.", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "displayName": { + "type": "string" + } + }, + "required": [ + "displayName" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/intentResolution.schema.json b/website/static/schemas/next/api/intentResolution.schema.json new file mode 100644 index 000000000..65a6138ed --- /dev/null +++ b/website/static/schemas/next/api/intentResolution.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/intentResolution.schema.json", + "title": "IntentResolution", + "description": "IntentResolution provides a standard format for data returned upon resolving an intent.", + "type": "object", + "properties": { + "source": { + "$ref": "appIdentifier.schema.json" + }, + "intent": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "source", + "intent" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/intentResult.schema.json b/website/static/schemas/next/api/intentResult.schema.json new file mode 100644 index 000000000..4d8d89ea9 --- /dev/null +++ b/website/static/schemas/next/api/intentResult.schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/intentResult.schema.json", + "title": "IntentResult", + "description": "Describes results that an Intent handler may optionally return that should be communicated back to the app that raised the intent, via the IntentResolution.", + "type": "object", + "oneOf": [ + { + "$ref": "../context/context.schema.json" + }, + { + "$ref": "channel.schema.json" + } + ] +} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/bridgeRequest.schema.json b/website/static/schemas/next/bridging/bridgeRequest.schema.json new file mode 100644 index 000000000..7053f76e2 --- /dev/null +++ b/website/static/schemas/next/bridging/bridgeRequest.schema.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json", + "title": "BridgeRequest", + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." + }, + "payload": { + "type": "object", + "description": "The message payload typically contains the arguments to FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/RequestMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "RequestMeta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + }, + "source": { + "description": "Field that represents the source application that the request was received from.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "destination": { + "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + } + }, + "required": ["requestGuid", "timestamp", "source"] + } + } +} diff --git a/website/static/schemas/next/bridging/bridgeResponse.schema.json b/website/static/schemas/next/bridging/bridgeResponse.schema.json new file mode 100644 index 000000000..62b332855 --- /dev/null +++ b/website/static/schemas/next/bridging/bridgeResponse.schema.json @@ -0,0 +1,79 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json", + "title": "BridgeResponse", + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "type": "object", + "description": "The message payload typically contains return values for FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/ResponseMeta" + } + }, + "additionalProperties": false, + "required": ["type", "payload", "meta"], + "$defs": { + "ResponseMeta": { + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json#/$defs/RequestMeta" + }, + { + "type": "object", + "properties": { + "requestGuid": true, + "timestamp": true, + "responseGuid": { + "type": "string", + "description": "Unique GUID for the response" + }, + "sources": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored." + }, + "errorSources": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors." + }, + "errorDetails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + } + }, + "required": ["requestGuid", "responseGuid", "timestamp"], + "additionalProperties": false + } + ] + } + } +} diff --git a/website/static/schemas/next/bridging/broadcastRequest.schema.json b/website/static/schemas/next/bridging/broadcastRequest.schema.json new file mode 100644 index 000000000..058539666 --- /dev/null +++ b/website/static/schemas/next/bridging/broadcastRequest.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json", + "title": "BroadcastRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type":"object", + "properties": { + "type": { + "const": "broadcastRequest" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "$ref": "../api/channel.schema.json" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "additionalProperties": false, + "required": ["channel", "context"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties":false + } + ] +} diff --git a/website/static/schemas/next/bridging/findInstancesRequest.schema.json b/website/static/schemas/next/bridging/findInstancesRequest.schema.json new file mode 100644 index 000000000..1af8e5420 --- /dev/null +++ b/website/static/schemas/next/bridging/findInstancesRequest.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json", + "title": "FindInstancesRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findInstancesRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["app"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/website/static/schemas/next/bridging/findInstancesResponse.schema.json b/website/static/schemas/next/bridging/findInstancesResponse.schema.json new file mode 100644 index 000000000..801c35645 --- /dev/null +++ b/website/static/schemas/next/bridging/findInstancesResponse.schema.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesResponse.schema.json", + "title": "findInstancesResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findInstancesResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIdentifiers": { + "type": "array", + "items": { + "$ref": "../api/appMetadata.schema.json" + } + } + }, + "required": ["appIdentifiers"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentRequest.schema.json b/website/static/schemas/next/bridging/findIntentRequest.schema.json new file mode 100644 index 000000000..53bc7a2c0 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentRequest.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json", + "title": "FindIntentRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findIntentRequest" + }, + "payload": { + "type": "object", + "properties": { + "intent": { + "type": "string" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["intent", "context"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentResponse.schema.json b/website/static/schemas/next/bridging/findIntentResponse.schema.json new file mode 100644 index 000000000..9e6318bd0 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentResponse.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json", + "title": "FindIntentResponse", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findIntentResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIntent": { + "$ref": "../api/appIntent.schema.json" + } + }, + "required": ["appIntent"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json b/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json new file mode 100644 index 000000000..e2444f4c7 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextRequest.schema.json", + "title": "FindIntentsForContextRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "findIntentsForContextRequest" + }, + "payload": { + "type": "object", + "properties": { + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["context"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentsForContextResponse.schema.json b/website/static/schemas/next/bridging/findIntentsForContextResponse.schema.json new file mode 100644 index 000000000..2bcb1073d --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentsForContextResponse.schema.json @@ -0,0 +1,48 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextResponse.schema.json", + "title": "FindIntentsForContextResponse", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "properties": { + "type": { + "const": "findIntentsForContextResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIntents": { + "type": "array", + "items": { + "$ref": "../api/appIntent.schema.json" + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": ["appIntents"] + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json new file mode 100644 index 000000000..8f4b551ce --- /dev/null +++ b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json", + "title": "GetAppMetadataRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "getAppMetadataRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["app"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json new file mode 100644 index 000000000..26d2dc468 --- /dev/null +++ b/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json", + "title": "GetAppMetadataResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "getAppMetadataResponse" + }, + "payload": { + "type": "object", + "properties": { + "appMetadata": { + "$ref": "../api/appMetadata.schema.json" + } + }, + "required": ["appMetadata"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/openRequest.schema.json b/website/static/schemas/next/bridging/openRequest.schema.json new file mode 100644 index 000000000..578c49c6a --- /dev/null +++ b/website/static/schemas/next/bridging/openRequest.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openRequest.schema.json", + "title": "openRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "openRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["app"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/website/static/schemas/next/bridging/openResponse.schema.json b/website/static/schemas/next/bridging/openResponse.schema.json new file mode 100644 index 000000000..9c6c80dd9 --- /dev/null +++ b/website/static/schemas/next/bridging/openResponse.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json", + "title": "OpenResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "openResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIdentifier": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["appIdentifier"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json new file mode 100644 index 000000000..b8d1b9449 --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json", + "title": "RaiseIntentRequest", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "raiseIntentRequest" + }, + "payload": { + "type": "object", + "properties": { + "app": { + "$ref": "../api/appIdentifier.schema.json" + }, + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["app", "context"], + "additionalProperties": false + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "destination": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/website/static/schemas/next/bridging/raiseIntentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResponse.schema.json new file mode 100644 index 000000000..82398d3c3 --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentResponse.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json", + "title": "RaiseIntentResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "raiseIntentResponse" + }, + "payload": { + "type": "object", + "properties": { + "intentResolution": { + "$ref": "../api/intentResolution.schema.json" + } + }, + "required": ["intentResolution"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json new file mode 100644 index 000000000..bcd88e3d4 --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json", + "title": "RaiseIntentResultResponse", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "raiseIntentResultResponse" + }, + "payload": { + "type": "object", + "properties": { + "intentResult": { + "oneOf": [ + { + "type": "object", + "properties": { + "context": { + "$ref": "../context/context.schema.json" + } + }, + "required": ["context"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "channel": { + "$ref": "../api/channel.schema.json" + } + }, + "required": ["channel"], + "additionalProperties": false + } + ] + } + }, + "required": ["intentResult"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/appIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/chart.schema.json b/website/static/schemas/next/context/chart.schema.json similarity index 89% rename from website/static/schemas/next/chart.schema.json rename to website/static/schemas/next/context/chart.schema.json index ab541e70c..d5b493a7d 100644 --- a/website/static/schemas/next/chart.schema.json +++ b/website/static/schemas/next/context/chart.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chart.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chart.schema.json", "type": "object", "title": "Chart", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/chatInitSettings.schema.json b/website/static/schemas/next/context/chatInitSettings.schema.json similarity index 88% rename from website/static/schemas/next/chatInitSettings.schema.json rename to website/static/schemas/next/context/chatInitSettings.schema.json index 044068dbd..249fb7e76 100644 --- a/website/static/schemas/next/chatInitSettings.schema.json +++ b/website/static/schemas/next/context/chatInitSettings.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatInitSettings.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatInitSettings.schema.json", "type": "object", "title": "ChatInitSettings", "properties": { diff --git a/src/context/schemas/contact.schema.json b/website/static/schemas/next/context/contact.schema.json similarity index 83% rename from src/context/schemas/contact.schema.json rename to website/static/schemas/next/context/contact.schema.json index 154ed146f..6aef5f52e 100644 --- a/src/context/schemas/contact.schema.json +++ b/website/static/schemas/next/context/contact.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/contact.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/contact.schema.json", "type": "object", "title": "Contact", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/contactList.schema.json b/website/static/schemas/next/context/contactList.schema.json similarity index 81% rename from src/context/schemas/contactList.schema.json rename to website/static/schemas/next/context/contactList.schema.json index f09080f5c..57bf2a532 100644 --- a/src/context/schemas/contactList.schema.json +++ b/website/static/schemas/next/context/contactList.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/contactList.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/contactList.schema.json", "type": "object", "title": "ContactList", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/context.schema.json b/website/static/schemas/next/context/context.schema.json similarity index 62% rename from website/static/schemas/next/context.schema.json rename to website/static/schemas/next/context/context.schema.json index 8671df1a0..b14861b52 100644 --- a/website/static/schemas/next/context.schema.json +++ b/website/static/schemas/next/context/context.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/context.schema.json", "type": "object", "title": "Context", "properties": { @@ -8,8 +8,9 @@ "name": { "type": "string" }, "id": { "type": "object", - "additionalProperties": { "type": "string" } + "unevaluatedProperties": { "type": "string" } } }, + "additionalItems": true, "required": ["type"] } diff --git a/src/context/schemas/country.schema.json b/website/static/schemas/next/context/country.schema.json similarity index 86% rename from src/context/schemas/country.schema.json rename to website/static/schemas/next/context/country.schema.json index f29ae7611..2a0a6a763 100644 --- a/src/context/schemas/country.schema.json +++ b/website/static/schemas/next/context/country.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/country.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/country.schema.json", "type": "object", "title": "Country", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/currency.schema.json b/website/static/schemas/next/context/currency.schema.json similarity index 84% rename from website/static/schemas/next/currency.schema.json rename to website/static/schemas/next/context/currency.schema.json index 8d87f517a..aa0c08455 100644 --- a/website/static/schemas/next/currency.schema.json +++ b/website/static/schemas/next/context/currency.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/currency.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/currency.schema.json", "type": "object", "title": "Currency", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/email.schema.json b/website/static/schemas/next/context/email.schema.json similarity index 86% rename from src/context/schemas/email.schema.json rename to website/static/schemas/next/context/email.schema.json index a885680d9..4ec814dcf 100644 --- a/src/context/schemas/email.schema.json +++ b/website/static/schemas/next/context/email.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/email.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/email.schema.json", "type": "object", "title": "Email", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/instrument.schema.json b/website/static/schemas/next/context/instrument.schema.json similarity index 86% rename from website/static/schemas/next/instrument.schema.json rename to website/static/schemas/next/context/instrument.schema.json index 4127ed604..eee0f800f 100644 --- a/website/static/schemas/next/instrument.schema.json +++ b/website/static/schemas/next/context/instrument.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/instrument.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/instrument.schema.json", "type": "object", "title": "Instrument", "allOf": [{ "$ref": "context.schema.json#" }], @@ -27,8 +27,10 @@ "name": { "type": "string" }, "COUNTRY_ISOALPHA2": { "type": "string" }, "BBG": { "type": "string" } - } + }, + "unevaluatedProperties": { "type": "string" } } + }, "required": ["id"] } \ No newline at end of file diff --git a/src/context/schemas/instrumentList.schema.json b/website/static/schemas/next/context/instrumentList.schema.json similarity index 81% rename from src/context/schemas/instrumentList.schema.json rename to website/static/schemas/next/context/instrumentList.schema.json index 6aa927fd1..ceca78935 100644 --- a/src/context/schemas/instrumentList.schema.json +++ b/website/static/schemas/next/context/instrumentList.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/instrumentList.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/instrumentList.schema.json", "type": "object", "title": "InstrumentList", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/nothing.schema.json b/website/static/schemas/next/context/nothing.schema.json similarity index 73% rename from src/context/schemas/nothing.schema.json rename to website/static/schemas/next/context/nothing.schema.json index d13c3f05e..a7d67095e 100644 --- a/src/context/schemas/nothing.schema.json +++ b/website/static/schemas/next/context/nothing.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/nothing.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/nothing.schema.json", "type": "object", "title": "Nothing", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/organization.schema.json b/website/static/schemas/next/context/organization.schema.json similarity index 84% rename from src/context/schemas/organization.schema.json rename to website/static/schemas/next/context/organization.schema.json index 986eb9c96..7a791496e 100644 --- a/src/context/schemas/organization.schema.json +++ b/website/static/schemas/next/context/organization.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/organization.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/organization.schema.json", "type": "object", "title": "Organization", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/portfolio.schema.json b/website/static/schemas/next/context/portfolio.schema.json similarity index 81% rename from website/static/schemas/next/portfolio.schema.json rename to website/static/schemas/next/context/portfolio.schema.json index 69ee04e81..64202e02f 100644 --- a/website/static/schemas/next/portfolio.schema.json +++ b/website/static/schemas/next/context/portfolio.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/portfolio.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/portfolio.schema.json", "type": "object", "title": "Portfolio", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/src/context/schemas/position.schema.json b/website/static/schemas/next/context/position.schema.json similarity index 82% rename from src/context/schemas/position.schema.json rename to website/static/schemas/next/context/position.schema.json index 262cbbc95..e2a948aee 100644 --- a/src/context/schemas/position.schema.json +++ b/website/static/schemas/next/context/position.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/position.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/position.schema.json", "type": "object", "title": "Position", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/timerange.schema.json b/website/static/schemas/next/context/timerange.schema.json similarity index 86% rename from website/static/schemas/next/timerange.schema.json rename to website/static/schemas/next/context/timerange.schema.json index a17c5fbff..5b6b326f5 100644 --- a/website/static/schemas/next/timerange.schema.json +++ b/website/static/schemas/next/context/timerange.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/timerange.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/timerange.schema.json", "type": "object", "title": "TimeRange", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/valuation.schema.json b/website/static/schemas/next/context/valuation.schema.json similarity index 87% rename from website/static/schemas/next/valuation.schema.json rename to website/static/schemas/next/context/valuation.schema.json index e9a2f57ba..7ad55be71 100644 --- a/website/static/schemas/next/valuation.schema.json +++ b/website/static/schemas/next/context/valuation.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/valuation.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/valuation.schema.json", "type": "object", "title": "Valuation", "allOf": [{ "$ref": "context.schema.json#" }], From 4fad1f7d40b57997bc68f8609e9dd09accf3d72a Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 17:58:27 +0100 Subject: [PATCH 027/106] correcting payloads on a couple of PrivateChannel messages --- docs/api-bridging/ref/PrivateChannel.onDisconnect.md | 4 +++- docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/ref/PrivateChannel.onDisconnect.md b/docs/api-bridging/ref/PrivateChannel.onDisconnect.md index 73fcc8858..3f0bfa720 100644 --- a/docs/api-bridging/ref/PrivateChannel.onDisconnect.md +++ b/docs/api-bridging/ref/PrivateChannel.onDisconnect.md @@ -22,7 +22,9 @@ When the `disconnect` function is is called on a `PrivateChannel` any applicatio // agent-A -> DAB { "type": "PrivateChannel.onDisconnect", - "payload": {}, + "payload": { + "channel": "private-channel-ABC123" + }, "meta": { "requestGuid": "", "timestamp": "2020-03-...", diff --git a/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md index 43331d43c..e6ef7acee 100644 --- a/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -25,7 +25,10 @@ When a `ContextListener` is removed from a `PrivateChannel` (via `listener.unsub // DAB -> agent-B { "type": "PrivateChannel.onUnsubscribe", - "payload": {}, + "payload": { + "channel": "private-channel-ABC123", + "contextType": "fdc3.instrument" + }, "meta": { "requestGuid": "", "timestamp": "2020-03-...", From fd5cdcb9d177e2ac90dbed4833173eb621e65272 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 18:27:31 +0100 Subject: [PATCH 028/106] Refining request destinations --- schemas/bridging/bridgeRequest.schema.json | 3 +- schemas/bridging/broadcastRequest.schema.json | 1 - .../bridging/findInstancesRequest.schema.json | 4 +- .../bridging/findIntentRequest.schema.json | 1 - .../findIntentsForContextRequest.schema.json | 1 - .../getAppMetadataRequest.schema.json | 4 +- .../bridging/raiseIntentRequest.schema.json | 7 +- src/bridging/BridgingTypes.ts | 165 ++++++++---------- .../api/implementationMetadata.schema.json | 3 + .../bridging/broadcastRequest.schema.json | 1 - .../bridging/findInstancesRequest.schema.json | 4 +- .../bridging/findIntentRequest.schema.json | 1 - .../findIntentsForContextRequest.schema.json | 1 - .../getAppMetadataRequest.schema.json | 4 +- .../bridging/raiseIntentRequest.schema.json | 7 +- 15 files changed, 94 insertions(+), 113 deletions(-) diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json index 6115cbaa0..7053f76e2 100644 --- a/schemas/bridging/bridgeRequest.schema.json +++ b/schemas/bridging/bridgeRequest.schema.json @@ -51,8 +51,7 @@ { "$ref": "../api/desktopAgentIdentifier.schema.json" } - ], - "additionalProperties": false + ] } }, "required": ["requestGuid", "timestamp", "source"] diff --git a/schemas/bridging/broadcastRequest.schema.json b/schemas/bridging/broadcastRequest.schema.json index 058539666..0124a79d2 100644 --- a/schemas/bridging/broadcastRequest.schema.json +++ b/schemas/bridging/broadcastRequest.schema.json @@ -30,7 +30,6 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/schemas/bridging/findInstancesRequest.schema.json b/schemas/bridging/findInstancesRequest.schema.json index 1af8e5420..7ab6db714 100644 --- a/schemas/bridging/findInstancesRequest.schema.json +++ b/schemas/bridging/findInstancesRequest.schema.json @@ -27,7 +27,9 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, + "destination": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/schemas/bridging/findIntentRequest.schema.json b/schemas/bridging/findIntentRequest.schema.json index 53bc7a2c0..7c58da28c 100644 --- a/schemas/bridging/findIntentRequest.schema.json +++ b/schemas/bridging/findIntentRequest.schema.json @@ -30,7 +30,6 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/schemas/bridging/findIntentsForContextRequest.schema.json b/schemas/bridging/findIntentsForContextRequest.schema.json index e2444f4c7..6054aba2c 100644 --- a/schemas/bridging/findIntentsForContextRequest.schema.json +++ b/schemas/bridging/findIntentsForContextRequest.schema.json @@ -27,7 +27,6 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/schemas/bridging/getAppMetadataRequest.schema.json b/schemas/bridging/getAppMetadataRequest.schema.json index 8f4b551ce..4aeb2abb5 100644 --- a/schemas/bridging/getAppMetadataRequest.schema.json +++ b/schemas/bridging/getAppMetadataRequest.schema.json @@ -27,7 +27,9 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, + "destination": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/schemas/bridging/raiseIntentRequest.schema.json b/schemas/bridging/raiseIntentRequest.schema.json index b8d1b9449..275a6d030 100644 --- a/schemas/bridging/raiseIntentRequest.schema.json +++ b/schemas/bridging/raiseIntentRequest.schema.json @@ -30,12 +30,15 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + }, "source": { "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "additionalProperties": false, + "required": ["requestGuid","timestamp","destination","source"] } }, "additionalProperties": false diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 7708d1852..03e8d34a2 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -277,7 +277,7 @@ export interface MetaObject { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: Destination; + destination?: DestinationElement; /** * Unique GUID for the request */ @@ -285,7 +285,7 @@ export interface MetaObject { /** * Field that represents the source application that the request was received from. */ - source: ErrorSourceElement; + source: DestinationElement; /** * Timestamp at which request or response was generated */ @@ -308,20 +308,7 @@ export interface MetaObject { * Desktop Agent itself rather than a specific application. Often added to messages by the * Desktop Agent Bridge. */ -export interface Destination {} - -/** - * Field that represents the source application that the request was received from. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. - * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. - */ -export interface ErrorSourceElement { +export interface DestinationElement { appId?: string; desktopAgent?: string; instanceId?: string; @@ -361,7 +348,7 @@ export interface BridgeResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: ErrorSourceElement[]; + errorSources?: DestinationElement[]; /** * Unique GUID for the response */ @@ -372,7 +359,7 @@ export interface BridgeResponseMeta { * multiple values for responses that were collated by the bridge. May be omitted if all * sources errored. */ - sources?: ErrorSourceElement[]; + sources?: DestinationElement[]; } export interface BroadcastRequest { @@ -389,12 +376,6 @@ export interface BroadcastRequest { } export interface BroadcastRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: Destination; /** * Unique GUID for the request */ @@ -410,6 +391,10 @@ export interface BroadcastRequestMeta { } /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * * Field that represents the source application that the request was received from. * * Identifies an application, or instance of an application, and is used to target FDC3 API @@ -470,7 +455,7 @@ export interface FindInstancesRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: Destination; + destination?: DestinationClass; /** * Unique GUID for the request */ @@ -485,6 +470,25 @@ export interface FindInstancesRequestMeta { timestamp: Date; } +/** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Field that represents the source application that the request was received from. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface DestinationClass { + desktopAgent: string; +} + /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -525,7 +529,7 @@ export interface FindInstancesResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: ErrorSourceElement[]; + errorSources?: DestinationElement[]; /** * Unique GUID for the response */ @@ -536,7 +540,7 @@ export interface FindInstancesResponseMeta { * multiple values for responses that were collated by the bridge. May be omitted if all * sources errored. */ - sources?: SourceClass[]; + sources?: ErrorSourceElement[]; } /** @@ -545,7 +549,7 @@ export interface FindInstancesResponseMeta { * Desktop Agent itself rather than a specific application. Often added to messages by the * Desktop Agent Bridge. */ -export interface SourceClass { +export interface ErrorSourceElement { desktopAgent: string; } @@ -570,12 +574,6 @@ export interface FindIntentRequest { } export interface FindIntentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: Destination; /** * Unique GUID for the request */ @@ -631,7 +629,7 @@ export interface FindIntentResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: SourceClass[]; + errorSources?: ErrorSourceElement[]; /** * Unique GUID for the response */ @@ -642,7 +640,7 @@ export interface FindIntentResponseMeta { * multiple values for responses that were collated by the bridge. May be omitted if all * sources errored. */ - sources?: SourceClass[]; + sources?: ErrorSourceElement[]; } /** @@ -674,12 +672,6 @@ export interface FindIntentsForContextRequest { } export interface FindIntentsForContextRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: Destination; /** * Unique GUID for the request */ @@ -734,7 +726,7 @@ export interface FindIntentsForContextResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: SourceClass[]; + errorSources?: ErrorSourceElement[]; /** * Unique GUID for the response */ @@ -745,7 +737,7 @@ export interface FindIntentsForContextResponseMeta { * multiple values for responses that were collated by the bridge. May be omitted if all * sources errored. */ - sources?: SourceClass[]; + sources?: ErrorSourceElement[]; } /** @@ -774,7 +766,7 @@ export interface GetAppMetadataRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: Destination; + destination?: DestinationClass; /** * Unique GUID for the request */ @@ -829,7 +821,7 @@ export interface GetAppMetadataResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: SourceClass[]; + errorSources?: ErrorSourceElement[]; /** * Unique GUID for the response */ @@ -840,7 +832,7 @@ export interface GetAppMetadataResponseMeta { * multiple values for responses that were collated by the bridge. May be omitted if all * sources errored. */ - sources?: SourceClass[]; + sources?: ErrorSourceElement[]; } /** @@ -884,23 +876,6 @@ export interface OpenRequestMeta { timestamp: Date; } -/** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - * - * Field that represents the source application that the request was received from. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. - * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. - */ -export interface DestinationClass {} - /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -942,7 +917,7 @@ export interface OpenResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: SourceClass[]; + errorSources?: ErrorSourceElement[]; /** * Unique GUID for the response */ @@ -953,7 +928,7 @@ export interface OpenResponseMeta { * multiple values for responses that were collated by the bridge. May be omitted if all * sources errored. */ - sources?: SourceClass[]; + sources?: ErrorSourceElement[]; } /** @@ -982,7 +957,7 @@ export interface RaiseIntentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: Destination; + destination: PurpleIdentifier; /** * Unique GUID for the request */ @@ -1038,7 +1013,7 @@ export interface RaiseIntentResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: ErrorSourceElement[]; + errorSources?: DestinationElement[]; /** * Unique GUID for the response */ @@ -1049,7 +1024,7 @@ export interface RaiseIntentResponseMeta { * multiple values for responses that were collated by the bridge. May be omitted if all * sources errored. */ - sources?: SourceClass[]; + sources?: ErrorSourceElement[]; } /** @@ -1101,7 +1076,7 @@ export interface RaiseIntentResultResponseMeta { * to the bridge before the timeout or because an error occurred. May be omitted if all * sources responded without errors. */ - errorSources?: ErrorSourceElement[]; + errorSources?: DestinationElement[]; /** * Unique GUID for the response */ @@ -1729,15 +1704,14 @@ const typeMap: any = { ), MetaObject: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationElement')) }, { json: 'requestGuid', js: 'requestGuid', typ: '' }, - { json: 'source', js: 'source', typ: r('ErrorSourceElement') }, + { json: 'source', js: 'source', typ: r('DestinationElement') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], 'any' ), - Destination: o([], false), - ErrorSourceElement: o( + DestinationElement: o( [ { json: 'appId', js: 'appId', typ: u(undefined, '') }, { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, @@ -1758,9 +1732,9 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DestinationElement'))) }, ], false ), @@ -1774,7 +1748,6 @@ const typeMap: any = { ), BroadcastRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -1822,13 +1795,14 @@ const typeMap: any = { ), FindInstancesRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), + DestinationClass: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), FindInstancesRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), FindInstancesResponse: o( [ @@ -1843,13 +1817,13 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), - SourceClass: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), + ErrorSourceElement: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), FindInstancesResponsePayload: o( [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadataElement')) }], false @@ -1864,7 +1838,6 @@ const typeMap: any = { ), FindIntentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -1891,9 +1864,9 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), @@ -1915,7 +1888,6 @@ const typeMap: any = { ), FindIntentsForContextRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -1936,9 +1908,9 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), @@ -1956,7 +1928,7 @@ const typeMap: any = { ), GetAppMetadataRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -1977,9 +1949,9 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), @@ -2001,7 +1973,6 @@ const typeMap: any = { ], false ), - DestinationClass: o([], false), OpenRequestPayload: o( [ { json: 'app', js: 'app', typ: r('SourceElement') }, @@ -2022,9 +1993,9 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), @@ -2039,7 +2010,7 @@ const typeMap: any = { ), RaiseIntentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('Destination')) }, + { json: 'destination', js: 'destination', typ: r('PurpleIdentifier') }, { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -2066,9 +2037,9 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceClass'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), @@ -2097,7 +2068,7 @@ const typeMap: any = { { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, { json: 'responseGuid', js: 'responseGuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceElement'))) }, ], diff --git a/website/static/schemas/next/api/implementationMetadata.schema.json b/website/static/schemas/next/api/implementationMetadata.schema.json index 6f0b53bed..b09a040ed 100644 --- a/website/static/schemas/next/api/implementationMetadata.schema.json +++ b/website/static/schemas/next/api/implementationMetadata.schema.json @@ -22,6 +22,9 @@ }, "UserChannelMembershipAPIs": { "type": "boolean" + }, + "DesktopAgentBridging": { + "type": "boolean" } }, "required": [ diff --git a/website/static/schemas/next/bridging/broadcastRequest.schema.json b/website/static/schemas/next/bridging/broadcastRequest.schema.json index 058539666..0124a79d2 100644 --- a/website/static/schemas/next/bridging/broadcastRequest.schema.json +++ b/website/static/schemas/next/bridging/broadcastRequest.schema.json @@ -30,7 +30,6 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/website/static/schemas/next/bridging/findInstancesRequest.schema.json b/website/static/schemas/next/bridging/findInstancesRequest.schema.json index 1af8e5420..7ab6db714 100644 --- a/website/static/schemas/next/bridging/findInstancesRequest.schema.json +++ b/website/static/schemas/next/bridging/findInstancesRequest.schema.json @@ -27,7 +27,9 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, + "destination": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/website/static/schemas/next/bridging/findIntentRequest.schema.json b/website/static/schemas/next/bridging/findIntentRequest.schema.json index 53bc7a2c0..7c58da28c 100644 --- a/website/static/schemas/next/bridging/findIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentRequest.schema.json @@ -30,7 +30,6 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json b/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json index e2444f4c7..6054aba2c 100644 --- a/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json @@ -27,7 +27,6 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json index 8f4b551ce..4aeb2abb5 100644 --- a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json @@ -27,7 +27,9 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, + "destination": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + }, "source": { "$ref": "../api/appIdentifier.schema.json" } diff --git a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json index b8d1b9449..275a6d030 100644 --- a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json @@ -30,12 +30,15 @@ "properties": { "requestGuid": true, "timestamp": true, - "destination": true, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + }, "source": { "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "additionalProperties": false, + "required": ["requestGuid","timestamp","destination","source"] } }, "additionalProperties": false From 7e519fca77f472e07fbad673a4b051e745e58114 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Tue, 25 Apr 2023 18:46:26 +0100 Subject: [PATCH 029/106] added private channel schemas --- .../privateChannelBroadcast.schema.json | 45 ++ ...ivateChannelEventListenerAdded.schema.json | 45 ++ ...ateChannelEventListenerRemoved.schema.json | 45 ++ ...ateChannelOnAddContextListener.schema.json | 45 ++ .../privateChannelOnDisconnect.schema.json | 42 ++ .../privateChannelOnUnsubscribe.schema.json | 45 ++ src/api/DesktopAgentIdentifier.ts | 10 +- src/api/Errors.ts | 2 +- src/bridging/BridgingTypes.ts | 445 +++++++++++++++++- .../privateChannelBroadcast.schema.json | 45 ++ ...ivateChannelEventListenerAdded.schema.json | 45 ++ ...ateChannelEventListenerRemoved.schema.json | 45 ++ ...ateChannelOnAddContextListener.schema.json | 45 ++ .../privateChannelOnDisconnect.schema.json | 42 ++ .../privateChannelOnUnsubscribe.schema.json | 45 ++ 15 files changed, 984 insertions(+), 7 deletions(-) create mode 100644 schemas/bridging/privateChannelBroadcast.schema.json create mode 100644 schemas/bridging/privateChannelEventListenerAdded.schema.json create mode 100644 schemas/bridging/privateChannelEventListenerRemoved.schema.json create mode 100644 schemas/bridging/privateChannelOnAddContextListener.schema.json create mode 100644 schemas/bridging/privateChannelOnDisconnect.schema.json create mode 100644 schemas/bridging/privateChannelOnUnsubscribe.schema.json create mode 100644 website/static/schemas/next/bridging/privateChannelBroadcast.schema.json create mode 100644 website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json create mode 100644 website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json create mode 100644 website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json create mode 100644 website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json create mode 100644 website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json diff --git a/schemas/bridging/privateChannelBroadcast.schema.json b/schemas/bridging/privateChannelBroadcast.schema.json new file mode 100644 index 000000000..1cd27730a --- /dev/null +++ b/schemas/bridging/privateChannelBroadcast.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcast.schema.json", + "title": "PrivateChannel.broadcast", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.broadcast" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "context": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "context"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/schemas/bridging/privateChannelEventListenerAdded.schema.json b/schemas/bridging/privateChannelEventListenerAdded.schema.json new file mode 100644 index 000000000..fd140c5fb --- /dev/null +++ b/schemas/bridging/privateChannelEventListenerAdded.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAdded.schema.json", + "title": "PrivateChannel.eventListenerAdded", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.eventListenerAdded" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "context": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "context"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/schemas/bridging/privateChannelEventListenerRemoved.schema.json b/schemas/bridging/privateChannelEventListenerRemoved.schema.json new file mode 100644 index 000000000..b9b758a6d --- /dev/null +++ b/schemas/bridging/privateChannelEventListenerRemoved.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json", + "title": "PrivateChannel.eventListenerRemoved", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.eventListenerRemoved" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "listenerType": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "listenerType"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/schemas/bridging/privateChannelOnAddContextListener.schema.json b/schemas/bridging/privateChannelOnAddContextListener.schema.json new file mode 100644 index 000000000..8532e51f3 --- /dev/null +++ b/schemas/bridging/privateChannelOnAddContextListener.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListener.schema.json", + "title": "PrivateChannel.onAddContextListener", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.onAddContextListener" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "contextType": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "contextType"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/schemas/bridging/privateChannelOnDisconnect.schema.json b/schemas/bridging/privateChannelOnDisconnect.schema.json new file mode 100644 index 000000000..0645df13a --- /dev/null +++ b/schemas/bridging/privateChannelOnDisconnect.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnect.schema.json", + "title": "PrivateChannel.onDisconnect", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.onDisconnect" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/schemas/bridging/privateChannelOnUnsubscribe.schema.json b/schemas/bridging/privateChannelOnUnsubscribe.schema.json new file mode 100644 index 000000000..99af91833 --- /dev/null +++ b/schemas/bridging/privateChannelOnUnsubscribe.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json", + "title": "PrivateChannel.onUnsubscribe", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.onUnsubscribe" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "contextType": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "contextType"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/src/api/DesktopAgentIdentifier.ts b/src/api/DesktopAgentIdentifier.ts index 2c073b32d..780ed6b0d 100644 --- a/src/api/DesktopAgentIdentifier.ts +++ b/src/api/DesktopAgentIdentifier.ts @@ -4,15 +4,15 @@ */ /** - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * @experimental */ export interface DesktopAgentIdentifier { - /** Used in Desktop Agent Bridging to attribute or target a message to a + /** Used in Desktop Agent Bridging to attribute or target a message to a * particular Desktop Agent. */ readonly desktopAgent: string; } diff --git a/src/api/Errors.ts b/src/api/Errors.ts index 2e70373f6..9891c5fbd 100644 --- a/src/api/Errors.ts +++ b/src/api/Errors.ts @@ -59,5 +59,5 @@ export enum BridgingError { /** (Experimental) Returned if a Desktop Agent that has been targeted by a particular request has been disconnected from the Bridge before a response has been received from it. */ AgentDisconnected = 'AgentDisconnected', /** (Experimental) Returned for FDC3 API calls that are specified with arguments indicating that a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a remote DesktopAgent targeted), when the local Desktop Agent is not connected to a bridge. */ - NotConnectedToBridge = 'NotConnectedToBridge' + NotConnectedToBridge = 'NotConnectedToBridge', } diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 03e8d34a2..a9910bb48 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,6 +1,6 @@ // To parse this data: // -// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsForContextRequest, FindIntentsForContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; +// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsForContextRequest, FindIntentsForContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; // // const appIdentifier = Convert.toAppIdentifier(json); // const appIntent = Convert.toAppIntent(json); @@ -29,6 +29,12 @@ // const getAppMetadataResponse = Convert.toGetAppMetadataResponse(json); // const openRequest = Convert.toOpenRequest(json); // const openResponse = Convert.toOpenResponse(json); +// const privateChannelBroadcast = Convert.toPrivateChannelBroadcast(json); +// const privateChannelEventListenerAdded = Convert.toPrivateChannelEventListenerAdded(json); +// const privateChannelEventListenerRemoved = Convert.toPrivateChannelEventListenerRemoved(json); +// const privateChannelOnAddContextListener = Convert.toPrivateChannelOnAddContextListener(json); +// const privateChannelOnDisconnect = Convert.toPrivateChannelOnDisconnect(json); +// const privateChannelOnUnsubscribe = Convert.toPrivateChannelOnUnsubscribe(json); // const raiseIntentRequest = Convert.toRaiseIntentRequest(json); // const raiseIntentResponse = Convert.toRaiseIntentResponse(json); // const raiseIntentResultResponse = Convert.toRaiseIntentResultResponse(json); @@ -938,6 +944,257 @@ export interface OpenResponsePayload { appIdentifier: SourceElement; } +export interface PrivateChannelBroadcast { + meta: PrivateChannelBroadcastMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelBroadcastPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface PrivateChannelBroadcastMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: PurpleIdentifier; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelBroadcastPayload { + channel: string; + context: string; +} + +export interface PrivateChannelEventListenerAdded { + meta: PrivateChannelEventListenerAddedMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerAddedPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface PrivateChannelEventListenerAddedMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: PurpleIdentifier; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerAddedPayload { + channel: string; + context: string; +} + +export interface PrivateChannelEventListenerRemoved { + meta: PrivateChannelEventListenerRemovedMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerRemovedPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface PrivateChannelEventListenerRemovedMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: PurpleIdentifier; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerRemovedPayload { + channel: string; + listenerType: string; +} + +export interface PrivateChannelOnAddContextListener { + meta: PrivateChannelOnAddContextListenerMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnAddContextListenerPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface PrivateChannelOnAddContextListenerMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: PurpleIdentifier; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnAddContextListenerPayload { + channel: string; + contextType: string; +} + +export interface PrivateChannelOnDisconnect { + meta: PrivateChannelOnDisconnectMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnDisconnectPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface PrivateChannelOnDisconnectMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: PurpleIdentifier; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnDisconnectPayload { + channel: string; +} + +export interface PrivateChannelOnUnsubscribe { + meta: PrivateChannelOnUnsubscribeMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnUnsubscribePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +export interface PrivateChannelOnUnsubscribeMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: PurpleIdentifier; + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Field that represents the source application that the request was received from. + */ + source: PurpleIdentifier; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnUnsubscribePayload { + channel: string; + contextType: string; +} + export interface RaiseIntentRequest { meta: RaiseIntentRequestMeta; /** @@ -1328,6 +1585,54 @@ export class Convert { return JSON.stringify(uncast(value, r('OpenResponse')), null, 2); } + public static toPrivateChannelBroadcast(json: string): PrivateChannelBroadcast { + return cast(JSON.parse(json), r('PrivateChannelBroadcast')); + } + + public static privateChannelBroadcastToJson(value: PrivateChannelBroadcast): string { + return JSON.stringify(uncast(value, r('PrivateChannelBroadcast')), null, 2); + } + + public static toPrivateChannelEventListenerAdded(json: string): PrivateChannelEventListenerAdded { + return cast(JSON.parse(json), r('PrivateChannelEventListenerAdded')); + } + + public static privateChannelEventListenerAddedToJson(value: PrivateChannelEventListenerAdded): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerAdded')), null, 2); + } + + public static toPrivateChannelEventListenerRemoved(json: string): PrivateChannelEventListenerRemoved { + return cast(JSON.parse(json), r('PrivateChannelEventListenerRemoved')); + } + + public static privateChannelEventListenerRemovedToJson(value: PrivateChannelEventListenerRemoved): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerRemoved')), null, 2); + } + + public static toPrivateChannelOnAddContextListener(json: string): PrivateChannelOnAddContextListener { + return cast(JSON.parse(json), r('PrivateChannelOnAddContextListener')); + } + + public static privateChannelOnAddContextListenerToJson(value: PrivateChannelOnAddContextListener): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnAddContextListener')), null, 2); + } + + public static toPrivateChannelOnDisconnect(json: string): PrivateChannelOnDisconnect { + return cast(JSON.parse(json), r('PrivateChannelOnDisconnect')); + } + + public static privateChannelOnDisconnectToJson(value: PrivateChannelOnDisconnect): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnDisconnect')), null, 2); + } + + public static toPrivateChannelOnUnsubscribe(json: string): PrivateChannelOnUnsubscribe { + return cast(JSON.parse(json), r('PrivateChannelOnUnsubscribe')); + } + + public static privateChannelOnUnsubscribeToJson(value: PrivateChannelOnUnsubscribe): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribe')), null, 2); + } + public static toRaiseIntentRequest(json: string): RaiseIntentRequest { return cast(JSON.parse(json), r('RaiseIntentRequest')); } @@ -2000,6 +2305,144 @@ const typeMap: any = { false ), OpenResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('SourceElement') }], false), + PrivateChannelBroadcast: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelBroadcastMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelBroadcastPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + PrivateChannelBroadcastMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelBroadcastPayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'context', js: 'context', typ: '' }, + ], + false + ), + PrivateChannelEventListenerAdded: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerAddedMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerAddedPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + PrivateChannelEventListenerAddedMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelEventListenerAddedPayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'context', js: 'context', typ: '' }, + ], + false + ), + PrivateChannelEventListenerRemoved: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerRemovedMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerRemovedPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + PrivateChannelEventListenerRemovedMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelEventListenerRemovedPayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'listenerType', js: 'listenerType', typ: '' }, + ], + false + ), + PrivateChannelOnAddContextListener: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnAddContextListenerMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + PrivateChannelOnAddContextListenerMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnAddContextListenerPayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'contextType', js: 'contextType', typ: '' }, + ], + false + ), + PrivateChannelOnDisconnect: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnDisconnectMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + PrivateChannelOnDisconnectMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnDisconnectPayload: o([{ json: 'channel', js: 'channel', typ: '' }], false), + PrivateChannelOnUnsubscribe: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnUnsubscribeMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + PrivateChannelOnUnsubscribeMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnUnsubscribePayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'contextType', js: 'contextType', typ: '' }, + ], + false + ), RaiseIntentRequest: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentRequestMeta') }, diff --git a/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json new file mode 100644 index 000000000..1cd27730a --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcast.schema.json", + "title": "PrivateChannel.broadcast", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.broadcast" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "context": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "context"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json new file mode 100644 index 000000000..fd140c5fb --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAdded.schema.json", + "title": "PrivateChannel.eventListenerAdded", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.eventListenerAdded" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "context": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "context"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json new file mode 100644 index 000000000..b9b758a6d --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json", + "title": "PrivateChannel.eventListenerRemoved", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.eventListenerRemoved" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "listenerType": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "listenerType"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json new file mode 100644 index 000000000..8532e51f3 --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListener.schema.json", + "title": "PrivateChannel.onAddContextListener", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.onAddContextListener" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "contextType": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "contextType"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json new file mode 100644 index 000000000..0645df13a --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnect.schema.json", + "title": "PrivateChannel.onDisconnect", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.onDisconnect" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json new file mode 100644 index 000000000..99af91833 --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json", + "title": "PrivateChannel.onUnsubscribe", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "type": "object", + "properties": { + "type": { + "const": "PrivateChannel.onUnsubscribe" + }, + "payload": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "contextType": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["channel", "contextType"] + }, + "meta": { + "properties": { + "requestGuid": true, + "timestamp": true, + "source": { + "$ref": "../api/appIdentifier.schema.json" + }, + "destination": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "additionalProperties": false + } + } + } + ] +} From 74eec20c22c8d49f814d998023988e1cb1aba4d3 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 19:46:58 +0100 Subject: [PATCH 030/106] Export BridgingTypes for NPM module --- src/bridging/README.md | 52 ++++++++++++++++++++++++++++++++++++++++++ src/context/README.md | 4 ++-- src/index.ts | 1 + 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/bridging/README.md diff --git a/src/bridging/README.md b/src/bridging/README.md new file mode 100644 index 000000000..6b20e09e3 --- /dev/null +++ b/src/bridging/README.md @@ -0,0 +1,52 @@ +# Bridging Message types generation README + +This folder contains Typescript interfaces, in BridgingTypes.ts generated from the context JSONSchema (https://json-schema.org/) files via quicktype (https://quicktype.io/). Source files may also be generated for us in other languages supported by quicktype. + +Please note that these definitions are provided to help developers working in TypeScript to produce valid bridging messages objects - but should not be considered the 'source of truth' for message definitions (instead look to the schemas and documentation). + +It is not always possible to perfectly replicate a type/interface defined in JSONSchema via TypeScript. Hence, in the event of any disagreement between the definitions, the JSONSchema should be assumed to be correct, rather than the Typescript. For example, JSONSchema may define optional fields on an object + a restriction on the type of additional properties (via `"additionalProperties": { "type": "string"}`), which will result in an index signature `[property: string]: string;` in generated TypeScript. That signature, is incompatible with with an optional properties (including string properties) as they have type `string | undefined`. A similar problem may occur in JSON Schema if the schema is used to create a subtype via composition as `additionalProperties` is not aware of teh subschema's definitions. Both issues can be worked around by using `unevaluatedProperties` in the schema, which will defer to the declared type of the optional property in the subschema, but is also currently ignored by quicktype - resulting in a type that will compile, but doesn't restrict the type of optional property values as defined in the schema. + +Further, quicktype doesn't always perfectly replicate polymorphic fields specified with `oneOf` in JSONSchema as it will usually merge the different objects into a single type (where fields not in one of the constituent schemas become optional) rather than creating a union type. In such situations, the type produced is usable (has all the necessary fields) but may allow the construction of invalid instances which are missing required properties or include properties from the multiple schemas combined, which are not possible/valid according to JSONSchema. + +Hence, the Types provided here can be used to provide valid message objects and to read/write their JSON encodings, but may not detect or prevent a limited set of invalid objects that would be identified by JSONSchema. + +Finally, quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the main interface definition. These often do not have unique names. Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the main type, e.g.: + +```TypeScript +export interface Instrument { + id: StickyId; + market?: FluffyMarket; + type: string; + name?: string; + [property: string]: any; +} + +export interface StickyId { + BBG?: string; + CUSIP?: string; + FDS_ID?: string; + FIGI?: string; + ISIN?: string; + PERMID?: string; + RIC?: string; + SEDOL?: string; + ticker?: string; + [property: string]: any; +} + +export interface FluffyMarket { + BBG?: string; + COUNTRY_ISOALPHA2?: string; + MIC?: string; + name?: string; + [property: string]: any; +} +``` + +and should not be considered a planned part of the type structure (which should not be replicated in any derivative work). When applied, the naming of these sub-units is not used, rather they are replaced with their contents. It is hoped that we will be to generate better names of these sub-units in future. + +Finally, please note that the latest version of quicktype (at the time of writing `23.0.19`) has a number of bugs that must be worked around: + +- Using a directory or .schema.json files as a source will cause the input type argument `-s schema` to be ignored, causing the files to be interpreted as JSON rather than JSON Schema. + - A utility is provided in this repository (_../../quicktypeUtil.js_) to work around this bug by listing directories and constructing a call to quicktype where each file is provided as an individual source. +- Setting the `--nice-property-names` TypeScript output option will crash the generator and can't be used. diff --git a/src/context/README.md b/src/context/README.md index 94736706a..9fa44276e 100644 --- a/src/context/README.md +++ b/src/context/README.md @@ -2,7 +2,7 @@ This folder contains Typescript interfaces, in ContextTypes.ts generated from the context JSONSchema (https://json-schema.org/) files via quicktype (https://quicktype.io/). -Please note that these definitions are provided to help developers working in TypeScript to produce valid context objects - but should not be considered the 'source of truth' for context definitions (instead look to the schemas and documentation). +Please note that these definitions are provided to help developers working in TypeScript to produce valid context objects - but should not be considered the 'source of truth' for context definitions (instead look to the schemas and documentation). Source files may also be generated for us in other languages supported by quicktype. It is not always possible to perfectly replicate a type/interface defined in JSONSchema via TypeScript. Hence, in the event of any disagreement between the definitions, the JSONSchema should be assumed to be correct, rather than the Typescript. For example, JSONSchema may define optional fields on an object + a restriction on the type of additional properties (via `"additionalProperties": { "type": "string"}`), which will result in an index signature `[property: string]: string;` in generated TypeScript. That signature, is incompatible with with an optional properties (including string properties) as they have type `string | undefined`. A similar problem may occur in JSON Schema if the schema is used to create a subtype via composition as `additionalProperties` is not aware of teh subschema's definitions. Both issues can be worked around by using `unevaluatedProperties` in the schema, which will defer to the declared type of the optional property in the subschema, but is also currently ignored by quicktype - resulting in a type that will compile, but doesn't restrict the type of optional property values as defined in the schema. @@ -10,7 +10,7 @@ Further, quicktype doesn't always perfectly replicate polymorphic fields specifi Hence, the Types provided here can be used to provide valid Context objects and to read/write their JSON encodings, but may not detect or prevent a limited set of invalid objects that would be identified by JSONSchema. -Finally, quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the main interface definition. These often do not have unique names (e.g. fields of the `id` object in the Context schema, defined for a specific context type such as fdc3.instrument). Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the main type, e.g.: +Please also note that quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the main interface definition. These often do not have unique names (e.g. fields of the `id` object in the Context schema, defined for a specific context type such as fdc3.instrument). Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the main type, e.g.: ```TypeScript export interface Instrument { diff --git a/src/index.ts b/src/index.ts index aa4036b59..c42d7b0c1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,6 +26,7 @@ export * from './api/Types'; export * from './context/ContextType'; export * from './context/ContextTypes'; export * from './intents/Intents'; +export * as BridgingTypes from './bridging/BridgingTypes'; declare global { interface Window { From 4d2c9a4978d553e65545b1483d7c0c584c88698b Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 19:47:25 +0100 Subject: [PATCH 031/106] Correct schema links in all context docs pages --- docs/api-bridging/ref/broadcast.md | 6 ++++++ docs/context/ref/Chart.md | 2 +- docs/context/ref/ChatInitSettings.md | 2 +- docs/context/ref/Contact.md | 2 +- docs/context/ref/ContactList.md | 2 +- docs/context/ref/Context.md | 2 +- docs/context/ref/Country.md | 2 +- docs/context/ref/Currency.md | 2 +- docs/context/ref/Email.md | 2 +- docs/context/ref/Instrument.md | 2 +- docs/context/ref/InstrumentList.md | 2 +- docs/context/ref/Nothing.md | 2 +- docs/context/ref/Organization.md | 2 +- docs/context/ref/Portfolio.md | 2 +- docs/context/ref/Position.md | 2 +- docs/context/ref/TimeRange.md | 2 +- docs/context/ref/Valuation.md | 2 +- 17 files changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/api-bridging/ref/broadcast.md b/docs/api-bridging/ref/broadcast.md index 6dae62c10..f0df4f469 100644 --- a/docs/api-bridging/ref/broadcast.md +++ b/docs/api-bridging/ref/broadcast.md @@ -44,6 +44,12 @@ sequenceDiagram ## Request format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json](/schemas/next/bridging/broadcastRequest.schema.json) + +### Example + Outward message to the DAB: ```json diff --git a/docs/context/ref/Chart.md b/docs/context/ref/Chart.md index de022425e..77c7a15d0 100644 --- a/docs/context/ref/Chart.md +++ b/docs/context/ref/Chart.md @@ -21,7 +21,7 @@ In addition to handling requests to plot charts, a charting application may use ## Schema -https://fdc3.finos.org/schemas/next/chart.schema.json +[https://fdc3.finos.org/schemas/next/context/chart.schema.json](/schemas/next/context/chart.schema.json) ## Details diff --git a/docs/context/ref/ChatInitSettings.md b/docs/context/ref/ChatInitSettings.md index f24fe207c..833b7c33b 100644 --- a/docs/context/ref/ChatInitSettings.md +++ b/docs/context/ref/ChatInitSettings.md @@ -15,7 +15,7 @@ A collection of settings to start a new chat conversation ## Schema -https://fdc3.finos.org/schemas/next/chatInitSettings.schema.json +[https://fdc3.finos.org/schemas/next/context/chatInitSettings.schema.json](/schemas/next/context/chatInitSettings.schema.json) ## Details diff --git a/docs/context/ref/Contact.md b/docs/context/ref/Contact.md index ff25878d8..c1de1bd77 100644 --- a/docs/context/ref/Contact.md +++ b/docs/context/ref/Contact.md @@ -14,7 +14,7 @@ A person contact that can be engaged with through email, calling, messaging, CMS ## Schema -https://fdc3.finos.org/schemas/next/contact.schema.json +[https://fdc3.finos.org/schemas/next/context/contact.schema.json](/schemas/next/context/contact.schema.json) ## Details diff --git a/docs/context/ref/ContactList.md b/docs/context/ref/ContactList.md index d0082c659..5b10b5e79 100644 --- a/docs/context/ref/ContactList.md +++ b/docs/context/ref/ContactList.md @@ -20,7 +20,7 @@ this part of the contract with custom identifiers if so desired. ## Schema -https://fdc3.finos.org/schemas/next/contactList.schema.json +[https://fdc3.finos.org/schemas/next/context/contactList.schema.json](/schemas/next/context/contactList.schema.json) ## Details diff --git a/docs/context/ref/Context.md b/docs/context/ref/Context.md index 812582776..0c9728192 100644 --- a/docs/context/ref/Context.md +++ b/docs/context/ref/Context.md @@ -24,7 +24,7 @@ can be expected to have, but this can always be extended with custom fields as a ## Schema -https://fdc3.finos.org/schemas/next/context.schema.json +[https://fdc3.finos.org/schemas/next/context/context.schema.json](/schemas/next/context/context.schema.json) ## Details diff --git a/docs/context/ref/Country.md b/docs/context/ref/Country.md index d0808f7a3..46434da68 100644 --- a/docs/context/ref/Country.md +++ b/docs/context/ref/Country.md @@ -23,7 +23,7 @@ is for at least one standardised identifier to be provided ## Schema -https://fdc3.finos.org/schemas/next/country.schema.json +[https://fdc3.finos.org/schemas/next/context/country.schema.json](/schemas/next/context/country.schema.json) ## Details diff --git a/docs/context/ref/Currency.md b/docs/context/ref/Currency.md index 534b247ac..1c5a57642 100644 --- a/docs/context/ref/Currency.md +++ b/docs/context/ref/Currency.md @@ -15,7 +15,7 @@ A context representing an individual Currency. ## Schema -https://fdc3.finos.org/schemas/next/currency.schema.json +[https://fdc3.finos.org/schemas/next/context/currency.schema.json](/schemas/next/context/currency.schema.json) ## Details diff --git a/docs/context/ref/Email.md b/docs/context/ref/Email.md index 0d8955e4f..47060a053 100644 --- a/docs/context/ref/Email.md +++ b/docs/context/ref/Email.md @@ -14,7 +14,7 @@ A collection of information to be used to initiate an email with a Contact or Co ## Schema -https://fdc3.finos.org/schemas/next/email.schema.json +[https://fdc3.finos.org/schemas/next/context/email.schema.json](/schemas/next/context/email.schema.json) ## Details diff --git a/docs/context/ref/Instrument.md b/docs/context/ref/Instrument.md index b66c21e69..4a1cbf77a 100644 --- a/docs/context/ref/Instrument.md +++ b/docs/context/ref/Instrument.md @@ -30,7 +30,7 @@ a property that makes it clear what value represents. Doing so will make interpr ## Schema -https://fdc3.finos.org/schemas/next/instrument.schema.json +[https://fdc3.finos.org/schemas/next/context/instrument.schema.json](/schemas/next/context/instrument.schema.json) ## Details diff --git a/docs/context/ref/InstrumentList.md b/docs/context/ref/InstrumentList.md index 3f9ba2fea..5293272da 100644 --- a/docs/context/ref/InstrumentList.md +++ b/docs/context/ref/InstrumentList.md @@ -22,7 +22,7 @@ this part of the contract with custom identifiers if so desired. ## Schema -https://fdc3.finos.org/schemas/next/instrumentList.schema.json +[https://fdc3.finos.org/schemas/next/context/instrumentList.schema.json](/schemas/next/context/instrumentList.schema.json) ## Details diff --git a/docs/context/ref/Nothing.md b/docs/context/ref/Nothing.md index eb7420ddb..9cc95c5c6 100644 --- a/docs/context/ref/Nothing.md +++ b/docs/context/ref/Nothing.md @@ -25,7 +25,7 @@ Notes: ## Schema -https://fdc3.finos.org/schemas/next/nothing.schema.json +[https://fdc3.finos.org/schemas/next/context/nothing.schema.json](g/schemas/next/context/nothing.schema.json) ## Example diff --git a/docs/context/ref/Organization.md b/docs/context/ref/Organization.md index 4e646484f..0d70fd1e8 100644 --- a/docs/context/ref/Organization.md +++ b/docs/context/ref/Organization.md @@ -19,7 +19,7 @@ is for at least one specified identifier to be provided. ## Schema -https://fdc3.finos.org/schemas/next/organization.schema.json +[https://fdc3.finos.org/schemas/next/context/organization.schema.json](/schemas/next/context/organization.schema.json) ## Details diff --git a/docs/context/ref/Portfolio.md b/docs/context/ref/Portfolio.md index e6aba664f..6145d40c6 100644 --- a/docs/context/ref/Portfolio.md +++ b/docs/context/ref/Portfolio.md @@ -29,7 +29,7 @@ this part of the contract with custom identifiers if so desired. ## Schema -https://fdc3.finos.org/schemas/next/portfolio.schema.json +[https://fdc3.finos.org/schemas/next/context/portfolio.schema.json](/schemas/next/context/portfolio.schema.json) ## Details diff --git a/docs/context/ref/Position.md b/docs/context/ref/Position.md index e413d8363..00b079aed 100644 --- a/docs/context/ref/Position.md +++ b/docs/context/ref/Position.md @@ -29,7 +29,7 @@ this part of the contract with custom identifiers if so desired. ## Schema -https://fdc3.finos.org/schemas/next/position.schema.json +[https://fdc3.finos.org/schemas/next/context/position.schema.json](/schemas/next/context/position.schema.json) ## Details diff --git a/docs/context/ref/TimeRange.md b/docs/context/ref/TimeRange.md index a82f3099d..f29feb68e 100644 --- a/docs/context/ref/TimeRange.md +++ b/docs/context/ref/TimeRange.md @@ -33,7 +33,7 @@ Notes: ## Schema -https://fdc3.finos.org/schemas/next/timerange.schema.json +[https://fdc3.finos.org/schemas/next/context/timerange.schema.json](/schemas/next/context/timerange.schema.json) ## Details diff --git a/docs/context/ref/Valuation.md b/docs/context/ref/Valuation.md index d4eafd3e2..5281c0caa 100644 --- a/docs/context/ref/Valuation.md +++ b/docs/context/ref/Valuation.md @@ -14,7 +14,7 @@ A context type representing the price and value of a holding. ## Schema -[https://fdc3.finos.org/schemas/next/valuation.schema.json](https://fdc3.finos.org/schemas/next/valuation.schema.json) +[https://fdc3.finos.org/schemas/next/context/valuation.schema.json](/schemas/next/context/valuation.schema.json) ## Details From 969e7055fcb34b8ce23b6accc3b9d02968b02921 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 19:48:36 +0100 Subject: [PATCH 032/106] Add notes on generated sources to bridging spec --- docs/api-bridging/spec.md | 28 ++++++++++++++++++++++++---- src/api/DesktopAgentIdentifier.ts | 2 +- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index b8744b915..81b9d446b 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -18,10 +18,10 @@ In any Desktop Agent Bridging scenario, it is expected that each DA is being ope * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: - * Link to BackPlane project - * Refactor spec to separate channel (websocket) and protocol. - * Add schema links to each message exchange - * Add detail about Typescript generated from the schemas + * Add schema links to each message exchange (done BroadcastRequest as an example - note the schema and example heading will need adding to each request and response section) + * Check if advice on imported BridgingTypes (last section in this spec) from the npm module is accurate. + * Refactor spec introduction to separate channel (websocket) and protocol. + * Link to BackPlane project somewhere ## Implementing a Desktop Agent Bridge @@ -738,3 +738,23 @@ The message exchanges defined are: Broadcasts and event messages should be addressed to the Desktop Agent that created the channel, which will route it to the relevant application and any other listeners. If any of those listeners are remote, the message should be repeated back to the bridge, once for each listener with the destination set as a full `AppIdentifier`. Both these messages and broadcast messages MUST NOT be repeated back to the application that generated them. The source information on repeated messages should be unmodified to ensure that the message is attributed to the original source. To facilitate the addressing of messages to the relevant Desktop Agent and `AppIdentifier` some additional tracking of private channel metadata is necessary in each Desktop Agent (or Desktop Agent Bridge Client implementation). For applications receiving a private channel as an `IntentResult`, the `AppIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id. This data MUST be retained until the receiving application sends a `disconnect` message, after which it can be discarded. For applications that have created and returned a private channel, and have subsequently received event messages subscriptions (`onAddContextListener`, `onSubscribe`, `onDisconnect`) the `appIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id and listener type, which will facilitate repeating of messages to registered listeners. This data MUST be retained until the remote application sends a `disconnect` message or a message indicating that the listener has been removed. + +### Message Schemas and generated sources + +JSONSchema definitions are provided for all Desktop Agent Bridging message exchanges (see links in each reference page), which may be used to validate the correct generation of messages to or from a bridge. + +The JSONSchema definitions are also used to generate TypeScript interfaces for the messages to aid in implementation of a Desktop Agent Bridge or Client library. These may be imported from the FDC3 npm module: + +```typescript +import { BridgingTypes } from "@finos/fdc3"; +const aMessage: BridgingTypes.BroadcastRequest +``` + +or + +```typescript +import { BroadcastRequest } from "@finos/fdc3/dist/bridging/BridgingTypes"; +const aMessage: BroadcastRequest +``` + +Sources may also be generated from the JSONSchema source for other languages. \ No newline at end of file diff --git a/src/api/DesktopAgentIdentifier.ts b/src/api/DesktopAgentIdentifier.ts index 780ed6b0d..7c2adf5c6 100644 --- a/src/api/DesktopAgentIdentifier.ts +++ b/src/api/DesktopAgentIdentifier.ts @@ -9,7 +9,7 @@ * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. - * @experimental + * @experimental Introduced in FDC3 2.1 and may be refined by further changes outside the normal FDC3 versioning policy. */ export interface DesktopAgentIdentifier { /** Used in Desktop Agent Bridging to attribute or target a message to a From 478d80e48587118d586f943b1a8d3fab7bdf6506 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 22:16:22 +0100 Subject: [PATCH 033/106] Adding schema links to bridging ref docs + corrections Correcting - request names/typew fielsds in mermaid diagrams and examples - findIntentForContext -> findIntentsByContext - title fields in schemas Adding mermaid diagrams to PrivateChannel events --- .../ref/PrivateChannel.broadcast.md | 26 +++++++- .../ref/PrivateChannel.eventListenerAdded.md | 20 ++++++ .../PrivateChannel.eventListenerRemoved.md | 20 ++++++ .../PrivateChannel.onAddContextListener.md | 20 ++++++ .../ref/PrivateChannel.onDisconnect.md | 20 ++++++ .../ref/PrivateChannel.onUnsubscribe.md | 20 ++++++ docs/api-bridging/ref/broadcast.md | 10 +-- docs/api-bridging/ref/findInstances.md | 24 +++++-- docs/api-bridging/ref/findIntent.md | 22 +++++-- docs/api-bridging/ref/findIntentsByContext.md | 26 +++++--- docs/api-bridging/ref/getAppMetadata.md | 20 ++++-- docs/api-bridging/ref/open.md | 20 ++++-- docs/api-bridging/ref/raiseIntent.md | 25 ++++++-- docs/api-bridging/spec.md | 6 +- schemas/bridging/bridgeRequest.schema.json | 2 +- schemas/bridging/bridgeResponse.schema.json | 2 +- schemas/bridging/broadcastRequest.schema.json | 2 +- .../bridging/findInstancesRequest.schema.json | 2 +- .../bridging/findIntentRequest.schema.json | 2 +- .../bridging/findIntentResponse.schema.json | 2 +- ...> findIntentsByContextRequest.schema.json} | 6 +- ... findIntentsByContextResponse.schema.json} | 6 +- .../getAppMetadataRequest.schema.json | 2 +- .../getAppMetadataResponse.schema.json | 2 +- schemas/bridging/openResponse.schema.json | 2 +- .../bridging/raiseIntentRequest.schema.json | 2 +- .../bridging/raiseIntentResponse.schema.json | 2 +- .../raiseIntentResultResponse.schema.json | 2 +- src/bridging/BridgingTypes.ts | 62 +++++++++---------- .../next/bridging/bridgeRequest.schema.json | 2 +- .../next/bridging/bridgeResponse.schema.json | 2 +- .../bridging/broadcastRequest.schema.json | 2 +- .../bridging/findInstancesRequest.schema.json | 2 +- .../bridging/findIntentRequest.schema.json | 2 +- .../bridging/findIntentResponse.schema.json | 2 +- ...> findIntentsByContextRequest.schema.json} | 6 +- ... findIntentsByContextResponse.schema.json} | 6 +- .../getAppMetadataRequest.schema.json | 2 +- .../getAppMetadataResponse.schema.json | 2 +- .../next/bridging/openResponse.schema.json | 2 +- .../bridging/raiseIntentRequest.schema.json | 2 +- .../bridging/raiseIntentResponse.schema.json | 2 +- .../raiseIntentResultResponse.schema.json | 2 +- 43 files changed, 305 insertions(+), 108 deletions(-) rename schemas/bridging/{findIntentsForContextRequest.schema.json => findIntentsByContextRequest.schema.json} (87%) rename schemas/bridging/{findIntentsForContextResponse.schema.json => findIntentsByContextResponse.schema.json} (89%) rename website/static/schemas/next/bridging/{findIntentsForContextRequest.schema.json => findIntentsByContextRequest.schema.json} (87%) rename website/static/schemas/next/bridging/{findIntentsForContextResponse.schema.json => findIntentsByContextResponse.schema.json} (89%) diff --git a/docs/api-bridging/ref/PrivateChannel.broadcast.md b/docs/api-bridging/ref/PrivateChannel.broadcast.md index 59a5f1116..2ee439377 100644 --- a/docs/api-bridging/ref/PrivateChannel.broadcast.md +++ b/docs/api-bridging/ref/PrivateChannel.broadcast.md @@ -10,7 +10,31 @@ Desktop Agent bridging message exchange for a `broadcast` API call on a [`Privat [Message Exchange Type](../spec#individual-message-exchanges): **Request only** -E.g. +:::caution + +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. + +::: + +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: PrivateChannel.broadcast + DAB ->>+ DB: PrivateChannel.broadcast +``` + +## Request format + +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcast.schema.json](/schemas/next/bridging/privateChannelBroadcast.schema.json) + +### Example ```javascript fdc3.addIntentListener("QuoteStream", async (context) => { diff --git a/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md b/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md index c41a6fe2c..6cc203a4c 100644 --- a/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md +++ b/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md @@ -20,6 +20,26 @@ Some additional tracking of PrivateChannel metadata is required on the Desktop A Private channels support a number of additional event listeners (`onAddContextListener`, `onUnsubscribe`, `onDisconnect`), when an application adds one of these event listeners to a private channel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel to facilitate routing of event messages. A single message type is used for this with a `payload.listenerType` field. +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: PrivateChannel.eventListenerAdded + DAB ->>+ DB: PrivateChannel.eventListenerAdded +``` + +## Request format + +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAdded.schema.json](/schemas/next/bridging/privateChannelEventListenerAdded.schema.json) + +### Example + ```json // agent-A -> DAB { diff --git a/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md index 32537f1df..14d96c43e 100644 --- a/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -23,6 +23,26 @@ Some additional tracking of PrivateChannel metadata is required on the Desktop A Private channels support a number of additional event listeners (`onAddContextListener`, `onUnsubscribe`, `onDisconnect`), when an application removes an event listener from a PrivateChannel that was created remotely and returned as an `IntentResult` (which should be tracked by the Desktop Agent Bridge client) a message needs to be sent to the agent that created the channel so it can discard retained routing information. A single message type is used for this with a `payload.listenerType` field. +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: PrivateChannel.eventListenerRemoved + DAB ->>+ DB: PrivateChannel.eventListenerRemoved +``` + +## Request format + +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json](/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json) + +### Example + ```json // agent-A -> DAB { diff --git a/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md b/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md index 0ae8120c4..f240c4bb8 100644 --- a/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md +++ b/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md @@ -18,6 +18,26 @@ Some additional tracking of PrivateChannel metadata is required on the Desktop A When a `ContextListener` is added to a `PrivateChannel` any applications that have added an `onAddContextListener` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: PrivateChannel.onAddContextListener + DAB ->>+ DB: PrivateChannel.onAddContextListener +``` + +## Request format + +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListener.schema.json](/schemas/next/bridging/privateChannelOnAddContextListener.schema.json) + +### Example + ```json // agent-A -> DAB { diff --git a/docs/api-bridging/ref/PrivateChannel.onDisconnect.md b/docs/api-bridging/ref/PrivateChannel.onDisconnect.md index 3f0bfa720..756727d76 100644 --- a/docs/api-bridging/ref/PrivateChannel.onDisconnect.md +++ b/docs/api-bridging/ref/PrivateChannel.onDisconnect.md @@ -18,6 +18,26 @@ Some additional tracking of PrivateChannel metadata is required on the Desktop A When the `disconnect` function is is called on a `PrivateChannel` any applications that have added an `onDisconnect` handler or an `onUnsubscribe` handler (which is automatically called when an application disconnects) MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. If the `PrivateChannel` was created by a remote agent, only the single `PrivateChannel.onDisconnect` is required. It is the responsibility of the Desktop Agent that created the channel to ensure that any relevant `onUnsubscribe` handlers are also called by sending additional `PrivateChannel.onUnsubscribe` messages to them before forwarding the `PrivateChannel.onDisconnect`. This applies whether the disconnection occurred on that agent or on a remote agent. +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: PrivateChannel.onDisconnect + DAB ->>+ DB: PrivateChannel.onDisconnect +``` + +## Request format + +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnect.schema.json](/schemas/next/bridging/privateChannelOnDisconnect.schema.json) + +### Example + ```json // agent-A -> DAB { diff --git a/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md index e6ef7acee..35d1c9e28 100644 --- a/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -21,6 +21,26 @@ Some additional tracking of PrivateChannel metadata is required on the Desktop A When a `ContextListener` is removed from a `PrivateChannel` (via `listener.unsubscribe`) any applications that have added an `onSubscribe` handler MUST be notified. If the listener is on the agent that created that channel, it should forward the message onto all the registered listeners. If the listener is added on a remote agent it MUST send the message to the agent that created the channel which will repeat it onto the other listeners without modifying the source information. +## Message exchange + +```mermaid +sequenceDiagram + participant DA as Desktop Agent A + participant DAB as Desktop Agent Bridge + participant DB as Desktop Agent B + participant DC as Desktop Agent C + DA ->>+ DAB: PrivateChannel.onUnsubscribe + DAB ->>+ DB: PrivateChannel.onUnsubscribe +``` + +## Request format + +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json](/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json) + +### Example + ```json // DAB -> agent-B { diff --git a/docs/api-bridging/ref/broadcast.md b/docs/api-bridging/ref/broadcast.md index f0df4f469..467948466 100644 --- a/docs/api-bridging/ref/broadcast.md +++ b/docs/api-bridging/ref/broadcast.md @@ -37,9 +37,9 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: broadcast - DAB ->>+ DB: broadcast - DAB ->>+ DC: broadcast + DA ->>+ DAB: broadcastRequest + DAB ->>+ DB: broadcastRequest + DAB ->>+ DC: broadcastRequest ``` ## Request format @@ -55,7 +55,7 @@ Outward message to the DAB: ```json // agent-A -> DAB { - "type": "broadcast", + "type": "broadcastRequest", "payload": { "channel": "myChannel", "context": { /*contextObj*/ } @@ -77,7 +77,7 @@ which it repeats on to agent-B AND agent-C with the `source.desktopAgent` metada // DAB -> agent-B // DAB -> agent-C { - "type": "broadcast", + "type": "broadcastRequest", "payload": { "channel": "myChannel", "context": { /*contextObj*/} diff --git a/docs/api-bridging/ref/findInstances.md b/docs/api-bridging/ref/findInstances.md index a3fac4694..67a08249b 100644 --- a/docs/api-bridging/ref/findInstances.md +++ b/docs/api-bridging/ref/findInstances.md @@ -28,9 +28,9 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: findInstances - DAB ->>+ DB: findInstances - DAB ->>+ DC: findInstances + DA ->>+ DAB: findInstancesRequest + DAB ->>+ DB: findInstancesRequest + DAB ->>+ DC: findInstancesRequest DB ->> DAB: findInstancesResponse (B) DC ->> DAB: findInstancesResponse (C) DAB -->>- DA: findInstancesResponse (B + C) @@ -38,12 +38,18 @@ sequenceDiagram ## Request format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json](/schemas/next/bridging/findInstancesRequest.schema.json) + +### Example + Outward message to the bridge: ```json // agent-A -> DAB { - "type": "findInstances", + "type": "findInstancesRequest", "payload": { "app": { "appId": "myApp" @@ -65,7 +71,7 @@ which is repeated on to the target agent as: ```json // DAB -> agent-B { - "type": "findInstances", + "type": "findInstancesRequest", "payload": { "app": { "appId": "myApp" @@ -88,7 +94,7 @@ If results should be constrained to a particular Desktop Agent, then set a `desk ```json // agent-A -> DAB { - "type": "findInstances", + "type": "findInstancesRequest", "payload": { "app": { "appId": "myApp", @@ -111,6 +117,12 @@ The Desktop Agent Bridge should only forward the request to the requested Deskto ## Response format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/findInstancesResponse.schema.json](/schemas/next/bridging/findInstancesResponse.schema.json) + +### Example + Response message from a Desktop Agent: ```json diff --git a/docs/api-bridging/ref/findIntent.md b/docs/api-bridging/ref/findIntent.md index 72d05d46c..77feaabd4 100644 --- a/docs/api-bridging/ref/findIntent.md +++ b/docs/api-bridging/ref/findIntent.md @@ -24,22 +24,28 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: findIntent - DAB ->>+ DB: findIntent + DA ->>+ DAB: findIntentRequest + DAB ->>+ DB: findIntentRequest + DAB ->>+ DC: findIntentRequest DB -->>- DAB: findIntentResponse (B) - DAB ->>+ DC: findIntent DC -->>- DAB: findIntentResponse (C) DAB -->>- DA: findIntentResponse (B + C) ``` ## Request format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json](/schemas/next/bridging/findIntentRequest.schema.json) + +### Example + Outward message to the DAB: ```json // agent-A -> DAB { - "type": "findIntent", + "type": "findIntentRequest", "payload": { "intent": "StartChat", "context": {/*contextObj*/} @@ -61,7 +67,7 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the // DAB -> agent-B // DAB -> agent-C { - "type": "findIntent", + "type": "findIntentRequest", "payload": { "intent": "StartChat", "context": {/*contextObj*/} @@ -82,6 +88,12 @@ Note that the `source.desktopAgent` field has been populated with the id of the ## Response format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json](/schemas/next/bridging/findIntentResponse.schema.json) + +### Example + Normal response from agent-A, where the request was raised. ```json diff --git a/docs/api-bridging/ref/findIntentsByContext.md b/docs/api-bridging/ref/findIntentsByContext.md index 26f37adf5..587737231 100644 --- a/docs/api-bridging/ref/findIntentsByContext.md +++ b/docs/api-bridging/ref/findIntentsByContext.md @@ -28,22 +28,28 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: findInfindIntentsByContexttent - DAB ->>+ DB: findIntentsByContext + DA ->>+ DAB: findIntentsByContextRequest + DAB ->>+ DB: findIntentsByContextRequest + DAB ->>+ DC: findIntentsByContextRequest DB -->>- DAB: findIntentsByContextResponse (B) - DAB ->>+ DC: findIntentsByContext DC -->>- DAB: findIntentsByContextResponse (C) DAB -->>- DA: findIntentsByContextResponse (B + C) ``` ## Request format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextRequest.schema.json](/schemas/next/bridging/findIntentsByContextRequest.schema.json) + +### Example + Outward message to the DAB: ```json // agent-A -> DAB { - "type": "findIntentsForContext", + "type": "findIntentsByContextRequest", "payload": { "context": {/*contextObj*/} }, @@ -64,7 +70,7 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the // DAB -> agent-B // DAB -> agent-C { - "type": "findIntentsForContext", + "type": "findIntentsByContextRequest", "payload": { "context": {/*contextObj*/} }, @@ -82,6 +88,12 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the ## Response format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextResponse.schema.json](/schemas/next/bridging/findIntentsByContextResponse.schema.json) + +### Example + An individual agent (for example agentB) would generate a local response as an array of `AppIntent` objects: ```json @@ -114,7 +126,7 @@ This response is encoded and sent to the bridge as: ```json // agent-B -> DAB { - "type": "findIntentsForContextResponse", + "type": "findIntentsByContextResponse", "payload": { "appIntents": [ { @@ -152,7 +164,7 @@ Each `AppMetadata` object is augmented by the bridge with a `desktopAgent` field ```json // DAB -> agent-A { - "type": "findIntentsForContextResponse", + "type": "findIntentsByContextResponse", "payload": { "appIntents": [ { diff --git a/docs/api-bridging/ref/getAppMetadata.md b/docs/api-bridging/ref/getAppMetadata.md index c000793bd..6e0d5abbb 100644 --- a/docs/api-bridging/ref/getAppMetadata.md +++ b/docs/api-bridging/ref/getAppMetadata.md @@ -29,20 +29,26 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: getAppMetadata - DAB ->>+ DB: getAppMetadata + DA ->>+ DAB: getAppMetadataRequest + DAB ->>+ DB: getAppMetadataRequest DB ->> DAB: getAppMetadataResponse (B) DAB -->>- DA: getAppMetadataResponse (B) ``` ## Request format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json](/schemas/next/bridging/getAppMetadataRequest.schema.json) + +### Example + Outward message to the bridge: ```json // agent-A -> DAB { - "type": "getAppMetadata", + "type": "getAppMetadataRequest", "payload": { "app": { { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } @@ -64,7 +70,7 @@ which is repeated on to the target agent as: ```json // DAB -> agent-B { - "type": "getAppMetadata", + "type": "getAppMetadataRequest", "payload": { "app": { { "appId": "myApp@my.appd.com", "desktopAgent": "agent-B" } @@ -84,6 +90,12 @@ which is repeated on to the target agent as: ## Response format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json](/schemas/next/bridging/getAppMetadataResponse.schema.json) + +### Example + Response message from a Desktop Agent: ```json diff --git a/docs/api-bridging/ref/open.md b/docs/api-bridging/ref/open.md index 90b985751..c5845a392 100644 --- a/docs/api-bridging/ref/open.md +++ b/docs/api-bridging/ref/open.md @@ -44,20 +44,26 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: open - DAB ->>+ DB: open + DA ->>+ DAB: openRequest + DAB ->>+ DB: openRequest DB -->>- DAB: openResponse DAB -->>- DA: openResponse ``` ## Request format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/openRequest.schema.json](/schemas/next/bridging/openRequest.schema.json) + +### Example + Outward message to the bridge: ```json // agent-A -> DAB { - "type": "open", + "type": "openRequest", "payload": { "app": { "appId": "myApp", @@ -81,7 +87,7 @@ which is repeated on to the target agent as: ```json // DAB -> agent-B { - "type": "open", + "type": "openRequest", "payload": { "app": { "appId": "myApp", @@ -103,6 +109,12 @@ which is repeated on to the target agent as: ## Response format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json](/schemas/next/bridging/openResponse.schema.json) + +### Example + Response message from target Desktop Agent: ```json diff --git a/docs/api-bridging/ref/raiseIntent.md b/docs/api-bridging/ref/raiseIntent.md index ab73d43b2..ca200891a 100644 --- a/docs/api-bridging/ref/raiseIntent.md +++ b/docs/api-bridging/ref/raiseIntent.md @@ -45,8 +45,8 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: raiseIntent - DAB ->>+ DB: raiseIntent + DA ->>+ DAB: raiseIntentRequest + DAB ->>+ DB: raiseIntentRequest DB -->>- DAB: raiseIntentResponse DAB -->>- DA: raiseIntentResponse DB ->>+ DAB: raiseIntentResultResponse @@ -55,12 +55,18 @@ sequenceDiagram ## Request format +### Schema + +[https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json](/schemas/next/bridging/raiseIntentRequest.schema.json) + +### Example + Outward message to the DAB: ```json // agent-A -> DAB { - "type": "raiseIntent", + "type": "raiseIntentRequest", "payload": { "intent": "StartChat", "context": {/*contextObj*/}, @@ -90,7 +96,7 @@ The bridge fills in the `source.desktopAgent` field and forwards the request to ```json // DAB -> agent-B { - "type": "raiseIntent", + "type": "raiseIntentRequest", "payload": { "intent": "StartChat", "context": {/*contextObj*/}, @@ -118,6 +124,13 @@ The bridge fills in the `source.desktopAgent` field and forwards the request to ## Response format +### Schemas + +[https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json](/schemas/next/bridging/raiseIntentResponse.schema.json) +[https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json](/schemas/next/bridging/raiseIntentResultResponse.schema.json) + +### Example + If the `raiseIntent` request were made locally, agent-B would deliver the intent and context to the target app's `IntentHandler` and respond to the raising application with an `IntentResolution`: ```javascript @@ -154,9 +167,9 @@ This is encoded and sent to the bridge (omitting the `getResult()` function) as: } ``` -:::note +:::tip -When producing a response to a `raiseIntent` request, the instance of the receiving application MUST be initialized and an `instanceId` generated for it before the `IntentResolution` is generated so that it may include the `instanceId`. +When producing a response to a `raiseIntent` request, the instance of the receiving application MUST be initialized and an `instanceId` generated for it before the `IntentResolution` is generated so that it can include the `instanceId`. ::: diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 81b9d446b..273fc6387 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -18,7 +18,7 @@ In any Desktop Agent Bridging scenario, it is expected that each DA is being ope * Expand on how the DAB should create the JWT token (and its claims, which must change to avoid replay attacks) which it sends out in the `hello` message for DAs to validate. * To create final PR: - * Add schema links to each message exchange (done BroadcastRequest as an example - note the schema and example heading will need adding to each request and response section) + * Create schemas for connection flow messages and link in spec document (see ref documents for styling) * Check if advice on imported BridgingTypes (last section in this spec) from the npm module is accurate. * Refactor spec introduction to separate channel (websocket) and protocol. * Link to BackPlane project somewhere @@ -465,7 +465,7 @@ Response messages will be differentiated from requests by the presence of a `met /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources * that generated responses to the request. Will contain a single value * for individual responses and multiple values for responses that were - * collated by the bridge. May be ommitted if all sources returned an + * collated by the bridge. May be omitted if all sources returned an * error. */ sources?: (AppIdentifier | DesktopAgentIdentifier)[], /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that @@ -757,4 +757,4 @@ import { BroadcastRequest } from "@finos/fdc3/dist/bridging/BridgingTypes"; const aMessage: BroadcastRequest ``` -Sources may also be generated from the JSONSchema source for other languages. \ No newline at end of file +Sources may also be generated from the JSONSchema source for other languages. diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json index 7053f76e2..8149e52dc 100644 --- a/schemas/bridging/bridgeRequest.schema.json +++ b/schemas/bridging/bridgeRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json", - "title": "BridgeRequest", + "title": "bridgeRequest", "type": "object", "properties": { "type": { diff --git a/schemas/bridging/bridgeResponse.schema.json b/schemas/bridging/bridgeResponse.schema.json index 62b332855..9a7a5381f 100644 --- a/schemas/bridging/bridgeResponse.schema.json +++ b/schemas/bridging/bridgeResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json", - "title": "BridgeResponse", + "title": "bridgeResponse", "type": "object", "properties": { "type": { diff --git a/schemas/bridging/broadcastRequest.schema.json b/schemas/bridging/broadcastRequest.schema.json index 0124a79d2..cc6655066 100644 --- a/schemas/bridging/broadcastRequest.schema.json +++ b/schemas/bridging/broadcastRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json", - "title": "BroadcastRequest", + "title": "broadcastRequest", "type": "object", "allOf": [ { diff --git a/schemas/bridging/findInstancesRequest.schema.json b/schemas/bridging/findInstancesRequest.schema.json index 7ab6db714..120d31e4d 100644 --- a/schemas/bridging/findInstancesRequest.schema.json +++ b/schemas/bridging/findInstancesRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json", - "title": "FindInstancesRequest", + "title": "findInstancesRequest", "type": "object", "allOf": [ { diff --git a/schemas/bridging/findIntentRequest.schema.json b/schemas/bridging/findIntentRequest.schema.json index 7c58da28c..5ce5a1705 100644 --- a/schemas/bridging/findIntentRequest.schema.json +++ b/schemas/bridging/findIntentRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json", - "title": "FindIntentRequest", + "title": "findIntentRequest", "type": "object", "allOf": [ { diff --git a/schemas/bridging/findIntentResponse.schema.json b/schemas/bridging/findIntentResponse.schema.json index 9e6318bd0..adbd0a719 100644 --- a/schemas/bridging/findIntentResponse.schema.json +++ b/schemas/bridging/findIntentResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json", - "title": "FindIntentResponse", + "title": "findIntentResponse", "allOf": [ { "$ref": "bridgeResponse.schema.json" diff --git a/schemas/bridging/findIntentsForContextRequest.schema.json b/schemas/bridging/findIntentsByContextRequest.schema.json similarity index 87% rename from schemas/bridging/findIntentsForContextRequest.schema.json rename to schemas/bridging/findIntentsByContextRequest.schema.json index 6054aba2c..0a1952490 100644 --- a/schemas/bridging/findIntentsForContextRequest.schema.json +++ b/schemas/bridging/findIntentsByContextRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextRequest.schema.json", - "title": "FindIntentsForContextRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextRequest.schema.json", + "title": "findIntentsByContextRequest", "type": "object", "allOf": [ { @@ -11,7 +11,7 @@ "type": "object", "properties": { "type": { - "const": "findIntentsForContextRequest" + "const": "findIntentsByContextRequest" }, "payload": { "type": "object", diff --git a/schemas/bridging/findIntentsForContextResponse.schema.json b/schemas/bridging/findIntentsByContextResponse.schema.json similarity index 89% rename from schemas/bridging/findIntentsForContextResponse.schema.json rename to schemas/bridging/findIntentsByContextResponse.schema.json index 2bcb1073d..142612182 100644 --- a/schemas/bridging/findIntentsForContextResponse.schema.json +++ b/schemas/bridging/findIntentsByContextResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextResponse.schema.json", - "title": "FindIntentsForContextResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextResponse.schema.json", + "title": "findIntentsByContextResponse", "allOf": [ { "$ref": "bridgeResponse.schema.json" @@ -9,7 +9,7 @@ { "properties": { "type": { - "const": "findIntentsForContextResponse" + "const": "findIntentsByContextResponse" }, "payload": { "type": "object", diff --git a/schemas/bridging/getAppMetadataRequest.schema.json b/schemas/bridging/getAppMetadataRequest.schema.json index 4aeb2abb5..98d425777 100644 --- a/schemas/bridging/getAppMetadataRequest.schema.json +++ b/schemas/bridging/getAppMetadataRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json", - "title": "GetAppMetadataRequest", + "title": "getAppMetadataRequest", "type": "object", "allOf": [ { diff --git a/schemas/bridging/getAppMetadataResponse.schema.json b/schemas/bridging/getAppMetadataResponse.schema.json index 26d2dc468..e878ea198 100644 --- a/schemas/bridging/getAppMetadataResponse.schema.json +++ b/schemas/bridging/getAppMetadataResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json", - "title": "GetAppMetadataResponse", + "title": "getAppMetadataResponse", "type": "object", "allOf": [ { diff --git a/schemas/bridging/openResponse.schema.json b/schemas/bridging/openResponse.schema.json index 9c6c80dd9..3c03f6710 100644 --- a/schemas/bridging/openResponse.schema.json +++ b/schemas/bridging/openResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json", - "title": "OpenResponse", + "title": "openResponse", "type": "object", "allOf": [ { diff --git a/schemas/bridging/raiseIntentRequest.schema.json b/schemas/bridging/raiseIntentRequest.schema.json index 275a6d030..ae4ff706d 100644 --- a/schemas/bridging/raiseIntentRequest.schema.json +++ b/schemas/bridging/raiseIntentRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json", - "title": "RaiseIntentRequest", + "title": "raiseIntentRequest", "type": "object", "allOf": [ { diff --git a/schemas/bridging/raiseIntentResponse.schema.json b/schemas/bridging/raiseIntentResponse.schema.json index 82398d3c3..9a9245343 100644 --- a/schemas/bridging/raiseIntentResponse.schema.json +++ b/schemas/bridging/raiseIntentResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json", - "title": "RaiseIntentResponse", + "title": "raiseIntentResponse", "type": "object", "allOf": [ { diff --git a/schemas/bridging/raiseIntentResultResponse.schema.json b/schemas/bridging/raiseIntentResultResponse.schema.json index bcd88e3d4..69b38e12e 100644 --- a/schemas/bridging/raiseIntentResultResponse.schema.json +++ b/schemas/bridging/raiseIntentResultResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json", - "title": "RaiseIntentResultResponse", + "title": "raiseIntentResultResponse", "type": "object", "allOf": [ { diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index a9910bb48..5bf465ba0 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,6 +1,6 @@ // To parse this data: // -// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsForContextRequest, FindIntentsForContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; +// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; // // const appIdentifier = Convert.toAppIdentifier(json); // const appIntent = Convert.toAppIntent(json); @@ -23,8 +23,8 @@ // const findInstancesResponse = Convert.toFindInstancesResponse(json); // const findIntentRequest = Convert.toFindIntentRequest(json); // const findIntentResponse = Convert.toFindIntentResponse(json); -// const findIntentsForContextRequest = Convert.toFindIntentsForContextRequest(json); -// const findIntentsForContextResponse = Convert.toFindIntentsForContextResponse(json); +// const findIntentsByContextRequest = Convert.toFindIntentsByContextRequest(json); +// const findIntentsByContextResponse = Convert.toFindIntentsByContextResponse(json); // const getAppMetadataRequest = Convert.toGetAppMetadataRequest(json); // const getAppMetadataResponse = Convert.toGetAppMetadataResponse(json); // const openRequest = Convert.toOpenRequest(json); @@ -664,12 +664,12 @@ export interface AppIntentElement { intent: IntentClass; } -export interface FindIntentsForContextRequest { - meta: FindIntentsForContextRequestMeta; +export interface FindIntentsByContextRequest { + meta: FindIntentsByContextRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: FindIntentsForContextRequestPayload; + payload: FindIntentsByContextRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -677,7 +677,7 @@ export interface FindIntentsForContextRequest { type: string; } -export interface FindIntentsForContextRequestMeta { +export interface FindIntentsByContextRequestMeta { /** * Unique GUID for the request */ @@ -695,16 +695,16 @@ export interface FindIntentsForContextRequestMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface FindIntentsForContextRequestPayload { +export interface FindIntentsByContextRequestPayload { context: ContextObject; } -export interface FindIntentsForContextResponse { - meta: FindIntentsForContextResponseMeta; +export interface FindIntentsByContextResponse { + meta: FindIntentsByContextResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ - payload: FindIntentsForContextResponsePayload; + payload: FindIntentsByContextResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. @@ -712,7 +712,7 @@ export interface FindIntentsForContextResponse { type: string; } -export interface FindIntentsForContextResponseMeta { +export interface FindIntentsByContextResponseMeta { /** * Unique GUID for the request */ @@ -749,7 +749,7 @@ export interface FindIntentsForContextResponseMeta { /** * The message payload typically contains return values for FDC3 API functions. */ -export interface FindIntentsForContextResponsePayload { +export interface FindIntentsByContextResponsePayload { appIntents: AppIntentElement[]; } @@ -1537,20 +1537,20 @@ export class Convert { return JSON.stringify(uncast(value, r('FindIntentResponse')), null, 2); } - public static toFindIntentsForContextRequest(json: string): FindIntentsForContextRequest { - return cast(JSON.parse(json), r('FindIntentsForContextRequest')); + public static toFindIntentsByContextRequest(json: string): FindIntentsByContextRequest { + return cast(JSON.parse(json), r('FindIntentsByContextRequest')); } - public static findIntentsForContextRequestToJson(value: FindIntentsForContextRequest): string { - return JSON.stringify(uncast(value, r('FindIntentsForContextRequest')), null, 2); + public static findIntentsByContextRequestToJson(value: FindIntentsByContextRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextRequest')), null, 2); } - public static toFindIntentsForContextResponse(json: string): FindIntentsForContextResponse { - return cast(JSON.parse(json), r('FindIntentsForContextResponse')); + public static toFindIntentsByContextResponse(json: string): FindIntentsByContextResponse { + return cast(JSON.parse(json), r('FindIntentsByContextResponse')); } - public static findIntentsForContextResponseToJson(value: FindIntentsForContextResponse): string { - return JSON.stringify(uncast(value, r('FindIntentsForContextResponse')), null, 2); + public static findIntentsByContextResponseToJson(value: FindIntentsByContextResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextResponse')), null, 2); } public static toGetAppMetadataRequest(json: string): GetAppMetadataRequest { @@ -2183,15 +2183,15 @@ const typeMap: any = { ], false ), - FindIntentsForContextRequest: o( + FindIntentsByContextRequest: o( [ - { json: 'meta', js: 'meta', typ: r('FindIntentsForContextRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('FindIntentsForContextRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindIntentsForContextRequestMeta: o( + FindIntentsByContextRequestMeta: o( [ { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, @@ -2199,16 +2199,16 @@ const typeMap: any = { ], false ), - FindIntentsForContextRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextObject') }], false), - FindIntentsForContextResponse: o( + FindIntentsByContextRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextObject') }], false), + FindIntentsByContextResponse: o( [ - { json: 'meta', js: 'meta', typ: r('FindIntentsForContextResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('FindIntentsForContextResponsePayload') }, + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextResponsePayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindIntentsForContextResponseMeta: o( + FindIntentsByContextResponseMeta: o( [ { json: 'requestGuid', js: 'requestGuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -2219,7 +2219,7 @@ const typeMap: any = { ], false ), - FindIntentsForContextResponsePayload: o( + FindIntentsByContextResponsePayload: o( [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntentElement')) }], false ), diff --git a/website/static/schemas/next/bridging/bridgeRequest.schema.json b/website/static/schemas/next/bridging/bridgeRequest.schema.json index 7053f76e2..8149e52dc 100644 --- a/website/static/schemas/next/bridging/bridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/bridgeRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json", - "title": "BridgeRequest", + "title": "bridgeRequest", "type": "object", "properties": { "type": { diff --git a/website/static/schemas/next/bridging/bridgeResponse.schema.json b/website/static/schemas/next/bridging/bridgeResponse.schema.json index 62b332855..9a7a5381f 100644 --- a/website/static/schemas/next/bridging/bridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/bridgeResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json", - "title": "BridgeResponse", + "title": "bridgeResponse", "type": "object", "properties": { "type": { diff --git a/website/static/schemas/next/bridging/broadcastRequest.schema.json b/website/static/schemas/next/bridging/broadcastRequest.schema.json index 0124a79d2..cc6655066 100644 --- a/website/static/schemas/next/bridging/broadcastRequest.schema.json +++ b/website/static/schemas/next/bridging/broadcastRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json", - "title": "BroadcastRequest", + "title": "broadcastRequest", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/findInstancesRequest.schema.json b/website/static/schemas/next/bridging/findInstancesRequest.schema.json index 7ab6db714..120d31e4d 100644 --- a/website/static/schemas/next/bridging/findInstancesRequest.schema.json +++ b/website/static/schemas/next/bridging/findInstancesRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json", - "title": "FindInstancesRequest", + "title": "findInstancesRequest", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/findIntentRequest.schema.json b/website/static/schemas/next/bridging/findIntentRequest.schema.json index 7c58da28c..5ce5a1705 100644 --- a/website/static/schemas/next/bridging/findIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json", - "title": "FindIntentRequest", + "title": "findIntentRequest", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/findIntentResponse.schema.json b/website/static/schemas/next/bridging/findIntentResponse.schema.json index 9e6318bd0..adbd0a719 100644 --- a/website/static/schemas/next/bridging/findIntentResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json", - "title": "FindIntentResponse", + "title": "findIntentResponse", "allOf": [ { "$ref": "bridgeResponse.schema.json" diff --git a/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json similarity index 87% rename from website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json rename to website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json index 6054aba2c..0a1952490 100644 --- a/website/static/schemas/next/bridging/findIntentsForContextRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextRequest.schema.json", - "title": "FindIntentsForContextRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextRequest.schema.json", + "title": "findIntentsByContextRequest", "type": "object", "allOf": [ { @@ -11,7 +11,7 @@ "type": "object", "properties": { "type": { - "const": "findIntentsForContextRequest" + "const": "findIntentsByContextRequest" }, "payload": { "type": "object", diff --git a/website/static/schemas/next/bridging/findIntentsForContextResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextResponse.schema.json similarity index 89% rename from website/static/schemas/next/bridging/findIntentsForContextResponse.schema.json rename to website/static/schemas/next/bridging/findIntentsByContextResponse.schema.json index 2bcb1073d..142612182 100644 --- a/website/static/schemas/next/bridging/findIntentsForContextResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsForContextResponse.schema.json", - "title": "FindIntentsForContextResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextResponse.schema.json", + "title": "findIntentsByContextResponse", "allOf": [ { "$ref": "bridgeResponse.schema.json" @@ -9,7 +9,7 @@ { "properties": { "type": { - "const": "findIntentsForContextResponse" + "const": "findIntentsByContextResponse" }, "payload": { "type": "object", diff --git a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json index 4aeb2abb5..98d425777 100644 --- a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json", - "title": "GetAppMetadataRequest", + "title": "getAppMetadataRequest", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json index 26d2dc468..e878ea198 100644 --- a/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json", - "title": "GetAppMetadataResponse", + "title": "getAppMetadataResponse", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/openResponse.schema.json b/website/static/schemas/next/bridging/openResponse.schema.json index 9c6c80dd9..3c03f6710 100644 --- a/website/static/schemas/next/bridging/openResponse.schema.json +++ b/website/static/schemas/next/bridging/openResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json", - "title": "OpenResponse", + "title": "openResponse", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json index 275a6d030..ae4ff706d 100644 --- a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json", - "title": "RaiseIntentRequest", + "title": "raiseIntentRequest", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/raiseIntentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResponse.schema.json index 82398d3c3..9a9245343 100644 --- a/website/static/schemas/next/bridging/raiseIntentResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json", - "title": "RaiseIntentResponse", + "title": "raiseIntentResponse", "type": "object", "allOf": [ { diff --git a/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json index bcd88e3d4..69b38e12e 100644 --- a/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json", - "title": "RaiseIntentResultResponse", + "title": "raiseIntentResultResponse", "type": "object", "allOf": [ { From c93d371b3d21629c1f34406e029f1f8491e37041 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 23:45:40 +0100 Subject: [PATCH 034/106] Refactor bridging proposal structure to separate connection and protocols --- docs/api-bridging/spec.md | 156 ++++++++++++++++++++++++-------------- 1 file changed, 98 insertions(+), 58 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 273fc6387..464e14e5a 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -4,7 +4,7 @@ sidebar_label: Overview title: API Bridging Overview (next) --- -:::info _[Experimental](../fdc3-compliance#experimental-features)_ +:::info _[@experimental](../fdc3-compliance#experimental-features)_ Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, it's design may change in future and it is exempted from the FDC3 Standards's normal versioning and deprecation polices in order to facilitate any necessary change. @@ -20,10 +20,29 @@ In any Desktop Agent Bridging scenario, it is expected that each DA is being ope * To create final PR: * Create schemas for connection flow messages and link in spec document (see ref documents for styling) * Check if advice on imported BridgingTypes (last section in this spec) from the npm module is accurate. - * Refactor spec introduction to separate channel (websocket) and protocol. * Link to BackPlane project somewhere -## Implementing a Desktop Agent Bridge +## Bridging Desktop Agents + +The Desktop Agent Bridge Part of the FDC3 Standard is composed of three components: + +* **[Connection](#connection)**: A means for Desktop Agents to communicate with a bridge, and through that bridge, with each other. +* **[Connection Protocol](#connection-protocol)**: A protocol defining message exchanges necessary to connect to a Bridge and to perform initial state synchronization. +* **[Messaging Protocol](#messaging-protocol)**: A protocol defining message exchanges that allow FDC3 API interop to extend across multiple Desktop Agents. + +Detail on each of these components is defined in the following sections. + +:::info + +Although this specification defines a particular [connection](#connection) type (based on websockets), it has been divided into parts so that the protocol definitions might be reused to implement a bridge over an alternative connection. + +::: + +### API Bridging Compliance + +API Bridging is introduced in FDC3 2.1 as an [@experimental](../fdc3-compliance#experimental-features) feature of the FDC3 Standard, included to enable implementation by and feedback from the FDC3 community. As such, it is currently optional for the purposes of compliance and is exempted from the normal versioning and deprecation polices in order to facilitate any refinement needed. + +## Connection ### Topology @@ -36,11 +55,10 @@ flowchart TD; C[DA C] D[DA D] E{Bridge} - A <--> |websocket| E + E <--> |websocket| A E <--> |websocket| B - E <--> |websocket| C + C <--> |websocket| E D <--> |websocket| E - E --> |loopback - 127.0.0.1| E ``` Other possible topologies include peer-to-peer or client/server networks, however, these introduce significant additional complexity into multiple aspects of the bridging protocol that must be implemented by Desktop Agents, (including discovery, authentication and message routing), where a star topology/standalone bridge enables a relatively simple set of protocols, with the most difficult parts being implemented in the bridge itself. @@ -49,17 +67,29 @@ Whilst the standalone bridge represents a single point of failure for the interc In Financial services it is not unusual for a single user to be working with applications on more than one desktop. As Desktop Agents do not span desktops bridging Desktop Agents across multiple machines is an additional use case for Desktop Agent bridging. However, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. -### Technology & Service Discovery - -Connections between Desktop Agents and the Desktop Agent Bridge will be made via websocket connections, with the bridge acting as the websocket server and each connected Desktop Agent as a client. - -The bridge MUST run on the same machine as the Desktop Agents, and the websocket MUST be bound to the loopback adapter IP address (127.0.0.1), ensuring that the websocket is not exposed to wider networks. - -Bridge implementations SHOULD default to binding the websocket server to a port in the recommended port range 4475 - 4575, enabling simple discovery of a running bridge via attempting socket connections to ports in that range and attempting a handshake (as defined later in this proposal) that will identify the websocket as belong to a Desktop Agent Bridge. A port range is used, in preference to a single nominated port, in order to enable the automatic resolution of port clashes with other services. - -Both DAs and bridge implementations MUST support at least connection to the recommended port range and MAY also support configuration for connection to an alternative bridging port range. +```mermaid +flowchart LR; + A[DA A] + B[DA B] + B1{Bridge 1} + C[DA C] + D[DA D] + B2{Bridge 2} + + subgraph PC1 [PC 1] + direction RL + B1 <--> |websocket| A + B1 <--> |websocket| B + end + subgraph PC2 [PC 2] + direction LR + B2 <--> |websocket| C + B2 <--> |websocket| D + end + PC1 .- |Bridge interconnect| PC2 +``` -As part of the Desktop Agent Bridging protocol, a bridge will implement "server" behavior by: +By using the Desktop Agent Bridging Connection and Messaging protocols, a bridge will implement "server" behavior by: * Accepting connections from client Desktop Agents, receiving and authenticating credentials and assigning a name (for routing purposes) * Receiving requests from client Desktop Agents. @@ -77,29 +107,17 @@ A Desktop Agent will implement "client" behavior by: Hence, message paths and propagation are simple. All messages to other Desktop Agents are passed to the bridge for routing and all messages (both requests and responses) are received back from it, i.e. the bridge is responsible for all message routing. -#### Collating Responses +### Websocket Connection -Whilst some FDC3 requests are 'fire and forget' (e.g. broadcast) the main requests such as `findIntent` or `raiseIntent` expect a response. In a bridging scenario, the response can come from multiple Desktop Agents and therefore need to be aggregated and augmented before they are sent back to the requesting DA. - -:::note -A set of classifications for message exchange types are provided in the [Individual message exchanges](#individual-message-exchanges) section. -::: - -The Desktop Agent Bridge is the responsible entity for collating responses together from all DAs. Whilst this approach may add some complexity to bridge implementations, it will simplify DA implementations since they only need to handle one response. - -The Desktop Agent Bridge MUST allow for timeout configuration. - -The Bridge SHOULD also implement timeout for waiting on DA responses. Assuming the message exchange will be all intra-machine, a recommended timeout of 1500ms SHOULD be used. Similarly, Desktop Agents SHOULD apply a timeout to requests made to the bridge that require a response (collated or otherwise), to handle situations where the bridge is not responding as expected. A recommended timeout of 3000ms SHOULD be used in this case. - -#### Channels +Connections between Desktop Agents and the Desktop Agent Bridge will be made via websocket connections, with the bridge acting as the websocket server and each connected Desktop Agent as a client. -It is assumed that Desktop Agents SHOULD adopt the recommended 8 channel set (and the respective display metadata). Desktop Agents MAY support channel customization through configuration. +The bridge MUST run on the same machine as the Desktop Agents, and the websocket MUST be bound to the loopback adapter IP address (127.0.0.1), ensuring that the websocket is not exposed to wider networks. -The Desktop Agent Bridge MAY support channel mapping ability, to deal with issues caused by differing channel sets. +Bridge implementations SHOULD default to binding the websocket server to a port in the recommended port range 4475 - 4575, enabling simple discovery of a running bridge via attempting socket connections to ports in that range and attempting a handshake (as defined later in this proposal) that will identify the websocket as belong to a Desktop Agent Bridge. A port range is used, in preference to a single nominated port, in order to enable the automatic resolution of port clashes with other services. -A key responsibility of the Desktop Agent Bridge is ensuring that the channel state of the connected agents is kept in-sync, which requires an initial synchronization step as part of the connection protocol. +Both DAs and bridge implementations MUST support at least connection to the recommended port range and MAY also support configuration for connection to an alternative bridging port range. -#### Bridging Desktop Agent on Multiple Machines +### Bridging Desktop Agents on Multiple Machines As the bridge binds its websocket on the loopback address (127.0.0.1) it cannot be connected to from another device. Hence, an instance of the standalone bridge may be run on each device and those instances exchange messages in order to implement the bridge cross-device. @@ -327,6 +345,14 @@ This procedure is the same for both previously connected and connecting agents, After applying the `connectedAgentsUpdate` message, the newly connected Desktop Agent and other already connected agents are able to begin communicating through the bridge. +#### Channels + +It is assumed that Desktop Agents SHOULD adopt the recommended 8 channel set (and the respective display metadata). Desktop Agents MAY support channel customization through configuration. + +The Desktop Agent Bridge MAY support channel mapping ability, to deal with issues caused by differing channel sets. + +A key responsibility of the Desktop Agent Bridge is ensuring that the channel state of the connected agents is kept in-sync, which requires an initial synchronization step as part of the connection protocol. + #### Atomicity and handling concurrent operations Handling by the Desktop Agent of the synchronization message from the Desktop Agent Bridge in step 6 of the connection protocol should be atomic to prevent message overlap with `fdc3.broadcast`, `channel.broadcast`, `fdc3.addContextListener` or `channel.getCurrentContext`. I.e. the `connectedAgentsUpdate` message must be processed immediately on receipt by Desktop Agents and updates applied before any other messages are sent or responses processed. @@ -345,6 +371,20 @@ Although not part of the connection protocol, it should be noted that the `conne In order for Desktop Agents to communicate with the Desktop Agent Bridge and thereby other Desktop Agents, a messaging protocol is required. FDC3 supports both 'fire and forget' interactions (such as the broadcast of context messages) and interactions with specific responses (such as raising intents and returning a resolution and optional result), both of which must be handled by that messaging protocol and message formats it defines, as described in this section. +### Collating Responses + +Whilst some FDC3 requests are 'fire and forget' (e.g. broadcast) the main requests such as `findIntent` or `raiseIntent` expect a response. In a bridging scenario, the response can come from multiple Desktop Agents and therefore need to be aggregated and augmented before they are sent back to the requesting DA. + +:::note +A set of classifications for message exchange types are provided in the [Individual message exchanges](#individual-message-exchanges) section. +::: + +The Desktop Agent Bridge is the responsible entity for collating responses together from all DAs. Whilst this approach may add some complexity to bridge implementations, it will simplify DA implementations since they only need to handle one response. + +The Desktop Agent Bridge MUST allow for timeout configuration. + +The Bridge SHOULD also implement timeout for waiting on DA responses. Assuming the message exchange will be all intra-machine, a recommended timeout of 1500ms SHOULD be used. Similarly, Desktop Agents SHOULD apply a timeout to requests made to the bridge that require a response (collated or otherwise), to handle situations where the bridge is not responding as expected. A recommended timeout of 3000ms SHOULD be used in this case. + ### Message Format All messages sent or received by the Desktop Agent Bridge will be encoded in JSON and will have the same basic structure (including those already defined in the connection protocol): @@ -677,28 +717,7 @@ In the event that a Desktop Agent repeatedly times out, the bridge SHOULD discon In the event that the bridge repeatedly times out, connected Desktop Agents MAY disconnect from the bridge and attempt to reconnect by returning to Step 1 of the connection protocol. -### FDC3 API calls that do NOT generate bridge messages - -Some FDC3 API calls can be handled locally and do not need to generate request messages to the Desktop Agent Bridge, but are likely to be involved in other exchanges that do generate messages to the bridge (for example adding context or intent handlers). Those calls include: - -* `addContextListener` functions (excluding those for `PrivateChannel` instances) -* `listener.unsubscribe` (excluding those for `PrivateChannel` instances) -* `addIntentListener` -* `getOrCreateChannel` -* `createPrivateChannel` -* `getUserChannels` and `getSystemChannels` -* `joinUserChannel` and `joinChannel` -* `getCurrentChannel` -* `leaveCurrentChannel` -* `getInfo` - -However, `PrivateChannel` instances allow the registration of additional event handlers (for the addition or removal of context listeners) that may be used to manage streaming data sent over them by starting or stopping the stream in response to those events. Hence, the following calls DO generate request messages when used on a PrivateChannel instance: - -* `addContextListener` -* `listener.unsubscribe` -* `disconnect` - -## Individual message exchanges +### Individual message exchanges Individual message exchanges are defined for each of the Desktop Agent methods that require bridging in the reference section of this Part. @@ -731,7 +750,7 @@ The message exchanges defined are: * [`PrivateChannel.onUnsubscribe`](ref/PrivateChannel.onUnsubscribe) * [`PrivateChannel.onDisconnect`](ref/PrivateChannel.onDisconnect) -### PrivateChannels +#### PrivateChannels `PrivateChannels` are intended to provide a private communication channel for applications. In order to do so, there are differences in how their broadcasts and event messages (used to manage the channel's lifecycle) MUST be handled. @@ -739,7 +758,28 @@ Broadcasts and event messages should be addressed to the Desktop Agent that crea To facilitate the addressing of messages to the relevant Desktop Agent and `AppIdentifier` some additional tracking of private channel metadata is necessary in each Desktop Agent (or Desktop Agent Bridge Client implementation). For applications receiving a private channel as an `IntentResult`, the `AppIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id. This data MUST be retained until the receiving application sends a `disconnect` message, after which it can be discarded. For applications that have created and returned a private channel, and have subsequently received event messages subscriptions (`onAddContextListener`, `onSubscribe`, `onDisconnect`) the `appIdentifier` with `desktopAgent` field MUST be tracked against the private channel's id and listener type, which will facilitate repeating of messages to registered listeners. This data MUST be retained until the remote application sends a `disconnect` message or a message indicating that the listener has been removed. -### Message Schemas and generated sources +#### FDC3 API calls that do NOT generate bridge messages + +Some FDC3 API calls can be handled locally and do not need to generate request messages to the Desktop Agent Bridge, but are likely to be involved in other exchanges that do generate messages to the bridge (for example adding context or intent handlers). Those calls include: + +* `addContextListener` functions (excluding those for `PrivateChannel` instances) +* `listener.unsubscribe` (excluding those for `PrivateChannel` instances) +* `addIntentListener` +* `getOrCreateChannel` +* `createPrivateChannel` +* `getUserChannels` and `getSystemChannels` +* `joinUserChannel` and `joinChannel` +* `getCurrentChannel` +* `leaveCurrentChannel` +* `getInfo` + +However, `PrivateChannel` instances allow the registration of additional event handlers (for the addition or removal of context listeners) that may be used to manage streaming data sent over them by starting or stopping the stream in response to those events. Hence, the following calls DO generate request messages when used on a PrivateChannel instance: + +* `addContextListener` +* `listener.unsubscribe` +* `disconnect` + +#### Message Schemas and generated sources JSONSchema definitions are provided for all Desktop Agent Bridging message exchanges (see links in each reference page), which may be used to validate the correct generation of messages to or from a bridge. From 1b4896aecdeff06b1fccdc6bd80ca573dbe228cc Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 23:48:02 +0100 Subject: [PATCH 035/106] Reassemble connection section of bridging proposal --- docs/api-bridging/spec.md | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 464e14e5a..b40fb7131 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -65,6 +65,26 @@ Other possible topologies include peer-to-peer or client/server networks, howeve Whilst the standalone bridge represents a single point of failure for the interconnection of Desktop Agents, it will also be significantly simpler than a full Desktop Agent implementation. Further, failures may be mitigated by setting the bridge up as a system service, such that it is started when the user's computer is started and may be restarted automatically if it fails. In the event of a bridge failure or manual shutdown, then Desktop Agents will no longer be bridged and should act as single agents. +By using the Desktop Agent Bridging Connection and Messaging protocols, a bridge will implement "server" behavior by: + +* Accepting connections from client Desktop Agents, receiving and authenticating credentials and assigning a name (for routing purposes) +* Receiving requests from client Desktop Agents. +* Routing requests to client Desktop Agents. +* Receiving responses from client Desktop Agents and collating them. +* Routing responses to client Desktop Agents. + +A Desktop Agent will implement "client" behavior by: + +* Connecting to the bridge, providing authentication credentials and receiving an assigned named (for purposes) +* Forwarding requests to the bridge. +* Awaiting response(s) from the bridge. +* Receiving requests from the bridge. +* Sending responses to the bridge. + +Hence, message paths and propagation are simple. All messages to other Desktop Agents are passed to the bridge for routing and all messages (both requests and responses) are received back from it, i.e. the bridge is responsible for all message routing. + +#### Multi-Machine Use Cases + In Financial services it is not unusual for a single user to be working with applications on more than one desktop. As Desktop Agents do not span desktops bridging Desktop Agents across multiple machines is an additional use case for Desktop Agent bridging. However, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. ```mermaid @@ -89,24 +109,6 @@ flowchart LR; PC1 .- |Bridge interconnect| PC2 ``` -By using the Desktop Agent Bridging Connection and Messaging protocols, a bridge will implement "server" behavior by: - -* Accepting connections from client Desktop Agents, receiving and authenticating credentials and assigning a name (for routing purposes) -* Receiving requests from client Desktop Agents. -* Routing requests to client Desktop Agents. -* Receiving responses from client Desktop Agents and collating them. -* Routing responses to client Desktop Agents. - -A Desktop Agent will implement "client" behavior by: - -* Connecting to the bridge, providing authentication credentials and receiving an assigned named (for purposes) -* Forwarding requests to the bridge. -* Awaiting response(s) from the bridge. -* Receiving requests from the bridge. -* Sending responses to the bridge. - -Hence, message paths and propagation are simple. All messages to other Desktop Agents are passed to the bridge for routing and all messages (both requests and responses) are received back from it, i.e. the bridge is responsible for all message routing. - ### Websocket Connection Connections between Desktop Agents and the Desktop Agent Bridge will be made via websocket connections, with the bridge acting as the websocket server and each connected Desktop Agent as a client. From 6b0bfdc45b7ffae722dadf2439b55fbb54ef3db6 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 23:51:33 +0100 Subject: [PATCH 036/106] commenting out TODO list --- docs/api-bridging/spec.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index b40fb7131..6975cf0b7 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -14,13 +14,13 @@ The FDC3 Desktop Agent API addresses interoperability between apps running withi In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. -## TODO list + ## Bridging Desktop Agents From a5aa3879fced77d260c474fbc8e8f4dfe85409df Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Apr 2023 23:54:00 +0100 Subject: [PATCH 037/106] tweaking port range details --- docs/api-bridging/spec.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 6975cf0b7..663faed9b 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -115,9 +115,9 @@ Connections between Desktop Agents and the Desktop Agent Bridge will be made via The bridge MUST run on the same machine as the Desktop Agents, and the websocket MUST be bound to the loopback adapter IP address (127.0.0.1), ensuring that the websocket is not exposed to wider networks. -Bridge implementations SHOULD default to binding the websocket server to a port in the recommended port range 4475 - 4575, enabling simple discovery of a running bridge via attempting socket connections to ports in that range and attempting a handshake (as defined later in this proposal) that will identify the websocket as belong to a Desktop Agent Bridge. A port range is used, in preference to a single nominated port, in order to enable the automatic resolution of port clashes with other services. +Bridge implementations SHOULD default to binding the websocket server to a port in the recommended port range 4475 - 4575, enabling simple discovery of a running bridge via attempting socket connections to ports in that range and attempting a handshake (as defined later in this proposal) that will identify the websocket as belong to a Desktop Agent Bridge. A port range MAY be used, in preference to a single nominated port, in order to enable the automatic resolution of port clashes with other services. -Both DAs and bridge implementations MUST support at least connection to the recommended port range and MAY also support configuration for connection to an alternative bridging port range. +Both DAs and bridge implementations SHOULD support at least connection to the recommended port range and MAY also support configuration for connection to an alternative bridging port or port range. ### Bridging Desktop Agents on Multiple Machines From 1d5492bbab1f7dd29c89255de67673a40738ba42 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 00:09:19 +0100 Subject: [PATCH 038/106] Fixing broken links --- docs/api-bridging/ref/broadcast.md | 2 +- docs/api-bridging/ref/findIntentsByContext.md | 2 +- docs/api-bridging/ref/getAppMetadata.md | 2 +- docs/api-bridging/ref/raiseIntent.md | 4 +-- docs/context/ref/Nothing.md | 2 +- docs/context/spec.md | 30 +++++++++---------- .../version-1.0/context/spec.md | 30 +++++++++---------- 7 files changed, 36 insertions(+), 36 deletions(-) diff --git a/docs/api-bridging/ref/broadcast.md b/docs/api-bridging/ref/broadcast.md index 467948466..a6c18de2d 100644 --- a/docs/api-bridging/ref/broadcast.md +++ b/docs/api-bridging/ref/broadcast.md @@ -11,7 +11,7 @@ Desktop Agent bridging message exchange for a `broadcast()` API call on the [`De :::caution -Broadcasts on a [`PrivateChannel`](../../api/ref/PrivateChannel) have a separate message exchange, see [`PrivateChannel.broadcast`](ref/PrivateChannel.broadcast). +Broadcasts on a [`PrivateChannel`](../../api/ref/PrivateChannel) have a separate message exchange, see [`PrivateChannel.broadcast`](PrivateChannel.broadcast). ::: diff --git a/docs/api-bridging/ref/findIntentsByContext.md b/docs/api-bridging/ref/findIntentsByContext.md index 587737231..2752fc1bf 100644 --- a/docs/api-bridging/ref/findIntentsByContext.md +++ b/docs/api-bridging/ref/findIntentsByContext.md @@ -6,7 +6,7 @@ title: findIntentsByContext Desktop Agent bridging message exchange for a `findIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API call: -* [`findIntentsByContext(context: Context)`](../api/ref/DesktopAgent#findintentsbycontext) +* [`findIntentsByContext(context: Context)`](../../api/ref/DesktopAgent#findintentsbycontext) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** diff --git a/docs/api-bridging/ref/getAppMetadata.md b/docs/api-bridging/ref/getAppMetadata.md index 6e0d5abbb..d40dde3e6 100644 --- a/docs/api-bridging/ref/getAppMetadata.md +++ b/docs/api-bridging/ref/getAppMetadata.md @@ -6,7 +6,7 @@ title: getAppMetadata Desktop Agent bridging message exchange for a `getAppMetadata` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -* [`getAppMetadata(app: AppIdentifier)`](../api/ref/DesktopAgent#getappmetadata) +* [`getAppMetadata(app: AppIdentifier)`](../../api/ref/DesktopAgent#getappmetadata) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (single)** diff --git a/docs/api-bridging/ref/raiseIntent.md b/docs/api-bridging/ref/raiseIntent.md index ca200891a..e44b88629 100644 --- a/docs/api-bridging/ref/raiseIntent.md +++ b/docs/api-bridging/ref/raiseIntent.md @@ -6,8 +6,8 @@ title: raiseIntent Desktop Agent bridging message exchange for a `raiseIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintent) -* [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../api/ref/DesktopAgent#raiseintentforcontext) +* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintent) +* [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintentforcontext) [Message Exchange Type](../spec#individual-message-exchanges): **Request Multiple Response (single)** diff --git a/docs/context/ref/Nothing.md b/docs/context/ref/Nothing.md index 9cc95c5c6..fa16004eb 100644 --- a/docs/context/ref/Nothing.md +++ b/docs/context/ref/Nothing.md @@ -25,7 +25,7 @@ Notes: ## Schema -[https://fdc3.finos.org/schemas/next/context/nothing.schema.json](g/schemas/next/context/nothing.schema.json) +[https://fdc3.finos.org/schemas/next/context/nothing.schema.json](/schemas/next/context/nothing.schema.json) ## Example diff --git a/docs/context/spec.md b/docs/context/spec.md index 436f22136..20bccef6e 100644 --- a/docs/context/spec.md +++ b/docs/context/spec.md @@ -159,21 +159,21 @@ For more details on FDC3 Standards compliance (including the versioning, depreca The following are standard FDC3 context types: -* [`fdc3.chart`](ref/Chart) ([schema](/schemas/next/chart.schema.json)) -* [`fdc3.chat.initSettings`](ref/ChatInitSettings) ([schema](/schemas/next/chatInitSettings.schema.json)) -* [`fdc3.contact`](ref/Contact) ([schema](/schemas/next/contact.schema.json)) -* [`fdc3.contactList`](ref/ContactList) ([schema](/schemas/next/contactList.schema.json)) -* [`fdc3.country`](ref/Country) ([schema](/schemas/next/country.schema.json)) -* [`fdc3.currency`](ref/Currency) ([schema](/schemas/next/currency.schema.json)) -* [`fdc3.email`](ref/Email) ([schema](/schemas/next/email.schema.json)) -* [`fdc3.instrument`](ref/Instrument) ([schema](/schemas/next/instrument.schema.json)) -* [`fdc3.instrumentList`](ref/InstrumentList) ([schema](/schemas/next/instrumentList.schema.json)) -* [`fdc3.organization`](ref/Organization) ([schema](/schemas/next/organization.schema.json)) -* [`fdc3.portfolio`](ref/Portfolio) ([schema](/schemas/next/portfolio.schema.json)) -* [`fdc3.position`](ref/Position) ([schema](/schemas/next/position.schema.json)) -* [`fdc3.nothing`](ref/Nothing) ([schema](/schemas/next/nothing.schema.json)) -* [`fdc3.timerange`](ref/TimeRange) ([schema](/schemas/next/timerange.schema.json)) -* [`fdc3.valuation`](ref/Valuation) ([schema](/schemas/next/valuation.schema.json)) +* [`fdc3.chart`](ref/Chart) ([schema](/schemas/next/context/chart.schema.json)) +* [`fdc3.chat.initSettings`](ref/ChatInitSettings) ([schema](/schemas/next/context/chatInitSettings.schema.json)) +* [`fdc3.contact`](ref/Contact) ([schema](/schemas/next/context/contact.schema.json)) +* [`fdc3.contactList`](ref/ContactList) ([schema](/schemas/next/context/contactList.schema.json)) +* [`fdc3.country`](ref/Country) ([schema](/schemas/next/context/country.schema.json)) +* [`fdc3.currency`](ref/Currency) ([schema](/schemas/next/context/currency.schema.json)) +* [`fdc3.email`](ref/Email) ([schema](/schemas/next/context/email.schema.json)) +* [`fdc3.instrument`](ref/Instrument) ([schema](/schemas/next/context/instrument.schema.json)) +* [`fdc3.instrumentList`](ref/InstrumentList) ([schema](/schemas/next/context/instrumentList.schema.json)) +* [`fdc3.organization`](ref/Organization) ([schema](/schemas/next/context/organization.schema.json)) +* [`fdc3.portfolio`](ref/Portfolio) ([schema](/schemas/next/context/portfolio.schema.json)) +* [`fdc3.position`](ref/Position) ([schema](/schemas/next/context/position.schema.json)) +* [`fdc3.nothing`](ref/Nothing) ([schema](/schemas/next/context/nothing.schema.json)) +* [`fdc3.timerange`](ref/TimeRange) ([schema](/schemas/next/context/timerange.schema.json)) +* [`fdc3.valuation`](ref/Valuation) ([schema](/schemas/next/context/valuation.schema.json)) **Note:** The below examples show how the base context data interface can be used to define specific context data objects. diff --git a/website/versioned_docs/version-1.0/context/spec.md b/website/versioned_docs/version-1.0/context/spec.md index 17094e557..d1586d321 100644 --- a/website/versioned_docs/version-1.0/context/spec.md +++ b/website/versioned_docs/version-1.0/context/spec.md @@ -156,21 +156,21 @@ For more details on FDC3 Standards compliance (including the versioning, depreca The following are standard FDC3 context types: -* [`fdc3.chart`](ref/Chart) ([schema](/schemas/next/chart.schema.json)) -* [`fdc3.chat.initSettings`](ref/ChatInitSettings) ([schema](/schemas/next/chatInitSettings.schema.json)) -* [`fdc3.contact`](ref/Contact) ([schema](/schemas/next/contact.schema.json)) -* [`fdc3.contactList`](ref/ContactList) ([schema](/schemas/next/contactList.schema.json)) -* [`fdc3.country`](ref/Country) ([schema](/schemas/next/country.schema.json)) -* [`fdc3.currency`](ref/Currency) ([schema](/schemas/next/currency.schema.json)) -* [`fdc3.email`](ref/Email) ([schema](/schemas/next/email.schema.json)) -* [`fdc3.instrument`](ref/Instrument) ([schema](/schemas/next/instrument.schema.json)) -* [`fdc3.instrumentList`](ref/InstrumentList) ([schema](/schemas/next/instrumentList.schema.json)) -* [`fdc3.organization`](ref/Organization) ([schema](/schemas/next/organization.schema.json)) -* [`fdc3.portfolio`](ref/Portfolio) ([schema](/schemas/next/portfolio.schema.json)) -* [`fdc3.position`](ref/Position) ([schema](/schemas/next/position.schema.json)) -* [`fdc3.nothing`](ref/Nothing) ([schema](/schemas/next/nothing.schema.json)) -* [`fdc3.timerange`](ref/TimeRange) ([schema](/schemas/next/timerange.schema.json)) -* [`fdc3.valuation`](ref/Valuation) ([schema](/schemas/next/valuation.schema.json)) +* [`fdc3.chart`](ref/Chart) ([schema](/schemas/next/context/chart.schema.json)) +* [`fdc3.chat.initSettings`](ref/ChatInitSettings) ([schema](/schemas/next/context/chatInitSettings.schema.json)) +* [`fdc3.contact`](ref/Contact) ([schema](/schemas/next/context/contact.schema.json)) +* [`fdc3.contactList`](ref/ContactList) ([schema](/schemas/next/context/contactList.schema.json)) +* [`fdc3.country`](ref/Country) ([schema](/schemas/next/context/country.schema.json)) +* [`fdc3.currency`](ref/Currency) ([schema](/schemas/next/context/currency.schema.json)) +* [`fdc3.email`](ref/Email) ([schema](/schemas/next/context/email.schema.json)) +* [`fdc3.instrument`](ref/Instrument) ([schema](/schemas/next/context/instrument.schema.json)) +* [`fdc3.instrumentList`](ref/InstrumentList) ([schema](/schemas/next/context/instrumentList.schema.json)) +* [`fdc3.organization`](ref/Organization) ([schema](/schemas/next/context/organization.schema.json)) +* [`fdc3.portfolio`](ref/Portfolio) ([schema](/schemas/next/context/portfolio.schema.json)) +* [`fdc3.position`](ref/Position) ([schema](/schemas/next/context/position.schema.json)) +* [`fdc3.nothing`](ref/Nothing) ([schema](/schemas/next/context/nothing.schema.json)) +* [`fdc3.timerange`](ref/TimeRange) ([schema](/schemas/next/context/timerange.schema.json)) +* [`fdc3.valuation`](ref/Valuation) ([schema](/schemas/next/context/valuation.schema.json)) **Note:** The below examples show how the base context data interface can be used to define specific context data objects. From 94877444e36aebd70131a02c617149711390b0db Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 00:40:25 +0100 Subject: [PATCH 039/106] Fixing Methods.ts tests --- test/Methods.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Methods.test.ts b/test/Methods.test.ts index b180b14d0..bf20775bb 100644 --- a/test/Methods.test.ts +++ b/test/Methods.test.ts @@ -421,6 +421,7 @@ describe('test version comparison functions', () => { optionalFeatures: { OriginatingAppMetadata: true, UserChannelMembershipAPIs: false, + DesktopAgentBridging: false }, }; expect(versionIsAtLeast(metaOneTwo, '1.1')).toBe(true); @@ -435,6 +436,7 @@ describe('test version comparison functions', () => { optionalFeatures: { OriginatingAppMetadata: true, UserChannelMembershipAPIs: false, + DesktopAgentBridging: false }, }; expect(versionIsAtLeast(metaOneTwoOne, '1.1')).toBe(true); From e82492f164a5e2728c44cb59819b788a816e402b Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 00:44:25 +0100 Subject: [PATCH 040/106] Linting Methods.test.ts --- test/Methods.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Methods.test.ts b/test/Methods.test.ts index bf20775bb..7927270ae 100644 --- a/test/Methods.test.ts +++ b/test/Methods.test.ts @@ -421,7 +421,7 @@ describe('test version comparison functions', () => { optionalFeatures: { OriginatingAppMetadata: true, UserChannelMembershipAPIs: false, - DesktopAgentBridging: false + DesktopAgentBridging: false, }, }; expect(versionIsAtLeast(metaOneTwo, '1.1')).toBe(true); @@ -436,7 +436,7 @@ describe('test version comparison functions', () => { optionalFeatures: { OriginatingAppMetadata: true, UserChannelMembershipAPIs: false, - DesktopAgentBridging: false + DesktopAgentBridging: false, }, }; expect(versionIsAtLeast(metaOneTwoOne, '1.1')).toBe(true); From 05549fbf0d2c05a73cb545d784d8b4a297c9883e Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 00:46:00 +0100 Subject: [PATCH 041/106] adjusting netlify config --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 4da146412..ad774c375 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,5 +1,5 @@ [build] - ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF . ../{toolbox,docs,src,website}/" + ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF . ../{toolbox,docs,src,test,website}/" [[headers]] # Define which paths this specific [[headers]] block will cover. From ba539f4de3641d6aa5e57e884d76986dbeb70a6c Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 12:07:21 +0100 Subject: [PATCH 042/106] Adding schema links for bridgeRequest and bridgeResponse --- docs/api-bridging/spec.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 663faed9b..0fc913d88 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -250,6 +250,9 @@ The Desktop Agent Bridge will extract the authentication token `sub` from the JW ```typescript { type: "authenticationFailed", + payload: { + message: string + }, meta: { /** Timestamp at which response was generated */ timestamp: Date, @@ -405,9 +408,9 @@ All messages sent or received by the Desktop Agent Bridge will be encoded in JSO Messages can be divided into two categories: * Requests: Messages that initiate a particular interaction -* Responses: Messages that later to a prior request +* Responses: Messages that respond to a prior request -Details specific to each are provided below: +Details specific to each are provided in the following sections. #### Request Messages @@ -455,6 +458,8 @@ Request messages use the following format: } ``` +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json](/schemas/next/bridging/bridgeRequest.schema.json) + If the FDC3 API call underlying the request message includes a target (typically defined by an `app` argument, in the form of an AppIdentifier object) it is the responsibility of the Desktop Agent to copy that argument into the `meta.destination` field of the message and to ensure that it includes a `meta.destination.desktopAgent` value. If the target is provided in the FDC3 API call, but without a `meta.destination.desktopAgent` value, the Desktop Agent should assume that the call relates to a local application and does not need to send it to the bridge. Requests without a `meta.destination` field will be forwarded to all other agents by the bridge, which will also handle the collation of responses which quote the `meta.requestGuid`. @@ -524,6 +529,8 @@ Response messages will be differentiated from requests by the presence of a `met } ``` +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json](/schemas/next/bridging/bridgeResponse.schema.json) + Response messages do not include a `meta.destination` as the routing of responses is handled by the bridge via the `meta.requestGuid` field. ### Identifying Individual Messages From 5289bcdd5b149d50825742cb3942e325f34b72c9 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 12:30:09 +0100 Subject: [PATCH 043/106] Avoid Prettier issue with `export * as` --- src/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index c42d7b0c1..98662a640 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ */ import { DesktopAgent } from './api/DesktopAgent'; +import * as BridgingTypes from './bridging/BridgingTypes'; export * from './api/AppIdentifier'; export * from './api/AppIntent'; @@ -26,7 +27,10 @@ export * from './api/Types'; export * from './context/ContextType'; export * from './context/ContextTypes'; export * from './intents/Intents'; -export * as BridgingTypes from './bridging/BridgingTypes'; + +/* Workaround for conflicts between bridging types and API types + and prettier issue with `export * as`. */ +export { BridgingTypes }; declare global { interface Window { From ccc6bc563ce4f5a46a499cef0ffd8a02535839f1 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Wed, 26 Apr 2023 12:32:45 +0100 Subject: [PATCH 044/106] connection protocol schemas --- docs/api-bridging/spec.md | 12 +- .../bridging/connectionStep2Hello.schema.json | 47 +++ .../connectionStep3Handshake.schema.json | 54 ++++ ...ctionStep4AuthenticationFailed.schema.json | 42 +++ ...tionStep6ConnectedAgentsUpdate.schema.json | 61 ++++ src/bridging/BridgingTypes.ts | 290 ++++++++++++++++-- .../bridging/connectionStep2Hello.schema.json | 47 +++ .../connectionStep3Handshake.schema.json | 54 ++++ ...ctionStep4AuthenticationFailed.schema.json | 42 +++ ...tionStep6ConnectedAgentsUpdate.schema.json | 61 ++++ 10 files changed, 689 insertions(+), 21 deletions(-) create mode 100644 schemas/bridging/connectionStep2Hello.schema.json create mode 100644 schemas/bridging/connectionStep3Handshake.schema.json create mode 100644 schemas/bridging/connectionStep4AuthenticationFailed.schema.json create mode 100644 schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json create mode 100644 website/static/schemas/next/bridging/connectionStep2Hello.schema.json create mode 100644 website/static/schemas/next/bridging/connectionStep3Handshake.schema.json create mode 100644 website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json create mode 100644 website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 0fc913d88..2b99fe8a9 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -175,7 +175,7 @@ When a new connection is made to the Desktop Agent Bridge websocket, it sends a { type: "hello", payload: { - desktopAgentBridgeVersion: number, + desktopAgentBridgeVersion: string, supportedFDC3Versions: string[], authRequired: boolean, /** The DAB JWT authentication token */ @@ -187,6 +187,8 @@ When a new connection is made to the Desktop Agent Bridge websocket, it sends a } ``` +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/connectionStep2Hello.schema.json](/schemas/next/bridging/connectionStep2Hello.schema.json) + A Desktop Agent can use the structure of this message to determine that it has connected to a Desktop Agent Bridge (i.e by checking `msg.type === "hello" && msg.payload.desktopAgentBridgeVersion`), whether it supports a compatible FDC3 version and whether it is expected to provide authentication credentials in the next step (`if(msg.payload.authRequired) { ... }`). An optional JWT token can be included in the `hello` message to allow the connecting agent to authenticate the bridge. Verification of the supplied JWT by the DA is optional but recommended, meaning that the DA SHOULD verify the received JWT when one is included in the `hello` message. @@ -221,6 +223,8 @@ The DA must then respond to the `hello` message with a `handshake` request to th } ``` +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/connectionStep3Handshake.schema.json](/schemas/next/bridging/connectionStep3Handshake.schema.json) + Note that the `meta` element of of the handshake message contains both a `timestamp` field (for logging purposes) and a `requestGuid` field that should be populated with a Globally Unique Identifier (GUID), generated by the Desktop Agent. This `responseGuid` will be used to link the handshake message to a response from the Desktop Agent Bridge that assigns it a name. For more details on GUID generation see [Globally Unique Identifier](#globally-unique-identifier) section. If requested by the server, the JWT auth token payload should take the form: @@ -264,6 +268,8 @@ The Desktop Agent Bridge will extract the authentication token `sub` from the JW } ``` +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json](/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json) + If authentication succeeds (or is not required), then the Desktop Agent Bridge should assign the Desktop Agent the name requested in the `handshake` message, unless another agent is already connected with that name in which case it should generate a new name which MAY be derived from the requested name. Note that the assigned name is not communicated to the connecting agent until step 5. ### Step 5. Synchronize the Bridge's Channel State @@ -318,7 +324,7 @@ The `connectedAgentsUpdate` message will take the form: allAgents: ImplementationMetadata[], /** The updated state of channels that should be adopted by the agents. * SHOULD only be set when an agent is connecting to the bridge. */ - channelsState?: ChannelState[] // see step4 + channelsState?: Record // see step4 }, meta: { /** For a new connection, should be the same as the handshake requestGuid. @@ -333,6 +339,8 @@ The `connectedAgentsUpdate` message will take the form: } ``` +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json](/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json) + When an agent connects to the bridge, it and other agents connected to the bridge, should adopt the state of any channels that do not currently exist or do not currently contain state of a particular type. This synchronization is NOT performed via broadcast as the context being merged would become the most recent context on the channel, when other contexts may have been broadcast subsequently. Rather, it should be adopted internally by each Desktop Agent, merging it such that it would be received by applications that have added a context listener to the channel or call `channel.getCurrentContext()` on it. It should be noted that Desktop Agents will not have context listeners for previously unknown channels, and SHOULD simply record that channel's state for use when that channel is first used. diff --git a/schemas/bridging/connectionStep2Hello.schema.json b/schemas/bridging/connectionStep2Hello.schema.json new file mode 100644 index 000000000..c779b81ae --- /dev/null +++ b/schemas/bridging/connectionStep2Hello.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep2Hello.schema.json", + "title": "connectionStep2Hello", + "type": "object", + "properties": { + "type": { + "const": "hello" + }, + "payload": { + "type": "object", + "properties": { + "desktopAgentBridgeVersion": { + "type": "string" + }, + "supportedFDC3Versions": { + "type": "array", + "items": { + "type": "string" + } + }, + "authRequired": { + "type": "boolean" + }, + "authToken": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["desktopAgentBridgeVersion", "supportedFDC3Versions", "authRequired"] + }, + "meta": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["timestamp"] + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/bridging/connectionStep3Handshake.schema.json b/schemas/bridging/connectionStep3Handshake.schema.json new file mode 100644 index 000000000..13fe011a2 --- /dev/null +++ b/schemas/bridging/connectionStep3Handshake.schema.json @@ -0,0 +1,54 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep3Handshake.schema.json", + "title": "connectionStep3Handshake", + "type": "object", + "properties": { + "type": { + "const": "handshake" + }, + "payload": { + "type": "object", + "properties": { + "implementationMetadata": { + "$ref": "../api/implementationMetadata.schema.json" + }, + "requestedName": { + "type": "string" + }, + "channelsState": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } + } + }, + "authToken": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["implementationMetadata", "requestedName", "channelsState"] + }, + "meta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["requestGuid", "timestamp"] + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/bridging/connectionStep4AuthenticationFailed.schema.json b/schemas/bridging/connectionStep4AuthenticationFailed.schema.json new file mode 100644 index 000000000..992028cd2 --- /dev/null +++ b/schemas/bridging/connectionStep4AuthenticationFailed.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json", + "title": "connectionStep4AuthenticationFailed", + "type": "object", + "properties": { + "type": { + "const": "authenticationFailed" + }, + "payload": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "responseGuid": { + "type": "string", + "description": "Unique GUID for the response" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["requestGuid", "responseGuid", "timestamp"] + } + }, + "required": ["type", "meta"], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json new file mode 100644 index 000000000..abdbd7849 --- /dev/null +++ b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json", + "title": "connectionStep6ConnectedAgentsUpdate", + "type": "object", + "properties": { + "type": { + "const": "connectedAgentsUpdate" + }, + "payload": { + "type": "object", + "properties": { + "addAgent": { + "type": "string" + }, + "removeAgent": { + "type": "string" + }, + "allAgents": { + "type": "array", + "items": { + "$ref": "../api/implementationMetadata.schema.json" + } + }, + "channelsState": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } + } + } + }, + "additionalProperties": false, + "required": ["allAgents"] + }, + "meta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "responseGuid": { + "type": "string", + "description": "Unique GUID for the response" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["requestGuid", "responseGuid", "timestamp"] + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 5bf465ba0..da7086e6d 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,6 +1,6 @@ // To parse this data: // -// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; +// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; // // const appIdentifier = Convert.toAppIdentifier(json); // const appIntent = Convert.toAppIntent(json); @@ -19,6 +19,10 @@ // const bridgeRequest = Convert.toBridgeRequest(json); // const bridgeResponse = Convert.toBridgeResponse(json); // const broadcastRequest = Convert.toBroadcastRequest(json); +// const connectionStep2Hello = Convert.toConnectionStep2Hello(json); +// const connectionStep3Handshake = Convert.toConnectionStep3Handshake(json); +// const connectionStep4AuthenticationFailed = Convert.toConnectionStep4AuthenticationFailed(json); +// const connectionStep6ConnectedAgentsUpdate = Convert.toConnectionStep6ConnectedAgentsUpdate(json); // const findInstancesRequest = Convert.toFindInstancesRequest(json); // const findInstancesResponse = Convert.toFindInstancesResponse(json); // const findIntentRequest = Convert.toFindIntentRequest(json); @@ -222,12 +226,12 @@ export interface Image { export interface ImplementationMetadata { appMetadata: AppMetadataElement; fdc3Version: string; - optionalFeatures: OptionalFeatures; + optionalFeatures: ImplementationMetadataOptionalFeatures; provider: string; providerVersion?: string; } -export interface OptionalFeatures { +export interface ImplementationMetadataOptionalFeatures { DesktopAgentBridging?: boolean; OriginatingAppMetadata: boolean; UserChannelMembershipAPIs: boolean; @@ -423,7 +427,7 @@ export interface PurpleIdentifier { */ export interface BroadcastRequestPayload { channel: ChannelClass; - context: ContextObject; + context: ContextElement; } /** @@ -435,13 +439,127 @@ export interface ChannelClass { type: Type; } -export interface ContextObject { +export interface ContextElement { id?: { [key: string]: any }; name?: string; type: string; [property: string]: any; } +export interface ConnectionStep2Hello { + meta: ConnectionStep2HelloMeta; + payload: ConnectionStep2HelloPayload; + type: any; +} + +export interface ConnectionStep2HelloMeta { + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +export interface ConnectionStep2HelloPayload { + authRequired: boolean; + authToken?: string; + desktopAgentBridgeVersion: string; + supportedFDC3Versions: string[]; +} + +export interface ConnectionStep3Handshake { + meta: ConnectionStep3HandshakeMeta; + payload: ConnectionStep3HandshakePayload; + type: any; +} + +export interface ConnectionStep3HandshakeMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +export interface ConnectionStep3HandshakePayload { + authToken?: string; + channelsState: { [key: string]: ContextElement[] }; + implementationMetadata: ImplementationMetadataElement; + requestedName: string; +} + +/** + * Metadata relating to the FDC3 DesktopAgent object and its provider + */ +export interface ImplementationMetadataElement { + appMetadata: AppMetadataElement; + fdc3Version: string; + optionalFeatures: AllAgentOptionalFeatures; + provider: string; + providerVersion?: string; +} + +export interface AllAgentOptionalFeatures { + DesktopAgentBridging?: boolean; + OriginatingAppMetadata: boolean; + UserChannelMembershipAPIs: boolean; +} + +export interface ConnectionStep4AuthenticationFailed { + meta: ConnectionStep4AuthenticationFailedMeta; + payload?: ConnectionStep4AuthenticationFailedPayload; + type: any; +} + +export interface ConnectionStep4AuthenticationFailedMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +export interface ConnectionStep4AuthenticationFailedPayload { + message?: string; +} + +export interface ConnectionStep6ConnectedAgentsUpdate { + meta: ConnectionStep6ConnectedAgentsUpdateMeta; + payload: ConnectionStep6ConnectedAgentsUpdatePayload; + type: any; +} + +export interface ConnectionStep6ConnectedAgentsUpdateMeta { + /** + * Unique GUID for the request + */ + requestGuid: string; + /** + * Unique GUID for the response + */ + responseGuid: string; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +export interface ConnectionStep6ConnectedAgentsUpdatePayload { + addAgent?: string; + allAgents: ImplementationMetadataElement[]; + channelsState?: { [key: string]: ContextElement[] }; + removeAgent?: string; +} + export interface FindInstancesRequest { meta: FindInstancesRequestMeta; /** @@ -598,7 +716,7 @@ export interface FindIntentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface FindIntentRequestPayload { - context: ContextObject; + context: ContextElement; intent: string; } @@ -696,7 +814,7 @@ export interface FindIntentsByContextRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface FindIntentsByContextRequestPayload { - context: ContextObject; + context: ContextElement; } export interface FindIntentsByContextResponse { @@ -887,7 +1005,7 @@ export interface OpenRequestMeta { */ export interface OpenRequestPayload { app: SourceElement; - context?: ContextObject; + context?: ContextElement; } export interface OpenResponse { @@ -1234,7 +1352,7 @@ export interface RaiseIntentRequestMeta { */ export interface RaiseIntentRequestPayload { app: SourceElement; - context: ContextObject; + context: ContextElement; } export interface RaiseIntentResponse { @@ -1355,7 +1473,7 @@ export interface RaiseIntentResultResponsePayload { } export interface IntentResultClass { - context?: ContextObject; + context?: ContextElement; channel?: ChannelClass; } @@ -1505,6 +1623,38 @@ export class Convert { return JSON.stringify(uncast(value, r('BroadcastRequest')), null, 2); } + public static toConnectionStep2Hello(json: string): ConnectionStep2Hello { + return cast(JSON.parse(json), r('ConnectionStep2Hello')); + } + + public static connectionStep2HelloToJson(value: ConnectionStep2Hello): string { + return JSON.stringify(uncast(value, r('ConnectionStep2Hello')), null, 2); + } + + public static toConnectionStep3Handshake(json: string): ConnectionStep3Handshake { + return cast(JSON.parse(json), r('ConnectionStep3Handshake')); + } + + public static connectionStep3HandshakeToJson(value: ConnectionStep3Handshake): string { + return JSON.stringify(uncast(value, r('ConnectionStep3Handshake')), null, 2); + } + + public static toConnectionStep4AuthenticationFailed(json: string): ConnectionStep4AuthenticationFailed { + return cast(JSON.parse(json), r('ConnectionStep4AuthenticationFailed')); + } + + public static connectionStep4AuthenticationFailedToJson(value: ConnectionStep4AuthenticationFailed): string { + return JSON.stringify(uncast(value, r('ConnectionStep4AuthenticationFailed')), null, 2); + } + + public static toConnectionStep6ConnectedAgentsUpdate(json: string): ConnectionStep6ConnectedAgentsUpdate { + return cast(JSON.parse(json), r('ConnectionStep6ConnectedAgentsUpdate')); + } + + public static connectionStep6ConnectedAgentsUpdateToJson(value: ConnectionStep6ConnectedAgentsUpdate): string { + return JSON.stringify(uncast(value, r('ConnectionStep6ConnectedAgentsUpdate')), null, 2); + } + public static toFindInstancesRequest(json: string): FindInstancesRequest { return cast(JSON.parse(json), r('FindInstancesRequest')); } @@ -1961,13 +2111,13 @@ const typeMap: any = { [ { json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }, { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('OptionalFeatures') }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, { json: 'provider', js: 'provider', typ: '' }, { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, ], false ), - OptionalFeatures: o( + ImplementationMetadataOptionalFeatures: o( [ { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: u(undefined, true) }, { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, @@ -2070,7 +2220,7 @@ const typeMap: any = { BroadcastRequestPayload: o( [ { json: 'channel', js: 'channel', typ: r('ChannelClass') }, - { json: 'context', js: 'context', typ: r('ContextObject') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), @@ -2082,7 +2232,7 @@ const typeMap: any = { ], false ), - ContextObject: o( + ContextElement: o( [ { json: 'id', js: 'id', typ: u(undefined, m('any')) }, { json: 'name', js: 'name', typ: u(undefined, '') }, @@ -2090,6 +2240,108 @@ const typeMap: any = { ], 'any' ), + ConnectionStep2Hello: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep2HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep2HelloPayload') }, + { json: 'type', js: 'type', typ: 'any' }, + ], + false + ), + ConnectionStep2HelloMeta: o([{ json: 'timestamp', js: 'timestamp', typ: Date }], false), + ConnectionStep2HelloPayload: o( + [ + { json: 'authRequired', js: 'authRequired', typ: true }, + { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, + { json: 'desktopAgentBridgeVersion', js: 'desktopAgentBridgeVersion', typ: '' }, + { json: 'supportedFDC3Versions', js: 'supportedFDC3Versions', typ: a('') }, + ], + false + ), + ConnectionStep3Handshake: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep3HandshakeMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep3HandshakePayload') }, + { json: 'type', js: 'type', typ: 'any' }, + ], + false + ), + ConnectionStep3HandshakeMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep3HandshakePayload: o( + [ + { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, + { json: 'channelsState', js: 'channelsState', typ: m(a(r('ContextElement'))) }, + { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadataElement') }, + { json: 'requestedName', js: 'requestedName', typ: '' }, + ], + false + ), + ImplementationMetadataElement: o( + [ + { json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }, + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('AllAgentOptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + AllAgentOptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: u(undefined, true) }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), + ConnectionStep4AuthenticationFailed: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep4AuthenticationFailedMeta') }, + { json: 'payload', js: 'payload', typ: u(undefined, r('ConnectionStep4AuthenticationFailedPayload')) }, + { json: 'type', js: 'type', typ: 'any' }, + ], + false + ), + ConnectionStep4AuthenticationFailedMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep4AuthenticationFailedPayload: o([{ json: 'message', js: 'message', typ: u(undefined, '') }], false), + ConnectionStep6ConnectedAgentsUpdate: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep6ConnectedAgentsUpdateMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep6ConnectedAgentsUpdatePayload') }, + { json: 'type', js: 'type', typ: 'any' }, + ], + false + ), + ConnectionStep6ConnectedAgentsUpdateMeta: o( + [ + { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep6ConnectedAgentsUpdatePayload: o( + [ + { json: 'addAgent', js: 'addAgent', typ: u(undefined, '') }, + { json: 'allAgents', js: 'allAgents', typ: a(r('ImplementationMetadataElement')) }, + { json: 'channelsState', js: 'channelsState', typ: u(undefined, m(a(r('ContextElement')))) }, + { json: 'removeAgent', js: 'removeAgent', typ: u(undefined, '') }, + ], + false + ), FindInstancesRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindInstancesRequestMeta') }, @@ -2151,7 +2403,7 @@ const typeMap: any = { ), FindIntentRequestPayload: o( [ - { json: 'context', js: 'context', typ: r('ContextObject') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, { json: 'intent', js: 'intent', typ: '' }, ], false @@ -2199,7 +2451,7 @@ const typeMap: any = { ], false ), - FindIntentsByContextRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextObject') }], false), + FindIntentsByContextRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextElement') }], false), FindIntentsByContextResponse: o( [ { json: 'meta', js: 'meta', typ: r('FindIntentsByContextResponseMeta') }, @@ -2281,7 +2533,7 @@ const typeMap: any = { OpenRequestPayload: o( [ { json: 'app', js: 'app', typ: r('SourceElement') }, - { json: 'context', js: 'context', typ: u(undefined, r('ContextObject')) }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, ], false ), @@ -2463,7 +2715,7 @@ const typeMap: any = { RaiseIntentRequestPayload: o( [ { json: 'app', js: 'app', typ: r('SourceElement') }, - { json: 'context', js: 'context', typ: r('ContextObject') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), @@ -2523,7 +2775,7 @@ const typeMap: any = { ), IntentResultClass: o( [ - { json: 'context', js: 'context', typ: u(undefined, r('ContextObject')) }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, { json: 'channel', js: 'channel', typ: u(undefined, r('ChannelClass')) }, ], false diff --git a/website/static/schemas/next/bridging/connectionStep2Hello.schema.json b/website/static/schemas/next/bridging/connectionStep2Hello.schema.json new file mode 100644 index 000000000..c779b81ae --- /dev/null +++ b/website/static/schemas/next/bridging/connectionStep2Hello.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep2Hello.schema.json", + "title": "connectionStep2Hello", + "type": "object", + "properties": { + "type": { + "const": "hello" + }, + "payload": { + "type": "object", + "properties": { + "desktopAgentBridgeVersion": { + "type": "string" + }, + "supportedFDC3Versions": { + "type": "array", + "items": { + "type": "string" + } + }, + "authRequired": { + "type": "boolean" + }, + "authToken": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["desktopAgentBridgeVersion", "supportedFDC3Versions", "authRequired"] + }, + "meta": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["timestamp"] + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json new file mode 100644 index 000000000..13fe011a2 --- /dev/null +++ b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json @@ -0,0 +1,54 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep3Handshake.schema.json", + "title": "connectionStep3Handshake", + "type": "object", + "properties": { + "type": { + "const": "handshake" + }, + "payload": { + "type": "object", + "properties": { + "implementationMetadata": { + "$ref": "../api/implementationMetadata.schema.json" + }, + "requestedName": { + "type": "string" + }, + "channelsState": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } + } + }, + "authToken": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["implementationMetadata", "requestedName", "channelsState"] + }, + "meta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["requestGuid", "timestamp"] + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json b/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json new file mode 100644 index 000000000..992028cd2 --- /dev/null +++ b/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json", + "title": "connectionStep4AuthenticationFailed", + "type": "object", + "properties": { + "type": { + "const": "authenticationFailed" + }, + "payload": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "responseGuid": { + "type": "string", + "description": "Unique GUID for the response" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["requestGuid", "responseGuid", "timestamp"] + } + }, + "required": ["type", "meta"], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json new file mode 100644 index 000000000..abdbd7849 --- /dev/null +++ b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json", + "title": "connectionStep6ConnectedAgentsUpdate", + "type": "object", + "properties": { + "type": { + "const": "connectedAgentsUpdate" + }, + "payload": { + "type": "object", + "properties": { + "addAgent": { + "type": "string" + }, + "removeAgent": { + "type": "string" + }, + "allAgents": { + "type": "array", + "items": { + "$ref": "../api/implementationMetadata.schema.json" + } + }, + "channelsState": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } + } + } + }, + "additionalProperties": false, + "required": ["allAgents"] + }, + "meta": { + "type": "object", + "properties": { + "requestGuid": { + "type": "string", + "description": "Unique GUID for the request" + }, + "responseGuid": { + "type": "string", + "description": "Unique GUID for the response" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + } + }, + "additionalProperties": false, + "required": ["requestGuid", "responseGuid", "timestamp"] + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false +} \ No newline at end of file From f98ea83fcee214f434eff40472046362cb05bc54 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 12:39:10 +0100 Subject: [PATCH 045/106] Updating TODO list --- docs/api-bridging/spec.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 2b99fe8a9..46a2bf291 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -10,17 +10,17 @@ Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, i ::: -The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. - -In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. - +* Check if advice on imported BridgingTypes (last section in this spec) from the npm module is accurate. +* Link to BackPlane project somewhere + +--> + +The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. + +In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. ## Bridging Desktop Agents From a743042d1f28b74e20d180b5bc0594056b9d42e1 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 15:01:41 +0100 Subject: [PATCH 046/106] Fix typo in PrivateChannel.eventListenerRemoved --- docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md index 14d96c43e..3f6add8c9 100644 --- a/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -7,8 +7,8 @@ title: PrivateChannel.eventListenerRemoved Desktop Agent bridging message exchange for the removal of an event handler from a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: * [`listener.unsubscribe()`](../../api/ref/Types#listener) - * for []`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: - * [onAddContextListener(handler: (contextType?: string)](../../api/ref/PrivateChannel#onaddcontextlistener) + * for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: + * [`onAddContextListener(handler: (contextType?: string)`](../../api/ref/PrivateChannel#onaddcontextlistener) * [`onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) * [`onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) * [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) From e6165ad9b1acfaebcc69afb62a056f554bdaf852 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Wed, 26 Apr 2023 17:28:02 +0100 Subject: [PATCH 047/106] Added descriptions to connection protocol schemas --- docs/api-bridging/spec.md | 1 - .../bridging/connectionStep2Hello.schema.json | 8 +++- .../connectionStep3Handshake.schema.json | 3 ++ ...tionStep6ConnectedAgentsUpdate.schema.json | 8 +++- src/bridging/BridgingTypes.ts | 39 +++++++++++++++++++ .../bridging/connectionStep2Hello.schema.json | 8 +++- .../connectionStep3Handshake.schema.json | 3 ++ ...tionStep6ConnectedAgentsUpdate.schema.json | 8 +++- 8 files changed, 69 insertions(+), 9 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 2b99fe8a9..17118c468 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -531,7 +531,6 @@ Response messages will be differentiated from requests by the presence of a `met * to the bridge before the timeout or because an error occurred. * Should be the same length as the `errorSources` array and ordered the * same. May be omitted if all sources responded. */ - errorDetails?: string[] } } diff --git a/schemas/bridging/connectionStep2Hello.schema.json b/schemas/bridging/connectionStep2Hello.schema.json index c779b81ae..37b34c920 100644 --- a/schemas/bridging/connectionStep2Hello.schema.json +++ b/schemas/bridging/connectionStep2Hello.schema.json @@ -11,19 +11,23 @@ "type": "object", "properties": { "desktopAgentBridgeVersion": { + "description": "The version of the Bridge", "type": "string" }, "supportedFDC3Versions": { "type": "array", + "description": "The FDC3 versions supported by the Bridge", "items": { "type": "string" } }, "authRequired": { - "type": "boolean" + "type": "boolean", + "description": "A flag indicating whether the Desktop Agent Bridge requires authentication or not." }, "authToken": { - "type": "string" + "type": "string", + "description": "An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to authenticate a bridge." } }, "additionalProperties": false, diff --git a/schemas/bridging/connectionStep3Handshake.schema.json b/schemas/bridging/connectionStep3Handshake.schema.json index 13fe011a2..b5b1127e7 100644 --- a/schemas/bridging/connectionStep3Handshake.schema.json +++ b/schemas/bridging/connectionStep3Handshake.schema.json @@ -11,13 +11,16 @@ "type": "object", "properties": { "implementationMetadata": { + "description": "DesktopAgent implementationMetadata trying to connect to the bridge.", "$ref": "../api/implementationMetadata.schema.json" }, "requestedName": { + "description": "The requested Desktop Agent name", "type": "string" }, "channelsState": { "type": "object", + "description": "The current state of the Desktop Agent's channels, excluding any private channels, as a mapping of channel id to an array of Context objects, most recent first.", "additionalProperties": { "type": "array", "items": { diff --git a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json index abdbd7849..4db22aeee 100644 --- a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json +++ b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -11,19 +11,23 @@ "type": "object", "properties": { "addAgent": { - "type": "string" + "type": "string", + "description": "Should be set when an agent first connects to the bridge and provide its assigned name." }, "removeAgent": { - "type": "string" + "type": "string", + "description": "Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned." }, "allAgents": { "type": "array", + "description": "Desktop Agent Bridge implementation metadata of all connected agents.", "items": { "$ref": "../api/implementationMetadata.schema.json" } }, "channelsState": { "type": "object", + "description": "The updated state of channels that should be adopted by the agents. Should only be set when an agent is connecting to the bridge.", "additionalProperties": { "type": "array", "items": { diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index da7086e6d..1a9ac2dc0 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -460,9 +460,22 @@ export interface ConnectionStep2HelloMeta { } export interface ConnectionStep2HelloPayload { + /** + * A flag indicating whether the Desktop Agent Bridge requires authentication or not. + */ authRequired: boolean; + /** + * An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to + * authenticate a bridge. + */ authToken?: string; + /** + * The version of the Bridge + */ desktopAgentBridgeVersion: string; + /** + * The FDC3 versions supported by the Bridge + */ supportedFDC3Versions: string[]; } @@ -485,12 +498,24 @@ export interface ConnectionStep3HandshakeMeta { export interface ConnectionStep3HandshakePayload { authToken?: string; + /** + * The current state of the Desktop Agent's channels, excluding any private channels, as a + * mapping of channel id to an array of Context objects, most recent first. + */ channelsState: { [key: string]: ContextElement[] }; + /** + * DesktopAgent implementationMetadata trying to connect to the bridge. + */ implementationMetadata: ImplementationMetadataElement; + /** + * The requested Desktop Agent name + */ requestedName: string; } /** + * DesktopAgent implementationMetadata trying to connect to the bridge. + * * Metadata relating to the FDC3 DesktopAgent object and its provider */ export interface ImplementationMetadataElement { @@ -554,9 +579,23 @@ export interface ConnectionStep6ConnectedAgentsUpdateMeta { } export interface ConnectionStep6ConnectedAgentsUpdatePayload { + /** + * Should be set when an agent first connects to the bridge and provide its assigned name. + */ addAgent?: string; + /** + * Desktop Agent Bridge implementation metadata of all connected agents. + */ allAgents: ImplementationMetadataElement[]; + /** + * The updated state of channels that should be adopted by the agents. Should only be set + * when an agent is connecting to the bridge. + */ channelsState?: { [key: string]: ContextElement[] }; + /** + * Should be set when an agent disconnects from the bridge and provide the name that no + * longer is assigned. + */ removeAgent?: string; } diff --git a/website/static/schemas/next/bridging/connectionStep2Hello.schema.json b/website/static/schemas/next/bridging/connectionStep2Hello.schema.json index c779b81ae..37b34c920 100644 --- a/website/static/schemas/next/bridging/connectionStep2Hello.schema.json +++ b/website/static/schemas/next/bridging/connectionStep2Hello.schema.json @@ -11,19 +11,23 @@ "type": "object", "properties": { "desktopAgentBridgeVersion": { + "description": "The version of the Bridge", "type": "string" }, "supportedFDC3Versions": { "type": "array", + "description": "The FDC3 versions supported by the Bridge", "items": { "type": "string" } }, "authRequired": { - "type": "boolean" + "type": "boolean", + "description": "A flag indicating whether the Desktop Agent Bridge requires authentication or not." }, "authToken": { - "type": "string" + "type": "string", + "description": "An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to authenticate a bridge." } }, "additionalProperties": false, diff --git a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json index 13fe011a2..b5b1127e7 100644 --- a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json +++ b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json @@ -11,13 +11,16 @@ "type": "object", "properties": { "implementationMetadata": { + "description": "DesktopAgent implementationMetadata trying to connect to the bridge.", "$ref": "../api/implementationMetadata.schema.json" }, "requestedName": { + "description": "The requested Desktop Agent name", "type": "string" }, "channelsState": { "type": "object", + "description": "The current state of the Desktop Agent's channels, excluding any private channels, as a mapping of channel id to an array of Context objects, most recent first.", "additionalProperties": { "type": "array", "items": { diff --git a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json index abdbd7849..4db22aeee 100644 --- a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json +++ b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -11,19 +11,23 @@ "type": "object", "properties": { "addAgent": { - "type": "string" + "type": "string", + "description": "Should be set when an agent first connects to the bridge and provide its assigned name." }, "removeAgent": { - "type": "string" + "type": "string", + "description": "Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned." }, "allAgents": { "type": "array", + "description": "Desktop Agent Bridge implementation metadata of all connected agents.", "items": { "$ref": "../api/implementationMetadata.schema.json" } }, "channelsState": { "type": "object", + "description": "The updated state of channels that should be adopted by the agents. Should only be set when an agent is connecting to the bridge.", "additionalProperties": { "type": "array", "items": { From 4468ed4d63099587b119461344c90a334e9e17c4 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Apr 2023 18:12:49 +0100 Subject: [PATCH 048/106] Tweaking content of multi-machine sections of bridging spec --- docs/api-bridging/spec.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 46a2bf291..d45445789 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -109,6 +109,10 @@ flowchart LR; PC1 .- |Bridge interconnect| PC2 ``` +However, cross-machine routing is currently considered to be an internal concern of a Desktop Agent Bridge implementation, with each Desktop Agent simply communicating with a bridge instance located on the same machine. Hence, the connection protocol between bridges themselves is currently beyond the scope of this standard and my be implemented via any suitable means. + +Further, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. However, methods of verifying the identity of user are currently beyond the scope of the Standard. + ### Websocket Connection Connections between Desktop Agents and the Desktop Agent Bridge will be made via websocket connections, with the bridge acting as the websocket server and each connected Desktop Agent as a client. @@ -119,11 +123,9 @@ Bridge implementations SHOULD default to binding the websocket server to a port Both DAs and bridge implementations SHOULD support at least connection to the recommended port range and MAY also support configuration for connection to an alternative bridging port or port range. -### Bridging Desktop Agents on Multiple Machines - -As the bridge binds its websocket on the loopback address (127.0.0.1) it cannot be connected to from another device. Hence, an instance of the standalone bridge may be run on each device and those instances exchange messages in order to implement the bridge cross-device. +#### Websockets and Multiple Machines -However, cross-machine routing is an internal concern of the Desktop Agent Bridge, with each Desktop Agent simply communicating with a bridge instance located on the same machine. The connection protocol between bridges themselves is implementation specific and beyond the scope of this standard. Further, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. However, methods of verifying the identity of user are currently beyond the scope of this Standard. +As the bridge binds its websocket on the loopback address (127.0.0.1) it cannot be connected to from another device. Hence, an instance of the standalone bridge may be run on each device and those instances exchange messages by other means in order to implement the bridge cross-device. ## Connection Protocol From 13f7f144f08cb987aa590a84aeabedbc29f295ad Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 2 May 2023 19:00:47 +0100 Subject: [PATCH 049/106] Feedback from review --- docs/api-bridging/spec.md | 6 ++--- website/data/features/bridging.mdx | 5 +++- website/sidebars.json | 40 +++++++++++++++--------------- website/src/css/customTheme.css | 12 ++++++++- website/src/pages/index.js | 4 +-- 5 files changed, 40 insertions(+), 27 deletions(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index f58ae17d4..2e020333b 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -18,9 +18,9 @@ Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, i --> -The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), facilitating cross-application workflows. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. +The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), enabling cross-application workflows and context sharing. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. This is achieved, without implementation changes or special handling in the apps, by providing a protocol and service for the Desktop Agents to interoperate with each other instead, allowing application interop to extend across the bridged agents, seamlessly. -In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. +In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. Whether a bridge is running for Desktop Agents to connect to, whether it requires the agents to authenticate etc., is in the hands of the user (and their local IT team). ## Bridging Desktop Agents @@ -153,7 +153,7 @@ sequenceDiagram participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: connect (step 1) + DA -->>+ DAB: connect (step 1) DAB ->>+ DA: hello (step 2) DA ->>+ DAB: handshake (steps 3-5) DAB ->>+ DA: connectedAgentsUpdate (step 6) diff --git a/website/data/features/bridging.mdx b/website/data/features/bridging.mdx index 243384e19..52db865b8 100644 --- a/website/data/features/bridging.mdx +++ b/website/data/features/bridging.mdx @@ -4,4 +4,7 @@
API Bridging
-(Experimental) Link to or more Desktop Agents together via a bridge to extend interop across them. \ No newline at end of file +Link 2 or more Desktop Agent APIs together via a 'bridge' to extend interop across them. + \ No newline at end of file diff --git a/website/sidebars.json b/website/sidebars.json index fbb7b3abd..f3ebf240a 100644 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -25,26 +25,6 @@ "api/ref/Errors" ] }, - { - "type": "category", - "label": "API Bridging Part", - "items": [ - "api-bridging/spec", - "api-bridging/ref/broadcast", - "api-bridging/ref/findIntent", - "api-bridging/ref/findIntentsByContext", - "api-bridging/ref/raiseIntent", - "api-bridging/ref/open", - "api-bridging/ref/findInstances", - "api-bridging/ref/getAppMetadata", - "api-bridging/ref/PrivateChannel.broadcast", - "api-bridging/ref/PrivateChannel.eventListenerAdded", - "api-bridging/ref/PrivateChannel.eventListenerRemoved", - "api-bridging/ref/PrivateChannel.onAddContextListener", - "api-bridging/ref/PrivateChannel.onDisconnect", - "api-bridging/ref/PrivateChannel.onUnsubscribe" - ] - }, { "type": "category", "label": "App Directory Part", @@ -96,6 +76,26 @@ "context/ref/TimeRange", "context/ref/Valuation" ] + }, + { + "type": "category", + "label": "API Bridging Part", + "items": [ + "api-bridging/spec", + "api-bridging/ref/broadcast", + "api-bridging/ref/findIntent", + "api-bridging/ref/findIntentsByContext", + "api-bridging/ref/raiseIntent", + "api-bridging/ref/open", + "api-bridging/ref/findInstances", + "api-bridging/ref/getAppMetadata", + "api-bridging/ref/PrivateChannel.broadcast", + "api-bridging/ref/PrivateChannel.eventListenerAdded", + "api-bridging/ref/PrivateChannel.eventListenerRemoved", + "api-bridging/ref/PrivateChannel.onAddContextListener", + "api-bridging/ref/PrivateChannel.onDisconnect", + "api-bridging/ref/PrivateChannel.onUnsubscribe" + ] } ] }, diff --git a/website/src/css/customTheme.css b/website/src/css/customTheme.css index 3d4452571..778915331 100644 --- a/website/src/css/customTheme.css +++ b/website/src/css/customTheme.css @@ -202,7 +202,7 @@ header.postHeader:empty + article h1 { } .blockContent { - margin: 40px 10px; + margin: 20px 10px; } .blockTitle { @@ -215,6 +215,16 @@ header.postHeader:empty + article h1 { margin: var(--ifm-heading-margin-top) 0 0 0; padding-bottom: var(--ifm-heading-margin-bottom); } +.blockSubLabel { + color: #0086bf; /* DO NOT CHANGE - THIS IS THE TITLE UNDER THE ICONS IN THE 3RD BLOCK - SHOULD STAY FINOS BLUE */ + text-align: center; + font-size: var(--ifm-font-size-base); + font-family: var(--ifm-heading-font-family); + font-weight: var(--ifm-heading-font-weight); + /* line-height: var(--ifm-heading-line-height); + margin: var(--ifm-heading-margin-top) 0 0 0; + padding-bottom: var(--ifm-heading-margin-bottom); */ +} .featureShowcaseSection .logos img { width: 200px; diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 1706f85d0..f17f6cadd 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -45,10 +45,10 @@ export default () => { , - , , , - + , + ]} /> From 763aed9651076a22e73d63b46ff71456884b1b89 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 2 May 2023 19:18:34 +0100 Subject: [PATCH 050/106] fixing a missing word in bridging spec --- docs/api-bridging/spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 2e020333b..44917f027 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -75,7 +75,7 @@ By using the Desktop Agent Bridging Connection and Messaging protocols, a bridge A Desktop Agent will implement "client" behavior by: -* Connecting to the bridge, providing authentication credentials and receiving an assigned named (for purposes) +* Connecting to the bridge, providing authentication credentials and receiving an assigned named (for routing purposes). * Forwarding requests to the bridge. * Awaiting response(s) from the bridge. * Receiving requests from the bridge. From 63d728bca0423638c9f01207f9229222f391c274 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 2 May 2023 19:36:21 +0100 Subject: [PATCH 051/106] Review comment: Clarifying expected behavior in raiseIntent message exchange --- docs/api-bridging/ref/raiseIntent.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/api-bridging/ref/raiseIntent.md b/docs/api-bridging/ref/raiseIntent.md index e44b88629..8deb03321 100644 --- a/docs/api-bridging/ref/raiseIntent.md +++ b/docs/api-bridging/ref/raiseIntent.md @@ -11,7 +11,9 @@ Desktop Agent bridging message exchange for a `raiseIntent` API call on the [`De [Message Exchange Type](../spec#individual-message-exchanges): **Request Multiple Response (single)** -For Desktop Agent Bridging, a `fdc3.raiseIntent` call MUST always pass a `app: AppIdentifier` argument to target the intent. If a target `app` is not passed, then the `findIntent` message exchange should be used to collect options for the local resolver to use (note that Desktop Agents MAY also support the deprecated `raiseIntent` signature that uses the app `name` field by using the `findIntent` message exchange to attempt to resolve the `name` to an `AppIdentifier`). Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. +For Desktop Agent Bridging, a `raiseIntent` message exchange MUST always pass a `app: AppIdentifier` argument to target the intent. Further, if no `instanceId` is set in the `AppIdentifier` in the message then it should be interpreted to mean *'spawn a new instance of the target application'*. A local API call would normally defer to a resolver UI or similar if there are multiple options for resolving a specified app id (existing instances + spawning a new one), whereas this message exchange assumes that resolution has already taken place on the source Desktop Agent and either a new instance or existing instance selected as the target. + +Hence, if a target [`AppIdentifier`](/api/ref/Types#appidentifier) is not passed in the original API call, then the `findIntent` message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. e.g. An application with appId `agentA-app1` makes the following API call: @@ -31,6 +33,12 @@ The same approach applies to `fdc3.raiseIntentForContext` calls, in that a `find ::: +:::tip + +Desktop Agents MAY support the deprecated `raiseIntent` signature that uses the app `name` field by using the `findIntent` message exchange to attempt to resolve the `name` to an `AppIdentifier`. + +::: + ## Message exchange :::note @@ -169,7 +177,7 @@ This is encoded and sent to the bridge (omitting the `getResult()` function) as: :::tip -When producing a response to a `raiseIntent` request, the instance of the receiving application MUST be initialized and an `instanceId` generated for it before the `IntentResolution` is generated so that it can include the `instanceId`. +When producing a response to a `raiseIntent` request, the instance of the receiving application MUST be initialized (if it does not already exist) and an `instanceId` generated for it before the `IntentResolution` is generated so that it can include the `instanceId`. ::: From c798b41c7054de805c8a0a44377f49061f3fa028 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 3 May 2023 14:14:51 +0100 Subject: [PATCH 052/106] Fixing minor syntax error in documentation example --- docs/api-bridging/spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-bridging/spec.md b/docs/api-bridging/spec.md index 44917f027..c7fa358e7 100644 --- a/docs/api-bridging/spec.md +++ b/docs/api-bridging/spec.md @@ -579,7 +579,7 @@ Further, a new `DesktopAgentIdentifier` type is introduced to handle cases where ```typescript /** @experimental Introduced in FDC3 2.1 and may be refined by further changes - * outside the normal FDC3 versioning policy. + * outside the normal FDC3 versioning policy. */ interface DesktopAgentIdentifier { /** Used in Desktop Agent Bridging to attribute or target a message to a * particular Desktop Agent. */ From c50bf90a6dc27fe21c1bef2d3f91b49fa20a953a Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 3 May 2023 22:49:57 +0100 Subject: [PATCH 053/106] Review comments: Shorthand change from API Bridging -> Agent Bridging --- .../ref/PrivateChannel.broadcast.md | 2 +- .../ref/PrivateChannel.eventListenerAdded.md | 2 +- .../PrivateChannel.eventListenerRemoved.md | 2 +- .../PrivateChannel.onAddContextListener.md | 2 +- .../ref/PrivateChannel.onDisconnect.md | 2 +- .../ref/PrivateChannel.onUnsubscribe.md | 2 +- .../ref/broadcast.md | 0 .../ref/findInstances.md | 0 .../ref/findIntent.md | 0 .../ref/findIntentsByContext.md | 0 .../ref/getAppMetadata.md | 0 .../ref/open.md | 0 .../ref/raiseIntent.md | 0 docs/{api-bridging => agent-bridging}/spec.md | 10 +++---- docs/api/ref/Errors.md | 2 +- docs/api/ref/Types.md | 2 +- docs/api/spec.md | 4 +-- docs/fdc3-glossary.md | 4 +-- website/data/features/bridging.mdx | 4 +-- website/sidebars.json | 30 +++++++++---------- 20 files changed, 34 insertions(+), 34 deletions(-) rename docs/{api-bridging => agent-bridging}/ref/PrivateChannel.broadcast.md (96%) rename docs/{api-bridging => agent-bridging}/ref/PrivateChannel.eventListenerAdded.md (95%) rename docs/{api-bridging => agent-bridging}/ref/PrivateChannel.eventListenerRemoved.md (95%) rename docs/{api-bridging => agent-bridging}/ref/PrivateChannel.onAddContextListener.md (95%) rename docs/{api-bridging => agent-bridging}/ref/PrivateChannel.onDisconnect.md (95%) rename docs/{api-bridging => agent-bridging}/ref/PrivateChannel.onUnsubscribe.md (95%) rename docs/{api-bridging => agent-bridging}/ref/broadcast.md (100%) rename docs/{api-bridging => agent-bridging}/ref/findInstances.md (100%) rename docs/{api-bridging => agent-bridging}/ref/findIntent.md (100%) rename docs/{api-bridging => agent-bridging}/ref/findIntentsByContext.md (100%) rename docs/{api-bridging => agent-bridging}/ref/getAppMetadata.md (100%) rename docs/{api-bridging => agent-bridging}/ref/open.md (100%) rename docs/{api-bridging => agent-bridging}/ref/raiseIntent.md (100%) rename docs/{api-bridging => agent-bridging}/spec.md (98%) diff --git a/docs/api-bridging/ref/PrivateChannel.broadcast.md b/docs/agent-bridging/ref/PrivateChannel.broadcast.md similarity index 96% rename from docs/api-bridging/ref/PrivateChannel.broadcast.md rename to docs/agent-bridging/ref/PrivateChannel.broadcast.md index 2ee439377..f51d74976 100644 --- a/docs/api-bridging/ref/PrivateChannel.broadcast.md +++ b/docs/agent-bridging/ref/PrivateChannel.broadcast.md @@ -12,7 +12,7 @@ Desktop Agent bridging message exchange for a `broadcast` API call on a [`Privat :::caution -Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the Agent Bridging overview](../spec#privatechannels) for more details. ::: diff --git a/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md similarity index 95% rename from docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md rename to docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md index 6cc203a4c..820134e2a 100644 --- a/docs/api-bridging/ref/PrivateChannel.eventListenerAdded.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md @@ -14,7 +14,7 @@ Desktop Agent bridging message exchange for the addition of an event handler to :::caution -Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the Agent Bridging overview](../spec#privatechannels) for more details. ::: diff --git a/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md similarity index 95% rename from docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md rename to docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md index 3f6add8c9..feea08ec8 100644 --- a/docs/api-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -17,7 +17,7 @@ Desktop Agent bridging message exchange for the removal of an event handler from :::caution -Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the Agent Bridging overview](../spec#privatechannels) for more details. ::: diff --git a/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md similarity index 95% rename from docs/api-bridging/ref/PrivateChannel.onAddContextListener.md rename to docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md index f240c4bb8..b00dfec65 100644 --- a/docs/api-bridging/ref/PrivateChannel.onAddContextListener.md +++ b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md @@ -12,7 +12,7 @@ Desktop Agent bridging message exchange for the addition of a [`ContextHandler`] :::caution -Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the Agent Bridging overview](../spec#privatechannels) for more details. ::: diff --git a/docs/api-bridging/ref/PrivateChannel.onDisconnect.md b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md similarity index 95% rename from docs/api-bridging/ref/PrivateChannel.onDisconnect.md rename to docs/agent-bridging/ref/PrivateChannel.onDisconnect.md index 756727d76..b68ff82a0 100644 --- a/docs/api-bridging/ref/PrivateChannel.onDisconnect.md +++ b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md @@ -12,7 +12,7 @@ Desktop Agent bridging message exchange for a `disconnect()` API call on [`Priv :::caution -Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the Agent Bridging overview](../spec#privatechannels) for more details. ::: diff --git a/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md similarity index 95% rename from docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md rename to docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md index 35d1c9e28..4a96486cd 100644 --- a/docs/api-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -15,7 +15,7 @@ Desktop Agent bridging message exchange for the removal of a [`ContextHandler`]( :::caution -Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the API Bridging overview](../spec#privatechannels) for more details. +Some additional tracking of PrivateChannel metadata is required on the Desktop Agent that created each PrivateChannel and on any Desktop Agent interacting with it, in order to use these message exchanges. Please see the [relevant section of the Agent Bridging overview](../spec#privatechannels) for more details. ::: diff --git a/docs/api-bridging/ref/broadcast.md b/docs/agent-bridging/ref/broadcast.md similarity index 100% rename from docs/api-bridging/ref/broadcast.md rename to docs/agent-bridging/ref/broadcast.md diff --git a/docs/api-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md similarity index 100% rename from docs/api-bridging/ref/findInstances.md rename to docs/agent-bridging/ref/findInstances.md diff --git a/docs/api-bridging/ref/findIntent.md b/docs/agent-bridging/ref/findIntent.md similarity index 100% rename from docs/api-bridging/ref/findIntent.md rename to docs/agent-bridging/ref/findIntent.md diff --git a/docs/api-bridging/ref/findIntentsByContext.md b/docs/agent-bridging/ref/findIntentsByContext.md similarity index 100% rename from docs/api-bridging/ref/findIntentsByContext.md rename to docs/agent-bridging/ref/findIntentsByContext.md diff --git a/docs/api-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md similarity index 100% rename from docs/api-bridging/ref/getAppMetadata.md rename to docs/agent-bridging/ref/getAppMetadata.md diff --git a/docs/api-bridging/ref/open.md b/docs/agent-bridging/ref/open.md similarity index 100% rename from docs/api-bridging/ref/open.md rename to docs/agent-bridging/ref/open.md diff --git a/docs/api-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md similarity index 100% rename from docs/api-bridging/ref/raiseIntent.md rename to docs/agent-bridging/ref/raiseIntent.md diff --git a/docs/api-bridging/spec.md b/docs/agent-bridging/spec.md similarity index 98% rename from docs/api-bridging/spec.md rename to docs/agent-bridging/spec.md index c7fa358e7..295eb0c51 100644 --- a/docs/api-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -1,7 +1,7 @@ --- id: spec sidebar_label: Overview -title: API Bridging Overview (next) +title: Agent Bridging Overview (next) --- :::info _[@experimental](../fdc3-compliance#experimental-features)_ @@ -13,7 +13,7 @@ Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, i @@ -34,13 +34,13 @@ Detail on each of these components is defined in the following sections. :::info -Although this specification defines a particular [connection](#connection) type (based on websockets), it has been divided into parts so that the protocol definitions might be reused to implement a bridge over an alternative connection. +Although this specification defines a particular [connection](#connection) type (based on a websocket server), it has been divided into parts so that the protocol definitions might be reused to implement a bridge over an alternative connection. ::: -### API Bridging Compliance +### Agent Bridging Compliance -API Bridging is introduced in FDC3 2.1 as an [@experimental](../fdc3-compliance#experimental-features) feature of the FDC3 Standard, included to enable implementation by and feedback from the FDC3 community. As such, it is currently optional for the purposes of compliance and is exempted from the normal versioning and deprecation polices in order to facilitate any refinement needed. +Agent Bridging is introduced in FDC3 2.1 as an [@experimental](../fdc3-compliance#experimental-features) feature of the FDC3 Standard, included to enable implementation by and feedback from the FDC3 community. As such, it is currently optional for the purposes of compliance and is exempted from the normal versioning and deprecation polices in order to facilitate any refinement needed. ## Connection diff --git a/docs/api/ref/Errors.md b/docs/api/ref/Errors.md index 3d78ccda9..253c44b4d 100644 --- a/docs/api/ref/Errors.md +++ b/docs/api/ref/Errors.md @@ -173,4 +173,4 @@ Contains constants representing the errors that can be encountered when queries **See also:** -* [API Bridging - Workflows broken by disconnects](../../api-bridging/spec##workflows-broken-by-disconnects) \ No newline at end of file +* [Agent Bridging - Workflows broken by disconnects](../../agent-bridging/spec##workflows-broken-by-disconnects) \ No newline at end of file diff --git a/docs/api/ref/Types.md b/docs/api/ref/Types.md index 34c8ca8a3..b5dece235 100644 --- a/docs/api/ref/Types.md +++ b/docs/api/ref/Types.md @@ -101,7 +101,7 @@ interface DesktopAgentIdentifier { **See also:** -* [API Bridging - Identifying Desktop Agents Identity and Message Sources](../../api-bridging/spec#identifying-desktop-agents-identity-and-message-sources) +* [Agent Bridging - Identifying Desktop Agents Identity and Message Sources](../../agent-bridging/spec#identifying-desktop-agents-identity-and-message-sources) ## `IntentHandler` diff --git a/docs/api/spec.md b/docs/api/spec.md index ffc82685e..33a4e890e 100644 --- a/docs/api/spec.md +++ b/docs/api/spec.md @@ -84,9 +84,9 @@ Are all areas of functionality that any feature-complete desktop agent would imp ### Inter-Agent Communication -A goal of the FDC3 Standard is that applications running in different Desktop Agent contexts on the same desktop, or operated by the same user, would be able to interoperate and that one Desktop Agent context would be able to discover and launch an application in another Desktop Application context. As Desktop Agent interop is supported by common standards for APIs an App in one Desktop Agent context would not need to know a different syntax to launch or interact with an App in another Desktop Agent context. +A goal of the FDC3 Standard is that applications running in different Desktop Agent contexts on the same desktop, or operated by the same user, would be able to interoperate and that one Desktop Agent context would be able to discover and launch an application in another Desktop Application context. As Desktop Agent interop is supported by common standards for APIs an app in one Desktop Agent context would not need to know a different syntax to launch or interact with an app in another Desktop Agent context. -Inter-agent communication at the API layer may be achieved via the [Desktop Agent Bridging Part of the FDC3 Standard](../api-bridging/spec) *([Experimental](../fdc3-compliance#experimental-features))*, which defines an independent service that Desktop Agents may connect to, and a protocol for the exchange of messages relating to FDC3 API calls. Hence, by implementing support for Desktop Agent Bridging, a platform may extend interop across applications running in multiple Desktop Agent contexts. +Inter-agent communication at the API layer may be achieved via the [Desktop Agent Bridging Part of the FDC3 Standard](../agent-bridging/spec) *([Experimental](../fdc3-compliance#experimental-features))*, which defines an independent service that Desktop Agents may connect to, and a protocol for the exchange of messages relating to FDC3 API calls. Hence, by implementing support for Desktop Agent Bridging, a platform may extend interop across applications running in multiple Desktop Agent contexts. Desktop Agent Bridging provides message exchanges and a workflow for performing intent resolution across multiple agents. Hence, app discovery is supported across the agents connected to the bridge for intent-based workflows. Further, as channels are also supported by bridging, context sharing also works across multiple agents. diff --git a/docs/fdc3-glossary.md b/docs/fdc3-glossary.md index 2840974fa..6fa5a970c 100644 --- a/docs/fdc3-glossary.md +++ b/docs/fdc3-glossary.md @@ -6,7 +6,7 @@ sidebar_label: Glossary For the purposes of this Standard, the following definitions apply. Other terms are defined when first used, at which place they appear in bold and italic type. Terms explicitly defined in this Standard are not to be presumed to refer implicitly to similar terms defined elsewhere. Terms not defined are assumed to be well-known in the financial services or software industries. -- **API Bridge**: Shorthand for Desktop Agent Bridge. +- **Agent Bridge**: Shorthand for Desktop Agent Bridge. - **app**: Shorthand for application. - **app directory**: A repository of application metadata supporting discovery, for example via name or intent, and retrieval of metadata necessary to launch an application. - **app directory record**: Metadata relating to a single application, encoded in JSON. @@ -19,7 +19,7 @@ For the purposes of this Standard, the following definitions apply. Other terms - **Application Provider**: A downstream consumer of FDC3 Standards that can understand and use the FDC3 API (supplied by a Platform Provider), context data, and/or intents. - **application-specific intent**: A custom intent defined by an application or applications, independent of the Standard. - **Bridge**: Shorthand for Desktop Agent Bridge. -- **bridging**: Shorthand for the exchange of messages across a Desktop Agent API Bridge for the purposes of extending interop between apps managed by different Desktop Agents. +- **bridging**: Shorthand for the exchange of messages across a Desktop Agent Bridge for the purposes of extending interop between apps managed by different Desktop Agents. - **Channel**: A grouping of apps for the purposes of sharing stateful pieces of data. A secondary interface of the FDC3 API. - **context channels**: A mechanism to allow sets of apps to share stateful pieces of data among themselves, and to be alerted when that data changes. - **context**: Shorthand for context data. diff --git a/website/data/features/bridging.mdx b/website/data/features/bridging.mdx index 52db865b8..ffe1e814b 100644 --- a/website/data/features/bridging.mdx +++ b/website/data/features/bridging.mdx @@ -1,7 +1,7 @@ - +
-
API Bridging
+
Agent Bridging
Link 2 or more Desktop Agent APIs together via a 'bridge' to extend interop across them. diff --git a/website/sidebars.json b/website/sidebars.json index f3ebf240a..6f4ae88af 100644 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -79,22 +79,22 @@ }, { "type": "category", - "label": "API Bridging Part", + "label": "Agent Bridging Part", "items": [ - "api-bridging/spec", - "api-bridging/ref/broadcast", - "api-bridging/ref/findIntent", - "api-bridging/ref/findIntentsByContext", - "api-bridging/ref/raiseIntent", - "api-bridging/ref/open", - "api-bridging/ref/findInstances", - "api-bridging/ref/getAppMetadata", - "api-bridging/ref/PrivateChannel.broadcast", - "api-bridging/ref/PrivateChannel.eventListenerAdded", - "api-bridging/ref/PrivateChannel.eventListenerRemoved", - "api-bridging/ref/PrivateChannel.onAddContextListener", - "api-bridging/ref/PrivateChannel.onDisconnect", - "api-bridging/ref/PrivateChannel.onUnsubscribe" + "agent-bridging/spec", + "agent-bridging/ref/broadcast", + "agent-bridging/ref/findIntent", + "agent-bridging/ref/findIntentsByContext", + "agent-bridging/ref/raiseIntent", + "agent-bridging/ref/open", + "agent-bridging/ref/findInstances", + "agent-bridging/ref/getAppMetadata", + "agent-bridging/ref/PrivateChannel.broadcast", + "agent-bridging/ref/PrivateChannel.eventListenerAdded", + "agent-bridging/ref/PrivateChannel.eventListenerRemoved", + "agent-bridging/ref/PrivateChannel.onAddContextListener", + "agent-bridging/ref/PrivateChannel.onDisconnect", + "agent-bridging/ref/PrivateChannel.onUnsubscribe" ] } ] From 127c059829dfb3be75bf845a875609d8fafc73f4 Mon Sep 17 00:00:00 2001 From: Kris West Date: Thu, 4 May 2023 09:43:18 +0100 Subject: [PATCH 054/106] Improve structure of raiseIntent ref page --- docs/agent-bridging/ref/raiseIntent.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index 8deb03321..127f77e60 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -11,9 +11,15 @@ Desktop Agent bridging message exchange for a `raiseIntent` API call on the [`De [Message Exchange Type](../spec#individual-message-exchanges): **Request Multiple Response (single)** -For Desktop Agent Bridging, a `raiseIntent` message exchange MUST always pass a `app: AppIdentifier` argument to target the intent. Further, if no `instanceId` is set in the `AppIdentifier` in the message then it should be interpreted to mean *'spawn a new instance of the target application'*. A local API call would normally defer to a resolver UI or similar if there are multiple options for resolving a specified app id (existing instances + spawning a new one), whereas this message exchange assumes that resolution has already taken place on the source Desktop Agent and either a new instance or existing instance selected as the target. +For Desktop Agent Bridging, a `raiseIntent` message exchange MUST always pass an `app: AppIdentifier` argument to target the intent. Further, if no `instanceId` is set in the `AppIdentifier`, then it should be interpreted to mean *'spawn a new instance of the target application'*. A local FDC3 API implementation call would normally defer to a resolver UI or similar if there are multiple options for resolving a specified `appId` (i.e. existing instance(s) and the option spawning a new instance), whereas this message exchange assumes that resolution has already taken place on the source Desktop Agent. -Hence, if a target [`AppIdentifier`](/api/ref/Types#appidentifier) is not passed in the original API call, then the `findIntent` message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. +Hence, if a target [`AppIdentifier`](/api/ref/Types#appidentifier) is not passed in the original `DesktopAgent` API call, then the [`findIntent`](findIntent) message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. + +:::info + +The same approach applies to `fdc3.raiseIntentForContext` calls, in that a [`findIntentByContext`](findIntentsByContext) message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange is then used (if a remote option was selected as the resolution) to raise the intent. + +::: e.g. An application with appId `agentA-app1` makes the following API call: @@ -27,11 +33,7 @@ Agent A should then conduct the `findIntent` message exchange as described above let appIntent = await fdc3.raiseIntent("StartChat", context, {"appId": "Slack", "desktopAgent": "agent-B"}); ``` -:::info - -The same approach applies to `fdc3.raiseIntentForContext` calls, in that a `findIntentByContext` message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange is then used (if a remote option was selected as the resolution) to raise the intent. - -::: +In the event that an agent referred to in the API call is not connected to the bridge, it is connected but times out or returns an error, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources` in the `raiseIntentResponse` and the appropriate error (which might include any error from the [`ResolveError`](../../api/ref/Errors#resolveerror) enumeration, [`BridgingError.ResponseTimedOut`](../../api/ref/Errors#bridgingerror) or [`BridgingError.AgentDisconnected`](../../api/ref/Errors#bridgingerror)) should be added to `meta.errorDetails`. :::tip @@ -39,6 +41,8 @@ Desktop Agents MAY support the deprecated `raiseIntent` signature that uses the ::: + + ## Message exchange :::note @@ -280,9 +284,3 @@ If the `IntentHandler` returned `void` rather than an intent result `payload` sh } } ``` - -:::note - -In the event that an agent referred to in the API call is not connected to the bridge, it is connected but times out or returns an error, its `DesktopAgentIdentifier` should be added to the `meta.errorSources` element instead of `meta.sources` in the `raiseIntentResponse` and the appropriate error (which might include any error from the [`ResolveError`](../../api/ref/Errors#resolveerror) enumeration, [`BridgingError.ResponseTimedOut`](../../api/ref/Errors#bridgingerror) or [`BridgingError.AgentDisconnected`](../../api/ref/Errors#bridgingerror)) should be added to `meta.errorDetails`. - -::: From 86a73747fff699ea094fd612b6806a788b355b11 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 15 May 2023 12:31:41 +0100 Subject: [PATCH 055/106] npm audit fix (yanl vulnerability) --- package-lock.json | 4242 ++++++++++++--------------------------------- 1 file changed, 1067 insertions(+), 3175 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf42b96fa..368ed049f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1048,22 +1048,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", @@ -1840,254 +1824,292 @@ } }, "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz", + "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==", "dev": true, - "peer": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", + "@jest/console": "^25.5.0", + "@jest/reporters": "^25.5.1", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", + "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^25.5.0", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-resolve-dependencies": "^25.5.4", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "jest-watcher": "^25.5.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^2.0.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">= 8.3" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": ">=8" } }, "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", "dev": true, - "peer": true, "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "lolex": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", + "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz", + "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==", "dev": true, - "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", + "@jest/console": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^25.5.1", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "slash": "^3.0.0", "source-map": "^0.6.0", - "string-length": "^4.0.1", + "string-length": "^3.1.0", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "v8-to-istanbul": "^4.1.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "optionalDependencies": { + "node-notifier": "^6.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": ">=8" } }, "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", "dev": true, - "peer": true, "dependencies": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, - "peer": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", "dev": true, - "peer": true, "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "@jest/test-result": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, - "peer": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", + "@jest/types": "^25.5.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.5.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, - "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { @@ -2355,26 +2377,6 @@ "type-detect": "4.0.8" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "peer": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -2477,12 +2479,12 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, - "peer": true, "dependencies": { + "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, @@ -2496,118 +2498,17 @@ "pretty-format": "^25.2.1" } }, - "node_modules/@types/jest/node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true }, - "node_modules/@types/jest/node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/jest/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@types/jest/node_modules/diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@types/jest/node_modules/jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@types/jest/node_modules/jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/node": { "version": "18.15.13", @@ -2628,11 +2529,10 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true, - "peer": true + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true }, "node_modules/@types/resolve": { "version": "1.17.1", @@ -2644,11 +2544,10 @@ } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true, - "peer": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true }, "node_modules/@types/urijs": { "version": "1.19.19", @@ -2657,11 +2556,10 @@ "dev": true }, "node_modules/@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "version": "15.0.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", + "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", "dev": true, - "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -2840,22 +2738,20 @@ } }, "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, - "peer": true, "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" } }, "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2873,28 +2769,14 @@ } }, "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true, - "peer": true, "engines": { "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3270,26 +3152,38 @@ } }, "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" }, "peerDependencies": { - "@babel/core": "^7.8.0" + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/babel-plugin-annotate-pure-calls": { @@ -3326,20 +3220,34 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", "dev": true, - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/babel-plugin-macros": { @@ -3434,11 +3342,10 @@ "dev": true }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", "dev": true, - "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -3450,25 +3357,23 @@ "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", "dev": true, - "peer": true, "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" + "babel-plugin-jest-hoist": "^25.5.0", + "babel-preset-current-node-syntax": "^0.1.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -3799,16 +3704,6 @@ "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3821,13 +3716,6 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true, - "peer": true - }, "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -3960,33 +3848,28 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^6.2.0" } }, "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/clone": { @@ -4269,18 +4152,14 @@ } }, "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, - "peer": true, "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, "node_modules/debug": { @@ -4309,13 +4188,6 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "peer": true - }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -4325,13 +4197,6 @@ "node": ">=0.10" } }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true, - "peer": true - }, "node_modules/deep-equal": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", @@ -4444,13 +4309,12 @@ } }, "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "dev": true, - "peer": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/doctrine": { @@ -4466,26 +4330,12 @@ } }, "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, - "peer": true, "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "webidl-conversions": "^4.0.2" } }, "node_modules/ecc-jsbn": { @@ -4504,19 +4354,6 @@ "integrity": "sha512-e2aeCAixCj9M7nJxdB/wDjO6mbYX+lJJxSJCXDzlr5YPGYVofuJwGN9nKg2o6wWInjX6XmxRinn3AeJMK81ltw==", "dev": true }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -4680,14 +4517,13 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, - "peer": true, "dependencies": { "esprima": "^4.0.1", - "estraverse": "^5.2.0", + "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, @@ -4696,12 +4532,21 @@ "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=6.0" + "node": ">=4.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", @@ -5385,27 +5230,24 @@ "dev": true }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", "dev": true, - "peer": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": "^8.12.0 || >=9.7.0" } }, "node_modules/exit": { @@ -5555,19 +5397,20 @@ "dev": true }, "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "@jest/types": "^25.5.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-regex-util": "^25.2.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/extend": { @@ -5874,18 +5717,17 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 6" + "node": ">= 0.12" } }, "node_modules/fragment-cache": { @@ -5930,6 +5772,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6020,13 +5876,15 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, - "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6342,16 +6200,12 @@ "dev": true }, "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, - "peer": true, "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" + "whatwg-encoding": "^1.0.1" } }, "node_modules/html-escaper": { @@ -6360,21 +6214,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "peer": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -6390,28 +6229,13 @@ "npm": ">=1.3.7" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, - "peer": true, "engines": { - "node": ">=10.17.0" + "node": ">=8.12.0" } }, "node_modules/humanize-duration": { @@ -6917,13 +6741,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "peer": true - }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -7136,15 +6953,14 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", + "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" }, "engines": { @@ -7199,384 +7015,382 @@ "dev": true }, "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.4.tgz", + "integrity": "sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/core": "^27.5.1", + "@jest/core": "^25.5.4", "import-local": "^3.0.2", - "jest-cli": "^27.5.1" + "jest-cli": "^25.5.4" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">= 8.3" } }, "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", + "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "@jest/types": "^25.5.0", + "execa": "^3.2.0", + "throat": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", + "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==", "dev": true, - "peer": true, "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", + "@jest/core": "^25.5.4", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", + "is-ci": "^2.0.0", + "jest-config": "^25.5.4", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "prompts": "^2.0.1", - "yargs": "^16.2.0" + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">= 8.3" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": ">=8" } }, "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", + "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", "dev": true, - "peer": true, "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.5.4", + "@jest/types": "^25.5.0", + "babel-jest": "^25.5.1", + "chalk": "^3.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^25.5.0", + "jest-environment-node": "^25.5.0", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.5.4", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.5.0", + "realpath-native": "^2.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } + "node": ">= 8.3" } }, - "node_modules/jest-config/node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "node_modules/jest-config/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=8" } }, "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", "dev": true, - "peer": true, "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "node_modules/jest-diff/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "peer": true, "dependencies": { - "detect-newline": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "node_modules/jest-docblock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", + "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "detect-newline": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "node_modules/jest-each": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", + "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "node_modules/jest-each/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "node_modules/jest-environment-jsdom": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", + "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", "dev": true, - "peer": true, + "dependencies": { + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "jsdom": "^15.2.1" + }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dev": true, - "peer": true, + "node_modules/jest-environment-node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", + "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-haste-map": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", + "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^25.5.0", "@types/graceful-fs": "^4.1.2", - "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" }, "optionalDependencies": { - "fsevents": "^2.3.2" + "fsevents": "^2.1.2" } }, "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", + "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.5.0", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^27.5.1", + "expect": "^25.5.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" + "jest-each": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", + "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", "dev": true, - "peer": true, "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", "dev": true, - "peer": true, "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, - "peer": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^1.0.1" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" + "@jest/types": "^25.5.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/jest-mock-extended": { @@ -7610,364 +7424,255 @@ } }, "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true, - "peer": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", + "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "@jest/types": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.5.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "node_modules/jest-resolve/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "peer": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "node_modules/jest-runner": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", + "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", + "dev": true, + "dependencies": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-docblock": "^25.3.0", + "jest-haste-map": "^25.5.1", + "jest-jasmine2": "^25.5.4", + "jest-leak-detector": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "jest-runtime": "^25.5.4", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "node_modules/jest-runner/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "peer": true, "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "node_modules/jest-runtime": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", + "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", "dev": true, - "peer": true, "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/globals": "^25.5.2", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 8.3" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/jest-runtime/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "peer": true, "dependencies": { - "yallist": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "node_modules/jest-serializer": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", "dev": true, - "peer": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "graceful-fs": "^4.2.4" }, "engines": { - "node": ">=10" + "node": ">= 8.3" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/jest-snapshot": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", + "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "@babel/types": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^25.5.0", + "semver": "^6.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "peer": true, - "engines": { - "node": ">=8" + "node": ">= 8.3" } }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "peer": true, "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.5.0.tgz", - "integrity": "sha512-4r36w9vU8+rdg48hj0Z7TvcSqVP6Ao8dk04grlHQNgduyCB0SqrI0xWIl85ZhXrzYvxQ0N5H+rRLAejkQzEHeQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-regex-util": "^25.2.1", - "jest-watcher": "^25.2.4", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^6.0.0" + "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "node_modules/jest-util": { "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", - "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "dependencies": { "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-message-util": "^25.5.0", - "jest-util": "^25.5.0", - "slash": "^3.0.0" + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" }, "engines": { "node": ">= 8.3" } }, - "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", - "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", + "node_modules/jest-util/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { - "@jest/console": "^25.5.0", - "@jest/types": "^25.5.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8.3" + "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "node_modules/jest-validate": { "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "@jest/types": "^25.5.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.5.0" }, "engines": { "node": ">= 8.3" } }, - "node_modules/jest-watch-typeahead/node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { + "node_modules/jest-validate/node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", @@ -7980,51 +7685,35 @@ "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", - "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "node_modules/jest-watch-typeahead": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.5.0.tgz", + "integrity": "sha512-4r36w9vU8+rdg48hj0Z7TvcSqVP6Ao8dk04grlHQNgduyCB0SqrI0xWIl85ZhXrzYvxQ0N5H+rRLAejkQzEHeQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.5.0", - "@types/stack-utils": "^1.0.1", + "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", + "jest-regex-util": "^25.2.1", + "jest-watcher": "^25.2.4", "slash": "^3.0.0", - "stack-utils": "^1.0.1" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", - "dev": true, - "engines": { - "node": ">= 8.3" + "string-length": "^3.1.0", + "strip-ansi": "^6.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", - "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "make-dir": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8.3" + "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "node_modules/jest-watcher": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", @@ -8041,119 +7730,58 @@ "node": ">= 8.3" } }, - "node_modules/jest-watch-typeahead/node_modules/stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "node_modules/jest-watcher/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { - "escape-string-regexp": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "node_modules/jest-worker": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "dependencies": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">= 8.3" } }, - "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/jpjs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jpjs/-/jpjs-1.2.1.tgz", + "integrity": "sha512-GxJWybWU4NV0RNKi6EIqk6IRPOTqd/h+U7sbtyuD7yUISUzV78LdHnq2xkevJsTlz/EImux4sWj+wfMiwKLkiw==", + "dev": true + }, + "node_modules/js-base64": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", + "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jpjs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jpjs/-/jpjs-1.2.1.tgz", - "integrity": "sha512-GxJWybWU4NV0RNKi6EIqk6IRPOTqd/h+U7sbtyuD7yUISUzV78LdHnq2xkevJsTlz/EImux4sWj+wfMiwKLkiw==", - "dev": true - }, - "node_modules/js-base64": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", - "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -8166,42 +7794,40 @@ "dev": true }, "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "peer": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", "xml-name-validator": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" }, "peerDependencies": { "canvas": "^2.5.0" @@ -8212,6 +7838,18 @@ } } }, + "node_modules/jsdom/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -8899,71 +8537,32 @@ "dev": true }, "node_modules/node-notifier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", - "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, "optional": true, - "peer": true, "dependencies": { "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "which": "^1.3.1" } }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "node_modules/node-notifier/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "optional": true, - "peer": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "peer": true, "bin": { - "uuid": "dist/bin/uuid" + "which": "bin/which" } }, - "node_modules/node-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", @@ -9365,12 +8964,12 @@ } }, "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/p-limit": { @@ -9446,11 +9045,10 @@ } }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "peer": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true }, "node_modules/pascal-case": { "version": "3.1.2", @@ -9692,31 +9290,18 @@ } }, "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 8.3" } }, "node_modules/process": { @@ -9853,12 +9438,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -9893,13 +9472,6 @@ "node": ">=0.6" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "peer": true - }, "node_modules/quicktype": { "version": "23.0.19", "resolved": "https://registry.npmjs.org/quicktype/-/quicktype-23.0.19.tgz", @@ -9954,9 +9526,9 @@ } }, "node_modules/quicktype-core/node_modules/yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "dev": true, "engines": { "node": ">= 14" @@ -9994,11 +9566,10 @@ } }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "peer": true + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true }, "node_modules/read-pkg": { "version": "5.2.0", @@ -10301,20 +9872,6 @@ "node": ">=0.8" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/request/node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -10343,13 +9900,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "peer": true - }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -10404,16 +9954,6 @@ "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -10968,6 +10508,15 @@ "node": ">=4" } }, + "node_modules/sane/node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/sane/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -11033,16 +10582,15 @@ } }, "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "dev": true, - "peer": true, "dependencies": { - "xmlchars": "^2.2.0" + "xmlchars": "^2.1.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/semver": { @@ -11584,16 +11132,15 @@ } }, "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", "dev": true, - "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/static-extend": { @@ -11747,17 +11294,37 @@ } }, "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, - "peer": true, "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/string-to-stream": { @@ -12119,11 +11686,10 @@ "dev": true }, "node_modules/throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "dev": true, - "peer": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true }, "node_modules/through": { "version": "2.3.8", @@ -12226,32 +11792,26 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, - "peer": true, "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { "node": ">=6" } }, "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, - "peer": true, "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" + "punycode": "^2.1.0" } }, "node_modules/ts-essentials": { @@ -12402,1614 +11962,82 @@ "rollup": "^1.32.1", "rollup-plugin-sourcemaps": "^0.6.2", "rollup-plugin-terser": "^5.1.2", - "rollup-plugin-typescript2": "^0.27.3", - "sade": "^1.4.2", - "semver": "^7.1.1", - "shelljs": "^0.8.3", - "tiny-glob": "^0.2.6", - "ts-jest": "^25.3.1", - "tslib": "^1.9.3", - "typescript": "^3.7.3" - }, - "bin": { - "tsdx": "dist/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tsdx/node_modules/@jest/console": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", - "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "jest-message-util": "^25.5.0", - "jest-util": "^25.5.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/console/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/@jest/core": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz", - "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==", - "dev": true, - "dependencies": { - "@jest/console": "^25.5.0", - "@jest/reporters": "^25.5.1", - "@jest/test-result": "^25.5.0", - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^25.5.0", - "jest-config": "^25.5.4", - "jest-haste-map": "^25.5.1", - "jest-message-util": "^25.5.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.5.1", - "jest-resolve-dependencies": "^25.5.4", - "jest-runner": "^25.5.4", - "jest-runtime": "^25.5.4", - "jest-snapshot": "^25.5.1", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", - "jest-watcher": "^25.5.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^2.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/core/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/@jest/environment": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", - "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^25.5.0", - "@jest/types": "^25.5.0", - "jest-mock": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/fake-timers": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", - "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-util": "^25.5.0", - "lolex": "^5.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/globals": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", - "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", - "dev": true, - "dependencies": { - "@jest/environment": "^25.5.0", - "@jest/types": "^25.5.0", - "expect": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/reporters": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz", - "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^25.5.1", - "jest-resolve": "^25.5.1", - "jest-util": "^25.5.0", - "jest-worker": "^25.5.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.1.3" - }, - "engines": { - "node": ">= 8.3" - }, - "optionalDependencies": { - "node-notifier": "^6.0.0" - } - }, - "node_modules/tsdx/node_modules/@jest/reporters/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/@jest/source-map": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", - "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/test-result": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", - "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", - "dev": true, - "dependencies": { - "@jest/console": "^25.5.0", - "@jest/types": "^25.5.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/test-sequencer": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", - "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", - "dev": true, - "dependencies": { - "@jest/test-result": "^25.5.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^25.5.1", - "jest-runner": "^25.5.4", - "jest-runtime": "^25.5.4" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/transform": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", - "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.5.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^25.5.1", - "jest-regex-util": "^25.2.6", - "jest-util": "^25.5.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^2.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/transform/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/@jest/types/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/tsdx/node_modules/@types/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", - "dev": true - }, - "node_modules/tsdx/node_modules/@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "node_modules/tsdx/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/tsdx/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tsdx/node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "node_modules/tsdx/node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tsdx/node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tsdx/node_modules/babel-jest": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", - "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", - "dev": true, - "dependencies": { - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.5.0", - "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/tsdx/node_modules/babel-jest/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/babel-plugin-jest-hoist": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", - "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/babel-preset-current-node-syntax": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", - "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/tsdx/node_modules/babel-preset-jest": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", - "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^25.5.0", - "babel-preset-current-node-syntax": "^0.1.2" - }, - "engines": { - "node": ">= 8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/tsdx/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tsdx/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/tsdx/node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "node_modules/tsdx/node_modules/diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "dependencies": { - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/tsdx/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/tsdx/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/tsdx/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/tsdx/node_modules/expect": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", - "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-regex-util": "^25.2.6" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tsdx/node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.1" - } - }, - "node_modules/tsdx/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/tsdx/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/tsdx/node_modules/jest": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.4.tgz", - "integrity": "sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==", - "dev": true, - "dependencies": { - "@jest/core": "^25.5.4", - "import-local": "^3.0.2", - "jest-cli": "^25.5.4" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-changed-files": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", - "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-changed-files/node_modules/execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": "^8.12.0 || >=9.7.0" - } - }, - "node_modules/tsdx/node_modules/jest-cli": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", - "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==", - "dev": true, - "dependencies": { - "@jest/core": "^25.5.4", - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.5.4", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", - "prompts": "^2.0.1", - "realpath-native": "^2.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-cli/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-config": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", - "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.5.4", - "@jest/types": "^25.5.0", - "babel-jest": "^25.5.1", - "chalk": "^3.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^25.5.0", - "jest-environment-node": "^25.5.0", - "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.5.4", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.5.1", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.5.0", - "realpath-native": "^2.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-config/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-diff/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-docblock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", - "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-each": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", - "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", - "jest-util": "^25.5.0", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-each/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-environment-jsdom": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", - "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", - "dev": true, - "dependencies": { - "@jest/environment": "^25.5.0", - "@jest/fake-timers": "^25.5.0", - "@jest/types": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-util": "^25.5.0", - "jsdom": "^15.2.1" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-environment-node": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", - "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", - "dev": true, - "dependencies": { - "@jest/environment": "^25.5.0", - "@jest/fake-timers": "^25.5.0", - "@jest/types": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-util": "^25.5.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-environment-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/tsdx/node_modules/jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-haste-map": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", - "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "@types/graceful-fs": "^4.1.2", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-serializer": "^25.5.0", - "jest-util": "^25.5.0", - "jest-worker": "^25.5.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 8.3" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/tsdx/node_modules/jest-jasmine2": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", - "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.5.0", - "@jest/source-map": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.5.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.5.0", - "jest-matcher-utils": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-runtime": "^25.5.4", - "jest-snapshot": "^25.5.1", - "jest-util": "^25.5.0", - "pretty-format": "^25.5.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-jasmine2/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-leak-detector": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", - "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", - "dev": true, - "dependencies": { - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-matcher-utils": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", - "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "jest-diff": "^25.5.0", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-message-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", - "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.5.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-message-util/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-mock": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", - "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-regex-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-resolve": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", - "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.1", - "read-pkg-up": "^7.0.1", - "realpath-native": "^2.0.0", - "resolve": "^1.17.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-resolve-dependencies": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", - "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.5.1" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-resolve/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-runner": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", - "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", - "dev": true, - "dependencies": { - "@jest/console": "^25.5.0", - "@jest/environment": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^25.5.4", - "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.5.1", - "jest-jasmine2": "^25.5.4", - "jest-leak-detector": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-resolve": "^25.5.1", - "jest-runtime": "^25.5.4", - "jest-util": "^25.5.0", - "jest-worker": "^25.5.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-runner/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-runtime": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", - "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", - "dev": true, - "dependencies": { - "@jest/console": "^25.5.0", - "@jest/environment": "^25.5.0", - "@jest/globals": "^25.5.2", - "@jest/source-map": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^25.5.4", - "jest-haste-map": "^25.5.1", - "jest-message-util": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.5.1", - "jest-snapshot": "^25.5.1", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", - "realpath-native": "^2.0.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-runtime/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-serializer": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", - "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-snapshot": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", - "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.5.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.5.0", - "graceful-fs": "^4.2.4", - "jest-diff": "^25.5.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-resolve": "^25.5.1", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^25.5.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-snapshot/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-snapshot/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/tsdx/node_modules/jest-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", - "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "make-dir": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-util/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-validate": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", - "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", - "leven": "^3.1.0", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-validate/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsdx/node_modules/jest-validate/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-watcher": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", - "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", - "dev": true, - "dependencies": { - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.5.0", - "string-length": "^3.1.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jest-watcher/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", - "dev": true, - "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "dev": true, - "dependencies": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/tsdx/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tsdx/node_modules/node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", - "dev": true, - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", - "shellwords": "^0.1.1", - "which": "^1.3.1" - } - }, - "node_modules/tsdx/node_modules/node-notifier/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/tsdx/node_modules/node-notifier/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "optional": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/tsdx/node_modules/p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "node_modules/tsdx/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/tsdx/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/tsdx/node_modules/saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "dev": true, - "dependencies": { - "xmlchars": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tsdx/node_modules/stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "dependencies": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" + "rollup-plugin-typescript2": "^0.27.3", + "sade": "^1.4.2", + "semver": "^7.1.1", + "shelljs": "^0.8.3", + "tiny-glob": "^0.2.6", + "ts-jest": "^25.3.1", + "tslib": "^1.9.3", + "typescript": "^3.7.3" + }, + "bin": { + "tsdx": "dist/index.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/tsdx/node_modules/string-length/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/tsdx/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tsdx/node_modules/string-length/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/tsdx/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/tsdx/node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "node_modules/tsdx/node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "node_modules/tsdx/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/tsdx/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "node_modules/tsdx/node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { - "punycode": "^2.1.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/tsdx/node_modules/ts-jest": { @@ -14068,127 +12096,12 @@ "node": ">=4.2.0" } }, - "node_modules/tsdx/node_modules/v8-to-istanbul": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", - "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": "8.x.x || >=10.10.0" - } - }, - "node_modules/tsdx/node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tsdx/node_modules/w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, - "dependencies": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/tsdx/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/tsdx/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/tsdx/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, "node_modules/tsdx/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/tsdx/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsdx/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsdx/node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", @@ -14417,16 +12330,6 @@ "node": ">=0.10.0" } }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -14533,17 +12436,6 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "peer": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -14582,18 +12474,17 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", "dev": true, - "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" }, "engines": { - "node": ">=10.12.0" + "node": "8.x.x || >=10.10.0" } }, "node_modules/v8-to-istanbul/node_modules/source-map": { @@ -14601,7 +12492,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "peer": true, "engines": { "node": ">= 8" } @@ -14641,16 +12531,14 @@ } }, "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "dev": true, - "peer": true, "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" } }, "node_modules/walker": { @@ -14672,14 +12560,10 @@ } }, "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.4" - } + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/whatwg-encoding": { "version": "1.0.5", @@ -14697,18 +12581,14 @@ "dev": true }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "peer": true, "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "node_modules/which": { @@ -14960,34 +12840,46 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "peer": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, "engines": { - "node": ">=10" + "node": ">=6" } }, + "node_modules/yargs/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", From 2997a7d268ca45cdbcecda2c5631da773502f645 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 15 May 2023 12:31:58 +0100 Subject: [PATCH 056/106] Add missing intent field to raiseIntentRequest --- docs/agent-bridging/ref/raiseIntent.md | 4 +--- schemas/bridging/raiseIntentRequest.schema.json | 9 ++++++--- src/bridging/BridgingTypes.ts | 2 ++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index 127f77e60..9e0c6102f 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -41,8 +41,6 @@ Desktop Agents MAY support the deprecated `raiseIntent` signature that uses the ::: - - ## Message exchange :::note @@ -110,7 +108,7 @@ The bridge fills in the `source.desktopAgent` field and forwards the request to { "type": "raiseIntentRequest", "payload": { - "intent": "StartChat", + "intent": "StartChat", "context": {/*contextObj*/}, "app": { "appId": "Slack", diff --git a/schemas/bridging/raiseIntentRequest.schema.json b/schemas/bridging/raiseIntentRequest.schema.json index ae4ff706d..2b6f99af2 100644 --- a/schemas/bridging/raiseIntentRequest.schema.json +++ b/schemas/bridging/raiseIntentRequest.schema.json @@ -16,14 +16,17 @@ "payload": { "type": "object", "properties": { - "app": { - "$ref": "../api/appIdentifier.schema.json" + "intent": { + "type": "string" }, "context": { "$ref": "../context/context.schema.json" + }, + "app": { + "$ref": "../api/appIdentifier.schema.json" } }, - "required": ["app", "context"], + "required": ["intent", "context", "app"], "additionalProperties": false }, "meta": { diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 1a9ac2dc0..7048a2e60 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1392,6 +1392,7 @@ export interface RaiseIntentRequestMeta { export interface RaiseIntentRequestPayload { app: SourceElement; context: ContextElement; + intent: string; } export interface RaiseIntentResponse { @@ -2755,6 +2756,7 @@ const typeMap: any = { [ { json: 'app', js: 'app', typ: r('SourceElement') }, { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'intent', js: 'intent', typ: '' }, ], false ), From 57c566c0d165831834661d42ef0de0789f166419 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Tue, 16 May 2023 09:47:06 +0100 Subject: [PATCH 057/106] ImplementationMetadata split --- docs/agent-bridging/spec.md | 21 +++- .../baseImplementationMetadata.schema.json | 44 +++++++ .../api/implementationMetadata.schema.json | 62 ++++----- .../connectionStep3Handshake.schema.json | 2 +- src/bridging/BridgingTypes.ts | 119 +++++++++++++----- .../baseImplementationMetadata.schema.json | 44 +++++++ .../api/implementationMetadata.schema.json | 62 ++++----- .../connectionStep3Handshake.schema.json | 2 +- .../bridging/raiseIntentRequest.schema.json | 9 +- 9 files changed, 250 insertions(+), 115 deletions(-) create mode 100644 schemas/api/baseImplementationMetadata.schema.json create mode 100644 website/static/schemas/next/api/baseImplementationMetadata.schema.json diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 295eb0c51..a078550dd 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -208,8 +208,25 @@ The DA must then respond to the `hello` message with a `handshake` request to th payload: { /** The JWT authentication token */ authToken?: string, - /** DesktopAgent implementationMetadata trying to connect to the bridge */ - implementationMetadata: ImplementationMetadata, + /** The version number of the FDC3 specification that the implementation + * provides. The string must be a numeric semver version, e.g. 1.2 or 1.2.1. */ + fdc3Version: string, + /** The name of the provider of the FDC3 Desktop Agent Implementation + * (e.g.Finsemble, Glue42, OpenFin etc.). */ + provider: string, + /** The version of the provider of the FDC3 Desktop Agent Implementation (e.g. 5.3.0). */ + providerVersion: string, + /** Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. */ + readonly optionalFeatures: { + /** Used to indicate whether the exposure of 'origninating app metadata' for + * context and intent messages is supported by the Desktop Agent.*/ + "OriginatingAppMetadata": boolean; + /** Used to indicate whether the optional `fdc3.joinUserChannel`, + * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by + * the Desktop Agent.*/ + "UserChannelMembershipAPIs": boolean; + }; /** The requested DA name */ requestedName: string, /** The current state of the Desktop Agent's channels, excluding any private channels, diff --git a/schemas/api/baseImplementationMetadata.schema.json b/schemas/api/baseImplementationMetadata.schema.json new file mode 100644 index 000000000..a07bc7cfa --- /dev/null +++ b/schemas/api/baseImplementationMetadata.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/baseImplementationMetadata.schema.json", + "title": "BaseImplementationMetadata", + "description": "Base of Implementation Metadata used by Bridging that leaves out the metadata of the calling application (appMetadata)", + "type": "object", + "properties": { + "fdc3Version": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "providerVersion": { + "type": "string" + }, + "optionalFeatures": { + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "type": "boolean" + }, + "UserChannelMembershipAPIs": { + "type": "boolean" + }, + "DesktopAgentBridging": { + "type": "boolean" + } + }, + "required": [ + "OriginatingAppMetadata", + "UserChannelMembershipAPIs", + "DesktopAgentBridging" + ], + "additionalProperties": false + } + }, + "required": [ + "fdc3Version", + "provider", + "optionalFeatures" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/api/implementationMetadata.schema.json b/schemas/api/implementationMetadata.schema.json index b09a040ed..cbfa33cc1 100644 --- a/schemas/api/implementationMetadata.schema.json +++ b/schemas/api/implementationMetadata.schema.json @@ -1,47 +1,31 @@ { - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", - "title": "ImplementationMetadata", - "description": "Metadata relating to the FDC3 DesktopAgent object and its provider", - "type": "object", - "properties": { - "fdc3Version": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "providerVersion": { - "type": "string" - }, - "optionalFeatures": { - "type": "object", - "properties": { - "OriginatingAppMetadata": { - "type": "boolean" - }, - "UserChannelMembershipAPIs": { - "type": "boolean" - }, - "DesktopAgentBridging": { - "type": "boolean" - } - }, - "required": [ - "OriginatingAppMetadata", - "UserChannelMembershipAPIs" - ], - "additionalProperties": false - }, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", + "title": "ImplementationMetadata", + "description": "Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields from BaseImplementationMetadata and the metadata of the calling application according to the desktop agent.", + "type": "object", + "allOf": [ + { + "$ref": "baseImplementationMetadata.schema.json" + }, + { + "type":"object", + "properties": { + "fdc3Version":true, + "provider": true, + "providerVersion": true, + "optionalFeatures": true, "appMetadata": { - "$ref": "appMetadata.schema.json" + "$ref": "appMetadata.schema.json" } - }, - "required": [ + }, + "required": [ "fdc3Version", "provider", "optionalFeatures", "appMetadata" - ], - "additionalProperties": false + ], + "additionalProperties": false + } + ] } \ No newline at end of file diff --git a/schemas/bridging/connectionStep3Handshake.schema.json b/schemas/bridging/connectionStep3Handshake.schema.json index b5b1127e7..9774ebac5 100644 --- a/schemas/bridging/connectionStep3Handshake.schema.json +++ b/schemas/bridging/connectionStep3Handshake.schema.json @@ -12,7 +12,7 @@ "properties": { "implementationMetadata": { "description": "DesktopAgent implementationMetadata trying to connect to the bridge.", - "$ref": "../api/implementationMetadata.schema.json" + "$ref": "../api/baseImplementationMetadata.schema.json" }, "requestedName": { "description": "The requested Desktop Agent name", diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 7048a2e60..5aee6136e 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,10 +1,11 @@ // To parse this data: // -// import { Convert, AppIdentifier, AppIntent, AppMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; +// import { Convert, AppIdentifier, AppIntent, AppMetadata, BaseImplementationMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; // // const appIdentifier = Convert.toAppIdentifier(json); // const appIntent = Convert.toAppIntent(json); // const appMetadata = Convert.toAppMetadata(json); +// const baseImplementationMetadata = Convert.toBaseImplementationMetadata(json); // const channel = Convert.toChannel(json); // const contextMetadata = Convert.toContextMetadata(json); // const desktopAgentIdentifier = Convert.toDesktopAgentIdentifier(json); @@ -136,6 +137,23 @@ export interface AppMetadata { version?: string; } +/** + * Base of Implementation Metadata used by Bridging that leaves out the metadata of the + * calling application (appMetadata) + */ +export interface BaseImplementationMetadata { + fdc3Version: string; + optionalFeatures: BaseImplementationMetadataOptionalFeatures; + provider: string; + providerVersion?: string; +} + +export interface BaseImplementationMetadataOptionalFeatures { + DesktopAgentBridging: boolean; + OriginatingAppMetadata: boolean; + UserChannelMembershipAPIs: boolean; +} + /** * Represents a context channel that applications can join to share context data. */ @@ -221,10 +239,16 @@ export interface Image { } /** - * Metadata relating to the FDC3 DesktopAgent object and its provider + * Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields + * from BaseImplementationMetadata and the metadata of the calling application according to + * the desktop agent. + * + * Base of Implementation Metadata used by Bridging that leaves out the metadata of the + * calling application (appMetadata) + * + * DesktopAgent implementationMetadata trying to connect to the bridge. */ export interface ImplementationMetadata { - appMetadata: AppMetadataElement; fdc3Version: string; optionalFeatures: ImplementationMetadataOptionalFeatures; provider: string; @@ -232,7 +256,7 @@ export interface ImplementationMetadata { } export interface ImplementationMetadataOptionalFeatures { - DesktopAgentBridging?: boolean; + DesktopAgentBridging: boolean; OriginatingAppMetadata: boolean; UserChannelMembershipAPIs: boolean; } @@ -506,7 +530,7 @@ export interface ConnectionStep3HandshakePayload { /** * DesktopAgent implementationMetadata trying to connect to the bridge. */ - implementationMetadata: ImplementationMetadataElement; + implementationMetadata: ImplementationMetadataClass; /** * The requested Desktop Agent name */ @@ -514,24 +538,18 @@ export interface ConnectionStep3HandshakePayload { } /** - * DesktopAgent implementationMetadata trying to connect to the bridge. + * Base of Implementation Metadata used by Bridging that leaves out the metadata of the + * calling application (appMetadata) * - * Metadata relating to the FDC3 DesktopAgent object and its provider + * DesktopAgent implementationMetadata trying to connect to the bridge. */ -export interface ImplementationMetadataElement { - appMetadata: AppMetadataElement; +export interface ImplementationMetadataClass { fdc3Version: string; - optionalFeatures: AllAgentOptionalFeatures; + optionalFeatures: ImplementationMetadataOptionalFeatures; provider: string; providerVersion?: string; } -export interface AllAgentOptionalFeatures { - DesktopAgentBridging?: boolean; - OriginatingAppMetadata: boolean; - UserChannelMembershipAPIs: boolean; -} - export interface ConnectionStep4AuthenticationFailed { meta: ConnectionStep4AuthenticationFailedMeta; payload?: ConnectionStep4AuthenticationFailedPayload; @@ -599,6 +617,23 @@ export interface ConnectionStep6ConnectedAgentsUpdatePayload { removeAgent?: string; } +/** + * Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields + * from BaseImplementationMetadata and the metadata of the calling application according to + * the desktop agent. + * + * Base of Implementation Metadata used by Bridging that leaves out the metadata of the + * calling application (appMetadata) + * + * DesktopAgent implementationMetadata trying to connect to the bridge. + */ +export interface ImplementationMetadataElement { + fdc3Version: string; + optionalFeatures: ImplementationMetadataOptionalFeatures; + provider: string; + providerVersion?: string; +} + export interface FindInstancesRequest { meta: FindInstancesRequestMeta; /** @@ -1551,6 +1586,14 @@ export class Convert { return JSON.stringify(uncast(value, r('AppMetadata')), null, 2); } + public static toBaseImplementationMetadata(json: string): BaseImplementationMetadata { + return cast(JSON.parse(json), r('BaseImplementationMetadata')); + } + + public static baseImplementationMetadataToJson(value: BaseImplementationMetadata): string { + return JSON.stringify(uncast(value, r('BaseImplementationMetadata')), null, 2); + } + public static toChannel(json: string): Channel { return cast(JSON.parse(json), r('Channel')); } @@ -2096,6 +2139,23 @@ const typeMap: any = { ], false ), + BaseImplementationMetadata: o( + [ + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('BaseImplementationMetadataOptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + BaseImplementationMetadataOptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), Channel: o( [ { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, @@ -2149,7 +2209,6 @@ const typeMap: any = { ), ImplementationMetadata: o( [ - { json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }, { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, { json: 'provider', js: 'provider', typ: '' }, @@ -2159,7 +2218,7 @@ const typeMap: any = { ), ImplementationMetadataOptionalFeatures: o( [ - { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: u(undefined, true) }, + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, ], @@ -2317,29 +2376,20 @@ const typeMap: any = { [ { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, { json: 'channelsState', js: 'channelsState', typ: m(a(r('ContextElement'))) }, - { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadataElement') }, + { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadataClass') }, { json: 'requestedName', js: 'requestedName', typ: '' }, ], false ), - ImplementationMetadataElement: o( + ImplementationMetadataClass: o( [ - { json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }, { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('AllAgentOptionalFeatures') }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, { json: 'provider', js: 'provider', typ: '' }, { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, ], false ), - AllAgentOptionalFeatures: o( - [ - { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: u(undefined, true) }, - { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, - { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, - ], - false - ), ConnectionStep4AuthenticationFailed: o( [ { json: 'meta', js: 'meta', typ: r('ConnectionStep4AuthenticationFailedMeta') }, @@ -2382,6 +2432,15 @@ const typeMap: any = { ], false ), + ImplementationMetadataElement: o( + [ + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), FindInstancesRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindInstancesRequestMeta') }, diff --git a/website/static/schemas/next/api/baseImplementationMetadata.schema.json b/website/static/schemas/next/api/baseImplementationMetadata.schema.json new file mode 100644 index 000000000..a07bc7cfa --- /dev/null +++ b/website/static/schemas/next/api/baseImplementationMetadata.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/baseImplementationMetadata.schema.json", + "title": "BaseImplementationMetadata", + "description": "Base of Implementation Metadata used by Bridging that leaves out the metadata of the calling application (appMetadata)", + "type": "object", + "properties": { + "fdc3Version": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "providerVersion": { + "type": "string" + }, + "optionalFeatures": { + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "type": "boolean" + }, + "UserChannelMembershipAPIs": { + "type": "boolean" + }, + "DesktopAgentBridging": { + "type": "boolean" + } + }, + "required": [ + "OriginatingAppMetadata", + "UserChannelMembershipAPIs", + "DesktopAgentBridging" + ], + "additionalProperties": false + } + }, + "required": [ + "fdc3Version", + "provider", + "optionalFeatures" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/website/static/schemas/next/api/implementationMetadata.schema.json b/website/static/schemas/next/api/implementationMetadata.schema.json index b09a040ed..cbfa33cc1 100644 --- a/website/static/schemas/next/api/implementationMetadata.schema.json +++ b/website/static/schemas/next/api/implementationMetadata.schema.json @@ -1,47 +1,31 @@ { - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", - "title": "ImplementationMetadata", - "description": "Metadata relating to the FDC3 DesktopAgent object and its provider", - "type": "object", - "properties": { - "fdc3Version": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "providerVersion": { - "type": "string" - }, - "optionalFeatures": { - "type": "object", - "properties": { - "OriginatingAppMetadata": { - "type": "boolean" - }, - "UserChannelMembershipAPIs": { - "type": "boolean" - }, - "DesktopAgentBridging": { - "type": "boolean" - } - }, - "required": [ - "OriginatingAppMetadata", - "UserChannelMembershipAPIs" - ], - "additionalProperties": false - }, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", + "title": "ImplementationMetadata", + "description": "Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields from BaseImplementationMetadata and the metadata of the calling application according to the desktop agent.", + "type": "object", + "allOf": [ + { + "$ref": "baseImplementationMetadata.schema.json" + }, + { + "type":"object", + "properties": { + "fdc3Version":true, + "provider": true, + "providerVersion": true, + "optionalFeatures": true, "appMetadata": { - "$ref": "appMetadata.schema.json" + "$ref": "appMetadata.schema.json" } - }, - "required": [ + }, + "required": [ "fdc3Version", "provider", "optionalFeatures", "appMetadata" - ], - "additionalProperties": false + ], + "additionalProperties": false + } + ] } \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json index b5b1127e7..9774ebac5 100644 --- a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json +++ b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json @@ -12,7 +12,7 @@ "properties": { "implementationMetadata": { "description": "DesktopAgent implementationMetadata trying to connect to the bridge.", - "$ref": "../api/implementationMetadata.schema.json" + "$ref": "../api/baseImplementationMetadata.schema.json" }, "requestedName": { "description": "The requested Desktop Agent name", diff --git a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json index ae4ff706d..2b6f99af2 100644 --- a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json @@ -16,14 +16,17 @@ "payload": { "type": "object", "properties": { - "app": { - "$ref": "../api/appIdentifier.schema.json" + "intent": { + "type": "string" }, "context": { "$ref": "../context/context.schema.json" + }, + "app": { + "$ref": "../api/appIdentifier.schema.json" } }, - "required": ["app", "context"], + "required": ["intent", "context", "app"], "additionalProperties": false }, "meta": { From 46a45acb7316eea4558d3a95180d9a392a999500 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 24 May 2023 10:48:38 +0100 Subject: [PATCH 058/106] 544 Improve dab overview (#66) * Adding images and use case overview to DAB overview * typo fix --------- Co-authored-by: Tiago Pina --- docs/agent-bridging/spec.md | 22 +++++++++++++++-- website/src/css/customTheme.css | 30 +++++++++++++++++++---- website/static/assets/dab-overview-1.png | Bin 0 -> 17787 bytes website/static/assets/dab-overview-2.png | Bin 0 -> 21057 bytes website/static/assets/dab-overview-3.png | Bin 0 -> 34767 bytes website/static/assets/dab-overview-4.png | Bin 0 -> 53440 bytes 6 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 website/static/assets/dab-overview-1.png create mode 100644 website/static/assets/dab-overview-2.png create mode 100644 website/static/assets/dab-overview-3.png create mode 100644 website/static/assets/dab-overview-4.png diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index a078550dd..790439df9 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -18,7 +18,25 @@ Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, i --> -The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), enabling cross-application workflows and context sharing. Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. This is achieved, without implementation changes or special handling in the apps, by providing a protocol and service for the Desktop Agents to interoperate with each other instead, allowing application interop to extend across the bridged agents, seamlessly. +The FDC3 Desktop Agent API addresses interoperability between apps running within the context of a single Desktop Agent (DA), enabling cross-application workflows and context sharing. + +![A single desktop and FDC3 Desktop Agent](/assets/dab-overview-1.png) + +It is clear, however, that user desktops are substantially more complicated in reality. Some Desktop Agent implementations already provide additional features allowing "external" applications (e.g. those not launched by the Desktop Agent) to connect in order to participate in interoperability. + +![A single desktop and Desktop Agent, with external apps](/assets/dab-overview-2.png) + +Firms that make extensive use of FDC3 have also identified use cases where interoperability workflows span different physical desktops, and have built proprietary bridging solutions (e.g. [Backplane](https://backplane.finos.org/) was originally developed as an in-house solution to this problem). + +![Two physical desktops with a desktop agent each](/assets/dab-overview-3.png) + +With the success of FDC3, usage of vendor-provided Desktop Agents has increased substantially among banks and buy-side institutions. Buy-side firms who are clients of multiple banks' platforms have multiple desktop agents delivered to their desktops. Several software vendors also deliver FDC3-compatible software: some as apps that can run in any Desktop Agent, but some as self-contained applications running in their own desktop agent. They are often multi-component suites of functionality with a customized user experience, and are not simple to export to a different Desktop Agent. In these cases, being able to provide a single installable platform bundled with a Desktop Agent is a far more practical solution for the vendor and customer. + +![Two physical desktops, one with multiple desktop agents](/assets/dab-overview-4.png) + +However, unless the Desktop Agents themselves can interoperate, unfortunately, this approach prevents interoperability rather than promoting it. To support user workflows spanning the whole environment there needs to be some form of network connectivity between Desktop Agents. + +Desktop Agent Bridging addresses the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can also interoperate, allowing workflows to span multiple Desktop Agents. This is achieved, without implementation changes or special handling in the apps, by providing a protocol and service for the Desktop Agents to interoperate with each other instead, allowing application interop to extend across the bridged agents, seamlessly. In any Desktop Agent Bridging scenario, it is expected that each DA is being operated by the same user (as the scope of FDC3 contemplates cross-application workflows for a single user, rather than cross-user workflows), although DAs may be run on different machines operated by the same user. Whether a bridge is running for Desktop Agents to connect to, whether it requires the agents to authenticate etc., is in the hands of the user (and their local IT team). @@ -219,7 +237,7 @@ The DA must then respond to the `hello` message with a `handshake` request to th /** Metadata indicating whether the Desktop Agent implements optional features of * the Desktop Agent API. */ readonly optionalFeatures: { - /** Used to indicate whether the exposure of 'origninating app metadata' for + /** Used to indicate whether the exposure of 'originating app metadata' for * context and intent messages is supported by the Desktop Agent.*/ "OriginatingAppMetadata": boolean; /** Used to indicate whether the optional `fdc3.joinUserChannel`, diff --git a/website/src/css/customTheme.css b/website/src/css/customTheme.css index 778915331..e3bc238ab 100644 --- a/website/src/css/customTheme.css +++ b/website/src/css/customTheme.css @@ -53,8 +53,6 @@ html[data-theme='light'] .footer-copyright { background-color: #009ADC; } - - .button:hover { background: #0086bf; color:#fff @@ -63,16 +61,39 @@ html[data-theme='light'] .footer-copyright { /* your custom css */ -@media only screen and (min-device-width: 360px) and (max-device-width: 736px) { +@media only screen and (max-width: 1023px) { + article p img,FeatureCallout + article iframe { + max-width: 75%; + } +} + +@media only screen and (max-width: 736px) { + article p img,FeatureCallout + article iframe { + max-width: 85%; + } } @media only screen and (min-width: 1024px) { + article p img,FeatureCallout + article iframe { + max-width: 70%; + } } -@media only screen and (max-width: 1023px) { +@media only screen and (min-device-width: 360px) and (max-device-width: 736px) { + article p img,FeatureCallout + article iframe { + max-width: 85%; + } } @media only screen and (min-width: 1400px) { + article p img,FeatureCallout + article iframe { + max-width: 55%; + } } @media only screen and (min-width: 1500px) { @@ -288,7 +309,6 @@ article iframe { display: block; margin-left: auto; margin-right: auto; - max-width: 50%; } .nav-footer { diff --git a/website/static/assets/dab-overview-1.png b/website/static/assets/dab-overview-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae42dd4a37b0bd55d3d5b2479ea0b533c305979 GIT binary patch literal 17787 zcmZs@1yGz#&@~E+ySpbiEbcBLxDyDAyL)iA5Zom|V1v6ZPLKe>VS~F%f=h6_%lm!* zm8x4$6>L#6`^@x6pFVw>Xbm-aEOc^oI5;>gMTK`-aB%QI*ykBkWZ2JPG|yN#I9fQx zchWjO#>cA|kAbsUl4rnQn6jkSP)uGttnjw%_o>m@GTJ=v6ty_ghl*o=tFp!&))u7k z$&kb-X=P8zu@=4C5y)CEQj{wr<0VS%zPT`wd}vvI2$)~=|8^<9|6p`@B~p9&l-GD8 z;UMW>J?WQc6PUN(Hp&^aSTPlY`1A6ey*2fo7jv$hkn?TDEpTywxT@G)3PqoXej@4u5&Flm;QK=^H z^|t28xsMj{qCXziTyATQuPD0DDK>LE)~;&OEq=_uTtQ1Sw%<1#VsjlSx??hcybAp9Km*+i~3eKSO zSa`&Lz_8G6nv0|;o%NUJ8$E=i+dzsx{gXkLg2BB1+K#iD=8ZeZXd?;HSgN&;;o}f+}yqk6MBbTYf&6JPw#dTyFR9O3_@`MSYOG?Zr9a z(=fW}em?BhrRYa49wuOtqTIPZXgSEwp$wY;!OxVoot?_{e0n=o0Vm+8+F0&;FTp{5 zh4j5mYKDY#ePDp`S#_;t#eLL%o0~)HeD&k)o?v&|(#NXA(c7E$!x{r4w*jKfwnV?L zoWzWSq}oQOHy!IwKQ&y(%Je85h-ZX?1CSx{;{(px@YU05qSYe1Y1$RMlVTo3%;L}I zi6;E@E?swfbtyH5Z9FP-wLw>v@bu=5?*3nMkqwMQX%!Im@@_h9NV9Yq*}iUXvHt07 zp2hk&r`LH)`<9EJCI~UL9SvVKxx`LOP}BTnStZ{Vf3`bk2K=SO@JZZW)RVWCn*R5- z@A8f3_#pqVWZq%Ny^UvMqg{{)hcVj-opGhF@zct^%Rsj{08>i^Jwd|F_KOIus9>1O zj~9uDRLQ$kaPRwZ&g`7?+%@E( zt#%@V17$&KVvIpHp?n-v)6G2tlLx1o;a*s=HijXGdyb8qR|6euDEl)ceVY4CMtvSu zcXbgVG-N@$Y$j;Bk=y^B{KSBrw``ZaGT23&ts7xnH_fYF%LlKPuT&LSq_;x77O{Q< zzDn@!EWGbQkzz>!LR**Lyk1Tj(x<>Vuj>1Eu?USP%n53ndl7L6 zMH2M~T?P03RpA;>r$XNkm((ainnI12l|;}nx4jE%)*WVm7m7~gHuE;;cY@uu!4e0j z9MwD$-R+F?0&`nGr5f!KmPBYDy0CS}PY+&N;615&4zh!dViPQKV)q?P9zdSI=rAFc7a_3;lHGo{a{y% zfm?}lCz0O|y@NQ#?9Wj3+^TI8zk)%Y@t#?2o zc)H1cVDga7(eQT;NP~*`fS_xfn=0RuLTFZU^tqoYpjQ)QU=-_+o#lzez1tx%_~~o= zxWvB5ghv$u=#shvvM6vVn*B-DV|HJ4BetY;JyuuxNho+wuKjq$r)wO~Vl`loXEUta z#kwy0QJuHQDsYcCzkEV?KbI?*=KPC%gs?wU8s&qF-*isJkDE2o<)Kkz5Q(vm*;VJh zcy0T?Ddq5M#H#D{;Fp7@+CZnP#FyJdv&^_f`Si}0r&AhdVrJjP50^hqZRoE zt9R${IHdkAn|v&>AzJ0hz1SsAolcc zI$U2EVg(OGeQ0j^QGI_qC`mo`)5vSFSmda#ucB1^*v^bC$7FDH9KQUpwp-$s<%k%- z^&GChkWR`vrkH1964((^e4OQW&!^Pq@Zg-s|I=+pE8#c;t~;M(oeQ_H_vjNgDd8Uhoy?%LV5w3==FKWLYGX3oJV}9`xb_xq1%KMIlPy zjYqGKSOSb;*Ut-CfDUERALL>pG(t3XAR1gX>8*Cen~8TqU|hz>x(F25B$8|5c^Q z>ccOT&^dXDi{zfSX2j34CQl#!5PCv6lASb4^1d;KTtTBG_-qYkhW~>&8C{6XY>z8x zL`x*>8viA3J3gg>x$%?jND^kPmjL z={*dYhWKS~k>CH&95_BW>NxFM6z$O)X27+>97-}o5U{uxh+Tbv0RgGxa>0%dG>;o7 zl`WmSz(7u;34?cNE1#xSLwQ2=UN6x$zkh`^R3V37Cj<5tejH$dW;zAC&f{mE=&+%W#_YHQ1_cktsqbr<35^tgV(jgz=<}Q`dK!z6d0@JGh1o=;puq& z*=YgmXZK$~_3d4$#8o+*Au^M^I5rM0?|T?Vdae<<7<${c(0aQSTWRFI%5VFbPZ~t% z?nVXiTCywMSP|d)^0wk?&VVzC^3{VML=dQUt7K)~rB$EiGG1=3$X zu5%)S7#sJIvu+9V?q^DMMUU!avvyz`IS4NN$MsUB$aWlWm~RvfQyQWvm1_??d}sFa zPHX`Pwr6G_5O1PcG8>Emek<7i}1ZGa>l8apCL3gzREht*T;AjF=6Kp1Sn zn#99GQq-{6inZtZdq;DG*!1X$hZd8*i#yd15YL*tT$!M3 z6wnQnaE53}Ua2l5>7oDw8y79)l?p@KIPzJK$2JnXIJ3JSkP3>&GZ2}jevx9t3pi;u z4FP9<0f0dm2+K+;O%`u1EVu=$=8A!Nh{OP331RBrahD*EGhy^%d=hlhER8ajt6y;t zeqcr%L1#6v$SyiU=<%!%VW4;|gp{^FMdIc0QnvH2!TSANT|ENCF^6J|j~;Fo5lBvV zFm`Bs)BYiopJQP7_nu++-*R{bYm^BMyGADX$&~WjEs}1b4RknzvUnsAY7v`m6{?yy z0>%RsN+H~wjCtPU%~p>XN-AW{F-z>}uR4x3DZ$ttYEMrp9>ECYLY!Z`nXR^yr^*Lz zJb^w*83{&b{jWdUB(t9B#S>KSFT905!^kvF=sxb#bAJ9c8$<*Y760Ii6)%#amMm9ih;BU=p9}r04exOpvZ! z<=1qvlL^uz7J)x9-PsF|^Io-$kwH0AhB z*9H>jN3JpvGRP5TgJ}7`85b4rN)tOdKqEaYI&J*NM|^@I!{f1Df__3fzV=WCvjJrx zWznS1FWxYk{*5ob#l$Bd;Q|Fy5qvH*p{>&Ndv6i%rcc3MSwS;dpos#~JgJxX3fmCC1+6c1nX8KA=^E<6`~3 z-1_~$vmt#0uZi)7<(q64Pm)BVOB#|oyz8fZW z{I~co)mzo?yR-ywQxyM+8)w%vC8h;YIkWfG;7~ol1$cO#v05O%?a?VkcBC5_@}6i= zaSE~%Qu+(c`JHdlpXw0Z^}+x7>JXO4?S<1v10T@H(A`5MXTavrmmGR1e%ISo6nY&b zBzX2>34LF_|FNqRe$u3gm;NxxM^`|J)#7d(ifKKM&T^X~n1Kq*=4*o)Ix%yT#6dx7 zkV+Xzt`C3%o^=A{vWbv03$inMwf_My#??fpuL3(afife9ulOf6gJX3suk%GnpN~V% z15p)$+YcIvDLF22=m9&H%Cr&|D)ul+WQa2M2 zev^mTr#{FSPGy9J|E(q_*YDDALYe@njd$BIixynlR>|r(d4^cI^|zf289^I1ubGr8lWqJWz4Up@H&TGfl2(WY3$ zj7r3Q5(~7f(^SU=RLTq1^SUBjwc--9l95L)h3TIWHa8>2BVzs+srh0&QI|;+Rt}X> zr5j8zmk!%nruXh?}O0( zu_N{rq^QWOqTVCj2*tE;rsaG<8;Mo&I7a`Ymherosc@+RZ8suZW_E;DO`>`E&7GB* zs23;qhWCowpc2xj`Y3^i_p>^xQ;?)?=n)c+bMvD0cl^mRd$K@hxQ~i$AeEn={%%&9 z;S~D81y<5sKF!t!d7l1!tMjjMQbIJso}U7^a57Pb`uK0{(U-=5~ za-n2ggYclQpU=lAN_T~_YwaZ;eA_Txv1Qr?%T!gFhW7{JK~!8a+R2_7(TR=PoGL=5PI|O-!x$|wViDJH~*71Ga_pa=$U2vCr+cA9kK0yzLWmO%sp>rFi%ly zlQK+WzlG29$6}aw*6;m6z!BpT8#Vk?`ccL)ipmT1ib-cf+J{I*TxgZ&f-E&09mjCa z*#9`$bNCltl#bw3H8J&^kk-R&y%G2d#^KQJFaqFIL^`@3@pbE9lmjp;s7vzsb{oN! zj+BRYyPl8#uKkWw+`E&iy2g%spC7z;pMW6svod5w8ik7R5ga7jeqxazyr(9JTGqT| zUwJ@v>Lb5!;f3|xTqrcPjVmncLVoLa*Nh|Zs zes75FXHEV#zt+MN5He4RrS@7d3vF{b`qV_PI*L>cMUE$>>#x;JXqchk`8y$USe2r~ z^}#fLyIm@_O|>%V29uc*2DL-$N_~Tx>*^DnY^JjVZr!_f|0PQV;)`7Le+3m(NZ-YwrCCiwCp#?xNNZ%j(+uEzTZTUG(- z6nR78`kC*%_;49Uk>j^Pi5$~k`ta3ampvY)*Dl>p*WsMZiNy1%HWNE7KA@E%?-o~2 z27t;O5Z@{vvrwtnk^v)l z6S%C_{$?1Y%FWRcLLeW)T;1i~Jo@xwi>Q{=?{xI~kA-A2l z$yc(}0!!-O_ATlzOrUuO@!Km|8?7y6cTVRuK`0CN-G_PXMHr#F|6G8}(y5!j#BH`s zZFNz*be2S3N>>$^i1a=qWjwIhZ;W#=g%a;mKxKIN;jk_=ttz#5ezLoM(@eM2u4&9o zj25fTO8Pxw8Ch`&$udMH3z1>lINBlLF%7}kuecOkaqWX6o_P^b$5_zVgh!H072*z$ z^V(^A4KU!oQPD1CuFCenK{c$3_+q##uWXQJvK&>W{17ZJ3duUZd>%sr7Y9=w>fYA) zyMNOJ4;&%QHP4Tpn7w@Mdn{#NNwyp!W5Y@afLMN(Py%|*$?12ounUNu!Q!d`Tr{}txu=mFZK zMnis;{zPc3pcwi?ZWNTz>8)8KpagIY`5e*65Ba@g_gKcWLcrBK!HM-F7Ds^Cb}_7( zppOzff@SA_`onu+Z9-0mVk*mgbDyyL7Pu(0yvd0L8R$RLN>x9RgT%A(_-HzMpH2XKuo&^zjMHe4?X}w z$^^z#>l=Lxyb3xRG82$MxfTi~L&YDbWZ~pd;7$L-rfzs8EEX?{{5s|SE&sXc{T6inS1k}x2)`nEa+T*fc=^C&9G z=hFXF^(MONrDFAmPSON^R;m++G9Lgyv7&!QYDv&AlchMIGK2MPC=d->4L3syhGMoM z2{ecXRhi?MjBry#=oe**pO&0pe#@aW7Fw`I}6ywjBVFPTD>9+$lOqT9^1w zZI%Pcb`U#sYjH4hb2Tb#Y@o}D5{l2%Vo3gG*F01=`SP1Q8I;w%t zi&u1)>=qQ9A}NfJ;(k4vO8V!71o^C5(&c_CQmZoIoUhA`!(>D4-mZKIR7PbIqsf%= zO(t5={J{@QK39>sOQiQpHB>V`$ zIGQnDIF#G3r>oEnmln_9?02Z(OifG4TNi+TbybJV)k#n5oybk!r^C{dSg@{A%9srh zK2D!r44Eui!88>f2&W>vzXND0LV@CZDzl5PhzgIHMSMIdtQt06tZV?Nk6uH{Vc~WZ z2^3RX*7f#VN7nmc>fKL;lq^2e6p*5V1)uHs@Xts{<)4<4AUywdGSj}Eup!CU?RXb! zxU`#s0cp)Ha?K#8#4yeRN2KRo7%e8Jj>-Q0WaXJuLISS>-eLa#&a%MnzoEujTY0E| zCscg7ZN^o(`#m6dGY1hGpnpnj#hEo$WGt@a-g#&SfL6m9Ka>b7mdO<|XU_?Bbs2)K z=AkE5=*qS_k9%5XX6*euuH#IpMRw&IZ+BM_ue=I*%s0EfG|S zj44%wk?0>rmik;NLo%&NhGC%b6p(G9AWKb;Duy1~z`#Nj&&tT!oa?>jI~y;!Cd6Fq z3||cZr2>l54vC@JSos+%`U(f=aIp@1%UiOULB6=Q<-zimTGz@v{(Ilaztqq8jnLXr zYfDvz=;phn9_GSgdU#Mp*l5nxS(Kz0*M?QnX2MpS9!h=7+dP(`V7Wdm?(K_FPMkFV zCB1ds*KX_esoS0Zb=%5GS-K7wo&R6X#^)MOZ5DX6 z{5rb>Q7`vgJt+qPDGUPRT}HZ4DP?|YCHxv)J-U7R{5fFD3cikz9C^7T9EOEwo)kt3 z+ip!o(yy8HNFumFETlB--t7FlF&mM6q|s9jjwnl;Iz<-z9LSpy$<2#+ z`+~dE*6oBd75bp<&q;cA>T4ayVC^V!bu~?Ou?KV{I-u|^mg6L+(o#V#d z{^I#t4z|M6{PH0JY5(xJWnJRS`&6EjE$(T!>SFdx*v{z%=zJ-b!WfqZNJYaJd!9N` zx1-YU(Duc7_i7rXu!P$zff-PmrVj8E><}&e)B6&=ieZ^UoQed|lU7r}b`gu4wd-~Q z^yecMVa zvH?CQ;&_Z`YC``;)9$ga-7j)U)-YbI1%QQM&gu5h+r*=9U);&TO=+(u$}p-RGch{Llqv} z_$|TH>0NS%8%gRfvedvOJ}C#5Q3euQmaK3rmwE(a8Sl90SkA82#+bkq-#>3S?2FS@ z;qen1gtd`>L!_1SZ<`WenKd{K)P?}o8O>+H)Cfk#p8*fYEjXRYf!B*nD>2(DtQ{p% zqi(+mwXRV^D8Rx?Lg4i28-7BFtJ4u9g5UGxpXr94a|8HbMp};$n!ZaH1Rw?++4Qe0 ztX9zwbz79Y4OqI1pkL)M)2jc?bZO5BM9QIjgn`Lc@t4%}MU_6s-n1!{N4P2lud^sc z>N%T9byTV)#$xqiygn1j#(alIHLEA&E17NaeqxzAvhca^hHBZgx}-SjM{V1b{5Zzs z!f`fR%|kmKz=56Y){xMalL>FBli75dZIg`P`_PO}3^86jG|5;_j|!vyx0_KY1YK(( zAM-8KrUBK(teLssroSaQ$W}uuTLFU3t$@}7znmzwqKb|zqG?tX$Su)*^8gfbtEj>n z$V8Z(sUu1a_r2UzIo!Pc%-gBsxOwwBE0mAhpb>F&-HOK!7HEB3_)y%tYkP?a>M==T zYvVqQBbn4M{8pji{2jcS001tX)O4JX*YwRmxZP(oSAWtxQO;sa(bA)rDw-z7qJV(aNCC+W_iu*h;_Wm6c7%li4h?GQn$Z}#GK$# zR4Zw;qLt#2L*3(s2hnh{ve>1RYXW+#wU)>%CU)#Eu|YdT%RxBYypaih1M#8CHs#4vg)OVsYbdJv|^|FN#3ncs?GVW0Px(_wc z9WT!Hmdb7JO?);ZzhxLsozQ(hx6=Gwevmt%^0tzyv0j}GJj>Ap00q9EzTGcUo9ODO z*uJq9m{3Sp=79d}u)v?{|4^lO6+4%X1kp*g#$Up!x7d@vB^J_qfB-;9ko&kC!`FTQ z&@uib5@-csOm-3>5z z>E7-Gs*jtOIgS=CN&Fd~_vM=_C4Fv^enhi|z;i?($w`6Powf7-^F#lS`}*>WkWO^K z>&%TM)S4LDfaK(j#k#e!0@DFtA}SwvQ%}PS2`RbB{0Fn^~1ER#^N&-<$b09V@{0$iu5Et`kc$8B? z_KbT!#sC~B1e2&hJx9QnP6!`BKkv=$kdg=wEE2$x-uQ<^Vu<^3h4iwFiZWa#7*~V4 z#fk`52pEK&|Bf_K`cFVw(s$Sdb)CQBq#sv>%xNXT7N3XaT)ciWIo3*V7#Y++jrtw; zG3Fezzb@I0?H*zmMr`oaSJ}W^lmHV8PXQiyBdzg!21x_LNXhpsx|D`ogb0WYB^YF$ zPd)uQ+_t0zU#&Q_(laqjtUL{3bsvVo!6tJ$pJvp)DJ7A6aV}Xo1`Cdt3_XhI%x7jd^V}g1Rc~3x(mopGH_p5jWOg z0ty6DY$s(T2qWEP%}0m?j|n^Uf8Ml*IgdHjKE`S&$P@adoh+?w2D~x3x&2#zf;Tmj zY9xQURFwcy=O~vl7>5wXdsma?7m``RP{VT)Az~~9kDVQd&Bv;$l6Lu+Sh^>chVxE{ zf{=ClS}}Es&p_+avY0yaXUDK=L2ksD$KLM${Zc+Qbhs%IN#025R#ReVLA*lu&r*hE zFfKJg)~~5jRSZZ-a?pk5cc*@2A3I|{dI{jEm)yB*zYN_JI>W|vffGFUUeUWxfM4}K z)z}ZG-N9#8Xvi65&ShwggnZSC!?}*`O#?90K@US6a*bQ|Tk|P3%b$sFMmH$Wk zA6_sHG|3t1c9@2Nw-?$>DCMBVL&LgU@?O*l>l4c`Y}>bC$I3m@Q8P1yxWv->-UW8Tc7+`X<0@WV8MNN~O%lvtz_O98Yk&@JN~*G!-i!Ti2V{7S!-%mn z(RIaS$|)TJ48oPa;0au*dXg_c2T5IsB5HTo1%lwKy~>H8*%LCFQkDLX#kSx!sn`y* zgt|3Yc3eHu(824jc)vsi(q#EwY&=FiYCKxArUISmu`@j5+q(dE83%z#(j@M})UG#+gYBZz1NG`-ji|+I7*Dxhtir$x}K?IFSi&|ck@Mdbjm3apG zD#}fRx+Gws;M5-zm`aoaJRn~qP~sOwb2lU(#$dCL`vf0vi)*VWRLfI`7=oLGgGz_j z3xQqQAEYWLTZcW>;HwwmfC=6o>Wr@&GC#cL!Z)P1xBu5F2BgG^b8rn$+Q%+@03inEy<|7%*1xhP#h{-jHCb4d=C=5Z&&2{dVMA zLRE)O_+au5MXt_nT|XBl=jWr6{&9Jc*VKi^-n}N=F?PRfSXi47tNk*#E*JyjbfI zpJ6NNC19GI)j$jpd{tIVfpeUbz7BF|22gQR)V-wAl3={=)frwWnTqJa*gn`Y{&k*D zk~Ma0#HEhVjx=B(r$PkPR456-U57@e*-Me-)Pf0QUwKeVm+oF(EM)j$3X6FpW3{T2AEZxNP3wHmD&}3^ z^r>Dc5q`Ekunh5uUJ@VmpZmjF8v7J%0Fb$?6={$xr92m;WW(}yuC!Q-TC4UO0mQM7 zb;rIDzR7}kSqlz`{n2X6>Cb{R>#-ib#zrq`9Pv2&2<)ESv~ub^|26wT&xq)av!w#E zuAznzCDc-0tiuDw0%Pb?AJGGV*ZW$Cz~&|+%*qv*8uvt>lGkE)HT#3=Xip**MLWbq zQA!`UlyT0axW?XW2=-j{oR7pTu29|%Ezl~TC`2BRrMZWiWzVUJ9usnK?8kS4rly%^ zME=@~mE*8ymJl_uhwnLicNi=%e3Nr>SmUoQvl`epfK<;mRS7+(9d1kJHDzExf^Pe0 zkoP*?h467u1bsx4s;mV0HpMN7RM(VQqK}jgabjogm}TM(eo|o@_k%VmMmvbwS*I~^r(1DDWVRdd=@gU z&3Ups_2Rw&lh=e;c*ZOrfCygh;PYfgqf2at)#L9I)h*av$r~prXISj;wHRgwG5;Hk z&W|o(C3kIkxBX1Ii9Y>rKi@&JRGZ)IcH(UeWk$+>H+9GtZ~!x?H`#jl_Bjgu$#=IK zA&ZV}@Lx)2Eu4J95w|gxR`xUcD?c+DaO_}0u>cJ@c-07T;UR8&$g#Kl!h3qY>6R?w z){A5u*?lEx=r{zrhpcr$98h=3n5Kg6R>{z5*4M1lgX*=N=CaS_*C-vI{;4SOBQt4= zzth%Okn9^=>B`9;s@u7~NYy2dTRXX*$M*gTS{rc)OJm5N!jyJFsH@WaT1MoySQ8hx z{J;{rFqTh6UGTLMPWa&2QW~TE1z<7JnEUAP7n7=o+^b>zohgpcT$pD>s=BQ^lll=d zw?QBB8*dVA((JY||B0Q}%!JXy8LC8OSl$uGl0DbSwQrMNy89JI5FtnEU!U$G0xA6T zjD4-nzACo_%<0>Fpm40~J^M78e9?1qtu;c9zcv5QP8lAu7b$E4b9$&oD<0NVV;*6| z_Tgc|W3pM!*sb*`I1WZK_T`B*atb@ zRN$#9FKp04{WdX7NPR#G&bd}T44u!ODH}pKHhIzxYgw1DDhsl&jc!No0HA0j>L6k0 zY0yo__n&+{DS8gLw!^^4E!xSMQpu;k2g~cvUU1c2PXDLheZtg$sEcrDMu=;q$Byp9 zh+Y>y&#*?)5iRWc5#Bmy=ISqZnK$-#V!|&GJAf^>ujK>@jB`wG^c;h|jm6GV3-9OU z;$)D3(C$1;O`T->3D*|w?Z?-$gIJDsW?H)CM&&?d-^WXI(73s%De0eiz~QLkZLKg9^w&~)&$s-UOH zh!*vZd6=%!ix$~=`C#$mUQq&UI~382wjFXXL6-t=R%J0853VW#jbO2=v~)vwnTUEL zLwLsH_!JwgLPD|zTkNa{cjHUxYzvUsw)k4m6Iw(mh$Gysy_@pTN_e;XJnq}NRyE2{ zS~6gQZGad>6a0AIi^QN#b6i=yp~Pb=4ik1@z0a%@>uf*G@m2)azV z6y5!*x|Ic+RBG#fn!^NaQehdm($OzTb9bZq9{Aj}navEai@4gUd9eg!5zjC4%-&%W zgc#oBVxR`*hmGPvV(|O^`27y0UvS`LzGvGGBJdN+38QeorJY=9fmyViqcTr6Cg_Vv zN^-Q|PTD^0p%PW{1vmr4cD7Mdi9@IoHj%tV`h>4n!@|-2YHfS4nK0Q7S0a~LCip%b z!c@XAJsC!_fcszz(S#y0u)o$NV4H&Ot`n%FU~ACeV!#3B=luU0Ml}Mq5cvKlNf++p z$32W{PBY z6)H^O#K%gV-|^>QsT$XvFQ>~H2)5(e6Q^C1Zhw3mC4{5aOx7=LUN02~7-XW$BReHf zmUdU>qcQ|8Cg%XjAUcR<-saWr32j+o>w(K!DAm5BcdIwT*y1j8O#9G>L;vUhrqA+) zJzg}JQyE)%lS%SUal?MNeioKBhzB>bNcAYbUp_F9P+`gtvE@e+KMb!s-68igPFC(f z{O`@mA$(5Cnq(3lxz!Xdo!m)_%UT>v4j>*hW3NT4&|3xv7IVAx0%GcEinX)P2kEr| zR;M!pvP`2g`=!{~D}%t9+T!cLipPwlK+aE+jqD_rc0_Gw{2mYjHKFfYaiv2F+OmBq zmTBvTB2{bI84}-b&X=E-zG+3)bJP`A6vx1|Bk&Jgcp5YoVx~Y~Npd z8&4{yuXn;M6g1gjcyv;ZkX>05N0| zdgB5cGY$}WFJZM;_h71_E(DlknUPL?Xie(^7F%fTwxpd1?;2a{bHK^vf>qln$6?`- zb)fhT9S)kE-He1zaM&KqbYPmDRP-wtN~wJn^IogLl@TP7t9GkCjnaMjKCeK<*Oo}J zbm}WA`61}i%S84;bkto_c)!x*$)0Q9o$nJ0o}h}_GkYr>DLkxp0@LEC$@2v+ zpOc`Qf;QuqlDWBZy7_TW=L7I?pkdAPKw6J&W>o=?6Fcu{YW0``r_C17%yOFTrAbO zQ*FR$^f}hg82uha4N?S$Jbo=S>+4I^Rug96B5cj8fz^hM@CjBi^C!`Lec7|1;5?nWwP>Pwid7%BOstZtD*mk4rB8%gZvR9yN>uJjVyQ z9uwuxt(%|i3*!aQza|I6?PJV^8>ILI;kQPZ;Kx1A?) zzODVb&Wu48yw?cj7diFL>YbvEtR#Pvh;-7Y#r3v7MX_a}y(&z@m(*#S)G zZarrdTmnX=@P!E7wJey&CQYm=ANRp@r)y7A%1d8hq==x}zXW8sztFG&$P5u?j!h>c{|Cxa~FI1lznmN|_xJMA*)E@4AZ z3HR2^uLzvEz;s{S#ilkh zsUc_Lm-&A)I^0gSLmIX${c-2nbrdXq^Vc&fPN&E#@9;Br+LOJiPaC4v$3$c$Zo*mT z+3>SS&|DKLE1t9GJFVXs5!-x0VWk=ug&A3Ch_)-^bHEzrl`^0@$E8cy@>89M>j06S z4tk4#_`UFnHLTpK5?kaCc&xZf?dAFfZ!9bNizz4NCA`#8^J~hV>&zxErQ*qcsA+VJLrd zQKj4{%BBo#$n@I}@;i?;p@fkcWyjvBQll9~Gkh_uBWF?+F$V@G6!3=ltEUa49E+qa zZ4V!7^yuqm7<%Z__G7|$6noytFDg0tMN2-y)ZCqa$l;(`*McPc*t9LX zAQJF)ER?w9Ck)*k&GC)aOAdpZ7OitWyw=7nq*ywjcYl2^%O!fZlPcRUNZbXePo29c zaWmN!j6t-P2K+&u8Vi6GX<~EtRF$oWRcYQt$GiUfEg$twmNfjHmNbW;s}kn*3Gs5b zRo=nJL*25SVBjnisNAYS=8De~q!*xS?qQmJ^D(GW!Bh*s$6t#*ta4B^srB(n7%ow>%)#!LXBUVd#26bL1>-#lsKp5_f({x8qU37^)wM<#oX`CUPD1w==}zY zBq{SXrPWl`g+sb7Y}@=NZp9DX3OUbrd#3T(2&HSIWpkcMuxjvSeky-wgsV{`IC#s< zcjW(exAS#ziaFsy`9~Z*iZU8$tN~oaItE+a?e9{gM-^3M>BPfw>_Cpc|5yL~D?Q|! zQi8WN-Sd7FOtqEtTRM3=(pJqPbk1PyBIBU*astDvE<4gGl5p@iK)CBwYU!&8HxB=n zmIv>)ARTAhCiP0L=U*92ZsHd3Ho&|Bz!jYNKZ8zU4K;!7s@Z*so3@@COJsNca-v>3 z&e({mA>&1<(a4=IBz)u3-Ltv|MBTav)2xH9%H#;D;1arEVqyR*GUeu5`QD9X8Oup@ z5RW+XTSfteZw&(*UTHQauV*P3U&<|nhDTVzlc6KrGI%8Nca7_i7SEeRE9&>$X5%rc zB7cigi9cnJ=i4eLzG{>i>EPk4N^!T1%qTY)au9m(!PN>5N?w`9-~s(#)0}@F(U@{I ze%dphM~w2rtzh;!%S5tMo)WLo?@XQ z8KK3JUYxn*D9^qMt9SHc5eb)$y*=kBQXz`CL#ar3I(a_%o|t@Ug&1RUyjwd zDbt1|R^9K49Ayd#@A710#BC6O-%=uRe=cc4MC)Ms`p@oC|5Guhilz`9^nACEBLDDO z!}{akLv021Z4U~v6Ke)_Y9Q$@JdQFc4uPA(C^|^wO-I?kYG;6z35xKV#+7ILf6Dy3 z47kdJDP_)T-Kvjxq=@bv7^ku0*mRl6TBcb@UdSw*tS9Vgy>xOsi_&ZW5;f%goHPPQ z{pGx=B}bSWrei>A@A4^BBn(t-J9k%s3E!o%5pgB$bj%a#7mAJd-(~t4{n}U<^Nh@8 zxJ;#*^@ebCvGEhmn*={WXbd;XqC+y)`+HxW38UfQkXT>;FM!bH7_V&H7M9?O#%s($ z*GmGYy_b!}?!*Jv0pr1B_fYTJ=RgkCt_hj9^jAbyypMO2!PJjdkbA9Ug!?;l$~nZubc+I;upMV}$Byn7s>Rx_9a zq2_co?C-}@V+r2BSR?XvbotNu6 zsf%yU`!Gg;6)T9=WUc~In!fk?bMzhM!vZKuMnZ*XBK938opa!q9b4V8llvE1uIDGM zTyD^fG6SG95c4?@V^;Y;s@Vike;`e@Kl+B6ex)Xu#T7EH&h_KFCUV{XRR_GTfz<3n zSD)$=DPFh!J_^+0YS(;xR@bO0c1_eae_q$`w)HVShxpsgXVL6;8wke!H-|^_T5WPk z>1$lD$YazHZ{9<*@6B`DuGRHf($9mKhY3W|^9{HjXN2Ow4Xn`IIF;msFMs=28sh?4pzzoXQ9o0<$ zibAemw{2jIdtUS5HO-Ow1F!$xc3vDfZ3Ck@!0PwY98_K3we_Xzx?TMqb$lGubs0A0 z5huk$ldyhX9sHZuYd+8Br0(+Hb%9g;^M$nRQDd}g!Ab$;=E4_&zy99*EdE|JH{q@;#RVB?6Fnr*%yls8(A{e%Z09Yg$8*ww%8- zBv9X(&AHgLEmF+|Zj=T!iSOq9_kka?a8$YaX^qO6(X^&@!{v911d0UaTLJ~N=KJ}T z-WLfhI|&rfT6T}T+;EY=d`qB!)_gy|()%KTWha3GTFdT{mm4k;m~ROb(3Al=d+NIQfGNFxo>AUSkNmoy?J^#wBAnr|C7r#FaB?^|bXJZnTpPP6>mw#7!>MotZ{&;GWxEgzlk z*NjT!)?EDEuRGVXuQ)%tXOoMe%R^&9iVmbxFGMRVg6I@FX;UlXsv{F1%1Ys=!zP0M z_vI-x7WnJ4y{QPTf3M+!*SP=xzLxL|Db(`r=5#cC`P{m0N}E^m_Rj>TME&x@UugI3 zf@8>0up`P5ewq3G_T6ON{Q~MY+Jf_o-O`G-Y9j&`m)-FX`nh+rc;}wkBJSG1BED+v zi0J1Y{cH-mE0P#>*pt8Ic$I6-0(B&K_qUZ!T^0G69CX?LB3rk`t4g=cukq@nk9rte z@`h%#_3rOpCZ^z``n%~j=9st%Y}#dLx5E~jBD)0FpQtWaw6}HI|E6BewBIoz^*-5L zIcjp>%cyAk`|S6-Ki3OR?aybi4(_%D+qsWgFP46YEDG*_es}wKD~7Y}%~ke6vi{7s z*TtCESE`~17Dhh53R5l2qB`F>DcZ%0pL30hoen+g#$zDd{boNiB6dD&&bFu95uxt+ znC9U2z$pOVl$wd;V7ui}4kt@q*PYW;Nviir53!CdCyUp?J-K6T;uVOXrC(TL*ln3n ztB=)OwWZOiQ?~nbV%46$z)z^wX$LAb0fT;8sJ9we^X`wLkWdPSeaHHr(>LqX_ir}E zXJvzw@6L~yUS{+!x)Edb+$~wA86xkQP}VzMh%Q|$HoEC}3wC%?-vnIz^h~R=mGlgV z@b4A1UutQ*+LpX0^}$?@FuYh;zMF2jJzw~3m_^+$q3XX|Uccl+r?qBOzm;MCgJM&} z*LZpPy|P92!m`W^%7XQsMltod`5tP!IaOKnVN>bQ^JQ<1avw`t5vHkRH3{1spIz3| z)d=bg>s)_rH1h~bkA(Z@iQHT`DB9@}K_+2%AstV)xK;-)YVD2V3_F@aa*5?uc~Q^` zeqsGEzW+P3b$!%seD(3GIVu)|MY|_z@&WmyKGlX58eRLZbsNHs5v@+M7BI|mcT^MS z!1C7f`QK$79hCdYgn#^0+xJfwd~o=}mN|+#qU_KI-W}TEam>wL=)5;DIOwT2n%p>^ z`c~X0T3JZ)iJ)XJDK68Z-!8ESt#7)X%<1^9r`)}QRZjC;z*@xNH= zxT9G-pyS*3?qVlBbgQZS`**KGXU)F-)W5!;dZYOIU3z9e{zXk?Pu%T$&mmaW-xkrB z*UsFVaR)M|@!O`-GiAEG6V;Z=;E}&3AtK6jYV)2mWOJo==~k*s3qoxHqIto$q&} z+1Z$86(XV1KR^0y-j3~bMD(ctnjM0LNyf*O>wiA?%)N8hsb*N9 zx|4&i%HjGwCXve9s+hDD28g-${p|%kbA0J9-C&P^<^Xe31atl9L>~7H0mo;zm>ftX z_=m8VrUV>wVH;R22E_vQML;O~ytT8mjA3)S+qF`__kslBiKVVvsv%vkd0%Ayf|b^* z+^QcfZtZRhSR6_Rp6^$k+ODiNJGmTA$UGz^y2j0jvpU+EG7OKMw(1$hbh_C8cpm!@ zwSi|nr{~bV-R(I^$6wQXRLL5QDYK)`2?7oat_zXlu&()PbBB)L$6JZ=RJen~onaU~ zNXMIL#y^@7*T2>;%|m~U_uL$Mw&N?~RM%uNy2H9C1TFe;PJa(_Vg#K?%6Nd3BH+02 zEtMKM@p<5Pr3u2d1Pq40vk&`aG*9(g!~KbGhFXoCUy~C||6ycF`6<#dkSi|&oItnM}M{MF0v?fE&e(Zr=3to*yuycl!&!106}LWYIaOUnMvEI=4K$AzpQiBH`4k@J_C>h_ zB52l)#_O^MsX6H-A1pbX)KViPiWp`sduQU!C#Ic$^M+htnHKpg!rex)nnmHDQc$px zgK=JSaFtcVisyO2jM%R>2G6Oz@|8tGtc$t>eQ8n;>gMrpr3EtXj=mlUO*4-d+#lzQ zIy){LI$hV7K5xLEXjPkS{fUm7HTKO>S*%0R;<44IAU%c39?IFCNY=OdZD$zhZuOj| zp%k)yJ#81XI1BfAa^$kwhwdCG8n;y#*yZT@6j!z6-=t~|8Xa9ZXJD(-=u4ve_huN< z&HbN-Wn$)vW!aWd_Zs}q9T)t|WoA%Msu~)OI^q!RU2FYo9EqBkE^j95t^Drfup&&= zuFvOJoY=Mc2M_9(-xXFo*2XWReY0ChV%qvq-1l4K)mEnLw^LI0aBS+gO`b=GqWtDF z%3(W3z6bmhU-boR2ADD(6Ez9C8trGq{D8xJ4}$IdctNeS66>xs<9ay z(6|Ml8p~CxI#(j2mdLUT(JXct?1ag`tX&CYKW{(sZ0qdRp&`U`?J2MKj~rKJM{h!6 z5|TOa@6^6G?G)P0IplA1HrvoWHJq>ZXPLBerd`3aPC(eNY4k_qc)Pfby)=<6 z-{EuUA2QP@L}WK{pr1}q?T@8@8ET4iPStrx>9<^-hrO3PdTZ}$_{jyo#dz{IWOnXv z57B!GN0bG0@^}wFj>Zxa51ppD!1S*DLX>AbH3%f|BV1@}f)I{vz!1XchjT(>It~X9=mFQr; zf8g@ND;*&(*L!1!DLogfs?|=nM~UlFhPBZWj$Blw>?dIVgR+`&D>Ig1vN7GZ7_r#n zUHjg{{4?p`0hpn18{*yqIbQ8?F&RE3Ez<4vgivW7NKNMI0Xl(qRuiA~X;iZs-)!%K`1)t6{|2-WF*)`@{eqRwiU)e$U~xj>DlI z(L)|H^4?5c3x9b|lhrgP1s8%(S0*$-Ja10=2D@{)OoP+C(0YV75?&0w6#QxNw*A%v zu9?PR`0T*Q|7^<4a8=l==p(PS5?*MzVKZ4y^I}l5E*bfJ+CF`tVzNst|Dy{36tf@~m-qJC23H->gNGzmT*TLsuLy=P!el-_E+YEw% zQX^ugD&PcNME*L76Ab_aA0*jY~0S-%5ob? zG)PSs-x0^ps^sf*l}R(x*c>#Ei(Ox#;R8Sd>EHNY}C;6 zrzOoBo}53sQ_5(6)?zqE=Gi9hSdiFoO>U|aARjaM?LUM*Gns#{Z-z_BHeg@T>S6hP z%l{&j71>O>EB0SjJHfJ)gst&$*U38zhCRQ^!*hsdhJak0TghJaGk zBZa{FtzNkqq|dV(8#gXQPRRc+RF^?>?DwpLyt3#{UdU7ZM+w=@qc4qVbp9$Xf15SK zXq;vg`77YGB=#|%fKPnhQu@cDW%+!oSXQr>QKSwC-)m$vgT5afLROy?-yq%5vh%DH zIKkFY9I)s}(00wMTYvvx!yBd&m|KU+>^(y&l%a{<;W{-PX+G}6u*~&tzdcWmb?Oz| zYBgcUW>PI9_W%0__tgJQ)cB5bZm*WGO>od9japXAn~v&bajPMci8g;>^t(h&E0CwlvL-z1Xg;4z&|IxJc!s2i>$Mie%pex)SS@+8 zip`@oN6y?B>2$)>#Hv-44nUF`-JGx-vSZw`hvhHd7hgZ4rQinvq^+!yfaXz8;rtzO zYb6Am2%mOKI!XBjPr%=aT!xQ`R+4S?=${)u3_GjDCD7z#sR$XvLK+%S4r2Xz`AQU% znFcm-NQ|uZ>pvYFH0_lqVJG-Z2C37so}Y~UzRZ+mVxXAZ>E}XB)I1Jl3MY)kLJX=5 z9AjPF{{9F%#b4ohwA2UO?@&b)BK8PpEVqQJ_|8rJmMAPv9+Fh_feq`Viye5^g@m3O zZZR5CH?;bwXNi3NDH9Hb09S~VK>~SbxE6ZRz=WElVHQ7=S`PcQ!6ZE+?(&OQIFEcy z+aP_nwEVjhM950yS)coINDBm9Hxy{uDYPR+E!QdWnU<`)Uah6CiR4T5)^@l#|0K1} zqLnvx5zx;RaAb%P8&xUS?T_=A%{Ny|81_@C!x4*_9OP&&qdSsyDnYxX`z{k7_N>VF zJX7OaIzB`6`5ER3lgMvP9$_ILR4r^Q7TY456Mq{J=Wba9%=hA)Dm3Z4B+UinG86d; zVTjMshM#=h1tG(KiH3^HN9)=sgH^x`(qgjB3k^u05rtcL1I^Yz6mw345(VY*1oJqp zw9kGix9y2dFZyGoEs@AbarCsEe)|3rA{aw5vae4W6c-`jcF(xyw+yA~Q)xDa3L1!f zfDjI0(nbS8t!%B%zi6A74y5EdoaHw3eU;5!o`{Ghk*{1u^4=y?R3sWI!9(NNxWZL#ESIXgb16geZPLzqzlC(1(i?MqeKJ znyyrKvB2dd^mQE|1f(QD_dnR@J8pD`hd6ZPkZKxd9Z!bwRNuzoxruJaJnrk3NGx9L zw*wCQZja7+_=Los=-nFO_G2MgSa*;XQbZV7ZGWj_o(e?p-8#nF@~IWfQtwBG;MvrQ zL~@V}lKH&_ADW7LA}W+$34f{n%$MkYi!MQsCS4$5;;p+7>XA)WNn}1fM`|}Cj>+UI zq7g)X2#2)bs$&qNhVew?zurMFH6~;|jjJEsw+Zkz>jui|r%l;|32$6VQ{)dD&I7&N zve+-5pOsFX6aJ^PO9dX2wuDzPRa-}(=Ty?jc=TU}6zPT+Tp$s&X$eD z=vG@q6?_Wa5pplksW3`Jed=WkwQ*sX+<2v<$_X~^zoS&iR2?Q~q^uC1UrN)|5rUf8 zezVD0q?#=*lUp}wFX=@L>QfS$RTRNR=a2_P zMAy6`3!V6^mbN0M`g|+YWxN~!n*aBGl6NQAr*L`d0itsbR!gZYUXz6a?3uidL-btl6?es;=aP4y z*wsdI(krr=aZr3;_B;M`pGl==a+(acARu|5#lE850N_~7!m#s!S|J`8$74A}+)F&A zPH*|$T`tCE_{uT3RzLbWi!qCc+tyGby)P`97#>T)-Fb6#e^=pseNaCff-PYaC$d{y z?4fl{rIxwywt2YhO_j`kO>ueq-C2c}y)n5avK=qdeseqM-l_vPcE09_`)0%n%ohv1 zfQ{xzBNMT|q3M=;gGeOnh4$R(aIq232nVE=!y(>LzGP;#59mRtR*gu#0Mxt{M#YvV z8E<(AcF;I2!W{SZ`J$WJM>jo!pfZ~8rloHPxa%M2gX%CVVjBs+4Oys{F6_1GZlJWw z0lRyLWePoMWa!KT5Z`&JejbWF8eqKAdrRAN8Vj7>%Up?yRuLmawdo>3A0Rg@>3;^wyQ02x3ejo%=I`? z)i~3!hlQoS2n;m%#vZBFd7>Ocr_PG(43UnZ_jZe?5@*={4eI29zeEW!oYHr{$_yKj zpCt|mA3EQui4fNcseDj!O(j$HF_txXjqEVr4l3PH8K765#M7zcBKOz7=iMOEcc8^$ z^_rEuyIjZ9n+A_;zl1lgA%MmVatDBfA$VP-U;j1{v+pZH$0yd3#&K$4Z6OP^mBJcz zlc`vp-Q2rB%nx1owcy4iL+JY5^^qWGrT+Gu*(`u#SdorB&fb8^Y23CrlqFnKKuc$x z?fwCDV=5Vj6@-pef-*dwKWj<}D@2pA6)T0VU0!DJaidZ=2X;@2{~3D`p6o8vN>c(7 zaKz7!EP!iDk$)WkAgpoF`}eNA`7kNjZ0dx8$N}~v_ub!LYpn8BACYKE0Ij8~x)!S+ zjZ1k!R~y=0VoRub{gjjkf)>}RyGF14TEt_YWn0HKDjq=!+ z0;gNU$)TtR3-yBCVQYdiv!wU(gq*Ohx?B{ere92okEXw9eJ=KBZD&?JOj73Hei4Cn z)+WbxhZ;l!*ELX;xU!gNbhDml_4QQrQ~E)H=Fo*HND!|}^z12ta{$0{8$4oZC|DFM zXJvBo`#&Dg$w#!~?)BRmnxJ$pS{(f-H@pmnEyqJeKMco8B=f1TbJU>3kMv~;t0uAh z(>SpyQdYGb`fsXSo}xyu!xUXF=|(koJ~m)UFV;I5yGR{oVS;X5K*KMRK0 zY7MWSSmU15wkY=|63OOep{@9Jwo$l|<>JQ0l8btj^@n>L%*%T8#Ow$aWvve??!4Er z$bbj}az)r&VSR&cd5ZHH0i8%SN+nV-AD7@-#^8xk7PHq6*3Xf;Nk_u9IMwtvB>2T& zG2nozQ#e=Q4#Crrb>SDuJ)z&(CZ_?X7 zqO_f{CoZaH2I^ynmzlZX*rJhY&~VktMsj#P;R?nl_RuG;VVP&~Z{GZ%->rhBp)pGz zTuIX;Gm6YD1EpZB15d!9`;D3;tukZNMm}`BK+%j>J->M?$|faQ;rRDU@Z-jS4@ zwfKrkHZSb-0zeV(K*=Vx2@tW7XL;zQC?t{D<=B&SQ|JTczd4f61*gf$<5@;xB@iY?YUhW`u#?(T4^l$Y;_K{n+A!C{#&?%_VrEN16JBrjHe0K0VSKippXb zm8xFyD3_D>KvJkQ?Ft{iQs!)ZHQ%{_e>6~9-lQa9&57fr$0xYI`z`NRl_!deu9`lQ z%r8+gR$qs7HXx_)HHPvQbLr&434NGq6&af{Vi}h~0a$JPaS0MB2zeGQtsv2a&~nvI zkMxrYW$K>6n4RM#bFJJ|;Zi3RWkn2`jG9nY@w3T-ms9h5A&`hh+#1>flU5FR2H-zL z;l1kjw0P$g#~$4sp>_2nPaq+3j~gq;K4J2;PJh*}F!+>$YNd zQlq7wBJWpevKQ!5tcQG`MyHzn5=xwhNnVw;6uwXl-0HFFrL-o&S69-3=uthR)OW`bKRo4p)!A@NOh?SJd&I5Bs>EfKlrC8b zVdn0!r08ypMWwy5LwU54bt6P->)kem(imMQ$vyD+XyVCL@eSNKL ziA$sPWXr{Dw-%ItslZmD^Nq?~6HEpR+w=W7I`Y~47$r60MtS)aPTRtMz2Ll{KjZ%Z zW(->+O6~{q^pqp2P~=MD2B34L9ToX}uBHpzCg)BTVzbpi{t<+bL4NJ}27hd0HrKpL zmH@$Mqg==PO#odKmi!}C=bkBYSeF|ICd@n_GSA{X7AzrJ>K%^Mf)ywK7jF?swKDOq zd`OZv$07TJ(oh?Bh7aGb@nG~%Xt?23-fHg&*`Qg3<2;6D%gk&M4?RFXHIk6noYeiz znUQanAo6i}H~J5%C+~kHbrZ2DS-g$bOsC@)3H}oqVh4wX*_d=s7OqOcAZhiVif&&c z-^B#tWygiPf*vaf!DT3ov*kEAfy!vb%X3|_^T>=bX=fIp+noYNkAhJFQkiR;S!)_y zf;e)@PW6RqNuzu^%Us%v{4Uby0z8H?8oua;rDEq#3b1?^gO-yx2A1?8VgV;JJd@Y? z%E38CrD(5+5E+|(tQnIZsV-75DdWZD&jB9EJ?VRB!(lh1PlJ^K&Tvc&qaW53jw%-@ zLZ!DVSd?|ak~eTc@9Rn1fi1QTijNGsNRIEx6811Y`DFY~?S>+nc!Z^UH_6KR0n;|T z&E(5hFHIz))aB?eLo~;emw(&EXVB-*FM=F9`aKF;U!cMS=~eU&!M1T6I%U8>RQb19 zw%l#Yoa@QKqLk?6QofutaS=WdO?%_zbs(vEwUtJj9~v)(An*Shg7*=Wq8C+Ms~r{g*GinHX~YDw{p zZ=x7Ps{8SILzp7uA+yfKLSLYs+dl zdFaa6PRfpwXqMk&=lNFkpmMTo{?;#YI;V4+Y-9d=Q!UJMO+2yNjFYi9AF`sWO*)W- zEdtlO(EMv61c`li6($&?+_{Zm@I=zE{MWDY*?!V!!q_OkmB3}q_eAd|p`>wz6;c;p ziEn#a%95^Tkp1Q(G$ACi;YwHtr#PcPmseR!M0m) ziCUo(tI97jwUadZ%sA*!pVK?O8ZJXNsw_tkceo~)lLo}Z78b(?ruqx$9C;=fw*xz1 zvr=>UFY>iuY(G~{3^hLgeDttapeEP+(8;@=R$j_?s7>fSb+sTiN<)6{R-)Se?sh{( zYbdRIf{+ayqR$F$>_~{-$Z>9HY$aynFtThrsA8Xb(w;vtK@$R+yza|1yQcTN_aHq0 zETWsj(ZVUL+ae!NW%VHH>pRw^9&6IU$a$^aBmYX|OAaC0o2jTEGt3gCsNs0jSzlng z_Ua+ZcF;E73TN^EzOBKfEOBV+Vj3!yR~`lYg^v<@Y*ggi$zlyN{K9-3%4aY;Xd$^+ z+oMh$`jdk%c-aqsjvO>#F)=9>25i$DOv;*?u22fZbg6drGmuuguA`Cx|5t5sH8Dj3~tL2KXZlt}luXy8FAZos zHmUPP)(gldjWqrtaYUiepkzb<$jgw{((~VJV5+H41jR=C&D88l#$)p94 zqEk6c##P_t?f>PrRP6%+esTzIz7mk)BqFQy%)j z;K}qP&vv4y2pk#MPic>+$TR<@ z(7}^Gxc0$UgQHPdzpGcCdF)NU{9UBG)&@xB;WFKtr`uG7&lVhNVv9$IGx(LCNbj6I zM3d&qqq-;qV>aK4*{U`})mNj$l0Ahy zWQI9?sqsZyqNDjJ-gN_YW}~73cYf$3xjdH9w!k_9L3m2SC1til(+ZX-kn%vwApQC6 z(DYFM_c>JomvBrY&HtIlz`5hG)mWbNZ_;xk?I#rXAgcU5cczxhz0Uj?|cBuIv$awETpswvH@U_PD{AXW`f_#JnI+xXTBJt++) zcWQw{4;SYQ-d$~OfhH{RvZD)Iaxw4VL@=1dS<&P6Y{vMZgC5BWxV!poNY>+7xXo7V zf1Ltx6JCp?N3IuK_R~6dHiQ9ue#Ag}`O|aR@zNK#fl`|QslnYx;r1Si?PS#Alg6$~ zSIVpXwuSSFyjud|Dlqimzs!_H=jH>@hF8bP+p<94<kD3d*d?f`WZN}xbDy&qX zQCr2R%9%lV<~=E|3Lu_`z|mkMqjalvS??W)#2QBJ2u=_Ix>@%%Pdp^zDmBXnZPjw{ z13KLF+rxJDScFeMiSobNOsk&r20ddmm)!AMr%yj^L?n>{r8f4(qFelf&xg?j*G+#k zN8Dey@Dk%nvhz%jZ*T2LEM1o|Y1AlKkV<%R2A^$G)((z{_sotIqOZWYp~As~s=AL`_x7jW zd4!i7UmI}lOjG#(fy-{^-P!(KDsL1?u zSTHRNy(p$Z7Hr25ahfZxAyr@MQOln%+q~taisgj9OFc2fnSE5gD&I24&NaUGPlus0 z@qB(0rLsHpgEY2p{ss5TO^y6V$hBer98ssa_k6xbt@Wfr&Uv(|I5l&>HwSz6!=vzG zk@)8b^B~LXp}{z9d*#jATh|OlA^wtlANZ7vqTbg3^uQlJIA3rg{)*vgoTVXgwSmul z)^@oT1JmIBAS7Qx0#6jn>WHy*1J;$a;}5v>a_Ma44Qs@iBRIw>{u2AGmrwo_WW23g z)8v2+(!Y~H2G6j+g%bb6Gdy_y7{m7bkA@tLMA`c{(RlcjkH}2Je&K2M^TJI><#3WI zQf{fVWz@t@LRU!@^~C)yo#B&QrBwklpVg>4DDfG|sI94`q5I3UfvoF&@q!gCzoTuU zZ3&jqaXuRftE8bZ5It=^YHMBzAHao$jIr2sWZCwwAw6#*fq#0PoE7N7#lKDgoqDYk zwKXKi_c(d`bX3v_G=Tc_vxADzsYqqvC=RE~)Xbd{5b?~RH!cYa`@_k9W3tkwC4h?`TqHxo7OKSA$uHK>WKI#%Kj?#u7`BcevDA%0b@*f<=KS@JpL*RNJ zfMzxbF0_ikceUnZkC%2`z{rcyTMLvmx%Z6!Cpj>YbnNT&I=w^ymH+0|~ z>$Q(ZJk|u`Xc)>%mcgNqygm3IrYJaiY$hK3Wu(Hc1^b0&H5H1iAT7~zY%(;ptZs{P z`tM%7Kd?)(@5v$ltPqK%DsoUe(XABv7>hzf4-Yqc&pj$o=GgpBS?|YzyX|$%sUpyG z8EU^1)e1^M6tobqVEI@`(okY!zpDMPBt5LJvD|W|(w6HxszR&C!c@_a@^6(DPo`Vg6prTYD^mB-_*plZ zn(Vp?7a?iPH-2bCo;lZX2X=`M>%97|3l(}|#=Yibfleklno9=XG|WGx$o{D)C_=I@$j*{H*(Dk%wIIkXfF zftol_n#RT`t>FH8AB;(0ji90e$~v`3+ao$vamFU&HbLVcBQ5Kc@%WVS#SUU(#wO>R z^&!w2c$r@UMv}0Ud`n5J9{sslJJvle#ZNq2XnOSV+m5G&pdR;37I@6#_vko(k-`qp zk5(4qP=YE!T{bcw01K09kWgOLQT%7o1$ll0OG%Y9 z$T53_MQ6ruzZ15{OurgFuWAE2xFOy!Z*eco(Gn1^a_dCfX zz_7?78AR}e*Q3?G3%$+u9(G3$d@zq#G6phJa~$ciKg6U}3C~cQ`+{(%kjHR~GEK=I zs@pqieKhQO*PE*0-B&n!Dr4j2aNK-3&=P3Jxmkv(g9NQ17Al z!PZ!cnTo8k@079}s^9oAOJ(__(lxQ08!5s{Q4F3bLUsEpG$A^e4Ft&p=`8S_{kruxoFTIGmqkU;8=c&VGvm(oJC;BC9zV8 zCbqo&WN7eKO0K9BjjKtIJ2aKaK-un!pu#k#5 z+djtr&A*oSf&%r?`@Mms#M)Q*@WNPcO@|s8=v1IGV-&~UQqKs0@wxMG)vF#P#M-$Q@`B&kFtq&(erg+gHLB zf3Q9&2>0maP0q*t8jDnwSeBj@<8|Y#O|~rWebY@^)`m|5cGd=3_+9MTu$n;@VVW`B zR_QP8=$+qO<Zfrk zQl8CyrIkPtR%^6T-_3xoVB=BT{w+cND`2^jBr(akW){W)-x;;Kf@~2e7iI)_KTPJT z7kP@x|B_uQ&Q9U?tUsoD`F68v(Rc zr`i%m7K)<)K~VkNJK4`vq%U+A#(r&MofYq~ktqK|aV_0yATK^VoRVZJy;bCu)%n_S zQ|L}q4}Bwx{HRnq@^rF`q;1p-lQ#U4MTpL`p=2}i$$!UTw;7=r8NO+0a5bWw>my;_ zmf_5L-tuNm9n$ZH&iTNI-!PBu;AL{4SLO&fW}vz8HJwfCbLx;8PD*vOEfl@XRF7AT zjMM6&ZFWtyqiJF(s}5|ekW%xFFDDW3?kvQEq@}rRf)73w+x_U@Hu|ICcL&HO&f*J@ zH|s(I2f*J*gze?`Tf@mr1*mr?V+|($MKzz3WJy?K=M2^_(E7P_$opJpdMUMR3OlT9y)aj zYXZim;+cdS-(^JH&pCKMIhSMb49`AtB#*XjJn#OPrUX4X=^adR7t^?na9_k=B>$O_twNdcwdsP8(umO1*#9}A?`tPz%_kb+P`|GpSIXjoq=cF@(x zDPG%dwLtdt>DukPaYbfyW@)d`AZaL&-{g5<^iuJaNaveEMG^1mG(N)oafYIKqt%QD zb^AP}y1#t>*W;VNi5ekhWo!~sxcX6AEP&2T!!2p0+}W%!f(@6w(tt3z_xjfWgpNls z{48$rjS^I&B7bZ78Y@!hECmoVe)0u)*_@i7WG4IuJLiap{qlxaiMU7^FX*^tJI9x4 zVrO>0i$2lZ-sgP(3xxQL3Gdy}zmoZ{P<~K?wkd#0D*Z#pNVYC&t%ut_fpRI$%OI(& z9axJ&ds25CNgtPxm9Y4o%7|?0Q}NLhR5vGTjjaL7`RvA@g=4j0hsw}<%PECoc<{m& zmlCxi2}(V|2$4r4*%~YkJxVN6{w;I}Tri#Kl`M)e`B;soh{jRnV)(LAGcp`$Znqu}T7uur4 z--igi%9}CBE0z09W=KJbXKnP?%euGG^TXcXHN3N@43o^^aR%KCi}%M}*kL>8paZce z8U&5iK$`);X@Cdw!C>|KuUKTX5g|B$&C zIef-twwpxcF2_0wIUzJ?A|||(AV_mIm;@VjmHBGKYV$9kyH!}SZlk{7b=DZA9c!7v z*43Lqzc+X#ssFaI5YG@@KK>sBdf?LhBFc_B75)Q;G)DiOi;urSgPC@^O(PPw6SR-l z2X`?y+XfwtHIqyuiP|ZN1ia`h9%-X9E}2+Va2f8NGxpS z-v(x{Lyyr&n5Q$vMGiHJy*_fxrG=~r#m5~7|0C&JfYIb5ixM=<=777JU!4JC07k&7k!_~E%eQ|~LVaE=oirLjN` zgrw(y?gVG+C094EyR9B1;#>gqKPPw8Kn)1^8Uc!vEO;sJm);r01rbHbqyWL(}kd1F{9WV-`VW8_%BHi8e}0hG%tC}7C2iE{vgi*_70Qon~ z49tiKaZTuxI+(c88;Jf5+ykFqK(pjg-Nv~*ri)w5G_r?z;B&9B?IcJ|vBZwQtJt}F zGmDfC&sD+neg-5|&S&*7mg*U5M~&FI5lK$%-i1Jnz-m3E>>NJ%gL{84PZK|WkN;GY z+YknC{WGroU{Xf8_I%ZpT0CO)ac94zPvV7kT~iBwc4=L)_Qf)3GO7#3Vk2Ml3hDIAkRXv`T4#|q)?*n=0~4)QKn);eXb#yZpYu(2<1coiAp zi}mZ$L0)*{JOvRF`Od&y1-~)`EALqu&g9lUJ>HTVAa$&Eqd?X4TCM8D{_tR`G0m>4 z+fXc*ZOsSH*Z!qNK$ln*spY<1^4WVXT*6Ek8#nbG@K5$uL+Pe%H@}r%G)Rvp$-?Mu z&p?OxeB&H!K~w~5K}1(~s*cgeKZ#nc5~GlaF_#*WH}&QcrNh4N+L<*+)Bb(BU7%1~ z*EMq8*qs^~=4|MtBy7CN;WqD0|2G5VvEaA{?Op~C%CFD4Z{N0_Y11~VNnAn3gBYLd z0u&iMW8fCsq0$Uk6ot!2$>zYG^LszbDyCJEjj;kEXgkiJ8^rfhGvc1N4R~(`1O64>T{{AGvC9kf$P2hWd0pv$aY=J;Bnrb|8hn__ zTiZrMT=x?p>i>d6SweU26dBhK6~j&bplJhDyxuShc(8Lv(+>79PXszyr6`G8Pd{#2 z!;1^VGc1&otG?dK-Wl5fnYCUsxfvK?CU_0Uxe!~^)zNrq7HMo1Gk5&1*E6Mitfe++ zCxFa$)Zee&TE>Y0v@?DqKi_rw8NY=RNGoUCrOY=GBfk^bkYvm#LQOY0TAK_g=u}n(^gs%X)A!&2-P_+;{VU=ICny&)2Vy z98tOJv%i5m!l?5pmgs(E_tB^Sy#gNgR5V{6xWf5=uFwjRf2NeBF)McsruLYA5N{2E z`L|LQ3!`l?1u*zL{EbM%ltYN)jF((!am7xG zyvBcbd64C#YbdG!8%AZYg#TZKA*5&Kz@3mB+j-wCas=S4$|EIcRD_)@nL11v#dqnk zPxa>tqu4n50-?Gv?N08r-Ja{yid4fA){`z3&kta~If46iLvEgvEd0;kv%NG2f-Qsm|GcyNMI9X` z3!E{;FsfW6D$ZgAhtl-1jq4lox%ve_^d;Lv9sVXh4=rP{;gzR!e^srKZVnsNfB4M* z&pU6rAc!hCVsj?F49^+$s7S*eAU>_gHoAskc^Rk|$@rAMZeX)Qy4eyu9%By`6ef+ZNcdk2zhBcI z-Oed2>H5K3%D9Krs@Y&kNsLKSG1;%+vD|`BxdEDRS`>!mZ50uT7r4r0aMSXT9icy1 zu>gX{DTjMJ23$$p^%JsOpBA*F!6b(drw6q+#E8^4cJxNNeX>y;x%oUt5c&BRn!ILB zkmQ=rnw51Q(svYUszJ3Kp!MvIPaKf6{gNWLz2Ialy{;9%BIiu+>q90_aV7DBYWHd- zEn-`tIsV_J4g`&I&VQ>y^N<@|<_F}+9W6N8Z(M7@smuh<2xevx9$7aCCgh@@J{}DY z_e#>tj68hLJA!jY<`_4$pa)PI88{&tXoUA|WXL`|$ek7CCn@0n1GHJLN^S zew|%v*3Odug(0_L5@A^23F0FZ27!(#B3R8l1tj9-NBX!|rCP8UJhO)jvBIa2KiScU zoNtCdB{loDYO-7BjZ0(i(N9FyE?cdFFd1L)2hkO;YYFpKgq zr8?d6Fg(D86~n|@7qnyG7#D_^`Ps(ZunEcyMtD?_jHe7T-Ghu+^J?NipYku0Xg`7{ z`d-yesPdvxLKC{76@aOxK= zH`87)+d#95>sOFPjX+#s$~?Plo{s!Dl#0r;66=uc2Q}vgj8G@uHktLXeL0n<_O}4j zoOa;3(%=OWmTea1cZN;QfU6i%J{xtjqhSVr7LTtLd5Xv zKD`FGWq9n<3+1!RsD-a6K{+I$2`D9qX+Zl?OL<GcZDJ_G zax=L7dxqZ{0nEhYBhaq4jGi?%oAL5AS$3s4X5$;Bxd`@e*_H2|27;Cu z-muvTA)oEcARSTRelq8~!u=OS3nM%nq2!5Aj=>Dh2pynCWtWuxg$B%-TZN;-UvD8G z;2uAGF90?*2h$+H4hkxUX0eB$lqDP^y^>QUmCx@A;Zih}ja0UoWHL+gWoVq%87na4 zRLni~`pWsv+wU8LKll*N_M7Te2!5!QwlY83A59Z|%mx$PZVN?i0`^!h1MtlO9{|P! z^C^sR9M54Pd{NJ1MC6MJI2S&@G?q^G5YKIUtwm{kQ}XMhe-7hdgV@=m))q+H9~Qsr zKA)l)Qx0ra8!t=D(tS8h}-Ra4~w@4o^d!B zpy--S%WZPwG6Sc0rWNAYsXE3jxc5C5*Zy8FEQ8c$MWzah6Z{lSl7xo2=I}Ah)I9`Fd|8(Hmit?AReZqB(chXicq0#t5>0~_SKP%Qb+%Efb z>vvKLl^pcHXJ1P~bpm|;8hssE{}1tga9TQ zhTt2vDjAb==euCCJQ=wUBo?DaOGWtg%Pb*{;B_!|kSY~;CHvdyIsc2mFd=;oJ#E>* znlcOlGy8qPQT7n z^5BH8j`$9~g}`z>7t#c5-b!@Gz^1GaC=@EMLV4Yz5uHX1oF|1E`Eq!oya0{THWi>& zpalK!DN0dld(&D^r>=;M!(L-O`k{;CVPSHCRbJl_QAt#%q!r18oJ|<0A0n1@;$T|w zwlfrcs~ca9U6E%?OI5h%K~DZ+7nAyq)h9rfW)#gtf)X@hv>vKplI$@unj)aJ2Zvg` zPlte;X|qQj82cL&LqB%C7!}^8;05#VNjQ{68d+KjoP-`1VP^}hK- z(>DH7L0=o$F7o?>P$=Sg$UYtJ_-(G&5Abfk174lbiKsrxmGE!+DC}0$0R1r02{aUJ!7S5BLG;eNDaB>AX`oHZ+W(h^Dro?DN_9g#hl<`i8ql=)R{TFjoQosV z>mSD%Ds#W37^bq+kW0+1%qS!xCHH&CeaVpf+{uy?$bA0l1G|>wa%b;a9H(ZcB?pF?;oo)%$O?j5b#NM+`%g@)hJATQS+0 zpzRc9SOe}KU)>Jiq+J54gbd9gGgAA^D00m9elvqSRQBuZ0BE;j663;Q)({A*i{cFh{(!8-Yrm)raX)QzRHt2M5vj( zqyqrIS;-?8f1_GH2oP|id=NHHM1eSjvjyeNZP?Er2lUI$1E&rT|7}3SX)PXk=RN59 z^8Y~CE5U7+X~KFi2XIp%2leIP{XLR_3VBjF-N1&rJEMAdc=$AhO{giulOj?>*&n! zmfw^Zmk`t=Rv9Y>#K=4u5Q3Pi3Vz5g&@*}xzc`TJi&E7X9@eI?k=Z-VTJL-nUP-dE z{kJ4RLfe4N_e&QqsMB9o%cK`4HNZlgQ}Y2=id#|Sx=Ao#2r(>@mo{v?XlQht1j!cW zyAP5q3-F07fiHOz$ycVd^JjRsv&o>}Sevj901* z4>yZk(Y54%Q!mwpvHQ#ETsw%1XFXX=DGKzPRNoqn}C{6 zv3eVL@%`B#$n`9kyh-BHlGq1b_a0s}U*Zz9X^**+p3FN1(T@%AGn{S-Nu*=-Boc~N zR9+U|V6ASbDEqGV;!ts5-(3_TUHI8WPzPF-aLm~Jrv2m}@mEqxP3-{lzc$t}yOW+$ zKhJJqphXu_gW=#TG~+Xn8|Gx2afo(N!;O zd&PzT=v02j8yCp2E@!no&fhvYA`jRCS3k0v@R!psuESFs;^`kpp{EP3_u2NG>aBRr zx^DtH7H*T;9%vwIbv09ebOLrq;47X;^}#i}8G- z758D}YdG5bY00+-T}M$K>6K>r8qd#N2j*Fy_3wlYK$lV@VrQkp7lbUWSlIhQ(yACA z|E8$_{glvX4p8_9fL6$yieIcPMI}f*QufzDSEpMcxN}=47Qac|Di({I!m&m8`7N=;PWoP(WKUVU~Fu9s2*k-9jvJ5oibXxZ&0v{ zEMOqE%J@Tm6wGLL(-G~f0>vWyt}An!?(M<*_|>V1rmZ_`lGOB~9vZ^K7u84TMmk_| z_A@v_o(&(#mnk@G_vgh}t@|)ST#-W458@u@{uzc=h|uyOAI^4WG4Oda%`+QX`&JXt zUi*uUOtMZ7e}c=7=s03attff#YSZVvp}^?OjD_rlAFE!Bz{&)A486C1vu3L!q;CK? z{jV)(g$21F>~BC;dUC9H7^`N_%nJhDA)-U?r0<5oSVnKP+<8c*73j44Qm1sZHzX%8HV8tDPbG`Z@czhn+bb zqZ3Wy%G^;(i=st)tr2u^R-_A$+mxtkMeo4*D9~}u#p!6yUP0!9T11A}M|=^yhU8nt z_H?zxqKpqdOI06jEdINFwT%=`23ti4m_itc3D@cl4q}$cV>(}cDD4~}>&H#KGP4CF zJzU`;BP!usv5t}A=T}~ou%Jk;854RTF@j4`l6C|`39SwHr&Jd{W5l%DP^1Z5=QhTf zwIM%vQDx9h5|>_DvK*|EZBpBzvjOv9ZEsO$8GWwUeujH_<9v{E_zeKH*&2g$B2hMjeG(6^qYO>os# z)%vb?>GcT`c+|X3-=h`k3@hK|fEp*QnnrDFzR!eQR?teWqQ69vCFmXonwsCLTxvk^ zcVCy)j5%1)-O@_TOhqvrt*DtjzOToqq^rh#_NDXS0_9`Rxh++4NRfBHms$`B497U@ zlu3tA-~C%BnekzNYY0IDVmcDkLL3#Q6H!4bF8dUw8Y5EO`X@n`%PLf89*jwVHrbHP zijOp6RBnpf(2gm1tCu=ExN~V^AO6&r4OG;y?%RNjhE!=CvY&Y2F78KLD@p8W`>TQ9 zwxc$RTPdL)THil*@belg>?}zIbc*rT8;bwt^AiSMK zEcC2U(yq+_?+6S!S9KIWRco$91IuqCVq5;`8;ix-Wmc+it%;9b>qyX-&5*0ec=)s1 zvzF<$@HP6Nbxu>fp`SY6j@Hnvcf_&F9j_!!d1(!0N6>BJtK!xz%)72A8SAjtF42NsC84G@4b9K#1CM4y6BnII zhdQgzFl&o#%4yh7BhdSOhwW*pbFoB47Eo zHq*fOYPNbf(c*m7f?)hw-a5EpCF>~>&m@VJ2gFbf`H$Du3@J$CGvtLEq6B>3<6RT) zwWgFrPf}cYz(o^y8PSx0C}L5S4D7Wdnf0=bFq4&Cb8|z3mF}b|UUqotz%CiNI9opz zN)@&_lH2TlvI)wKtDN0RJk$zNJq6#IWxA9rBx|V-s=!I8q%U>N66W!`~dW}YhDWx|e% z#R)&Re|3e|bU>HxjO`_D{`l1lReS+*6vx)tOYZ;0YB-S%$4d-vtOnW?U-@^gvVE+ed_pgco literal 0 HcmV?d00001 diff --git a/website/static/assets/dab-overview-3.png b/website/static/assets/dab-overview-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e023379e8f3a071fa55defbcbf9db18c7879ce GIT binary patch literal 34767 zcmZs?by$>9*Eb5|0E0-EBHfKBNT<@$H8hgaC7lD((k0zUr$~27D$+T0!vF#!d2W2( z=X<|%uJea7*Kl#~eeb>YTI&}(Tt!I+`!U&L6ciL}IoY>rC@3HV@Oct~4*Y)wCUrqU zp+=E=E1}_Gc#w(FNF;S}q0raZ9Fg}0U*pLaDQ;7!RBw3zs_KjKXEPZRs;VRSeUPxm zFcT0lU0?(%{v!)1DR6H_AL7=3plY@#Gqv)l@@O~Jd(ZR8#e|9bGh?{Y%$R6s^=a1}yJ|NGScJ`Xk{@P9`7pYJB|fDvtW-tVdq z|9>9DfZ*Qhbm+LXuoz9_9T>0bxDy<>@3_BfS$%cYd~rBGDQzG-vhYqp=@^W3Jbw6cvApQks` zHon(~4W~K?%cG|4y9LXx;}l(MmS=Rg2jjwLBd-STH{10-hM zUl>oW75ICuD@SGmNb`UFl}VZlo!uzvg{qF%tVG=%wgQ$JF!p2C7l( zBnBT<&u%YQQl|JMmeh}q<*$Y|k@CLsna|ta)_Ij>RI*(*P1&p-KmTl8dh)#DF)aJV z`#?`%+|dPx4m(EWEL*>;T_&2g*y_R*!};>MF+qz3y9Qnb&ZYu9iBDWyBprt<5Z>#v zVXltB?TpZlzu2kQf48$Y{l_S7U?~0celKB()~{;HVH`11KkT<}htrj|}$IS|`_ znPUjFe*|})Roi#mx}ELh$E3aQ33ry|ZMTlyX1n%w9rI4?f?V+C}7|%JM zj9-MCVG)$TBY1`5NQ``(n*3sU7Lx3Ln&1(+b&aRWhNs|<)X}+N^NkLE zoDtYfC*KKO?L5QetjuGlkL9e?w6a7kFLxcgqhNe5AxW&yoF{y6-xbU>5bEv~XvWpZ zznOLc^e`m zP?${{`QMgeexo%&CMb*IdtOeeE2myAdn=QCcuE$?(fX!O7>9Ew2n*?dvra`z7t|sl zkvh;~ESGKYZLW_xlC!-oQt&z*jY^FC`OWA1!|j{V6E~+1{xU2F@JlH#PC*i>oN4^( ztMqGe#>AJgRV4wUb))DSRv_xtj0roQ_kl=>vpVE;RxonRW zS&nBlDOJ3~6z22ZO0`VOeG@u_eP)a!@<&A#VYl#|7jH@aaKEY}OYy=*ieb&9OAhZF ztBlT`*2Rmi=G@;aQt`Q~6sQKa#ta$@{K_2Kto!pMjB&TLzgM_PFZp4ENAJ z@xL*wP+3cxt_Zv9>U-z0ipo+0V&B`up&a&k3w5lZ-sNm49NUKO)kud{h>@hL31OH2 ztT_sm^Dn%|CmQi34FuP$T@{AuAYa{m?O-swG1v>;hKXCyjN)$G0Lg_<{i_o1;X(sn zx_xtr)l6lkj_>)DrE=2civP;zr`(duu46IO3(mtFk$>hbM3Ykty?zLv^b&4$+}~Eg zT7zhWjNspXFs2WJAWZ|3bDXt-SiE-@m1mr@QmF>5Ct_zX7j#mWt`1Lo=w*cowqHXp zfx_UIZY{quTUBwOeq0@74py&OSSBv1m3>Uz?^rU{6^SzP$Ih;%d%qq!rf8g(|e{JM%AIdm?dGiobu200}J;}oKZEi?kj$z zJR1RVOIDa!Z0tsd+!-@NXE}w77Y*4?N?CSLH;e%jbB&C4_6v`r_kXpNs7|ti)S*W@ zBKX3%rdY=#^JgKhP!+0E_Ah5zoC_`(Rrsx<*)HSLgLssBEWUP5rgz5X9EFbp!9TNl z_9TT!Jsf&&<)5tvZf~cau`8ToJr4>DA-Sfs{XS>0)kkWSQNb37{vFXmadj|9 zlsG31Q}fLe?U|Y;J7zVgOXQPK8PItY9J!2jiAi?&^U(OfWRlJDVBKW{e43}$^Wv4$ z+S^~=Ppx0Pb@=v6y2z-*&msu>^`QQ?nKYcM6(RY%#ofWvDn|6`!&#O8?XYdz`LxR- z9txU)sRwE~8^*x<%AA5p;F-nC%>w^{EZoljS!hHi>DOS|36?u>2^G)c3wP zM<(Z}L0GHd0^OgQ<0T*aVTihkf|ImVay71=FP4MK%?hjDE~oD6=M&XHL}g}3xCc zE0urR&nlgjyDXnFw&>%6$QTzcC~*DkF@0E?`gzOsZKlgpN9uA$I4}8x^6_|5+IRG- zG51Q;{1;qSr7@Jc&}0RgdfRBIsHZnS8nKAaMoGHkQc|<|}B(Yd@ z^?3LsPX3Df#y0ON`AXFKE=e%tZ*NPN{#%?m%Td~7_l%~Xo325}NmZFtnl~X~xmUny z;`bP7jS9gA-mJ z#*~xvkn`2M>tnvEwu>~VvXJYZ8F1L1KSJ#`!3vj&#eVvt)3~rCMfzZjqhZmc66j#! zTn|L61Lpj$4}%*+pM$7|DV_Lw334E_b8rEe0+a-8Gb+ilOH?a4NsyBntD?5f`S(y` z&Is1t;=aGT?C5KDI&Qlh z!?6uY^hd6SZdEia#~(w(>s%kYv+~LYYm%qtbh0y67Cf(;(~nihK5#mcn)^u$!|eU; zcuVNi6D;AQXVbxtBtl%DNRF?iyHiPGr5^vv54Boqu4fOUDUQ_x!D_#~rBCbR#`QX% z(jJ|&%;s=@!Zr-ld6rM)?ldHv-(mRl6z*(`(MYQD!P;Kjm$-}7^Pfmq$iuvY_3@d%PtnppxpPd|qZ zsEvtVUmV)t2pv?r7)T+`?r- zjww8+86JrB30WsDb~;Gc$5m}UoQ&2K>CqEVU1uZv1h=47yUK8DTF-%)l$NYLW>KgT z8;N!nR3#+VNH*!hR<9CsHA0X9@22&5hq!k3#|V$YI>AinM${|BEms%TP6~97PbVED z3vou+E}Z472er&5Z9y~IFRm)FV)>=R)gl=brVo&89L4(AU`$=)7izi4E6zo};d{2s zmPPk-c5Umw%hb13t)~&5e>YPYx-jeuXAHe7p1R~cnRYr_z=HV$ux(^a=$Kt^%a-N0 zV=fH>TS^&^G~zRyzz#sQDn<}-Et=}rl2m0v_6&oco;$Rv1{&%N9@h*|n&gHa%*gj_ z-}e$K6J1i1&-I#eR+&sBh%4idHjb zzdN3y%ESw^6l&5e(|XA-#4IbcFpM0vZ(I$j)ht&8)_so(b=g;zVhN0<~;vpCzV zp}WTZ&+w^q0a95!d-TFj1)K}`-e|FcVkWxRdcSjvX7PL<`7tQ&MfV-&+h!1o=%7LK zM|=g#>Nw0Gir80U{5{v=)x`w8A8xlD;{3)YkRVXv3`sn{T924<<%;79Wi1 zci0PpkB^T%DtVTA2|lt`2cJrcZ~7X_?zqsJs#kj zWULzK2<>LT6H?gujiVCd{)XBHro@On;ez&j{8TyS-e}kK;4qt0`aLdRJ<0?;xb^xjF6g{>XNGb zz^s?HGPGRh;N=HkTGGI@mc#bXiBQEL#&~&IkHe{@V<e8Y{lb zlkuLrDxbe2pg5rYDQEui?(cRa8ot;v5FT${h8auI^Tz~=K-;hX?9%l?5KDqbjqAPU zZ~*BilfyS5t+zKoY!MQ~)W>%|XJr1A^(R-)u09F;QgWj|nu1NV50BmrQe8<{LqU%K zzeyMkg2%kJn;-P)i4gKY80#?CmId&poSAUKmQb=ppLrc||yf%*|k zic;=VK+4;R_RH7WZr)4M_Emd?DjxL;I*-R>@5p}?%#xmYn3G@u}hA#BAJ)ccQ zeX_vcjf7Fr>jOG_Vz9(AQ2pvKZxE|Jg~mVWVuWe8F?HciqsFi`dA5nEHRrI_l)0VG5h}c-fTsn4~s{{(v6V zeAYGcoZxrrU}yfONrg&ckz(Z6bO2sedL+Rq4`;%X*b>Epl7ww%c~=&+6);pW585cjKfaolfY?;4ey{*Gj98m^QA5kXRg-4?{_nW|rvhWw4R7a!`Pc8e z!E=hR#e90|n@TXHR5$T-(-sh6Y;#={l z6BfIQvkN+=f#Vtaj2d7H&xDr$&UUGJ0VfCFtumtOSZ<@!D&?^0L=0ZQ*s#$$9luiN z@ILJwq78C!q#~D*pm26J<>(`mXJtJ4J8K$~L@Swr!Nw|j3D#bJ+1riAmr+*P%qlYI zh3)`(LFy@LOJM?rH))r}y~jk2C~Pwwh%WNJJX#|dM20=PQau9_DDs2JscJ8;4C2 zjqE%Vt*Hx(lT4>o;Q?zbmjTHoWAcRlO~6|Uv-}z--%3j-Mg+2HJ^#%Xfj+s)$5=7h zyw_4W%n|{jqqDl9e;cU$_o)58&Zmai7ta5G;$hX3xfCqk`nGwW#9QjxOqs9qdfRVZw z#yY>te7yjn$09|@lV`MkzZ$jh*yT7qfSruP%OPWzCMWUPsW~10p|c)PS_wG zSTNV$%cYwBU)>>=7t|O_;2o?Q*`3BYn%YS?BGqnj>YRZ2sZ)ae-`f3q-a;_+SC|fU z9WgKJsjZ0DpIBqfN(DRcq6OshR>S|1IjC{L#ahbqCh0#MDx0<R={Ubq#1t-IUQ?=9vAA{vE}qKBeRl;RHOLbrSzoD z>7V35h6gHGW;A~t3@(xDj{d0OLW>|erRk&EMb4TqVsL1_s%Lr7QDV_y#~t^}?Cr?4 zc#wVlq!Ne0;6MsD-_*8RnE-5|}LRac{QeOGYtNuqo>U;z;GktTfN}a@W zI9c~z#%tMgo5S0U2^51ynN1$p1~Fc;NVn@%D}3mEiD2I#vA9`#9gonT;9=dAmQ|)* zB#sS?zZw_b0t?D@{#PdvVtIGJhq~n z67{bUss3Lx-Qw5S{wKU5QD8!Vc$2M>tLOK3lOajVFe*p079M+19)uB(wd{{9-R2^6q#R!K=;3u#eNJKcYngP zSZs8P-$P$f{SQVdkV5$@$vOat9lxo2AHd+ZuOCGzNz-D)?w~Ji@dry$%g26N$^46G zB2;Av{E;&IG*`!siIV7FGdVg;m;=!52!dj;ur;+YFK7jm-=3-dWf56Q$dU%8v`3D* zpBKt?qpmE%aOdyI3%LR4c7{uPpf6#2Jlxt}Fr)e(nehV@f@dR-#|F*<1wC*G!JQB5 z!O4RRi+@efcLg-dX#g6MG5A0>y*SaL34ZwouRHXcQ!;)KiE-kyH3$XFZ-a=lj|2;T(Sg5tR zao3r)JOx^eBu}t>3b)?EzwZht)fXT7DUNkENX)x%wZ9FX@2kRlvPIug@5*I(E5 zk?6^4*tWPGnrVvfo>|uezZ-7_S~mh8>7UQpNQk)Jia(5aLxEbFZeq?jL{U3muJh`5 zt@*HIf#Tct^7gAewUKc5G$LJ3oo*dwa`#0iizwdd*guU^JnxG2fAeYMhlPsAZR)lP z{aVJRKwXsKj!rnN0U}NkUecSE)@e#i$HcH}d-Z46^k1<)NVKHW{_};~bfh<&aCAa} zi-Wk7`p_&2j-i&9>U8Qu>s6sE2?uEVls-<>{2TEtBd=Wsox{48@0-bb5yY)z*nhj9 zR)12r2?VAzl`39z2#9#Kbz!hPpzCXr%yH(>Zag<}4SASTrbIJB<5IG3P(*4{Vh1aQK%Ax2KbTk4PnSYdS!1|& zd5K_N5&;3J4;hZ6AKK>mAX>%mAJP~-H0{63w7Jff+*eZ7l>`_X+%vjWZS^P}J5g&5 zG+m6j303{}?_N@a5u?Ge`FEXDsNa$}TA#}PzkMEV$ z1ic(X)5y!=FRs%%Omobp z8que#^J7GHL5JUfA}D?bd6y-u^Zf*&Fd(04{-*r^sQIH ze)i3#s%@IRBnt|L5l$7X`X)mm4omshljl99nXzBpk6D#Jk^Y z@uHE3k`w%ESu&z-HQST?5;gYyXP7h|M#<#r>Fb_Z7|Kf+@4U3&0S;UCL`Oh zE%Y;n#}6uT+_atbP92uzbNVCRNK;Q3ENgS#`3To+i|~GsE=G3l!;?p54U+8}Nn`k+ zm?3B9(j8-2a?gDLx+O9Z<2!P&SN z7Yk+Gpi&SlV3usn`itI1cd*9xuh{nxxkdMCw+CTr*^Nx2lEFLhVai3o+zq>yb%yFU z@+at?(}JFwt~zf7QHgkc+mU#(nUqEdqZ0gBoRRp)8L)qR7C3G_E6B^oWqbBFHoRQ~ z@Pj;Gd!^ty{$9#bS-PLPJXIsvtPBCPym7Qp=<{$}#%LJmDLnd~8~YN?CngAd7lbSN zf+@=*PuPJLS%TUriParde+tx(SHMfxLhqcs;c4aM0vOLCiU4XUZ z2M!1=q?&OqWPdt}Z~4PkmbZP)O~P2BH;cP6IY!r_|NSktOERqpQtM$SP2Mx`e=?EE zP+$7CrYy2%?2+7FmSjQ=zm;iM*?$j67B2y~q<@3T$RC(-nQmJfz7a5RrL=57RS9FA zArSt2?;kc)FJN8|EQ`yJ&B5}GwBh>t7+Pce&b4UR3D6&LLjrULqvXfCwiAHW{6kIFoad zjcC_v6nejcinm?ul@Uzt)u|R^Gc?azm&vIzWaZ+{t-X|n+$aeh(qo~M)HLSQP%AC~ zQ6i(VIiFFhyQzEHwBc-~`LLXUu+VBnB5rwV<5uK!J^a6I&~I5Xh|Y5To@FA^oK5Ds!=)0Ql?p1n6Atz zV@WfkUs>i$gc^y`jQi-BOWev%A+yNNhGY-sKnxX^r~rg;Vlj4xe@KjJ@7JQ+g5Aqb zfW&<3I(4i-jb~mWxLc6W`<3)Fhr~7ywBIQu7m9+#?32z?&{J1<%2AMIiEY&%Xm3iv z4jZt13R3n`O_xtJAX`MQCRw!zmYRCKXhXfWno$(%SK0AX5=%~di>O7Ioow)NU<(dv z6wmj>M)d5I7ABHFJU5aIw~<)ItyBUJu`0ZA)S2Q+gO)3S)%(ogZFw4o@>OtcgUt-5 zn&aPQek`S}+Xo+!kXG+S!Dv9fGsn_z)uxLS?!F=GB%9r>gyCO0gS;vG)>KlRv;p3) z&hVmxm>z*et(oS-J5A3wKH=3ExXnrV#95Afd9Pb$UA|Jl7)bt$+6d{t-X2)?_$?{vQwSf4qi7G)vj&og$KpTjq{e`Vk4I~2Fv9@# zH-$w~r;nV^7;(+?%uoU>fXL3wXY(u$I>s^s^Y;6@>$UGaIG`5c#v8mBir$DW3m<6mOwpfGoV05<2aj|>$IcosxV$lpDLlbU;J2gmD zfDb{5a0wFi*HQFfGA#arXEUHNn7JR|!Xgp#8WbIV$d~>9|U#tYp`J0#H=p zn!-@zelV%w3vENsLa0$tRF3)}dRy4u>PNTAk)~G%Ee=__Zm!Zuk?VD-Cy#F$MKucG}i4S!o zl|;E}DrF|b2Y_-?O?THT_sN~oS{Oh9j0Qhvw6je$)qz|~F^ObTYCi!}BcLwxN}JZ+!j**%d7Ml;Z$aAVpPqHanmv-6=VzM! zUX02p(m|w7}vpxU&VUji{pl{H4d}a4$_)D?df~guu+`Y z53EJm(_htKfg_-w4w015N4a;sDNW$HsX8f9_VS6h+2ej7peRw@WWqFM_ZiJ)oPRK+ z$nL4G5zdO5oybTO3X^e*K$kJo7_nJ@-CLP>YgBHYO#UH@2=E8{4D;U8O}?6b1)|63 zI#sHTec&7*!l`rr5QZb&od7a2em=y`1Vj~{R*#zK1ncuB8BTxT+=@lOki_q3jT6z7 zo{}$kj?|#%n8u@QuhBs<3e-BuVf$UYFaE9bw>pU!ZE$I5fO3;oTgy+j8CsA=+CUU~ z`|SXgzwG=)aVZ?&OeS{08Gvo^g5W@ENc@zEkat)rfk*SBoXT%gA{fxssQ-#1OMLRi zjH{arH&rPi?=_BOG61395Sx@EHr5sAfjTaw6r&CX7w&fT8Bmu}H-AEHO$7jMRNMH&FO_ozK_=Qvbv&n#sGt_l!?BJv zZtXUXw!~@`Vzqi0Op-~UeNMOkIH^Om+AKEQxmFuw#HKDgPy%VBdw8X@Y`E&<-t*%X zBWsMGzn)QSlun%VJ4XTNru|($=BD!vlgLX zrSHQk_!(5-P|!J@BN5aq!lg)UmEk@BP*Le|5+SWE?38)zR94u8f>mq6g&V%amPs}w zsHAOstTTa{eF@`Z^MdiT?y8DT;gZFFF3pa5uA+~E8rSE#kD1@Z6T+CN7#>H%UzU0~ z=i*QZLOhLtSR{<%$AP)0@`t0Vb_RK%>Vu<>bMtqIwmb4m8_ksAG-E_6d3#(*esUa< zanvy(_4j~bFr_m$nnEZIPzZF?po|QDtTXaryh%2mBNlX0$NGOlhw48%V`n^1Yya3} z)WGM_%iW%pQ}nWvygL-dW5i?y42SQ&L6EOuAf<( zKc0H))7z1x;$&$J zCsh#Dwt)-7R^{!Qe#@Y*?-CccF@4y-ZWkl#@^|4x6CrFsj3_wDf9$Yfg%iIPy4eJ= z=aEZe6$B!AE2_#gvGZ%XzbK}#DsX!3ZrNK+OkqglkhgZzR%Bz-$SUn0r#7P*KdDA0DpQ1OM*^ebOF$+m zvs!L#ngh&jZ!siy@&Qz{0`zF3I+mFXN*89<)N{flY_#Sy=l|Dq^wF9L0zM|Qrff^; z>as6y1TZDh|3VUl59iZ#0G2KR7r+f3$xgS7A?D$V{U@@0|9b1PRGKJvc)H_wUu)l| zlAn!pcO#8!O{>C_;Ig^$a(|xd=sa?MW#(25!~FjCG6ke0L*@HT!;Aq-@qs%Bm*?p_ zrAl#a7GZ>Q>wGHghj zs;aITaIlsn$V}Y|e%vcjB8vf9PqipfiK!mjd|<`YeX9st(`{6wAsapm_xIOnl z^MfwxusCwFYXN*nB-n@Hf9K&uyd#eyPj^(hqn|}e;sJTJOV6_PDPzvMtU@10aS1rF zfoCiJ_r5Lw86RFdli4@cl6R{e9!0K&XhTA`5GEs zMlR>)&`6YfG*n}~%dmRb6@ZZW{_Le$SSqhgaw@-5o+ltak8GwGaqgBf-=-C?z_dZx zX3I#y{v;J(i@rWg$f{0OF%kodyIgY5#=8L4NFAh8)p8_w2AnB*dnCOgv4NmO0{BdRfLWCzDtawm1jYo#c=ibP zmCPnzI?9;|(G!Zx2T-Y1MDc1ppB#4Aj=JI3LsxgD`j1d&f};qKr>(sVPZvpZ&p9w^ z1+%NJgVonJ0Y_X_7#oX3IpCoQC;y&+mX&A^g_n>>q3n0U9*rvUEtx&sDyi!yvw3S+ zpn<`F*fb*27B_h8)|jP0oXOhEPLw%(vp-#tZUr#a0^1obBO;fJbfP=RPCD{B`)QDv z^(1rCYe^y_4-z7|v>_my{mTgY;iW^@A44#KotkkOzY_kpQ~M`du6{iAVpJI)Qi5{-Ckpb-`|{#7h1oMFN)y2mDk4fiBG+p;V#`7 z8W&6P+_Wxn_LM|kRRFg@irkNvw*b#n;-r7NLwggl+j6Pg)_bqy>pK7L%X@nJU$)VS;j22kZZ<;lw2bfMVsSQ#>wmZa^48#jBP~Kh zukVrq<2v<~W!f-j%R8b9)@E5BQ+LNqyvo3NR}||wmZ-!vH8Rp{@ZE!xmR26m<8dE; zXHVq{aN%ZM(3kMC4orFP?t}Z_vpNGL@pRW21HNAZNu6vkWgaJCij7iI;K(J|RC>+- zHm$h&PXJ9h4E{#(S>h7vcp4Li+Om@u`KePqfxc7#AIXpm?QR7W-*{1i4tFAsh0zBK zI=GSXe-D_dR7y&$7K&HrCmUtaB3@vZkq5%Q%07MHhfxkBzo z}Ii_szc1eLVY%kw?p#`e(C$hnwFYKHU0xO2Qksp2+V3Y-?hU*7xRwZ>_{jz_l8B80v!u^T{PZiIMv2eLt*0 znQ&Y2b*}-dDYfaVgT$C#Lg)u^gB|A^9Jq{{2|P$NdNou!F;>nw7fNRFs)oKwv+Iupy#RCi4;AqZ+ww+1&?**r-AdfkG`+1 z!mLF)IwBO#AwCsjWx|*~Z7222o>E8dPqG>(Vv8t1F@~S5PQJV}g~$P1d^F^iVjg< zN_t9)A>H{%967t;s zscTgH%67$0b@}_bbw6mLINT}wp-pVGk0l^n>m<1XWO>tQ{xwLG5oGhhQEO~c{}mUD zEdEG66-Y@9#0@b(BhJ`OmQ5;_TmhlKjcb3XHIWHx=m8*b*co7V``(&3?kf%NH*Ha z^j$K?R~ujy`?^zDo&-p*bsJT$gG6;D{L1iOv*+x-1!LXr@4_DQZ9ys2cc8h)+)l?vEKJeD(BeGR2mc}3I-c|_!Fcb%SHxL7Tf2P z9HJ_}YE2YPD>DxJ&4mlX#m_@xM^Z+tL#aI6>=7=O&TEW89YSXqdFt{xbx%R2<$oTi z_E-TD)L8b2P}S2cY2Dwz+NhG~CsIT&oYErBBO=T4Ts%2@^Qy(SDAqIIEWf~r7uHVM zN4sXPpH!=L>9wal7CGS<3@ivP_@6U<@+~CX%h#VcW#X(~6Ue43&fs>EZOtrj`|^fv zqM;z5Ek1Dpy^QW#FiY7 zmR(FHg;il0@VyF9>?-W6QXcr+H4L}2e3HDV)!=~$>GeDKlZ$+(w%R+LxPcpgbM zo0dAddAe1{RcmSnAfw1LRtJ!gvNMM~?i$%=SSr!scQS#HieeHucum@xG0RIctGpotsxZSC;6zH_mvGKJDz%mftI3{(m&Xj7h z(IAimZ`iGD-Qk9x%vWS0-;5X-6}Li!v1mxV;pq55oo_yTIM9uqc^=!A^;-_uDwN9at{PErjN)P5X@(s_?94;B^y3yB~J<~j#r1Taunw| z{T-qQHzkwGgjd!y707YC5a5K{0)NupAqt#=wKdim{qv6=7P_QlK%QIO9^%u#Y8pKE zinmd{R3LWz-2EWm?$DViR;0)jn$lqk_qG9E={z{IN1!HfcY?lbnw4ZtJJ^APlM>lF zL7m#@9g7+amkpp}pq;Z~){^41hKN{gKIoG)h>eo|p&OvXkEp+UP;@@~@Mw48eKj%! zXI)!H+X60$Eucdou%)qJ_o>dQGkp|omiaz!P4bN}$nR_#gOZdCj3Pvd6gS0Zpu?0X zXD6AvrFKmFrqJjl0^qf9*WaG9e?~%`BxC&2Vw{m1p?Bcv5{3UB{b+~cVQHi2-K&O zQzI18VmNIV&XA0kB53w35@U;T4h8y=QSN`<(i`}r<0`IyfBNv2&!yltnahm7{_6$6 z>}Ul7;zvERNQfn9aVPc-P8?M1$&cyb{E3=400d4xxGpzHwDH*|0HvQ0gxge=#1pTI zLbB=oZv&IT?aYmR6f)Cb(IbzDi4|f}ZK-W%BQr)58X54N(*OliUv+~D81UE zrP%lCsJxB%=wQ{qw(rO770(ZQ`#1;#H+jjD3rvZ{TJ{JcBoJRCc_t>hQU3v^d{%wR zKkX{nyZaUB-!k_X&ntHHD=50V1 zPEf7HNM>R@y9%2mJjkLC)57%GWg?a_WPvG*E*PvBF(3-LwLsb9*XceXr2DekO(eY5 zVM6Dj&43*4h1>S&tE@)kw@y>ffv!8C;1IZ@JA39AAUmc5q4}N6-ItYwv`S(R+=IdP zcQ#Z<&5xWjg~=drmbj%Ec8gErK0cxzaQ%>-_I|Z%G*V1`DaC$h)+Pa+s6Hhuj2;d&~%!ta~K_(az z9ywMoaKntY=^oRhkah3DQ$LsMgYN;FnoBM~lJ;Zhqhe|?h^GlYDu`v+WRWbiKw|+uD$w14vwz@U6or2L#gw;t)oRO^1^RCu%lDYmjoG!s)9O0H4NJz`jKk=;gCoao~G=A1_&xtMw`O zHA@F(NBjhsU1TTeGZ$@GR&ZV!22lPCn%qBIe??y5t3<2_RK8qI#(-_75uwpJh6Rgg z#XMN@A;K(->)(MC5Vx(?Mu4O>tpxbT?*Ej0{?q)Ov!UQGY@AM6$onfbu23q7Plw;_ zr%qE1K=w&OqueKAqOZsHY+-42>3?P!HWhL6qaI+ayA?LvzJ}p7E$I0C6uteUj`<<~ ziY_>v`Y$__*>qS0mr8U|MJ2$y&xpi^rU^b5$V7Gb;IK#*jP8o~^1Z1Y<=>lJ_X~4; ze=nKactfG84T6{M$cwx(!>IJMeXce1B7qdvVA{)-rcPXtp^eVhCE?jb z)W+>vl3hY}*+A_SS~vgecv=Zl1fABF_-~7Xeix7)=%n6~?v@sIpU)q?m%E&w%dy_&K2i7BrEG+5{55LdRT#M56OZ0p#CyvT|vg}oenVQx;CX{Uugc0ZF zrn_BIzpv=E_bk&CQPp>Z_Hm?CUuH~T#ipDS8(w<*fbd;O`#K3M&{Ivb_2*!7Q6D1s zAJPNJ6GIKK$goEe=N}X*WtXna<)p#Dz?~EAO3o*)x=8$uU-qDy9C|GW zDvgRXeVwgwFmV2xYyF7y6cFVJv#FWyJ1*zjZi?LYL7Osj?*UKitmk5+)C*8XbB*!P zRU<|v0^_ShNd5rfrnR=Avut@bQOa{tDvegjNxIztsMj0dnnl&?NK=)4t}*kmKT zuZhoIFsznm{5_t~qhYe4ex*day!pXr``xm18y5!DR*5J69qsN7U^|{T+xk{&EBP4l z-?u_(yt+R__!C%)fZ*OI(fg6ppdu#^4ldjX5o`GFU$vA+focYuwp9Wp+6$qKfI>ZIs4pP>4?lmb;0T-FBIzR~J-idVdw!CN0mC9HkfL$^)oP^Dhfp`(KO21AkR z-aYcI*5LQ{N`E4{tIq-0z7Nnpc2PBe(SE;nC-JQ2E;amEyRdNHy1In{-nE@KR7-JtdbX*EXF84k~mL z29Di%pM%JR7X?FE>FLA?ca%B)@$u|BJ-oRA1`wCoKpZY>U^wIS`o8z2nsqnMwBaPiiPn#JzCw ziEdeEM{z#TQChx{Th{j_I`#JQhyHA4QY@L8`uEM>XxW$(se_AZ@)#l0cUMC`E;K}+ z(JIp`e|H#&7eAe?d@5b|5=(k|=Pvq3lV^^+kGN-FoJN?c8rouRDG%>!xZ%6X3yA$& z8n23UaOT+OP~L^F3Lps#F;d<%oaJkMYTFMXp_Yp7!410v#7r#hkLq!KB_O1_`<*GQ zIoJKb30m})Rgje}>F%yvH?1nmEb~l;KgCGz$&bjwV$47oD6NXOolWLGE(_@AfF7$wP(#DkX zeOT3L-TMyEVRNyrmbI(*h6Oi)UgR~T7W}$OeCGSmZ2Mg5cJv~I_2g9l8NNnX6dK0~ zVocjWFcBWLhrk{?0uVrau$bQ0PF*5nB}!Bu^|VA_sbV$HSgkfoC5F8Kr2SAQWKk(XaE7jjdGYCqBKA|gyzI%vd- znzGSt8wZqzWFs+XJiC7+chla5cc5a14tyWG3y*I3hMA%xJv2tdB`GV1_A*fGtWU}_ zR+cohZY&K1B<(cBqlr6uY_05l0)4U{=dOCZ_OiZBknMl&YpM=c>uh49%%94h6It*V zgv_7&pkNbmPE0oPNF^p}eU=GS$va}eT?NTzyGEs6kgb!{Vv6k{Vi|97)0eJ8xv;tD zyfDQ+SS=A_CLc9(=;fpCCqyi&d_a5rp|$S?ttvo90l4kj56{Lg&elifSm>$my3&19 zMCN3^Uf*%<3Tes$IDbpAv#4yA{_hvHmCw(c;)hp&;tk*A4W`I8A0i&9@m|g6yLK^Q zB;rw6R0JP~yzZS~O36Cnr_EAXI_B`u<61(rL_7bi*K8A)~hTQXx*GP?pfMq6{Aq7JUMk3Oi~jGvZKp zsVgx;+%ry_81N%oden>OsIBWde6q<*ekH41+1ajC?~<+z0c|M0s`-clKHw6?DERiF z*URrPF)XfzXlJl38cUovlvb^}w&i`~;p+IK@{cwdM#EWg3rLYW=r1-RmHb#KrYUw{eyvEavO@S zjr`cdLy9F23LROpf~+2qm)YM!u<)G{Pi)}>ACi}tJ$V{pzSoCQpkMDWN;chOoN9z= z1AkCjWq5d!u-Gu_fGtY6u;7RSk({Hd#!QS*T-nA1(7XlRjzt}ljoju8) z!}XCq5WT>bY73~?ESYHB{c8Z>vUrT(7$0W5og-*$$sN<3@?!jbuWcsnse}Hp-!06| zHzi7y3!3WM*8|((2ruug)U5Vfpj!-?&V}6c15p-?Q+TXGVKgGJ%u@~QaBW+#G2C)G zmQJbgrku_sV{eeqddLd%8d(3If?zl$ zSQf;phcZVMyw@69&RIirgCG~WM18CNbXJ*6Dv@Mu6(CxpZO3j8`$=2TpI2z8S-Zlc zR$UdX^Z1=*cUtN`=M&t6m}MZcvrRG6&<(Nwu%Tr{#|_1KOa_-D9JC!4maMpR?f zD)eF0cA{eiblc9A_Rv5`1D`QlB{u4aAGekVI`|(+?Od{IT?@o;iJ9 zzcm&uC_(;L?fRecsP|t1LU6vX8H0ucmZ?#ifD0u5)d^lkK%PR_40YK5Wk?>?Y3Mw7 zVix2D2|54G6BGK-w6R^dcL((NJlFTb)_WU@$n?WJ1F3w)Ckr=IX8^OPnve_&jq7b$%67qlf<^%p&B-_{lmM>zQW zJ4|k;hI?jRBVF6}`YpuZ`(r!jz`fDQwq9==*!~OK0hTY>n;p)j@5~L*kcS&s+RLc; zrwmcgq~t{!b^zd>0;^)SQA8#-vD{MmfZ@vy_cjLMMS(!QV{p&Q>9=II7yju`jvS@o z>!*L*G!+t+zR4T<8g}cl!=t_HZZ7__a)G9`e)FDN;z=5Y7>)75`E1zSz)NGoW=AA42g#&%co+EhDXGVv2-+@ zbNA2Bw`58pXKYZY-qd;fIbJBBzo034OMgLAbalVJX5Q}|L|eIbP`#B8xCA($-6PHn z5;#btxWK*M21R`GIw*|203&j5ovSdYgMI<1&Uq;v5nob4L1-8v4vcevE;du6h{gb- zzFWGOn#MQ3;I_3-#e3Qje^ECNIYi=GM2;uTrH~Uqj51}+WsE8E;DI%8vVVeHt(U(p z_j^78cby2q?Q+YM_AC=m1A26>UWU234!|B)dwsr{m%w+u2Uxvi2N^SapJjL!k7bw_ zFak2&#S2Ft)_1`z+EWufO5mUX>e+X62gGBKmXm4R#n~pbN@V+DIU03plcEg|WM?bV zal{7xLG#NesyJ!=z(>mkl#Duuh)_0Xn2B-tUT(wJt>TX{1mpo1gg>#@>Z2)U0dV76JkE6PJ6CaCo#uB z$fQ&@I9jOLHXR+Y$jh@7!%W7p@D#df3;hqWt^kJRj>{2Q_Z=FSkJtsrz%n$hiidWY zs{j;XNp}hyHE6-O29Es%BWp|_Kqj-#MOETNGVMNkT9d-cz8z-`_VN1lB_XqADlfvf2|r$l@LXX5|T>@v6OmZ4TFBjuPGoitFX+CE5Hh z*7Lq6Mh9Ry>OAI!u_%P+ti`1_CPmYY(|)T}O@D?ex{-Et{3~2SO{mfC0XrGQ0^r~w zs*o3c|EebxpHs~44{vSP8pewOE{RO?3{YqC=OrMDOMzn#R%P~89?-UlazJkv_kiSv zJo!Wi)U$?0;IDsbPt_`PxZ4~auInK>Yw#2zn7AIsAL%_acd>9uV?wyM^N9sZ! z$%s1~6}K z=X|>P=NHk$zq!Rt|NMG-)?k%>L5 zsTlmM+l3LGox^wzKBVEVNn_Z(FMe4@r-{}Yh^(Wp@qXb(+;;}_6m2Z2UitqX!#>Jb z;eqUusJQ8}k9`H%zXyJS6jG_rAUu(6opJ=RTDuUubMc(g!2(JWb*$feelUM?JrO~{ z->sa&Eg7gAUqw#@_!)&v>q}rBNNkTFCkyNhwV|7EC-|gRyK-?|Qn$g@l_DD}D4$u= zi2oI>mh`B|`)I>*4rrAQfcYT}DtxLO|LB`FXUDb5fM}2}V8eZLFAS@qdas>Q35C7? z_|YH6R0>2YJ-ZM}t`Nhxn!GH5fhfLbP@V$_)$k&CRnnb;Y1aI$>5{>;9=eL0k3{V# zbNnt9@v1mXSw|)J8g@FlXYcGa`Y(jC^cubW!=y-PmX!+DD~PTyheH&Bb@!Y z0>gtVju_4w0`^>RZ*1YEvZCL?6ltml{t>B#F0AP5Jt-uVump+SU6*3z6sP$)hGG7( zh4AiB*8$PD&|EUnlC{!t#eYP~BD_=YN>{vFU9wh`*sY3J-EtEgRNXLhCKr-Kum9JV ztq#Z>4EE<1?y7OKy1oMD1YMIBmH;`#b$Qka)(v)9KGYs8!& zFWIw6<_fYmXKO24$0d+7zK80(cH6=xcwQl;7a$dg#hD!6dj$z}8IQa?+~Vo-10WcmE6|p8_m`2O`nQqj z$j6WoecA|K0zp=Z%$j!vG-YJv9?XEfR05M&k{%XGJce!30~52(qc3TBen^Dhr>!CF zAi4R@={lAnqeWWQR*d8i#E6LP;GcpmaQG6u1h0W4BrT&<^!o*~CF9iVG6a$Chna^B z9}(j*#ymhIlLV_irv*w0Me&QWqd&*CQx$m#9OA;W1iOZ99K4V>ZirWh0nz-U+Dbm0 z8xQ`rbUC(wNymC5&&|PE*~_!extpF+6|0NRqMH85p!atOF7M-p(`<_<`RTB)YfeP; z0eHiJqyj|>n+5f}KaT}*;TR8GZVfi#G{vXvGaggCTW{Vg?%~^Tb!^bp-g3$CF+HP< zoBr0o86WAMBIglf!bI+qDWy)nq?3=|jQ3{1b-e?U9r$;Z}yay1f=tPH2obBEsSI^SW1b zyN2R6M>@colL-)Huu}fBM*TfC);>8=Zr(BF5^3t}u_p{b#INKuSuTAYm7lrLS{=U^ z*Thw|BqhhZPI=ZUdORszk;q@AZ3mv;nJM{dY6VVj6yE@d4f`-^<{-XVRGHg}WkK(d zA3{%f%H4D<8;aVXKR@v;8)wln)VA7*W5Yc>DqKyrBZ&@2D2N>AH3xF3StTud{3tcf z7kz?}Gyzk^Fj1bWC#r+(d(nb-n&3G}B(T^h9g=I(XdRvi9N{vHNDevgu}%<5Y3-F| zAH;ENPc5fcN8z*!AJQni5(3TFUfx^Bdkc{9gt{PShrTzt!YGr-SVCOj`Cq23+n|uPqGS6?pk|o4)_OSavy>W@LgQxI z)eDWVADD?DrrKr)+|N^)1vNmCRW!vs5BJ&Cd&;pZa~Vzkq{SXod4Or$y!V6~bC|JD z0REQhJs>`F_t$m6ouVPW_DjrO%!W1S^D_K#H#*g?W4Cz6=bT60140KeoOAww3^L`B ze3cOcBrv6@x`JW@%cf(9`ev{ym0}~fY2tP$Qw^Sa8NcXQg*<-Je%3{Hq1-LcH#Hol zcP<%#nZw*UJHNFZbtW|@F`?zk|4qyVNE#>xm%0YLl!xZ$58tM2-IMJAq+P|T{=XdC zjHbmu!hZc?Swaxh24hXSpFiGHZ7GHil$(Zu&>BgLmitXyoKlv9QyA1r$P~Xc7YJ0WB z!Y|Z7BcO$%iMqpv8a7r+$65!~*_Zto0I7aZ+Sw^h?8iN3O{xZD!iu_!IBKK;pcm*a z405mC8x;bVzhae7a&>j&n!Gol;bu6BN^_G+`uC$g%WkL9J-t?AN#w8E!50q*1k%KO z&r^t0pGo>?LW(#oaM$5Y6B=#Wm*2vs!?*^&2OEHyUbxmTxcZRSy!{^CphXZ|H$F>r zvt0^a#GBj7bpHwn1nDHJfVsV538^*=ZZLRP_D660z}+_yfBWEuL$;%>z%V>o^^l-i zRV!zQTQ3^SNl>#SYYh<#9BfEQQ%?ZI)I=W2SYsE<$wf4qjn{h}SXkf8t5+AT*%qRv z=p%{LhQ3ixg86tNZf`Fo##-LoiR|BPJPSW=V5g%JPAfSya42R;pVV_gNWBl0$PT|`Ia_<_u!B2_odrOo^~oH3#0JlR!I3ehS}B=p zLF_$Arfn>EEk^6m8j{!o3bT6@EiB&6h2*ZqJO)ab&|8AeNfY4lDPj+l8c!c7lbBdwqicsz!Q2!U~&Ze=KERyuPK}C7NUKE0N>jGZ1Emze(S(j^&H0EV;~SL?(A+EEb}lHfe{ypF8G1=KZYHy zIcLbA{W4(=SE0lb?lpAwob+VN1uRLHz%!Q*w659joHm2(;$uT1tP}Mun6y8!p8+`@kH^B`zPAziC5ob0QA96_o7ZiI?k?v8z-~iziT5Jsv0Mu zhd)5*2f<39^}Mx6%>y&=XQuZC>j7vq@)fIJ-zk00q&4F}TEtcAwyNkoAI3{1XLpI2SNMbMEye z2i*6ZXwtEJo%_?V__6&iynqzz zxr>*X$JT%l1^uVok3bh2ZQwLs+e^0cGswW{k(2-{JdoafFnd? zb`eV$RBkb+EdqAq%7+?xr0Y_@n{}tVp1-%;09tSUrJ`0jcYqtJM0np0#u2W;ewnVB zzlJKh2UGJhyRB?|j-9326qd5><5-QxL@&^ab;=nj22g)bY ze3eg0LOK;_^>goa-;clLIeD>8z`h8QgJ{K6rz3PF!bR?XJBkQ{${;z44&V>b#=Hc? zfE7r!x>G2h?4A=t#1m=ludz&+)3R`30M(;z1~j&2&{EVz}&XBwZH{{0)$yN_J5@w-T&?#Dtg#0vi`50b}?XJn+_Wvmb!`R26Av@8+<%b}2!S$oh1( z9h=Eak#SJ{fPou4Q-J!|`*wVkAOb@W3Nzrm&kmEq`J3qeo4i?dlESX&Rg}oSd?iqh zkJ~xA80ANYJ=>9gZx>V&b*aK>_P3Et{uCKLmuKwpnl@p$x zGwfQJ{KmKj9SzT$Uq?ynBL&g9_AGf830xrVW3f`jIUZ=WutGar5^Dyr8%jVv+avo| z3_6mFKTSv<`^FBehnd9g(1n+iJRqBGf+QHO;3Na@+9Pn5LD+HzD(Pu<{LND^vdzzB z9;RL$=TCr9CRSE=(K$!q*40_k5XHWKVW5&59ufWq#KrV0A~&O(h$t1z$lciHI4_wg zagXG)Z8?GI1M&=ls#+e!4hUm%k&0<%EFytGq}}%rWbnj#aaDR^8TPNUS^J#0J}?kH za&9Zl1eLjQSOiWrZOq*zm6IVz^%~m55;+dE(Dol|=}^Tt(cy1K@*`!g=YhH@jw=~S zhuR+xFg%6W@1=`jm)F`v>-38Y24GfI-rlTMnYc7xC@KSvK^+qq*lPKTk;Sn>1K6yf z&4HqN?;T#=HVJ1oDj}~gfBXCMs?u(s% z7FIB6Ec zOgQJw`9jseDn|_+N%QeZD56NQuM2e^ zFwpPg+JxGl3M8FYNxo)~i%KZo=zBWD5$=_Fo?a5z{2vm>nj5nyfx*4Tf~^S1lo2+UJ66X91UAke?V73 ziE16`Kzp5yOadp{JQn*_-&^CPL>e#JCuoEgx#MTkZW!KCx1bY#lJvS)wk`Ny1LS?~ ztSNnta)13{DM0J6rfp_wikHj>>gb-)Z9kHo_4o?=39Lm04MpA6qxj>OSYhYa+LV*o z3vt2V>Dk>rJ*-R!z+J)+(762Tkm!UB&j&%7D-XTbzL?E*NIee|pb`5<>_j(jIqk5? zVNCp=<={kP$rTJ`>0PIpy=)sAdo#es`|e;oME*Q4Yu;L;>uJ1SrF62!^4ZJa5XZh;!@F}z&X?sg(&|BX5FG~Da) zekd#KukH-r(lDB|I(`&Ha_1jx2S2tEEFrR_WxIRzWp(_Hvy;#P5pnPk;yAI{K&_H9 zPoZkxsO*NuvFFua5f*e46;1kBK34>u!O`{bZ3ubk z;Tw9d=Rs#UxQH?)`$1UtDV+`Q*TYe22MY=HbDt-Xql%U5U)bvwVKFn|zyc!@;?##u z#7d$;CYIv9xa&XQ*PJuhE$Zf{QIj7~e}jpi(9xo2zypg32c|6ZiuaqRj|^#m((N>@ zUiy^3>waf90wBTROqoWnX0`S_6;zN@w#?C21K%lZ`OZPi6r1z=r85FrGv4`KJ z2-&iFe(wBy2QfUoB&5p%li}J z5!tW6SF;yG*I^RBXam&dr0V2)Sj`654h*iXy7iSZfbD%mW$JnG|yDH^cDolw%#(z9g+(ZPI|z+DluiJNIHH32E7althT7 zOgWy~$bX@5vi*lwy$sU(FEvMm)fXROO?!S%%n_dg53`i)S$_}fvcTs)(IYAEBs}D&^*pIO zRA>ZLZ!UE!SgAQ=D89QVAorb1r9@an3z ze_m=;EC92oD*&L1fd&OpZBs4xSqC)s+RI?B4lG{vq z2E)#4&S4VL&jbD~1JA17+!05YFnN~SumZi#?t@hU8KLOsMmX3SkoFivT=Tn>>Ty1V z(k*0;D8eKxVfzVo=N!a$$Y38i8Ll_;KRNOMq`gMVOcY>AODx|60mR`InxT}J4%&nSOwCPZZ$0r(eB(v ze6tbC1mUP8v@!fcfK5gA1qi!{ql@`rsPt4(^xGG@fVK=Nvn5}a;wKi=I!AZ!i*OTS zv!KowsL_;1#Eyr!EE2mfNa_6mpm!5=_FNoQV0t$cbxJD?!(?v5ZUDS>w{WITj^{8> z4~IEd-5UJ?AjwidO622YCF%UaYi}UC?&7-Je5P*m)90S@a@u|3qlaMulu&x0W6p>% zE)`t-=5ho|TdP-6cj1o6j`~T|pj3VgTF8k=xK?6bd%(;+ zM|eV!Bj`TKu{+y7$pN$-quV<&Bus)}Nng6nct=a zhS#NYr_65!XS**knxyce<>w;63E1`G4hU3Y7F?uzxD@?E+$)NOQ19PoOk&JCE}4th z$6$Hse&bW2w=B(A7#K0;o0q8F?b`}OAmvac1N+B~H~dWF5m$7(<6RdA5Q&n|D*%M3 z?v5c?@BD#j*K^oA(p&cPSC?Yrz441~^gHziAib{tNVWq<1+*hVl>wz+)#LjKt^5e~YDdyUScxiFG&3=9T36cMzyywaJFFIKnrQg`!IG(LjAq3@`FhX0>n<01mu$R}L6i1$ZZQ<@%Kp-7#*L33Y4^5nRlTU<&nvAoE!~Fl`5$9sQFbG_`fC?p! zvL;jw-&EaC^)nz%hkYg)xM!Z1JQeQX2K zhOaOmwPF0C2%hPbk)~tiF~p@2GxWhPZy}OTcxgF4?X4lC|34|Q^O(w6Vn&|)53Fea z5xZvpz1cRC2m^BpG$iF3P(qAG$@2R54a#StSs)Tt>pmQS9peu@CSNTGRf5F;$BX&C zh}hnkHL=Ua;FtGb*f?03Y=E?yTZyw;i$5f1LhC;nyj(x( za$HAL1X3a9&6I>LW)1A+_>De+_W#MmhK^2Yz^C;~$i-z;q2&~^p!Vxq#rH}k{nRuM zyzDCg8x?@M8!gMR+bn2_hcL`>!Ic#A+;95;$#DRIh)h9eAfGbAm14)YRxHsJEBhCi z%uAOb_TrblJL6)1!)857LhOdiPfPx*LQ74=xLV z3_<8z)ULNmXqKol3Zl%6ty$l&i47nrdVTYSNuT0)q& z-)M^muFTXy?gp3gX|E3udBi=9J7;i?`_0I_n`;2=$V`85?+*UwF$uy-5DVD6V1X`g z0A1`#h3g666tSN;Lj5BH?Y^uHj6~i29BO|}$3e@b{84zFYih#~Fn__lKONmkmmA!` z{&btXJSH6wwrC;35WEi(QXW00ck2Z)zF_D!M0Td3SRy)K=-F{c8skoN5q4IxpPOl& zK+0KKEQ1_{2ERsbpqa|n909FjmvvZ+WJvhyF+Y%?#w6SXAtjv^)lljxfv`*a$j2MH ze@tiZ_({JuD_i|izrA8YhCyKd#L{OHM8$dqk^ANK@tt=>$qVx6cMYw?gbR^c)8u(g;~(tXt$vWCYMB%h2>YlIYd zp-3Q#Svz^((4PB#5xT16w}*yWPMl0`y338n}$=Qh+E? zwFnpEp;N$V;^O89EaWpllkZ=8gby@j-S(4ZFI5efJLz_U_b#U)KWw@~O6QC1npabkh zdFM*tJFHexGNPhMXNG^_LHArh!)qLWL5KWUB&0RSAVDTs52p7=HF2+{N?YeH|McKM zC6i<^5B0eGH`=G`UbhDucT&JXcyEgFFYm5x-bmd-NUV6>eiaAfCa*rtsPbaiB^LkE zLVx|`k?ltjzrE8sv&0T(8k1oFO1ejtn`N}H-T%V!x!4+RuK@2`e0KR}s(bav)!!SW z)$tB;Mp(E5hsA~Rr7&uo#DAwzrQ=|L8Rt1k;go(7rgDjI0?IH-;tSwWo(hty< zEnfHychpHH#$_E=&mVkR?Li&$dp%%T+CyISm(5em!)&q-D=ND2A7X3%?|>8k@2jGO z-uv_MS6NhCq)CZUSQ~g|84d1H9rTw#~@8t>Q+6s)|@PG_%a54Pre zt;&{fkgLaUI@!$^ZxqGr)vEiiKK`TNeI4TSP>!cTJP&PXtNC zLP$wR-Bo!B<1MF&c)wQ_Nl!yQV?t( z!~XQIoXLP9l8P}m;=}&g@1$rNaWRpT-$Oz;p(wle=%hKYWvH6>*hw%yeiWS_w5*8s zqO%Sf>YnPpLl9V0Kws{}_90BR_Ar6TnT_{Tgi2R_8fKO;x8> zvmR1=;+e9BWp(PMQJIl25 zXudZru?l1}7kO~0n*73IlwBbNDV^5zoBtwFsFUuFvfOY*FWJI~DwBi!bXM?6L$>6xzj-r@?L5X}Qm}P+}ge2Mb4+%0> z5HV_)T;^YTvo2*l+^80$_y`9-bh-`)M7{d_vDY;hdr~d8t-KNzUKg&RLzU=;YrJ`y;m%YB-~CGC8tKYER*TuYB_4#XeFmy_0aQ1)PYg zIRTayF+LW56&7;p&nzBpm1;Sb&?U=6T(k|5s1Nz=owRLr6^a;pQ0SF}@m?0VwI03JC+DPqthq_Xr|Hm!~~So4l4= zO7g+*pjzhHijMBuZ+S7Hutj)f-*q+zvUQqAb=XOy%j&Vj@l6t$i{#_U(im?y{My`y znA)@ZZ{GQbZ>b)n?^f;^87kgOFKH_y`fFWeKf@Cn(q3Emuf3ohQ6uZ1$=vd#p76eK z2SKs3Q8GReMnj7|uzDeWap0Eq*eaiXPREomOQC6Sgi857J z6Lu!=N#yw|U}U-o^-rl{{Jz|Omv8rBIJL%PWcshb4e`BR0g+7ly zYj?te((jSz_51;|L|5cUEdBvSS$=1*q9Ro(??%QM+cIlkwMtz2!TKTd2z0rw-L*M} zLR3btQFCAtt6r$Z2@28faWh!E6&Xo?VbcX3LQ+$za`QPjF>0#a&+^;;hNSF=bRM)n zKvEux(Mwa{2?<3ppnu7FxVws4^3EFLp>))M@posJ+rBUc zsnE7{bPcIJjEAvMs|N93C@Wji6lzkrbv{)KnhlU#SYxu!I?SviY;6}f9N){M7DE?T zC1=#m+^14Iel@?~H=bb+Kg~K&f8NjUpgJAw0eh%M*vB>EkhwKtv1{{%C z{n&pZ>%e%rfW^U>Rf8-?UMu;WY|3KQ<8+zx#(33}HMTA;qKLUJS@_NoNlAERXC<^v z9-$As>#|Mm>SH9&ZE@j*Z$(-O<}4^=GrnPKmSJ=KOO&GVw=#oKUy!tGMJC8qbz;S@ z`wi+Jo}Z(Rls%eL=*6x`X`oWsFN>i=@5M$&6T z7%pzk&~cbIhpr010}4>_ggPWY7q z;;}x8yz!%?xr;3S=3Nv^@OZz0>iJ&V9AbcH#9i1m=}C;s#(>KRxyzQ+f2mJ`uri)bg@~l~Qfg#D>xIuiwoMmQt!m$ax#!`bPs;xF* zFD%nO4>loJlFC$~|1B|Z_)*a2JM(d8G!?+@Hct3RMOPKd`#vox8_P9u3cv}yrgTo; zQgn>ocju)@zNoz5E>+{@%2N_^yL`m{>J_yL-*9UAL-*nG3e~tT_CGRyhNAqD`Wh#} zbN^=LK_Hj9jLylC8x|6!_#Q|eEv_X*U|^+Vu5vCN8h6kA_7<^>n3V9e^}COIEwvj) z^pZL>sDNVWTu(gudIalIGw271pu|dVQV8_Ls;B;RB3$E6F|zYh<41HvJWV!+4C(Q} zgk$pjxGq)^OdHid9#(>OLrp1q^CyEkuxC;h)u3^|8g{Lt=znp|z{E|3AwI6x#n5Q5 zsl1%EaQUJmr*U1F&3`HTU#>PPJ3O&T(Ui$aj!+lXUoN~_+UWLo{?Er{gt}N9@Oe?_ z|IksQ*7dt&24q3qGG8GW+*J=l}eY|NPVqY7MqB V@fWh4G8FKif~=}ciIi#J{{xq>OvV5J literal 0 HcmV?d00001 diff --git a/website/static/assets/dab-overview-4.png b/website/static/assets/dab-overview-4.png new file mode 100644 index 0000000000000000000000000000000000000000..060dbb9aada2013b3bd92cb0b96d708d2c2dcb56 GIT binary patch literal 53440 zcmZU4bwE_z+bxWP42*PlcZ(9zB_$w83@|i^2uMli07I8FC@H8&H%NDbpwcn4^Z*i) z_wfGWyZ5_)fgtD1-usF5thILJb4_JDTxwhl3=BL~6-6Bk3=kRv12YA3ANWbSXAeFG z1|x>5qMWXm>24OzmEMnw+o=)4DM_tmwY*_gEAFC*h?sZD%eHD|To091!U!`Gxt5CHx}ncjEH5+slCcKzGm2{-dUsyR~OCn|?VbKK^D)2WKB@&rC0?rvkFa zd?tmj)|YPWp1xZtRg8t`=E*28Z?(rc5geDPIjh5k2gk=tQrm~q>)Rdtry!H z(E_co?=oH=uA9(jVKi@Ey&V0}*zb;eIb+Y)dcNX%>vwQb-9v7iK4liz@+vS}0S%vX zYHP_5bIJE3zbczvYTB)e&JeT+K87z?gwqWds3v{55CDF7MC))lWOh^4ztk~Sx8PxX zJZoQ0B^`ZXx7gh1ee%md{nV<}C7WF%v)^qc@G|3C;@o#V#XtmD*~dQ?i!%qEH>Osx zkB2>%{5h_7&rT0ew#6k?QRe0{R`}q{Lz&~0-lZ$v%5Gxl4gSsTRNIYSw!KB0`E6mU zky>xdTB7=(cW~QZxUn7hbzD1(-|moZWHlmDy%Y!z7 zw*hgrIauZPm-owGaOUoLHmh*vp$@M`hHPXAaOVrtOlPl-b8g`(f^Phy@e>b7dWU$c zV`xbxy^0z&VXH=MS4ZlazTi#gS?$lJ;Y-_i zu4Js9HE>^0#vX%Y8Cv*K<``jxt7=i{Civ2bR2(nBN!6gz3U`cRm*Fl_K8R}W4TxPs zflVg)=_zMnZEoPcl%Z+`pKwWV~B|gxpDF=(q`GR0o_vl@Z-;>vGea^ z`qFtMAytDnZIed!83Zy{&hG*`Zg}-!(~NWHlIL@ST8j$;ZC5&fimxp`oH~sj&e-Pg z{qe65SPc?pv_F@l#}4eGIcI33xUzV2Wa2!YDyo!X47wdxW}vzZvGm(1tzToxhr!%$ zu8zk*PogGT2`x}ZxqOjpa_Ath^p0?O2KM;t2W-*qT_XDBX8tEBSN3LWCsSriepiQm z(3>UeB#mK-gXZdliZ1HI(>W&r!YZD!hJ4QA+~cevq_^fv2Cj#b>BK{$lf>KT~)8qN^r_#@#vDsN$b8~$PTFR@?hsV~Hl zE1HDW^K^Fx%2&5LuizZa;Z~Rai!e`xVM8Mi^#Iq@-lST-F(b=I57p z7WkGOAhT?o1B#=Ujq9nxOMb^A@@p*Ti+Sc5fqpMbO|P5+6XcrJPc!mzarw+XbQv|B zj|3xZU&~Z4QCvEfN5@$2r&M(!4cAL*OVLd_o6DK=ZfHuLk8fMKKvA+cM5vZ<8AD6@ zE4q`6#}O98Rz!r71mDt;AQ@!faohE>*o8B1C{4E2m{n{>2bOXk6H^0W74#G1c0cDI z1|RR*U;4t%Em@w6GZn?4zGCYkEJS!o>($ZFMv8&yJBCY)T{QxmPVNU7O!|_qwbnrUxwAHWA07n-!aKd2-IX+X)AIug6c<1L>uw zaE&!)#~L_D1qQQ~?5hMLCvYl`1C~&4~_2y?9lMxthB! z*+7VUIcGF%Qm4XK#LrsN!MBdmue_$6_nPE4-jXY3fj;1!K+5;xCZe1!>ub3~4WYrt zLC84-%Df(z$xIF!eBCtdME(e#vsyyNw0lr7CdM(1j`>@806xyZB9%#ac6pY}^`aYh zDOc{E;jTPJWr@f3&jE+(5s{7W3Ir)iDkhF&lE*Prl3o=FZ=GlT&lc7X2&B*3=iR4F zs;*nMKD{42D6N|vtbnat+Z^^uyvDoOjnujh!j}-OPFoCzRK!eylxvX}dx`T6D?S-^yM4JBoxgEtQgD`|+rwNmDTS zIjXYIqmxqLh@;`XLBpzn!{_*bn4Bd_!ez&p>Vzg(h+?{L?Da4;hahQQNC|@LRfDYQ z{RP)u&yLoPgLk$uQYB{SW~3D)fI?E#hp6!q=o>T-1{%UEi-SIVVhVTBm4U@TooA$g_sa^HSBb-{Ir5BW^j-pX~Z zRQ#q+KsI4*ZjYl$iT)`gw7#gbZeh>1S(30e*Sum1|H9!&6pS$+QYMX@^N^bu#{H?e zs1v+^`{+V}yp*s;U-?o}o1L6Rx*Gby(s)p=xX=VH`+9HE`FqY7zpfWkDc0=GhD7MS z*t98J+9ts&ftqW{;rKCJiU92T_l-G>n7GE%ihO>!F1RbUE>&$^tY$*nO?)r-5lpaBM6~RjD>Z_;J?~r(J;XeR4|= zB8sb#;N%63ri!lIj-_GGm

G$hk=m3JfLWE`(cVQK=YXuS_G|B6uwLz%nmok(vQ_ zsSR~$7x@Bhg0m00zeI2;4I5rvsw9!OnCH8k(^ew-9G}t_Nyhn zA}?x4^KANvEe(c|-2wEEzG9tVhsM+GbT-mWwtauq=WBKSGx~&p`YiY$Wx-P$}R^~tAo(VqFp^TolATsZV}v)Q9{T3XItY_sA?UAnO$`Z8B&;t0GS z@-n{uq4@4?Zu17E?|yEp0)_P1yxT_I+?%8<&upG!5QPl6=zNn-&$vJ5UnpU+AA zJ%aQ+g>YQC@S0UikcHT8Mc1=vaz1M;5(f_`R$=f%d5hfK620*^S<@6txMZaKWt^wW zLNmOTRY{0jZ$XQK@0!l)t|ju7-4nRt>`Doc!?s#la5Aaw1p>h$0U#{CsXGV}!e!wA8LQw?QT|F-K7W02#m z;(RjSd@cv8WNCjh{obk7ZdB?FejIpv7FdK^q?U6vEIdXk=RfjzD#D(q`x=8dx18T*oHyD%g+@bTP?l|*6 zaJrJmaWh~!zij%JH!~xx!wpN-cG=}rf;>I-9%XL%BPG9qWn?TLOxto+!1fd!aPOMxL#xOqmQq2d^1Q7n;xSq;l{JXv}!;|))mI!I<(dDfmL}HuE z-yTl??V`__BwCW%(oL&z5}_fddvgX5e`-DwP~h2u=X;*=W*z;wdD=n3A=As#J&pP| z3*9;W-1q9D_sA>V3oChyWEH2Yq-f`ldLB}qx>Del$@93O10{%p`vgCkGhE8F?Xgw{ zQfR_2{iiqOnC%QadPpnumqW=V~lJ0rZ8t?^h^EkbAL4OAjZ zEqP8P)TqbrvfSHGhh^yuiX@Jx1XR|!l zjax=>XrkbvLK6&U)F6~16?@UF1kd9$R^nWxRo^3P-JVe#Lu>2`tsH4f_sswy$=%96 zdgd=oG^o&uUT*BjAc*`16Slr4Q%&u%NWOj-ZQojv#E2myi%Q`z2JXs@{Xg!d! z5Q)q3P0n67@1)3*fN`bMLLV;Cx96!pj!p3md4TZ8KW!l}CN<`@@; z9(RS|k@yF7e0H3x+xS{sb|kI$f(Z z2Bz!~_F#YX&GE+q3~&#`P?>7>kJ6&{mv)>XrdSs&gbAFKI~~ZLQE#hj(P?6BGKMgM(`p|Y%VQRy{AnLr zM>M=M-CE`20;i*&kj2^c zVjww%r$ue0*^uqB&awO(0e1%>mS;s{(6;JmVS{VxpZ;>e#xc8LBgRc)E153t+GvxS zZ{sJl$lijA)giVq_Y?oh!)L!S?VAyOmfp%7rh(Td8y(mTk6L`sQWZIVW1I0k1_gE# zDMwf~0rhx$Q-;>t>hBB;8Xhi5eP>YXrs@I#zw6zDVlxYC$z!5U2_DO|Am>#H@ zKcFC9>NGt=#4+>y#VU8-q(!aB+B=gk&IAp(SuVX)8{c-yNYaSrsVlx!*G38Ow4w~} z^V>ugv#}xH7$WtzE9izRO!{+E=7>L;x1nt1EMY2f!ME6@Kjq|!uV{2E2Xur&WT*M9 zmTh_UOC*fZO|CgOn~*uj2ifrlAyas#1c|Db^^a3Ysb2^ChlG(e4bierApIQ!CE{{1 z3zLP|Ug`0%Mq8}C8^bkejXHs{lomo9NoQg&7E@R$PI)}v{C4>jj?q-naNXhWQcfjg z8Jgf(a!8pU$rf^HnQ%JZOyYF~#z8;1y*kD#BAD@cd1>Argz0K^-oxZvX}ZkaWt-q( z-+1Km!UrGVQdAf)`z68Tp!kU%v%*odPgIT-(*-@nJ%Tg<7rHo`2{f5tM_Wo3a(K_6K$}Olk%ebMQ=EARo^o| z#{ugu8i3qeJ~0y#V8ZPf(XcgvmOnbeu4^hd%`!VB)vS+!mBh9uF(k>>0d+5G!m1~r z3r|#~od%cQHN0E`VFs&8Zs72L3uVZuleM+~B6uGYq~&+-jdp|VyDo;QBGVQh)fffw zQcA?;O}|&LlCJR$VTC)PGY_Ia=_RrK<74w2|I>k`Acd!)9f+!(UGfR%Xr|+s1yyrx zkT=KscoC)CM97!sa@GqUMv%cLD!$&zj=6laY8axs9$Q7;d{_xP!iSf zn8;!HxbtYFVD?SZUbhA+`Gw{?Ub)?}gebx3VDMsqrj6Q0Q0eesDDu0)wu;hIB3jTb z3|aNvsxOERWDMp|K>-;Ei%c_TQhB52;n)ufmZ563+2tlw?(ohCT>HHt-S9b_-bW=^ z06<_`UH+Fx;>WjZuUBIxk(jr}9@Enzo z8mL&D?Juxp(aw#XC(6(Fe{W|@QB1i^&ySBL{!M87bxM9>=9)1#U5Pv=X^z_RSuTCF zAlw}C)Ors4NOO`gLQ;`Es+|NLW{=rtS!s*eCvNz&(h*$Qwf7R3_mb$|E8vSO=2tWM zTMJf#vr9kO=J@OTy%X2^4${JRB&YPl&g&eEw!hb%eaY0r1jUY+28tc8p`wb_S3VPP zMdzG&=OmLGB%@;dDNUqalg&`-7CvLg3{IV`Itc|Ix5BD?7cH}NIGrNA;j6fyDCQ%d zSNQ*|TRQxQPB^F^yg)r0Ga4qw^b+=3;_Yun#VE^XoD#gB61=EW zXle_iWs_yYgB0eSnh&2=Mi||i41yFg4e4eFBYEo}PeU;P2;w8hl-wx+sc!#)J%!_8 zlTHD4Lg_1YagTi^v1gBN-WYigjqG!MLt|wz-Y!P<9*_6|u~%=H8I=<96>LLXKoMFj zKpwEeqje#(pN563`$NQdV*Oo|c3H9VBf!O&c_=}yhOHEyO5L2VR-vq0E2071#zD2+ z9ZACGE6Z0{IkGDJU8s>I_sDd;<Px zk2p%;5xI!pe9;r+&;z+*>w@p8(jaY679S1d=X#nMe?T+oII|2FE0t)H{1iLfkEy`C|D4-D`W4dSQ(gnAcS8l0IerygK;6=Zn|R0n)ND8DN?__Ot6-B3_GI5vwY7~-O5ad}^z zW$o`l;B6Ccg+l_<*r*5`QlTinKj3h0*^>=T=o;5C8)x=}9BurjQ3*dh9bi+3sw6_( z>5JLPjW5Q-k)Smi8Sj##s}Z=Ri}ovoEutTUc=aV}K{`XYUiYk)5tTkNJ5w&XZS(gNFL`jUCwRN$(YNm>Bkuz=02AIR zNp;>Shjm$>@|II0oSJqYIwjPhd-#`kNU*v%=17Mm+HWi!G95I$S|7)D%5Zxg4lb{% zK#4&_4oT!dT85SoQa6Vm8lq%7zsZdqn7}&-YC`q)+BIea%Ml{$lX(7Udb-t;F3*@aRyWTQ* zDLJZ6mqY{dB5EK1l6B9PiB2@~=}HZ-;G2O0WJrw#8!}Wb!8tt0+3p3H8;Jp?-|?#@ zBm7EgYG;;)1QY~*t~3Pii^2@uB-rwCLQ0qmDlUkCxt6Ct6M4y?|1J!VMr~cv5s;P= zw19rRdEEH>OFj`J`vXr44<8pN_7|q})GU=alBqA|DJv$bV#Dq46+`Mk72B_Y*F^^5 z{!z=Bl`|0ZAwB1$Xxe6Lw-tu zzuegKLBaIZ_R8ZNUw3uH>vduunZgz;{bc6{Cc2sLQGLDx!vE-6Dp1V%?=ByiG~;!5 zyJ_=jOpJL!T7|=id)QG2+?Wwy!m8lsHk-KhzzVk6L9k^UQ?^UO4ATlRb1)-eHpaTz z;|U|;d5xzSI`RB<)0Pi4BU(iMBg`>sfFV!&Vo6N8%O0tUNA$VcRRX7;Z%xLe!GPt< zIW6B#Ay+#4&&S|IVvxVd-#rZMBO@^Ly1G>nFvK~NSetq{#LHrs)DH@>CopuSG^lt| zA+7h{$K!!f6Aey@b?=jBx=kC|wIY;IE@@1Aj8xPW9}LaTAH7iyBhos) zX}Ivs?^k#v)d{`1;AQB4{wHSVNFhoc_jN*mt|zH~Zt>>7H^o^FW9ZT*&4e9HPeE<) zu|XKor*~gihV9^N&PhhK^!t>)u}ADR*xM`eKQ@oVKa&Hd!1j*^aQ=AJtDsZMvy zhm*2Ng0#zD(*KcIWx2pAkPu@#ph<_e*E`Nl;t1M;w0;fUTwkgqwNxbcgL8f?dX{1X=Ty@G;oR+VY5Nvk%|Db{;XS5R|p` zLQ`DnVRe>sC(b`}tb&2A8#}txxL(9VGJY z3&MN%DdrD=GSj(q8b-}eJ_p@Dlq&ecd@tyK;)Vwt(LxRMTPo2v9~z3Pg?EYjx1XVC z9>2Ceov~$b8x`M-z{&=3zAhTvKHPREMa;?vIS3GLiY|I}Ndiz|V>z6GyseGbt@8yF zd30ZiVRd(5_^xnSYk2L+qd#x{eFWUd_91~bhx0qi3hxFDuKLF6;mnRsaOYOqtDQ1^ zIhf34DfQ#ioqQ}S4tY+B-zEb;?tgs(G$PgQUS7|W*6UN_#tlH{>=)^9TalOl8= z2?W`?iLe$xTJ$?aj7@+>`7sd1uoW&HWi(;Rr&{2c{w1CpGNHGN%c+SaQBQ>Z&Yfqd z_5n<^ww?u%p)@t3p36qUgnE>Z<&ATZe-@<;e|#+^NcsIY74n&ljzQp8`E- zyA8k*VZml9Myy-(kQtEHOV;6;40kf4_T?>g4L_~NOW=T- zaxiS-xnKhXYXdKT@zj4!2jq;hA|h{>Q5_-c!tf`N!m$%bO)!0Z#{NRn`;2pu77x}Mo*{PV>xOz@)Lv4-lH zCa!9~PdTh80q)q(My^KEWD}d`20w7=^_}x>S=uibtAF%`BnNmUglG;h5 z3_a@}$BjD-NeOxyM_c5|SBhP-sR!1PXB>0oD>R<`G06yWYB@-!|VS0d!8jc zdT?;#84Bmf=lW!7BwfgA_?~lSzq>Z3lRjhQTgF7W#2U{mjPvZ6$vNkdzk z;O{}0_l5x(-7!JczJT zl32fM-i4-hJcbfmM8qBVf8lA^b+ib8aRq)jFX5a+b?kZP=Y{D{v;fg`PN$hIX}E4Q z8?^J641vp%PzWzZmu{~YLl7ClwwcA{twu+!)zDb7Y%o-pBm6ssJ&+)QBLInGf?FmD zRNRdSmN*rx%$$IWfq6isPQ(jVJiUVgxvr3_i=A@IyxyL|WJ1*^^0+-jbHQZ6kSq5| zLuFjvU&RIjTSe;hffrk!qu1#u+noq=rQ%Bn zXzU;V3Q*~Jksnmh&$-!0BHM2-mu|^z)LPeSsvbMzmFznR@pzX=A?6&) z5*d~gufSi9N0ZiZl>}>NTE#&2&PpB+3)^M2ej1C8 z7lWQZs`^pk)pZbmY~}rGwx$TYuc(CL!1|D!;b3x9Mz~bnNAJrjwJzUR4Cf)xOtC+7 ze$hxyP;P$kXx-@V#|f4lY7j5Gme?}*N2|Z@0B8ybltT|WjzptIm>V;?1YdBknmVX` z0catM=$^K0-8Us-H9ZQs&&OvzYDpd{Mw<7s1(kNnh1|yxGV@+fVS7%HFOT`axz7es z2UK6R?}`cSN$wGP%fPg4+5fC_9}4Azi2f4B`Ii2~{VVLI=;zR5U{`rI&BxFFZstTk zCbQJ+X|C`9_&$iC6*eM^zC^VymPT}R9@vhRR^&Q^J=dAeZnhYHaHP!%FmfdX5vt4r zEkIy$HOsQZ0F-fBT>0c`vRi7(E+*reIL)|+ zP3s)gxc#-b;5o&n`7fNj@aL7xJ!hH8YJTA|l;GBBDT_vAvXDWeSrvy1En+IcyH>X+ z$Et$`CQD?k_PluP6sTQlx%jDGI(C&^Nk}aE&e0Ww_fS&@=%>MpMt$i-?kV!rU))oJ zIqLk%pV+40Wu^Y4n1n$JbiTWlmVTj5kL@P9b18(fyW)Yh*JYrUl{ze2x;uA1GJRq2 z-4&{Au#1kD6;kS(l$zWC;4xIL6%`C6*R5yW6xqiuL8}l&JkA7x4bmJID zKom+mfq*o-uxXg_5dt1sgaHuA4#qjh`YhVM+n6LJz}< zN8NF)SQ)C$FFHqKSh%nD7*k%=syWt&_Yzfu(P*a3z8_gY1*XbgO{pW*7oMqI;#?GTJ*h`o*j? zn$M^v0cGfsG>x=GY~JNqLb3Z|6-R=;W*6`9Nu zSmq5XT;)e+S`p4xn47}5JE%$58Jjd5x%wI9U~;cuKE|`+(z?tCeyDbYD}U8eg2sIV z2sODTJA10fk?&lXO}01|Q$1GGG{5EUE+eWd&iEcl=F_h-aNmk{VBsaVYN*w*k7CLd z(=15@$6W?pxA8EXtLuFLR3H8w3U0R&Gap@fgY-p}HSKTz_pHBya#MgfPaNS$`}iZl zo`33Y+Vh`c+UrhVCc>n!GJtdu`xL=&ZGkS&PX?Qx-hSGl^NPz(K_y9OeJx2#)933G zU%$NkE-cJ5vi`CW`H&Rfo2$Q;Qnr})<-#fwu95A!E;b3A74bo#@3k~LUx5WOIL zyE|*yhkHYk#!t@26;8$DurL&9hzW4|u<468G$r;}SG@r3x|^H+LntYC!|ANOjU1%| zIO`z?#0Lp+anwn7rBk811=g)!rVU=a=$e{QU0v?=9v!|13if}rA+&GgKv8vWMS(r! zHEYLu$k%-|rbz}hVjvGpu^+Gv9jry#)DG6JxecyAXkE`7dR!aNi~;JtvLHpiUtSJ6 zOn$rP%zLh1SwN!+&USR1e<^tU(cGm?W!5<>NKF2yCM7&*B<(@mBNc+;dUJZOc^$%M z3GOy4{Q3=N&xPYqdEx9xJi{;}@VQ!fGMZDyZ zN=A@%9)eZ)5XgLfCGQH9F;7#=3yAa^zJ@(8O#ywN_0{Rj-wscD(AYT|r|ZZVDD7HY zpm=*iC+z_>L#F|s&^dBY4Cxm;60foWON0{N zK^TEyfh*tNCLPXb1qW zvKbYsViSsqclfRO?79j;L%}a|RHLk0RxN6yISYF)xN+YU7|z zGNCLe_3>p1tzMR+VXM6!9W~r%9#l1Y3r4_QWUw+iJTgfuY zM!<-`1taj}wQQi)$qBUeeT5GlR3AQmxa2xA)$m8MHXcK-e+HAiRMZqo$@@1aIq@pK zULNLF)&4OV0`~;~)yVnbDuwlZRnX3z50&elKLt|tA-j}_I7m@r)xHg|)v?QDWHY5f zo*$;oZ^3Z<9(g!0P5|Dqq)yB8Nn1IT=(PF0f!0uUD%XBxGV>IB>6eN(qX54EIFsd2R1&`Tww8Qb~h5_4x zNtJc&j?`DUo08fk7wE4-`)Byj(!y56Q4~g#j2GYY_t>6PiA)Jn30^PeC7{vfvzN}y z=mH39%33H6Nw-?qg!-)R_`g4Hc#xJ-xG}xHv&R{Pl?BO}5j#=W&O*v%5_^)PbnowG zl1PfZD$&nXGQ=Pg>P4B}KL4M=Ut#TMOMwC%Utx=P3gtKwTt^Rd^2G0$GUpW=iYQek zRW%vzs+G@ChB9_9l+sA$q)dsv(1N7N=rU{taS7Yi7 zQ{18)CxcP4I$*!S+5)Tb)g63L!6^Hw{aXJ!;#*|X6T6h6mKWuwElLy4eO2wA2a5|8 zBeD5x2`Ph_s_(hK6+pHRqh!|!(M7*iG}Qfr`xpY}n}Oa^WfDQg>Hr!d)nV&m)Yitb;vPu~@mykDV>Ygi$Ui`G)=+ox|0&?UMX)Y;5AprE!1 zH6GRRYQFk;oqma5=674!L!{f7`qrb7?jX2&u-4kO6lUjJ&!L;u@{3N?_Twh>mq7nkprA*R}wl(y>a z#SfZ3^CJ2kb)5f&n}2{bYe#M= zfWx&-ojWWOD~7AHPqjCeZKcQt1e{`Darg2<8$mWO57d^$xI9O_H`+J9)x7j%u z&g1ALG7YO=W&qQ&GAXYiO`?e2+poV9NApuE!Kv3*^R;N}N5pFi zS1>&ozTQ#{KUSKDZ#dImG%S|ew@Js7U}z4EZv$ zqEl1~3eu{3A8>u4+Dr2lrTx!l00*)~tLEAa#Ko}|j-SibPvlE&2R|Y&*VZKeI|H^* zf;X;29z{_tX!FfPf$HxN7iRQ%{=?_E0v4kjPOcN5qWCj%Rigrz57l&k>7;}e4%%ev z_{V)Mt6%gfro=@D_TlE#VFe7Zr9GN5@yz0-^q95?&oBB0-|slpZUkOG>UX$caJO%t z!KOHVA3P^05Pgneeg~xLO4yeD)PN^R_hpupZ=D^0aQ}i^y^l963p?}Z&FFZK?lRCi zn4RlJ4Yd%AbhjXp{sAWgV(`uy%{rS+Ck-~#2L}M0hG+;jfhnP&I(2!0#(E}@>290@ zhiagCKVjpzn8?@2@Y9iO(c>nd8`%&8;ywzlij_eExHtr?QuRm)EBR~4;RNDh8p zBE-_&g@M<_rR-6XQf^iQFc)7h_3}?rcW4-vT)N zWh7f_0;4|sm0+?JJh+|2)2KwPAqk2{hI>fBwoV=J96-JiZt;2kdjEQT5V6$ zoTfMJe;e}qyPh@xR7_3h{LdvkbEDF{RzSkxWQrvX7nT$2)wYKO@nAaZz2$d10O(-S zolAg~D!`>Pjs$FpRTSbcb}wL(gz4v0mVX(`l=;y7TE)%MWyfEet0`pE?vCNnTBg9t zhHvX81_r0`9v1(}`1KG|bd|q{i;;hJrkkMzUysQ&wJ@0gA{kxG@zhRBwXqgq6 zb6~OQbE)A#@z}ipnSE$)vfQagCEbO;9p{s@#+b_oHvz!3T$JD$;XVtd$Bf*0P~_5R z3MkJ7#HK(I(pWc|5Kmt7nnETHUOFe6;E}XO7$@3htyh+v?aT@cRetv7Gdmj^749vj zF!hp~R}m7#qkE#8$ji!(2Ck!IH;nxGJ+6RTlHke*^cn;Bc;hE~9gx`#udb4T-%aB% zkAc$WQ7C`o8ZnVRxN1c@gpJt|q$R?K`;61b9)D-R*>To7vRiKRW^Nf_9C60Eas#)x>`Du_hBbvg&)TZqwT>OJKkdI3y|D^_uu} zS4aLiUW5ExFrz;x5THym!WjalKLF;v#In>>5d=q7&f5kGxHE#65@M+b%2|u$_Ae>U zck>r8QT}>RPVB{oE^|^pyxWV~_P)M3VgNJtMN2aiNWLkwR#kUE^c`HMTg4Hvh0FL= zMof!!>4VC_(s!k7Dut61QzfSz_^4YOKo*Oh|5C`;#wafP_H_pEn)%C|Vr^amW7mT% zmjSAOLCIr!GN9 zhQM%mcYYP8IoOFhOg|?z`@fdUhVI$Sfg+Bmx_t(@K2z4=YdzUw9q7?iQ z06mB=Pj)z>u}bc$U$gdWgcgC+nQ$?D=xNzs<~RFVbyZR(2UE3XHV3^+zx)@Rm=GLK z?e92>EIt={ui$31meR6g)d2fZQjLuUic1k$#ZH)ZI&Bpnss0^smaz3n#lH0b#_4yu z(mh72y|E*Jb=g9tG~=mT7GYWNtb5G5(bx7kx(q;cG4Ckc7|r4-h!HgccF zff3qPgLBn%(8@!81BjG;B|vFSWUr^@Lj&|Q3%d5|hMfsr8xsu>m}y`1t6PT?+ov+& z(JPMt+t8AAUdNYTO`cA7m(VCqd|bHKx~&V1m`;jWh8q82K(1of_oOBlyNc__(eS`kYjQidW87eye`$if0b6yH6Y;yw?)wRCnFoH4 z3_4J1vL=1Win$DLzsm*B0sav_Dyd*_0Kfxm0I@3aQ8^yS@^8`?i3c^t^=}?Z0_0T< zAUUU;vslrsdyfMbMOkO!rLX_In4z+$>$CaO^0M|+6hLSG`WZ@8^75*R z6)q220dC{*fBCji7w5$k6>8+G)msLC+8!7qTv_9b`Kg)_rIW_uuT?=Sxg zQ(DOzMl`1jZ$QHvLQV{E4lfjN1?CX|(VG*VLDqpAn~tXoo@SM^Kd{vo?hL|nwBXZ~ zQx_Bh`>7Pm=K~Wgg%4OE(OPcA`D&GzC0lpb1RHm&hRA`rMvhv{IrmP7)};<!L6w-K;`8h zyFVmxz?@N*u3$)bF1qCRLPxoZ(c1Ri_Qd%Tha>k?CxF{Oxt3C|0r1c*Ys>=NYIGu> z3T~Y|H%d0`aQp<2(i^}kQs`bi9BY>;2V7^uzNZd90HO2y3q@kDeukd+FdWoWOn#RP zm)(%jxR7bD#%uci3qYjcmIIBv7p1thhp>=eM3Qi1vc!qWC;Q|``>%;?VRw9ZXcI-~ zbz$g9Z8F>1N0uus2+-mfxF?FE)E*f40C$x`S%|(zS@4u75qlX|5_%G=P`2h1))bTy zN8#`A-&`gjO+03LXx)EmhcQ2NFq5U8wrkhB4;2gukh6?%k3;G8vxyh)MZNm@MSH~{ z9yz1zM)ttvq7hP7Kz{C6zo5^%$MQ6WkVhOGlfpVD(?HvDv0ZE_XImeV+oJ=%0orA9 z5I)=isEh>1zyi~w`M>o)0K5zDWECL(;;lo5T;Gg(di2H{n@M1cL@+=RZcDIRR3e3E z@;~DJHe;x8zoJ-0w)hSndbF-=2WfxOUouNMTTUF%D{I_dvIMtMZ>B(n1SrxfK5MJ{ zjVKWW)1|iz5|M3D0wZ?B;fV#KR z$Pl(nHNce{oHq@vvM8qQM;?6rFToa_vxZUa)lgT!pxy87?9Ke;954qbX5qsdUo|W? z1KOdD!OmTEW9Bc58ePw7KZ-Lp1|-)ty43?1Rqyf6OTkVEX;sI$b(l?kwhDFNFN+FOiRH&S*MY0W z6reGE3H_J)PhmT%CtV)R@#Nv@O|8!jiM;k1EJK|Rfh)|+)5I7LxVnPl#-4~(echd@ z{_H>iG=TT@(&&co&St}vfIDbX60mtayiE^>sm@%tTdL`^T9P?zEjLWts-o-_ zxf`0P2@-G+gSjIK&W?Esn*pv7DpXe8k-#8^CRz~!$+f6QY5)~K33?T2jA5TmW_@#a z5pGyzy`}`muXK6k>u-2A-j?xKs= zBHq{KZSi15*s=vNBipTFd$C(HahjnCDZ8ux#3(zWoK;`7EK3BT^{`HjekUp#z;}%l ze&dFmNqG@(;~-@jPSmNd@oq?OUNCE1J@js)?2jz!mP)65R#mxtjd;TvAP5wlb6_x6 z7>rpxi^ck81kFyq462eIb(inn`W&SRfL+Pc(%<+ztPk{RU@F6L*&FmUTo zqhk($fufvQgQyK;EzJS%7}KPu$Ipf^;&ZWx-W?icQ!Ye&xMM~A4uBJ-X|34M%MIrN zfkQdVf1gZ{QKV_FK74kf_i!TjQl%+2F1VjUeF12Z1N4?qn&ponP>si_w4RuP1paUi z#SZ~$sFe1mQAYz13OKE@Xg{VP>{SdIFmlyY=@W;?#X7{?nOPyVYZ?`1gt> zdLdOT?_#5<@y{tm9Hs>i-MQE0le|z|IgD}5cN0*T^BsogLBtCW`L(sVlx1zUmNhiY z-!mjoP0{FT4<*_Gt~Qgc>I*H9s-lWQRh_Adhz*Hy&4JG$8FzHipcx@{oeccFXI5+( zxSa#hhZ}dx;DTrUvONp=Ku9;AMdJU^^%g)?u2I{tY&TLWT`FDDEs`Qi3kcF7NGO6L zAp+7WN=TO=p@eiQT^poR8WdsEC<+@8*_8b2(f7RHH~&BX%$YN1&J6ph`@Yv&*SfB2 z#R;QyoGJW%(;Tr=(^4K?-I*tg49c9ikj?+-*9}y9IN^YM8lUbdf9B9Icx3=k&p4X| zbksab+pnFQb0tT3lp{@LllE$rN>mgAn{9LN*-7N?(oI@(2gf$gX^n_;tLb!s%l#zJm;sx>e|c}rYMgKU=6Z_P-?}nocdo9a zyW-wLvJRBCr?XuCmA35+{4Uz*J9V4g{F*YZCl_rMZHdmzOOKy_jj_pYiT1-`n`2V5 z4GIizLl0K-r2!YsSMWa&)Og*?ZM?fV@%L*9JrfWNyLMBwZmBXhuLd=8zO4j*l} zcU+{ncbCf3n~9GomWu9@4@-hyyrcV5jM4sn!KOkw9bRsLpT4J-UpSK$}YzVOo70K6Fk=-2aaciNw5;y4hH0#7{SKf8)_(8Z(W) zvC~R?9d(VzT=on?G0Tiw8dP{w3>WBJH?`iLMrmwpT~VX01cY_GwZj=IPxhJIKQGpA z)j+ZRlNxX8=|9Yhs|Y}L(P)#)g4*;(0Zm{Dp}F}IL7HIJ4EI=^m0@{#^rN#odJg14 z6>6x+rt<|Xh9?$sS|Qe>nfcGweC1`o>ZDb!_em{5hk~iie4;X7;f8*25n0?`XEaCl zu@Oipcxp1r=*ma?>Eyl~#`5S~xaaG9vRFm^b%9mzaETszT53tX>=d)5I?9r)x|*-H z^v;Fby$pE)z5O@yPKv`>FROwwCt+{NezDV(k{}tlBcG^WtbECR=9Q}DV8aWDMr3OA z@+(LVQnDW_UQWFdo7r0PNZ%3xFzDSIusiUGJ%@8L8f}kE-x=ovPy5IoGDBUkH7N^xYiUUtL{CCzzi!u?iL9TiyIb=f!$NVvO6((AOBu4y=ik`%3qqE&Jl2s|l`#Po`LjMt;2~ zMcS>^qTRqxKNKUr^q}d`uyErgZPgjE)8DNR*ZC8ctuZ{k>0!ct)Qx_c;KFx+(ykqg6l*Y}8^@7X7cpv}O zGeSZ;WHUd;OVZg`vOsO!>kaFBk}R9 zTa>NiOdbrb_pJldWj%^7=MJvuczO6l=PHI}r>aCaM9ll=+qj(j!em>%GLjdYBx<8F zSajN`-W&=dzj#*MU8|dgXOj3UoBiV1k5xR;jLX;uZkF9(B({0HA>~A1&YK(NQVFGw zvyD#!uAYt?E^U9`xjxI;kZ8-z~b`FVgeDtX9yQPuIjZ=67sGUiL zgtn|e5G4*pY$b(f{gu-8j}>K&^kK5$oVcrPRCq4{kr{)nDkwdJrL)ea|F&Wc=(`ZO zm~tOfuYS9WROYH0b)fO;klX+9-rDOUDfwF>eH!U_c6DhYERdbj@QpSWKrEA@PPFkr zGI~HUhFem+e~V>WWd5%g-yl`#7NN1??$znmg=Je0)OM5FEW$p7HEd{LP z`BCX(=6W@TK9$))HQg1?OlBnJ@Ye-)H{r(|N$BaBp7Z~fUQV$wG`>aX2I%u^L^|`b zQ=db4X`2elRYgnJF0S%Z3cylT=P=Qt!$S^t!~ABa6w|$^mud3ep^^=Naw}c9-j8o4 zXAn^o_zoyQ5V0j53boJ@Srhx*X*D6QLKoZOW9Ek1Q2wX%xbaQ$oEG))eOu0ryL&5* zVG2X??}0>=J5UMUoMB|Vr4AMH+aov1Kk;T)Q)wlsdqahCK?iam(V8d7k z-U*8OV3)m;(H=rBN3!)%tkZeG_!!%UNrfpZPS<#mU`ykCt!WEa?n-cYb6doWz_UqI z;r4R@+vdoiXJ6&~hT+mY*M&mmBM#iyY#S|<~ z3yxy~yc5rY6bk4%P>W(Nn`-)70X1_mDH!TE8UcBcsM{tDmUk_P66L185kG7IAedb^ zw$kn*`MNO$I^J<|g$iok#m~ThJ-7R(wtu;kTKZw<$GRU#cjBCrY`Lc7ER~n|(YI14 zmNa|0LJT6Lml#4ma;}A%<1RF7%z8mKb2%AZ9wS7Fij2=o5WopxZclb>69x|tv~5OR zc-u*JCDCzFcd+KA>`#T_YO6dw)KODTv=l1+w_J$#pNpIMrl+V~MAb8!Aj8~LICm&# ziXDE%<1+AV|1jM9u>QA4TbtcM7Vo>@^OHm8=UPvH1mLd^kqAwm{%Fb>$n%DJhw+KY zoq;q#I!`lPr``3oy#>1h=`Q&!m%`O&!NWQv2N^mVv=;au?rm*+GVX7?a>%sKl=F5; z&v){3;TAc5?)~8lG(xf5N!a!CpEs8s@U?JpsUf0jjrtk&aMD&T>p5wcQRidBCcnc? z;(Eckt9;7&)Rp(Y81gA|-Pgc|QJ*&=T>7j7fVAiM&S?BGdkV+Kr^XiP9)^eJv=%9T zeB=7XHT^TL3#NH)b^SNSHx?VxR}X7{_v|0mMhq+;wiJbk-Uo7vG#>ku>v$icBQ~Mx zdS;wJ*l1L8GbU&en97u>0m3*;ox(K!@NaIGzoI`_)8EP&sy(c>#6uRoy49a=dCn{Q zdB|pZD7;8IPr#9r>>6igE{^xRSsIy}uiYAu-;qGrONHX9EWRJI?st$j0R<}={M-uV zQ2tOvtJO;AeOAP71Xl45o1ZW!j5NiLqS9^uaLOCfT5Rktmt%YKqo_xXeJj8gf=9+6 zjZ~VeHk$O@kNlOnUv5b`8u}kuD(3)4j$jDhx>+lL`M+LfUR1~l7SGLQgvuv?LtLb0 zW$aA;%5K%qN3wHeBc3tvgmU3x`+u`?{lPrKX?K}gp?eum8lq@H))ucg4yx7G?M<@n zD@#7OW}=vH+;?9~yS>v760ADI@1kh?>aFKlug9YzljX6n!)kSDKcL^a zyTBQ=rp6oH^iqDrs=ltA5Rm&$Hf)x-E!s!}n|a%0W8GrL(qiJ7O)gsD^-k3RV_FG^ z1#pXUMITaPYWrnY)%fOsLH!CLVoo`PLXJ99;b;UNtyRP0wVLH#dP|>MI1UR4G#2eQ$|I46#@{~UN(=X73-{^3Dx;QgLUtX~ z!qZGLR}~sGDDl9f?Y)*NGx~6KOt5l40)d{Qsb$+v^Np8BJ1T^jg$_4=$wNL=dR3qS z{;I+{{ewir+^n$jv%_3v#E~p#qdwc98kx^>e`+7(xI%-aoC!v#^tG2RsT3}IdD$9* z2F35k;*Z5$!Tw|b(1xSYmw`xQx9W}-HZLo5)E6SVB%n@-{I+DM*9KNRMMs+B7QWW0z==U z&Uj}6*_CZc!j1d+89nWK20vm#{NnBVnyE_u9+(sH z@?Z6f^UV3ZH$5+2Uo^eo+86)nv1eAz#h||jM4Ofu!?S^X`Hfa;E{g?H{z5Bm?G*dm zhF@StpmsYMgsEm<5kfywcpzLwbYKwgmuh3AHAnB!kN;5;Ds)zve!JJXk3;RljT~+3 z-P1_HBufAQdxDyO;hK8EwE_r7bdt-%2RHv-pT|YhO#v@cg^kO$XXM>h< z(*0sMMIq_QW&|wS>*#Q&ZSliBl+LH`;sbIv@2(}W-@PA)$&t1Ddp>mzsV5}&J|j_@ekDjZErTQu z2SlgIPD!J~*EpA@CFj5W+Sg|_FH)rMcq0r^7XJfX((L|ZNzGrw0I}bLRZ*}>f{+yY zz;*KEw~>py=tg6M+>8I-#+^p|TEV}!G1Yl(I7^-SN@W4KVTSFK9>r2i38Es~4#TCU zqwZ_CevI{|m+qLkXUTmRIk~x#E~!Tv{B4)2PsJ!~2}F1xO+u5G(qWGH`WXe^J+=Ht z0yu`s6Q|B_y5y|nSPKpjrA>9xf$iGNKp zreQKdMR5j8dK!dsu)RTK7*B;|g64^*n>RmwxO?M0bQryRjz^NQ2If~2QhoD>7U*l} zMt!|k`|aIxKF`(SIw$rck2Ou`Y{TA(zY1iKGb?pe2IGErUzSlV|MF_0dC;P!ouK+~ z7U`3FvYse{1;cxO zasbH`8@&*n>ys5<18XK}*Q{>{1gYEjXKz){z`aMXDz4iD(K89qnY)e9$AW!nJSL}r zO(XrQJ3+ClU=mV#$ET1fl>9`}37?3fnB`5crbKhs5QbMGQJI-SwJYpb&8Ty_HUrf_rWXmSZ8HjZBC?-xE@Pz!jewpYlhwuFXOd%#i z4~ZqlUn4Kh5tnsu#b)KfdQSKov;JGpd%f>3PH+2J?AwVh2^7z6`5~apZFscsPZLn@WJe4SyUrfytp*TQ&!sKO}`yKYM zvW0JFgsSo7nD+&$*)_*cUsRkjDI`>YmV4571XJeIj5SzY$&5@ms3Y#@1U$m!7qX5_ z);enIn~brmrf$t`2E}iU;6Hr*X%jaoFxk{;;cNvi^X-4zU*PQe{=fohCG_s#Gv|nO z+MgE+;)<{1r>G9V+|=&*X(m3i9}1{P7VA*z%|Ii#!go7W>Oq<`6vA47oKWYiZ%MwB zOL?&iO90Fa6HsaW;;dK)` z#pvnn184?CyGmZGp8N4W9ZC)f|NWm*ZooZG0zv5)O-YaRf!?&9L~~7>d)OE062-K5 zb;o^S)F@`$JdO5pfzGAF53|zqyH9jUG7Z6gsD}qv>VKdQCzQz*0Q5fL?Y#^i>Nm6B zPzI@ja@TU%C@Sz0xTV+zg)|xc&9dB-+kcJR&{5~QFkSK0W2S-KCb%|NSa}B|mC2BK zX;9ovKu-&uI}P5SqSsPDc_Ky*)|sifX2QD--4$1HjF8mgdbS3ozCMiou{2NRJmu1{ z=$hNOV0uOhj8w;ys%HGmp6q*Xe~)kH%HK>u?mVCYitJMc-CgZt`3C%=*s|3PL`vy{ z8fb=-K9$Cez2cNvzk+EREfa0oL_22BYd&0Rui9dLIhRoRMd^p1$&SSv5xNy=I4Du* z#d;19@XgKZY$MHA1SfLxI|ddBlGGluzHH$tgy$)+qZxCb^d#KTgk2tH%VvF%xtmk+J-8X?OEm zX2+z+1S91;Ms86gm@jZSx4S_lk5CVa)*lJw(f(;tGhVGr_5b;$Y9O0-Ix*uTyXrf} z&Bh}rqvt9Ug2+zoJ|dT1pl~5c0TD^fuOUslW_=Cg+D`d+N1^ky>mV*-^z)McY&!E3 zzv&RP!!_=6iOA8nYT1DQz&|>du5n3>WvzBqC{IJdW6gXxTa$h=kcY?jTs=_cVX1DO|R#ZsY`w@6=lTlQ^8;RMzYGTXhELwyaoO-X9}n{B3{+Z=n4iQO%GHa1H4p^<2r z#mTYpQKQeTRn5W4hY<`Xo}ii88=ytU z+`V)5Y5DgkFO(n=IrBMp%_Kj|J~Z=N>T4hEhHq?`SX8#y_}=+bwtBpolb>{J9b{Fa z$Xj{0#sA&9k%mcv1umhZ; zW}{IB;1{%{H&is5rP7XAc*X9(ZY!^{n$0ZQmOt54doQSj8(AnKG4G8z?)C=J-?Ueo z1<&b%#6m4VDMV+t+#siT4QJo*hkKJlb^_79o9|YPXA#R>J<6DP^7;A2S3r-OlI8Wq z$@XX#7^3_k0x?W+JNL`H5(u@iDwUDw!WWD`t6nul|c<`wpRLjD5=Sulc33r zuDovFsj94JxihOds9Qakn;9Vn^oW9!;X5xqM1ep%_UMrhX6nz?#VPk@ZRBIM?dO8T z!*V);TadZ#bM{q?~)e{5@siQY1F4RnjN*;hq*mL3|S)4ZCuS*aFg+Kxo> zzo+&9K!ofDO4tof0}aKUl2Q_LJKeIvA^xg<5xIos#)Y@Mj(}QWtNQ90>ByC4vUm4T zk-|c4S_rLagX|91&&=$%D?TrK(w-Li6t;Oe6~_;n^L;Y-uCOKai8j$0?L&!&FPgfZ+{5tpOad76&rVo_tYtRq#8BugVxeAG-7Blh0Nc>S_isS(TssSBKWLW?U?(Tq*c*L z+7&C*#ZZw30BF=G{5KGUWcJA~|Kc+H&QIhVDF=y^df zC|{)X6kwz96ce`!=f((?05h#?F&1NVg-`@2YvLT1hu=dpGTYIM%^T}HzJ>{C<{72J z^;Szc=(tloEkii`$;1_ku&=q2QLfI@GcyYw#?y?O5n;j~uX?RqWicSTD!C^#zXP8l zn1qdg_$8xw7V}BjR$!;qv^vDw1@aupK1&P`2}j>c6fAe*VRo0>~8SU|!U%T|PtVud_&3W~)wg7H{rX3Py4t2=1(DFMrz!9*C z&q;GvF3t|}5~LWFD9s}@S6gvL8VFDacOu|uj8ZLtj2ZMj>^Q`9o^unAv4rYN1AF|u z;f*#!prl=~&GPQA%~+w(M?A5ri?JCtO#Zk2;{uF>sY9;-4o$2(gCaYqcA4iq5+V!X zEc#3WTw+e0Bma)2!^3U2#EpR%5A%^A?myyvA1UFBSo$Bj=V7|FMTAm~u_4k$fT(z( z)2vnW`CIjri=9%wn^5BIM+;Z-^H8r$^L={9ehlau(J)2tMA<)a$8Gn-VBXtfe2K{9 z(9F#t{5mnfASQXd1}YG@4n7_E)lhRyvMp2A{JT~+$f~c$*F!yM?ZrcO%01Dv!oh&5 zIK~SL++H(vo8y5zWl&xpS(|9lV)O^I*@T8J-LcSp2<00+*~QC+zy*VJ_Ve|_geUhG zo_3&`Mh(rl9#@ZEL)O&eUt~-vJ3HeusqL~ird@Q&eCn5z5~tzu)YGRxX9{+!Grm=} zc8-G?%Dd?4+jbLBskhcJ`+Hh0_7xZm8kiA^aN)ctMK{`!hf7!|IDX<42!rovV-d%# z_(V}{gg4`ZT?HVlhHm}v<@eN`9Vv%{yT0ij=1|pbFAU2+5Tw9^)L;NkXFYTEuD#&P z{CxMl)yWQ^_GcqKC6x@(E{w3Tm>S=5_tj2FCR)LwIeKhz6*kV^xizn|PStOBS1pem zA|O-W2%G^O^R@T4`-Ywv^@o+p0i!7^m>SJYCTFrq&Pz@Rdm4)XC_8aLcq?i8DVQqjawk4 z*ggN$OC1%dqm9^2W8Sl4P)*=o@wmB3h*u`xAzI20?CnH=5?Dun;IPQ)MZXf?BE4RX z*L#S-ROsjn_Mb2URa34>rdah!<`&dY zLJ-(Z@&EfSj#Dk9UbFAL@+dp=qy`s>T%Z>Ev2IzE{sTPp)h#`N#Kb9PVHMP|r;SOu zP=QhHBS`e3b&rr}f>e*S|H|`|qKMhWNYctsc36_M+ih+jx2&>?!08~lA$h3>z+suw~t_2)O8()3I>qsDz)fLqee_l`X(S z$26m)>TH1a(Xu_-@{D(B3+T|ibROFxLFWK&^W98K0 zvRe9fxEQn_NC%bzj-QTlD1^OHMum@(X5fk{jPGX7H^k#*8NM~{?aFzN)aU=o_2sRN z=1|q>H>)H|G`YKH-k zy4MU;`#KOLBGv_kwcqpSwueABGpI~+R$vqw<5KjyEujX7w79xvh*HxHx}u z3yQF$zh3Z=jV%E?y!bP0tgR9EoAKXsTm{eEH%iGI&^MDu0$xqR*o^|hjN}s+Dgpr2 zIbg5*#84KT$a!2VmRk!7f*bFyi2^&i`rd;pSQ4=tsC8{@nO<}pOM&c|JoD*d3AtP# zFY|?anY%CdBKP$M?kh1P6UBE4-Fap1Jtt6~qV77v90SA`RUB+xB7aH0OeS}4mIMTC zL_mbR?NKl^SrECGLYLR&(aF!rev=Z&eiorhknc**AQ)#7*{&iL@k z_zZZlh@6hv8Kd$vcgWDQ=SuBCFTL;Se6j~#2vJmHw%JIDmuGJCXW{TrOROXI+-vx| zt_n_uc$v!o?u^1Sl#v;1;$j4DgTh)o{EQ@DI;IKgFsf5wVr}1_kcCs>Hw8$&=*{oe z>kBRGn}5F$*aUU}y>JW)BoLWzpH{$IZGlnD?URb5i4NWZlrxYUErGa;z74^3 zlj99ddCMYmnNFJA2cMkyFD)v?Pue}29_D!c>0b-A{G*b#7QFeA%*kr}rgu^2v#g&8 zL6lviI+-$1$LV(=v0Pw*Z8M^5`343bwqMvcFa1p#8a_*37+8P6rQ0tqq_Aje%J5%? z(q@W?m;6R*cVpa~ansY-CKRWiUC4H39qp01X7= zxFs1tI1MTUg^WiMkQ~>%jq@5IH^MCqIiO#%WoL5w54O`CNxU^n@J0TfDdiicP?dlrz(bZ znUOvn66u%!CDPU;avSfe3s^j{fqK|def}hsn1{FU&&$tTgdo@&)DC<3iK@z3%jGS3 zUUS0mb-%`Sj`d}?HsST1S#KY&_Mq-;#3QG*gY!N-QX=Cezxq6*k~Bo`&be}y%!dxm zyu-Ng8Rir4kDY#WJoZEa=;vfO9Om(IO-=DvFAh}W;~ekaGKb9e)IA3RdQI%)B=^sY zyi+dxg0C@`fHjS{6DVQJDrc4E!<;Wcsw~!-`sg!n_;M0HN-F+CVB%*KER(jQ8v7F=pc;MDTjd*JaNYTI4v5Yjr;&gs`%L_#{ zq-SOhH=kemJnzyb{L^LO=YdxnVY8SO=GYZd6_)#8X%y2PeUbvwMwrE9ad6Tlv-v2^ z$}r>TpP04q&-@l__%oCBb8}{}l->SY$^wvwqS^>+a&kF^xqPu*11~R~2C@?^k7n|1 zK|F3kp<~@0wvWzy61PlF!JCb*!h>%La8^bK`M5EvQ_>~X*HSJH`T)z|o#S|M$l3t& zHExFTPo=&S)h;%}Wj3mL5gN|2Z30900N<~igv{(@STN*CregOb?LV<@a6vZvy!5+H z)c8)-5N3&%eg>9w%Kx>b_vS$Z87~lCU6km+MREW!jFXmBFt7u)9*fD$g}%6;U#^$q z-_=t;8}-}Md_&XwoR_TsO_v%(h4*R1=yxvLmFEm`JkrimpY1u`!@&d~neAn4^rftD z+nfyuUKfCi9(nSNYZ4Fes;=k%RPgfk=MR5;(`7>t60Dm4PUQs5jj1Tp^EoN5p|&dg zuQ9QiyNDBa4-G9<8Rh|?@HaPj9FLD$_%0^yNM8KA<4ZP-dc4dx3KI4=B>Uy&VpI~I z1DxJ>Elq9`=*Yq`EoIQhOrpdir*X?@P=P zu%_6DiIeT<0}5qy61dao_xZ^ki(o{*U`oUfG+IXBi0Whgs`UxzYWmks;q)F35TgGv;|BA zzg9sAdk5*}x!kf1D70+y+eN4Gg&21V1X|j~8&DbX30z37HxeoQ-Su`J+>n%yk!>T* z!8}`EDIc92IO;i*X)27H-){!;Y@ISofMg_E8J#DZDZuQqZnJ4h z6if6piQnvWw*H1_qvo&(ta`OyH}VXD_d$Muz!wF_HY=`R)hiMVSD`WT?Mu~zg?x^p z)m1MT;AV9TJ+a0eFCZN=Y>y8`2wY2W03@=z017Jw-K(-Jw`;Owr*@voQkcb~$(TSI z5c6W(;|72gy7KAlQ6~ez2&sJV+n_sT;Oxg2uK~%@o*KK;`|1|rJO})TvP}}XZ=>fw zC`slD5FcDR+SPfgq#CVqpJ}9xsBotcJm`*ToMsFVZhX-5p@H1|m)dghz{R$>&lQe| zyn%pdf8`>QyF}dEbg(Eq&1P7$#H1(xmi_t#lu2hrIZ+PLm=~#ya z&n8ZG+=4wf50{Vxg(s?h=mTbJ;rgQ~V*cnX1IpDO*FK#!LQ}D0ev9!k=N*rx^STqP zpXv=9sH}$)fog(gl{6@wGhKi=aL-y?WdRj>hbG?_u&UDxa57b1L`aWhKi?8(g@bdJ z;LrU}TjR{AEc=eAR_$L<+uk|9f-wFz1#wxPAA_C?z#YVN=V)Pn+HWvrcaqj5A+COk zkBBKIwm})1HMe!slOEvbn3O667(tg+-5qZ4O_t;rN0EE2Pu0A?JXYq3i=Szn7}l#v z_$oIB#<-W!<#CRo_3RWx1ix5hKh^!Le2p&8c!8bLZGRu5fGa!(7O&vMc?p3(9QyNh zt%B^QAQ4e@Z9`lR1AkGlMo}w$$xtSH51C7j$6HJicrrd#AJ@=+M7K&@DnKGfyZ-2_ zyAiM1SLk3|J6JO)wiB!P#U2{KdYz=^-6wvO3k9p)J~UYPna_jpI_K_ae!Q(R$Jz&d zes!$+hKj*?VmUjD;a;U1_oD7`$>A`^Z-ZVcCi}_#6Ncvz(=t|R)TP5;v0k7U<)l8j z#(@Cd<8te|99h@Teff;^hY>}f7PLsSbEyDvsQx6Ppr@{<7NK9$IBW}%G?@U*@Ubj` z8aCUU~XP=)<2J<_EXP7U|^Yr_` z!6X~BVr%ZZe6f?|fq%xiKaO6gl?Gl^Har)5-kGkd{s)G8Svt0XC%xLfr&aE&P2im^ zc7ZgJwK)YEW%hXtUs^o5oQ;yFH36Gd`mqdw#o%s9-v_jTo0OfPRy&IL)ma;i(bE*< zs%0pURkxX-_Y3|ZSYwgQ3E>E|sApwn5 zMT-)XKH>#~VgvDaGQaOp{8HGZN>K`>xg|=1X$kt{vWH> zeB$e|#|G#gb%OGvjuLf`FnTZ8 zsuf`jb1#8$*sGP4$Id_5osl**P*2Ro2CwVq>7mn7c3KZgKL(rWWKY>U?5MA%{*Q+! znv(Uz$)}^x2RMI|O#c>_*GbxDb>`UfWT$vIic%^tnIj{p66#V06q-Y9_wmkJ!yC<` zKQMQUp7!P2+%YZmL^fLxXLjZeNS@TWy5vkDZ58WLI=*=XQ>Ye`7v@tX?&@)W<6K>$ z9(Ybx>f4^J6 z19Y%(c0Xm^rv<+ky*F0K*Mkr-EGd~vMGQKPIuh_5Vn*~$L7cAh*w^)R?=|TzPO2rL zr)H<_5?FBCepN1YnwE~<0qC;A3v#h+PkjK&_*Af6OnsG$kXLcv6$G5eREi~Zy5fIU zNo_d^va0)b0l z5sE#@AoAwC$ek3I=Xg3{n4n1tk9mw>sTagXeGsF0X%l&;pJ{512}wLsM8+;8sgB-# z_TBQ&CcUref9o_r3XN4-@O|-N7@6%U>bC|FLuq9afY%kIM*401V@2(A}^4wa#^6D zdbO!*zwnMzCmVS@#dbzga*=NtXK3BJ?zOgDe+>pw37Gd+uFxp76b_-&TyFV-$HTrB zm}|5N>mn!C-{G@S=)hQQ8TEQv+*Qo|UvSDwfeCFMr}LZU=v=i3vK&na4_$mpLJ#t3 zm|@VG2G)Y2=!!41AO4nl(|ECk>~bBm?4!ba)IS0L>+i7d_^cezHU+@O1K{jf=c>WD z8D?U+U>0W#!R^h3uIEo4$yhpioc{iApGI9k(NwiEOc$9+v8@A1`ZsFlVR88CHCPI% zMeFBo#9(X$nLwAiko$oS54}N=pZgTOmB_m6f&O0bDraT4Z48~Hbz-w9_Au* zb0%SLe_uO3EDK)D$axifH2}?mudlKnZ21A_{|WvB#6#E6Gg#LA%;~F-6y`M5Ss1H; zCL(|{CvIXALKOV1731kI#f`DCw##oe86chw+ZWUkQ{1^Sxq^_8pOPyWFKA8^%jvub zZOPKKs~0eb%-=k3BL9CEcquXFes0(n@K-bl_j1x6cT)%xC-L|$K+X!%Fl)`O#^-|$ zNp=amWEeQjIJb={^GPwshi9X$n&*0jgfYEs+ z(u^2c=#4E!W40c4>Rhtzq;P{KZfC~RxLmxLo{z@=ta`<-$^ogi#Iow-xp!NRve;ob zLOXADe|e7(Kiw|Gt|9QpzhWL`A>RLt%`66E`EXGAL|eBqD=_y;>SAMM@9e+u$<7M@ zHA)=E?fYi!2VUtzZU2?UVZ`9Z=lBNg2Rk4X#}TpMl_W??vsX@-prgWxZT++rc5RU& zHahwzTGli6KD#;l?tA3TnDgTsPAM$7?OWj19g?VJ`aOxQ?smwZ zP|_we&~q3_zclj$ar#D(KLn!8dNBp0xYp07Ba?yBlNI@_ljknDC%iH0h~Sz(N$ces zLqkkys5K|}VN@Os)_gJupqm8V-s++v#ByBk5F(5@m1i1-*_*f)72??JFaa5ww8zjI z=fbkEBW@f$LIx=>Q56Tj*gUZ9PT@40++45)WcMILu%h03LCGLuW|KDi% zn=Af$`GQ$or*;O72?y2D%<}GG7*L*E$Nc+`o@{08W^WDz0=#fEVnE@ z5No>5@<-|k%{I2it8b@-vS!I$?nQw3xRf zo;c`Bk$&$Nfvfe((umhM>ab*B`J{6YDO2e0GSDlUdv>7j`0VMvqlq^mjdr!I%mOb{64dJ9!Z?X*{~)dtrm@B!^Ne|Y&BRiwVmHFupP#m? z$O>}CHc8mje`B+y`Qk1Esc)Hfij`OLJAR8AQQ8vkR54VW*)-ezEaD^n2_eu51 zHX=^F3&b||Y#&BTF{^li48K*+4-vBhCgt|Bh3Ut|i#Oy6 zj$Bg0#&KQ})FcPWUp-IxZ=?n_d9ps__+#xFIIjD`>y?4QfpTj-Ex)1tE1QGJc%xxD zVi)2qQd&OyACKPiP>hRDm5I`pd_+agNK~`bnLHu&>=nT#hEhDRKS@~s8gG*+WQ;0h zK}9;#+H!t8PIo+^mCXt*Cve93N+8!+I!~X$Ni7~GEz{s{b@#tqI3#%TN=HK@hDr9( zisMQTIEMWqJ4dZg?0fEx;GcxuqMmib%MP@ec$P~__~zfV&pf{d>uz1SbLd#{fzk0* z$>OP!*E@v?QU!$l^$+|+HqIT*3;WUZxz*qH^U*R(y%!L>S?5YyYQK6V7}|K z)C@_8=tYK1!rwHP8RiK-28cQ^94DOaIBI_rxYg_39(C&_%k9zrYfio0DemmH-2As= ztlinRQa!Cu1V6*x5PoW*_|awZNtcCN?{>_U_9wyraRCC>HP5ZS8*lM%Up|t!Fo|uK z_x?SCb9#06I)Qw z=Cx*r=)5-#-DBg&DSHa---$OW9-0;Mvg)OBHQCW*|JIa9p*!ANFv?(JoMq~>!fHj)rSZm&SE926Ra2%f zr2Er@MuM+%RQeWW|9O^Ykdj>HRG8N|KT@TzH5HM2f&FW`ZP{4ZPSKj^n8GgU-E)rS zrU$<7dcB(?-j6wcwq`K(dVSP~9y_S0?KZaX>Ftgi^=(f#JM~?%K>MBGQccsm@67w! zuf|`N_G_D#+dHjNQ_Lc_EC{zOcGaB|FZl8@O7bj^`5(J=|+%t;=2nj~iWCcX`SC6RIR z(wXy1B_^Sjr21QD(9cFYKBvcb%{Uqotd^YSIHC2rcl%{e7#!`PH!TV5+(Sg2n3ovd z3phQCDhVzNMY~08a+TrmS@SgAh-Nx&tB8E`ONqs z$wkN1u?vKcnbu7hO^VtZ-SN`}#(z{cdG?MMaU1V{mmS=w(u*D%_u=teI@8s#ChPJ+ zd#Lx$gpW|)PRO>KLqyqF`qZ5nkGYqR3zzr(#$Q#=UM%<$y_G^S3(k$4N_^<#^7=};?6xKuKtjYh3eXw7pKlHg*3jWoaM1X*LU@j zaS&X%eHq&xN;sWJ)h_CHEP`1+-|{z}KtzeTWLEW<%c8DTo_fF1ZNJ_^A;~e8i(9oN z_L3cVQpo~_ZTH~~9`ioO#-D21=k^OeJ}#zw_Q(8G%cUXDAbV<@`|ENW_o~XtnGN1N z4z7;mvhO_tT<%#56IW}}l2(j)SXHLZR?!tqbhtF0I4v$(s!iv7+T7O1=vS|3<1${M zqe0C3IctBB`)u903}z*!nQ;;Ok7o(Im1g-E`lzmBIKC4Xmb9Y=vy0M~hJ7v>^A6@0)Y$=CVCU zOLG1lbMiUvSy?x4t~YrM^6uMjNEqtX%_nt4E7ntDLPef==O*cW?0bq*n0jVY{fCf@ zZo)ynMe#JF80SjaM3%kONiOTV?^`dyBhd@r6foX+8gyKUJA@TGf3#Nqg40==U?zls z=f#>fzH?Ywr<$e3?%aM{y*Y{$5AfOD15MjV2k`8C6inwSJk!7O;S{69Pf~}tzpY!2es>+?y`a)+ zCH^v?!-4#QCdYBM3w}c=mZws&THFLwtOQiS41obCW`#WPi z6ofwaz6uLhj1l8O7oiF435izr77_Lo+xmTs_cw)7LFAf>s4`{NHv#LPD+-V!_=%CsIkXX|iX2a^~En zdK0kxia0)i5~s#64m6AKx-hgV4el+~qSwE_3Q@!)1mqAZP(D{$@y!Y#PqoNMzl%Nq zqdZ$+Q_$c-6j&$xkq^L1V1~Ze7N|;druNgsTv8N~E{12}zDM@33T7Zh`UXrh;q46Y zSeugG4$L77=MOd^`S&#EsNiXmLL^VG*N0hT1b9&1equn_uU!fG(oZO6MLMGOU&q~|0pJW7Z zz`Wj57Xl*-DZcd6?d*S#w4sE2=jnzzD>p_#+=gr2$6<0(JkD9`nQ3?c!mW9ERw@Fe zK_zB)!&Z}Y4$0F`FLs*eJMAQspa-LTwZRMh|`r%KlggQ_^l&7wE&bt5XKYFg*x2dNd%T$K|nfikO}2FPW*i% z$4Dkvt;{e|j$_vj^}Zc{@YLZ6lM=iEsj0TLM!=U`f34`!;z08h4}|F<)H=JR;lEu& zk&diF7)jF!oshQHz?^`{fy>wrMl?8W67IF#<0no=f#X_kzzY^R_D|;3&X=PkB7`JD zWQ8W&{(itf4Ej7)S}BIB)Ol9P>>-_iF)J)UlE*&~>;ah$`f1)-5o-VYOdU_HUt zMGPiFB8GS>S(h)@(<~o@iVZGEErP<|w z>qZ_$KzINoc_HUJ)zDMO0#_0m+;pA)tp~b#dNI$b?!z*kD3QF?g3dFqDUTDjRQNGI zM_7N^3Md|~SPVfRSs%Qf#fdT-R{-VpFy8aOOKJbT4`!|?b^`JO?UKt~oHxps#c+wO*&hEZzB06+q|*G|KM^$^`2T`>k}*5QUDB zc!nt|5|Gcr;IDM`>3XlbfjeWqVfK#Lv13wariMy=OxMf~_u zr9*fy*A~W$mG_LC;QY7w*C~n5W7#Gep&5L1&pMlM+FMGLO3<|2HpEHfq^hUtvx43@ z-dG9flv7ziC3zK&et2o!<#s&_xY>^}d~r0 zRc&t4Q-t+ZPF9>|Ti~MIWfLj?Zmzos;U4sWr(`xbN;?^JJ+=-$rWC(6`CgS3TlV?I zD;y0@^x^SI{eKHQmje04-#_^gh9N0_tjKJ&U5pf;JH?}8{tysFF~>21@WD01zyL=W zD(4h;8;Vos;g8i%0xTPSYM#e|s#8)B7a~Oi+-T&;3#9q`gWIb)hN8rt)IrZt3WN{m zao33jIgRu6vP0*m*{<@!!g1}4d4;ABdkCT+8Bz1vhk5W*vE1Pcy-BgK0i`)79REG> zS!4r)-LEF}&SN!EpgEcPfcX+|X8pwn$8qhb0HQ%9B|&;2^C*~-(X%p`d8O#davK5C zMD2mj8=CEE*~}6Q%}REIBj&V|P~G3K#z}DjmZ98G3Wr#$mekj)WIhv4mwy<%{85j@ zN*E#gVhSPEX>`SKWjl=KvyC@X+oWRvk9(tl3nprMyzLN9qC>#4zY{P2_n4<57Dhs? z2^Hn*8qbY6zOg7IRL(ZAmFdZHdu)Fn9VS-h6_oW@8;MT^F#&IO&L;jMhX^$HcfrMz zP>Gr3Bd8hZYd^J4%HQ@-3qZp^Q#`P{Kk_~Q5e)f&!6iFlPp1nHkGNZ{!-;oZkTA0k zXMJFu>qYeA((pUq^5hiyiC>gTny*1nd|6dTIb<@mCU!{E6BF5T7!%UPPc!HLD?>M~; z(206I;1u(BFF(5mQHKTa*4`B9txI&Cdzcr!GEO?rh(D?m?{0CX;%dLz*@)Q%a=%_@{?U5|P#G0f8k@ga5->*VK^WW13 zlEBk~Q(+pgMob9nUEaP8SdQ9MwOZ_sFZWo#>9z9qg^)LJL?`ufud~$v&6hY5{pZTD z7ABGu96d=Y4ssP%w!cXLD*@5pySkQ?u|^3UcyL_GGK<_5b~!+r>4?MOOCSGb?28nUWPUOOaJ_m2%0>4vCOe*&{O3H3~_kkV3B2ptz_g z;&)znzdxVP_xJvzf8M;jUe9sP<2=seoHP1Jl3Xp?QWFLBMF+}1@W>^I#wa5cy-}`O zuwfEfieJWmO4km|!a?e4-Yit^^@!cagfqgCLsBSVNn!=BH3|Ij0*;>HI%YHcM5*f{ zeD&vsQlSmAwt1fV_jeUSDQq>1TL#Y15PTUr$3KUtVu&&qm0NiIzn@l9zE9~OW)1XS zcbM0RYQbGwSVEMwyS?5$Yi|b+-mn=AVY$t{m!Z9D5zOH&&|$!Lb^h~R;m93WnvNS8 z$8Z94gJNLA2LjmSJyXGM-|9REv|$jVj=ey#1TvEFc}FBoU>;ho_88$p_0ADU*7QT{ z$2A9J{*b73dFFkznya2$2`9Ti61Rp_4=J{XX?=B(?xP!*7K+M{Cvp-l*Vymvf(ACFXU{HOd@H}iZvZ5 zI_@=3J7UoH55<$8oQrkT{w&Y-m3bO;QLFJ7gPulg{mADOfn-he=HJy*IWP#sUz;1d z0#eUpB=u)}OG*;*yvgt>26r%RZs5KOt#Ngfs9Z}=zH96_tsUFV$`3Z@6_i=uTp^&6 zXtS^{t3T+~f_j5{jvMB-1n(2KsdYDMf;uk#_h_dZ=&1|>N&EpdP%WY})!K*7IKh+#u;dHBdjLF2TTIDGe;KLF2=rm5+G zLzXtd3rD2v(N$Bw0O(-om4g6vJQ}-X>!>qW0OXH@@r*7RcdRPGYiBdM_~1TX18cSn zfA2ZcdJGZr>PnI_m5I$vVpcJFmEMP_x?nVN$GdVneuzP-u5deFjpp8f6xY3*KS2@v z7R7yOu66r%Cu^1?hm{489;gqG(rkcQutc3Sc_}~4SBin`2|+jHd(uh01=_A&xOJXkNgLlkF&S;&BiDF96i;wVu3sURLWa+Y5mU?# z-9c^6^xn+sW!(G)=PXe+&0C79izN);-Z{R8OW!|~JlJobwPxskC5mPr*8$Sx-4`l5 zkDE$B9(VEUvHB>m+YU(g879(Xoc4vKDZTpU&cLXtBOjyK))~vtJX1B)(SEfy4*rqz zIrQr* z-;5I^DiuP6gfy#DU8g4y_=|{u|HerebWq2|vj0+FV=hk|gJe+FNMHXOC}}@@^-rD9 z3e_2r*PxcQqo8Fao_@<%AmuF)sp_a4GBv5a*Cq!Hd0!lpxCoKaRk!Bm&Z##?PJQ1k z>06&+XpIJni&t=5%5W+b@T`xm8Luq{XIjk@esptV#R8dXcmnU{<_sMdj@cGIVAlyi zalJeDzP30Ge){Q8p`Z>(NC`l+aeOjyh^uRr&Zgu5MW0@QHLk&x+s2Xc?7a`uoTf+s^yM>VN||)f7-{|IsBZ^waG#gQ&$vc!N8uAUrgL zF3gP4%_c{FGLi1tkClPx?*XlquwNLfdPpPnidSWmewO@MKKM=+fnQ`njgoieL2ZG| z7TLn!bkScyodo91!0jUcA!#9d>{uiHlO0Qq0m`do|VpY}T{a&tO8UllKs1$ur z&(*(IlR~f%?~bXAa&7!3Cvfw99Ho2`ze=KX-4| z_NlPstLc+xp;WYAIrk=^juhUA0stdeXiRdI}Jzcc>4ql z&)c^*&dZqtCe|&~a%tCTKwknmK*wf-kt)gQjNzMrTz=-?jsq!S7YE|<_*lhKK9LSG62n@Wd2>g5mC zxakD;T<_5jlZg)GMsbNN52Lg&TW2mvj9sX{jDKVXG6k6Usl-GSA+<-r*aM473+x7# zRQ32*mQ}f}<*UvMb&NOnP~$##`a>qPx%N5}s}i-fw+vf^I8z%;edxsSDt= zU8u~mc@CoP1yyG{f(h!U1 z(n-Ozfc*}$0gge9Ue-zSg8i=hn3Xcp7!Az{oj=L7S*MtWeY=*Uc(lXT!nc&hY>1_( zd>R&3jE^m0>7e#{dqpv*NX1^8{h%)+Z*zKlS!@Bs3nf31xmflr1rt13FCd2a8MyX= zzZom>9pc!>gGRQWCbRcz`S8(w|4?r-eyKWq5BH_U4d=0Z=ZE}blFnhUU)7t(3HL)d zif3p|e-W3%mnQYw^@AH#CqGVeb=K3MxTdLp3)}u54+xWY<|_A)(Jg(thmT&aR?UY7VN9alFiFszy?4Qs-4Mmm%}rnAG8a`S6ANzUe*e;W^CZQ_i%m zw7gji!-yoBLkh&O-L-usRUV-Ta3@fwq2)1qX9c;BDwL*$LTK@GG}?qb=2dVa1ZimOs9vk@-MbxTie_JGUG4n@`BZy=RQS--JZ5)+QLkuIlonWglx z9Vs`ZX?3eB-}csqJc)=C!m2`bN}AMJ9YQB+aky5|LCjh9=g%97Zo^aq3K*R2yPPQU zNI`B!Dolv&f|>lmhL9@8snZc9H#2{@9E)D0xKBtbsLF@6B&Z5LU)gcq3}L{n zB=skdu0*HPZua;5_^PjkK45Dy9(Q_DKif9?0?LO9xAv0XNpx?hCoc1EIlmtGv;1;_^jmreoWcQ>1H@(L|Y>q&4a4|`D0wNV1tD`;Ya4};&~ zvq!Xt_$)LboRCiwl~@9nE@s(b2b${gz$5s@`Oqyj1RX+4{ns?0BcoW>S*y@v45X21 z{Kj5PU|cH-6PX1RuYP{)yRgn{J9JJXLT+|Ht1ZyGQR-=cQP+haD=1P`oHr~}h?s#l z&}ENMJQB2U=QPDVe9~8!_GdS@k)Uo2!UBa3A{`w7KUegIe$i&kZ|Ueu#&=US0^RIY z0R1?#YJ!09%*xwC)xt{oae6Plf0xG=+l~_Zh}rfay)r>@xqeJ=eHTe#6wXkg*`?c@ z{4jKCW-9LnEJJTwvKxxNDp{V^s2M8;-}PoeWS zjVv{&W;guVL*;;wxzVS@%3Uymu~^?V%SeTf3EDKRp>dZYi`iER_LPyOp#?JxPGofN zZUeaY`ZWX%ZyW=VrC(=!`DfRv$HEdPC2AkF20sTXiDG6Pu+AT^!9UBzK<%8F(%}Izn8s{r z>M7zV&H-Uew>VNQE-~&y{?7+(L7n4+8%~KFhuuMiEJj?)(V=M_&GQ>J*m)5PTBOes#k$*E(RY{NdTI~i7-n3?R1AQ^$Cz% zx`b^(STGB1X5LX+{}v&BzxF4XW1CObTj%XBK00%DNzP=~mB zj%6J**q*ga5g`};>)RI4F^ue65#!5Y8o|p&KF*L(dI0KIO_|_gJYAsGirTJK;l)}J zfIYO8bVnwcbwyNJS7eEMix5SLj%h3!+9OYZ}E-%xUo0ae)x;ofa;Zu*Cpfqguvz|TS6A(v6`nqW-58Vv~v$BwWb zK42_g7pa9&kJa)J{VbBdvdFf>_?+*4&X3Dq`q8Z6K2K%9FeKUq@@11Bb3-Oi)gbz% z|IJF`+r1^m$Srxb4h)<-EW<&%HVBq0FDkr2wV7orhR5*1_>9-To*5B(n0N@*5OV zUYlhGAp6PCFMh3|$EzR3k>*nNdFB$gIfo+IoEGVU9)YxB=BLMK6x@a8cqP#15$5%SXvF>AO_ zQvgDrK8Cn%`5C+KgP%E4^7-+exjUS3vLPIXHL%YmBjGp|01AT@C*Lutr!XVfAe~Py z?m?qk;9MGDk5@c<1ss(2bE!R;+5oDd7MSwjKVR?HPhitv^n4l|!;&GcZl0#0aB>=$ zg2^8M>g)%j-B9>9Lwzd^gKJ@_V`P>Y#C@(NSlpJ=8^4LI!KCPxqppFEU4}l0Jz1vBNRLTyj;F3^`0f%Ch(Mc{10AiWqNx_ld}B_hax zQqOH_6eZTYq9}mDd8cg1l9Wjo^Qkq&IikN#xC}+x zUMMWmCA54MU$i3V_@zrZ+6x~s-1G<`)|}g`5o8)c6xtiQii`qYc%ng;)Qe^9G)^ji z5<{10L;yIrElABeZ5NhN^>ne0I|(C;*(S_eS3}j1q~uHFD`y`99JSv(5=!n zJ}01Pw>-*ZUSum(`8Y*3-T^HtwMkmjh0mp@j!3-lNwZ}l#qgm_R67znj1zU$M!Mp# zMSh2kjg61ds0f9}FBH&1inASp80O!=S5b9g zG8SqglBlTv&~B}PT|8?uDR#ZL4~$?rV96zHh6vI(7TAMQkBJ0^KDf@jx{PE>Fhzzi ztzPIn#0Q~-%Gr)m10HBRqV=J{x9TT>lQKIF>P#!dIbpEaz#rn}>yO#;Pg5io;gbxc zKrI1aqimf?G0p8nEHh52&B&H=XOY#AYd^Ul6F6tZRDvbdc!xm>IRfRNR&B{Z&d0dG z6@w4&Pr))`VllEc2o1fgj=lhC#E-Xi14t2E9DSIA{GVDsUCF7Mx_bI4Y zxL=;!Jn=2S|2V(m7)Nbu!Ln^>@n0L|K))7{^ z$GF^2>%F*mU+^Gm6V8-P=rvtMEl(Zk4BUnMC9xGxnl; zlfEWfW45y*xqN`4-0au~c$p>bi~L{FQ>q8f4JNA6p9K@UXq#d1tXp-VQRkuh<(jUW z_*J88r*(+p((Q=#{Zm_SBcI)vF!yHM{yMx3f;mBIF(9A@O+Rh{L^T1K zg#uUeTLyS&mq}&}Pb}88!FK{$o9ubA3B;=*z>UCkvJNt%$Yg(Js&Yti@Eh)_ckA9S zdZIK9QO+Es;abpz&Qci&_d8`f&CwMdWIts@Xz3plJvsk--~eff04FDD=A2(Pn;NcK z=oh4c7(uRkJtuGnb#`$gLK{H+ZysL>x(&509ESsRBPAIslqJC#8VXqz>hBAi*M?k# z2jG%pkG$=eNIm7$TH!-cNPg>KG~e-g@L*y{V{WkSN3U+t3+`pS4K4%I;gzcq>IBU` zOYQ9Z)jPaZB$ot;f8lD#9}4>0|L)kC|P);+;46oAW4F;F#gqu(u4-D0Pk(z&b7* zSS(&CoYiKOMjVRYsTSN)0W@7Qec~q5bdRppODBhEcgJ{<9fP1l%!>Xox%D{=uIub2 zdoYhkrwOE02{B8g=NBeyPY`R@-6(Rd4zgkE0~|@|6sA@@V#Ae=WmWvWv@bg^M6`4U zJJ$rv8uuSvhn@u`R}ydTyo_(-B!#f&)&-wBbVw_*O>U@!p$drW=7UT#B04ZP8tqNnsi;z zr*OXDTfj@4js=t2rX5LrP@O>>;(PP9Be-1yQh)>-5c`NgvN#ROh0ew(MWo1QoD)vw z6C^?y^Ps~SWL;ZlrJ%q-<>FDV%f-g&MeuVfMq%7)Qy)7E5=G=e^JRT%O~GsUL6vI3 zYo4d7uDwXzVJ(Q(b1)abe>efi^D{a&mz@r!?(l-Mv)&53kBr*_*)%|`!~JCl20dEu zXH-a&kX`uiHDgCC^ng85)`m24wC^RxF@W}CWZ!kVkaV#V8~Vv%_*0-6iCZ&Fhwp8- z4Gs&Ihil>w>u*zGf5LGD2{ZH0i4w0T9BA8N$CAGw5lv$X;ov@cFSOc}ysBhMErHVO zK1)|oeFCVnZp&K|*0|^twnNwfxwQ`&wf+?U$gc)>3 zFIqUeW+$7y>mXSk@Ep!#BEfJ-+}iym)aF-Lx8 zQ6qrO-EQ7~i;z9xaG(q_9+}{;;z28m3rq(z9Cl82up%6pT%3bQ|QqBNM@WpF(;8%`15hX6$63>)H~Kf zt^&$$9(@~YI{vWwP2{uQFQ1xr0R%$w7<}ou`1MT*-T);W5pw5d$#l?)1@K=>Q0HM2ick;~@QQ~8M;>kKs-ZJZoR6y_4 z1y1dM%xPM04)kBx%^c_8CCTzs0?#3R-Q8d1I+AZdIof>YHujj-nz@Uj#w}tH4Nngo zKPklbg2yxlC?i7Tj6a`iyu)#Ap}na9iMB#Ttk@VR;LIJTF4=GI=6@CeS^z;Lo7V%O zp8Oqw@Emq+z)}U_35cF%sP=9_5-0$D8!2kOqD=!WqP`Qi=k;tZMgkFOM zz5dUFb{#=pqHPhu1<%vPO@JFjv@(h92v4TUrMqA3E`Bu;zc^A;h?F6!uYWs)aE6P{ z&MUhLx(FU;6GG=_&R%PfiWS@0O&U+vZT~W-j`_>`$S;RN2OSTH_iICb2N*#e53C4? zRNehncDe0FVdM!O_u#SzfHy8$9Fe24>mT5dvI>3tPkowML=2MC#Zr3NEsrp;j|40VTeR2$eHv(kZ5Ap zatV&TyasEl;?BV~#e(Me28*;5)HEF^Qj7k{`6?#^BJ%t1;_6qVomyGzda-veB_aKd z!-t~{bz-f1o^EkAbk2gL=-rDFpEN{d8$-|U4nfWzMA_*X7PMDlen%b`a}xCk9Rg~) zp+(LD_RSL9Lfr@x=~C5RvU3KnKa?zjL?s;>&S^qhG|Q&B(z0)N7?#||m`U`Dge?cs zV99aR(lDfldoyL-`sAZ>A%E>U%tm#Fl;a2gmB$iDJwmA+?_$$uuCp-lV!AD=FdSS7hy`wf z)Yb&jnDUmaeOnBg^33t=(1gWnN?w{-iCnGg3K(~f{w#$#?-n*IPb$y^&M_H6c^v?G$2|dB9BX0e*lGf7!%jD zFZ7+t{T2?^{AvUfg0y2P*la<0I&=Qae}9R=vQXpw)}?3c;YH@4ZSflmsiMZYU5&;Y zr;DY_dyl-nX}t#Z70>?oP%u=Gw(8rmm!iK|IMsDPHfSRFGiPA2HZ87P9b$pa%O2!A z_Q>BHmM9cPk<9?ZcU&nN6bWA1!uOw+p+4G9m~FM5i%be6^Q~`tOT87EC**duAyGrx zeiDrR2;l>?|Nadr_F2G05S{#){U^yam5VIL+9F8B(tw;co*OJtU@v<+rAPJzqG7vg z=dfmJNRjIUulU(cJVb&9SN4-rT=feLwNNxE(tOZ0Wa4V~DcFr-a7(!zh)b4d7r5}D zHTdD5O%`!$)8$Y7;xGoY@cy3{&vsoi1Pvn$q-p{P)y(uErvHve!#Nu!ZlFMp^D7m| z5~lAE^w|XQ#)x{?aX>HdY4sL6EeV=6_#2K4-<@3xDDy31ztPamt3KnlzG{9)nHMOD z;iVubIAD|aOwR7?_ICsaPQ@sMNj+R~>WLGxv{ShYzzog_KI>g&X*Xh&;D+`g+7sxf zQhDdd6>BK@_{tjl4!r^Y1L5|TLAp|Q1N(upk4JkH>P?S>=D^>~bvB)$48=vYT|@*E zOLCgcG%?zBtBVt-051q2{p~^Y`cgcTe>f3I&O~^FvM(?xc5>Ur5mTrrSb z!WOyZc}lEQ)u^afY~-yr3-Y780&G3FifUcr1v-d1a|@b)E-{JgQwn5@qrCh?&LDYH zrmj-_>Qk49bD1(vz3ZJI^22wpQU^%EYwL7293ymptM=&JF*5hGn7cKZY}rd7-5u?^W)){ z^Nj3D)sv+DvK;9Y@#dmTiGem@n5|HP~yX~DvTpH-|Zb29DK7X4j zEkd{PGiz#Gcc;P>lRzr|)FbcPJa3rVPF7E#Z|8p9%e}hofaab^LF*; z(xoo&H>JE~09d>IGOC;vDH<9n=nYUaT|BV}68q*iHup@~sMmVv4m+jnz`H2qc*bmf ze0atJ%x{H0G5|VdTIyLdKB+jq;s7Zz+N(?4P=IU;$Vo4Eae*7z@@G@i#BHGPVv0YJ zMPQo{q`^Sx37+mXFird{`>?yF7ZJZ5^(jR3dD4AqZ zZtlfdswt$P)!J;9KfjWOtC5BXs6b*X2pV>=x&P*6;Jdb1Kn7335jCmV0V7kqahnu2m z`6+zGfsbkpC|OgiQroq^e*&N{hstRd3nrZ71N|HI?+^+cs*m{DDzYnpPBvocV8_rFZdg;dcDdA9#j zVFAw=aRsE|vp{LRsXC>BNR>s1g$g8`;|@`giJ&B%kb6*4e^dD?^bJ~u!5OLx4h0x+ zUrMy|LuCfytsXz%B~`e-@LCfCkw^)leSi<0g^G`?CAKmvVC(&fB>9~uZsRVuSXJoi zhFtr@endRddpvPcAP%oI9JDvydTnbzXBEwf?!8C4s9Rqm)Xot_s6-n)Q3?Syl~5Cs z@C4HlZJ2a_$B8Fvh9HGx7GU@xY)D1MEF<-tjKby@O$F)EtwVouA@h6~v;vjxkOQ#+ zuQr|OqGm-5%s(jkY}-^$JUX9!0GJx`4J6$ItWUuhB!Umxr~V^7HY5fh_9&y#WgjyB z6M77Yy{Yvu8Nc|cNFW>^{qqP2ROi+cjgA6=b)v{w&kaid%}G!Do19om2Td&*j)&LQbDUJtaD>GzDd>`W2p8BGgz#NWx7^smL;D8A_ikfuyANWxRrGA z+sMGf*o1G?A`M9w&!xB{lRsvEgNbdHmVi+ z`Wzs~%nxa%G?*jzG=1}3=?Rm{)@5TD3>Uw^UgFsDXbgHXAFPS}cl8NjAZ?MutVuaG zd#d5QJ@u^8kJ3ospco9%Qb*eB*}i%xes@e=syt`edG^xp;Oeg~=TmPrg+QQD8@zJb zMow<8D-<~eK3pwKQWt|Qv|a)hupv5KT3mRiuprD<$a$2q4U#Jd6+A$dFt+U+oIM^3U(Lzh>AxxHe;VsD=VaV`L?2*R_8(^kSDCWOtQ{#{fg z5SSMhbLQXeAXyL|;kiLF%QN{L>X1r|tg{r)muB1RAT={-2vZ7L;HINx*y%$~d-h;8 zjC8fEF!RBe$kRr&*|OX%7|?2b$o&9%a3_=&o+H+g={ zfl51YulTarKN|i$RLUT)ziP0|D-np4V*<#(pCKnq&NmCWymZJ^d@xdQIs6Ve2aVMi zpLM2xnEgB{6;XWFX*OVa#%SDA1&pB0pT8hK=z)GlyrAX31%jXw5AOBz$*N)h*`a*= zM1ybM#koNv#MT1$i-oQ{X(E$`Az)}Mr+Za%FcH(Ac1}ZL8?MQ`WutX0+OMv^%mJzF zqq>!x@IE0t##-E_@<4e{d+n)eXRZ2gstEzJ`lGw~D5zOW$De08cySN3dxm-f?^sgk zV*sD>t?myzK%^`OQ@4X58rP}d^WNR5|2cPM4hUc_^YhV5dVW(lNez^@%>~g3-=R(X zjcc!X7{zxAv_Thz4@HSGkRXTi?hE$J%R4Cm^mIcn=IE!iCn=Vn?`i!~>}sRgboI_H zR^0;0OTYCBB%PY0SehC+uTo@$*p5!-M(%Z-kb^ZZa=>(jcVe|DnnafKUyAhx!M zj||ZwI5Y{UyJbE=fcFy{qVe8|pz=AFLbd<-OO~DhTkdTxR%c8`{{nX47EFFtnW9n3 z0zTov&ji>#!WA?UXx}%_Nrl7LUH^>t;R-m+?Ls+(YnJnPUQ~Iw`gteIe{3OvoGeMK zx-LPP)N?1sG#4q=IEO}iwqlHFccizoVJo{ z7pBDNakD!}vTk;@EB)6a1<590ZrNc-yCW5EA0C}AV-DV+(^{ zAS)>>;TlWGCwksz{o$_;cUVFzFjJ*kq-^?F%cb*wzuA;p86l-2O48lUyJA$HN=%U_ zqxj{vGq1RQUdclUtML{am=+<-C}f%pW9MGVWUqw*pRUz^D-sdGa?{BH}z6I=xalAX~+#Y5LNa9^RSe13|vW~L0JtHY~c zGmy$6`|%q8cSe^!qg(X8?ef?tMvM^w;nN@1xY}{Dzs4p|SmV5P1Iq})TsQY_R3pr- zZsH!raz3&6Z1u(AVK;6wP?HV*No0BqQB>JFEkiRBWd?B0rvI}l`cx4D!~vU#U>)mW z==i27c?NP(h%0K2b7>DJM|2HH&+^;12Ts(M$3saAUU`vZ5Z!ob{h@c|BhLZ8vjFXR z3WmVu%z`C(6LToW@B$p+za{NkmL*0UMe>by?he|!@lm$d;G(GQbWMKxzb=Dk7VSV!YLsx*pQb!0`UX-vI>8`W znS}xf2QG`>M<&?>uqPXh@*@ID9YCda-_l#jKfciD1uBVQtg?A2fffhl5 zEa_S2@-;+j9rzsr!@&bzk#>^^^gMWVS^+SBf$m*USTqZt2KaHyevgu>x1aAoL1dZH zM8Tk*Q^t1u3O}V!I6;<_d=V)ffzo{~H&y=Zxi`fo3WrU>>J|(eIc0((H~<}YK(v4v zDTz4M{3Vf7bq2ch4*EU(aV2T&F>&{bP2I!;(-BjB_&cN~hfNc~h^4@E%^py+D#-1t zZIH9R60%?5R~%Z#&KKyp!7>{QrH9$IUhkxs7T46ByVw#LcY+`WKXcGKCkgTDUjg~U z5JM98dD|%@_Y3)(A(?;}oqo6l*im#cCtI0M%=|~FANdVyR0PVUEMorwZ)d$!A$Od| zzfi<4TGJM-mKEi00ype!`Hhjmth6)%LQK)yG-zF?FoKdFDFw>+H&)FTMc zjNlj-!$j+YPPOpE0NR-Brx{%{Yi`yU69EiaimRekH<9Ep=>srk?hs@(i`K(^I|d0= z6UT^{XoWT)o{v>JG}(Sv88zFc#x+s7f>>*^Bq#pB%TSl+0gd?P^jBacm@#ayLM%(x+ z-~8pOeU{1V2X*=;=N0@r|0<|Atrq-L`M_G?MLF%R+gzor0U6>7|C+#g>l_?EhlK7` zp#FAG~WFN)4 zE<+99Ky?7A_%G6b*tW)X8ENqi)f}_XBG}|n_lVjVbnMSiiN);HV_LHw^q-jMy_iNO z*%HeYvd~bJS|NTKJB8FhTP6m85ijLdb(oatjq)?_p^T^GxbALd>rrM|NKvsc&>Hp+ zpWcCu$;2z^@?sOAAQVBPJ~8Z2g)G&p)77cO#kYZ!bb;FLtg?!Ccpu2Fs4uULc2KiE zAYPr$0w%PY(1 z-#51U_ZE=9Q+(AQxTFS>B(W&c6WxrxS;VS7b}B%P5rXh3;`4yygv_rC8D#_>bB$ovW&hxnvxgY!tto$#|HnJi)8&DzK~xhL%-BPO8DQSa zH9{5*nfFTtM%MYmpR#)EC;l|oa}9zJ9JH4#*K@`w^ObT zU*^DNUh$1kOYFocu8yh*$vBZz7GxzRhzXPq$CGDz;&leoVG`5h)dzHL>-VyK-e6=J zLvaT{6s^Ht9Wou3F3OPOu^aJXefBGlQpm6W zc)tQ2o>J7ui|=hmYwGA+_ST?lX#DA9QTcmiQ7Pe+x<)ceZ2bC#*N5Jp7zjOdR>oyL z9`obsc&l$j;cfRdb0HoTUYY))j#l4X9dwpa%x#|AD(%oJdZqcNw62hYSja?Qj%ve4 z4Sv6h;d6u0y_v!NwpBF;_vW3Oc;_M*6;l`I8Nb)zT~Hvo^&}+BHZ>TTFcvUKZiqR? zy^j4VCHKbD5tI%Xx%R-NwqQ;9=?|>eGczZ{VyV}(My3M&+Lv%XT&#WicM6>_0sMph zA=R?q-K}oRdgNHScEriL2=#qoj8NtBRQ(gNj%iQaYLXr5f4J0wcvCw(8-q%M~}#^E2%Zqo*DZtCV-&cB}aQGsk<) z{$jJ|gz7e@J6k3!Tr5+tBAadw&o7 OXQXGYTdD0F{{H~wGg$`! literal 0 HcmV?d00001 From 4c66d99e77ee7f26d0698fa912ddfd120e10955e Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 24 May 2023 11:02:19 +0100 Subject: [PATCH 059/106] correction to DAB step 3 example --- docs/agent-bridging/spec.md | 38 +++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 790439df9..735b3e182 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -226,25 +226,27 @@ The DA must then respond to the `hello` message with a `handshake` request to th payload: { /** The JWT authentication token */ authToken?: string, - /** The version number of the FDC3 specification that the implementation + implementationMetadata: { + /** The version number of the FDC3 specification that the implementation * provides. The string must be a numeric semver version, e.g. 1.2 or 1.2.1. */ - fdc3Version: string, - /** The name of the provider of the FDC3 Desktop Agent Implementation - * (e.g.Finsemble, Glue42, OpenFin etc.). */ - provider: string, - /** The version of the provider of the FDC3 Desktop Agent Implementation (e.g. 5.3.0). */ - providerVersion: string, - /** Metadata indicating whether the Desktop Agent implements optional features of - * the Desktop Agent API. */ - readonly optionalFeatures: { - /** Used to indicate whether the exposure of 'originating app metadata' for - * context and intent messages is supported by the Desktop Agent.*/ - "OriginatingAppMetadata": boolean; - /** Used to indicate whether the optional `fdc3.joinUserChannel`, - * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by - * the Desktop Agent.*/ - "UserChannelMembershipAPIs": boolean; - }; + fdc3Version: string, + /** The name of the provider of the FDC3 Desktop Agent Implementation + * (e.g.Finsemble, Glue42, OpenFin etc.). */ + provider: string, + /** The version of the provider of the FDC3 Desktop Agent Implementation (e.g. 5.3.0). */ + providerVersion: string, + /** Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. */ + readonly optionalFeatures: { + /** Used to indicate whether the exposure of 'originating app metadata' for + * context and intent messages is supported by the Desktop Agent.*/ + "OriginatingAppMetadata": boolean; + /** Used to indicate whether the optional `fdc3.joinUserChannel`, + * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by + * the Desktop Agent.*/ + "UserChannelMembershipAPIs": boolean; + } + }, /** The requested DA name */ requestedName: string, /** The current state of the Desktop Agent's channels, excluding any private channels, From 5d5c31b294001b5bad5fbb7f774e475fd0434a3f Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 24 May 2023 11:04:05 +0100 Subject: [PATCH 060/106] label ImplementationMetadata --- docs/agent-bridging/spec.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 735b3e182..7a879cdc9 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -226,6 +226,8 @@ The DA must then respond to the `hello` message with a `handshake` request to th payload: { /** The JWT authentication token */ authToken?: string, + /** Metadata about the Desktop Agent connecting, normally retrieved within the + * context of the Desktop Agent via `fdc3.getInfo()`.*/ implementationMetadata: { /** The version number of the FDC3 specification that the implementation * provides. The string must be a numeric semver version, e.g. 1.2 or 1.2.1. */ From f09575b7084d3de03f6afe8539192fb1c0b4ac35 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 24 May 2023 11:06:50 +0100 Subject: [PATCH 061/106] Correct reference to a late step in connection sequence --- docs/agent-bridging/spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 7a879cdc9..629c2547d 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -311,7 +311,7 @@ The Desktop Agent Bridge will extract the authentication token `sub` from the JW **Schema**: [https://fdc3.finos.org/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json](/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json) -If authentication succeeds (or is not required), then the Desktop Agent Bridge should assign the Desktop Agent the name requested in the `handshake` message, unless another agent is already connected with that name in which case it should generate a new name which MAY be derived from the requested name. Note that the assigned name is not communicated to the connecting agent until step 5. +If authentication succeeds (or is not required), then the Desktop Agent Bridge should assign the Desktop Agent the name requested in the `handshake` message, unless another agent is already connected with that name in which case it should generate a new name which MAY be derived from the requested name. Note that the assigned name is not communicated to the connecting agent until step 6. ### Step 5. Synchronize the Bridge's Channel State From 5e81c98a5f385a7e2e4521e95a736095cab97aef Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 31 May 2023 12:09:11 +0100 Subject: [PATCH 062/106] prettier --- src/api/Errors.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/api/Errors.ts b/src/api/Errors.ts index be75d6d6a..0fcd5dea3 100644 --- a/src/api/Errors.ts +++ b/src/api/Errors.ts @@ -17,7 +17,6 @@ export enum OpenError { MalformedContext = 'MalformedContext', /** @experimental Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ DesktopAgentNotFound = 'DesktopAgentNotFound', - } /** Constants representing the errors that can be encountered when calling the `findIntent`, `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the DesktopAgent (`fdc3`). */ @@ -40,7 +39,6 @@ export enum ResolveError { MalformedContext = 'MalformedContext', /** @experimental Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ DesktopAgentNotFound = 'DesktopAgentNotFound', - } export enum ResultError { From 1a31664380f336f26d3cb5f5633f5b651055b24e Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 7 Jun 2023 09:51:50 +0100 Subject: [PATCH 063/106] Switch from GUID to UUID (#67) * switch from GUID to UUID throughout + markdown linting --- .../ref/PrivateChannel.broadcast.md | 4 +- .../ref/PrivateChannel.eventListenerAdded.md | 8 +- .../PrivateChannel.eventListenerRemoved.md | 14 +- .../PrivateChannel.onAddContextListener.md | 4 +- .../ref/PrivateChannel.onDisconnect.md | 4 +- .../ref/PrivateChannel.onUnsubscribe.md | 10 +- docs/agent-bridging/ref/broadcast.md | 8 +- docs/agent-bridging/ref/findInstances.md | 18 +- docs/agent-bridging/ref/findIntent.md | 20 +- .../ref/findIntentsByContext.md | 14 +- docs/agent-bridging/ref/getAppMetadata.md | 14 +- docs/agent-bridging/ref/open.md | 14 +- docs/agent-bridging/ref/raiseIntent.md | 28 +- docs/agent-bridging/spec.md | 286 +++++++++--------- schemas/bridging/bridgeRequest.schema.json | 6 +- schemas/bridging/bridgeResponse.schema.json | 8 +- schemas/bridging/broadcastRequest.schema.json | 2 +- .../connectionStep3Handshake.schema.json | 6 +- ...ctionStep4AuthenticationFailed.schema.json | 10 +- ...tionStep6ConnectedAgentsUpdate.schema.json | 10 +- .../bridging/findInstancesRequest.schema.json | 2 +- .../bridging/findIntentRequest.schema.json | 2 +- .../findIntentsByContextRequest.schema.json | 2 +- .../getAppMetadataRequest.schema.json | 2 +- schemas/bridging/openRequest.schema.json | 2 +- .../privateChannelBroadcast.schema.json | 2 +- ...ivateChannelEventListenerAdded.schema.json | 2 +- ...ateChannelEventListenerRemoved.schema.json | 2 +- ...ateChannelOnAddContextListener.schema.json | 2 +- .../privateChannelOnDisconnect.schema.json | 2 +- .../privateChannelOnUnsubscribe.schema.json | 2 +- .../bridging/raiseIntentRequest.schema.json | 4 +- src/bridging/BridgingTypes.ts | 210 ++++++------- .../next/bridging/bridgeRequest.schema.json | 6 +- .../next/bridging/bridgeResponse.schema.json | 8 +- .../bridging/broadcastRequest.schema.json | 2 +- .../connectionStep3Handshake.schema.json | 6 +- ...ctionStep4AuthenticationFailed.schema.json | 10 +- ...tionStep6ConnectedAgentsUpdate.schema.json | 10 +- .../bridging/findInstancesRequest.schema.json | 2 +- .../bridging/findIntentRequest.schema.json | 2 +- .../findIntentsByContextRequest.schema.json | 2 +- .../getAppMetadataRequest.schema.json | 2 +- .../next/bridging/openRequest.schema.json | 2 +- .../privateChannelBroadcast.schema.json | 2 +- ...ivateChannelEventListenerAdded.schema.json | 2 +- ...ateChannelEventListenerRemoved.schema.json | 2 +- ...ateChannelOnAddContextListener.schema.json | 2 +- .../privateChannelOnDisconnect.schema.json | 2 +- .../privateChannelOnUnsubscribe.schema.json | 2 +- .../bridging/raiseIntentRequest.schema.json | 4 +- 51 files changed, 396 insertions(+), 396 deletions(-) diff --git a/docs/agent-bridging/ref/PrivateChannel.broadcast.md b/docs/agent-bridging/ref/PrivateChannel.broadcast.md index f51d74976..311a9246e 100644 --- a/docs/agent-bridging/ref/PrivateChannel.broadcast.md +++ b/docs/agent-bridging/ref/PrivateChannel.broadcast.md @@ -6,7 +6,7 @@ title: PrivateChannel.broadcast Desktop Agent bridging message exchange for a `broadcast` API call on a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: -* [`PrivateChannel.broadcast(context: Context)`](../../api/ref/Channel#broadcast) (inherited from the [Channel](../../api/ref/Channel#broadcast) class) +- [`PrivateChannel.broadcast(context: Context)`](../../api/ref/Channel#broadcast) (inherited from the [Channel](../../api/ref/Channel#broadcast) class) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** @@ -68,7 +68,7 @@ Hence, the broadcast message should be repeated once for each subscriber, and mo "context": { /*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AChatApp", diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md index 820134e2a..738959941 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md @@ -6,9 +6,9 @@ title: PrivateChannel.eventListenerAdded Desktop Agent bridging message exchange for the addition of an event handler to a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: -* [`PrivateChannel.onAddContextListener(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onaddcontextlistener) -* [`PrivateChannel.onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) -* [`PrivateChannel.onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) +- [`PrivateChannel.onAddContextListener(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onaddcontextlistener) +- [`PrivateChannel.onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) +- [`PrivateChannel.onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** @@ -49,7 +49,7 @@ sequenceDiagram "listenerType": "onAddContextListener" }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AChatApp", diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md index feea08ec8..1c9396791 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -6,12 +6,12 @@ title: PrivateChannel.eventListenerRemoved Desktop Agent bridging message exchange for the removal of an event handler from a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: -* [`listener.unsubscribe()`](../../api/ref/Types#listener) - * for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: - * [`onAddContextListener(handler: (contextType?: string)`](../../api/ref/PrivateChannel#onaddcontextlistener) - * [`onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) - * [`onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) -* [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) +- [`listener.unsubscribe()`](../../api/ref/Types#listener) + - for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: + - [`onAddContextListener(handler: (contextType?: string)`](../../api/ref/PrivateChannel#onaddcontextlistener) + - [`onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) + - [`onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) +- [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** @@ -52,7 +52,7 @@ sequenceDiagram "listenerType": "onAddContextListener" }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AChatApp", diff --git a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md index b00dfec65..472cc1091 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md +++ b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md @@ -6,7 +6,7 @@ title: PrivateChannel.onAddContextListener Desktop Agent bridging message exchange for the addition of a [`ContextHandler`](../../api/ref/Types#contexthandler) to a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API call: -* [`PrivateChannel.addContextListener(contextType: string | null, handler: ContextHandler)`](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) +- [`PrivateChannel.addContextListener(contextType: string | null, handler: ContextHandler)`](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** @@ -47,7 +47,7 @@ sequenceDiagram "contextType": "fdc3.instrument" }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AnotherApp", diff --git a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md index b68ff82a0..a918d5760 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md +++ b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md @@ -6,7 +6,7 @@ title: PrivateChannel.onDisconnect Desktop Agent bridging message exchange for a `disconnect()` API call on [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API call: -* [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) +- [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** @@ -46,7 +46,7 @@ sequenceDiagram "channel": "private-channel-ABC123" }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AnotherApp", diff --git a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md index 4a96486cd..778547d1e 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -6,10 +6,10 @@ title: PrivateChannel.onUnsubscribe Desktop Agent bridging message exchange for the removal of a [`ContextHandler`](../../api/ref/Types#contexthandler) from a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: -* [`listener.unsubscribe()`](../../api/ref/Types#listener) - * for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: - * [addContextListener(handler: (contextType?: string)](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) -* [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) +- [`listener.unsubscribe()`](../../api/ref/Types#listener) + - for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: + - [addContextListener(handler: (contextType?: string)](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) +- [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** @@ -50,7 +50,7 @@ sequenceDiagram "contextType": "fdc3.instrument" }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AnotherApp", diff --git a/docs/agent-bridging/ref/broadcast.md b/docs/agent-bridging/ref/broadcast.md index a6c18de2d..6e16f6a8e 100644 --- a/docs/agent-bridging/ref/broadcast.md +++ b/docs/agent-bridging/ref/broadcast.md @@ -6,8 +6,8 @@ title: broadcast Desktop Agent bridging message exchange for a `broadcast()` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent) or a [`Channel`](../../api/ref/Channel). Generated by API calls: -* [`fdc3.broadcast(context: Context)`](../../api/ref/DesktopAgent#broadcast) -* [`Channel.broadcast(context: Context)`](../../api/ref/Channel#broadcast) +- [`fdc3.broadcast(context: Context)`](../../api/ref/DesktopAgent#broadcast) +- [`Channel.broadcast(context: Context)`](../../api/ref/Channel#broadcast) :::caution @@ -61,7 +61,7 @@ Outward message to the DAB: "context": { /*contextObj*/ } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2022-03-...", "source": [{ "appId": "agentA-app1", @@ -83,7 +83,7 @@ which it repeats on to agent-B AND agent-C with the `source.desktopAgent` metada "context": { /*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": [{ "appId": "agentA-app1", diff --git a/docs/agent-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md index 67a08249b..c6f8d4d23 100644 --- a/docs/agent-bridging/ref/findInstances.md +++ b/docs/agent-bridging/ref/findInstances.md @@ -6,7 +6,7 @@ title: findInstances Desktop Agent bridging message exchange for a `findInstances` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -* [`findInstances(app: AppIdentifier)`](../../api/ref/DesktopAgent#findinstances) +- [`findInstances(app: AppIdentifier)`](../../api/ref/DesktopAgent#findinstances) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** or **Request Response (single)** @@ -56,7 +56,7 @@ Outward message to the bridge: } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AChatApp", @@ -78,7 +78,7 @@ which is repeated on to the target agent as: } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": 2020-03-..., "source": { "appId": "AChatApp", @@ -102,7 +102,7 @@ If results should be constrained to a particular Desktop Agent, then set a `desk } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "destination": { "desktopAgent": "agent-B"}, //destination agent "source": { @@ -136,8 +136,8 @@ Response message from a Desktop Agent: ] }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", } } @@ -158,8 +158,8 @@ The bridge receives and collates the responses, augmenting each appIdentifier wi ] }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", "sources": [ //added by DAB { "desktopAgent": "agent-A" }, @@ -170,7 +170,7 @@ The bridge receives and collates the responses, augmenting each appIdentifier wi ``` :::info -If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.responseGuid` and can quote that given by the responding Desktop Agent. +If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.responseUuid` and can quote that given by the responding Desktop Agent. ::: :::note diff --git a/docs/agent-bridging/ref/findIntent.md b/docs/agent-bridging/ref/findIntent.md index 77feaabd4..83fca8a87 100644 --- a/docs/agent-bridging/ref/findIntent.md +++ b/docs/agent-bridging/ref/findIntent.md @@ -6,7 +6,7 @@ title: findIntent Desktop Agent bridging message exchange for a `findIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API call: -* [`findIntent(intent: string, context?: Context, resultType?: string)`](../../api/ref/DesktopAgent#findintent) +- [`findIntent(intent: string, context?: Context, resultType?: string)`](../../api/ref/DesktopAgent#findintent) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** @@ -51,7 +51,7 @@ Outward message to the DAB: "context": {/*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": [{ "appId": "agentA-app1", @@ -73,7 +73,7 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the "context": {/*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "agentA-app1", @@ -141,14 +141,14 @@ Hence, the response it sends to the bridge is encoded as follows: } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", } } ``` -Note the response GUID generated by the agent-B and the reference to the request GUID produced by agent-A where the request was originated. Further, note that the `AppMetadata` elements in the `AppIntent` do not have a `desktopAgent` field yet, and the `meta` element does not contain a `sources` element, both of which the bridge will add. +Note the response UUID generated by the agent-B and the reference to the request UUID produced by agent-A where the request was originated. Further, note that the `AppMetadata` elements in the `AppIntent` do not have a `desktopAgent` field yet, and the `meta` element does not contain a `sources` element, both of which the bridge will add. DA agent-C would produce the following response locally: @@ -176,8 +176,8 @@ which is sent back over the bridge as a response to the request message as: } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", } } @@ -206,8 +206,8 @@ The bridge receives and collates the responses, producing the following collated } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", "sources": [ //added by DAB { "desktopAgent": "agent-A" }, diff --git a/docs/agent-bridging/ref/findIntentsByContext.md b/docs/agent-bridging/ref/findIntentsByContext.md index 2752fc1bf..7a74fa64d 100644 --- a/docs/agent-bridging/ref/findIntentsByContext.md +++ b/docs/agent-bridging/ref/findIntentsByContext.md @@ -6,7 +6,7 @@ title: findIntentsByContext Desktop Agent bridging message exchange for a `findIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API call: -* [`findIntentsByContext(context: Context)`](../../api/ref/DesktopAgent#findintentsbycontext) +- [`findIntentsByContext(context: Context)`](../../api/ref/DesktopAgent#findintentsbycontext) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** @@ -54,7 +54,7 @@ Outward message to the DAB: "context": {/*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "agentA-app1", @@ -75,7 +75,7 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the "context": {/*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "agentA-app1", @@ -152,8 +152,8 @@ This response is encoded and sent to the bridge as: ] }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", } } @@ -199,8 +199,8 @@ Each `AppMetadata` object is augmented by the bridge with a `desktopAgent` field ] }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", "sources": [ { "desktopAgent": "agent-B" }, diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index d40dde3e6..9a050cf4a 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -6,7 +6,7 @@ title: getAppMetadata Desktop Agent bridging message exchange for a `getAppMetadata` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -* [`getAppMetadata(app: AppIdentifier)`](../../api/ref/DesktopAgent#getappmetadata) +- [`getAppMetadata(app: AppIdentifier)`](../../api/ref/DesktopAgent#getappmetadata) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (single)** @@ -55,7 +55,7 @@ Outward message to the bridge: } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AChatApp", @@ -77,7 +77,7 @@ which is repeated on to the target agent as: } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AChatApp", @@ -115,8 +115,8 @@ Response message from a Desktop Agent: } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", } } @@ -142,8 +142,8 @@ The bridge receives the response, augments the appMetadata with a `desktopAgent` } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", } } diff --git a/docs/agent-bridging/ref/open.md b/docs/agent-bridging/ref/open.md index c5845a392..c4511a334 100644 --- a/docs/agent-bridging/ref/open.md +++ b/docs/agent-bridging/ref/open.md @@ -6,7 +6,7 @@ title: open Desktop Agent bridging message exchange for a `open` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -* [`open(app: AppIdentifier, context?: Context)`](../../api/ref/DesktopAgent#open) +- [`open(app: AppIdentifier, context?: Context)`](../../api/ref/DesktopAgent#open) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (single)** @@ -72,7 +72,7 @@ Outward message to the bridge: "context": {/*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "AChatApp", @@ -96,7 +96,7 @@ which is repeated on to the target agent as: "context": {/*contextObj*/} }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": 2020-03-..., "source": { "appId": "AChatApp", @@ -128,8 +128,8 @@ Response message from target Desktop Agent: } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-..." } } @@ -148,8 +148,8 @@ which is augmented and repeated on by the bridge as: } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", "sources": [{ "desktopAgent": "agent-B" }] // added by DAB } diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index 9e0c6102f..d053ee125 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -6,8 +6,8 @@ title: raiseIntent Desktop Agent bridging message exchange for a `raiseIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -* [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintent) -* [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintentforcontext) +- [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintent) +- [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintentforcontext) [Message Exchange Type](../spec#individual-message-exchanges): **Request Multiple Response (single)** @@ -87,7 +87,7 @@ Outward message to the DAB: } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "agentA-app1", @@ -117,7 +117,7 @@ The bridge fills in the `source.desktopAgent` field and forwards the request to } }, "meta": { - "requestGuid": "", + "requestUuid": "", "timestamp": "2020-03-...", "source": { "appId": "agentA-app1", @@ -170,8 +170,8 @@ This is encoded and sent to the bridge (omitting the `getResult()` function) as: } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-..." } } @@ -200,8 +200,8 @@ The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.des } }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", "sources": [{ "desktopAgent": "agent-B" }] // added by DAB } @@ -224,8 +224,8 @@ When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent */ }, "meta": { - "requestGuid": "", - "responseGuid": "", //a different GUID should be used for the result response + "requestUuid": "", + "responseUuid": "", //a different UUID should be used for the result response "timestamp": "2020-03-...", "sources": [{ "appId": "Slack", @@ -251,8 +251,8 @@ Finally, the bridge augments the response with `sources[0].desktopAgent` and pas "context": {/*contextObj*/} }, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", "sources": [{ "appId": "Slack", @@ -271,8 +271,8 @@ If the `IntentHandler` returned `void` rather than an intent result `payload` sh "type": "raiseIntentResultResponse", "payload": {}, "meta": { - "requestGuid": "", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-...", "sources": [{ "appId": "Slack", diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 629c2547d..57ce5d094 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -30,7 +30,7 @@ Firms that make extensive use of FDC3 have also identified use cases where inter ![Two physical desktops with a desktop agent each](/assets/dab-overview-3.png) -With the success of FDC3, usage of vendor-provided Desktop Agents has increased substantially among banks and buy-side institutions. Buy-side firms who are clients of multiple banks' platforms have multiple desktop agents delivered to their desktops. Several software vendors also deliver FDC3-compatible software: some as apps that can run in any Desktop Agent, but some as self-contained applications running in their own desktop agent. They are often multi-component suites of functionality with a customized user experience, and are not simple to export to a different Desktop Agent. In these cases, being able to provide a single installable platform bundled with a Desktop Agent is a far more practical solution for the vendor and customer. +With the success of FDC3, usage of vendor-provided Desktop Agents has increased substantially among banks and buy-side institutions. Buy-side firms who are clients of multiple banks' platforms have multiple desktop agents delivered to their desktops. Several software vendors also deliver FDC3-compatible software: some as apps that can run in any Desktop Agent, but some as self-contained applications running in their own desktop agent. They are often multi-component suites of functionality with a customized user experience, and are not simple to export to a different Desktop Agent. In these cases, being able to provide a single installable platform bundled with a Desktop Agent is a far more practical solution for the vendor and customer. ![Two physical desktops, one with multiple desktop agents](/assets/dab-overview-4.png) @@ -44,9 +44,9 @@ In any Desktop Agent Bridging scenario, it is expected that each DA is being ope The Desktop Agent Bridge Part of the FDC3 Standard is composed of three components: -* **[Connection](#connection)**: A means for Desktop Agents to communicate with a bridge, and through that bridge, with each other. -* **[Connection Protocol](#connection-protocol)**: A protocol defining message exchanges necessary to connect to a Bridge and to perform initial state synchronization. -* **[Messaging Protocol](#messaging-protocol)**: A protocol defining message exchanges that allow FDC3 API interop to extend across multiple Desktop Agents. +- **[Connection](#connection)**: A means for Desktop Agents to communicate with a bridge, and through that bridge, with each other. +- **[Connection Protocol](#connection-protocol)**: A protocol defining message exchanges necessary to connect to a Bridge and to perform initial state synchronization. +- **[Messaging Protocol](#messaging-protocol)**: A protocol defining message exchanges that allow FDC3 API interop to extend across multiple Desktop Agents. Detail on each of these components is defined in the following sections. @@ -85,19 +85,19 @@ Whilst the standalone bridge represents a single point of failure for the interc By using the Desktop Agent Bridging Connection and Messaging protocols, a bridge will implement "server" behavior by: -* Accepting connections from client Desktop Agents, receiving and authenticating credentials and assigning a name (for routing purposes) -* Receiving requests from client Desktop Agents. -* Routing requests to client Desktop Agents. -* Receiving responses from client Desktop Agents and collating them. -* Routing responses to client Desktop Agents. +- Accepting connections from client Desktop Agents, receiving and authenticating credentials and assigning a name (for routing purposes) +- Receiving requests from client Desktop Agents. +- Routing requests to client Desktop Agents. +- Receiving responses from client Desktop Agents and collating them. +- Routing responses to client Desktop Agents. A Desktop Agent will implement "client" behavior by: -* Connecting to the bridge, providing authentication credentials and receiving an assigned named (for routing purposes). -* Forwarding requests to the bridge. -* Awaiting response(s) from the bridge. -* Receiving requests from the bridge. -* Sending responses to the bridge. +- Connecting to the bridge, providing authentication credentials and receiving an assigned named (for routing purposes). +- Forwarding requests to the bridge. +- Awaiting response(s) from the bridge. +- Receiving requests from the bridge. +- Sending responses to the bridge. Hence, message paths and propagation are simple. All messages to other Desktop Agents are passed to the bridge for routing and all messages (both requests and responses) are received back from it, i.e. the bridge is responsible for all message routing. @@ -127,7 +127,7 @@ flowchart LR; PC1 .- |Bridge interconnect| PC2 ``` -However, cross-machine routing is currently considered to be an internal concern of a Desktop Agent Bridge implementation, with each Desktop Agent simply communicating with a bridge instance located on the same machine. Hence, the connection protocol between bridges themselves is currently beyond the scope of this standard and my be implemented via any suitable means. +However, cross-machine routing is currently considered to be an internal concern of a Desktop Agent Bridge implementation, with each Desktop Agent simply communicating with a bridge instance located on the same machine. Hence, the connection protocol between bridges themselves is currently beyond the scope of this standard and my be implemented via any suitable means. Further, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. However, methods of verifying the identity of user are currently beyond the scope of the Standard. @@ -141,7 +141,7 @@ Bridge implementations SHOULD default to binding the websocket server to a port Both DAs and bridge implementations SHOULD support at least connection to the recommended port range and MAY also support configuration for connection to an alternative bridging port or port range. -#### Websockets and Multiple Machines +#### WebSockets and Multiple Machines As the bridge binds its websocket on the loopback address (127.0.0.1) it cannot be connected to from another device. Hence, an instance of the standalone bridge may be run on each device and those instances exchange messages by other means in order to implement the bridge cross-device. @@ -149,21 +149,21 @@ As the bridge binds its websocket on the loopback address (127.0.0.1) it cannot On connection to the bridge's websocket, a handshake must be completed that may include an authentication step before a name is assigned to the Desktop Agent for use in routing messages. The purpose of the handshake is to allow: -* The Desktop Agent to confirm that it is connecting to Desktop Agent Bridge, rather than another service exposed via a websocket. -* The Desktop Agent Bridge to require that the Desktop Agent authenticate itself, allowing it to control access to the network of bridged Desktop Agents. -* The Desktop Agent to request a particular name by which it will be addressed by other agents and for the bridge to assign the requested name, after confirming that no other agent is connected with that name, or a derivative of that name if it is already in use. +- The Desktop Agent to confirm that it is connecting to Desktop Agent Bridge, rather than another service exposed via a websocket. +- The Desktop Agent Bridge to require that the Desktop Agent authenticate itself, allowing it to control access to the network of bridged Desktop Agents. +- The Desktop Agent to request a particular name by which it will be addressed by other agents and for the bridge to assign the requested name, after confirming that no other agent is connected with that name, or a derivative of that name if it is already in use. The bridge is ultimately responsible for assigning each Desktop Agent a name and for routing messages using those names. Desktop Agents MUST accept the name they are assigned by the bridge. Exchange standardized handshake messages that identify: -* That the server is a bridge, including: - * implementation details for logging by DA. - * supported FDC3 version(s). -* That the client is an FDC3 DA, including: - * implementation details (ImplementationMeta returned by fdc3.getInfo() call) for logging by DA and sharing with other DAs. - * already includes supported FDC3 version. - * request for a specific agent name. +- That the server is a bridge, including: + - implementation details for logging by DA. + - supported FDC3 version(s). +- That the client is an FDC3 DA, including: + - implementation details (ImplementationMeta returned by fdc3.getInfo() call) for logging by DA and sharing with other DAs. + - already includes supported FDC3 version. + - request for a specific agent name. ```mermaid sequenceDiagram @@ -256,8 +256,8 @@ The DA must then respond to the `hello` message with a `handshake` request to th channelsState: Record }, meta: { - /** Unique GUID for this request */ - requestGuid: string, + /** Unique UUID for this request */ + requestUuid: string, /** Timestamp at which request was generated */ timestamp: date } @@ -266,13 +266,13 @@ The DA must then respond to the `hello` message with a `handshake` request to th **Schema**: [https://fdc3.finos.org/schemas/next/bridging/connectionStep3Handshake.schema.json](/schemas/next/bridging/connectionStep3Handshake.schema.json) -Note that the `meta` element of of the handshake message contains both a `timestamp` field (for logging purposes) and a `requestGuid` field that should be populated with a Globally Unique Identifier (GUID), generated by the Desktop Agent. This `responseGuid` will be used to link the handshake message to a response from the Desktop Agent Bridge that assigns it a name. For more details on GUID generation see [Globally Unique Identifier](#globally-unique-identifier) section. +Note that the `meta` element of of the handshake message contains both a `timestamp` field (for logging purposes) and a `requestUuid` field that should be populated with a Universally Unique Identifier (UUID), generated by the Desktop Agent. This `responseUuid` will be used to link the handshake message to a response from the Desktop Agent Bridge that assigns it a name. For more details on UUID generation see [Universally Unique Identifier](#universally-unique-identifier) section. If requested by the server, the JWT auth token payload should take the form: ```typescript { - "sub": string, // GUID for the key pair used to sign the token + "sub": string, // UUID for the key pair used to sign the token "iat": date // timestamp at which the the token was generated as specified in ISO 8601 } ``` @@ -286,7 +286,7 @@ e.g. } ``` -Note that the `sub` SHOULD be a GUID that does NOT need to match the name requested by the Desktop Agent. It will be used to identify the key pair that should be used to validate the JWT token. Further, multiple Desktop Agent's MAY share the same keys for authentication and hence the same `sub`, but they will be assigned different names for routing purposes by the Desktop Agent Bridge. If an agent disconnects from the bridge and later re-connects it MAY request and be assigned the same name it connected with before. +Note that the `sub` SHOULD be a UUID that does NOT need to match the name requested by the Desktop Agent. It will be used to identify the key pair that should be used to validate the JWT token. Further, multiple Desktop Agent's MAY share the same keys for authentication and hence the same `sub`, but they will be assigned different names for routing purposes by the Desktop Agent Bridge. If an agent disconnects from the bridge and later re-connects it MAY request and be assigned the same name it connected with before. ### Step 4. Auth Confirmation and Name Assignment @@ -301,10 +301,10 @@ The Desktop Agent Bridge will extract the authentication token `sub` from the JW meta: { /** Timestamp at which response was generated */ timestamp: Date, - /** GUID for the handshake request */ - requestGuid: string, - /** Unique GUID for this message */ - responseGuid: string, + /** UUID for the handshake request */ + requestUuid: string, + /** Unique UUID for this message */ + responseUuid: string, } } ``` @@ -344,7 +344,7 @@ When multiple agents attempt to connect to the Desktop Agent Bridge at the same ### Step 6. Connected Agents Update -The updated `existingChannelsState` will then be shared with all connected agents along with updated details of all connected agents via a `connectedAgentsUpdate` message sent to all connected sockets. The newly connected agent will receive both its assigned name and channel state via this message. The `connectedAgentsUpdate` message will be linked to the handshake request by quoting the `meta.requestGuid` of the `handshake` message. +The updated `existingChannelsState` will then be shared with all connected agents along with updated details of all connected agents via a `connectedAgentsUpdate` message sent to all connected sockets. The newly connected agent will receive both its assigned name and channel state via this message. The `connectedAgentsUpdate` message will be linked to the handshake request by quoting the `meta.requestUuid` of the `handshake` message. The `connectedAgentsUpdate` message will take the form: @@ -368,12 +368,12 @@ The `connectedAgentsUpdate` message will take the form: channelsState?: Record // see step4 }, meta: { - /** For a new connection, should be the same as the handshake requestGuid. - * Should be the same as the responseGuid for a disconnection. + /** For a new connection, should be the same as the handshake requestUuid. + * Should be the same as the responseUuid for a disconnection. */ - requestGuid: string, - /** Unique GUID for this message */ - responseGuid: string, + requestUuid: string, + /** Unique UUID for this message */ + responseUuid: string, /** Timestamp at which response was generated */ timestamp: date, } @@ -456,8 +456,8 @@ All messages sent or received by the Desktop Agent Bridge will be encoded in JSO Messages can be divided into two categories: -* Requests: Messages that initiate a particular interaction -* Responses: Messages that respond to a prior request +- Requests: Messages that initiate a particular interaction +- Responses: Messages that respond to a prior request Details specific to each are provided in the following sections. @@ -489,8 +489,8 @@ Request messages use the following format: }, /** Metadata used to uniquely identify the message and its sender. */ meta: { - /** Unique GUID for this request */ - requestGuid: string, + /** Unique UUID for this request */ + requestUuid: string, /** Timestamp at which request was generated */ timestamp: date, /** AppIdentifier OR DesktopAgentIdentifier for the source application @@ -511,11 +511,11 @@ Request messages use the following format: If the FDC3 API call underlying the request message includes a target (typically defined by an `app` argument, in the form of an AppIdentifier object) it is the responsibility of the Desktop Agent to copy that argument into the `meta.destination` field of the message and to ensure that it includes a `meta.destination.desktopAgent` value. If the target is provided in the FDC3 API call, but without a `meta.destination.desktopAgent` value, the Desktop Agent should assume that the call relates to a local application and does not need to send it to the bridge. -Requests without a `meta.destination` field will be forwarded to all other agents by the bridge, which will also handle the collation of responses which quote the `meta.requestGuid`. +Requests without a `meta.destination` field will be forwarded to all other agents by the bridge, which will also handle the collation of responses which quote the `meta.requestUuid`. #### Response Messages -Response messages will be differentiated from requests by the presence of a `meta.responseGuid` field and MUST quote the `meta.requestGuid` that they are responding to. +Response messages will be differentiated from requests by the presence of a `meta.responseUuid` field and MUST quote the `meta.requestUuid` that they are responding to. ```typescript { @@ -552,10 +552,10 @@ Response messages will be differentiated from requests by the presence of a `met } }, meta: { - /** requestGuid from the original request being responded to*/ - requestGuid: string, - /** Unique GUID for this response */ - responseGuid: string, + /** requestUuid from the original request being responded to*/ + requestUuid: string, + /** Unique UUID for this response */ + responseUuid: string, /** Timestamp at which request was generated */ timestamp: Date, /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources @@ -579,21 +579,21 @@ Response messages will be differentiated from requests by the presence of a `met **Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json](/schemas/next/bridging/bridgeResponse.schema.json) -Response messages do not include a `meta.destination` as the routing of responses is handled by the bridge via the `meta.requestGuid` field. +Response messages do not include a `meta.destination` as the routing of responses is handled by the bridge via the `meta.requestUuid` field. ### Identifying Individual Messages -There are a variety of message types need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Globally Unique Identifier (GUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. +There are a variety of message types need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Universally Unique Identifier (UUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. -Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestGuid` value. Response messages should quote that same value in the `meta.requestGuid` field and generate a further unique identity for their response, which is included in the `meta.responseGuid` field. Where a response is collated by the Desktop Agent Bridge, the Bridge should generate its own `meta.responseGuid` for the collated response message. +Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestUuid` value. Response messages should quote that same value in the `meta.requestUuid` field and generate a further unique identity for their response, which is included in the `meta.responseUuid` field. Where a response is collated by the Desktop Agent Bridge, the Bridge should generate its own `meta.responseUuid` for the collated response message. -Desktop Agent Bridge implementations should consider request messages that omit `meta.requestGuid` and response messages that omit either `meta.requestGuid` or `meta.responseGuid` to be invalid and should discard them. +Desktop Agent Bridge implementations should consider request messages that omit `meta.requestUuid` and response messages that omit either `meta.requestUuid` or `meta.responseUuid` to be invalid and should discard them. -#### Globally Unique Identifier +#### Universally Unique Identifier -A GUID (globally unique identifier), also known as a Universally Unique IDentifier (UUID), is a generated 128-bit text string that is intended to be 'unique across space and time', as defined in [IETF RFC 4122](https://www.ietf.org/rfc/rfc4122.txt). +A UUID (Universally Unique IDentifier), also known as a Globally Unique IDentifier (GUID), is a generated 128-bit text string that is intended to be 'unique across space and time', as defined in [IETF RFC 4122](https://www.ietf.org/rfc/rfc4122.txt). -There are several types of GUIDs, which vary how they are generated. As Desktop Agents will typically be running on the same machine, system clock and hardware details may not provide sufficient uniqueness in GUIDs generated (including during the connect step, where Desktop Agent name collisions may exist). Hence, it is recommended that both Desktop Agents and Desktop Agent Bridges SHOULD use a version 4 generation type (random). +There are several types of UUIDs, which vary how they are generated. As Desktop Agents will typically be running on the same machine, system clock and hardware details may not provide sufficient uniqueness in UUIDs generated (including during the connect step, where Desktop Agent name collisions may exist). Hence, it is recommended that both Desktop Agents and Desktop Agent Bridges SHOULD use a version 4 generation type (random). ### Identifying Desktop Agents Identity and Message Sources @@ -630,7 +630,7 @@ Hence, either an `AppIdentifier` or `DesktopAgentIdentifier` is used as the `met A request message may include a `destination` field, set by the source Desktop Agent if the message is intended for a particular Desktop Agent (e.g. to support a `raiseIntent` call with a specified target app or app instance on a particular Desktop Agent). -Response messages do not include a `destination` field. Instead, a Desktop Agent Bridge implementation MUST retain a record of `requestGuid` fields for request message, until the request is fully resolved, allowing them to determine the destination for the collated responses and effectively enforcing the routing policy for interactions. +Response messages do not include a `destination` field. Instead, a Desktop Agent Bridge implementation MUST retain a record of `requestUuid` fields for request message, until the request is fully resolved, allowing them to determine the destination for the collated responses and effectively enforcing the routing policy for interactions. Further, the Desktop Agent Bridge should also inspect the `payload` of both request and response messages and ensure that any `AppIdentifier` objects have been augmented with the correct `desktopAgent` value for the app's host Desktop Agent (e.g. if returning responses to `findIntent`, ensure each `AppIntent.apps[]` entry includes the correct `desktopAgent` value). Further details of any such augmentation are provided in the description of each message exchange. @@ -648,8 +648,8 @@ For example, a `raiseIntent` targeted at an app instance that no longer exists m "error": "TargetInstanceUnavailable", //", - "responseGuid": "", + "requestUuid": "", + "responseUuid": "", "timestamp": "2020-03-..." } } @@ -695,56 +695,56 @@ enum BridgingError { When handling request messages, it is the responsibility of the Desktop Agent Bridge to: -* Receive request messages from connected Desktop Agents. -* Augment request messages with `meta.source.desktopAgent` information (as described above). -* Forward request messages onto either a specific Desktop Agent or all other Desktop Agents. - * The bridge MUST NOT forward the request to the agent that sent the request, nor expect a reply from it. +- Receive request messages from connected Desktop Agents. +- Augment request messages with `meta.source.desktopAgent` information (as described above). +- Forward request messages onto either a specific Desktop Agent or all other Desktop Agents. + - The bridge MUST NOT forward the request to the agent that sent the request, nor expect a reply from it. For message exchanges that involve responses, it is the responsibility of the Desktop Agent Bridge to: -* Receive and collate response messages (where necessary) according the `meta.requestGuid` (allowing multiple message exchanges to be 'in-flight' at once). -* Augment response messages with `meta.source.desktopAgent` information (as described above). -* Apply a timeout to the receipt of response messages for each request. -* Produce a single collated response message (where necessary) that incorporates the output of each individual response received and has its own unique `meta.responseGuid` value. -* Deliver the collated and/or augmented response message to the source Desktop Agent that sent the request. +- Receive and collate response messages (where necessary) according the `meta.requestUuid` (allowing multiple message exchanges to be 'in-flight' at once). +- Augment response messages with `meta.source.desktopAgent` information (as described above). +- Apply a timeout to the receipt of response messages for each request. +- Produce a single collated response message (where necessary) that incorporates the output of each individual response received and has its own unique `meta.responseUuid` value. +- Deliver the collated and/or augmented response message to the source Desktop Agent that sent the request. Collated response messages generated by the bridge use the same format as individual response messages. The following pseudo-code defines how messages should be forwarded or collated by the bridge: -* **if** the message is a request (`meta.requestGuid` is set, but `meta.responseGuid` is not), - * **if** the message includes a `meta.destination` field, - * forward it to the specified destination agent, - * annotate the request as requiring only a response from the specified agent, - * await the response or the specified timeout. - * **else** - * forward it to all other Desktop Agents (not including the source), - * annotate the request as requiring responses from all other connected agents, - * await responses or the specified timeout. -* **else if** the message is a response (both `meta.requestGuid` and `meta.responseGuid` are set) - * **if** the `meta.requestGuid` is known, - * augment any `AppIdentifier` types in the response message with a `desktopAgent` field matching that of the responding Desktop Agent, - * **if** `payload.error` is set in the response add the DesktopAgentIdentifier to the `meta.errorSources` element. - * **else** - * add the DesktopAgentIdentifier to the `meta.sources` element. - * **if** the message exchange requires collation, - * add the message to the collated responses for the request, - * **if** all expected responses have been received (i.e. all connected agents or the specified agent has responded, as appropriate), - * produce the collated response message and return to the requesting Desktop Agent. - * **else** - * await the configured response timeout or further responses, - * **if** the timeout is reached without any responses being received - * produce and return an appropriate [error response](../api/ref/Errors), including details of all Desktop Agents in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. - * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. - * **else if** the timeout is reached with a partial set of responses, - * produce and return, to requesting Desktop Agent, a collated response and include details of Desktop Agents that timed out in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. - * log the timeout for each Desktop Agent that did not respond and check disconnection criteria. - * **else** - * forward the response message on to requesting Desktop Agent. - * **else** - * discard the response message (as it is a delayed to a request that has timed out or is otherwise invalid). -* **else** - * the message is invalid and should be discarded. +- **if** the message is a request (`meta.requestUuid` is set, but `meta.responseUuid` is not), + - **if** the message includes a `meta.destination` field, + - forward it to the specified destination agent, + - annotate the request as requiring only a response from the specified agent, + - await the response or the specified timeout. + - **else** + - forward it to all other Desktop Agents (not including the source), + - annotate the request as requiring responses from all other connected agents, + - await responses or the specified timeout. +- **else if** the message is a response (both `meta.requestUuid` and `meta.responseUuid` are set) + - **if** the `meta.requestUuid` is known, + - augment any `AppIdentifier` types in the response message with a `desktopAgent` field matching that of the responding Desktop Agent, + - **if** `payload.error` is set in the response add the DesktopAgentIdentifier to the `meta.errorSources` element. + - **else** + - add the DesktopAgentIdentifier to the `meta.sources` element. + - **if** the message exchange requires collation, + - add the message to the collated responses for the request, + - **if** all expected responses have been received (i.e. all connected agents or the specified agent has responded, as appropriate), + - produce the collated response message and return to the requesting Desktop Agent. + - **else** + - await the configured response timeout or further responses, + - **if** the timeout is reached without any responses being received + - produce and return an appropriate [error response](../api/ref/Errors), including details of all Desktop Agents in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. + - log the timeout for each Desktop Agent that did not respond and check disconnection criteria. + - **else if** the timeout is reached with a partial set of responses, + - produce and return, to requesting Desktop Agent, a collated response and include details of Desktop Agents that timed out in `errorSources` and the `BridgingError.ResponseTimeOut` message for each in the `errorDetails` array. + - log the timeout for each Desktop Agent that did not respond and check disconnection criteria. + - **else** + - forward the response message on to requesting Desktop Agent. + - **else** + - discard the response message (as it is a delayed to a request that has timed out or is otherwise invalid). +- **else** + - the message is invalid and should be discarded. ### Workflows Broken By Disconnects @@ -760,13 +760,13 @@ The latter two types embody workflows that may be broken by an agent disconnecti When processing the disconnection of an agent from the bridge, the bridge MUST examine requests currently 'in-flight' and: -* For requests that require the bridge to collate multiple responses: - * add the disconnected Desktop Agent's details to the `errorSources` array in the response and the `BridgingError.AgentDisconnected` message to the `errorDetails` array. - * complete requests that no longer require further responses (all other agents have responded), or - * continue to await the timeout (if other agents are yet to respond), or - * return an 'empty' response in the expected format (if no other agents are connected and no data will be received). -* For requests that target a specific agent: - * return the `BridgingError.AgentDisconnected` in the response's `payload.error` field (as the request cannot be completed). +- For requests that require the bridge to collate multiple responses: + - add the disconnected Desktop Agent's details to the `errorSources` array in the response and the `BridgingError.AgentDisconnected` message to the `errorDetails` array. + - complete requests that no longer require further responses (all other agents have responded), or + - continue to await the timeout (if other agents are yet to respond), or + - return an 'empty' response in the expected format (if no other agents are connected and no data will be received). +- For requests that target a specific agent: + - return the `BridgingError.AgentDisconnected` in the response's `payload.error` field (as the request cannot be completed). Finally, in the event that either a Desktop Agent or the bridge itself stops responding, but doesn't fully disconnect, the timeouts (specified earlier in this document) will be used to handle the request as if a disconnection had occurred. @@ -780,32 +780,32 @@ Individual message exchanges are defined for each of the Desktop Agent methods t Each section assumes that we have 3 agents connected by a bridge (itself denoted by `DAB` in diagrams): -* agent-A (denoted by `DA A` in diagrams) -* agent-B (denoted by `DA A` in diagrams) -* agent-C (denoted by `DA A` in diagrams) +- agent-A (denoted by `DA A` in diagrams) +- agent-B (denoted by `DA A` in diagrams) +- agent-C (denoted by `DA A` in diagrams) Message exchanges come in a number of formats, which are known as: -* **Request only**: A request message that does not require a response ('fire and forget'), such as a [`broadcast`](ref/broadcast). -* **Request Response (single)**: A request message that expects a single response from a single Desktop Agent, such as `open` or `getAppMetadata`. -* **Request Response (collated)**: A request message that expects responses from all other Desktop Agents that are collated by the bridge and returned as a single response to the requestor, such as `findIntent` or `findInstances`. -* **Request Multiple Response (single)**: A request message that expects multiple responses from a single Desktop Agent, such as `raiseIntent`. +- **Request only**: A request message that does not require a response ('fire and forget'), such as a [`broadcast`](ref/broadcast). +- **Request Response (single)**: A request message that expects a single response from a single Desktop Agent, such as `open` or `getAppMetadata`. +- **Request Response (collated)**: A request message that expects responses from all other Desktop Agents that are collated by the bridge and returned as a single response to the requestor, such as `findIntent` or `findInstances`. +- **Request Multiple Response (single)**: A request message that expects multiple responses from a single Desktop Agent, such as `raiseIntent`. The message exchanges defined are: -* [`broadcast`](ref/broadcast) -* [`findInstances`](ref/findInstances) -* [`findIntent`](ref/findIntent) -* [`findIntentsByContext`](ref/findIntentsByContext) -* [`getAppMetadata`](ref/getAppMetadata) -* [`open`](ref/open) -* [`raiseIntent`](ref/raiseIntent) -* [`PrivateChannel.broadcast`](ref/PrivateChannel.broadcast) -* [`PrivateChannel.eventListenerAdded`](ref/PrivateChannel.eventListenerAdded) -* [`PrivateChannel.eventListenerRemoved`](ref/PrivateChannel.eventListenerRemoved) -* [`PrivateChannel.onAddContextListener`](ref/PrivateChannel.onAddContextListener) -* [`PrivateChannel.onUnsubscribe`](ref/PrivateChannel.onUnsubscribe) -* [`PrivateChannel.onDisconnect`](ref/PrivateChannel.onDisconnect) +- [`broadcast`](ref/broadcast) +- [`findInstances`](ref/findInstances) +- [`findIntent`](ref/findIntent) +- [`findIntentsByContext`](ref/findIntentsByContext) +- [`getAppMetadata`](ref/getAppMetadata) +- [`open`](ref/open) +- [`raiseIntent`](ref/raiseIntent) +- [`PrivateChannel.broadcast`](ref/PrivateChannel.broadcast) +- [`PrivateChannel.eventListenerAdded`](ref/PrivateChannel.eventListenerAdded) +- [`PrivateChannel.eventListenerRemoved`](ref/PrivateChannel.eventListenerRemoved) +- [`PrivateChannel.onAddContextListener`](ref/PrivateChannel.onAddContextListener) +- [`PrivateChannel.onUnsubscribe`](ref/PrivateChannel.onUnsubscribe) +- [`PrivateChannel.onDisconnect`](ref/PrivateChannel.onDisconnect) #### PrivateChannels @@ -819,22 +819,22 @@ To facilitate the addressing of messages to the relevant Desktop Agent and `AppI Some FDC3 API calls can be handled locally and do not need to generate request messages to the Desktop Agent Bridge, but are likely to be involved in other exchanges that do generate messages to the bridge (for example adding context or intent handlers). Those calls include: -* `addContextListener` functions (excluding those for `PrivateChannel` instances) -* `listener.unsubscribe` (excluding those for `PrivateChannel` instances) -* `addIntentListener` -* `getOrCreateChannel` -* `createPrivateChannel` -* `getUserChannels` and `getSystemChannels` -* `joinUserChannel` and `joinChannel` -* `getCurrentChannel` -* `leaveCurrentChannel` -* `getInfo` +- `addContextListener` functions (excluding those for `PrivateChannel` instances) +- `listener.unsubscribe` (excluding those for `PrivateChannel` instances) +- `addIntentListener` +- `getOrCreateChannel` +- `createPrivateChannel` +- `getUserChannels` and `getSystemChannels` +- `joinUserChannel` and `joinChannel` +- `getCurrentChannel` +- `leaveCurrentChannel` +- `getInfo` However, `PrivateChannel` instances allow the registration of additional event handlers (for the addition or removal of context listeners) that may be used to manage streaming data sent over them by starting or stopping the stream in response to those events. Hence, the following calls DO generate request messages when used on a PrivateChannel instance: -* `addContextListener` -* `listener.unsubscribe` -* `disconnect` +- `addContextListener` +- `listener.unsubscribe` +- `disconnect` #### Message Schemas and generated sources diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json index 8149e52dc..0f6fda503 100644 --- a/schemas/bridging/bridgeRequest.schema.json +++ b/schemas/bridging/bridgeRequest.schema.json @@ -22,9 +22,9 @@ "RequestMeta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, "timestamp": { "type": "string", @@ -54,7 +54,7 @@ ] } }, - "required": ["requestGuid", "timestamp", "source"] + "required": ["requestUuid", "timestamp", "source"] } } } diff --git a/schemas/bridging/bridgeResponse.schema.json b/schemas/bridging/bridgeResponse.schema.json index 9a7a5381f..67dea4954 100644 --- a/schemas/bridging/bridgeResponse.schema.json +++ b/schemas/bridging/bridgeResponse.schema.json @@ -28,11 +28,11 @@ { "type": "object", "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, - "responseGuid": { + "responseUuid": { "type": "string", - "description": "Unique GUID for the response" + "description": "Unique UUID for the response" }, "sources": { "type": "array", @@ -70,7 +70,7 @@ "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." } }, - "required": ["requestGuid", "responseGuid", "timestamp"], + "required": ["requestUuid", "responseUuid", "timestamp"], "additionalProperties": false } ] diff --git a/schemas/bridging/broadcastRequest.schema.json b/schemas/bridging/broadcastRequest.schema.json index cc6655066..969d5cc9d 100644 --- a/schemas/bridging/broadcastRequest.schema.json +++ b/schemas/bridging/broadcastRequest.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/connectionStep3Handshake.schema.json b/schemas/bridging/connectionStep3Handshake.schema.json index 9774ebac5..50b49f193 100644 --- a/schemas/bridging/connectionStep3Handshake.schema.json +++ b/schemas/bridging/connectionStep3Handshake.schema.json @@ -38,9 +38,9 @@ "meta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, "timestamp": { "type": "string", @@ -49,7 +49,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid", "timestamp"] + "required": ["requestUuid", "timestamp"] } }, "required": ["type", "payload", "meta"], diff --git a/schemas/bridging/connectionStep4AuthenticationFailed.schema.json b/schemas/bridging/connectionStep4AuthenticationFailed.schema.json index 992028cd2..28e2c11cf 100644 --- a/schemas/bridging/connectionStep4AuthenticationFailed.schema.json +++ b/schemas/bridging/connectionStep4AuthenticationFailed.schema.json @@ -19,13 +19,13 @@ "meta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, - "responseGuid": { + "responseUuid": { "type": "string", - "description": "Unique GUID for the response" + "description": "Unique UUID for the response" }, "timestamp": { "type": "string", @@ -34,7 +34,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid", "responseGuid", "timestamp"] + "required": ["requestUuid", "responseUuid", "timestamp"] } }, "required": ["type", "meta"], diff --git a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json index 4db22aeee..7b710aa62 100644 --- a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json +++ b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -42,13 +42,13 @@ "meta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, - "responseGuid": { + "responseUuid": { "type": "string", - "description": "Unique GUID for the response" + "description": "Unique UUID for the response" }, "timestamp": { "type": "string", @@ -57,7 +57,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid", "responseGuid", "timestamp"] + "required": ["requestUuid", "responseUuid", "timestamp"] } }, "required": ["type", "payload", "meta"], diff --git a/schemas/bridging/findInstancesRequest.schema.json b/schemas/bridging/findInstancesRequest.schema.json index 120d31e4d..69a603068 100644 --- a/schemas/bridging/findInstancesRequest.schema.json +++ b/schemas/bridging/findInstancesRequest.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/desktopAgentIdentifier.schema.json" diff --git a/schemas/bridging/findIntentRequest.schema.json b/schemas/bridging/findIntentRequest.schema.json index 5ce5a1705..bc6c9b490 100644 --- a/schemas/bridging/findIntentRequest.schema.json +++ b/schemas/bridging/findIntentRequest.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/findIntentsByContextRequest.schema.json b/schemas/bridging/findIntentsByContextRequest.schema.json index 0a1952490..024669aa1 100644 --- a/schemas/bridging/findIntentsByContextRequest.schema.json +++ b/schemas/bridging/findIntentsByContextRequest.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/getAppMetadataRequest.schema.json b/schemas/bridging/getAppMetadataRequest.schema.json index 98d425777..aa4de12d8 100644 --- a/schemas/bridging/getAppMetadataRequest.schema.json +++ b/schemas/bridging/getAppMetadataRequest.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/desktopAgentIdentifier.schema.json" diff --git a/schemas/bridging/openRequest.schema.json b/schemas/bridging/openRequest.schema.json index 578c49c6a..939d03448 100644 --- a/schemas/bridging/openRequest.schema.json +++ b/schemas/bridging/openRequest.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/desktopAgentIdentifier.schema.json" diff --git a/schemas/bridging/privateChannelBroadcast.schema.json b/schemas/bridging/privateChannelBroadcast.schema.json index 1cd27730a..aa1d5ae43 100644 --- a/schemas/bridging/privateChannelBroadcast.schema.json +++ b/schemas/bridging/privateChannelBroadcast.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/privateChannelEventListenerAdded.schema.json b/schemas/bridging/privateChannelEventListenerAdded.schema.json index fd140c5fb..f66bf83c0 100644 --- a/schemas/bridging/privateChannelEventListenerAdded.schema.json +++ b/schemas/bridging/privateChannelEventListenerAdded.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/privateChannelEventListenerRemoved.schema.json b/schemas/bridging/privateChannelEventListenerRemoved.schema.json index b9b758a6d..294e4c51c 100644 --- a/schemas/bridging/privateChannelEventListenerRemoved.schema.json +++ b/schemas/bridging/privateChannelEventListenerRemoved.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/privateChannelOnAddContextListener.schema.json b/schemas/bridging/privateChannelOnAddContextListener.schema.json index 8532e51f3..fc8df57eb 100644 --- a/schemas/bridging/privateChannelOnAddContextListener.schema.json +++ b/schemas/bridging/privateChannelOnAddContextListener.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/privateChannelOnDisconnect.schema.json b/schemas/bridging/privateChannelOnDisconnect.schema.json index 0645df13a..0251f6677 100644 --- a/schemas/bridging/privateChannelOnDisconnect.schema.json +++ b/schemas/bridging/privateChannelOnDisconnect.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/privateChannelOnUnsubscribe.schema.json b/schemas/bridging/privateChannelOnUnsubscribe.schema.json index 99af91833..d47270e7d 100644 --- a/schemas/bridging/privateChannelOnUnsubscribe.schema.json +++ b/schemas/bridging/privateChannelOnUnsubscribe.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/schemas/bridging/raiseIntentRequest.schema.json b/schemas/bridging/raiseIntentRequest.schema.json index 2b6f99af2..b56019483 100644 --- a/schemas/bridging/raiseIntentRequest.schema.json +++ b/schemas/bridging/raiseIntentRequest.schema.json @@ -31,7 +31,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/appIdentifier.schema.json" @@ -41,7 +41,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid","timestamp","destination","source"] + "required": ["requestUuid","timestamp","destination","source"] } }, "additionalProperties": false diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 5aee6136e..49f22bf91 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -313,9 +313,9 @@ export interface MetaObject { */ destination?: DestinationElement; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -364,9 +364,9 @@ export interface BridgeResponse { export interface BridgeResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -384,9 +384,9 @@ export interface BridgeResponseMeta { */ errorSources?: DestinationElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -411,9 +411,9 @@ export interface BroadcastRequest { export interface BroadcastRequestMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -511,9 +511,9 @@ export interface ConnectionStep3Handshake { export interface ConnectionStep3HandshakeMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -558,13 +558,13 @@ export interface ConnectionStep4AuthenticationFailed { export interface ConnectionStep4AuthenticationFailedMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Timestamp at which request or response was generated */ @@ -583,13 +583,13 @@ export interface ConnectionStep6ConnectedAgentsUpdate { export interface ConnectionStep6ConnectedAgentsUpdateMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Timestamp at which request or response was generated */ @@ -655,9 +655,9 @@ export interface FindInstancesRequestMeta { */ destination?: DestinationClass; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -709,9 +709,9 @@ export interface FindInstancesResponse { export interface FindInstancesResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -729,9 +729,9 @@ export interface FindInstancesResponseMeta { */ errorSources?: DestinationElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -773,9 +773,9 @@ export interface FindIntentRequest { export interface FindIntentRequestMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -809,9 +809,9 @@ export interface FindIntentResponse { export interface FindIntentResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -829,9 +829,9 @@ export interface FindIntentResponseMeta { */ errorSources?: ErrorSourceElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -871,9 +871,9 @@ export interface FindIntentsByContextRequest { export interface FindIntentsByContextRequestMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -906,9 +906,9 @@ export interface FindIntentsByContextResponse { export interface FindIntentsByContextResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -926,9 +926,9 @@ export interface FindIntentsByContextResponseMeta { */ errorSources?: ErrorSourceElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -966,9 +966,9 @@ export interface GetAppMetadataRequestMeta { */ destination?: DestinationClass; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1001,9 +1001,9 @@ export interface GetAppMetadataResponse { export interface GetAppMetadataResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -1021,9 +1021,9 @@ export interface GetAppMetadataResponseMeta { */ errorSources?: ErrorSourceElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -1061,9 +1061,9 @@ export interface OpenRequestMeta { */ destination?: DestinationClass; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1097,9 +1097,9 @@ export interface OpenResponse { export interface OpenResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -1117,9 +1117,9 @@ export interface OpenResponseMeta { */ errorSources?: ErrorSourceElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -1157,9 +1157,9 @@ export interface PrivateChannelBroadcastMeta { */ destination?: PurpleIdentifier; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1199,9 +1199,9 @@ export interface PrivateChannelEventListenerAddedMeta { */ destination?: PurpleIdentifier; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1241,9 +1241,9 @@ export interface PrivateChannelEventListenerRemovedMeta { */ destination?: PurpleIdentifier; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1283,9 +1283,9 @@ export interface PrivateChannelOnAddContextListenerMeta { */ destination?: PurpleIdentifier; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1325,9 +1325,9 @@ export interface PrivateChannelOnDisconnectMeta { */ destination?: PurpleIdentifier; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1366,9 +1366,9 @@ export interface PrivateChannelOnUnsubscribeMeta { */ destination?: PurpleIdentifier; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1408,9 +1408,9 @@ export interface RaiseIntentRequestMeta { */ destination: PurpleIdentifier; /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Field that represents the source application that the request was received from. */ @@ -1445,9 +1445,9 @@ export interface RaiseIntentResponse { export interface RaiseIntentResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -1465,9 +1465,9 @@ export interface RaiseIntentResponseMeta { */ errorSources?: DestinationElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -1508,9 +1508,9 @@ export interface RaiseIntentResultResponse { export interface RaiseIntentResultResponseMeta { /** - * Unique GUID for the request + * Unique UUID for the request */ - requestGuid: string; + requestUuid: string; /** * Timestamp at which request or response was generated */ @@ -1528,9 +1528,9 @@ export interface RaiseIntentResultResponseMeta { */ errorSources?: DestinationElement[]; /** - * Unique GUID for the response + * Unique UUID for the response */ - responseGuid: string; + responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and @@ -2259,7 +2259,7 @@ const typeMap: any = { MetaObject: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationElement')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('DestinationElement') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2283,11 +2283,11 @@ const typeMap: any = { ), BridgeResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('DestinationElement'))) }, ], false @@ -2302,7 +2302,7 @@ const typeMap: any = { ), BroadcastRequestMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2367,7 +2367,7 @@ const typeMap: any = { ), ConnectionStep3HandshakeMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -2400,8 +2400,8 @@ const typeMap: any = { ), ConnectionStep4AuthenticationFailedMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -2417,8 +2417,8 @@ const typeMap: any = { ), ConnectionStep6ConnectedAgentsUpdateMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -2452,7 +2452,7 @@ const typeMap: any = { FindInstancesRequestMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2470,11 +2470,11 @@ const typeMap: any = { ), FindInstancesResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false @@ -2494,7 +2494,7 @@ const typeMap: any = { ), FindIntentRequestMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2517,11 +2517,11 @@ const typeMap: any = { ), FindIntentResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false @@ -2544,7 +2544,7 @@ const typeMap: any = { ), FindIntentsByContextRequestMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2561,11 +2561,11 @@ const typeMap: any = { ), FindIntentsByContextResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false @@ -2585,7 +2585,7 @@ const typeMap: any = { GetAppMetadataRequestMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2602,11 +2602,11 @@ const typeMap: any = { ), GetAppMetadataResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false @@ -2623,7 +2623,7 @@ const typeMap: any = { OpenRequestMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2646,11 +2646,11 @@ const typeMap: any = { ), OpenResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false @@ -2667,7 +2667,7 @@ const typeMap: any = { PrivateChannelBroadcastMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2691,7 +2691,7 @@ const typeMap: any = { PrivateChannelEventListenerAddedMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2715,7 +2715,7 @@ const typeMap: any = { PrivateChannelEventListenerRemovedMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2739,7 +2739,7 @@ const typeMap: any = { PrivateChannelOnAddContextListenerMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2763,7 +2763,7 @@ const typeMap: any = { PrivateChannelOnDisconnectMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2781,7 +2781,7 @@ const typeMap: any = { PrivateChannelOnUnsubscribeMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2805,7 +2805,7 @@ const typeMap: any = { RaiseIntentRequestMeta: o( [ { json: 'destination', js: 'destination', typ: r('PurpleIdentifier') }, - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], @@ -2829,11 +2829,11 @@ const typeMap: any = { ), RaiseIntentResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false @@ -2860,11 +2860,11 @@ const typeMap: any = { ), RaiseIntentResultResponseMeta: o( [ - { json: 'requestGuid', js: 'requestGuid', typ: '' }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, - { json: 'responseGuid', js: 'responseGuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceElement'))) }, ], false diff --git a/website/static/schemas/next/bridging/bridgeRequest.schema.json b/website/static/schemas/next/bridging/bridgeRequest.schema.json index 8149e52dc..0f6fda503 100644 --- a/website/static/schemas/next/bridging/bridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/bridgeRequest.schema.json @@ -22,9 +22,9 @@ "RequestMeta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, "timestamp": { "type": "string", @@ -54,7 +54,7 @@ ] } }, - "required": ["requestGuid", "timestamp", "source"] + "required": ["requestUuid", "timestamp", "source"] } } } diff --git a/website/static/schemas/next/bridging/bridgeResponse.schema.json b/website/static/schemas/next/bridging/bridgeResponse.schema.json index 9a7a5381f..67dea4954 100644 --- a/website/static/schemas/next/bridging/bridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/bridgeResponse.schema.json @@ -28,11 +28,11 @@ { "type": "object", "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, - "responseGuid": { + "responseUuid": { "type": "string", - "description": "Unique GUID for the response" + "description": "Unique UUID for the response" }, "sources": { "type": "array", @@ -70,7 +70,7 @@ "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." } }, - "required": ["requestGuid", "responseGuid", "timestamp"], + "required": ["requestUuid", "responseUuid", "timestamp"], "additionalProperties": false } ] diff --git a/website/static/schemas/next/bridging/broadcastRequest.schema.json b/website/static/schemas/next/bridging/broadcastRequest.schema.json index cc6655066..969d5cc9d 100644 --- a/website/static/schemas/next/bridging/broadcastRequest.schema.json +++ b/website/static/schemas/next/bridging/broadcastRequest.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json index 9774ebac5..50b49f193 100644 --- a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json +++ b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json @@ -38,9 +38,9 @@ "meta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, "timestamp": { "type": "string", @@ -49,7 +49,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid", "timestamp"] + "required": ["requestUuid", "timestamp"] } }, "required": ["type", "payload", "meta"], diff --git a/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json b/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json index 992028cd2..28e2c11cf 100644 --- a/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json +++ b/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json @@ -19,13 +19,13 @@ "meta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, - "responseGuid": { + "responseUuid": { "type": "string", - "description": "Unique GUID for the response" + "description": "Unique UUID for the response" }, "timestamp": { "type": "string", @@ -34,7 +34,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid", "responseGuid", "timestamp"] + "required": ["requestUuid", "responseUuid", "timestamp"] } }, "required": ["type", "meta"], diff --git a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json index 4db22aeee..7b710aa62 100644 --- a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json +++ b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -42,13 +42,13 @@ "meta": { "type": "object", "properties": { - "requestGuid": { + "requestUuid": { "type": "string", - "description": "Unique GUID for the request" + "description": "Unique UUID for the request" }, - "responseGuid": { + "responseUuid": { "type": "string", - "description": "Unique GUID for the response" + "description": "Unique UUID for the response" }, "timestamp": { "type": "string", @@ -57,7 +57,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid", "responseGuid", "timestamp"] + "required": ["requestUuid", "responseUuid", "timestamp"] } }, "required": ["type", "payload", "meta"], diff --git a/website/static/schemas/next/bridging/findInstancesRequest.schema.json b/website/static/schemas/next/bridging/findInstancesRequest.schema.json index 120d31e4d..69a603068 100644 --- a/website/static/schemas/next/bridging/findInstancesRequest.schema.json +++ b/website/static/schemas/next/bridging/findInstancesRequest.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/desktopAgentIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/findIntentRequest.schema.json b/website/static/schemas/next/bridging/findIntentRequest.schema.json index 5ce5a1705..bc6c9b490 100644 --- a/website/static/schemas/next/bridging/findIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentRequest.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json index 0a1952490..024669aa1 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json index 98d425777..aa4de12d8 100644 --- a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/desktopAgentIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/openRequest.schema.json b/website/static/schemas/next/bridging/openRequest.schema.json index 578c49c6a..939d03448 100644 --- a/website/static/schemas/next/bridging/openRequest.schema.json +++ b/website/static/schemas/next/bridging/openRequest.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/desktopAgentIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json index 1cd27730a..aa1d5ae43 100644 --- a/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json +++ b/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json index fd140c5fb..f66bf83c0 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json index b9b758a6d..294e4c51c 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json index 8532e51f3..fc8df57eb 100644 --- a/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json index 0645df13a..0251f6677 100644 --- a/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json @@ -25,7 +25,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json index 99af91833..d47270e7d 100644 --- a/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json @@ -28,7 +28,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "source": { "$ref": "../api/appIdentifier.schema.json" diff --git a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json index 2b6f99af2..b56019483 100644 --- a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentRequest.schema.json @@ -31,7 +31,7 @@ }, "meta": { "properties": { - "requestGuid": true, + "requestUuid": true, "timestamp": true, "destination": { "$ref": "../api/appIdentifier.schema.json" @@ -41,7 +41,7 @@ } }, "additionalProperties": false, - "required": ["requestGuid","timestamp","destination","source"] + "required": ["requestUuid","timestamp","destination","source"] } }, "additionalProperties": false From 66fda584780a3959948e12b2be4f855e89dcaa18 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 14 Jun 2023 10:48:03 +0100 Subject: [PATCH 064/106] 544 refactor schemas to separate agent and bridge messages (#69) * Providing separate JSON schemas for messages to the bridge and messages from the bridge, as there are minor differences. Doing so allows the messages to be validated separately. Co-authored-by: Tiago Pina --- .../ref/PrivateChannel.broadcast.md | 5 +- .../ref/PrivateChannel.eventListenerAdded.md | 5 +- .../PrivateChannel.eventListenerRemoved.md | 5 +- .../PrivateChannel.onAddContextListener.md | 5 +- .../ref/PrivateChannel.onDisconnect.md | 5 +- .../ref/PrivateChannel.onUnsubscribe.md | 5 +- docs/agent-bridging/ref/broadcast.md | 5 +- docs/agent-bridging/ref/findInstances.md | 10 +- docs/agent-bridging/ref/findIntent.md | 10 +- .../ref/findIntentsByContext.md | 10 +- docs/agent-bridging/ref/getAppMetadata.md | 10 +- docs/agent-bridging/ref/open.md | 10 +- docs/agent-bridging/ref/raiseIntent.md | 13 +- docs/agent-bridging/spec.md | 138 +- quicktypeUtil.js | 2 +- schemas/api/appIdentifier.schema.json | 2 +- .../api/desktopAgentIdentifier.schema.json | 2 +- schemas/bridging/agentRequest.schema.json | 61 + schemas/bridging/agentResponse.schema.json | 60 + .../bridgeParticipantIdentifier.schema.json | 23 + schemas/bridging/bridgeRequest.schema.json | 38 +- schemas/bridging/bridgeResponse.schema.json | 103 +- ...json => broadcastAgentRequest.schema.json} | 19 +- .../broadcastBridgeRequest.schema.json | 14 + ... => findInstancesAgentRequest.schema.json} | 21 +- ...=> findInstancesAgentResponse.schema.json} | 36 +- .../findInstancesBridgeRequest.schema.json | 14 + ...> findInstancesBridgeResponse.schema.json} | 23 +- ...son => findIntentAgentRequest.schema.json} | 19 +- .../findIntentAgentResponse.schema.json | 38 + .../findIntentBridgeRequest.schema.json | 14 + ...n => findIntentBridgeResponse.schema.json} | 24 +- ...dIntentsByContextAgentRequest.schema.json} | 19 +- ...dIntentsByContextAgentResponse.schema.json | 42 + ...dIntentsByContextBridgeRequest.schema.json | 14 + ...ntentsByContextBridgeResponse.schema.json} | 29 +- ...=> getAppMetadataAgentRequest.schema.json} | 18 +- .../getAppMetadataAgentResponse.schema.json | 37 + .../getAppMetadataBridgeRequest.schema.json | 14 + ... getAppMetadataBridgeResponse.schema.json} | 22 +- ...uest.schema.json => openAgentRequest.json} | 14 +- .../bridging/openAgentResponse.schema.json | 37 + schemas/bridging/openBridgeRequest.json | 14 + .../bridging/openBridgeResponse.schema.json | 38 + ...eChannelBroadcastAgentRequest.schema.json} | 22 +- ...eChannelBroadcastBridgeRequest.schema.json | 14 + ...ventListenerAddedAgentRequest.schema.json} | 22 +- ...ventListenerAddedBridgeRequest.schema.json | 14 + ...ntListenerRemovedAgentRequest.schema.json} | 22 +- ...ntListenerRemovedBridgeRequest.schema.json | 14 + ...ddContextListenerAgentRequest.schema.json} | 22 +- ...ddContextListenerBridgeRequest.schema.json | 14 + ...annelOnDisconnectAgentRequest.schema.json} | 22 +- ...annelOnDisconnectBridgeRequest.schema.json | 14 + ...nnelOnUnsubscribeAgentRequest.schema.json} | 19 +- ...nnelOnUnsubscribeBridgeRequest.schema.json | 14 + ...on => raiseIntentAgentRequest.schema.json} | 16 +- .../raiseIntentAgentResponse.schema.json | 37 + .../raiseIntentBridgeRequest.schema.json | 14 + ... => raiseIntentBridgeResponse.schema.json} | 22 +- ...aiseIntentResultAgentResponse.schema.json} | 29 +- ...aiseIntentResultBridgeResponse.schema.json | 32 + src/bridging/BridgingTypes.ts | 3770 ++++++++++++----- 63 files changed, 3855 insertions(+), 1325 deletions(-) create mode 100644 schemas/bridging/agentRequest.schema.json create mode 100644 schemas/bridging/agentResponse.schema.json create mode 100644 schemas/bridging/bridgeParticipantIdentifier.schema.json rename schemas/bridging/{broadcastRequest.schema.json => broadcastAgentRequest.schema.json} (68%) create mode 100644 schemas/bridging/broadcastBridgeRequest.schema.json rename schemas/bridging/{findInstancesRequest.schema.json => findInstancesAgentRequest.schema.json} (64%) rename schemas/bridging/{findInstancesResponse.schema.json => findInstancesAgentResponse.schema.json} (52%) create mode 100644 schemas/bridging/findInstancesBridgeRequest.schema.json rename schemas/bridging/{openResponse.schema.json => findInstancesBridgeResponse.schema.json} (59%) rename schemas/bridging/{findIntentRequest.schema.json => findIntentAgentRequest.schema.json} (64%) create mode 100644 schemas/bridging/findIntentAgentResponse.schema.json create mode 100644 schemas/bridging/findIntentBridgeRequest.schema.json rename schemas/bridging/{findIntentResponse.schema.json => findIntentBridgeResponse.schema.json} (64%) rename schemas/bridging/{findIntentsByContextRequest.schema.json => findIntentsByContextAgentRequest.schema.json} (60%) create mode 100644 schemas/bridging/findIntentsByContextAgentResponse.schema.json create mode 100644 schemas/bridging/findIntentsByContextBridgeRequest.schema.json rename schemas/bridging/{findIntentsByContextResponse.schema.json => findIntentsByContextBridgeResponse.schema.json} (56%) rename schemas/bridging/{getAppMetadataRequest.schema.json => getAppMetadataAgentRequest.schema.json} (69%) create mode 100644 schemas/bridging/getAppMetadataAgentResponse.schema.json create mode 100644 schemas/bridging/getAppMetadataBridgeRequest.schema.json rename schemas/bridging/{getAppMetadataResponse.schema.json => getAppMetadataBridgeResponse.schema.json} (64%) rename schemas/bridging/{openRequest.schema.json => openAgentRequest.json} (76%) create mode 100644 schemas/bridging/openAgentResponse.schema.json create mode 100644 schemas/bridging/openBridgeRequest.json create mode 100644 schemas/bridging/openBridgeResponse.schema.json rename schemas/bridging/{privateChannelBroadcast.schema.json => privateChannelBroadcastAgentRequest.schema.json} (62%) create mode 100644 schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json rename schemas/bridging/{privateChannelEventListenerAdded.schema.json => privateChannelEventListenerAddedAgentRequest.schema.json} (59%) create mode 100644 schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json rename schemas/bridging/{privateChannelEventListenerRemoved.schema.json => privateChannelEventListenerRemovedAgentRequest.schema.json} (58%) create mode 100644 schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json rename schemas/bridging/{privateChannelOnAddContextListener.schema.json => privateChannelOnAddContextListenerAgentRequest.schema.json} (58%) create mode 100644 schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json rename schemas/bridging/{privateChannelOnDisconnect.schema.json => privateChannelOnDisconnectAgentRequest.schema.json} (58%) create mode 100644 schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json rename schemas/bridging/{privateChannelOnUnsubscribe.schema.json => privateChannelOnUnsubscribeAgentRequest.schema.json} (62%) create mode 100644 schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json rename schemas/bridging/{raiseIntentRequest.schema.json => raiseIntentAgentRequest.schema.json} (79%) create mode 100644 schemas/bridging/raiseIntentAgentResponse.schema.json create mode 100644 schemas/bridging/raiseIntentBridgeRequest.schema.json rename schemas/bridging/{raiseIntentResponse.schema.json => raiseIntentBridgeResponse.schema.json} (64%) rename schemas/bridging/{raiseIntentResultResponse.schema.json => raiseIntentResultAgentResponse.schema.json} (74%) create mode 100644 schemas/bridging/raiseIntentResultBridgeResponse.schema.json diff --git a/docs/agent-bridging/ref/PrivateChannel.broadcast.md b/docs/agent-bridging/ref/PrivateChannel.broadcast.md index 311a9246e..3533c40f0 100644 --- a/docs/agent-bridging/ref/PrivateChannel.broadcast.md +++ b/docs/agent-bridging/ref/PrivateChannel.broadcast.md @@ -30,9 +30,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcast.schema.json](/schemas/next/bridging/privateChannelBroadcast.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json](/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json](/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json) ### Example diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md index 738959941..afca79c01 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md @@ -34,9 +34,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAdded.schema.json](/schemas/next/bridging/privateChannelEventListenerAdded.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json](/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json](/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json) ### Example diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md index 1c9396791..402e21a86 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -37,9 +37,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json](/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequestschema.json](/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequestschema.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json](/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json) ### Example diff --git a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md index 472cc1091..2c55b7890 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md +++ b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md @@ -32,9 +32,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListener.schema.json](/schemas/next/bridging/privateChannelOnAddContextListener.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json](/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json](/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json) ### Example diff --git a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md index a918d5760..ccd73ce69 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md +++ b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md @@ -30,11 +30,12 @@ sequenceDiagram DAB ->>+ DB: PrivateChannel.onDisconnect ``` -## Request format +### Request message schemas ### Schema -[https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnect.schema.json](/schemas/next/bridging/privateChannelOnDisconnect.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json](/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json](/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json) ### Example diff --git a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md index 778547d1e..6fd902543 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -33,11 +33,12 @@ sequenceDiagram DAB ->>+ DB: PrivateChannel.onUnsubscribe ``` -## Request format +### Request message schemas ### Schema -[https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json](/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json](/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json](/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json) ### Example diff --git a/docs/agent-bridging/ref/broadcast.md b/docs/agent-bridging/ref/broadcast.md index 6e16f6a8e..be7e216f0 100644 --- a/docs/agent-bridging/ref/broadcast.md +++ b/docs/agent-bridging/ref/broadcast.md @@ -44,9 +44,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json](/schemas/next/bridging/broadcastRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/broadcastAgentRequest.schema.json](/schemas/next/bridging/broadcastAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/broadcastBridgeRequest.schema.json](/schemas/next/bridging/broadcastBridgeRequest.schema.json) ### Example diff --git a/docs/agent-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md index c6f8d4d23..d229bab17 100644 --- a/docs/agent-bridging/ref/findInstances.md +++ b/docs/agent-bridging/ref/findInstances.md @@ -38,9 +38,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json](/schemas/next/bridging/findInstancesRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentRequest.schema.json](/schemas/next/bridging/findInstancesAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeRequest.schema.json](/schemas/next/bridging/findInstancesBridgeRequest.schema.json) ### Example @@ -117,9 +118,10 @@ The Desktop Agent Bridge should only forward the request to the requested Deskto ## Response format -### Schema +### Response message schemas -[https://fdc3.finos.org/schemas/next/bridging/findInstancesResponse.schema.json](/schemas/next/bridging/findInstancesResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json](/schemas/next/bridging/findInstancesAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json](/schemas/next/bridging/findInstancesBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/findIntent.md b/docs/agent-bridging/ref/findIntent.md index 83fca8a87..448360713 100644 --- a/docs/agent-bridging/ref/findIntent.md +++ b/docs/agent-bridging/ref/findIntent.md @@ -34,9 +34,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json](/schemas/next/bridging/findIntentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json](/schemas/next/bridging/findIntentAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeRequest.schema.json](/schemas/next/bridging/findIntentBridgeRequest.schema.json) ### Example @@ -88,9 +89,10 @@ Note that the `source.desktopAgent` field has been populated with the id of the ## Response format -### Schema +### Response message schemas -[https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json](/schemas/next/bridging/findIntentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json](/schemas/next/bridging/findIntentAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json](/schemas/next/bridging/findIntentBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/findIntentsByContext.md b/docs/agent-bridging/ref/findIntentsByContext.md index 7a74fa64d..0cb327b1d 100644 --- a/docs/agent-bridging/ref/findIntentsByContext.md +++ b/docs/agent-bridging/ref/findIntentsByContext.md @@ -38,9 +38,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextRequest.schema.json](/schemas/next/bridging/findIntentsByContextRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json](/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json](/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json) ### Example @@ -88,9 +89,10 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the ## Response format -### Schema +### Response message schemas -[https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextResponse.schema.json](/schemas/next/bridging/findIntentsByContextResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json](/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json](/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index 9a050cf4a..b65f7bfcc 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -37,9 +37,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json](/schemas/next/bridging/getAppMetadataRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentRequest.schema.json](/schemas/next/bridging/getAppMetadataAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json](/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json) ### Example @@ -90,9 +91,10 @@ which is repeated on to the target agent as: ## Response format -### Schema +### Response message schemas -[https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json](/schemas/next/bridging/getAppMetadataResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json](/schemas/next/bridging/getAppMetadataAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json](/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/open.md b/docs/agent-bridging/ref/open.md index c4511a334..024a42d7b 100644 --- a/docs/agent-bridging/ref/open.md +++ b/docs/agent-bridging/ref/open.md @@ -52,9 +52,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/openRequest.schema.json](/schemas/next/bridging/openRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/openAgentRequest.schema.json](/schemas/next/bridging/openAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/openBridgeRequest.schema.json](/schemas/next/bridging/openBridgeRequest.schema.json) ### Example @@ -109,9 +110,10 @@ which is repeated on to the target agent as: ## Response format -### Schema +### Response message schemas -[https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json](/schemas/next/bridging/openResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json](/schemas/next/bridging/openAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json](/schemas/next/bridging/openBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index d053ee125..1124724f9 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -65,9 +65,10 @@ sequenceDiagram ## Request format -### Schema +### Request message schemas -[https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json](/schemas/next/bridging/raiseIntentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentRequest.schema.json](/schemas/next/bridging/raiseIntentAgentRequest.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeRequest.schema.json](/schemas/next/bridging/raiseIntentBridgeRequest.schema.json) ### Example @@ -134,10 +135,12 @@ The bridge fills in the `source.desktopAgent` field and forwards the request to ## Response format -### Schemas +### Response message schemas -[https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json](/schemas/next/bridging/raiseIntentResponse.schema.json) -[https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json](/schemas/next/bridging/raiseIntentResultResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentResponse.schema.json](/schemas/next/bridging/raiseIntentAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json](/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json](/schemas/next/bridging/raiseIntentBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json](/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 57ce5d094..4850e6805 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -437,7 +437,7 @@ The Desktop Agent Bridge is the responsible entity for collating responses toget The Desktop Agent Bridge MUST allow for timeout configuration. -The Bridge SHOULD also implement timeout for waiting on DA responses. Assuming the message exchange will be all intra-machine, a recommended timeout of 1500ms SHOULD be used. Similarly, Desktop Agents SHOULD apply a timeout to requests made to the bridge that require a response (collated or otherwise), to handle situations where the bridge is not responding as expected. A recommended timeout of 3000ms SHOULD be used in this case. +The Bridge SHOULD also implement timeout for waiting on DA responses. Assuming the message exchange will be all intra-machine, a recommended maximum timeout of 1500ms SHOULD be used. Similarly, Desktop Agents SHOULD apply a timeout to requests made to the bridge that require a response (collated or otherwise), to handle situations where the bridge is not responding as expected. A recommended maximum timeout of 3000ms SHOULD be used in this case. ### Message Format @@ -454,21 +454,24 @@ All messages sent or received by the Desktop Agent Bridge will be encoded in JSO } ``` -Messages can be divided into two categories: +Messages can be divided into four categories: -- Requests: Messages that initiate a particular interaction -- Responses: Messages that respond to a prior request +- Requests from a Desktop Agent: Messages that initiate a particular interaction. +- Requests forwarded by the Bridge: Messages augmented and forwarded on by the Bridge. +- Responses from a Desktop Agent: Messages from a single Desktop Agent that respond to a prior request from the Bridge. +- Responses collated and forwarded by the Bridge: Messages from the Bridge back to the Desktop Agent that initiated an interaction, which may combine the responses from multiple other Desktop Agents. Details specific to each are provided in the following sections. #### Request Messages -Request messages use the following format: +Request messages from a Desktop Agent use the following format: ```typescript { - /** Typically set to the FDC3 function name that the message relates to, e.g. - * "findIntent" */ + /** Identifies the type of the message and it is typically set to the FDC3 + * function name that the message relates to, e.g. 'findIntent', with + * 'Request' appended. */ type: string, /** Request body, typically containing the arguments to the function called.*/ payload: { @@ -493,33 +496,40 @@ Request messages use the following format: requestUuid: string, /** Timestamp at which request was generated */ timestamp: date, - /** AppIdentifier OR DesktopAgentIdentifier for the source application - * that the request was received from and will be augmented with the - * assigned name of the Desktop Agent by the Desktop Agent Bridge, - * rather than the sender. */ + /** Field that represents the source application that the request was + * received from, or the source Desktop Agent if it issued the request + * itself. */ source: AppIdentifier | DesktopAgentIdentifier, - /** Optional AppIdentifier or DesktopAgentIdentifier for the destination - * that the request should be routed to, which MUST be set by the Desktop - * Agent for API calls that include a target (`app`) parameter. MUST - * include the name of the Desktop Agent hosting the target application. */ + /** Optional field that represents the destination that the request + * should be routed to. Must be set by the Desktop Agent for API calls + * that include a target app parameter and must include the name of the + * Desktop Agent hosting the target application. */ destination?: AppIdentifier | DesktopAgentIdentifier } } ``` -**Schema**: [https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json](/schemas/next/bridging/bridgeRequest.schema.json) +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentRequest.schema.json](/schemas/next/bridging/agentRequest.schema.json) If the FDC3 API call underlying the request message includes a target (typically defined by an `app` argument, in the form of an AppIdentifier object) it is the responsibility of the Desktop Agent to copy that argument into the `meta.destination` field of the message and to ensure that it includes a `meta.destination.desktopAgent` value. If the target is provided in the FDC3 API call, but without a `meta.destination.desktopAgent` value, the Desktop Agent should assume that the call relates to a local application and does not need to send it to the bridge. Requests without a `meta.destination` field will be forwarded to all other agents by the bridge, which will also handle the collation of responses which quote the `meta.requestUuid`. +##### Request Messages Forwarded by the Bridge + +Request messages forwarded by the Bridge onto other Desktop Agents use the same format as incoming requests from Desktop Agents, with the exception that the `desktopAgent` properties of the `meta.source` field MUST be provided, and should be overwritten by the Bridge (based on the connection that the message was received from) to prevent spoofing of request message origins. + +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json](/schemas/next/bridging/bridgeRequest.schema.json) + #### Response Messages -Response messages will be differentiated from requests by the presence of a `meta.responseUuid` field and MUST quote the `meta.requestUuid` that they are responding to. +Response messages from a Desktop Agent back to the Bridge use a similar format that is differentiated from requests by the presence of a `meta.responseUuid` field. They MUST also quote the `meta.requestUuid` that they are responding to. ```typescript { - /** FDC3 function name the original request related to, e.g. "findIntent"*/ + /** Identifies the type of the message and it is typically set to the + * FDC3 function name that the message relates to, e.g. 'findIntent', + * with 'Response' appended.*/ type: string, /** Response body, containing the actual response data. */ payload: { @@ -552,21 +562,83 @@ Response messages will be differentiated from requests by the presence of a `met } }, meta: { - /** requestUuid from the original request being responded to*/ + /** UUID for the request this message is responding to.*/ requestUuid: string, - /** Unique UUID for this response */ + /** UUID for this specific response message. */ responseUuid: string, /** Timestamp at which request was generated */ timestamp: Date, + /** AppIdentifiers or DesktopAgentIdentifiers for the source + * that generated the response to the request. */ + source?: (AppIdentifier | DesktopAgentIdentifier), + } +} +``` + +**Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentResponse.schema.json](/schemas/next/bridging/agentResponse.schema.json) + +Response messages do not include a `meta.destination` as the routing of responses is handled by the Bridge via the `meta.requestUuid` field. + +##### Response Messages Collated and Forwarded by the Bridge + +Responses from individual Desktop Agents are collated by the Bridge and are forwarded on to the the Desktop Agent that initiated the interaction. The format used is very similar to that used for responses by the Desktop Agents, with the exception of the source information in the `meta` field. Specifically, the `meta.source` field is replaced by two arrays, `meta.sources` and `meta.errorSources`, which provide details on the Desktop agents that responded normally or responded with errors. The detail of any errors returned (in the `payload.error` field of a Desktop Agent's response) is collected up into a `meta.errorDetails` field. Moving the error details from the `payload` to the `meta` field enables the return of a valid response to the originating Desktop Agent in cases where some agents produced valid responses, and others produced errors. + +Hence, response messages from the Bridge returned to agents use the following format: + +```typescript +{ + /** Identifies the type of the message and it is typically set to the + * FDC3 function name that the message relates to, e.g. 'findIntent', + * with 'Response' appended.*/ + type: string, + /** Response body, containing the actual response data. */ + payload: { + /** Standardized error strings from an appropriate FDC3 API Error + * enumeration. */ + error?: string, + /** Response to `open` */ + appIdentifier?: AppIdentifier, + /** Response to `findInstances` */ + appIdentifiers?: Array, + /** Response to `getAppMetadata` */ + appMetadata?: AppMetadata, + /** Response to `findIntent`*/ + appIntent?: AppIntent, + /** Response to `findIntentsByContext`*/ + appIntents?: AppIntent[], + /** Response to `raiseIntent` functions, returned on delivery of the + * intent and context to the target app. + * Note `getResult()` function should not / can not be included in JSON. */ + intentResolution?: IntentResolution, + /** Secondary response to `raiseIntent`, sent when the `IntentHandler` + * has returned. + * Note: + * - return an empty payload object if the `IntentHandler` returned void. + * - `Channel` functions (`broadcast`, `getCurrentContext`, + * `addContextListener` do not need to be included in JSON).*/ + intentResult?: { + context?: Context, + channel?: Channel + } + }, + meta: { + /** UUID for the request this message is responding to.*/ + requestUuid: string, + /** Unique UUID for this collated response (generated by the bridge). */ + responseUuid: string, + /** Timestamp at which the collated response was generated */ + timestamp: Date, /** Array of AppIdentifiers or DesktopAgentIdentifiers for the sources - * that generated responses to the request. Will contain a single value - * for individual responses and multiple values for responses that were - * collated by the bridge. May be omitted if all sources returned an - * error. */ + * that generated responses to the request. Will contain a single value + * for individual responses and multiple values for responses that were + * collated by the bridge. May be omitted if all sources errored. MUST + * include the `desktopAgent` field when returned by the bridge. */ sources?: (AppIdentifier | DesktopAgentIdentifier)[], - /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses that - * were not returned to the bridge before the timeout or because an error - * occurred. May be omitted if all sources responded. */ + /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses + * that were not returned to the bridge before the timeout or because + * an error occurred. May be omitted if all sources responded without + * errors. MUST include the `desktopAgent` field when returned by the + * bridge. */ errorSources?: (AppIdentifier | DesktopAgentIdentifier)[], /** Array of error message strings for responses that were not returned * to the bridge before the timeout or because an error occurred. @@ -579,8 +651,6 @@ Response messages will be differentiated from requests by the presence of a `met **Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json](/schemas/next/bridging/bridgeResponse.schema.json) -Response messages do not include a `meta.destination` as the routing of responses is handled by the bridge via the `meta.requestUuid` field. - ### Identifying Individual Messages There are a variety of message types need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Universally Unique Identifier (UUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. @@ -838,20 +908,20 @@ However, `PrivateChannel` instances allow the registration of additional event h #### Message Schemas and generated sources -JSONSchema definitions are provided for all Desktop Agent Bridging message exchanges (see links in each reference page), which may be used to validate the correct generation of messages to or from a bridge. +JSONSchema definitions are provided for all Desktop Agent Bridging message exchanges (see links in each reference page), which may be used to validate the correct generation of messages to or from a bridge (a separate schema is provided for the agent and bridge versions of each message). The JSONSchema definitions are also used to generate TypeScript interfaces for the messages to aid in implementation of a Desktop Agent Bridge or Client library. These may be imported from the FDC3 npm module: ```typescript import { BridgingTypes } from "@finos/fdc3"; -const aMessage: BridgingTypes.BroadcastRequest +const aMessage: BridgingTypes.BroadcastAgentRequest ``` or ```typescript -import { BroadcastRequest } from "@finos/fdc3/dist/bridging/BridgingTypes"; -const aMessage: BroadcastRequest +import { BroadcastAgentRequest } from "@finos/fdc3/dist/bridging/BridgingTypes"; +const aMessage: BroadcastAgentRequest ``` -Sources may also be generated from the JSONSchema source for other languages. +Sources may also be generated from the JSONSchema files for other languages. diff --git a/quicktypeUtil.js b/quicktypeUtil.js index e8c9e073a..4e7cdca06 100644 --- a/quicktypeUtil.js +++ b/quicktypeUtil.js @@ -38,7 +38,7 @@ while (dirIndex < inputs.length) { // Normalise path to local quicktype executable. const quicktypeExec = ['.', 'node_modules', '.bin', 'quicktype'].join(path.sep); -const command = `${quicktypeExec} -s schema -o ${outputFile} ${sources}`; +const command = `${quicktypeExec} --no-combine-classes -s schema -o ${outputFile} ${sources}`; console.log('command to run: ' + command); exec(command, function(error, stdout, stderr) { diff --git a/schemas/api/appIdentifier.schema.json b/schemas/api/appIdentifier.schema.json index 29ef4c7d0..6bd36fdb2 100644 --- a/schemas/api/appIdentifier.schema.json +++ b/schemas/api/appIdentifier.schema.json @@ -18,5 +18,5 @@ "required": [ "appId" ], - "unevaluatedProperties": false + "additionalProperties": false } \ No newline at end of file diff --git a/schemas/api/desktopAgentIdentifier.schema.json b/schemas/api/desktopAgentIdentifier.schema.json index c07c0d341..471a65d05 100644 --- a/schemas/api/desktopAgentIdentifier.schema.json +++ b/schemas/api/desktopAgentIdentifier.schema.json @@ -12,5 +12,5 @@ "required": [ "desktopAgent" ], - "additionalProperties": false + "unevaluatedProperties": false } \ No newline at end of file diff --git a/schemas/bridging/agentRequest.schema.json b/schemas/bridging/agentRequest.schema.json new file mode 100644 index 000000000..ca594f659 --- /dev/null +++ b/schemas/bridging/agentRequest.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/agentRequest.schema.json", + "title": "Agent Request Message", + "type": "object", + "description": "A request message from a Desktop Agent to the Bridge.", + "properties": { + "type": { + "title": "Message type", + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." + }, + "payload": { + "title": "Message payload", + "type": "object", + "description": "The message payload typically contains the arguments to FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/AgentRequestMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "AgentRequestMeta": { + "title": "Agent Request Metadata", + "description": "Metadata for a request message sent by Desktop Agents to the Bridge.", + "type": "object", + "properties": { + "requestUuid": { + "type": "string", + "description": "UUID for the request" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + }, + "source": { + "title": "Source identifier", + "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "destination": { + "title": "Destination identifier", + "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", + "$ref": "bridgeParticipantIdentifier.schema.json" + } + }, + "required": ["requestUuid", "timestamp"], + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/agentResponse.schema.json b/schemas/bridging/agentResponse.schema.json new file mode 100644 index 000000000..2d8950258 --- /dev/null +++ b/schemas/bridging/agentResponse.schema.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/agentResponse.schema.json", + "title": "Agent Response Message", + "type": "object", + "description": "A response message from a Desktop Agent to the Bridge.", + "properties": { + "type": { + "title": "Response Message Type", + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "title": "Response Message Payload", + "type": "object", + "description": "The message payload typically contains return values for FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/AgentResponseMeta" + } + }, + "additionalProperties": false, + "required": ["type", "payload", "meta"], + "$defs": { + "AgentResponseMeta": { + "title": "Agent Response Metadata", + "description": "Metadata for a response messages sent by a Desktop Agent to the Bridge", + "type": "object", + "properties": { + "requestUuid": { + "type": "string", + "description": "UUID for the request this message is responding to." + }, + "responseUuid": { + "type": "string", + "description": "UUID for this specific response message." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which the response was generated" + }, + "source": { + "title": "Response Source identifier", + "description": "Field that represents the source application instance that the response was produced by, or the Desktop Agent if it produced the response without an application.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + } + }, + "required": ["requestUuid", "responseUuid", "timestamp", "source"], + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/bridgeParticipantIdentifier.schema.json b/schemas/bridging/bridgeParticipantIdentifier.schema.json new file mode 100644 index 000000000..3c56f7606 --- /dev/null +++ b/schemas/bridging/bridgeParticipantIdentifier.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeParticipantIdentifier.schema.json", + "title": "Bridge Participant Identifier", + "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", + "type": "object", + "oneOf": [ + { + "type": "object", + "allOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] +} \ No newline at end of file diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json index 0f6fda503..cbc42eea9 100644 --- a/schemas/bridging/bridgeRequest.schema.json +++ b/schemas/bridging/bridgeRequest.schema.json @@ -1,30 +1,35 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json", - "title": "bridgeRequest", + "title": "Bridge Request Message", "type": "object", + "description": "A request message forwarded from the Bridge onto a Desktop Agent connected to it.", "properties": { "type": { + "title": "Message type", "type": "string", "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." }, "payload": { + "title": "Message payload", "type": "object", "description": "The message payload typically contains the arguments to FDC3 API functions." }, "meta": { - "$ref": "#/$defs/RequestMeta" + "$ref": "#/$defs/BridgeRequestMeta" } }, "required": ["type", "payload", "meta"], "additionalProperties": false, "$defs": { - "RequestMeta": { + "BridgeRequestMeta": { + "title": "Bridge Request Metadata", + "description": "Metadata required in a request message forwarded on by the Bridge", "type": "object", "properties": { "requestUuid": { "type": "string", - "description": "Unique UUID for the request" + "description": "UUID for the request" }, "timestamp": { "type": "string", @@ -32,29 +37,18 @@ "description": "Timestamp at which request or response was generated" }, "source": { - "description": "Field that represents the source application that the request was received from.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "title": "Source identifier", + "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", + "$ref": "bridgeParticipantIdentifier.schema.json" }, "destination": { + "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "$ref": "bridgeParticipantIdentifier.schema.json" } }, - "required": ["requestUuid", "timestamp", "source"] + "required": ["requestUuid", "timestamp", "source"], + "additionalProperties": false } } } diff --git a/schemas/bridging/bridgeResponse.schema.json b/schemas/bridging/bridgeResponse.schema.json index 67dea4954..31a0e2796 100644 --- a/schemas/bridging/bridgeResponse.schema.json +++ b/schemas/bridging/bridgeResponse.schema.json @@ -1,79 +1,76 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json", - "title": "bridgeResponse", + "title": "Bridge Response Message", "type": "object", + "description": "A response message from the Bridge back to the original Desktop Agent that raised the request.", "properties": { "type": { + "title": "Response Message Type", "type": "string", "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." }, "payload": { + "title": "Response Message Payload", "type": "object", "description": "The message payload typically contains return values for FDC3 API functions." }, "meta": { - "$ref": "#/$defs/ResponseMeta" + "$ref": "#/$defs/BridgeResponseMeta" } }, - "additionalProperties": false, "required": ["type", "payload", "meta"], + "additionalProperties": false, "$defs": { - "ResponseMeta": { + "BridgeResponseMeta": { + "title": "Bridge Response Metadata", + "description": "Metadata required in a response message collated and/or forwarded on by the Bridge", "type": "object", - "allOf": [ - { - "$ref": "bridgeRequest.schema.json#/$defs/RequestMeta" + "properties": { + "requestUuid": { + "type": "string", + "description": "UUID for the request this message is responding to" + }, + "responseUuid": { + "type": "string", + "description": "Unique UUID for this collated response (generated by the bridge)." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which the response was generated" }, - { - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "responseUuid": { - "type": "string", - "description": "Unique UUID for the response" - }, - "sources": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] - }, - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored." - }, - "errorSources": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] - }, - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors." - }, - "errorDetails": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + "sources": { + "type": "array", + "items": [ + { + "$ref": "bridgeParticipantIdentifier.schema.json" } + ], + "title": "Desktop Agents that responded", + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." + }, + "errorSources": { + "type": "array", + "items": [ + { + "$ref": "bridgeParticipantIdentifier.schema.json" + } + ], + "title": "Desktop Agents that errored", + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." + }, + "errorDetails": { + "title": "Detail of errors returned", + "type": "array", + "items": { + "type": "string" }, - "required": ["requestUuid", "responseUuid", "timestamp"], - "additionalProperties": false + "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." } - ] + }, + "required": ["requestUuid", "responseUuid", "timestamp"], + "additionalProperties": false } } } diff --git a/schemas/bridging/broadcastRequest.schema.json b/schemas/bridging/broadcastAgentRequest.schema.json similarity index 68% rename from schemas/bridging/broadcastRequest.schema.json rename to schemas/bridging/broadcastAgentRequest.schema.json index 969d5cc9d..119a2c7ba 100644 --- a/schemas/bridging/broadcastRequest.schema.json +++ b/schemas/bridging/broadcastAgentRequest.schema.json @@ -1,19 +1,26 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json", - "title": "broadcastRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastAgentRequest.schema.json", + "title": "broadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/BroadcastRequestBase" + } + ], + "$defs": { + "BroadcastRequestBase": { "type":"object", + "description": "A request to broadcast context on a channel.", "properties": { "type": { "const": "broadcastRequest" }, "payload": { + "title": "broadcast Request Payload", "type": "object", "properties": { "channel": { @@ -27,6 +34,8 @@ "required": ["channel", "context"] }, "meta": { + "type": "object", + "title": "broadcast request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,7 +46,7 @@ "additionalProperties": false } }, - "additionalProperties":false + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/broadcastBridgeRequest.schema.json b/schemas/bridging/broadcastBridgeRequest.schema.json new file mode 100644 index 000000000..33341fd16 --- /dev/null +++ b/schemas/bridging/broadcastBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastBridgeRequest.schema.json", + "title": "broadcast Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "broadcastAgentRequest.schema.json#/$defs/BroadcastRequestBase" + } + ] +} diff --git a/schemas/bridging/findInstancesRequest.schema.json b/schemas/bridging/findInstancesAgentRequest.schema.json similarity index 64% rename from schemas/bridging/findInstancesRequest.schema.json rename to schemas/bridging/findInstancesAgentRequest.schema.json index 69a603068..926ab7f09 100644 --- a/schemas/bridging/findInstancesRequest.schema.json +++ b/schemas/bridging/findInstancesAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json", - "title": "findInstancesRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentRequest.schema.json", + "title": "findInstances Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/FindInstancesRequestBase" + } + ], + "$defs": { + "FindInstancesRequestBase": { "type": "object", - "properties": { + "description": "A request for details of instances of a particular app", + "properties":{ "type": { "const": "findInstancesRequest" }, "payload": { "type": "object", + "title": "findInstances request payload", "properties": { "app": { "$ref": "../api/appIdentifier.schema.json" @@ -24,6 +31,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title": "findInstances request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,10 +43,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/findInstancesResponse.schema.json b/schemas/bridging/findInstancesAgentResponse.schema.json similarity index 52% rename from schemas/bridging/findInstancesResponse.schema.json rename to schemas/bridging/findInstancesAgentResponse.schema.json index 801c35645..bc2a778f8 100644 --- a/schemas/bridging/findInstancesResponse.schema.json +++ b/schemas/bridging/findInstancesAgentResponse.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesResponse.schema.json", - "title": "findInstancesResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json", + "title": "findInstances Agent Response", "type": "object", "allOf": [ { - "$ref": "bridgeResponse.schema.json" + "$ref": "agentResponse.schema.json" }, { + "$ref": "#/$defs/FindInstancesResponseBase" + } + ], + "$defs": { + "FindInstancesResponseBase": { "type": "object", + "description": "A response to a findInstances request.", "properties": { "type": { "const": "findInstancesResponse" }, "payload": { "type": "object", + "title": "findInstances Response Payload", "properties": { "appIdentifiers": { "type": "array", @@ -26,24 +33,9 @@ "required": ["appIdentifiers"], "additionalProperties": false }, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } - } + "meta": true + }, + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/findInstancesBridgeRequest.schema.json b/schemas/bridging/findInstancesBridgeRequest.schema.json new file mode 100644 index 000000000..59079fff6 --- /dev/null +++ b/schemas/bridging/findInstancesBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeRequest.schema.json", + "title": "findInstances Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "findInstancesAgentRequest.schema.json#/$defs/FindInstancesRequestBase" + } + ] +} diff --git a/schemas/bridging/openResponse.schema.json b/schemas/bridging/findInstancesBridgeResponse.schema.json similarity index 59% rename from schemas/bridging/openResponse.schema.json rename to schemas/bridging/findInstancesBridgeResponse.schema.json index 3c03f6710..034cc3c68 100644 --- a/schemas/bridging/openResponse.schema.json +++ b/schemas/bridging/findInstancesBridgeResponse.schema.json @@ -1,29 +1,22 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json", - "title": "openResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json", + "title": "findInstances Bridge Response", "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "findInstancesAgentResponse.schema.json#/$defs/FindInstancesResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "openResponse" - }, - "payload": { - "type": "object", - "properties": { - "appIdentifier": { - "$ref": "../api/appIdentifier.schema.json" - } - }, - "required": ["appIdentifier"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { + "title": "findInstances bridge response metadata", "type": "object", "properties": { "sources": { diff --git a/schemas/bridging/findIntentRequest.schema.json b/schemas/bridging/findIntentAgentRequest.schema.json similarity index 64% rename from schemas/bridging/findIntentRequest.schema.json rename to schemas/bridging/findIntentAgentRequest.schema.json index bc6c9b490..b91e0bb87 100644 --- a/schemas/bridging/findIntentRequest.schema.json +++ b/schemas/bridging/findIntentAgentRequest.schema.json @@ -1,19 +1,26 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json", - "title": "findIntentRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json", + "title": "findIntents Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/FindIntentRequestBase" + } + ], + "$defs": { + "FindIntentRequestBase": { "type": "object", + "description": "A request for details of apps available to resolve a particular intent and context pair.", "properties": { "type": { "const": "findIntentRequest" }, "payload": { + "title": "findIntent request payload", "type": "object", "properties": { "intent": { @@ -27,6 +34,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title" : "findIntent request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,10 +43,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/findIntentAgentResponse.schema.json b/schemas/bridging/findIntentAgentResponse.schema.json new file mode 100644 index 000000000..3a7a98508 --- /dev/null +++ b/schemas/bridging/findIntentAgentResponse.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json", + "title": "findIntent Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/FindIntentResponseBase" + } + ], + "$defs": { + "FindIntentResponseBase": { + "type": "object", + "description": "A response to a findIntent request.", + "properties": { + "type": { + "const": "findIntentResponse" + }, + "payload": { + "type": "object", + "title": "findIntent response payload", + "properties": { + "appIntent": { + "$ref": "../api/appIntent.schema.json" + } + }, + "required": ["appIntent"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/findIntentBridgeRequest.schema.json b/schemas/bridging/findIntentBridgeRequest.schema.json new file mode 100644 index 000000000..5c3a7b480 --- /dev/null +++ b/schemas/bridging/findIntentBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeRequest.schema.json", + "title": "findIntent Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "findIntentAgentRequest.schema.json#/$defs/FindIntentRequestBase" + } + ] +} diff --git a/schemas/bridging/findIntentResponse.schema.json b/schemas/bridging/findIntentBridgeResponse.schema.json similarity index 64% rename from schemas/bridging/findIntentResponse.schema.json rename to schemas/bridging/findIntentBridgeResponse.schema.json index adbd0a719..b608bbb73 100644 --- a/schemas/bridging/findIntentResponse.schema.json +++ b/schemas/bridging/findIntentBridgeResponse.schema.json @@ -1,29 +1,23 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json", - "title": "findIntentResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json", + "title": "findIntent Bridge Response", + "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "findIntentAgentResponse.schema.json#/$defs/FindIntentResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "findIntentResponse" - }, - "payload": { - "type": "object", - "properties": { - "appIntent": { - "$ref": "../api/appIntent.schema.json" - } - }, - "required": ["appIntent"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { "type": "object", + "title": "findIntent bridge response metadata", "properties": { "sources": { "type": "array", diff --git a/schemas/bridging/findIntentsByContextRequest.schema.json b/schemas/bridging/findIntentsByContextAgentRequest.schema.json similarity index 60% rename from schemas/bridging/findIntentsByContextRequest.schema.json rename to schemas/bridging/findIntentsByContextAgentRequest.schema.json index 024669aa1..9df449fcc 100644 --- a/schemas/bridging/findIntentsByContextRequest.schema.json +++ b/schemas/bridging/findIntentsByContextAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextRequest.schema.json", - "title": "findIntentsByContextRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json", + "title": "findIntentsByContext Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/FindIntentsByContextRequestBase" + } + ], + "$defs": { + "FindIntentsByContextRequestBase": { "type": "object", + "description": "A request for details of intents and apps available to resolve them for a particular context.", "properties": { "type": { "const": "findIntentsByContextRequest" }, "payload": { "type": "object", + "title": "findIntentsByContext request payload", "properties": { "context": { "$ref": "../context/context.schema.json" @@ -24,6 +31,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title": "findIntentsByContext request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -31,10 +40,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/findIntentsByContextAgentResponse.schema.json b/schemas/bridging/findIntentsByContextAgentResponse.schema.json new file mode 100644 index 000000000..f4815d5bf --- /dev/null +++ b/schemas/bridging/findIntentsByContextAgentResponse.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json", + "title": "findIntentsByContext Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/FindIntentsByContextResponseBase" + } + ], + "$defs": { + "FindIntentsByContextResponseBase": { + "type": "object", + "description": "A response to a findIntentsByContext request.", + "properties": { + "type": { + "const": "findIntentsByContextResponse" + }, + "payload": { + "type": "object", + "title": "findIntentsByContext response payload", + "properties": { + "appIntents": { + "type": "array", + "items": { + "$ref": "../api/appIntent.schema.json" + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": ["appIntents"] + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/findIntentsByContextBridgeRequest.schema.json b/schemas/bridging/findIntentsByContextBridgeRequest.schema.json new file mode 100644 index 000000000..8f5a8e193 --- /dev/null +++ b/schemas/bridging/findIntentsByContextBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json", + "title": "findIntentsByContext Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "findIntentsByContextAgentRequest.schema.json#/$defs/FindIntentsByContextRequestBase" + } + ] +} diff --git a/schemas/bridging/findIntentsByContextResponse.schema.json b/schemas/bridging/findIntentsByContextBridgeResponse.schema.json similarity index 56% rename from schemas/bridging/findIntentsByContextResponse.schema.json rename to schemas/bridging/findIntentsByContextBridgeResponse.schema.json index 142612182..b930113aa 100644 --- a/schemas/bridging/findIntentsByContextResponse.schema.json +++ b/schemas/bridging/findIntentsByContextBridgeResponse.schema.json @@ -1,32 +1,23 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextResponse.schema.json", - "title": "findIntentsByContextResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json", + "title": "findIntentsByContext Bridge Response", + "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, { + "$ref": "findIntentsByContextAgentResponse.schema.json#/$defs/FindIntentsByContextResponseBase" + }, + { + "type": "object", "properties": { - "type": { - "const": "findIntentsByContextResponse" - }, - "payload": { - "type": "object", - "properties": { - "appIntents": { - "type": "array", - "items": { - "$ref": "../api/appIntent.schema.json" - }, - "additionalProperties": false - } - }, - "additionalProperties": false, - "required": ["appIntents"] - }, + "type": true, + "payload": true, "meta": { "type": "object", + "title": "findIntentsByContext response metadata", "properties": { "sources": { "type": "array", diff --git a/schemas/bridging/getAppMetadataRequest.schema.json b/schemas/bridging/getAppMetadataAgentRequest.schema.json similarity index 69% rename from schemas/bridging/getAppMetadataRequest.schema.json rename to schemas/bridging/getAppMetadataAgentRequest.schema.json index aa4de12d8..07fce5ed5 100644 --- a/schemas/bridging/getAppMetadataRequest.schema.json +++ b/schemas/bridging/getAppMetadataAgentRequest.schema.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json", - "title": "getAppMetadataRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentRequest.schema.json", + "title": "getAppMetadata Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/GetAppMetadataRequestBase" + } + ], + "$defs": { + "GetAppMetadataRequestBase": { "type": "object", + "description": "A request for metadata about an app", "properties": { "type": { "const": "getAppMetadataRequest" @@ -24,6 +30,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title" : "getAppMetadata request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,10 +42,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/getAppMetadataAgentResponse.schema.json b/schemas/bridging/getAppMetadataAgentResponse.schema.json new file mode 100644 index 000000000..59d3eb5f8 --- /dev/null +++ b/schemas/bridging/getAppMetadataAgentResponse.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json", + "title": "getAppMetadata Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/GetAppMetadataResponseBase" + } + ], + "$defs": { + "GetAppMetadataResponseBase": { + "type": "object", + "description": "A response to a getAppMetadata request.", + "properties": { + "type": { + "const": "getAppMetadataResponse" + }, + "payload": { + "type": "object", + "properties": { + "appMetadata": { + "$ref": "../api/appMetadata.schema.json" + } + }, + "required": ["appMetadata"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/getAppMetadataBridgeRequest.schema.json b/schemas/bridging/getAppMetadataBridgeRequest.schema.json new file mode 100644 index 000000000..8b8ba164d --- /dev/null +++ b/schemas/bridging/getAppMetadataBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json", + "title": "getAppMetadata Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "getAppMetadataAgentRequest.schema.json#/$defs/GetAppMetadataRequestBase" + } + ] +} diff --git a/schemas/bridging/getAppMetadataResponse.schema.json b/schemas/bridging/getAppMetadataBridgeResponse.schema.json similarity index 64% rename from schemas/bridging/getAppMetadataResponse.schema.json rename to schemas/bridging/getAppMetadataBridgeResponse.schema.json index e878ea198..6809f5366 100644 --- a/schemas/bridging/getAppMetadataResponse.schema.json +++ b/schemas/bridging/getAppMetadataBridgeResponse.schema.json @@ -1,28 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json", - "title": "getAppMetadataResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json", + "title": "getAppMetadata Bridge Response", "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "getAppMetadataAgentResponse.schema.json#/$defs/GetAppMetadataResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "getAppMetadataResponse" - }, - "payload": { - "type": "object", - "properties": { - "appMetadata": { - "$ref": "../api/appMetadata.schema.json" - } - }, - "required": ["appMetadata"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { "type": "object", "properties": { diff --git a/schemas/bridging/openRequest.schema.json b/schemas/bridging/openAgentRequest.json similarity index 76% rename from schemas/bridging/openRequest.schema.json rename to schemas/bridging/openAgentRequest.json index 939d03448..6e3f917d8 100644 --- a/schemas/bridging/openRequest.schema.json +++ b/schemas/bridging/openAgentRequest.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openRequest.schema.json", - "title": "openRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentRequest.schema.json", + "title": "open Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/OpenRequestBase" + } + ], + "$defs": { + "OpenRequestBase": { "type": "object", + "description": "A request to open an application", "properties": { "type": { "const": "openRequest" @@ -42,5 +48,5 @@ }, "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/openAgentResponse.schema.json b/schemas/bridging/openAgentResponse.schema.json new file mode 100644 index 000000000..62a49ac63 --- /dev/null +++ b/schemas/bridging/openAgentResponse.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json", + "title": "open Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/OpenResponseBase" + } + ], + "$defs": { + "OpenResponseBase": { + "type": "object", + "description": "A response to an open request", + "properties": { + "type": { + "const": "openResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIdentifier": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["appIdentifier"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/openBridgeRequest.json b/schemas/bridging/openBridgeRequest.json new file mode 100644 index 000000000..2d9034bdc --- /dev/null +++ b/schemas/bridging/openBridgeRequest.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeRequest.schema.json", + "title": "open Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "openAgentRequest.schema.json#/$defs/OpenRequestBase" + } + ] +} diff --git a/schemas/bridging/openBridgeResponse.schema.json b/schemas/bridging/openBridgeResponse.schema.json new file mode 100644 index 000000000..4bfd321f5 --- /dev/null +++ b/schemas/bridging/openBridgeResponse.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json", + "title": "open Bridge Response", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "$ref": "openAgentResponse.schema.json#/$defs/OpenResponseBase" + }, + { + "type": "object", + "properties": { + "type": true, + "payload": true, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/schemas/bridging/privateChannelBroadcast.schema.json b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json similarity index 62% rename from schemas/bridging/privateChannelBroadcast.schema.json rename to schemas/bridging/privateChannelBroadcastAgentRequest.schema.json index aa1d5ae43..ef9d06e28 100644 --- a/schemas/bridging/privateChannelBroadcast.schema.json +++ b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcast.schema.json", - "title": "PrivateChannel.broadcast", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json", + "title": "privateChannelBroadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelBroadcastRequestBase" + } + ], + "$defs": { + "PrivateChannelBroadcastRequestBase": { "type": "object", + "description": "A request to broadcast on a PrivateChannel.", "properties": { "type": { "const": "PrivateChannel.broadcast" }, "payload": { "type": "object", + "title": "privateChannel broadcast request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "context"] }, "meta": { + "type": "object", + "title": "privateChannel broadcast request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json b/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json new file mode 100644 index 000000000..ed80f6fd9 --- /dev/null +++ b/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json", + "title": "privateChannelBroadcast Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelBroadcastAgentRequest.schema.json#/$defs/PrivateChannelBroadcastRequestBase" + } + ] +} diff --git a/schemas/bridging/privateChannelEventListenerAdded.schema.json b/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json similarity index 59% rename from schemas/bridging/privateChannelEventListenerAdded.schema.json rename to schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json index f66bf83c0..089323c44 100644 --- a/schemas/bridging/privateChannelEventListenerAdded.schema.json +++ b/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAdded.schema.json", - "title": "PrivateChannel.eventListenerAdded", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json", + "title": "privateChannelEventListenerAdded Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelEventListenerAddedRequestBase" + } + ], + "$defs": { + "PrivateChannelEventListenerAddedRequestBase": { "type": "object", + "description": "A request to forward on an EventListenerAdded event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.eventListenerAdded" }, "payload": { "type": "object", + "title": "privateChannel eventListenerAdded request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "context"] }, "meta": { + "type": "object", + "title": "privateChannel eventListenerAdded request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json b/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json new file mode 100644 index 000000000..3b7397b74 --- /dev/null +++ b/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json", + "title": "privateChannelEventListenerAdded Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelEventListenerAddedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerAddedRequestBase" + } + ] +} diff --git a/schemas/bridging/privateChannelEventListenerRemoved.schema.json b/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json similarity index 58% rename from schemas/bridging/privateChannelEventListenerRemoved.schema.json rename to schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json index 294e4c51c..546e31374 100644 --- a/schemas/bridging/privateChannelEventListenerRemoved.schema.json +++ b/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json", - "title": "PrivateChannel.eventListenerRemoved", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json", + "title": "privateChannelEventListenerRemoved Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelEventListenerRemovedRequestBase" + } + ], + "$defs": { + "PrivateChannelEventListenerRemovedRequestBase": { "type": "object", + "description": "A request to forward on an EventListenerRemoved event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.eventListenerRemoved" }, "payload": { "type": "object", + "title": "privateChannel eventListenerRemoved request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "listenerType"] }, "meta": { + "type": "object", + "title": "privateChannel eventListenerRemoved request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json b/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json new file mode 100644 index 000000000..24b8b3cec --- /dev/null +++ b/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json", + "title": "privateChannelEventListenerRemoved Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelEventListenerRemovedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerRemovedRequestBase" + } + ] +} diff --git a/schemas/bridging/privateChannelOnAddContextListener.schema.json b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json similarity index 58% rename from schemas/bridging/privateChannelOnAddContextListener.schema.json rename to schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json index fc8df57eb..169857930 100644 --- a/schemas/bridging/privateChannelOnAddContextListener.schema.json +++ b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListener.schema.json", - "title": "PrivateChannel.onAddContextListener", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json", + "title": "privateChannelOnAddContextListener Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelOnAddContextListenerRequestBase" + } + ], + "$defs": { + "PrivateChannelOnAddContextListenerRequestBase": { "type": "object", + "description": "A request to forward on an AddCOntextListener event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.onAddContextListener" }, "payload": { "type": "object", + "title": "privateChannel onAddContextListener request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "contextType"] }, "meta": { + "type": "object", + "title": "privateChannel onAddContextListener request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json b/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json new file mode 100644 index 000000000..05ea74b49 --- /dev/null +++ b/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json", + "title": "privateChannelOnAddContextListener Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelOnAddContextListenerAgentRequest.schema.json#/$defs/PrivateChannelOnAddContextListenerRequestBase" + } + ] +} diff --git a/schemas/bridging/privateChannelOnDisconnect.schema.json b/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json similarity index 58% rename from schemas/bridging/privateChannelOnDisconnect.schema.json rename to schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json index 0251f6677..8b137372c 100644 --- a/schemas/bridging/privateChannelOnDisconnect.schema.json +++ b/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnect.schema.json", - "title": "PrivateChannel.onDisconnect", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json", + "title": "privateChannelOnDisconnect Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelOnDisconnectRequestBase" + } + ], + "$defs": { + "PrivateChannelOnDisconnectRequestBase": { "type": "object", + "description": "A request to forward on a Disconnect event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.onDisconnect" }, "payload": { "type": "object", + "title": "privateChannel onDisconnect request payload", "properties": { "channel": { "type": "string" @@ -24,6 +31,8 @@ "required": ["channel"] }, "meta": { + "type": "object", + "title": "privateChannel onDisconnect request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,9 +43,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json b/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json new file mode 100644 index 000000000..b4e31ddcc --- /dev/null +++ b/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json", + "title": "privateChannelOnDisconnect Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelOnDisconnectAgentRequest.schema.json#/$defs/PrivateChannelOnDisconnectRequestBase" + } + ] +} diff --git a/schemas/bridging/privateChannelOnUnsubscribe.schema.json b/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json similarity index 62% rename from schemas/bridging/privateChannelOnUnsubscribe.schema.json rename to schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json index d47270e7d..75649b334 100644 --- a/schemas/bridging/privateChannelOnUnsubscribe.schema.json +++ b/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json", - "title": "PrivateChannel.onUnsubscribe", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json", + "title": "privateChannelOnUnsubscribe Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelOnUnsubscribeRequestBase" + } + ], + "$defs": { + "PrivateChannelOnUnsubscribeRequestBase": { "type": "object", + "description": "A request to forward on an Unsubscribe event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.onUnsubscribe" }, "payload": { "type": "object", + "title": "privateChannel onUnsubscribe request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "contextType"] }, "meta": { + "type": "object", + "title": "privateChannel onUnsubscribe request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,9 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } } } - ] + } } diff --git a/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json b/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json new file mode 100644 index 000000000..0f76ebd19 --- /dev/null +++ b/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json", + "title": "PrivateChannelOnUnsubscribe Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelOnUnsubscribeAgentRequest.schema.json#/$defs/PrivateChannelOnUnsubscribeRequestBase" + } + ] +} diff --git a/schemas/bridging/raiseIntentRequest.schema.json b/schemas/bridging/raiseIntentAgentRequest.schema.json similarity index 79% rename from schemas/bridging/raiseIntentRequest.schema.json rename to schemas/bridging/raiseIntentAgentRequest.schema.json index b56019483..d597f673a 100644 --- a/schemas/bridging/raiseIntentRequest.schema.json +++ b/schemas/bridging/raiseIntentAgentRequest.schema.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json", - "title": "raiseIntentRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentRequest.schema.json", + "title": "raiseIntent Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/RaiseIntentRequestBase" + } + ], + "$defs": { + "RaiseIntentRequestBase": { "type": "object", + "description": "A request to raise an intent.", "properties": { "type": { "const": "raiseIntentRequest" @@ -40,11 +46,11 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false, + "unevaluatedProperties": false, "required": ["requestUuid","timestamp","destination","source"] } }, "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/raiseIntentAgentResponse.schema.json b/schemas/bridging/raiseIntentAgentResponse.schema.json new file mode 100644 index 000000000..52caf1369 --- /dev/null +++ b/schemas/bridging/raiseIntentAgentResponse.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentResponse.schema.json", + "title": "raiseIntent Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/RaiseIntentResponseBase" + } + ], + "$defs": { + "RaiseIntentResponseBase": { + "type": "object", + "description": "A response to a request to raise an intent.", + "properties": { + "type": { + "const": "raiseIntentResponse" + }, + "payload": { + "type": "object", + "properties": { + "intentResolution": { + "$ref": "../api/intentResolution.schema.json" + } + }, + "required": ["intentResolution"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/raiseIntentBridgeRequest.schema.json b/schemas/bridging/raiseIntentBridgeRequest.schema.json new file mode 100644 index 000000000..1db051e5e --- /dev/null +++ b/schemas/bridging/raiseIntentBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeRequest.schema.json", + "title": "raiseIntent Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "raiseIntentAgentRequest.schema.json#/$defs/RaiseIntentRequestBase" + } + ] +} diff --git a/schemas/bridging/raiseIntentResponse.schema.json b/schemas/bridging/raiseIntentBridgeResponse.schema.json similarity index 64% rename from schemas/bridging/raiseIntentResponse.schema.json rename to schemas/bridging/raiseIntentBridgeResponse.schema.json index 9a9245343..b9fbd772c 100644 --- a/schemas/bridging/raiseIntentResponse.schema.json +++ b/schemas/bridging/raiseIntentBridgeResponse.schema.json @@ -1,28 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json", - "title": "raiseIntentResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json", + "title": "raiseIntent Bridge Response", "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "raiseIntentAgentResponse.schema.json#/$defs/RaiseIntentResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "raiseIntentResponse" - }, - "payload": { - "type": "object", - "properties": { - "intentResolution": { - "$ref": "../api/intentResolution.schema.json" - } - }, - "required": ["intentResolution"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { "type": "object", "properties": { diff --git a/schemas/bridging/raiseIntentResultResponse.schema.json b/schemas/bridging/raiseIntentResultAgentResponse.schema.json similarity index 74% rename from schemas/bridging/raiseIntentResultResponse.schema.json rename to schemas/bridging/raiseIntentResultAgentResponse.schema.json index 69b38e12e..17437e3d8 100644 --- a/schemas/bridging/raiseIntentResultResponse.schema.json +++ b/schemas/bridging/raiseIntentResultAgentResponse.schema.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json", - "title": "raiseIntentResultResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json", + "title": "raiseIntentResult Agent Response", "type": "object", "allOf": [ { - "$ref": "bridgeResponse.schema.json" + "$ref": "agentResponse.schema.json" }, { + "$ref": "#/$defs/RaiseIntentResultResponseBase" + } + ], + "$defs": { + "RaiseIntentResultResponseBase": { "type": "object", + "description": "A secondary response to a request to raise an intent used to deliver the intent result", "properties": { "type": { "const": "raiseIntentResultResponse" @@ -44,18 +50,9 @@ "required": ["intentResult"], "additionalProperties": false }, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/appIdentifier.schema.json" - } - } - } - } - } + "meta": true + }, + "additionalProperties": false } - ] + } } diff --git a/schemas/bridging/raiseIntentResultBridgeResponse.schema.json b/schemas/bridging/raiseIntentResultBridgeResponse.schema.json new file mode 100644 index 000000000..0d06c0e72 --- /dev/null +++ b/schemas/bridging/raiseIntentResultBridgeResponse.schema.json @@ -0,0 +1,32 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json", + "title": "raiseIntentResult Bridge Response", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "$ref": "raiseIntentResultAgentResponse.schema.json#/$defs/RaiseIntentResultResponseBase" + }, + { + "type": "object", + "properties": { + "type": true, + "payload": true, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/appIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 49f22bf91..e86797e25 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,6 +1,6 @@ // To parse this data: // -// import { Convert, AppIdentifier, AppIntent, AppMetadata, BaseImplementationMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, BridgeRequest, BridgeResponse, BroadcastRequest, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, OpenRequest, OpenResponse, PrivateChannelBroadcast, PrivateChannelEventListenerAdded, PrivateChannelEventListenerRemoved, PrivateChannelOnAddContextListener, PrivateChannelOnDisconnect, PrivateChannelOnUnsubscribe, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, Context } from "./file"; +// import { Convert, AppIdentifier, AppIntent, AppMetadata, BaseImplementationMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, AgentRequestMessage, AgentResponseMessage, BridgeParticipantIdentifier, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; // // const appIdentifier = Convert.toAppIdentifier(json); // const appIntent = Convert.toAppIntent(json); @@ -17,32 +17,55 @@ // const intentMetadata = Convert.toIntentMetadata(json); // const intentResolution = Convert.toIntentResolution(json); // const intentResult = Convert.toIntentResult(json); -// const bridgeRequest = Convert.toBridgeRequest(json); -// const bridgeResponse = Convert.toBridgeResponse(json); -// const broadcastRequest = Convert.toBroadcastRequest(json); +// const agentRequestMessage = Convert.toAgentRequestMessage(json); +// const agentResponseMessage = Convert.toAgentResponseMessage(json); +// const bridgeParticipantIdentifier = Convert.toBridgeParticipantIdentifier(json); +// const bridgeRequestMessage = Convert.toBridgeRequestMessage(json); +// const bridgeResponseMessage = Convert.toBridgeResponseMessage(json); +// const broadcastAgentRequest = Convert.toBroadcastAgentRequest(json); +// const broadcastBridgeRequest = Convert.toBroadcastBridgeRequest(json); // const connectionStep2Hello = Convert.toConnectionStep2Hello(json); // const connectionStep3Handshake = Convert.toConnectionStep3Handshake(json); // const connectionStep4AuthenticationFailed = Convert.toConnectionStep4AuthenticationFailed(json); // const connectionStep6ConnectedAgentsUpdate = Convert.toConnectionStep6ConnectedAgentsUpdate(json); -// const findInstancesRequest = Convert.toFindInstancesRequest(json); -// const findInstancesResponse = Convert.toFindInstancesResponse(json); -// const findIntentRequest = Convert.toFindIntentRequest(json); -// const findIntentResponse = Convert.toFindIntentResponse(json); -// const findIntentsByContextRequest = Convert.toFindIntentsByContextRequest(json); -// const findIntentsByContextResponse = Convert.toFindIntentsByContextResponse(json); -// const getAppMetadataRequest = Convert.toGetAppMetadataRequest(json); -// const getAppMetadataResponse = Convert.toGetAppMetadataResponse(json); -// const openRequest = Convert.toOpenRequest(json); -// const openResponse = Convert.toOpenResponse(json); -// const privateChannelBroadcast = Convert.toPrivateChannelBroadcast(json); -// const privateChannelEventListenerAdded = Convert.toPrivateChannelEventListenerAdded(json); -// const privateChannelEventListenerRemoved = Convert.toPrivateChannelEventListenerRemoved(json); -// const privateChannelOnAddContextListener = Convert.toPrivateChannelOnAddContextListener(json); -// const privateChannelOnDisconnect = Convert.toPrivateChannelOnDisconnect(json); -// const privateChannelOnUnsubscribe = Convert.toPrivateChannelOnUnsubscribe(json); -// const raiseIntentRequest = Convert.toRaiseIntentRequest(json); -// const raiseIntentResponse = Convert.toRaiseIntentResponse(json); -// const raiseIntentResultResponse = Convert.toRaiseIntentResultResponse(json); +// const findInstancesAgentRequest = Convert.toFindInstancesAgentRequest(json); +// const findInstancesAgentResponse = Convert.toFindInstancesAgentResponse(json); +// const findInstancesBridgeRequest = Convert.toFindInstancesBridgeRequest(json); +// const findInstancesBridgeResponse = Convert.toFindInstancesBridgeResponse(json); +// const findIntentsAgentRequest = Convert.toFindIntentsAgentRequest(json); +// const findIntentAgentResponse = Convert.toFindIntentAgentResponse(json); +// const findIntentBridgeRequest = Convert.toFindIntentBridgeRequest(json); +// const findIntentBridgeResponse = Convert.toFindIntentBridgeResponse(json); +// const findIntentsByContextAgentRequest = Convert.toFindIntentsByContextAgentRequest(json); +// const findIntentsByContextAgentResponse = Convert.toFindIntentsByContextAgentResponse(json); +// const findIntentsByContextBridgeRequest = Convert.toFindIntentsByContextBridgeRequest(json); +// const findIntentsByContextBridgeResponse = Convert.toFindIntentsByContextBridgeResponse(json); +// const getAppMetadataAgentRequest = Convert.toGetAppMetadataAgentRequest(json); +// const getAppMetadataAgentResponse = Convert.toGetAppMetadataAgentResponse(json); +// const getAppMetadataBridgeRequest = Convert.toGetAppMetadataBridgeRequest(json); +// const getAppMetadataBridgeResponse = Convert.toGetAppMetadataBridgeResponse(json); +// const openAgentRequest = Convert.toOpenAgentRequest(json); +// const openAgentResponse = Convert.toOpenAgentResponse(json); +// const openBridgeRequest = Convert.toOpenBridgeRequest(json); +// const openBridgeResponse = Convert.toOpenBridgeResponse(json); +// const privateChannelBroadcastAgentRequest = Convert.toPrivateChannelBroadcastAgentRequest(json); +// const privateChannelBroadcastBridgeRequest = Convert.toPrivateChannelBroadcastBridgeRequest(json); +// const privateChannelEventListenerAddedAgentRequest = Convert.toPrivateChannelEventListenerAddedAgentRequest(json); +// const privateChannelEventListenerAddedBridgeRequest = Convert.toPrivateChannelEventListenerAddedBridgeRequest(json); +// const privateChannelEventListenerRemovedAgentRequest = Convert.toPrivateChannelEventListenerRemovedAgentRequest(json); +// const privateChannelEventListenerRemovedBridgeRequest = Convert.toPrivateChannelEventListenerRemovedBridgeRequest(json); +// const privateChannelOnAddContextListenerAgentRequest = Convert.toPrivateChannelOnAddContextListenerAgentRequest(json); +// const privateChannelOnAddContextListenerBridgeRequest = Convert.toPrivateChannelOnAddContextListenerBridgeRequest(json); +// const privateChannelOnDisconnectAgentRequest = Convert.toPrivateChannelOnDisconnectAgentRequest(json); +// const privateChannelOnDisconnectBridgeRequest = Convert.toPrivateChannelOnDisconnectBridgeRequest(json); +// const privateChannelOnUnsubscribeAgentRequest = Convert.toPrivateChannelOnUnsubscribeAgentRequest(json); +// const privateChannelOnUnsubscribeBridgeRequest = Convert.toPrivateChannelOnUnsubscribeBridgeRequest(json); +// const raiseIntentAgentRequest = Convert.toRaiseIntentAgentRequest(json); +// const raiseIntentAgentResponse = Convert.toRaiseIntentAgentResponse(json); +// const raiseIntentBridgeRequest = Convert.toRaiseIntentBridgeRequest(json); +// const raiseIntentBridgeResponse = Convert.toRaiseIntentBridgeResponse(json); +// const raiseIntentResultAgentResponse = Convert.toRaiseIntentResultAgentResponse(json); +// const raiseIntentResultBridgeResponse = Convert.toRaiseIntentResultBridgeResponse(json); // const context = Convert.toContext(json); // // These functions will throw an error if the JSON doesn't @@ -56,7 +79,6 @@ export interface AppIdentifier { appId: string; desktopAgent?: string; instanceId?: string; - [property: string]: any; } /** @@ -75,37 +97,8 @@ export interface AppIntent { */ export interface AppMetadataElement { appId: string; - description?: string; desktopAgent?: string; - icons?: IconElement[]; instanceId?: string; - instanceMetadata?: { [key: string]: any }; - name?: string; - resultType?: null | string; - screenshots?: ScreenshotElement[]; - title?: string; - tooltip?: string; - version?: string; -} - -/** - * Metadata relating to a single icon image at a remote URL, used to represent an - * application in a user interface. - */ -export interface IconElement { - size?: string; - src: string; - type?: string; -} - -/** - * Metadata relating to a single image at a remote URL, used to represent screenshot images. - */ -export interface ScreenshotElement { - label?: string; - size?: string; - src: string; - type?: string; } /** @@ -124,17 +117,8 @@ export interface IntentClass { */ export interface AppMetadata { appId: string; - description?: string; desktopAgent?: string; - icons?: IconElement[]; instanceId?: string; - instanceMetadata?: { [key: string]: any }; - name?: string; - resultType?: null | string; - screenshots?: ScreenshotElement[]; - title?: string; - tooltip?: string; - version?: string; } /** @@ -195,7 +179,6 @@ export interface SourceElement { appId: string; desktopAgent?: string; instanceId?: string; - [property: string]: any; } /** @@ -206,6 +189,7 @@ export interface SourceElement { */ export interface DesktopAgentIdentifier { desktopAgent: string; + [property: string]: any; } /** @@ -292,8 +276,11 @@ export interface IntentResult { [property: string]: any; } -export interface BridgeRequest { - meta: MetaObject; +/** + * A request message from a Desktop Agent to the Bridge. + */ +export interface AgentRequestMessage { + meta: AgentRequestMessageMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -305,26 +292,29 @@ export interface BridgeRequest { type: string; } -export interface MetaObject { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface AgentRequestMessageMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationElement; + destination?: BridgeParticipantIdentifierElement; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: DestinationElement; + source?: SourceIdentifier; /** * Timestamp at which request or response was generated */ timestamp: Date; - [property: string]: any; } /** @@ -332,7 +322,11 @@ export interface MetaObject { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. * * Identifies an application, or instance of an application, and is used to target FDC3 API * calls at specific applications. @@ -342,15 +336,40 @@ export interface MetaObject { * Desktop Agent itself rather than a specific application. Often added to messages by the * Desktop Agent Bridge. */ -export interface DestinationElement { +export interface BridgeParticipantIdentifierElement { + appId?: string; + desktopAgent: string; + instanceId?: string; + [property: string]: any; +} + +/** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface SourceIdentifier { appId?: string; desktopAgent?: string; instanceId?: string; [property: string]: any; } -export interface BridgeResponse { - meta: BridgeResponseMeta; +/** + * A response message from a Desktop Agent to the Bridge. + */ +export interface AgentResponseMessage { + meta: AgentResponseMetadata; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -362,15 +381,110 @@ export interface BridgeResponse { type: string; } -export interface BridgeResponseMeta { +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface AgentResponseMetadata { /** - * Unique UUID for the request + * UUID for the request this message is responding to. + */ + requestUuid: string; + /** + * UUID for this specific response message. + */ + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: SourceIdentifier; + /** + * Timestamp at which the response was generated + */ + timestamp: Date; +} + +/** + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface BridgeParticipantIdentifier { + appId?: string; + desktopAgent: string; + instanceId?: string; + [property: string]: any; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface BridgeRequestMessage { + meta: BridgeRequestMessageMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface BridgeRequestMessageMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifierElement; + /** + * UUID for the request */ requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: BridgeParticipantIdentifierElement; /** * Timestamp at which request or response was generated */ timestamp: Date; +} + +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface BridgeResponseMessage { + meta: BridgeResponseMessageMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface BridgeResponseMessageMeta { /** * Array of error message strings for responses that were not returned to the bridge before * the timeout or because an error occurred. Should be the same length as the `errorSources` @@ -380,28 +494,42 @@ export interface BridgeResponseMeta { /** * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. */ - errorSources?: DestinationElement[]; + errorSources?: BridgeParticipantIdentifierElement[]; /** - * Unique UUID for the response + * UUID for the request this message is responding to + */ + requestUuid: string; + /** + * Unique UUID for this collated response (generated by the bridge). */ responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. + */ + sources?: BridgeParticipantIdentifierElement[]; + /** + * Timestamp at which the response was generated */ - sources?: DestinationElement[]; + timestamp: Date; } -export interface BroadcastRequest { - meta: BroadcastRequestMeta; +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to broadcast context on a channel. + */ +export interface BroadcastAgentRequest { + meta: BroadcastAgentRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: BroadcastRequestPayload; + payload: BroadcastAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -409,15 +537,19 @@ export interface BroadcastRequest { type: string; } -export interface BroadcastRequestMeta { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface BroadcastAgentRequestMeta { /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source?: SourceClass; /** * Timestamp at which request or response was generated */ @@ -425,11 +557,11 @@ export interface BroadcastRequestMeta { } /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. * - * Field that represents the source application that the request was received from. + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. * * Identifies an application, or instance of an application, and is used to target FDC3 API * calls at specific applications. @@ -439,17 +571,16 @@ export interface BroadcastRequestMeta { * Desktop Agent itself rather than a specific application. Often added to messages by the * Desktop Agent Bridge. */ -export interface PurpleIdentifier { +export interface SourceClass { appId: string; desktopAgent?: string; instanceId?: string; - [property: string]: any; } /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface BroadcastRequestPayload { +export interface BroadcastAgentRequestPayload { channel: ChannelClass; context: ContextElement; } @@ -470,6 +601,76 @@ export interface ContextElement { [property: string]: any; } +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to broadcast context on a channel. + */ +export interface BroadcastBridgeRequest { + meta: BroadcastBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: BroadcastBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface BroadcastBridgeRequestMeta { + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls at specific applications. + * + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. + */ +export interface DestinationClass { + appId: string; + desktopAgent: string; + instanceId?: string; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface BroadcastBridgeRequestPayload { + channel: ChannelClass; + context: ContextElement; +} + export interface ConnectionStep2Hello { meta: ConnectionStep2HelloMeta; payload: ConnectionStep2HelloPayload; @@ -634,12 +835,17 @@ export interface ImplementationMetadataElement { providerVersion?: string; } -export interface FindInstancesRequest { - meta: FindInstancesRequestMeta; +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request for details of instances of a particular app + */ +export interface FindInstancesAgentRequest { + meta: FindInstancesAgentRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: FindInstancesRequestPayload; + payload: FindInstancesAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -647,21 +853,25 @@ export interface FindInstancesRequest { type: string; } -export interface FindInstancesRequestMeta { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface FindInstancesAgentRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; + destination?: DestinationObject; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source?: SourceClass; /** * Timestamp at which request or response was generated */ @@ -673,7 +883,11 @@ export interface FindInstancesRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. * * Identifies an application, or instance of an application, and is used to target FDC3 API * calls at specific applications. @@ -683,23 +897,31 @@ export interface FindInstancesRequestMeta { * Desktop Agent itself rather than a specific application. Often added to messages by the * Desktop Agent Bridge. */ -export interface DestinationClass { +export interface DestinationObject { + appId?: string; desktopAgent: string; + instanceId?: string; + [property: string]: any; } /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface FindInstancesRequestPayload { +export interface FindInstancesAgentRequestPayload { app: SourceElement; } -export interface FindInstancesResponse { - meta: FindInstancesResponseMeta; +/** + * A response message from a Desktop Agent to the Bridge. + * + * A response to a findInstances request. + */ +export interface FindInstancesAgentResponse { + meta: AgentResponseMetadata; /** * The message payload typically contains return values for FDC3 API functions. */ - payload: FindInstancesResponsePayload; + payload: FindInstancesAgentResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. @@ -707,144 +929,211 @@ export interface FindInstancesResponse { type: string; } -export interface FindInstancesResponseMeta { +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindInstancesAgentResponsePayload { + appIdentifiers: AppMetadataElement[]; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request for details of instances of a particular app + */ +export interface FindInstancesBridgeRequest { + meta: FindInstancesBridgeRequestMeta; /** - * Unique UUID for the request + * The message payload typically contains the arguments to FDC3 API functions. */ - requestUuid: string; + payload: FindInstancesBridgeRequestPayload; /** - * Timestamp at which request or response was generated + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - timestamp: Date; + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface FindInstancesBridgeRequestMeta { /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. */ - errorDetails?: string[]; + destination?: DestinationObject; /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. + * UUID for the request */ - errorSources?: DestinationElement[]; + requestUuid: string; /** - * Unique UUID for the response + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - responseUuid: string; + source: DestinationClass; /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. + * Timestamp at which request or response was generated */ - sources?: ErrorSourceElement[]; + timestamp: Date; } /** - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. + * The message payload typically contains the arguments to FDC3 API functions. */ -export interface ErrorSourceElement { - desktopAgent: string; +export interface FindInstancesBridgeRequestPayload { + app: SourceElement; } /** - * The message payload typically contains return values for FDC3 API functions. + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + * + * A response to a findInstances request. */ -export interface FindInstancesResponsePayload { - appIdentifiers: AppMetadataElement[]; -} - -export interface FindIntentRequest { - meta: FindIntentRequestMeta; +export interface FindInstancesBridgeResponse { + meta: FindInstancesBridgeResponseMeta; /** - * The message payload typically contains the arguments to FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. */ - payload: FindIntentRequestPayload; + payload: FindInstancesBridgeResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. + * the message relates to, e.g. 'findIntent', with 'Response' appended. */ type: string; } -export interface FindIntentRequestMeta { +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindInstancesBridgeResponseMeta { /** - * Unique UUID for the request + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. + */ + errorSources?: ErrorSourceElement[]; + /** + * UUID for the request this message is responding to */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Unique UUID for this collated response (generated by the bridge). */ - source: PurpleIdentifier; + responseUuid: string; /** - * Timestamp at which request or response was generated + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. + */ + sources?: ErrorSourceElement[]; + /** + * Timestamp at which the response was generated */ timestamp: Date; } /** - * The message payload typically contains the arguments to FDC3 API functions. + * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the + * source or destination of a message which was produced by or should be processed by the + * Desktop Agent itself rather than a specific application. Often added to messages by the + * Desktop Agent Bridge. */ -export interface FindIntentRequestPayload { - context: ContextElement; - intent: string; +export interface ErrorSourceElement { + desktopAgent: string; + [property: string]: any; } -export interface FindIntentResponse { - meta: FindIntentResponseMeta; +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindInstancesBridgeResponsePayload { + appIdentifiers: AppMetadataElement[]; +} + +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request for details of apps available to resolve a particular intent and context pair. + */ +export interface FindIntentsAgentRequest { + meta: EntRequestMetadata; /** - * The message payload typically contains return values for FDC3 API functions. + * The message payload typically contains the arguments to FDC3 API functions. */ - payload: FindIntentResponsePayload; + payload: FindIntentsAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. + * the message relates to, e.g. 'findIntent', with 'Request' appended. */ type: string; } -export interface FindIntentResponseMeta { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface EntRequestMetadata { /** - * Unique UUID for the request + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. */ - requestUuid: string; + destination?: BridgeParticipantIdentifierElement; /** - * Timestamp at which request or response was generated + * UUID for the request */ - timestamp: Date; + requestUuid: string; /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - errorDetails?: string[]; + source?: SourceClass; /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. + * Timestamp at which request or response was generated */ - errorSources?: ErrorSourceElement[]; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentsAgentRequestPayload { + context: ContextElement; + intent: string; +} + +/** + * A response message from a Desktop Agent to the Bridge. + * + * A response to a findIntent request. + */ +export interface FindIntentAgentResponse { + meta: AgentResponseMetadata; /** - * Unique UUID for the response + * The message payload typically contains return values for FDC3 API functions. */ - responseUuid: string; + payload: FindIntentAgentResponsePayload; /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - sources?: ErrorSourceElement[]; + type: string; } /** * The message payload typically contains return values for FDC3 API functions. */ -export interface FindIntentResponsePayload { +export interface FindIntentAgentResponsePayload { appIntent: AppIntentElement; } @@ -856,12 +1145,17 @@ export interface AppIntentElement { intent: IntentClass; } -export interface FindIntentsByContextRequest { - meta: FindIntentsByContextRequestMeta; +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request for details of apps available to resolve a particular intent and context pair. + */ +export interface FindIntentBridgeRequest { + meta: FindIntentBridgeRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: FindIntentsByContextRequestPayload; + payload: FindIntentBridgeRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -869,15 +1163,25 @@ export interface FindIntentsByContextRequest { type: string; } -export interface FindIntentsByContextRequestMeta { +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface FindIntentBridgeRequestMeta { /** - * Unique UUID for the request + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifierElement; + /** + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source: DestinationClass; /** * Timestamp at which request or response was generated */ @@ -887,16 +1191,23 @@ export interface FindIntentsByContextRequestMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface FindIntentsByContextRequestPayload { +export interface FindIntentBridgeRequestPayload { context: ContextElement; + intent: string; } -export interface FindIntentsByContextResponse { - meta: FindIntentsByContextResponseMeta; +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + * + * A response to a findIntent request. + */ +export interface FindIntentBridgeResponse { + meta: FindIntentBridgeResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ - payload: FindIntentsByContextResponsePayload; + payload: FindIntentBridgeResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. @@ -904,15 +1215,10 @@ export interface FindIntentsByContextResponse { type: string; } -export interface FindIntentsByContextResponseMeta { - /** - * Unique UUID for the request - */ - requestUuid: string; - /** - * Timestamp at which request or response was generated - */ - timestamp: Date; +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindIntentBridgeResponseMeta { /** * Array of error message strings for responses that were not returned to the bridge before * the timeout or because an error occurred. Should be the same length as the `errorSources` @@ -922,35 +1228,50 @@ export interface FindIntentsByContextResponseMeta { /** * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. */ errorSources?: ErrorSourceElement[]; /** - * Unique UUID for the response + * UUID for the request this message is responding to + */ + requestUuid: string; + /** + * Unique UUID for this collated response (generated by the bridge). */ responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. */ sources?: ErrorSourceElement[]; + /** + * Timestamp at which the response was generated + */ + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ -export interface FindIntentsByContextResponsePayload { - appIntents: AppIntentElement[]; +export interface FindIntentBridgeResponsePayload { + appIntent: AppIntentElement; } -export interface GetAppMetadataRequest { - meta: GetAppMetadataRequestMeta; +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request for details of intents and apps available to resolve them for a particular + * context. + */ +export interface FindIntentsByContextAgentRequest { + meta: FindIntentsByContextAgentRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: GetAppMetadataRequestPayload; + payload: FindIntentsByContextAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -958,21 +1279,25 @@ export interface GetAppMetadataRequest { type: string; } -export interface GetAppMetadataRequestMeta { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface FindIntentsByContextAgentRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; + destination?: BridgeParticipantIdentifierElement; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source?: SourceClass; /** * Timestamp at which request or response was generated */ @@ -982,16 +1307,21 @@ export interface GetAppMetadataRequestMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface GetAppMetadataRequestPayload { - app: SourceElement; +export interface FindIntentsByContextAgentRequestPayload { + context: ContextElement; } -export interface GetAppMetadataResponse { - meta: GetAppMetadataResponseMeta; +/** + * A response message from a Desktop Agent to the Bridge. + * + * A response to a findIntentsByContext request. + */ +export interface FindIntentsByContextAgentResponse { + meta: AgentResponseMetadata; /** * The message payload typically contains return values for FDC3 API functions. */ - payload: GetAppMetadataResponsePayload; + payload: FindIntentsByContextAgentResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. @@ -999,53 +1329,25 @@ export interface GetAppMetadataResponse { type: string; } -export interface GetAppMetadataResponseMeta { - /** - * Unique UUID for the request - */ - requestUuid: string; - /** - * Timestamp at which request or response was generated - */ - timestamp: Date; - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ - errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. - */ - errorSources?: ErrorSourceElement[]; - /** - * Unique UUID for the response - */ - responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. - */ - sources?: ErrorSourceElement[]; -} - /** * The message payload typically contains return values for FDC3 API functions. */ -export interface GetAppMetadataResponsePayload { - appMetadata: AppMetadataElement; +export interface FindIntentsByContextAgentResponsePayload { + appIntents: AppIntentElement[]; } -export interface OpenRequest { - meta: OpenRequestMeta; +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request for details of intents and apps available to resolve them for a particular + * context. + */ +export interface FindIntentsByContextBridgeRequest { + meta: FindIntentsByContextBridgeRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: OpenRequestPayload; + payload: FindIntentsByContextBridgeRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -1053,21 +1355,25 @@ export interface OpenRequest { type: string; } -export interface OpenRequestMeta { +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface FindIntentsByContextBridgeRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; + destination?: BridgeParticipantIdentifierElement; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source: DestinationClass; /** * Timestamp at which request or response was generated */ @@ -1077,17 +1383,22 @@ export interface OpenRequestMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface OpenRequestPayload { - app: SourceElement; - context?: ContextElement; +export interface FindIntentsByContextBridgeRequestPayload { + context: ContextElement; } -export interface OpenResponse { - meta: OpenResponseMeta; +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + * + * A response to a findIntentsByContext request. + */ +export interface FindIntentsByContextBridgeResponse { + meta: ResponseMetadata; /** * The message payload typically contains return values for FDC3 API functions. */ - payload: OpenResponsePayload; + payload: FindIntentsByContextBridgeResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. @@ -1095,15 +1406,10 @@ export interface OpenResponse { type: string; } -export interface OpenResponseMeta { - /** - * Unique UUID for the request - */ - requestUuid: string; - /** - * Timestamp at which request or response was generated - */ - timestamp: Date; +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface ResponseMetadata { /** * Array of error message strings for responses that were not returned to the bridge before * the timeout or because an error occurred. Should be the same length as the `errorSources` @@ -1113,35 +1419,49 @@ export interface OpenResponseMeta { /** * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. */ errorSources?: ErrorSourceElement[]; /** - * Unique UUID for the response + * UUID for the request this message is responding to + */ + requestUuid: string; + /** + * Unique UUID for this collated response (generated by the bridge). */ responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. */ sources?: ErrorSourceElement[]; + /** + * Timestamp at which the response was generated + */ + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ -export interface OpenResponsePayload { - appIdentifier: SourceElement; +export interface FindIntentsByContextBridgeResponsePayload { + appIntents: AppIntentElement[]; } -export interface PrivateChannelBroadcast { - meta: PrivateChannelBroadcastMeta; +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request for metadata about an app + */ +export interface GetAppMetadataAgentRequest { + meta: GetAppMetadataAgentRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: PrivateChannelBroadcastPayload; + payload: GetAppMetadataAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -1149,21 +1469,25 @@ export interface PrivateChannelBroadcast { type: string; } -export interface PrivateChannelBroadcastMeta { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface GetAppMetadataAgentRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleIdentifier; + destination?: DestinationObject; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source?: SourceClass; /** * Timestamp at which request or response was generated */ @@ -1173,59 +1497,46 @@ export interface PrivateChannelBroadcastMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface PrivateChannelBroadcastPayload { - channel: string; - context: string; +export interface GetAppMetadataAgentRequestPayload { + app: SourceElement; } -export interface PrivateChannelEventListenerAdded { - meta: PrivateChannelEventListenerAddedMeta; +/** + * A response message from a Desktop Agent to the Bridge. + * + * A response to a getAppMetadata request. + */ +export interface GetAppMetadataAgentResponse { + meta: AgentResponseMetadata; /** - * The message payload typically contains the arguments to FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. */ - payload: PrivateChannelEventListenerAddedPayload; + payload: GetAppMetadataAgentResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. + * the message relates to, e.g. 'findIntent', with 'Response' appended. */ type: string; } -export interface PrivateChannelEventListenerAddedMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: PurpleIdentifier; - /** - * Unique UUID for the request - */ - requestUuid: string; - /** - * Field that represents the source application that the request was received from. - */ - source: PurpleIdentifier; - /** - * Timestamp at which request or response was generated - */ - timestamp: Date; -} - /** - * The message payload typically contains the arguments to FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. */ -export interface PrivateChannelEventListenerAddedPayload { - channel: string; - context: string; +export interface GetAppMetadataAgentResponsePayload { + appMetadata: AppMetadataElement; } -export interface PrivateChannelEventListenerRemoved { - meta: PrivateChannelEventListenerRemovedMeta; +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request for metadata about an app + */ +export interface GetAppMetadataBridgeRequest { + meta: GetAppMetadataBridgeRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: PrivateChannelEventListenerRemovedPayload; + payload: GetAppMetadataBridgeRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -1233,21 +1544,25 @@ export interface PrivateChannelEventListenerRemoved { type: string; } -export interface PrivateChannelEventListenerRemovedMeta { +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface GetAppMetadataBridgeRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleIdentifier; + destination?: DestinationObject; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source: DestinationClass; /** * Timestamp at which request or response was generated */ @@ -1257,59 +1572,85 @@ export interface PrivateChannelEventListenerRemovedMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface PrivateChannelEventListenerRemovedPayload { - channel: string; - listenerType: string; +export interface GetAppMetadataBridgeRequestPayload { + app: SourceElement; } -export interface PrivateChannelOnAddContextListener { - meta: PrivateChannelOnAddContextListenerMeta; +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + * + * A response to a getAppMetadata request. + */ +export interface GetAppMetadataBridgeResponse { + meta: GetAppMetadataBridgeResponseMeta; /** - * The message payload typically contains the arguments to FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. */ - payload: PrivateChannelOnAddContextListenerPayload; + payload: GetAppMetadataBridgeResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. + * the message relates to, e.g. 'findIntent', with 'Response' appended. */ type: string; } -export interface PrivateChannelOnAddContextListenerMeta { +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface GetAppMetadataBridgeResponseMeta { /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. */ - destination?: PurpleIdentifier; + errorDetails?: string[]; /** - * Unique UUID for the request + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. + */ + errorSources?: ErrorSourceElement[]; + /** + * UUID for the request this message is responding to */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Unique UUID for this collated response (generated by the bridge). */ - source: PurpleIdentifier; + responseUuid: string; /** - * Timestamp at which request or response was generated + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. + */ + sources?: ErrorSourceElement[]; + /** + * Timestamp at which the response was generated */ timestamp: Date; } /** - * The message payload typically contains the arguments to FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. */ -export interface PrivateChannelOnAddContextListenerPayload { - channel: string; - contextType: string; +export interface GetAppMetadataBridgeResponsePayload { + appMetadata: AppMetadataElement; } -export interface PrivateChannelOnDisconnect { - meta: PrivateChannelOnDisconnectMeta; +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to open an application + */ +export interface OpenAgentRequest { + meta: OpenAgentRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: PrivateChannelOnDisconnectPayload; + payload: OpenAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -1317,21 +1658,25 @@ export interface PrivateChannelOnDisconnect { type: string; } -export interface PrivateChannelOnDisconnectMeta { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface OpenAgentRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleIdentifier; + destination?: DestinationObject; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source?: SourceClass; /** * Timestamp at which request or response was generated */ @@ -1341,58 +1686,47 @@ export interface PrivateChannelOnDisconnectMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface PrivateChannelOnDisconnectPayload { - channel: string; +export interface OpenAgentRequestPayload { + app: SourceElement; + context?: ContextElement; } -export interface PrivateChannelOnUnsubscribe { - meta: PrivateChannelOnUnsubscribeMeta; +/** + * A response message from a Desktop Agent to the Bridge. + * + * A response to an open request + */ +export interface OpenAgentResponse { + meta: AgentResponseMetadata; /** - * The message payload typically contains the arguments to FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. */ - payload: PrivateChannelOnUnsubscribePayload; + payload: OpenAgentResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. + * the message relates to, e.g. 'findIntent', with 'Response' appended. */ type: string; } -export interface PrivateChannelOnUnsubscribeMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: PurpleIdentifier; - /** - * Unique UUID for the request - */ - requestUuid: string; - /** - * Field that represents the source application that the request was received from. - */ - source: PurpleIdentifier; - /** - * Timestamp at which request or response was generated - */ - timestamp: Date; -} - /** - * The message payload typically contains the arguments to FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. */ -export interface PrivateChannelOnUnsubscribePayload { - channel: string; - contextType: string; +export interface OpenAgentResponsePayload { + appIdentifier: SourceElement; } -export interface RaiseIntentRequest { - meta: RaiseIntentRequestMeta; +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to open an application + */ +export interface OpenBridgeRequest { + meta: OpenBridgeRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: RaiseIntentRequestPayload; + payload: OpenBridgeRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -1400,21 +1734,25 @@ export interface RaiseIntentRequest { type: string; } -export interface RaiseIntentRequestMeta { +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface OpenBridgeRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination: PurpleIdentifier; + destination?: DestinationObject; /** - * Unique UUID for the request + * UUID for the request */ requestUuid: string; /** - * Field that represents the source application that the request was received from. + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. */ - source: PurpleIdentifier; + source: DestinationClass; /** * Timestamp at which request or response was generated */ @@ -1424,18 +1762,23 @@ export interface RaiseIntentRequestMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface RaiseIntentRequestPayload { +export interface OpenBridgeRequestPayload { app: SourceElement; - context: ContextElement; - intent: string; + context?: ContextElement; } -export interface RaiseIntentResponse { - meta: RaiseIntentResponseMeta; +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + * + * A response to an open request + */ +export interface OpenBridgeResponse { + meta: OpenBridgeResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ - payload: RaiseIntentResponsePayload; + payload: OpenBridgeResponsePayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. @@ -1443,15 +1786,10 @@ export interface RaiseIntentResponse { type: string; } -export interface RaiseIntentResponseMeta { - /** - * Unique UUID for the request - */ - requestUuid: string; - /** - * Timestamp at which request or response was generated - */ - timestamp: Date; +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface OpenBridgeResponseMeta { /** * Array of error message strings for responses that were not returned to the bridge before * the timeout or because an error occurred. Should be the same length as the `errorSources` @@ -1461,118 +1799,965 @@ export interface RaiseIntentResponseMeta { /** * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. + */ + errorSources?: ErrorSourceElement[]; + /** + * UUID for the request this message is responding to */ - errorSources?: DestinationElement[]; + requestUuid: string; /** - * Unique UUID for the response + * Unique UUID for this collated response (generated by the bridge). */ responseUuid: string; /** * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated * responses to the request. Will contain a single value for individual responses and * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. */ sources?: ErrorSourceElement[]; + /** + * Timestamp at which the response was generated + */ + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ -export interface RaiseIntentResponsePayload { - intentResolution: IntentResolutionClass; +export interface OpenBridgeResponsePayload { + appIdentifier: SourceElement; } /** - * IntentResolution provides a standard format for data returned upon resolving an intent. + * A request message from a Desktop Agent to the Bridge. + * + * A request to broadcast on a PrivateChannel. */ -export interface IntentResolutionClass { - intent: string; - source: SourceElement; - version?: string; -} - -export interface RaiseIntentResultResponse { - meta: RaiseIntentResultResponseMeta; +export interface PrivateChannelBroadcastAgentRequest { + meta: PrivateChannelBroadcastAgentRequestMeta; /** - * The message payload typically contains return values for FDC3 API functions. + * The message payload typically contains the arguments to FDC3 API functions. */ - payload: RaiseIntentResultResponsePayload; + payload: PrivateChannelBroadcastAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. + * the message relates to, e.g. 'findIntent', with 'Request' appended. */ type: string; } -export interface RaiseIntentResultResponseMeta { +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelBroadcastAgentRequestMeta { /** - * Unique UUID for the request + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request */ requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceClass; /** * Timestamp at which request or response was generated */ timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelBroadcastAgentRequestPayload { + channel: string; + context: string; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to broadcast on a PrivateChannel. + */ +export interface PrivateChannelBroadcastBridgeRequest { + meta: PrivateChannelBroadcastBridgeRequestMeta; /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. + * The message payload typically contains the arguments to FDC3 API functions. */ - errorDetails?: string[]; + payload: PrivateChannelBroadcastBridgeRequestPayload; /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - errorSources?: DestinationElement[]; + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelBroadcastBridgeRequestMeta { /** - * Unique UUID for the response + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. */ - responseUuid: string; + destination?: DestinationClass; /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. + * UUID for the request */ - sources?: SourceElement[]; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; } /** - * The message payload typically contains return values for FDC3 API functions. + * The message payload typically contains the arguments to FDC3 API functions. */ -export interface RaiseIntentResultResponsePayload { - intentResult: IntentResultClass; +export interface PrivateChannelBroadcastBridgeRequestPayload { + channel: string; + context: string; } -export interface IntentResultClass { - context?: ContextElement; - channel?: ChannelClass; +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to forward on an EventListenerAdded event, relating to a PrivateChannel + */ +export interface PrivateChannelEventListenerAddedAgentRequest { + meta: PrivateChannelEventListenerAddedAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerAddedAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; } -export interface Context { - id?: { [key: string]: any }; - name?: string; - type: string; - [property: string]: any; +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelEventListenerAddedAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; } -// Converts JSON strings to/from your types -// and asserts the results of JSON.parse at runtime -export class Convert { - public static toAppIdentifier(json: string): AppIdentifier { - return cast(JSON.parse(json), r('AppIdentifier')); - } +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerAddedAgentRequestPayload { + channel: string; + context: string; +} - public static appIdentifierToJson(value: AppIdentifier): string { - return JSON.stringify(uncast(value, r('AppIdentifier')), null, 2); - } +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to forward on an EventListenerAdded event, relating to a PrivateChannel + */ +export interface PrivateChannelEventListenerAddedBridgeRequest { + meta: PrivateChannelEventListenerAddedBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerAddedBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} - public static toAppIntent(json: string): AppIntent { - return cast(JSON.parse(json), r('AppIntent')); - } +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelEventListenerAddedBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerAddedBridgeRequestPayload { + channel: string; + context: string; +} + +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel + */ +export interface PrivateChannelEventListenerRemovedAgentRequest { + meta: PrivateChannelEventListenerRemovedAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerRemovedAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelEventListenerRemovedAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerRemovedAgentRequestPayload { + channel: string; + listenerType: string; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel + */ +export interface PrivateChannelEventListenerRemovedBridgeRequest { + meta: PrivateChannelEventListenerRemovedBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerRemovedBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelEventListenerRemovedBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerRemovedBridgeRequestPayload { + channel: string; + listenerType: string; +} + +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to forward on an AddCOntextListener event, relating to a PrivateChannel + */ +export interface PrivateChannelOnAddContextListenerAgentRequest { + meta: PrivateChannelOnAddContextListenerAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnAddContextListenerAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelOnAddContextListenerAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnAddContextListenerAgentRequestPayload { + channel: string; + contextType: string; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to forward on an AddCOntextListener event, relating to a PrivateChannel + */ +export interface PrivateChannelOnAddContextListenerBridgeRequest { + meta: PrivateChannelOnAddContextListenerBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnAddContextListenerBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelOnAddContextListenerBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnAddContextListenerBridgeRequestPayload { + channel: string; + contextType: string; +} + +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to forward on a Disconnect event, relating to a PrivateChannel + */ +export interface PrivateChannelOnDisconnectAgentRequest { + meta: PrivateChannelOnDisconnectAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnDisconnectAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelOnDisconnectAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnDisconnectAgentRequestPayload { + channel: string; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to forward on a Disconnect event, relating to a PrivateChannel + */ +export interface PrivateChannelOnDisconnectBridgeRequest { + meta: PrivateChannelOnDisconnectBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnDisconnectBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelOnDisconnectBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnDisconnectBridgeRequestPayload { + channel: string; +} + +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to forward on an Unsubscribe event, relating to a PrivateChannel + */ +export interface PrivateChannelOnUnsubscribeAgentRequest { + meta: PrivateChannelOnUnsubscribeAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnUnsubscribeAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelOnUnsubscribeAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnUnsubscribeAgentRequestPayload { + channel: string; + contextType: string; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to forward on an Unsubscribe event, relating to a PrivateChannel + */ +export interface PrivateChannelOnUnsubscribeBridgeRequest { + meta: ERequestMetadata; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnUnsubscribeBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface ERequestMetadata { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnUnsubscribeBridgeRequestPayload { + channel: string; + contextType: string; +} + +/** + * A request message from a Desktop Agent to the Bridge. + * + * A request to raise an intent. + */ +export interface RaiseIntentAgentRequest { + meta: RaiseIntentAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: RaiseIntentAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface RaiseIntentAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: SourceClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface RaiseIntentAgentRequestPayload { + app: SourceElement; + context: ContextElement; + intent: string; +} + +/** + * A response message from a Desktop Agent to the Bridge. + * + * A response to a request to raise an intent. + */ +export interface RaiseIntentAgentResponse { + meta: AgentResponseMetadata; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentAgentResponsePayload { + intentResolution: IntentResolutionClass; +} + +/** + * IntentResolution provides a standard format for data returned upon resolving an intent. + */ +export interface IntentResolutionClass { + intent: string; + source: SourceElement; + version?: string; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * + * A request to raise an intent. + */ +export interface RaiseIntentBridgeRequest { + meta: RaiseIntentBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: RaiseIntentBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface RaiseIntentBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination: DestinationClass; + /** + * UUID for the request + */ + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: DestinationClass; + /** + * Timestamp at which request or response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface RaiseIntentBridgeRequestPayload { + app: SourceElement; + context: ContextElement; + intent: string; +} + +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + * + * A response to a request to raise an intent. + */ +export interface RaiseIntentBridgeResponse { + meta: RaiseIntentBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentBridgeResponseMeta { + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. + */ + errorSources?: BridgeParticipantIdentifierElement[]; + /** + * UUID for the request this message is responding to + */ + requestUuid: string; + /** + * Unique UUID for this collated response (generated by the bridge). + */ + responseUuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. + */ + sources?: ErrorSourceElement[]; + /** + * Timestamp at which the response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentBridgeResponsePayload { + intentResolution: IntentResolutionClass; +} + +/** + * A response message from a Desktop Agent to the Bridge. + * + * A secondary response to a request to raise an intent used to deliver the intent result + */ +export interface RaiseIntentResultAgentResponse { + meta: AgentResponseMetadata; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentResultAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentResultAgentResponsePayload { + intentResult: IntentResultClass; +} + +export interface IntentResultClass { + context?: ContextElement; + channel?: ChannelClass; +} + +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + * + * A secondary response to a request to raise an intent used to deliver the intent result + */ +export interface RaiseIntentResultBridgeResponse { + meta: RaiseIntentResultBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentResultBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentResultBridgeResponseMeta { + /** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + */ + errorDetails?: string[]; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned + * to the bridge before the timeout or because an error occurred. May be omitted if all + * sources responded without errors. MUST include the `desktopAgent` field when returned by + * the bridge. + */ + errorSources?: BridgeParticipantIdentifierElement[]; + /** + * UUID for the request this message is responding to + */ + requestUuid: string; + /** + * Unique UUID for this collated response (generated by the bridge). + */ + responseUuid: string; + /** + * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated + * responses to the request. Will contain a single value for individual responses and + * multiple values for responses that were collated by the bridge. May be omitted if all + * sources errored. MUST include the `desktopAgent` field when returned by the bridge. + */ + sources?: SourceElement[]; + /** + * Timestamp at which the response was generated + */ + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentResultBridgeResponsePayload { + intentResult: IntentResultClass; +} + +export interface Context { + id?: { [key: string]: any }; + name?: string; + type: string; + [property: string]: any; +} + +// Converts JSON strings to/from your types +// and asserts the results of JSON.parse at runtime +export class Convert { + public static toAppIdentifier(json: string): AppIdentifier { + return cast(JSON.parse(json), r('AppIdentifier')); + } + + public static appIdentifierToJson(value: AppIdentifier): string { + return JSON.stringify(uncast(value, r('AppIdentifier')), null, 2); + } + + public static toAppIntent(json: string): AppIntent { + return cast(JSON.parse(json), r('AppIntent')); + } public static appIntentToJson(value: AppIntent): string { return JSON.stringify(uncast(value, r('AppIntent')), null, 2); @@ -1586,308 +2771,518 @@ export class Convert { return JSON.stringify(uncast(value, r('AppMetadata')), null, 2); } - public static toBaseImplementationMetadata(json: string): BaseImplementationMetadata { - return cast(JSON.parse(json), r('BaseImplementationMetadata')); + public static toBaseImplementationMetadata(json: string): BaseImplementationMetadata { + return cast(JSON.parse(json), r('BaseImplementationMetadata')); + } + + public static baseImplementationMetadataToJson(value: BaseImplementationMetadata): string { + return JSON.stringify(uncast(value, r('BaseImplementationMetadata')), null, 2); + } + + public static toChannel(json: string): Channel { + return cast(JSON.parse(json), r('Channel')); + } + + public static channelToJson(value: Channel): string { + return JSON.stringify(uncast(value, r('Channel')), null, 2); + } + + public static toContextMetadata(json: string): ContextMetadata { + return cast(JSON.parse(json), r('ContextMetadata')); + } + + public static contextMetadataToJson(value: ContextMetadata): string { + return JSON.stringify(uncast(value, r('ContextMetadata')), null, 2); + } + + public static toDesktopAgentIdentifier(json: string): DesktopAgentIdentifier { + return cast(JSON.parse(json), r('DesktopAgentIdentifier')); + } + + public static desktopAgentIdentifierToJson(value: DesktopAgentIdentifier): string { + return JSON.stringify(uncast(value, r('DesktopAgentIdentifier')), null, 2); + } + + public static toDisplayMetadata(json: string): DisplayMetadata { + return cast(JSON.parse(json), r('DisplayMetadata')); + } + + public static displayMetadataToJson(value: DisplayMetadata): string { + return JSON.stringify(uncast(value, r('DisplayMetadata')), null, 2); + } + + public static toSchemasAPIErrorsSchema(json: string): any { + return cast(JSON.parse(json), 'any'); + } + + public static schemasAPIErrorsSchemaToJson(value: any): string { + return JSON.stringify(uncast(value, 'any'), null, 2); + } + + public static toIcon(json: string): Icon { + return cast(JSON.parse(json), r('Icon')); + } + + public static iconToJson(value: Icon): string { + return JSON.stringify(uncast(value, r('Icon')), null, 2); + } + + public static toImage(json: string): Image { + return cast(JSON.parse(json), r('Image')); + } + + public static imageToJson(value: Image): string { + return JSON.stringify(uncast(value, r('Image')), null, 2); + } + + public static toImplementationMetadata(json: string): ImplementationMetadata { + return cast(JSON.parse(json), r('ImplementationMetadata')); + } + + public static implementationMetadataToJson(value: ImplementationMetadata): string { + return JSON.stringify(uncast(value, r('ImplementationMetadata')), null, 2); + } + + public static toIntentMetadata(json: string): IntentMetadata { + return cast(JSON.parse(json), r('IntentMetadata')); + } + + public static intentMetadataToJson(value: IntentMetadata): string { + return JSON.stringify(uncast(value, r('IntentMetadata')), null, 2); + } + + public static toIntentResolution(json: string): IntentResolution { + return cast(JSON.parse(json), r('IntentResolution')); + } + + public static intentResolutionToJson(value: IntentResolution): string { + return JSON.stringify(uncast(value, r('IntentResolution')), null, 2); + } + + public static toIntentResult(json: string): IntentResult { + return cast(JSON.parse(json), r('IntentResult')); + } + + public static intentResultToJson(value: IntentResult): string { + return JSON.stringify(uncast(value, r('IntentResult')), null, 2); + } + + public static toAgentRequestMessage(json: string): AgentRequestMessage { + return cast(JSON.parse(json), r('AgentRequestMessage')); + } + + public static agentRequestMessageToJson(value: AgentRequestMessage): string { + return JSON.stringify(uncast(value, r('AgentRequestMessage')), null, 2); + } + + public static toAgentResponseMessage(json: string): AgentResponseMessage { + return cast(JSON.parse(json), r('AgentResponseMessage')); + } + + public static agentResponseMessageToJson(value: AgentResponseMessage): string { + return JSON.stringify(uncast(value, r('AgentResponseMessage')), null, 2); + } + + public static toBridgeParticipantIdentifier(json: string): BridgeParticipantIdentifier { + return cast(JSON.parse(json), r('BridgeParticipantIdentifier')); + } + + public static bridgeParticipantIdentifierToJson(value: BridgeParticipantIdentifier): string { + return JSON.stringify(uncast(value, r('BridgeParticipantIdentifier')), null, 2); + } + + public static toBridgeRequestMessage(json: string): BridgeRequestMessage { + return cast(JSON.parse(json), r('BridgeRequestMessage')); + } + + public static bridgeRequestMessageToJson(value: BridgeRequestMessage): string { + return JSON.stringify(uncast(value, r('BridgeRequestMessage')), null, 2); + } + + public static toBridgeResponseMessage(json: string): BridgeResponseMessage { + return cast(JSON.parse(json), r('BridgeResponseMessage')); + } + + public static bridgeResponseMessageToJson(value: BridgeResponseMessage): string { + return JSON.stringify(uncast(value, r('BridgeResponseMessage')), null, 2); + } + + public static toBroadcastAgentRequest(json: string): BroadcastAgentRequest { + return cast(JSON.parse(json), r('BroadcastAgentRequest')); + } + + public static broadcastAgentRequestToJson(value: BroadcastAgentRequest): string { + return JSON.stringify(uncast(value, r('BroadcastAgentRequest')), null, 2); + } + + public static toBroadcastBridgeRequest(json: string): BroadcastBridgeRequest { + return cast(JSON.parse(json), r('BroadcastBridgeRequest')); + } + + public static broadcastBridgeRequestToJson(value: BroadcastBridgeRequest): string { + return JSON.stringify(uncast(value, r('BroadcastBridgeRequest')), null, 2); + } + + public static toConnectionStep2Hello(json: string): ConnectionStep2Hello { + return cast(JSON.parse(json), r('ConnectionStep2Hello')); + } + + public static connectionStep2HelloToJson(value: ConnectionStep2Hello): string { + return JSON.stringify(uncast(value, r('ConnectionStep2Hello')), null, 2); + } + + public static toConnectionStep3Handshake(json: string): ConnectionStep3Handshake { + return cast(JSON.parse(json), r('ConnectionStep3Handshake')); + } + + public static connectionStep3HandshakeToJson(value: ConnectionStep3Handshake): string { + return JSON.stringify(uncast(value, r('ConnectionStep3Handshake')), null, 2); + } + + public static toConnectionStep4AuthenticationFailed(json: string): ConnectionStep4AuthenticationFailed { + return cast(JSON.parse(json), r('ConnectionStep4AuthenticationFailed')); + } + + public static connectionStep4AuthenticationFailedToJson(value: ConnectionStep4AuthenticationFailed): string { + return JSON.stringify(uncast(value, r('ConnectionStep4AuthenticationFailed')), null, 2); + } + + public static toConnectionStep6ConnectedAgentsUpdate(json: string): ConnectionStep6ConnectedAgentsUpdate { + return cast(JSON.parse(json), r('ConnectionStep6ConnectedAgentsUpdate')); + } + + public static connectionStep6ConnectedAgentsUpdateToJson(value: ConnectionStep6ConnectedAgentsUpdate): string { + return JSON.stringify(uncast(value, r('ConnectionStep6ConnectedAgentsUpdate')), null, 2); + } + + public static toFindInstancesAgentRequest(json: string): FindInstancesAgentRequest { + return cast(JSON.parse(json), r('FindInstancesAgentRequest')); } - public static baseImplementationMetadataToJson(value: BaseImplementationMetadata): string { - return JSON.stringify(uncast(value, r('BaseImplementationMetadata')), null, 2); + public static findInstancesAgentRequestToJson(value: FindInstancesAgentRequest): string { + return JSON.stringify(uncast(value, r('FindInstancesAgentRequest')), null, 2); } - public static toChannel(json: string): Channel { - return cast(JSON.parse(json), r('Channel')); + public static toFindInstancesAgentResponse(json: string): FindInstancesAgentResponse { + return cast(JSON.parse(json), r('FindInstancesAgentResponse')); } - public static channelToJson(value: Channel): string { - return JSON.stringify(uncast(value, r('Channel')), null, 2); + public static findInstancesAgentResponseToJson(value: FindInstancesAgentResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesAgentResponse')), null, 2); } - public static toContextMetadata(json: string): ContextMetadata { - return cast(JSON.parse(json), r('ContextMetadata')); + public static toFindInstancesBridgeRequest(json: string): FindInstancesBridgeRequest { + return cast(JSON.parse(json), r('FindInstancesBridgeRequest')); } - public static contextMetadataToJson(value: ContextMetadata): string { - return JSON.stringify(uncast(value, r('ContextMetadata')), null, 2); + public static findInstancesBridgeRequestToJson(value: FindInstancesBridgeRequest): string { + return JSON.stringify(uncast(value, r('FindInstancesBridgeRequest')), null, 2); } - public static toDesktopAgentIdentifier(json: string): DesktopAgentIdentifier { - return cast(JSON.parse(json), r('DesktopAgentIdentifier')); + public static toFindInstancesBridgeResponse(json: string): FindInstancesBridgeResponse { + return cast(JSON.parse(json), r('FindInstancesBridgeResponse')); } - public static desktopAgentIdentifierToJson(value: DesktopAgentIdentifier): string { - return JSON.stringify(uncast(value, r('DesktopAgentIdentifier')), null, 2); + public static findInstancesBridgeResponseToJson(value: FindInstancesBridgeResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesBridgeResponse')), null, 2); } - public static toDisplayMetadata(json: string): DisplayMetadata { - return cast(JSON.parse(json), r('DisplayMetadata')); + public static toFindIntentsAgentRequest(json: string): FindIntentsAgentRequest { + return cast(JSON.parse(json), r('FindIntentsAgentRequest')); } - public static displayMetadataToJson(value: DisplayMetadata): string { - return JSON.stringify(uncast(value, r('DisplayMetadata')), null, 2); + public static findIntentsAgentRequestToJson(value: FindIntentsAgentRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsAgentRequest')), null, 2); } - public static toSchemasAPIErrorsSchema(json: string): any { - return cast(JSON.parse(json), 'any'); + public static toFindIntentAgentResponse(json: string): FindIntentAgentResponse { + return cast(JSON.parse(json), r('FindIntentAgentResponse')); } - public static schemasAPIErrorsSchemaToJson(value: any): string { - return JSON.stringify(uncast(value, 'any'), null, 2); + public static findIntentAgentResponseToJson(value: FindIntentAgentResponse): string { + return JSON.stringify(uncast(value, r('FindIntentAgentResponse')), null, 2); } - public static toIcon(json: string): Icon { - return cast(JSON.parse(json), r('Icon')); + public static toFindIntentBridgeRequest(json: string): FindIntentBridgeRequest { + return cast(JSON.parse(json), r('FindIntentBridgeRequest')); } - public static iconToJson(value: Icon): string { - return JSON.stringify(uncast(value, r('Icon')), null, 2); + public static findIntentBridgeRequestToJson(value: FindIntentBridgeRequest): string { + return JSON.stringify(uncast(value, r('FindIntentBridgeRequest')), null, 2); } - public static toImage(json: string): Image { - return cast(JSON.parse(json), r('Image')); + public static toFindIntentBridgeResponse(json: string): FindIntentBridgeResponse { + return cast(JSON.parse(json), r('FindIntentBridgeResponse')); } - public static imageToJson(value: Image): string { - return JSON.stringify(uncast(value, r('Image')), null, 2); + public static findIntentBridgeResponseToJson(value: FindIntentBridgeResponse): string { + return JSON.stringify(uncast(value, r('FindIntentBridgeResponse')), null, 2); } - public static toImplementationMetadata(json: string): ImplementationMetadata { - return cast(JSON.parse(json), r('ImplementationMetadata')); + public static toFindIntentsByContextAgentRequest(json: string): FindIntentsByContextAgentRequest { + return cast(JSON.parse(json), r('FindIntentsByContextAgentRequest')); } - public static implementationMetadataToJson(value: ImplementationMetadata): string { - return JSON.stringify(uncast(value, r('ImplementationMetadata')), null, 2); + public static findIntentsByContextAgentRequestToJson(value: FindIntentsByContextAgentRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextAgentRequest')), null, 2); } - public static toIntentMetadata(json: string): IntentMetadata { - return cast(JSON.parse(json), r('IntentMetadata')); + public static toFindIntentsByContextAgentResponse(json: string): FindIntentsByContextAgentResponse { + return cast(JSON.parse(json), r('FindIntentsByContextAgentResponse')); } - public static intentMetadataToJson(value: IntentMetadata): string { - return JSON.stringify(uncast(value, r('IntentMetadata')), null, 2); + public static findIntentsByContextAgentResponseToJson(value: FindIntentsByContextAgentResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextAgentResponse')), null, 2); } - public static toIntentResolution(json: string): IntentResolution { - return cast(JSON.parse(json), r('IntentResolution')); + public static toFindIntentsByContextBridgeRequest(json: string): FindIntentsByContextBridgeRequest { + return cast(JSON.parse(json), r('FindIntentsByContextBridgeRequest')); } - public static intentResolutionToJson(value: IntentResolution): string { - return JSON.stringify(uncast(value, r('IntentResolution')), null, 2); + public static findIntentsByContextBridgeRequestToJson(value: FindIntentsByContextBridgeRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextBridgeRequest')), null, 2); } - public static toIntentResult(json: string): IntentResult { - return cast(JSON.parse(json), r('IntentResult')); + public static toFindIntentsByContextBridgeResponse(json: string): FindIntentsByContextBridgeResponse { + return cast(JSON.parse(json), r('FindIntentsByContextBridgeResponse')); } - public static intentResultToJson(value: IntentResult): string { - return JSON.stringify(uncast(value, r('IntentResult')), null, 2); + public static findIntentsByContextBridgeResponseToJson(value: FindIntentsByContextBridgeResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextBridgeResponse')), null, 2); } - public static toBridgeRequest(json: string): BridgeRequest { - return cast(JSON.parse(json), r('BridgeRequest')); + public static toGetAppMetadataAgentRequest(json: string): GetAppMetadataAgentRequest { + return cast(JSON.parse(json), r('GetAppMetadataAgentRequest')); } - public static bridgeRequestToJson(value: BridgeRequest): string { - return JSON.stringify(uncast(value, r('BridgeRequest')), null, 2); + public static getAppMetadataAgentRequestToJson(value: GetAppMetadataAgentRequest): string { + return JSON.stringify(uncast(value, r('GetAppMetadataAgentRequest')), null, 2); } - public static toBridgeResponse(json: string): BridgeResponse { - return cast(JSON.parse(json), r('BridgeResponse')); + public static toGetAppMetadataAgentResponse(json: string): GetAppMetadataAgentResponse { + return cast(JSON.parse(json), r('GetAppMetadataAgentResponse')); } - public static bridgeResponseToJson(value: BridgeResponse): string { - return JSON.stringify(uncast(value, r('BridgeResponse')), null, 2); + public static getAppMetadataAgentResponseToJson(value: GetAppMetadataAgentResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataAgentResponse')), null, 2); } - public static toBroadcastRequest(json: string): BroadcastRequest { - return cast(JSON.parse(json), r('BroadcastRequest')); + public static toGetAppMetadataBridgeRequest(json: string): GetAppMetadataBridgeRequest { + return cast(JSON.parse(json), r('GetAppMetadataBridgeRequest')); } - public static broadcastRequestToJson(value: BroadcastRequest): string { - return JSON.stringify(uncast(value, r('BroadcastRequest')), null, 2); + public static getAppMetadataBridgeRequestToJson(value: GetAppMetadataBridgeRequest): string { + return JSON.stringify(uncast(value, r('GetAppMetadataBridgeRequest')), null, 2); } - public static toConnectionStep2Hello(json: string): ConnectionStep2Hello { - return cast(JSON.parse(json), r('ConnectionStep2Hello')); + public static toGetAppMetadataBridgeResponse(json: string): GetAppMetadataBridgeResponse { + return cast(JSON.parse(json), r('GetAppMetadataBridgeResponse')); } - public static connectionStep2HelloToJson(value: ConnectionStep2Hello): string { - return JSON.stringify(uncast(value, r('ConnectionStep2Hello')), null, 2); + public static getAppMetadataBridgeResponseToJson(value: GetAppMetadataBridgeResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataBridgeResponse')), null, 2); } - public static toConnectionStep3Handshake(json: string): ConnectionStep3Handshake { - return cast(JSON.parse(json), r('ConnectionStep3Handshake')); + public static toOpenAgentRequest(json: string): OpenAgentRequest { + return cast(JSON.parse(json), r('OpenAgentRequest')); } - public static connectionStep3HandshakeToJson(value: ConnectionStep3Handshake): string { - return JSON.stringify(uncast(value, r('ConnectionStep3Handshake')), null, 2); + public static openAgentRequestToJson(value: OpenAgentRequest): string { + return JSON.stringify(uncast(value, r('OpenAgentRequest')), null, 2); } - public static toConnectionStep4AuthenticationFailed(json: string): ConnectionStep4AuthenticationFailed { - return cast(JSON.parse(json), r('ConnectionStep4AuthenticationFailed')); + public static toOpenAgentResponse(json: string): OpenAgentResponse { + return cast(JSON.parse(json), r('OpenAgentResponse')); } - public static connectionStep4AuthenticationFailedToJson(value: ConnectionStep4AuthenticationFailed): string { - return JSON.stringify(uncast(value, r('ConnectionStep4AuthenticationFailed')), null, 2); + public static openAgentResponseToJson(value: OpenAgentResponse): string { + return JSON.stringify(uncast(value, r('OpenAgentResponse')), null, 2); } - public static toConnectionStep6ConnectedAgentsUpdate(json: string): ConnectionStep6ConnectedAgentsUpdate { - return cast(JSON.parse(json), r('ConnectionStep6ConnectedAgentsUpdate')); + public static toOpenBridgeRequest(json: string): OpenBridgeRequest { + return cast(JSON.parse(json), r('OpenBridgeRequest')); } - public static connectionStep6ConnectedAgentsUpdateToJson(value: ConnectionStep6ConnectedAgentsUpdate): string { - return JSON.stringify(uncast(value, r('ConnectionStep6ConnectedAgentsUpdate')), null, 2); + public static openBridgeRequestToJson(value: OpenBridgeRequest): string { + return JSON.stringify(uncast(value, r('OpenBridgeRequest')), null, 2); } - public static toFindInstancesRequest(json: string): FindInstancesRequest { - return cast(JSON.parse(json), r('FindInstancesRequest')); + public static toOpenBridgeResponse(json: string): OpenBridgeResponse { + return cast(JSON.parse(json), r('OpenBridgeResponse')); } - public static findInstancesRequestToJson(value: FindInstancesRequest): string { - return JSON.stringify(uncast(value, r('FindInstancesRequest')), null, 2); + public static openBridgeResponseToJson(value: OpenBridgeResponse): string { + return JSON.stringify(uncast(value, r('OpenBridgeResponse')), null, 2); } - public static toFindInstancesResponse(json: string): FindInstancesResponse { - return cast(JSON.parse(json), r('FindInstancesResponse')); + public static toPrivateChannelBroadcastAgentRequest(json: string): PrivateChannelBroadcastAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelBroadcastAgentRequest')); } - public static findInstancesResponseToJson(value: FindInstancesResponse): string { - return JSON.stringify(uncast(value, r('FindInstancesResponse')), null, 2); + public static privateChannelBroadcastAgentRequestToJson(value: PrivateChannelBroadcastAgentRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelBroadcastAgentRequest')), null, 2); } - public static toFindIntentRequest(json: string): FindIntentRequest { - return cast(JSON.parse(json), r('FindIntentRequest')); + public static toPrivateChannelBroadcastBridgeRequest(json: string): PrivateChannelBroadcastBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelBroadcastBridgeRequest')); } - public static findIntentRequestToJson(value: FindIntentRequest): string { - return JSON.stringify(uncast(value, r('FindIntentRequest')), null, 2); + public static privateChannelBroadcastBridgeRequestToJson(value: PrivateChannelBroadcastBridgeRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelBroadcastBridgeRequest')), null, 2); } - public static toFindIntentResponse(json: string): FindIntentResponse { - return cast(JSON.parse(json), r('FindIntentResponse')); + public static toPrivateChannelEventListenerAddedAgentRequest( + json: string + ): PrivateChannelEventListenerAddedAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerAddedAgentRequest')); } - public static findIntentResponseToJson(value: FindIntentResponse): string { - return JSON.stringify(uncast(value, r('FindIntentResponse')), null, 2); + public static privateChannelEventListenerAddedAgentRequestToJson( + value: PrivateChannelEventListenerAddedAgentRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerAddedAgentRequest')), null, 2); } - public static toFindIntentsByContextRequest(json: string): FindIntentsByContextRequest { - return cast(JSON.parse(json), r('FindIntentsByContextRequest')); + public static toPrivateChannelEventListenerAddedBridgeRequest( + json: string + ): PrivateChannelEventListenerAddedBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerAddedBridgeRequest')); } - public static findIntentsByContextRequestToJson(value: FindIntentsByContextRequest): string { - return JSON.stringify(uncast(value, r('FindIntentsByContextRequest')), null, 2); + public static privateChannelEventListenerAddedBridgeRequestToJson( + value: PrivateChannelEventListenerAddedBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerAddedBridgeRequest')), null, 2); } - public static toFindIntentsByContextResponse(json: string): FindIntentsByContextResponse { - return cast(JSON.parse(json), r('FindIntentsByContextResponse')); + public static toPrivateChannelEventListenerRemovedAgentRequest( + json: string + ): PrivateChannelEventListenerRemovedAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerRemovedAgentRequest')); } - public static findIntentsByContextResponseToJson(value: FindIntentsByContextResponse): string { - return JSON.stringify(uncast(value, r('FindIntentsByContextResponse')), null, 2); + public static privateChannelEventListenerRemovedAgentRequestToJson( + value: PrivateChannelEventListenerRemovedAgentRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerRemovedAgentRequest')), null, 2); } - public static toGetAppMetadataRequest(json: string): GetAppMetadataRequest { - return cast(JSON.parse(json), r('GetAppMetadataRequest')); + public static toPrivateChannelEventListenerRemovedBridgeRequest( + json: string + ): PrivateChannelEventListenerRemovedBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerRemovedBridgeRequest')); } - public static getAppMetadataRequestToJson(value: GetAppMetadataRequest): string { - return JSON.stringify(uncast(value, r('GetAppMetadataRequest')), null, 2); + public static privateChannelEventListenerRemovedBridgeRequestToJson( + value: PrivateChannelEventListenerRemovedBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerRemovedBridgeRequest')), null, 2); } - public static toGetAppMetadataResponse(json: string): GetAppMetadataResponse { - return cast(JSON.parse(json), r('GetAppMetadataResponse')); + public static toPrivateChannelOnAddContextListenerAgentRequest( + json: string + ): PrivateChannelOnAddContextListenerAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelOnAddContextListenerAgentRequest')); } - public static getAppMetadataResponseToJson(value: GetAppMetadataResponse): string { - return JSON.stringify(uncast(value, r('GetAppMetadataResponse')), null, 2); + public static privateChannelOnAddContextListenerAgentRequestToJson( + value: PrivateChannelOnAddContextListenerAgentRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnAddContextListenerAgentRequest')), null, 2); } - public static toOpenRequest(json: string): OpenRequest { - return cast(JSON.parse(json), r('OpenRequest')); + public static toPrivateChannelOnAddContextListenerBridgeRequest( + json: string + ): PrivateChannelOnAddContextListenerBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelOnAddContextListenerBridgeRequest')); } - public static openRequestToJson(value: OpenRequest): string { - return JSON.stringify(uncast(value, r('OpenRequest')), null, 2); + public static privateChannelOnAddContextListenerBridgeRequestToJson( + value: PrivateChannelOnAddContextListenerBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnAddContextListenerBridgeRequest')), null, 2); } - public static toOpenResponse(json: string): OpenResponse { - return cast(JSON.parse(json), r('OpenResponse')); + public static toPrivateChannelOnDisconnectAgentRequest(json: string): PrivateChannelOnDisconnectAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelOnDisconnectAgentRequest')); } - public static openResponseToJson(value: OpenResponse): string { - return JSON.stringify(uncast(value, r('OpenResponse')), null, 2); + public static privateChannelOnDisconnectAgentRequestToJson(value: PrivateChannelOnDisconnectAgentRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnDisconnectAgentRequest')), null, 2); } - public static toPrivateChannelBroadcast(json: string): PrivateChannelBroadcast { - return cast(JSON.parse(json), r('PrivateChannelBroadcast')); + public static toPrivateChannelOnDisconnectBridgeRequest(json: string): PrivateChannelOnDisconnectBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelOnDisconnectBridgeRequest')); } - public static privateChannelBroadcastToJson(value: PrivateChannelBroadcast): string { - return JSON.stringify(uncast(value, r('PrivateChannelBroadcast')), null, 2); + public static privateChannelOnDisconnectBridgeRequestToJson(value: PrivateChannelOnDisconnectBridgeRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnDisconnectBridgeRequest')), null, 2); } - public static toPrivateChannelEventListenerAdded(json: string): PrivateChannelEventListenerAdded { - return cast(JSON.parse(json), r('PrivateChannelEventListenerAdded')); + public static toPrivateChannelOnUnsubscribeAgentRequest(json: string): PrivateChannelOnUnsubscribeAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelOnUnsubscribeAgentRequest')); } - public static privateChannelEventListenerAddedToJson(value: PrivateChannelEventListenerAdded): string { - return JSON.stringify(uncast(value, r('PrivateChannelEventListenerAdded')), null, 2); + public static privateChannelOnUnsubscribeAgentRequestToJson(value: PrivateChannelOnUnsubscribeAgentRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribeAgentRequest')), null, 2); } - public static toPrivateChannelEventListenerRemoved(json: string): PrivateChannelEventListenerRemoved { - return cast(JSON.parse(json), r('PrivateChannelEventListenerRemoved')); + public static toPrivateChannelOnUnsubscribeBridgeRequest(json: string): PrivateChannelOnUnsubscribeBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelOnUnsubscribeBridgeRequest')); } - public static privateChannelEventListenerRemovedToJson(value: PrivateChannelEventListenerRemoved): string { - return JSON.stringify(uncast(value, r('PrivateChannelEventListenerRemoved')), null, 2); + public static privateChannelOnUnsubscribeBridgeRequestToJson( + value: PrivateChannelOnUnsubscribeBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribeBridgeRequest')), null, 2); } - public static toPrivateChannelOnAddContextListener(json: string): PrivateChannelOnAddContextListener { - return cast(JSON.parse(json), r('PrivateChannelOnAddContextListener')); + public static toRaiseIntentAgentRequest(json: string): RaiseIntentAgentRequest { + return cast(JSON.parse(json), r('RaiseIntentAgentRequest')); } - public static privateChannelOnAddContextListenerToJson(value: PrivateChannelOnAddContextListener): string { - return JSON.stringify(uncast(value, r('PrivateChannelOnAddContextListener')), null, 2); + public static raiseIntentAgentRequestToJson(value: RaiseIntentAgentRequest): string { + return JSON.stringify(uncast(value, r('RaiseIntentAgentRequest')), null, 2); } - public static toPrivateChannelOnDisconnect(json: string): PrivateChannelOnDisconnect { - return cast(JSON.parse(json), r('PrivateChannelOnDisconnect')); + public static toRaiseIntentAgentResponse(json: string): RaiseIntentAgentResponse { + return cast(JSON.parse(json), r('RaiseIntentAgentResponse')); } - public static privateChannelOnDisconnectToJson(value: PrivateChannelOnDisconnect): string { - return JSON.stringify(uncast(value, r('PrivateChannelOnDisconnect')), null, 2); + public static raiseIntentAgentResponseToJson(value: RaiseIntentAgentResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentAgentResponse')), null, 2); } - public static toPrivateChannelOnUnsubscribe(json: string): PrivateChannelOnUnsubscribe { - return cast(JSON.parse(json), r('PrivateChannelOnUnsubscribe')); + public static toRaiseIntentBridgeRequest(json: string): RaiseIntentBridgeRequest { + return cast(JSON.parse(json), r('RaiseIntentBridgeRequest')); } - public static privateChannelOnUnsubscribeToJson(value: PrivateChannelOnUnsubscribe): string { - return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribe')), null, 2); + public static raiseIntentBridgeRequestToJson(value: RaiseIntentBridgeRequest): string { + return JSON.stringify(uncast(value, r('RaiseIntentBridgeRequest')), null, 2); } - public static toRaiseIntentRequest(json: string): RaiseIntentRequest { - return cast(JSON.parse(json), r('RaiseIntentRequest')); + public static toRaiseIntentBridgeResponse(json: string): RaiseIntentBridgeResponse { + return cast(JSON.parse(json), r('RaiseIntentBridgeResponse')); } - public static raiseIntentRequestToJson(value: RaiseIntentRequest): string { - return JSON.stringify(uncast(value, r('RaiseIntentRequest')), null, 2); + public static raiseIntentBridgeResponseToJson(value: RaiseIntentBridgeResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentBridgeResponse')), null, 2); } - public static toRaiseIntentResponse(json: string): RaiseIntentResponse { - return cast(JSON.parse(json), r('RaiseIntentResponse')); + public static toRaiseIntentResultAgentResponse(json: string): RaiseIntentResultAgentResponse { + return cast(JSON.parse(json), r('RaiseIntentResultAgentResponse')); } - public static raiseIntentResponseToJson(value: RaiseIntentResponse): string { - return JSON.stringify(uncast(value, r('RaiseIntentResponse')), null, 2); + public static raiseIntentResultAgentResponseToJson(value: RaiseIntentResultAgentResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultAgentResponse')), null, 2); } - public static toRaiseIntentResultResponse(json: string): RaiseIntentResultResponse { - return cast(JSON.parse(json), r('RaiseIntentResultResponse')); + public static toRaiseIntentResultBridgeResponse(json: string): RaiseIntentResultBridgeResponse { + return cast(JSON.parse(json), r('RaiseIntentResultBridgeResponse')); } - public static raiseIntentResultResponseToJson(value: RaiseIntentResultResponse): string { - return JSON.stringify(uncast(value, r('RaiseIntentResultResponse')), null, 2); + public static raiseIntentResultBridgeResponseToJson(value: RaiseIntentResultBridgeResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultBridgeResponse')), null, 2); } public static toContext(json: string): Context { @@ -2068,750 +3463,1147 @@ function r(name: string) { const typeMap: any = { AppIdentifier: o( [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + false + ), + AppIntent: o( + [ + { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, + { json: 'intent', js: 'intent', typ: r('IntentClass') }, + ], + false + ), + AppMetadataElement: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + false + ), + IntentClass: o( + [ + { json: 'displayName', js: 'displayName', typ: '' }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + AppMetadata: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + false + ), + BaseImplementationMetadata: o( + [ + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('BaseImplementationMetadataOptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + BaseImplementationMetadataOptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), + Channel: o( + [ + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, + { json: 'id', js: 'id', typ: '' }, + { json: 'type', js: 'type', typ: r('Type') }, + ], + false + ), + DisplayMetadataClass: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + ContextMetadata: o([{ json: 'source', js: 'source', typ: r('SourceElement') }], false), + SourceElement: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + false + ), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), + DisplayMetadata: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + Icon: o( + [ + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + Image: o( + [ + { json: 'label', js: 'label', typ: u(undefined, '') }, + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + ImplementationMetadata: o( + [ + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + ImplementationMetadataOptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), + IntentMetadata: o( + [ + { json: 'displayName', js: 'displayName', typ: '' }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + IntentResolution: o( + [ + { json: 'intent', js: 'intent', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceElement') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + IntentResult: o( + [ + { json: 'id', js: 'id', typ: u(undefined, u(m('any'), '')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, + ], + 'any' + ), + AgentRequestMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentRequestMessageMeta') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + AgentRequestMessageMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BridgeParticipantIdentifierElement: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + SourceIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + AgentResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + AgentResponseMetadata: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BridgeParticipantIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + BridgeRequestMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('BridgeRequestMessageMeta') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BridgeRequestMessageMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('BridgeParticipantIdentifierElement') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], - 'any' + false ), - AppIntent: o( + BridgeResponseMessage: o( [ - { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, - { json: 'intent', js: 'intent', typ: r('IntentClass') }, + { json: 'meta', js: 'meta', typ: r('BridgeResponseMessageMeta') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - AppMetadataElement: o( + BridgeResponseMessageMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BroadcastAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastAgentRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BroadcastAgentRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + SourceClass: o( [ { json: 'appId', js: 'appId', typ: '' }, - { json: 'description', js: 'description', typ: u(undefined, '') }, { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'icons', js: 'icons', typ: u(undefined, a(r('IconElement'))) }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - { json: 'instanceMetadata', js: 'instanceMetadata', typ: u(undefined, m('any')) }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - { json: 'resultType', js: 'resultType', typ: u(undefined, u(null, '')) }, - { json: 'screenshots', js: 'screenshots', typ: u(undefined, a(r('ScreenshotElement'))) }, - { json: 'title', js: 'title', typ: u(undefined, '') }, - { json: 'tooltip', js: 'tooltip', typ: u(undefined, '') }, - { json: 'version', js: 'version', typ: u(undefined, '') }, ], false ), - IconElement: o( + BroadcastAgentRequestPayload: o( [ - { json: 'size', js: 'size', typ: u(undefined, '') }, - { json: 'src', js: 'src', typ: '' }, - { json: 'type', js: 'type', typ: u(undefined, '') }, + { json: 'channel', js: 'channel', typ: r('ChannelClass') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), - ScreenshotElement: o( + ChannelClass: o( [ - { json: 'label', js: 'label', typ: u(undefined, '') }, - { json: 'size', js: 'size', typ: u(undefined, '') }, - { json: 'src', js: 'src', typ: '' }, - { json: 'type', js: 'type', typ: u(undefined, '') }, + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, + { json: 'id', js: 'id', typ: '' }, + { json: 'type', js: 'type', typ: r('Type') }, ], false ), - IntentClass: o( + ContextElement: o( [ - { json: 'displayName', js: 'displayName', typ: '' }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + ], + 'any' + ), + BroadcastBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - AppMetadata: o( + BroadcastBridgeRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + DestinationClass: o( [ { json: 'appId', js: 'appId', typ: '' }, - { json: 'description', js: 'description', typ: u(undefined, '') }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'icons', js: 'icons', typ: u(undefined, a(r('IconElement'))) }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - { json: 'instanceMetadata', js: 'instanceMetadata', typ: u(undefined, m('any')) }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - { json: 'resultType', js: 'resultType', typ: u(undefined, u(null, '')) }, - { json: 'screenshots', js: 'screenshots', typ: u(undefined, a(r('ScreenshotElement'))) }, - { json: 'title', js: 'title', typ: u(undefined, '') }, - { json: 'tooltip', js: 'tooltip', typ: u(undefined, '') }, - { json: 'version', js: 'version', typ: u(undefined, '') }, ], false ), - BaseImplementationMetadata: o( + BroadcastBridgeRequestPayload: o( + [ + { json: 'channel', js: 'channel', typ: r('ChannelClass') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, + ], + false + ), + ConnectionStep2Hello: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep2HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep2HelloPayload') }, + { json: 'type', js: 'type', typ: 'any' }, + ], + false + ), + ConnectionStep2HelloMeta: o([{ json: 'timestamp', js: 'timestamp', typ: Date }], false), + ConnectionStep2HelloPayload: o( + [ + { json: 'authRequired', js: 'authRequired', typ: true }, + { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, + { json: 'desktopAgentBridgeVersion', js: 'desktopAgentBridgeVersion', typ: '' }, + { json: 'supportedFDC3Versions', js: 'supportedFDC3Versions', typ: a('') }, + ], + false + ), + ConnectionStep3Handshake: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep3HandshakeMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep3HandshakePayload') }, + { json: 'type', js: 'type', typ: 'any' }, + ], + false + ), + ConnectionStep3HandshakeMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep3HandshakePayload: o( + [ + { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, + { json: 'channelsState', js: 'channelsState', typ: m(a(r('ContextElement'))) }, + { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadataClass') }, + { json: 'requestedName', js: 'requestedName', typ: '' }, + ], + false + ), + ImplementationMetadataClass: o( [ { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('BaseImplementationMetadataOptionalFeatures') }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, { json: 'provider', js: 'provider', typ: '' }, { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, ], false ), - BaseImplementationMetadataOptionalFeatures: o( + ConnectionStep4AuthenticationFailed: o( [ - { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, - { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, - { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + { json: 'meta', js: 'meta', typ: r('ConnectionStep4AuthenticationFailedMeta') }, + { json: 'payload', js: 'payload', typ: u(undefined, r('ConnectionStep4AuthenticationFailedPayload')) }, + { json: 'type', js: 'type', typ: 'any' }, ], false ), - Channel: o( + ConnectionStep4AuthenticationFailedMeta: o( [ - { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, - { json: 'id', js: 'id', typ: '' }, - { json: 'type', js: 'type', typ: r('Type') }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - DisplayMetadataClass: o( + ConnectionStep4AuthenticationFailedPayload: o([{ json: 'message', js: 'message', typ: u(undefined, '') }], false), + ConnectionStep6ConnectedAgentsUpdate: o( [ - { json: 'color', js: 'color', typ: u(undefined, '') }, - { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, - { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('ConnectionStep6ConnectedAgentsUpdateMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep6ConnectedAgentsUpdatePayload') }, + { json: 'type', js: 'type', typ: 'any' }, ], false ), - ContextMetadata: o([{ json: 'source', js: 'source', typ: r('SourceElement') }], false), - SourceElement: o( + ConnectionStep6ConnectedAgentsUpdateMeta: o( [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep6ConnectedAgentsUpdatePayload: o( + [ + { json: 'addAgent', js: 'addAgent', typ: u(undefined, '') }, + { json: 'allAgents', js: 'allAgents', typ: a(r('ImplementationMetadataElement')) }, + { json: 'channelsState', js: 'channelsState', typ: u(undefined, m(a(r('ContextElement')))) }, + { json: 'removeAgent', js: 'removeAgent', typ: u(undefined, '') }, + ], + false + ), + ImplementationMetadataElement: o( + [ + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + FindInstancesAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesAgentRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindInstancesAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + DestinationObject: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], 'any' ), - DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), - DisplayMetadata: o( + FindInstancesAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + FindInstancesAgentResponse: o( [ - { json: 'color', js: 'color', typ: u(undefined, '') }, - { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, - { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesAgentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - Icon: o( + FindInstancesAgentResponsePayload: o( + [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadataElement')) }], + false + ), + FindInstancesBridgeRequest: o( [ - { json: 'size', js: 'size', typ: u(undefined, '') }, - { json: 'src', js: 'src', typ: '' }, - { json: 'type', js: 'type', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('FindInstancesBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - Image: o( + FindInstancesBridgeRequestMeta: o( [ - { json: 'label', js: 'label', typ: u(undefined, '') }, - { json: 'size', js: 'size', typ: u(undefined, '') }, - { json: 'src', js: 'src', typ: '' }, - { json: 'type', js: 'type', typ: u(undefined, '') }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ImplementationMetadata: o( + FindInstancesBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + FindInstancesBridgeResponse: o( [ - { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, - { json: 'provider', js: 'provider', typ: '' }, - { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('FindInstancesBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - ImplementationMetadataOptionalFeatures: o( + FindInstancesBridgeResponseMeta: o( [ - { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, - { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, - { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - IntentMetadata: o( + ErrorSourceElement: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), + FindInstancesBridgeResponsePayload: o( + [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadataElement')) }], + false + ), + FindIntentsAgentRequest: o( [ - { json: 'displayName', js: 'displayName', typ: '' }, - { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('EntRequestMetadata') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsAgentRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - IntentResolution: o( + EntRequestMetadata: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsAgentRequestPayload: o( [ + { json: 'context', js: 'context', typ: r('ContextElement') }, { json: 'intent', js: 'intent', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceElement') }, - { json: 'version', js: 'version', typ: u(undefined, '') }, ], false ), - IntentResult: o( + FindIntentAgentResponse: o( [ - { json: 'id', js: 'id', typ: u(undefined, u(m('any'), '')) }, - { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('FindIntentAgentResponsePayload') }, { json: 'type', js: 'type', typ: '' }, - { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, ], - 'any' + false + ), + FindIntentAgentResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntentElement') }], false), + AppIntentElement: o( + [ + { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, + { json: 'intent', js: 'intent', typ: r('IntentClass') }, + ], + false ), - BridgeRequest: o( + FindIntentBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('MetaObject') }, - { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'meta', js: 'meta', typ: r('FindIntentBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - MetaObject: o( + FindIntentBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationElement')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationElement') }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], - 'any' + false ), - DestinationElement: o( + FindIntentBridgeRequestPayload: o( [ - { json: 'appId', js: 'appId', typ: u(undefined, '') }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'intent', js: 'intent', typ: '' }, ], - 'any' + false ), - BridgeResponse: o( + FindIntentBridgeResponse: o( [ - { json: 'meta', js: 'meta', typ: r('BridgeResponseMeta') }, - { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'meta', js: 'meta', typ: r('FindIntentBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentBridgeResponsePayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - BridgeResponseMeta: o( + FindIntentBridgeResponseMeta: o( [ - { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('DestinationElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - BroadcastRequest: o( + FindIntentBridgeResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntentElement') }], false), + FindIntentsByContextAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('BroadcastRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('BroadcastRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - BroadcastRequestMeta: o( + FindIntentsByContextAgentRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PurpleIdentifier: o( + FindIntentsByContextAgentRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextElement') }], false), + FindIntentsByContextAgentResponse: o( [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, ], - 'any' + false + ), + FindIntentsByContextAgentResponsePayload: o( + [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntentElement')) }], + false ), - BroadcastRequestPayload: o( + FindIntentsByContextBridgeRequest: o( [ - { json: 'channel', js: 'channel', typ: r('ChannelClass') }, - { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - ChannelClass: o( + FindIntentsByContextBridgeRequestMeta: o( [ - { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, - { json: 'id', js: 'id', typ: '' }, - { json: 'type', js: 'type', typ: r('Type') }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ContextElement: o( + FindIntentsByContextBridgeRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextElement') }], false), + FindIntentsByContextBridgeResponse: o( [ - { json: 'id', js: 'id', typ: u(undefined, m('any')) }, - { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('ResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextBridgeResponsePayload') }, { json: 'type', js: 'type', typ: '' }, ], - 'any' + false ), - ConnectionStep2Hello: o( + ResponseMetadata: o( [ - { json: 'meta', js: 'meta', typ: r('ConnectionStep2HelloMeta') }, - { json: 'payload', js: 'payload', typ: r('ConnectionStep2HelloPayload') }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ConnectionStep2HelloMeta: o([{ json: 'timestamp', js: 'timestamp', typ: Date }], false), - ConnectionStep2HelloPayload: o( - [ - { json: 'authRequired', js: 'authRequired', typ: true }, - { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, - { json: 'desktopAgentBridgeVersion', js: 'desktopAgentBridgeVersion', typ: '' }, - { json: 'supportedFDC3Versions', js: 'supportedFDC3Versions', typ: a('') }, - ], + FindIntentsByContextBridgeResponsePayload: o( + [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntentElement')) }], false ), - ConnectionStep3Handshake: o( + GetAppMetadataAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('ConnectionStep3HandshakeMeta') }, - { json: 'payload', js: 'payload', typ: r('ConnectionStep3HandshakePayload') }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - ConnectionStep3HandshakeMeta: o( + GetAppMetadataAgentRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ConnectionStep3HandshakePayload: o( + GetAppMetadataAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + GetAppMetadataAgentResponse: o( [ - { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, - { json: 'channelsState', js: 'channelsState', typ: m(a(r('ContextElement'))) }, - { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadataClass') }, - { json: 'requestedName', js: 'requestedName', typ: '' }, + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - ImplementationMetadataClass: o( + GetAppMetadataAgentResponsePayload: o( + [{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }], + false + ), + GetAppMetadataBridgeRequest: o( [ - { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, - { json: 'provider', js: 'provider', typ: '' }, - { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - ConnectionStep4AuthenticationFailed: o( + GetAppMetadataBridgeRequestMeta: o( [ - { json: 'meta', js: 'meta', typ: r('ConnectionStep4AuthenticationFailedMeta') }, - { json: 'payload', js: 'payload', typ: u(undefined, r('ConnectionStep4AuthenticationFailedPayload')) }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ConnectionStep4AuthenticationFailedMeta: o( + GetAppMetadataBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + GetAppMetadataBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + GetAppMetadataBridgeResponseMeta: o( [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ConnectionStep4AuthenticationFailedPayload: o([{ json: 'message', js: 'message', typ: u(undefined, '') }], false), - ConnectionStep6ConnectedAgentsUpdate: o( + GetAppMetadataBridgeResponsePayload: o( + [{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }], + false + ), + OpenAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('ConnectionStep6ConnectedAgentsUpdateMeta') }, - { json: 'payload', js: 'payload', typ: r('ConnectionStep6ConnectedAgentsUpdatePayload') }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'meta', js: 'meta', typ: r('OpenAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenAgentRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - ConnectionStep6ConnectedAgentsUpdateMeta: o( + OpenAgentRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ConnectionStep6ConnectedAgentsUpdatePayload: o( + OpenAgentRequestPayload: o( [ - { json: 'addAgent', js: 'addAgent', typ: u(undefined, '') }, - { json: 'allAgents', js: 'allAgents', typ: a(r('ImplementationMetadataElement')) }, - { json: 'channelsState', js: 'channelsState', typ: u(undefined, m(a(r('ContextElement')))) }, - { json: 'removeAgent', js: 'removeAgent', typ: u(undefined, '') }, + { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, ], false ), - ImplementationMetadataElement: o( + OpenAgentResponse: o( [ - { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, - { json: 'provider', js: 'provider', typ: '' }, - { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('OpenAgentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - FindInstancesRequest: o( + OpenAgentResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('SourceElement') }], false), + OpenBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('FindInstancesRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('FindInstancesRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('OpenBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindInstancesRequestMeta: o( + OpenBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - DestinationClass: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), - FindInstancesRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), - FindInstancesResponse: o( + OpenBridgeRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, + ], + false + ), + OpenBridgeResponse: o( [ - { json: 'meta', js: 'meta', typ: r('FindInstancesResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('FindInstancesResponsePayload') }, + { json: 'meta', js: 'meta', typ: r('OpenBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenBridgeResponsePayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindInstancesResponseMeta: o( + OpenBridgeResponseMeta: o( [ - { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ErrorSourceElement: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), - FindInstancesResponsePayload: o( - [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadataElement')) }], - false - ), - FindIntentRequest: o( + OpenBridgeResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('SourceElement') }], false), + PrivateChannelBroadcastAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('FindIntentRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('FindIntentRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelBroadcastAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelBroadcastAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindIntentRequestMeta: o( + PrivateChannelBroadcastAgentRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - FindIntentRequestPayload: o( + PrivateChannelBroadcastAgentRequestPayload: o( [ - { json: 'context', js: 'context', typ: r('ContextElement') }, - { json: 'intent', js: 'intent', typ: '' }, + { json: 'channel', js: 'channel', typ: '' }, + { json: 'context', js: 'context', typ: '' }, ], false ), - FindIntentResponse: o( + PrivateChannelBroadcastBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('FindIntentResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('FindIntentResponsePayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelBroadcastBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelBroadcastBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindIntentResponseMeta: o( + PrivateChannelBroadcastBridgeRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), - FindIntentResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntentElement') }], false), - AppIntentElement: o( + PrivateChannelBroadcastBridgeRequestPayload: o( [ - { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, - { json: 'intent', js: 'intent', typ: r('IntentClass') }, + { json: 'channel', js: 'channel', typ: '' }, + { json: 'context', js: 'context', typ: '' }, ], false ), - FindIntentsByContextRequest: o( + PrivateChannelEventListenerAddedAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('FindIntentsByContextRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('FindIntentsByContextRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerAddedAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerAddedAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindIntentsByContextRequestMeta: o( + PrivateChannelEventListenerAddedAgentRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - FindIntentsByContextRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextElement') }], false), - FindIntentsByContextResponse: o( + PrivateChannelEventListenerAddedAgentRequestPayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'context', js: 'context', typ: '' }, + ], + false + ), + PrivateChannelEventListenerAddedBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('FindIntentsByContextResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('FindIntentsByContextResponsePayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerAddedBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerAddedBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - FindIntentsByContextResponseMeta: o( + PrivateChannelEventListenerAddedBridgeRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), - FindIntentsByContextResponsePayload: o( - [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntentElement')) }], + PrivateChannelEventListenerAddedBridgeRequestPayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'context', js: 'context', typ: '' }, + ], false ), - GetAppMetadataRequest: o( + PrivateChannelEventListenerRemovedAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('GetAppMetadataRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('GetAppMetadataRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerRemovedAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerRemovedAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - GetAppMetadataRequestMeta: o( + PrivateChannelEventListenerRemovedAgentRequestMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - GetAppMetadataRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), - GetAppMetadataResponse: o( - [ - { json: 'meta', js: 'meta', typ: r('GetAppMetadataResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('GetAppMetadataResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, - ], - false - ), - GetAppMetadataResponseMeta: o( + PrivateChannelEventListenerRemovedAgentRequestPayload: o( [ - { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'timestamp', js: 'timestamp', typ: Date }, - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'channel', js: 'channel', typ: '' }, + { json: 'listenerType', js: 'listenerType', typ: '' }, ], false ), - GetAppMetadataResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }], false), - OpenRequest: o( + PrivateChannelEventListenerRemovedBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('OpenRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('OpenRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerRemovedBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerRemovedBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - OpenRequestMeta: o( + PrivateChannelEventListenerRemovedBridgeRequestMeta: o( [ { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - OpenRequestPayload: o( + PrivateChannelEventListenerRemovedBridgeRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('SourceElement') }, - { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, + { json: 'channel', js: 'channel', typ: '' }, + { json: 'listenerType', js: 'listenerType', typ: '' }, ], false ), - OpenResponse: o( + PrivateChannelOnAddContextListenerAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('OpenResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('OpenResponsePayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnAddContextListenerAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - OpenResponseMeta: o( + PrivateChannelOnAddContextListenerAgentRequestMeta: o( [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, - { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, ], false ), - OpenResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('SourceElement') }], false), - PrivateChannelBroadcast: o( + PrivateChannelOnAddContextListenerAgentRequestPayload: o( + [ + { json: 'channel', js: 'channel', typ: '' }, + { json: 'contextType', js: 'contextType', typ: '' }, + ], + false + ), + PrivateChannelOnAddContextListenerBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('PrivateChannelBroadcastMeta') }, - { json: 'payload', js: 'payload', typ: r('PrivateChannelBroadcastPayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnAddContextListenerBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - PrivateChannelBroadcastMeta: o( + PrivateChannelOnAddContextListenerBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PrivateChannelBroadcastPayload: o( + PrivateChannelOnAddContextListenerBridgeRequestPayload: o( [ { json: 'channel', js: 'channel', typ: '' }, - { json: 'context', js: 'context', typ: '' }, + { json: 'contextType', js: 'contextType', typ: '' }, ], false ), - PrivateChannelEventListenerAdded: o( + PrivateChannelOnDisconnectAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerAddedMeta') }, - { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerAddedPayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnDisconnectAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - PrivateChannelEventListenerAddedMeta: o( + PrivateChannelOnDisconnectAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PrivateChannelEventListenerAddedPayload: o( + PrivateChannelOnDisconnectAgentRequestPayload: o([{ json: 'channel', js: 'channel', typ: '' }], false), + PrivateChannelOnDisconnectBridgeRequest: o( [ - { json: 'channel', js: 'channel', typ: '' }, - { json: 'context', js: 'context', typ: '' }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnDisconnectBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + PrivateChannelOnDisconnectBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PrivateChannelEventListenerRemoved: o( + PrivateChannelOnDisconnectBridgeRequestPayload: o([{ json: 'channel', js: 'channel', typ: '' }], false), + PrivateChannelOnUnsubscribeAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerRemovedMeta') }, - { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerRemovedPayload') }, + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnUnsubscribeAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribeAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - PrivateChannelEventListenerRemovedMeta: o( + PrivateChannelOnUnsubscribeAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PrivateChannelEventListenerRemovedPayload: o( + PrivateChannelOnUnsubscribeAgentRequestPayload: o( [ { json: 'channel', js: 'channel', typ: '' }, - { json: 'listenerType', js: 'listenerType', typ: '' }, + { json: 'contextType', js: 'contextType', typ: '' }, ], false ), - PrivateChannelOnAddContextListener: o( + PrivateChannelOnUnsubscribeBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('PrivateChannelOnAddContextListenerMeta') }, - { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerPayload') }, + { json: 'meta', js: 'meta', typ: r('ERequestMetadata') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribeBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - PrivateChannelOnAddContextListenerMeta: o( + ERequestMetadata: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PrivateChannelOnAddContextListenerPayload: o( + PrivateChannelOnUnsubscribeBridgeRequestPayload: o( [ { json: 'channel', js: 'channel', typ: '' }, { json: 'contextType', js: 'contextType', typ: '' }, ], false ), - PrivateChannelOnDisconnect: o( + RaiseIntentAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('PrivateChannelOnDisconnectMeta') }, - { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectPayload') }, + { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - PrivateChannelOnDisconnectMeta: o( + RaiseIntentAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, + { json: 'destination', js: 'destination', typ: r('DestinationClass') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PrivateChannelOnDisconnectPayload: o([{ json: 'channel', js: 'channel', typ: '' }], false), - PrivateChannelOnUnsubscribe: o( + RaiseIntentAgentRequestPayload: o( [ - { json: 'meta', js: 'meta', typ: r('PrivateChannelOnUnsubscribeMeta') }, - { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'intent', js: 'intent', typ: '' }, ], false ), - PrivateChannelOnUnsubscribeMeta: o( + RaiseIntentAgentResponse: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleIdentifier')) }, - { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, - { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, ], false ), - PrivateChannelOnUnsubscribePayload: o( + RaiseIntentAgentResponsePayload: o( + [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolutionClass') }], + false + ), + IntentResolutionClass: o( [ - { json: 'channel', js: 'channel', typ: '' }, - { json: 'contextType', js: 'contextType', typ: '' }, + { json: 'intent', js: 'intent', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceElement') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, ], false ), - RaiseIntentRequest: o( + RaiseIntentBridgeRequest: o( [ - { json: 'meta', js: 'meta', typ: r('RaiseIntentRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('RaiseIntentRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('RaiseIntentBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentBridgeRequestPayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - RaiseIntentRequestMeta: o( + RaiseIntentBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: r('PurpleIdentifier') }, + { json: 'destination', js: 'destination', typ: r('DestinationClass') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('PurpleIdentifier') }, + { json: 'source', js: 'source', typ: r('DestinationClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - RaiseIntentRequestPayload: o( + RaiseIntentBridgeRequestPayload: o( [ { json: 'app', js: 'app', typ: r('SourceElement') }, { json: 'context', js: 'context', typ: r('ContextElement') }, @@ -2819,67 +4611,71 @@ const typeMap: any = { ], false ), - RaiseIntentResponse: o( + RaiseIntentBridgeResponse: o( [ - { json: 'meta', js: 'meta', typ: r('RaiseIntentResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('RaiseIntentResponsePayload') }, + { json: 'meta', js: 'meta', typ: r('RaiseIntentBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentBridgeResponsePayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - RaiseIntentResponseMeta: o( + RaiseIntentBridgeResponseMeta: o( [ - { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - RaiseIntentResponsePayload: o( + RaiseIntentBridgeResponsePayload: o( [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolutionClass') }], false ), - IntentResolutionClass: o( + RaiseIntentResultAgentResponse: o( [ - { json: 'intent', js: 'intent', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceElement') }, - { json: 'version', js: 'version', typ: u(undefined, '') }, + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultAgentResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + RaiseIntentResultAgentResponsePayload: o( + [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResultClass') }], + false + ), + IntentResultClass: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, + { json: 'channel', js: 'channel', typ: u(undefined, r('ChannelClass')) }, ], false ), - RaiseIntentResultResponse: o( + RaiseIntentResultBridgeResponse: o( [ - { json: 'meta', js: 'meta', typ: r('RaiseIntentResultResponseMeta') }, - { json: 'payload', js: 'payload', typ: r('RaiseIntentResultResponsePayload') }, + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultBridgeResponsePayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - RaiseIntentResultResponseMeta: o( + RaiseIntentResultBridgeResponseMeta: o( [ - { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DestinationElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceElement'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - RaiseIntentResultResponsePayload: o( + RaiseIntentResultBridgeResponsePayload: o( [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResultClass') }], false ), - IntentResultClass: o( - [ - { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, - { json: 'channel', js: 'channel', typ: u(undefined, r('ChannelClass')) }, - ], - false - ), Context: o( [ { json: 'id', js: 'id', typ: u(undefined, m('any')) }, From d73b9608a7812d27252cb03c954d1ac7f761cc64 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Thu, 15 Jun 2023 12:14:22 +0100 Subject: [PATCH 065/106] schema names openAgentRequest openBridgeRequest --- ...uest.json => openAgentRequest.schema.json} | 0 ...est.json => openBridgeRequest.schema.json} | 0 .../next/api/appIdentifier.schema.json | 2 +- .../api/desktopAgentIdentifier.schema.json | 2 +- .../next/bridging/agentRequest.schema.json | 61 +++++++++++ .../next/bridging/agentResponse.schema.json | 60 ++++++++++ .../bridgeParticipantIdentifier.schema.json | 23 ++++ .../next/bridging/bridgeRequest.schema.json | 38 +++---- .../next/bridging/bridgeResponse.schema.json | 103 +++++++++--------- ...json => broadcastAgentRequest.schema.json} | 19 +++- .../broadcastBridgeRequest.schema.json | 14 +++ ... => findInstancesAgentRequest.schema.json} | 21 +++- ...=> findInstancesAgentResponse.schema.json} | 36 +++--- .../findInstancesBridgeRequest.schema.json | 14 +++ ...> findInstancesBridgeResponse.schema.json} | 23 ++-- ...son => findIntentAgentRequest.schema.json} | 19 +++- .../findIntentAgentResponse.schema.json | 38 +++++++ .../findIntentBridgeRequest.schema.json | 14 +++ ...n => findIntentBridgeResponse.schema.json} | 24 ++-- ...dIntentsByContextAgentRequest.schema.json} | 19 +++- ...dIntentsByContextAgentResponse.schema.json | 42 +++++++ ...dIntentsByContextBridgeRequest.schema.json | 14 +++ ...ntentsByContextBridgeResponse.schema.json} | 29 ++--- ...=> getAppMetadataAgentRequest.schema.json} | 18 ++- .../getAppMetadataAgentResponse.schema.json | 37 +++++++ .../getAppMetadataBridgeRequest.schema.json | 14 +++ ... getAppMetadataBridgeResponse.schema.json} | 22 ++-- ...hema.json => openAgentRequest.schema.json} | 14 ++- .../bridging/openAgentResponse.schema.json | 37 +++++++ .../bridging/openBridgeRequest.schema.json | 14 +++ .../bridging/openBridgeResponse.schema.json | 38 +++++++ ...eChannelBroadcastAgentRequest.schema.json} | 22 +++- ...eChannelBroadcastBridgeRequest.schema.json | 14 +++ ...ventListenerAddedAgentRequest.schema.json} | 22 +++- ...ventListenerAddedBridgeRequest.schema.json | 14 +++ ...ntListenerRemovedAgentRequest.schema.json} | 22 +++- ...ntListenerRemovedBridgeRequest.schema.json | 14 +++ ...ddContextListenerAgentRequest.schema.json} | 22 +++- ...ddContextListenerBridgeRequest.schema.json | 14 +++ ...annelOnDisconnectAgentRequest.schema.json} | 22 +++- ...annelOnDisconnectBridgeRequest.schema.json | 14 +++ ...nnelOnUnsubscribeAgentRequest.schema.json} | 19 +++- ...nnelOnUnsubscribeBridgeRequest.schema.json | 14 +++ ...on => raiseIntentAgentRequest.schema.json} | 16 ++- .../raiseIntentAgentResponse.schema.json | 37 +++++++ .../raiseIntentBridgeRequest.schema.json | 14 +++ ... => raiseIntentBridgeResponse.schema.json} | 22 ++-- ...aiseIntentResultAgentResponse.schema.json} | 29 +++-- ...aiseIntentResultBridgeResponse.schema.json | 32 ++++++ 49 files changed, 908 insertions(+), 264 deletions(-) rename schemas/bridging/{openAgentRequest.json => openAgentRequest.schema.json} (100%) rename schemas/bridging/{openBridgeRequest.json => openBridgeRequest.schema.json} (100%) create mode 100644 website/static/schemas/next/bridging/agentRequest.schema.json create mode 100644 website/static/schemas/next/bridging/agentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json rename website/static/schemas/next/bridging/{broadcastRequest.schema.json => broadcastAgentRequest.schema.json} (68%) create mode 100644 website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json rename website/static/schemas/next/bridging/{findInstancesRequest.schema.json => findInstancesAgentRequest.schema.json} (64%) rename website/static/schemas/next/bridging/{findInstancesResponse.schema.json => findInstancesAgentResponse.schema.json} (52%) create mode 100644 website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json rename website/static/schemas/next/bridging/{openResponse.schema.json => findInstancesBridgeResponse.schema.json} (59%) rename website/static/schemas/next/bridging/{findIntentRequest.schema.json => findIntentAgentRequest.schema.json} (64%) create mode 100644 website/static/schemas/next/bridging/findIntentAgentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json rename website/static/schemas/next/bridging/{findIntentResponse.schema.json => findIntentBridgeResponse.schema.json} (64%) rename website/static/schemas/next/bridging/{findIntentsByContextRequest.schema.json => findIntentsByContextAgentRequest.schema.json} (60%) create mode 100644 website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json rename website/static/schemas/next/bridging/{findIntentsByContextResponse.schema.json => findIntentsByContextBridgeResponse.schema.json} (56%) rename website/static/schemas/next/bridging/{getAppMetadataRequest.schema.json => getAppMetadataAgentRequest.schema.json} (69%) create mode 100644 website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json rename website/static/schemas/next/bridging/{getAppMetadataResponse.schema.json => getAppMetadataBridgeResponse.schema.json} (64%) rename website/static/schemas/next/bridging/{openRequest.schema.json => openAgentRequest.schema.json} (76%) create mode 100644 website/static/schemas/next/bridging/openAgentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/openBridgeRequest.schema.json create mode 100644 website/static/schemas/next/bridging/openBridgeResponse.schema.json rename website/static/schemas/next/bridging/{privateChannelBroadcast.schema.json => privateChannelBroadcastAgentRequest.schema.json} (62%) create mode 100644 website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json rename website/static/schemas/next/bridging/{privateChannelEventListenerAdded.schema.json => privateChannelEventListenerAddedAgentRequest.schema.json} (59%) create mode 100644 website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json rename website/static/schemas/next/bridging/{privateChannelEventListenerRemoved.schema.json => privateChannelEventListenerRemovedAgentRequest.schema.json} (58%) create mode 100644 website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json rename website/static/schemas/next/bridging/{privateChannelOnAddContextListener.schema.json => privateChannelOnAddContextListenerAgentRequest.schema.json} (58%) create mode 100644 website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json rename website/static/schemas/next/bridging/{privateChannelOnDisconnect.schema.json => privateChannelOnDisconnectAgentRequest.schema.json} (58%) create mode 100644 website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json rename website/static/schemas/next/bridging/{privateChannelOnUnsubscribe.schema.json => privateChannelOnUnsubscribeAgentRequest.schema.json} (62%) create mode 100644 website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json rename website/static/schemas/next/bridging/{raiseIntentRequest.schema.json => raiseIntentAgentRequest.schema.json} (79%) create mode 100644 website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json rename website/static/schemas/next/bridging/{raiseIntentResponse.schema.json => raiseIntentBridgeResponse.schema.json} (64%) rename website/static/schemas/next/bridging/{raiseIntentResultResponse.schema.json => raiseIntentResultAgentResponse.schema.json} (74%) create mode 100644 website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json diff --git a/schemas/bridging/openAgentRequest.json b/schemas/bridging/openAgentRequest.schema.json similarity index 100% rename from schemas/bridging/openAgentRequest.json rename to schemas/bridging/openAgentRequest.schema.json diff --git a/schemas/bridging/openBridgeRequest.json b/schemas/bridging/openBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/openBridgeRequest.json rename to schemas/bridging/openBridgeRequest.schema.json diff --git a/website/static/schemas/next/api/appIdentifier.schema.json b/website/static/schemas/next/api/appIdentifier.schema.json index 29ef4c7d0..6bd36fdb2 100644 --- a/website/static/schemas/next/api/appIdentifier.schema.json +++ b/website/static/schemas/next/api/appIdentifier.schema.json @@ -18,5 +18,5 @@ "required": [ "appId" ], - "unevaluatedProperties": false + "additionalProperties": false } \ No newline at end of file diff --git a/website/static/schemas/next/api/desktopAgentIdentifier.schema.json b/website/static/schemas/next/api/desktopAgentIdentifier.schema.json index c07c0d341..471a65d05 100644 --- a/website/static/schemas/next/api/desktopAgentIdentifier.schema.json +++ b/website/static/schemas/next/api/desktopAgentIdentifier.schema.json @@ -12,5 +12,5 @@ "required": [ "desktopAgent" ], - "additionalProperties": false + "unevaluatedProperties": false } \ No newline at end of file diff --git a/website/static/schemas/next/bridging/agentRequest.schema.json b/website/static/schemas/next/bridging/agentRequest.schema.json new file mode 100644 index 000000000..ca594f659 --- /dev/null +++ b/website/static/schemas/next/bridging/agentRequest.schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/agentRequest.schema.json", + "title": "Agent Request Message", + "type": "object", + "description": "A request message from a Desktop Agent to the Bridge.", + "properties": { + "type": { + "title": "Message type", + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." + }, + "payload": { + "title": "Message payload", + "type": "object", + "description": "The message payload typically contains the arguments to FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/AgentRequestMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "AgentRequestMeta": { + "title": "Agent Request Metadata", + "description": "Metadata for a request message sent by Desktop Agents to the Bridge.", + "type": "object", + "properties": { + "requestUuid": { + "type": "string", + "description": "UUID for the request" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which request or response was generated" + }, + "source": { + "title": "Source identifier", + "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + "destination": { + "title": "Destination identifier", + "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", + "$ref": "bridgeParticipantIdentifier.schema.json" + } + }, + "required": ["requestUuid", "timestamp"], + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/agentResponse.schema.json b/website/static/schemas/next/bridging/agentResponse.schema.json new file mode 100644 index 000000000..2d8950258 --- /dev/null +++ b/website/static/schemas/next/bridging/agentResponse.schema.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/agentResponse.schema.json", + "title": "Agent Response Message", + "type": "object", + "description": "A response message from a Desktop Agent to the Bridge.", + "properties": { + "type": { + "title": "Response Message Type", + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "title": "Response Message Payload", + "type": "object", + "description": "The message payload typically contains return values for FDC3 API functions." + }, + "meta": { + "$ref": "#/$defs/AgentResponseMeta" + } + }, + "additionalProperties": false, + "required": ["type", "payload", "meta"], + "$defs": { + "AgentResponseMeta": { + "title": "Agent Response Metadata", + "description": "Metadata for a response messages sent by a Desktop Agent to the Bridge", + "type": "object", + "properties": { + "requestUuid": { + "type": "string", + "description": "UUID for the request this message is responding to." + }, + "responseUuid": { + "type": "string", + "description": "UUID for this specific response message." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which the response was generated" + }, + "source": { + "title": "Response Source identifier", + "description": "Field that represents the source application instance that the response was produced by, or the Desktop Agent if it produced the response without an application.", + "oneOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + } + }, + "required": ["requestUuid", "responseUuid", "timestamp", "source"], + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json b/website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json new file mode 100644 index 000000000..3c56f7606 --- /dev/null +++ b/website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeParticipantIdentifier.schema.json", + "title": "Bridge Participant Identifier", + "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", + "type": "object", + "oneOf": [ + { + "type": "object", + "allOf": [ + { + "$ref": "../api/appIdentifier.schema.json" + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] + }, + { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + ] +} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/bridgeRequest.schema.json b/website/static/schemas/next/bridging/bridgeRequest.schema.json index 0f6fda503..cbc42eea9 100644 --- a/website/static/schemas/next/bridging/bridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/bridgeRequest.schema.json @@ -1,30 +1,35 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json", - "title": "bridgeRequest", + "title": "Bridge Request Message", "type": "object", + "description": "A request message forwarded from the Bridge onto a Desktop Agent connected to it.", "properties": { "type": { + "title": "Message type", "type": "string", "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." }, "payload": { + "title": "Message payload", "type": "object", "description": "The message payload typically contains the arguments to FDC3 API functions." }, "meta": { - "$ref": "#/$defs/RequestMeta" + "$ref": "#/$defs/BridgeRequestMeta" } }, "required": ["type", "payload", "meta"], "additionalProperties": false, "$defs": { - "RequestMeta": { + "BridgeRequestMeta": { + "title": "Bridge Request Metadata", + "description": "Metadata required in a request message forwarded on by the Bridge", "type": "object", "properties": { "requestUuid": { "type": "string", - "description": "Unique UUID for the request" + "description": "UUID for the request" }, "timestamp": { "type": "string", @@ -32,29 +37,18 @@ "description": "Timestamp at which request or response was generated" }, "source": { - "description": "Field that represents the source application that the request was received from.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "title": "Source identifier", + "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", + "$ref": "bridgeParticipantIdentifier.schema.json" }, "destination": { + "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "$ref": "bridgeParticipantIdentifier.schema.json" } }, - "required": ["requestUuid", "timestamp", "source"] + "required": ["requestUuid", "timestamp", "source"], + "additionalProperties": false } } } diff --git a/website/static/schemas/next/bridging/bridgeResponse.schema.json b/website/static/schemas/next/bridging/bridgeResponse.schema.json index 67dea4954..31a0e2796 100644 --- a/website/static/schemas/next/bridging/bridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/bridgeResponse.schema.json @@ -1,79 +1,76 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json", - "title": "bridgeResponse", + "title": "Bridge Response Message", "type": "object", + "description": "A response message from the Bridge back to the original Desktop Agent that raised the request.", "properties": { "type": { + "title": "Response Message Type", "type": "string", "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." }, "payload": { + "title": "Response Message Payload", "type": "object", "description": "The message payload typically contains return values for FDC3 API functions." }, "meta": { - "$ref": "#/$defs/ResponseMeta" + "$ref": "#/$defs/BridgeResponseMeta" } }, - "additionalProperties": false, "required": ["type", "payload", "meta"], + "additionalProperties": false, "$defs": { - "ResponseMeta": { + "BridgeResponseMeta": { + "title": "Bridge Response Metadata", + "description": "Metadata required in a response message collated and/or forwarded on by the Bridge", "type": "object", - "allOf": [ - { - "$ref": "bridgeRequest.schema.json#/$defs/RequestMeta" + "properties": { + "requestUuid": { + "type": "string", + "description": "UUID for the request this message is responding to" + }, + "responseUuid": { + "type": "string", + "description": "Unique UUID for this collated response (generated by the bridge)." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp at which the response was generated" }, - { - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "responseUuid": { - "type": "string", - "description": "Unique UUID for the response" - }, - "sources": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] - }, - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored." - }, - "errorSources": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] - }, - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors." - }, - "errorDetails": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + "sources": { + "type": "array", + "items": [ + { + "$ref": "bridgeParticipantIdentifier.schema.json" } + ], + "title": "Desktop Agents that responded", + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." + }, + "errorSources": { + "type": "array", + "items": [ + { + "$ref": "bridgeParticipantIdentifier.schema.json" + } + ], + "title": "Desktop Agents that errored", + "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." + }, + "errorDetails": { + "title": "Detail of errors returned", + "type": "array", + "items": { + "type": "string" }, - "required": ["requestUuid", "responseUuid", "timestamp"], - "additionalProperties": false + "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." } - ] + }, + "required": ["requestUuid", "responseUuid", "timestamp"], + "additionalProperties": false } } } diff --git a/website/static/schemas/next/bridging/broadcastRequest.schema.json b/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json similarity index 68% rename from website/static/schemas/next/bridging/broadcastRequest.schema.json rename to website/static/schemas/next/bridging/broadcastAgentRequest.schema.json index 969d5cc9d..119a2c7ba 100644 --- a/website/static/schemas/next/bridging/broadcastRequest.schema.json +++ b/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json @@ -1,19 +1,26 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastRequest.schema.json", - "title": "broadcastRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastAgentRequest.schema.json", + "title": "broadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/BroadcastRequestBase" + } + ], + "$defs": { + "BroadcastRequestBase": { "type":"object", + "description": "A request to broadcast context on a channel.", "properties": { "type": { "const": "broadcastRequest" }, "payload": { + "title": "broadcast Request Payload", "type": "object", "properties": { "channel": { @@ -27,6 +34,8 @@ "required": ["channel", "context"] }, "meta": { + "type": "object", + "title": "broadcast request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,7 +46,7 @@ "additionalProperties": false } }, - "additionalProperties":false + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json b/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json new file mode 100644 index 000000000..33341fd16 --- /dev/null +++ b/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastBridgeRequest.schema.json", + "title": "broadcast Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "broadcastAgentRequest.schema.json#/$defs/BroadcastRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/findInstancesRequest.schema.json b/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json similarity index 64% rename from website/static/schemas/next/bridging/findInstancesRequest.schema.json rename to website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json index 69a603068..926ab7f09 100644 --- a/website/static/schemas/next/bridging/findInstancesRequest.schema.json +++ b/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesRequest.schema.json", - "title": "findInstancesRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentRequest.schema.json", + "title": "findInstances Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/FindInstancesRequestBase" + } + ], + "$defs": { + "FindInstancesRequestBase": { "type": "object", - "properties": { + "description": "A request for details of instances of a particular app", + "properties":{ "type": { "const": "findInstancesRequest" }, "payload": { "type": "object", + "title": "findInstances request payload", "properties": { "app": { "$ref": "../api/appIdentifier.schema.json" @@ -24,6 +31,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title": "findInstances request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,10 +43,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/findInstancesResponse.schema.json b/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json similarity index 52% rename from website/static/schemas/next/bridging/findInstancesResponse.schema.json rename to website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json index 801c35645..bc2a778f8 100644 --- a/website/static/schemas/next/bridging/findInstancesResponse.schema.json +++ b/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesResponse.schema.json", - "title": "findInstancesResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json", + "title": "findInstances Agent Response", "type": "object", "allOf": [ { - "$ref": "bridgeResponse.schema.json" + "$ref": "agentResponse.schema.json" }, { + "$ref": "#/$defs/FindInstancesResponseBase" + } + ], + "$defs": { + "FindInstancesResponseBase": { "type": "object", + "description": "A response to a findInstances request.", "properties": { "type": { "const": "findInstancesResponse" }, "payload": { "type": "object", + "title": "findInstances Response Payload", "properties": { "appIdentifiers": { "type": "array", @@ -26,24 +33,9 @@ "required": ["appIdentifiers"], "additionalProperties": false }, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } - } + "meta": true + }, + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json new file mode 100644 index 000000000..59079fff6 --- /dev/null +++ b/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeRequest.schema.json", + "title": "findInstances Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "findInstancesAgentRequest.schema.json#/$defs/FindInstancesRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/openResponse.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json similarity index 59% rename from website/static/schemas/next/bridging/openResponse.schema.json rename to website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json index 3c03f6710..034cc3c68 100644 --- a/website/static/schemas/next/bridging/openResponse.schema.json +++ b/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json @@ -1,29 +1,22 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openResponse.schema.json", - "title": "openResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json", + "title": "findInstances Bridge Response", "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "findInstancesAgentResponse.schema.json#/$defs/FindInstancesResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "openResponse" - }, - "payload": { - "type": "object", - "properties": { - "appIdentifier": { - "$ref": "../api/appIdentifier.schema.json" - } - }, - "required": ["appIdentifier"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { + "title": "findInstances bridge response metadata", "type": "object", "properties": { "sources": { diff --git a/website/static/schemas/next/bridging/findIntentRequest.schema.json b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json similarity index 64% rename from website/static/schemas/next/bridging/findIntentRequest.schema.json rename to website/static/schemas/next/bridging/findIntentAgentRequest.schema.json index bc6c9b490..b91e0bb87 100644 --- a/website/static/schemas/next/bridging/findIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json @@ -1,19 +1,26 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentRequest.schema.json", - "title": "findIntentRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json", + "title": "findIntents Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/FindIntentRequestBase" + } + ], + "$defs": { + "FindIntentRequestBase": { "type": "object", + "description": "A request for details of apps available to resolve a particular intent and context pair.", "properties": { "type": { "const": "findIntentRequest" }, "payload": { + "title": "findIntent request payload", "type": "object", "properties": { "intent": { @@ -27,6 +34,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title" : "findIntent request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,10 +43,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json b/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json new file mode 100644 index 000000000..3a7a98508 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json", + "title": "findIntent Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/FindIntentResponseBase" + } + ], + "$defs": { + "FindIntentResponseBase": { + "type": "object", + "description": "A response to a findIntent request.", + "properties": { + "type": { + "const": "findIntentResponse" + }, + "payload": { + "type": "object", + "title": "findIntent response payload", + "properties": { + "appIntent": { + "$ref": "../api/appIntent.schema.json" + } + }, + "required": ["appIntent"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json b/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json new file mode 100644 index 000000000..5c3a7b480 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeRequest.schema.json", + "title": "findIntent Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "findIntentAgentRequest.schema.json#/$defs/FindIntentRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentResponse.schema.json b/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json similarity index 64% rename from website/static/schemas/next/bridging/findIntentResponse.schema.json rename to website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json index adbd0a719..b608bbb73 100644 --- a/website/static/schemas/next/bridging/findIntentResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json @@ -1,29 +1,23 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentResponse.schema.json", - "title": "findIntentResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json", + "title": "findIntent Bridge Response", + "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "findIntentAgentResponse.schema.json#/$defs/FindIntentResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "findIntentResponse" - }, - "payload": { - "type": "object", - "properties": { - "appIntent": { - "$ref": "../api/appIntent.schema.json" - } - }, - "required": ["appIntent"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { "type": "object", + "title": "findIntent bridge response metadata", "properties": { "sources": { "type": "array", diff --git a/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json similarity index 60% rename from website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json rename to website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json index 024669aa1..9df449fcc 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextRequest.schema.json", - "title": "findIntentsByContextRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json", + "title": "findIntentsByContext Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/FindIntentsByContextRequestBase" + } + ], + "$defs": { + "FindIntentsByContextRequestBase": { "type": "object", + "description": "A request for details of intents and apps available to resolve them for a particular context.", "properties": { "type": { "const": "findIntentsByContextRequest" }, "payload": { "type": "object", + "title": "findIntentsByContext request payload", "properties": { "context": { "$ref": "../context/context.schema.json" @@ -24,6 +31,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title": "findIntentsByContext request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -31,10 +40,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json new file mode 100644 index 000000000..f4815d5bf --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json", + "title": "findIntentsByContext Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/FindIntentsByContextResponseBase" + } + ], + "$defs": { + "FindIntentsByContextResponseBase": { + "type": "object", + "description": "A response to a findIntentsByContext request.", + "properties": { + "type": { + "const": "findIntentsByContextResponse" + }, + "payload": { + "type": "object", + "title": "findIntentsByContext response payload", + "properties": { + "appIntents": { + "type": "array", + "items": { + "$ref": "../api/appIntent.schema.json" + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": ["appIntents"] + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json new file mode 100644 index 000000000..8f5a8e193 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json", + "title": "findIntentsByContext Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "findIntentsByContextAgentRequest.schema.json#/$defs/FindIntentsByContextRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentsByContextResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json similarity index 56% rename from website/static/schemas/next/bridging/findIntentsByContextResponse.schema.json rename to website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json index 142612182..b930113aa 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json @@ -1,32 +1,23 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextResponse.schema.json", - "title": "findIntentsByContextResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json", + "title": "findIntentsByContext Bridge Response", + "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, { + "$ref": "findIntentsByContextAgentResponse.schema.json#/$defs/FindIntentsByContextResponseBase" + }, + { + "type": "object", "properties": { - "type": { - "const": "findIntentsByContextResponse" - }, - "payload": { - "type": "object", - "properties": { - "appIntents": { - "type": "array", - "items": { - "$ref": "../api/appIntent.schema.json" - }, - "additionalProperties": false - } - }, - "additionalProperties": false, - "required": ["appIntents"] - }, + "type": true, + "payload": true, "meta": { "type": "object", + "title": "findIntentsByContext response metadata", "properties": { "sources": { "type": "array", diff --git a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json similarity index 69% rename from website/static/schemas/next/bridging/getAppMetadataRequest.schema.json rename to website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json index aa4de12d8..07fce5ed5 100644 --- a/website/static/schemas/next/bridging/getAppMetadataRequest.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataRequest.schema.json", - "title": "getAppMetadataRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentRequest.schema.json", + "title": "getAppMetadata Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/GetAppMetadataRequestBase" + } + ], + "$defs": { + "GetAppMetadataRequestBase": { "type": "object", + "description": "A request for metadata about an app", "properties": { "type": { "const": "getAppMetadataRequest" @@ -24,6 +30,8 @@ "additionalProperties": false }, "meta": { + "type": "object", + "title" : "getAppMetadata request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,10 +42,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } }, "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json new file mode 100644 index 000000000..59d3eb5f8 --- /dev/null +++ b/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json", + "title": "getAppMetadata Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/GetAppMetadataResponseBase" + } + ], + "$defs": { + "GetAppMetadataResponseBase": { + "type": "object", + "description": "A response to a getAppMetadata request.", + "properties": { + "type": { + "const": "getAppMetadataResponse" + }, + "payload": { + "type": "object", + "properties": { + "appMetadata": { + "$ref": "../api/appMetadata.schema.json" + } + }, + "required": ["appMetadata"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json new file mode 100644 index 000000000..8b8ba164d --- /dev/null +++ b/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json", + "title": "getAppMetadata Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "getAppMetadataAgentRequest.schema.json#/$defs/GetAppMetadataRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json similarity index 64% rename from website/static/schemas/next/bridging/getAppMetadataResponse.schema.json rename to website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json index e878ea198..6809f5366 100644 --- a/website/static/schemas/next/bridging/getAppMetadataResponse.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json @@ -1,28 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataResponse.schema.json", - "title": "getAppMetadataResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json", + "title": "getAppMetadata Bridge Response", "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "getAppMetadataAgentResponse.schema.json#/$defs/GetAppMetadataResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "getAppMetadataResponse" - }, - "payload": { - "type": "object", - "properties": { - "appMetadata": { - "$ref": "../api/appMetadata.schema.json" - } - }, - "required": ["appMetadata"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { "type": "object", "properties": { diff --git a/website/static/schemas/next/bridging/openRequest.schema.json b/website/static/schemas/next/bridging/openAgentRequest.schema.json similarity index 76% rename from website/static/schemas/next/bridging/openRequest.schema.json rename to website/static/schemas/next/bridging/openAgentRequest.schema.json index 939d03448..6e3f917d8 100644 --- a/website/static/schemas/next/bridging/openRequest.schema.json +++ b/website/static/schemas/next/bridging/openAgentRequest.schema.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openRequest.schema.json", - "title": "openRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentRequest.schema.json", + "title": "open Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/OpenRequestBase" + } + ], + "$defs": { + "OpenRequestBase": { "type": "object", + "description": "A request to open an application", "properties": { "type": { "const": "openRequest" @@ -42,5 +48,5 @@ }, "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/openAgentResponse.schema.json b/website/static/schemas/next/bridging/openAgentResponse.schema.json new file mode 100644 index 000000000..62a49ac63 --- /dev/null +++ b/website/static/schemas/next/bridging/openAgentResponse.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json", + "title": "open Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/OpenResponseBase" + } + ], + "$defs": { + "OpenResponseBase": { + "type": "object", + "description": "A response to an open request", + "properties": { + "type": { + "const": "openResponse" + }, + "payload": { + "type": "object", + "properties": { + "appIdentifier": { + "$ref": "../api/appIdentifier.schema.json" + } + }, + "required": ["appIdentifier"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/openBridgeRequest.schema.json b/website/static/schemas/next/bridging/openBridgeRequest.schema.json new file mode 100644 index 000000000..2d9034bdc --- /dev/null +++ b/website/static/schemas/next/bridging/openBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeRequest.schema.json", + "title": "open Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "openAgentRequest.schema.json#/$defs/OpenRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/openBridgeResponse.schema.json b/website/static/schemas/next/bridging/openBridgeResponse.schema.json new file mode 100644 index 000000000..4bfd321f5 --- /dev/null +++ b/website/static/schemas/next/bridging/openBridgeResponse.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json", + "title": "open Bridge Response", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "$ref": "openAgentResponse.schema.json#/$defs/OpenResponseBase" + }, + { + "type": "object", + "properties": { + "type": true, + "payload": true, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + }, + "errorSources": { + "type": "array", + "items": { + "$ref": "../api/desktopAgentIdentifier.schema.json" + } + } + } + } + } + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json similarity index 62% rename from website/static/schemas/next/bridging/privateChannelBroadcast.schema.json rename to website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json index aa1d5ae43..ef9d06e28 100644 --- a/website/static/schemas/next/bridging/privateChannelBroadcast.schema.json +++ b/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcast.schema.json", - "title": "PrivateChannel.broadcast", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json", + "title": "privateChannelBroadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelBroadcastRequestBase" + } + ], + "$defs": { + "PrivateChannelBroadcastRequestBase": { "type": "object", + "description": "A request to broadcast on a PrivateChannel.", "properties": { "type": { "const": "PrivateChannel.broadcast" }, "payload": { "type": "object", + "title": "privateChannel broadcast request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "context"] }, "meta": { + "type": "object", + "title": "privateChannel broadcast request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json new file mode 100644 index 000000000..ed80f6fd9 --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json", + "title": "privateChannelBroadcast Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelBroadcastAgentRequest.schema.json#/$defs/PrivateChannelBroadcastRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json similarity index 59% rename from website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json rename to website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json index f66bf83c0..089323c44 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerAdded.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAdded.schema.json", - "title": "PrivateChannel.eventListenerAdded", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json", + "title": "privateChannelEventListenerAdded Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelEventListenerAddedRequestBase" + } + ], + "$defs": { + "PrivateChannelEventListenerAddedRequestBase": { "type": "object", + "description": "A request to forward on an EventListenerAdded event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.eventListenerAdded" }, "payload": { "type": "object", + "title": "privateChannel eventListenerAdded request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "context"] }, "meta": { + "type": "object", + "title": "privateChannel eventListenerAdded request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json new file mode 100644 index 000000000..3b7397b74 --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json", + "title": "privateChannelEventListenerAdded Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelEventListenerAddedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerAddedRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json similarity index 58% rename from website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json rename to website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json index 294e4c51c..546e31374 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemoved.schema.json", - "title": "PrivateChannel.eventListenerRemoved", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json", + "title": "privateChannelEventListenerRemoved Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelEventListenerRemovedRequestBase" + } + ], + "$defs": { + "PrivateChannelEventListenerRemovedRequestBase": { "type": "object", + "description": "A request to forward on an EventListenerRemoved event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.eventListenerRemoved" }, "payload": { "type": "object", + "title": "privateChannel eventListenerRemoved request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "listenerType"] }, "meta": { + "type": "object", + "title": "privateChannel eventListenerRemoved request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json new file mode 100644 index 000000000..24b8b3cec --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json", + "title": "privateChannelEventListenerRemoved Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelEventListenerRemovedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerRemovedRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json similarity index 58% rename from website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json rename to website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json index fc8df57eb..169857930 100644 --- a/website/static/schemas/next/bridging/privateChannelOnAddContextListener.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListener.schema.json", - "title": "PrivateChannel.onAddContextListener", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json", + "title": "privateChannelOnAddContextListener Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelOnAddContextListenerRequestBase" + } + ], + "$defs": { + "PrivateChannelOnAddContextListenerRequestBase": { "type": "object", + "description": "A request to forward on an AddCOntextListener event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.onAddContextListener" }, "payload": { "type": "object", + "title": "privateChannel onAddContextListener request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "contextType"] }, "meta": { + "type": "object", + "title": "privateChannel onAddContextListener request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json new file mode 100644 index 000000000..05ea74b49 --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json", + "title": "privateChannelOnAddContextListener Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelOnAddContextListenerAgentRequest.schema.json#/$defs/PrivateChannelOnAddContextListenerRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json similarity index 58% rename from website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json rename to website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json index 0251f6677..8b137372c 100644 --- a/website/static/schemas/next/bridging/privateChannelOnDisconnect.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnect.schema.json", - "title": "PrivateChannel.onDisconnect", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json", + "title": "privateChannelOnDisconnect Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelOnDisconnectRequestBase" + } + ], + "$defs": { + "PrivateChannelOnDisconnectRequestBase": { "type": "object", + "description": "A request to forward on a Disconnect event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.onDisconnect" }, "payload": { "type": "object", + "title": "privateChannel onDisconnect request payload", "properties": { "channel": { "type": "string" @@ -24,6 +31,8 @@ "required": ["channel"] }, "meta": { + "type": "object", + "title": "privateChannel onDisconnect request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -34,9 +43,10 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } - } + }, + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json new file mode 100644 index 000000000..b4e31ddcc --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json", + "title": "privateChannelOnDisconnect Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelOnDisconnectAgentRequest.schema.json#/$defs/PrivateChannelOnDisconnectRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json similarity index 62% rename from website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json rename to website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json index d47270e7d..75649b334 100644 --- a/website/static/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json @@ -1,20 +1,27 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribe.schema.json", - "title": "PrivateChannel.onUnsubscribe", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json", + "title": "privateChannelOnUnsubscribe Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/PrivateChannelOnUnsubscribeRequestBase" + } + ], + "$defs": { + "PrivateChannelOnUnsubscribeRequestBase": { "type": "object", + "description": "A request to forward on an Unsubscribe event, relating to a PrivateChannel", "properties": { "type": { "const": "PrivateChannel.onUnsubscribe" }, "payload": { "type": "object", + "title": "privateChannel onUnsubscribe request payload", "properties": { "channel": { "type": "string" @@ -27,6 +34,8 @@ "required": ["channel", "contextType"] }, "meta": { + "type": "object", + "title": "privateChannel onUnsubscribe request metadata", "properties": { "requestUuid": true, "timestamp": true, @@ -37,9 +46,9 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false + "unevaluatedProperties": false } } } - ] + } } diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json new file mode 100644 index 000000000..0f76ebd19 --- /dev/null +++ b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json", + "title": "PrivateChannelOnUnsubscribe Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "privateChannelOnUnsubscribeAgentRequest.schema.json#/$defs/PrivateChannelOnUnsubscribeRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json similarity index 79% rename from website/static/schemas/next/bridging/raiseIntentRequest.schema.json rename to website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json index b56019483..d597f673a 100644 --- a/website/static/schemas/next/bridging/raiseIntentRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentRequest.schema.json", - "title": "raiseIntentRequest", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentRequest.schema.json", + "title": "raiseIntent Agent Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "agentRequest.schema.json" }, { + "$ref": "#/$defs/RaiseIntentRequestBase" + } + ], + "$defs": { + "RaiseIntentRequestBase": { "type": "object", + "description": "A request to raise an intent.", "properties": { "type": { "const": "raiseIntentRequest" @@ -40,11 +46,11 @@ "$ref": "../api/appIdentifier.schema.json" } }, - "additionalProperties": false, + "unevaluatedProperties": false, "required": ["requestUuid","timestamp","destination","source"] } }, "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json new file mode 100644 index 000000000..52caf1369 --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentResponse.schema.json", + "title": "raiseIntent Agent Response", + "type": "object", + "allOf": [ + { + "$ref": "agentResponse.schema.json" + }, + { + "$ref": "#/$defs/RaiseIntentResponseBase" + } + ], + "$defs": { + "RaiseIntentResponseBase": { + "type": "object", + "description": "A response to a request to raise an intent.", + "properties": { + "type": { + "const": "raiseIntentResponse" + }, + "payload": { + "type": "object", + "properties": { + "intentResolution": { + "$ref": "../api/intentResolution.schema.json" + } + }, + "required": ["intentResolution"], + "additionalProperties": false + }, + "meta": true + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json new file mode 100644 index 000000000..1db051e5e --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeRequest.schema.json", + "title": "raiseIntent Bridge Request", + "type": "object", + "allOf": [ + { + "$ref": "bridgeRequest.schema.json" + }, + { + "$ref": "raiseIntentAgentRequest.schema.json#/$defs/RaiseIntentRequestBase" + } + ] +} diff --git a/website/static/schemas/next/bridging/raiseIntentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json similarity index 64% rename from website/static/schemas/next/bridging/raiseIntentResponse.schema.json rename to website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json index 9a9245343..b9fbd772c 100644 --- a/website/static/schemas/next/bridging/raiseIntentResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json @@ -1,28 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResponse.schema.json", - "title": "raiseIntentResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json", + "title": "raiseIntent Bridge Response", "type": "object", "allOf": [ { "$ref": "bridgeResponse.schema.json" }, + { + "$ref": "raiseIntentAgentResponse.schema.json#/$defs/RaiseIntentResponseBase" + }, { "type": "object", "properties": { - "type": { - "const": "raiseIntentResponse" - }, - "payload": { - "type": "object", - "properties": { - "intentResolution": { - "$ref": "../api/intentResolution.schema.json" - } - }, - "required": ["intentResolution"], - "additionalProperties": false - }, + "type": true, + "payload": true, "meta": { "type": "object", "properties": { diff --git a/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json similarity index 74% rename from website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json rename to website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json index 69b38e12e..17437e3d8 100644 --- a/website/static/schemas/next/bridging/raiseIntentResultResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json @@ -1,14 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultResponse.schema.json", - "title": "raiseIntentResultResponse", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json", + "title": "raiseIntentResult Agent Response", "type": "object", "allOf": [ { - "$ref": "bridgeResponse.schema.json" + "$ref": "agentResponse.schema.json" }, { + "$ref": "#/$defs/RaiseIntentResultResponseBase" + } + ], + "$defs": { + "RaiseIntentResultResponseBase": { "type": "object", + "description": "A secondary response to a request to raise an intent used to deliver the intent result", "properties": { "type": { "const": "raiseIntentResultResponse" @@ -44,18 +50,9 @@ "required": ["intentResult"], "additionalProperties": false }, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/appIdentifier.schema.json" - } - } - } - } - } + "meta": true + }, + "additionalProperties": false } - ] + } } diff --git a/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json new file mode 100644 index 000000000..0d06c0e72 --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json @@ -0,0 +1,32 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json", + "title": "raiseIntentResult Bridge Response", + "type": "object", + "allOf": [ + { + "$ref": "bridgeResponse.schema.json" + }, + { + "$ref": "raiseIntentResultAgentResponse.schema.json#/$defs/RaiseIntentResultResponseBase" + }, + { + "type": "object", + "properties": { + "type": true, + "payload": true, + "meta": { + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "../api/appIdentifier.schema.json" + } + } + } + } + } + } + ] +} From c9f772d0eb8bce5fdb6aa110a015070f8b892947 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 12 Jul 2023 10:48:54 +0100 Subject: [PATCH 066/106] Improving Bridging schemas based on feedback (#70) * Improving schemas based on feedback - Compose schemas with most detailed first - Ensure all entities have a title field (to improve naming in code generated from the files) - Workaround issues in code generators that have issues with composition - Deduplicated definitions by introducing a file for common definitions * Adding enums to control request and response message types (better for code generation) * API schema generation * Update semgrepignore for quicktype utils * Fixing references to generated API schemas * Fixing final anonymous entities in schemas by adding titles * Adding generic conneciton step schema so that an enum will represent allowed message types in generated code --- .semgrepignore | 3 +- package-lock.json | 114 +- package.json | 6 +- quicktypeUtil.js => s2tQuicktypeUtil.js | 2 +- schemas/api/README.md | 10 + schemas/api/api.schema.json | 449 +++ schemas/api/appIdentifier.schema.json | 22 - schemas/api/appIntent.schema.json | 23 - schemas/api/appMetadata.schema.json | 54 - .../baseImplementationMetadata.schema.json | 80 +- schemas/api/channel.schema.json | 28 - schemas/api/contextMetadata.schema.json | 16 - .../api/desktopAgentIdentifier.schema.json | 16 - schemas/api/displayMetadata.schema.json | 19 - schemas/api/errors.schema.json | 57 - schemas/api/icon.schema.json | 22 - schemas/api/image.schema.json | 25 - .../api/implementationMetadata.schema.json | 31 - schemas/api/intentMetadata.schema.json | 19 - schemas/api/intentResolution.schema.json | 23 - schemas/api/intentResult.schema.json | 15 - schemas/api/t2sQuicktypeUtil.js | 64 + schemas/bridging/agentRequest.schema.json | 35 +- schemas/bridging/agentResponse.schema.json | 28 +- .../bridgeParticipantIdentifier.schema.json | 23 - schemas/bridging/bridgeRequest.schema.json | 11 +- schemas/bridging/bridgeResponse.schema.json | 35 +- .../broadcastAgentRequest.schema.json | 12 +- .../broadcastBridgeRequest.schema.json | 6 +- schemas/bridging/common.schema.json | 109 + schemas/bridging/connectionStep.schema.json | 51 + .../bridging/connectionStep2Hello.schema.json | 98 +- .../connectionStep3Handshake.schema.json | 106 +- ...ctionStep4AuthenticationFailed.schema.json | 75 +- ...tionStep6ConnectedAgentsUpdate.schema.json | 118 +- .../findInstancesAgentRequest.schema.json | 18 +- .../findInstancesAgentResponse.schema.json | 17 +- .../findInstancesBridgeRequest.schema.json | 6 +- .../findInstancesBridgeResponse.schema.json | 29 +- .../findIntentAgentRequest.schema.json | 16 +- .../findIntentAgentResponse.schema.json | 17 +- .../findIntentBridgeRequest.schema.json | 6 +- .../findIntentBridgeResponse.schema.json | 30 +- ...ndIntentsByContextAgentRequest.schema.json | 14 +- ...dIntentsByContextAgentResponse.schema.json | 17 +- ...dIntentsByContextBridgeRequest.schema.json | 6 +- ...IntentsByContextBridgeResponse.schema.json | 31 +- .../getAppMetadataAgentRequest.schema.json | 17 +- .../getAppMetadataAgentResponse.schema.json | 16 +- .../getAppMetadataBridgeRequest.schema.json | 6 +- .../getAppMetadataBridgeResponse.schema.json | 28 +- schemas/bridging/openAgentRequest.schema.json | 16 +- .../bridging/openAgentResponse.schema.json | 16 +- .../bridging/openBridgeRequest.schema.json | 6 +- .../bridging/openBridgeResponse.schema.json | 28 +- ...teChannelBroadcastAgentRequest.schema.json | 16 +- ...eChannelBroadcastBridgeRequest.schema.json | 6 +- ...EventListenerAddedAgentRequest.schema.json | 16 +- ...ventListenerAddedBridgeRequest.schema.json | 6 +- ...entListenerRemovedAgentRequest.schema.json | 16 +- ...ntListenerRemovedBridgeRequest.schema.json | 6 +- ...AddContextListenerAgentRequest.schema.json | 16 +- ...ddContextListenerBridgeRequest.schema.json | 6 +- ...hannelOnDisconnectAgentRequest.schema.json | 16 +- ...annelOnDisconnectBridgeRequest.schema.json | 6 +- ...annelOnUnsubscribeAgentRequest.schema.json | 16 +- ...nnelOnUnsubscribeBridgeRequest.schema.json | 4 +- .../raiseIntentAgentRequest.schema.json | 17 +- .../raiseIntentAgentResponse.schema.json | 16 +- .../raiseIntentBridgeRequest.schema.json | 6 +- .../raiseIntentBridgeResponse.schema.json | 28 +- ...raiseIntentResultAgentResponse.schema.json | 19 +- ...aiseIntentResultBridgeResponse.schema.json | 22 +- src/api/AppMetadata.ts | 2 +- src/bridging/BridgingTypes.ts | 2890 +++++++++-------- 75 files changed, 2807 insertions(+), 2468 deletions(-) rename quicktypeUtil.js => s2tQuicktypeUtil.js (96%) create mode 100644 schemas/api/README.md create mode 100644 schemas/api/api.schema.json delete mode 100644 schemas/api/appIdentifier.schema.json delete mode 100644 schemas/api/appIntent.schema.json delete mode 100644 schemas/api/appMetadata.schema.json delete mode 100644 schemas/api/channel.schema.json delete mode 100644 schemas/api/contextMetadata.schema.json delete mode 100644 schemas/api/desktopAgentIdentifier.schema.json delete mode 100644 schemas/api/displayMetadata.schema.json delete mode 100644 schemas/api/errors.schema.json delete mode 100644 schemas/api/icon.schema.json delete mode 100644 schemas/api/image.schema.json delete mode 100644 schemas/api/implementationMetadata.schema.json delete mode 100644 schemas/api/intentMetadata.schema.json delete mode 100644 schemas/api/intentResolution.schema.json delete mode 100644 schemas/api/intentResult.schema.json create mode 100644 schemas/api/t2sQuicktypeUtil.js delete mode 100644 schemas/bridging/bridgeParticipantIdentifier.schema.json create mode 100644 schemas/bridging/common.schema.json create mode 100644 schemas/bridging/connectionStep.schema.json diff --git a/.semgrepignore b/.semgrepignore index f21a59a08..bd09db44d 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -1,4 +1,5 @@ website/** # Just used for build so ignoring -quicktypeUtil.js +s2tQuicktypeUtil.js +schemas/api/t2sQuicktypeUtil.js diff --git a/package-lock.json b/package-lock.json index 368ed049f..ac092e5b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@finos/fdc3", - "version": "2.0.1", + "version": "2.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@finos/fdc3", - "version": "2.0.1", + "version": "2.0.3", "license": "Apache-2.0", "devDependencies": { "husky": "^4.3.0", "jest-mock-extended": "^1.0.13", - "quicktype": "^23.0.19", + "quicktype": "^23.0.49", "tsdx": "^0.14.1", "tslib": "^2.0.1", "typescript": "^4.0.3" @@ -1784,9 +1784,9 @@ } }, "node_modules/@glideapps/ts-necessities": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.2.tgz", - "integrity": "sha512-tLjfhinr6doUBcWi7BWnkT2zT6G5UhiZftsiIH6xVvykeXE+FU7Wr0MyqwmqideWlDD5rG+VjVLptLviGo04CA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz", + "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -2186,9 +2186,9 @@ } }, "node_modules/@mark.probst/typescript-json-schema/node_modules/@types/node": { - "version": "16.18.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.24.tgz", - "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", + "version": "16.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", + "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", "dev": true }, "node_modules/@mark.probst/typescript-json-schema/node_modules/cliui": { @@ -2236,9 +2236,9 @@ } }, "node_modules/@mark.probst/typescript-json-schema/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -2396,9 +2396,9 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/babel__core": { @@ -4087,12 +4087,12 @@ "dev": true }, "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dev": true, "dependencies": { - "node-fetch": "2.6.7" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { @@ -8489,9 +8489,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -9473,12 +9473,12 @@ } }, "node_modules/quicktype": { - "version": "23.0.19", - "resolved": "https://registry.npmjs.org/quicktype/-/quicktype-23.0.19.tgz", - "integrity": "sha512-yM2DvLTyyAtFzsN68W8LtaRwhjLNasx1o64R2PaYsapfVIkEdGB2KYhxB0+YR1IEC5QKnbvFn95gg4CEpE/HdA==", + "version": "23.0.49", + "resolved": "https://registry.npmjs.org/quicktype/-/quicktype-23.0.49.tgz", + "integrity": "sha512-SWF3MRBiW1JuIhQPFwN8cY6xHo6SogEF/9Y6m6XNunqaJrT7Lbp9gERpNR5wrkMyJb0KYYDOLo49HXWzi4jGCA==", "dev": true, "dependencies": { - "@glideapps/ts-necessities": "^2.1.2", + "@glideapps/ts-necessities": "^2.1.3", "chalk": "^4.1.2", "collection-utils": "^1.0.1", "command-line-args": "^5.2.1", @@ -9487,9 +9487,9 @@ "graphql": "^0.11.7", "lodash": "^4.17.21", "moment": "^2.29.4", - "quicktype-core": "23.0.19", - "quicktype-graphql-input": "23.0.19", - "quicktype-typescript-input": "23.0.19", + "quicktype-core": "23.0.49", + "quicktype-graphql-input": "23.0.49", + "quicktype-typescript-input": "23.0.49", "readable-stream": "^4.3.0", "stream-json": "1.7.5", "string-to-stream": "^3.0.1", @@ -9503,12 +9503,12 @@ } }, "node_modules/quicktype-core": { - "version": "23.0.19", - "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.19.tgz", - "integrity": "sha512-CjJdvbVhj7g0+V+guS67+lc8RyuiRDAMe4eKEULyOL3bWBcSnFzGpnkYA/iCLi/g5ujsMmKr+DSCuloCSG+kOw==", + "version": "23.0.49", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.49.tgz", + "integrity": "sha512-lzPhHqqrqCvelt1+Hb/vsxyQtnv4nObcRCAItB3kOVQGYBYIfS8DQMG2t8FfC/fLW5o8xkhl6PF7CdHcejsFmg==", "dev": true, "dependencies": { - "@glideapps/ts-necessities": "2.1.2", + "@glideapps/ts-necessities": "2.1.3", "@types/urijs": "^1.19.19", "browser-or-node": "^2.1.1", "collection-utils": "^1.0.1", @@ -9522,37 +9522,52 @@ "unicode-properties": "^1.4.1", "urijs": "^1.19.1", "wordwrap": "^1.0.0", - "yaml": "^2.2.1" + "yaml": "^2.2.2" + } + }, + "node_modules/quicktype-core/node_modules/readable-stream": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", + "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/quicktype-core/node_modules/yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, "engines": { "node": ">= 14" } }, "node_modules/quicktype-graphql-input": { - "version": "23.0.19", - "resolved": "https://registry.npmjs.org/quicktype-graphql-input/-/quicktype-graphql-input-23.0.19.tgz", - "integrity": "sha512-cnfEj9YyyFk8gC05lMpPCXWfMCYh0UyslL3lkIDZUEZjotEcbudv+p6/+l20/4fEidqnlR2WAaf8FgSeT5gi2g==", + "version": "23.0.49", + "resolved": "https://registry.npmjs.org/quicktype-graphql-input/-/quicktype-graphql-input-23.0.49.tgz", + "integrity": "sha512-3KtF6wOV8K7SSl1v5LG/CzgxzUNuslpibtKtzfUFiMwxfdQiG9vDhsiewdkoetCB+13HOiNCKysXfSgELPPMzg==", "dev": true, "dependencies": { "collection-utils": "^1.0.1", "graphql": "^0.11.7", - "quicktype-core": "23.0.19" + "quicktype-core": "23.0.49" } }, "node_modules/quicktype-typescript-input": { - "version": "23.0.19", - "resolved": "https://registry.npmjs.org/quicktype-typescript-input/-/quicktype-typescript-input-23.0.19.tgz", - "integrity": "sha512-+XdU700L4ASgwyg933q4tWW1oab3AtWyJwEGurYNCXHeDUZmbcKr+jCq0iPumbNzuJOC2sWwEpdt3gS1L2aYWg==", + "version": "23.0.49", + "resolved": "https://registry.npmjs.org/quicktype-typescript-input/-/quicktype-typescript-input-23.0.49.tgz", + "integrity": "sha512-/hSUpeharpOxhls+S7KBKw0d9ig8Pm662OZ5a20eROtUl/qS5s/hSshxt+pW+R3RjD5fZw2SiyaWDY5L+LgfVQ==", "dev": true, "dependencies": { "@mark.probst/typescript-json-schema": "0.55.0", - "quicktype-core": "23.0.19", + "quicktype-core": "23.0.49", "typescript": "4.9.5" } }, @@ -9622,15 +9637,16 @@ } }, "node_modules/readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dev": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" diff --git a/package.json b/package.json index 584df7a54..d6c1e88eb 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "lint": "tsdx lint src/api test", "preprepare": "npm run typegen && npm run typegen-bridging", "prepare": "tsdx build", - "typegen": "node quicktypeUtil.js schemas/context src/context/ContextTypes.ts && tsdx lint src/context/ --fix", - "typegen-bridging": "node quicktypeUtil.js schemas/api schemas/bridging schemas/context/context.schema.json src/bridging/BridgingTypes.ts && tsdx lint src/bridging/ --fix" + "typegen": "node s2tQuicktypeUtil.js schemas/context src/context/ContextTypes.ts && tsdx lint src/context/ --fix", + "typegen-bridging": "node s2tQuicktypeUtil.js schemas/api schemas/bridging schemas/context/context.schema.json src/bridging/BridgingTypes.ts && tsdx lint src/bridging/ --fix" }, "peerDependencies": {}, "husky": { @@ -48,7 +48,7 @@ "devDependencies": { "husky": "^4.3.0", "jest-mock-extended": "^1.0.13", - "quicktype": "^23.0.19", + "quicktype": "^23.0.49", "tsdx": "^0.14.1", "tslib": "^2.0.1", "typescript": "^4.0.3" diff --git a/quicktypeUtil.js b/s2tQuicktypeUtil.js similarity index 96% rename from quicktypeUtil.js rename to s2tQuicktypeUtil.js index 4e7cdca06..8d0a3d251 100644 --- a/quicktypeUtil.js +++ b/s2tQuicktypeUtil.js @@ -27,7 +27,7 @@ while (dirIndex < inputs.length) { fs.readdirSync(inputs[dirIndex], { withFileTypes: true }).forEach(file => { if (file.isDirectory()) { inputs.push(path.join(inputs[dirIndex], file.name)); - } else { + } else if (file.name.endsWith('.schema.json')) { sources += `--src ${path.join(inputs[dirIndex], file.name)} `; } }); diff --git a/schemas/api/README.md b/schemas/api/README.md new file mode 100644 index 000000000..c782f2e7a --- /dev/null +++ b/schemas/api/README.md @@ -0,0 +1,10 @@ +# Intro + +Quicktype, the chosen generation tool currently has some limitations that prevent fully automatic schema generation from the existing TS types. For example it can not handle interfaces that contain methods in their definition. It also fails to generate schemas even if a type contains unused references to other types or interfaces that contain async functions (Promise return types). Therefore, in order to generate the `api\schemas\api.schema.json` some manual intervention was needed. + +Once these limitations are not an issue the `api\schemas\t2sQuicktypeUtil.js` script should be moved to the root level of the project and a new npm script `"api-schema-gen": "node t2sQuicktypeUtil.js src/api schemas/api/api.schema.json"` should be added. + +`api\schemas\api.schema.json` - partially auto-generated schema from the existing `src\api` types. +`api\schemas\baseImplementationMetadata.schema.json` - Used by bridging types that leave out the metadata of the calling application as it does not apply to bridging. +`api\schemas\intentResolution.schema.json` - At the moment it is not possible to auto-generate this due to limitations in the generation tool (quicktype) +`api\schemas\t2sQuicktypeUtil.js` - Script used to run the generation of the schema from the types. Should be moved to the root level of the repo once fully-automated generation can be achieved. diff --git a/schemas/api/api.schema.json b/schemas/api/api.schema.json new file mode 100644 index 000000000..dec1bdc9e --- /dev/null +++ b/schemas/api/api.schema.json @@ -0,0 +1,449 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/api.schema.json", + "definitions": { + "AppIdentifier": { + "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application instances.\n\nWill always include at least an `appId` field, which uniquely identifies a specific app.\n\nIf the `instanceId` field is set then the `AppMetadata` object represents a specific instance of the application that may be addressed using that Id.", + "title": "AppIdentifier", + "type": "object", + "properties": { + "appId": { + "description": "The unique application identifier located within a specific application directory instance. An example of an appId might be 'app@sub.root'", + "type": "string", + "title": "appId" + }, + "instanceId": { + "description": "An optional instance identifier, indicating that this object represents a specific instance of the application described.", + "type": "string", + "title": "instanceId" + }, + "desktopAgent": { + "description": "The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to identify the Desktop Agent to target.", + "type": "string", + "title": "desktopAgent" + } + }, + "additionalProperties": false, + "required": [ + "appId" + ] + }, + "Icon": { + "description": "SPDX-License-Identifier: Apache-2.0\nCopyright FINOS FDC3 contributors - see NOTICE file", + "title": "Icon", + "type": "object", + "properties": { + "src": { + "description": "The icon url", + "type": "string", + "title": "src" + }, + "size": { + "description": "The icon dimension, formatted as `x`.", + "type": "string", + "title": "size" + }, + "type": { + "description": "Icon media type. If not present the Desktop Agent may use the src file extension.", + "type": "string", + "title": "type" + } + }, + "additionalProperties": false, + "required": [ + "src" + ] + }, + "Image": { + "description": "SPDX-License-Identifier: Apache-2.0\nCopyright FINOS FDC3 contributors - see NOTICE file", + "title": "Image", + "type": "object", + "properties": { + "src": { + "description": "The image url.", + "type": "string", + "title": "src" + }, + "size": { + "description": "The image dimension, formatted as `x`.", + "type": "string", + "title": "size" + }, + "type": { + "description": "Image media type. If not present the Desktop Agent may use the src file extension.", + "type": "string", + "title": "type" + }, + "label": { + "description": "Caption for the image.", + "type": "string", + "title": "label" + } + }, + "additionalProperties": false, + "required": [ + "src" + ] + }, + "AppMetadata": { + "description": "Extends an `AppIdentifier`, describing an application or instance of an application, with additional descriptive metadata that is usually provided by an FDC3 App Directory that the desktop agent connects to.\n\nThe additional information from an app directory can aid in rendering UI elements, such as a launcher menu or resolver UI. This includes a title, description, tooltip and icon and screenshot URLs.\n\nNote that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc.", + "title": "AppMetadata", + "type": "object", + "properties": { + "name": { + "description": "The 'friendly' app name. \nThis field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now require an `AppIdentifier` wth `appId` set. \nNote that for display purposes the `title` field should be used, if set, in preference to this field.", + "type": "string", + "title": "name" + }, + "version": { + "description": "The Version of the application.", + "type": "string", + "title": "version" + }, + "instanceMetadata": { + "description": "An optional set of, implementation specific, metadata fields that can be used to disambiguate instances, such as a window title or screen position. Must only be set if `instanceId` is set.", + "type": "object", + "additionalProperties": {}, + "title": "instanceMetadata" + }, + "title": { + "description": "A more user-friendly application title that can be used to render UI elements", + "type": "string", + "title": "title" + }, + "tooltip": { + "description": "A tooltip for the application that can be used to render UI elements", + "type": "string", + "title": "tooltip" + }, + "description": { + "description": "A longer, multi-paragraph description for the application that could include markup", + "type": "string", + "title": "description" + }, + "icons": { + "description": "A list of icon URLs for the application that can be used to render UI elements", + "type": "array", + "items": { + "$ref": "#/definitions/Icon" + }, + "title": "icons" + }, + "screenshots": { + "description": "Images representing the app in common usage scenarios that can be used to render UI elements", + "type": "array", + "items": { + "$ref": "#/definitions/Image" + }, + "title": "screenshots" + }, + "resultType": { + "description": "The type of output returned for any intent specified during resolution. May express a particular context type (e.g. \"fdc3.instrument\"), channel (e.g. \"channel\") or a channel that will receive a specified type (e.g. \"channel\").", + "type": [ + "null", + "string" + ], + "title": "resultType" + }, + "appId": { + "description": "The unique application identifier located within a specific application directory instance. An example of an appId might be 'app@sub.root'", + "type": "string", + "title": "appId" + }, + "instanceId": { + "description": "An optional instance identifier, indicating that this object represents a specific instance of the application described.", + "type": "string", + "title": "instanceId" + }, + "desktopAgent": { + "description": "The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to identify the Desktop Agent to target.", + "type": "string", + "title": "desktopAgent" + } + }, + "additionalProperties": false, + "required": [ + "appId" + ] + }, + "IntentMetadata": { + "description": "Intent descriptor", + "title": "IntentMetadata", + "type": "object", + "properties": { + "name": { + "description": "The unique name of the intent that can be invoked by the raiseIntent call", + "type": "string", + "title": "name" + }, + "displayName": { + "description": "Display name for the intent.", + "type": "string", + "title": "displayName" + } + }, + "additionalProperties": false, + "required": [ + "displayName", + "name" + ] + }, + "AppIntent": { + "description": "An interface that relates an intent to apps", + "title": "AppIntent", + "type": "object", + "properties": { + "intent": { + "$ref": "#/definitions/IntentMetadata", + "description": "Details of the intent whose relationship to resolving applications is being described.", + "title": "intent" + }, + "apps": { + "description": "Details of applications that can resolve the intent.", + "type": "array", + "items": { + "$ref": "#/definitions/AppMetadata" + }, + "title": "apps" + } + }, + "additionalProperties": false, + "required": [ + "apps", + "intent" + ] + }, + "DisplayMetadata": { + "description": "A system channel will be global enough to have a presence across many apps. This gives us some hints\nto render them in a standard way. It is assumed it may have other properties too, but if it has these,\nthis is their meaning.", + "title": "DisplayMetadata", + "type": "object", + "properties": { + "name": { + "description": "A user-readable name for this channel, e.g: `\"Red\"`", + "type": "string", + "title": "name" + }, + "color": { + "description": "The color that should be associated within this channel when displaying this channel in a UI, e.g: `0xFF0000`.", + "type": "string", + "title": "color" + }, + "glyph": { + "description": "A URL of an image that can be used to display this channel", + "type": "string", + "title": "glyph" + } + }, + "additionalProperties": false + }, + "Channel": { + "description": "Represents a context channel that applications can use to send and receive\ncontext data.\n\nPlease note that There are differences in behavior when you interact with a\nUser channel via the `DesktopAgent` interface and the `Channel` interface.\nSpecifically, when 'joining' a User channel or adding a context listener\nwhen already joined to a channel via the `DesktopAgent` interface, existing\ncontext (matching the type of the context listener) on the channel is\nreceived by the context listener immediately. Whereas, when a context\nlistener is added via the Channel interface, context is not received\nautomatically, but may be retrieved manually via the `getCurrentContext()`\nfunction.", + "title": "Channel", + "type": "object", + "properties": { + "id": { + "description": "Constant that uniquely identifies this channel.", + "type": "string", + "title": "id" + }, + "type": { + "description": "Uniquely defines each channel type.\nCan be \"user\", \"app\" or \"private\".", + "enum": [ + "app", + "private", + "user" + ], + "type": "string", + "title": "type" + }, + "displayMetadata": { + "description": "Channels may be visualized and selectable by users. DisplayMetadata may be used to provide hints on how to see them.\nFor App channels, displayMetadata would typically not be present.", + "$ref": "#/definitions/DisplayMetadata", + "title": "displayMetadata" + } + }, + "additionalProperties": false, + "required": [ + "id", + "type" + ] + }, + "ContextMetadata": { + "description": "Metadata relating to a context or intent and context received through the\n`addContextListener` and `addIntentListener` functions.", + "title": "ContextMetadata", + "type": "object", + "properties": { + "source": { + "$ref": "#/definitions/AppIdentifier", + "description": "Identifier for the app instance that sent the context and/or intent.", + "title": "source" + } + }, + "additionalProperties": false, + "required": [ + "source" + ] + }, + "DesktopAgentIdentifier": { + "description": "Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios\nwhere a request needs to be directed to a Desktop Agent rather than a specific app, or a\nresponse message is returned by the Desktop Agent (or more specifically its resolver)\nrather than a specific app. Used as a substitute for `AppIdentifier` in cases where no\napp details are available or are appropriate.", + "title": "DesktopAgentIdentifier", + "type": "object", + "properties": { + "desktopAgent": { + "description": "Used in Desktop Agent Bridging to attribute or target a message to a\nparticular Desktop Agent.", + "type": "string", + "title": "desktopAgent" + } + }, + "additionalProperties": false, + "required": [ + "desktopAgent" + ] + }, + "OpenError": { + "description": "Constants representing the errors that can be encountered when calling the `open` method on the DesktopAgent object (`fdc3`).", + "title": "OpenError", + "enum": [ + "AppNotFound", + "AppTimeout", + "DesktopAgentNotFound", + "ErrorOnLaunch", + "MalformedContext", + "ResolverUnavailable" + ], + "type": "string" + }, + "ResolveError": { + "description": "Constants representing the errors that can be encountered when calling the `findIntent`, `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the DesktopAgent (`fdc3`).", + "title": "ResolveError", + "enum": [ + "DesktopAgentNotFound", + "IntentDeliveryFailed", + "MalformedContext", + "NoAppsFound", + "ResolverTimeout", + "ResolverUnavailable", + "TargetAppUnavailable", + "TargetInstanceUnavailable", + "UserCancelledResolution" + ], + "type": "string" + }, + "ResultError": { + "title": "ResultError", + "enum": [ + "IntentHandlerRejected", + "NoResultReturned" + ], + "type": "string" + }, + "ChannelError": { + "title": "ChannelError", + "enum": [ + "AccessDenied", + "CreationFailed", + "MalformedContext", + "NoChannelFound" + ], + "type": "string" + }, + "BridgingError": { + "title": "BridgingError", + "enum": [ + "AgentDisconnected", + "NotConnectedToBridge", + "ResponseToBridgeTimedOut" + ], + "type": "string" + }, + "ImplementationMetadata": { + "description": "Metadata relating to the FDC3 Desktop Agent implementation and its provider.", + "title": "ImplementationMetadata", + "type": "object", + "properties": { + "fdc3Version": { + "description": "The version number of the FDC3 specification that the implementation provides.\nThe string must be a numeric semver version, e.g. 1.2 or 1.2.1.", + "type": "string", + "title": "fdc3Version" + }, + "provider": { + "description": "The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, OpenFin etc.).", + "type": "string", + "title": "provider" + }, + "providerVersion": { + "description": "The version of the provider of the Desktop Agent implementation (e.g. 5.3.0).", + "type": "string", + "title": "providerVersion" + }, + "optionalFeatures": { + "description": "Metadata indicating whether the Desktop Agent implements optional features of\nthe Desktop Agent API.", + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "description": "Used to indicate whether the exposure of 'originating app metadata' for\ncontext and intent messages is supported by the Desktop Agent.", + "type": "boolean", + "title": "OriginatingAppMetadata" + }, + "UserChannelMembershipAPIs": { + "description": "Used to indicate whether the optional `fdc3.joinUserChannel`,\n`fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by\nthe Desktop Agent.", + "type": "boolean", + "title": "UserChannelMembershipAPIs" + }, + "DesktopAgentBridging": { + "description": "Used to indicate whether the experimental Desktop Agent Bridging\nfeature is implemented by the Desktop Agent.", + "type": "boolean", + "title": "DesktopAgentBridging" + } + }, + "additionalProperties": false, + "required": [ + "DesktopAgentBridging", + "OriginatingAppMetadata", + "UserChannelMembershipAPIs" + ], + "title": "optionalFeatures" + }, + "appMetadata": { + "$ref": "#/definitions/AppMetadata", + "description": "The calling application instance's own metadata, according to the Desktop Agent (MUST include at least the `appId` and `instanceId`).", + "title": "appMetadata" + } + }, + "additionalProperties": false, + "required": [ + "appMetadata", + "fdc3Version", + "optionalFeatures", + "provider" + ] + }, + "IntentResolution": { + "description": "IntentResolution provides a standard format for data returned upon resolving an intent.\n\n```javascript\n//resolve a \"Chain\" type intent\nlet resolution = await agent.raiseIntent(\"intentName\", context);\n\n//resolve a \"Client-Service\" type intent with a data response or a Channel\nlet resolution = await agent.raiseIntent(\"intentName\", context);\ntry {\n\t const result = await resolution.getResult();\n if (result && result.broadcast) {\n console.log(`${resolution.source} returned a channel with id ${result.id}`);\n } else if (result){\n console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`);\n } else {\n console.error(`${resolution.source} didn't return data`\n }\n} catch(error) {\n console.error(`${resolution.source} returned an error: ${error}`);\n}\n\n// Use metadata about the resolving app instance to target a further intent\nawait agent.raiseIntent(\"intentName\", context, resolution.source);\n```", + "title": "IntentResolution", + "type": "object", + "properties": { + "source": { + "$ref": "#/definitions/AppIdentifier", + "description": "Identifier for the app instance that was selected (or started) to resolve the intent.\n`source.instanceId` MUST be set, indicating the specific app instance that\nreceived the intent.", + "title": "source" + }, + "intent": { + "description": "The intent that was raised. May be used to determine which intent the user\nchose in response to `fdc3.raiseIntentForContext()`.", + "type": "string", + "title": "intent" + }, + "version": { + "description": "The version number of the Intents schema being used.", + "type": "string", + "title": "version" + } + }, + "additionalProperties": false, + "required": [ + "intent", + "source" + ] + } + } +} diff --git a/schemas/api/appIdentifier.schema.json b/schemas/api/appIdentifier.schema.json deleted file mode 100644 index 6bd36fdb2..000000000 --- a/schemas/api/appIdentifier.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/appIdentifier.schema.json", - "title": "AppIdentifier", - "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls at specific applications.", - "type": "object", - "properties": { - "appId": { - "type": "string" - }, - "instanceId": { - "type": "string" - }, - "desktopAgent": { - "type": "string" - } - }, - "required": [ - "appId" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/appIntent.schema.json b/schemas/api/appIntent.schema.json deleted file mode 100644 index 1f2315d37..000000000 --- a/schemas/api/appIntent.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/appIntent.schema.json", - "title": "AppIntent", - "description": "Represents the binding of an intent to apps", - "type": "object", - "properties": { - "intent": { - "$ref": "intentMetadata.schema.json" - }, - "apps": { - "type": "array", - "items": { - "$ref": "appMetadata.schema.json" - } - } - }, - "required": [ - "intent", - "apps" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/appMetadata.schema.json b/schemas/api/appMetadata.schema.json deleted file mode 100644 index 14bfc1a8f..000000000 --- a/schemas/api/appMetadata.schema.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/appMetadata.schema.json", - "title": "AppMetadata", - "description": "Extends an AppIdentifier, describing an application or instance of an application.", - "type": "object", - "allOf": [ - { - "$ref": "appIdentifier.schema.json" - } - ], - "properties": { - "appId": true, - "instanceId": true, - "desktopAgent": true, - "name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "instanceMetadata": { - "type": "object" - }, - "title": { - "type": "string" - }, - "tooltip": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icons": { - "type": "array", - "items": { - "$ref": "icon.schema.json" - } - }, - "screenshots": { - "type": "array", - "items": { - "$ref": "image.schema.json" - } - }, - "resultType": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/baseImplementationMetadata.schema.json b/schemas/api/baseImplementationMetadata.schema.json index a07bc7cfa..28050a414 100644 --- a/schemas/api/baseImplementationMetadata.schema.json +++ b/schemas/api/baseImplementationMetadata.schema.json @@ -2,43 +2,57 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/api/baseImplementationMetadata.schema.json", "title": "BaseImplementationMetadata", - "description": "Base of Implementation Metadata used by Bridging that leaves out the metadata of the calling application (appMetadata)", + "description": "Metadata relating to the FDC3 Desktop Agent implementation and its provider.", "type": "object", "properties": { - "fdc3Version": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "providerVersion": { - "type": "string" - }, - "optionalFeatures": { - "type": "object", - "properties": { - "OriginatingAppMetadata": { - "type": "boolean" - }, - "UserChannelMembershipAPIs": { - "type": "boolean" - }, - "DesktopAgentBridging": { - "type": "boolean" - } + "fdc3Version": { + "description": "The version number of the FDC3 specification that the implementation provides.\nThe string must be a numeric semver version, e.g. 1.2 or 1.2.1.", + "type": "string", + "title": "fdc3Version" }, - "required": [ - "OriginatingAppMetadata", - "UserChannelMembershipAPIs", - "DesktopAgentBridging" - ], - "additionalProperties": false - } + "provider": { + "description": "The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, OpenFin etc.).", + "type": "string", + "title": "provider" + }, + "providerVersion": { + "description": "The version of the provider of the Desktop Agent implementation (e.g. 5.3.0).", + "type": "string", + "title": "providerVersion" + }, + "optionalFeatures": { + "description": "Metadata indicating whether the Desktop Agent implements optional features of\nthe Desktop Agent API.", + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "description": "Used to indicate whether the exposure of 'originating app metadata' for\ncontext and intent messages is supported by the Desktop Agent.", + "type": "boolean", + "title": "OriginatingAppMetadata" + }, + "UserChannelMembershipAPIs": { + "description": "Used to indicate whether the optional `fdc3.joinUserChannel`,\n`fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by\nthe Desktop Agent.", + "type": "boolean", + "title": "UserChannelMembershipAPIs" + }, + "DesktopAgentBridging": { + "description": "Used to indicate whether the experimental Desktop Agent Bridging\nfeature is implemented by the Desktop Agent.", + "type": "boolean", + "title": "DesktopAgentBridging" + } + }, + "additionalProperties": false, + "required": [ + "DesktopAgentBridging", + "OriginatingAppMetadata", + "UserChannelMembershipAPIs" + ], + "title": "optionalFeatures" + } }, + "additionalProperties": false, "required": [ "fdc3Version", - "provider", - "optionalFeatures" - ], - "additionalProperties": false + "optionalFeatures", + "provider" + ] } \ No newline at end of file diff --git a/schemas/api/channel.schema.json b/schemas/api/channel.schema.json deleted file mode 100644 index 76c80ce80..000000000 --- a/schemas/api/channel.schema.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/channel.schema.json", - "title": "Channel", - "description": "Represents a context channel that applications can join to share context data.", - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "user", - "app", - "private" - ] - }, - "displayMetadata": { - "$ref": "displayMetadata.schema.json" - } - }, - "required": [ - "id", - "type" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/contextMetadata.schema.json b/schemas/api/contextMetadata.schema.json deleted file mode 100644 index 29dd86436..000000000 --- a/schemas/api/contextMetadata.schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/contextMetadata.schema.json", - "title": "ContextMetadata", - "description": "Metadata relating to a context or intent & context received through the addContextListener and addIntentListener functions.", - "type": "object", - "properties": { - "source": { - "$ref": "appIdentifier.schema.json" - } - }, - "required": [ - "source" - ], - "additionalProperties": false -} diff --git a/schemas/api/desktopAgentIdentifier.schema.json b/schemas/api/desktopAgentIdentifier.schema.json deleted file mode 100644 index 471a65d05..000000000 --- a/schemas/api/desktopAgentIdentifier.schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/desktopAgentIdentifier.schema.json", - "title": "DesktopAgentIdentifier", - "description": "Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the source or destination of a message which was produced by or should be processed by the Desktop Agent itself rather than a specific application. Often added to messages by the Desktop Agent Bridge.", - "type": "object", - "properties": { - "desktopAgent": { - "type": "string" - } - }, - "required": [ - "desktopAgent" - ], - "unevaluatedProperties": false -} \ No newline at end of file diff --git a/schemas/api/displayMetadata.schema.json b/schemas/api/displayMetadata.schema.json deleted file mode 100644 index a83f5ef9a..000000000 --- a/schemas/api/displayMetadata.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/displayMetadata.schema.json", - "title": "DisplayMetadata", - "description": "A desktop agent (typically for user channels) may want to provide additional information about how a channel can be represented in a UI. A common use case is for color linking.", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "color": { - "type": "string" - }, - "glyph": { - "type": "string" - } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/errors.schema.json b/schemas/api/errors.schema.json deleted file mode 100644 index 2c50b00b1..000000000 --- a/schemas/api/errors.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/errors.schema.json", - "definitions": { - "OpenError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling the open method on the DesktopAgent object.", - "enum": [ - "AppNotFound", - "ErrorOnLaunch", - "AppTimeout", - "ResolverUnavailable", - "DesktopAgentNotFound" - ] - }, - "ResolveError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling the findIntent, findIntentsByContext, raiseIntent or raiseIntentForContext methods on the DesktopAgent.", - "enum": [ - "NoAppsFound", - "ResolverUnavailable", - "UserCancelledResolution", - "ResolverTimeout", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "IntentDeliveryFailed", - "DesktopAgentNotFound" - ] - }, - "ResultError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling the getResult method on the IntentResolution Object.", - "enum": [ - "NoResultReturned", - "IntentHandlerRejected" - ] - }, - "ChannelError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling channels using the joinUserChannel or getOrCreateChannel methods, or the getCurrentContext, broadcast or addContextListener methods on the Channel object.", - "enum": [ - "NoChannelFound", - "AccessDenied", - "CreationFailed" - ] - }, - "BridgingError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered by Desktop Agents when exchanging bridging messages.", - "enum": [ - "ResponseToBridgeTimedOut", - "AgentDisconnected", - "NotConnectedToBridge" - ] - } - } -} \ No newline at end of file diff --git a/schemas/api/icon.schema.json b/schemas/api/icon.schema.json deleted file mode 100644 index 951356324..000000000 --- a/schemas/api/icon.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/icon.schema.json", - "title": "Icon", - "description": "Metadata relating to a single icon image at a remote URL, used to represent an application in a user interface.", - "type": "object", - "properties": { - "src": { - "type": "string" - }, - "size": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "src" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/image.schema.json b/schemas/api/image.schema.json deleted file mode 100644 index 1f962a601..000000000 --- a/schemas/api/image.schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/image.schema.json", - "title": "Image", - "description": "Metadata relating to a single image at a remote URL, used to represent screenshot images.", - "type": "object", - "properties": { - "src": { - "type": "string" - }, - "size": { - "type": "string" - }, - "type": { - "type": "string" - }, - "label": { - "type": "string" - } - }, - "required": [ - "src" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/implementationMetadata.schema.json b/schemas/api/implementationMetadata.schema.json deleted file mode 100644 index cbfa33cc1..000000000 --- a/schemas/api/implementationMetadata.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", - "title": "ImplementationMetadata", - "description": "Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields from BaseImplementationMetadata and the metadata of the calling application according to the desktop agent.", - "type": "object", - "allOf": [ - { - "$ref": "baseImplementationMetadata.schema.json" - }, - { - "type":"object", - "properties": { - "fdc3Version":true, - "provider": true, - "providerVersion": true, - "optionalFeatures": true, - "appMetadata": { - "$ref": "appMetadata.schema.json" - } - }, - "required": [ - "fdc3Version", - "provider", - "optionalFeatures", - "appMetadata" - ], - "additionalProperties": false - } - ] -} \ No newline at end of file diff --git a/schemas/api/intentMetadata.schema.json b/schemas/api/intentMetadata.schema.json deleted file mode 100644 index 61cba896c..000000000 --- a/schemas/api/intentMetadata.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/intentMetadata.schema.json", - "title": "IntentMetadata", - "description": "The interface used to describe an intent within the platform.", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "displayName": { - "type": "string" - } - }, - "required": [ - "displayName" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/intentResolution.schema.json b/schemas/api/intentResolution.schema.json deleted file mode 100644 index 65a6138ed..000000000 --- a/schemas/api/intentResolution.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/intentResolution.schema.json", - "title": "IntentResolution", - "description": "IntentResolution provides a standard format for data returned upon resolving an intent.", - "type": "object", - "properties": { - "source": { - "$ref": "appIdentifier.schema.json" - }, - "intent": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "source", - "intent" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/api/intentResult.schema.json b/schemas/api/intentResult.schema.json deleted file mode 100644 index 4d8d89ea9..000000000 --- a/schemas/api/intentResult.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/intentResult.schema.json", - "title": "IntentResult", - "description": "Describes results that an Intent handler may optionally return that should be communicated back to the app that raised the intent, via the IntentResolution.", - "type": "object", - "oneOf": [ - { - "$ref": "../context/context.schema.json" - }, - { - "$ref": "channel.schema.json" - } - ] -} \ No newline at end of file diff --git a/schemas/api/t2sQuicktypeUtil.js b/schemas/api/t2sQuicktypeUtil.js new file mode 100644 index 000000000..86e6c270b --- /dev/null +++ b/schemas/api/t2sQuicktypeUtil.js @@ -0,0 +1,64 @@ +/** Utility for preparing arguments to quicktype, which workaround a specific + * quicktype bug in command line argument handling (where a directory is used + * as input the source language argument is ignored which causes our schemas + * to be interpreted as JSON input, rather than JSONSchema). + * Bug issue: + * */ + +const path = require('path'); +const fs = require('fs'); +const exec = require('child_process').exec; + +const args = process.argv.slice(2); +const outputPath = args.pop(); +const inputs = args; + +console.log('Inputs: ' + inputs.join(' | ')); +console.log('Output path argument: ' + outputPath); + +let source = ''; + +let dirIndex = 0; + +const excludedTypes = [ + 'DesktopAgent.ts', + 'Listener.ts', + 'Methods.ts', + 'PrivateChannel.ts', + 'Types.ts', + 'RecommendedChannels.ts', +]; + +let sources = ''; + +while (dirIndex < inputs.length) { + if (inputs[dirIndex].endsWith('.ts')) { + sources += `--src ${path.join(inputs[dirIndex])} `; + } else { + fs.readdirSync(inputs[dirIndex], { withFileTypes: true }).forEach(file => { + if (file.isDirectory()) { + inputs.push(path.join(inputs[dirIndex], file.name)); + } else { + if (!excludedTypes.includes(file.name)) { + sources += `--src ${path.join(inputs[dirIndex], file.name)} `; + } + } + }); + } + dirIndex++; +} + +// Normalise path to local quicktype executable. +const quicktypeExec = ['.', 'node_modules', '.bin', 'quicktype'].join(path.sep); + +const command = `${quicktypeExec} -l schema -o ${outputPath} ${sources}`; +console.log('command to run: ' + command); + +exec(command, function(error, stdout, stderr) { + if (stdout) { + console.log(stdout); + } + if (stderr) { + console.log(stderr); + } +}); diff --git a/schemas/bridging/agentRequest.schema.json b/schemas/bridging/agentRequest.schema.json index ca594f659..d88e78639 100644 --- a/schemas/bridging/agentRequest.schema.json +++ b/schemas/bridging/agentRequest.schema.json @@ -6,8 +6,23 @@ "description": "A request message from a Desktop Agent to the Bridge.", "properties": { "type": { - "title": "Message type", + "title": "Request Message type", "type": "string", + "enum": [ + "broadcastRequest", + "findInstancesRequest", + "findIntentRequest", + "findIntentsByContextRequest", + "getAppMetadataRequest", + "openRequest", + "PrivateChannel.broadcast", + "PrivateChannel.eventListenerAdded", + "PrivateChannel.onAddContextListener", + "PrivateChannel.onDisconnect", + "PrivateChannel.onUnsubscribe", + "raiseIntentRequest", + "raiseIntentResultResponse" + ], "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." }, "payload": { @@ -28,30 +43,20 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request" + "$ref": "common.schema.json#/$defs/RequestUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { "title": "Source identifier", "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "$ref": "common.schema.json#/$defs/RequestSource" }, "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "bridgeParticipantIdentifier.schema.json" + "$ref": "common.schema.json#/$defs/Destination" } }, "required": ["requestUuid", "timestamp"], diff --git a/schemas/bridging/agentResponse.schema.json b/schemas/bridging/agentResponse.schema.json index 2d8950258..b25fe59bf 100644 --- a/schemas/bridging/agentResponse.schema.json +++ b/schemas/bridging/agentResponse.schema.json @@ -8,6 +8,15 @@ "type": { "title": "Response Message Type", "type": "string", + "enum": [ + "findInstancesResponse", + "findIntentResponse", + "findIntentsByContextResponse", + "getAppMetadataResponse", + "openResponse", + "raiseIntentResponse", + "raiseIntentResultResponse" + ], "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." }, "payload": { @@ -28,29 +37,18 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request this message is responding to." + "$ref": "common.schema.json#/$defs/RequestUuid" }, "responseUuid": { - "type": "string", - "description": "UUID for this specific response message." + "$ref": "common.schema.json#/$defs/ResponseUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which the response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { "title": "Response Source identifier", "description": "Field that represents the source application instance that the response was produced by, or the Desktop Agent if it produced the response without an application.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "$ref": "common.schema.json#/$defs/ResponseSource" } }, "required": ["requestUuid", "responseUuid", "timestamp", "source"], diff --git a/schemas/bridging/bridgeParticipantIdentifier.schema.json b/schemas/bridging/bridgeParticipantIdentifier.schema.json deleted file mode 100644 index 3c56f7606..000000000 --- a/schemas/bridging/bridgeParticipantIdentifier.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeParticipantIdentifier.schema.json", - "title": "Bridge Participant Identifier", - "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", - "type": "object", - "oneOf": [ - { - "type": "object", - "allOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] -} \ No newline at end of file diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json index cbc42eea9..3c4f54d5f 100644 --- a/schemas/bridging/bridgeRequest.schema.json +++ b/schemas/bridging/bridgeRequest.schema.json @@ -28,23 +28,20 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request" + "$ref": "common.schema.json#/$defs/RequestUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { "title": "Source identifier", "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "$ref": "bridgeParticipantIdentifier.schema.json" + "$ref": "common.schema.json#/$defs/RequestSource" }, "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "bridgeParticipantIdentifier.schema.json" + "$ref": "common.schema.json#/$defs/Destination" } }, "required": ["requestUuid", "timestamp", "source"], diff --git a/schemas/bridging/bridgeResponse.schema.json b/schemas/bridging/bridgeResponse.schema.json index 31a0e2796..67823287d 100644 --- a/schemas/bridging/bridgeResponse.schema.json +++ b/schemas/bridging/bridgeResponse.schema.json @@ -28,45 +28,22 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request this message is responding to" + "$ref": "common.schema.json#/$defs/RequestUuid" }, "responseUuid": { - "type": "string", - "description": "Unique UUID for this collated response (generated by the bridge)." + "$ref": "common.schema.json#/$defs/ResponseUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which the response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "sources": { - "type": "array", - "items": [ - { - "$ref": "bridgeParticipantIdentifier.schema.json" - } - ], - "title": "Desktop Agents that responded", - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." + "$ref": "common.schema.json#/$defs/ResponseSources" }, "errorSources": { - "type": "array", - "items": [ - { - "$ref": "bridgeParticipantIdentifier.schema.json" - } - ], - "title": "Desktop Agents that errored", - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." + "$ref": "common.schema.json#/$defs/ResponseErrorSources" }, "errorDetails": { - "title": "Detail of errors returned", - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + "$ref": "common.schema.json#/$defs/ResponseErrorDetails" } }, "required": ["requestUuid", "responseUuid", "timestamp"], diff --git a/schemas/bridging/broadcastAgentRequest.schema.json b/schemas/bridging/broadcastAgentRequest.schema.json index 119a2c7ba..328cdff50 100644 --- a/schemas/bridging/broadcastAgentRequest.schema.json +++ b/schemas/bridging/broadcastAgentRequest.schema.json @@ -1,22 +1,24 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastAgentRequest.schema.json", - "title": "broadcast Agent Request", + "title": "Broadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/BroadcastRequestBase" }, { - "$ref": "#/$defs/BroadcastRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "BroadcastRequestBase": { + "title": "Broadcast Request", "type":"object", "description": "A request to broadcast context on a channel.", "properties": { "type": { + "title": "Broadcast Request Message Type", "const": "broadcastRequest" }, "payload": { @@ -24,7 +26,7 @@ "type": "object", "properties": { "channel": { - "$ref": "../api/channel.schema.json" + "$ref": "../api/api.schema.json#/definitions/Channel" }, "context": { "$ref": "../context/context.schema.json" @@ -40,7 +42,7 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "additionalProperties": false diff --git a/schemas/bridging/broadcastBridgeRequest.schema.json b/schemas/bridging/broadcastBridgeRequest.schema.json index 33341fd16..0ef5401aa 100644 --- a/schemas/bridging/broadcastBridgeRequest.schema.json +++ b/schemas/bridging/broadcastBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastBridgeRequest.schema.json", - "title": "broadcast Bridge Request", + "title": "Broadcast Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "broadcastAgentRequest.schema.json#/$defs/BroadcastRequestBase" }, { - "$ref": "broadcastAgentRequest.schema.json#/$defs/BroadcastRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/common.schema.json b/schemas/bridging/common.schema.json new file mode 100644 index 000000000..1044c969b --- /dev/null +++ b/schemas/bridging/common.schema.json @@ -0,0 +1,109 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/common.schema.json", + "title": "Bridging Commons", + "type": "object", + "description": "Common elements referenced by other schemas", + "$defs": { + "AgentRequestMeta": { + "title": "Agent Request Metadata", + "description": "Metadata for a request message sent by Desktop Agents to the Bridge.", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "#/$defs/RequestUuid" + }, + "timestamp": { + "$ref": "#/$defs/Timestamp" + }, + "source": { + "$ref": "#/$defs/Source" + }, + "destination": { + "$ref": "#/$defs/Destination" + } + }, + "required": ["requestUuid", "timestamp"], + "additionalProperties": false + }, + "RequestUuid": { + "title": "Request UUID", + "type": "string", + "description": "UUID for the request" + }, + "ResponseUuid": { + "title": "Response UUID", + "type": "string", + "description": "UUID for this specific response message." + }, + "Timestamp": { + "title": "Timestamp", + "type": "string", + "format": "date-time", + "description": "Timestamp at which request was generated" + }, + "RequestSource": { + "title": "Source identifier", + "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", + "oneOf": [ + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ] + }, + "ResponseSource": { + "title": "Source identifier", + "description": "Field that represents the source Desktop Agent that a response was received from.", + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + "BridgeParticipantIdentifier": { + "title": "Bridge Participant Identifier", + "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", + "type": "object", + "oneOf": [ + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ] + }, + "Destination": { + "title": "Destination identifier", + "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", + "$ref": "#/$defs/BridgeParticipantIdentifier" + }, + "ResponseSources": { + "title": "Desktop Agents that responded", + "type": "array", + "items": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ], + "description": "Array of DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." + }, + "ResponseErrorSources": { + "title": "Desktop Agents that errored", + "type": "array", + "items": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ], + "description": "Array of DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." + }, + "ResponseErrorDetails": { + "title": "Response Error Details", + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + } + } +} diff --git a/schemas/bridging/connectionStep.schema.json b/schemas/bridging/connectionStep.schema.json new file mode 100644 index 000000000..3c3a377b0 --- /dev/null +++ b/schemas/bridging/connectionStep.schema.json @@ -0,0 +1,51 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep.schema.json", + "title": "Connection Step Message", + "type": "object", + "description": "A message used during the connection flow for a Desktop Agent to the Bridge. Used for messages sent in either direction.", + "properties": { + "type": { + "title": "Connection Step Message type", + "type": "string", + "enum": [ + "hello", + "handshake", + "authenticationFailed", + "connectedAgentsUpdate" + ], + "description": "Identifies the type of the connection step message." + }, + "payload": { + "title": "Message payload", + "type": "object", + "description": "The message payload, containing data pertaining to this connection step.", + "unevaluatedProperties": false + }, + "meta": { + "$ref": "#/$defs/ConnectionStepMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "ConnectionStepMeta": { + "title": "Connection Step Metadata", + "description": "Metadata for this connection step message.", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + } + }, + "required": ["timestamp"], + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/connectionStep2Hello.schema.json b/schemas/bridging/connectionStep2Hello.schema.json index 37b34c920..0ac240f6c 100644 --- a/schemas/bridging/connectionStep2Hello.schema.json +++ b/schemas/bridging/connectionStep2Hello.schema.json @@ -1,51 +1,71 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep2Hello.schema.json", - "title": "connectionStep2Hello", + "title": "ConnectionStep2Hello", "type": "object", - "properties": { - "type": { - "const": "hello" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep2HelloBase" }, - "payload": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep2HelloBase": { + "type":"object", + "title": "ConnectionStep2Hello", + "description": "Hello message sent by the Bridge to anyone connecting to the Bridge (enables identification as a bridge and confirmation of whether authentication is required)", "properties": { - "desktopAgentBridgeVersion": { - "description": "The version of the Bridge", - "type": "string" - }, - "supportedFDC3Versions": { - "type": "array", - "description": "The FDC3 versions supported by the Bridge", - "items": { - "type": "string" - } + "type": { + "title": "Connection Step 2 Message Type", + "const": "hello" }, - "authRequired": { - "type": "boolean", - "description": "A flag indicating whether the Desktop Agent Bridge requires authentication or not." + "payload": { + "title": "Connection Step 2 Payload", + "type": "object", + "properties": { + "desktopAgentBridgeVersion": { + "title": "Desktop Agent Bridge Version Number", + "description": "The version of the Bridge", + "type": "string" + }, + "supportedFDC3Versions": { + "title": "Supported FDC3 Versions", + "type": "array", + "description": "The FDC3 versions supported by the Bridge", + "items": { + "type": "string" + } + }, + "authRequired": { + "title": "Authentication Required", + "type": "boolean", + "description": "A flag indicating whether the Desktop Agent Bridge requires authentication or not." + }, + "authToken": { + "title": "Authentication Token", + "type": "string", + "description": "An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to authenticate a bridge." + } + }, + "additionalProperties": false, + "required": ["desktopAgentBridgeVersion", "supportedFDC3Versions", "authRequired"] }, - "authToken": { - "type": "string", - "description": "An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to authenticate a bridge." - } - }, - "additionalProperties": false, - "required": ["desktopAgentBridgeVersion", "supportedFDC3Versions", "authRequired"] - }, - "meta": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 2 Metadata", + "type": "object", + "properties": { + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["timestamp"] } }, - "additionalProperties": false, - "required": ["timestamp"] + "required": ["type", "payload", "meta"], + "additionalProperties": false } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/schemas/bridging/connectionStep3Handshake.schema.json b/schemas/bridging/connectionStep3Handshake.schema.json index 50b49f193..dbc046463 100644 --- a/schemas/bridging/connectionStep3Handshake.schema.json +++ b/schemas/bridging/connectionStep3Handshake.schema.json @@ -1,57 +1,77 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep3Handshake.schema.json", - "title": "connectionStep3Handshake", + "title": "ConnectionStep3Handshake", "type": "object", - "properties": { - "type": { - "const": "handshake" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep3HandshakeBase" }, - "payload": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep3HandshakeBase": { + "type":"object", + "title": "ConnectionStep3Handshake", + "description": "Handshake message sent by the Desktop Agent to the Bridge (including requested name, channel state and authentication data)", "properties": { - "implementationMetadata": { - "description": "DesktopAgent implementationMetadata trying to connect to the bridge.", - "$ref": "../api/baseImplementationMetadata.schema.json" - }, - "requestedName": { - "description": "The requested Desktop Agent name", - "type": "string" + "type": { + "title": "Connection Step 3 Message Type", + "const": "handshake" }, - "channelsState": { + "payload": { + "title": "Connection Step 3 Payload", "type": "object", - "description": "The current state of the Desktop Agent's channels, excluding any private channels, as a mapping of channel id to an array of Context objects, most recent first.", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "../context/context.schema.json" + "properties": { + "implementationMetadata": { + "title": "Desktop Agent ImplementationMetadata", + "description": "Desktop Agent ImplementationMetadata trying to connect to the bridge.", + "$ref": "../api/baseImplementationMetadata.schema.json" + }, + "requestedName": { + "title": "Requested name", + "description": "The requested Desktop Agent name", + "type": "string" + }, + "channelsState": { + "title": "Channel State", + "type": "object", + "description": "The current state of the Desktop Agent's channels, excluding any private channels, as a mapping of channel id to an array of Context objects, most recent first.", + "additionalProperties": { + "title": "Channel ", + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } } - } - }, - "authToken": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["implementationMetadata", "requestedName", "channelsState"] - }, - "meta": { - "type": "object", - "properties": { - "requestUuid": { - "type": "string", - "description": "Unique UUID for the request" + }, + "authToken": { + "title": "Authentication Token", + "type": "string" + } + }, + "additionalProperties": false, + "required": ["implementationMetadata", "requestedName", "channelsState"] }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 3 Metadata", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["requestUuid", "timestamp"] } }, - "additionalProperties": false, - "required": ["requestUuid", "timestamp"] + "required": ["type", "payload", "meta"], + "additionalProperties": false } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/schemas/bridging/connectionStep4AuthenticationFailed.schema.json b/schemas/bridging/connectionStep4AuthenticationFailed.schema.json index 28e2c11cf..6cae52eca 100644 --- a/schemas/bridging/connectionStep4AuthenticationFailed.schema.json +++ b/schemas/bridging/connectionStep4AuthenticationFailed.schema.json @@ -1,42 +1,57 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json", - "title": "connectionStep4AuthenticationFailed", + "title": "ConnectionStep4AuthenticationFailed", "type": "object", - "properties": { - "type": { - "const": "authenticationFailed" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep4AuthenticationFailedBase" }, - "payload": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "additionalProperties": false - }, - "meta": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep4AuthenticationFailedBase": { + "type":"object", + "title": "ConnectionStep4AuthenticationFailed", + "description": "Message sent by Bridge to Desktop Agent if their authentication fails.", "properties": { - "requestUuid": { - "type": "string", - "description": "Unique UUID for the request" + "type": { + "title": "Connection Step 4 Message Type", + "const": "authenticationFailed" }, - "responseUuid": { - "type": "string", - "description": "Unique UUID for the response" + "payload": { + "title": "Connection Step 4 Payload", + "type": "object", + "properties": { + "message": { + "title": "Authentication failed message", + "type": "string" + } + }, + "additionalProperties": false }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 4 Metadata", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["requestUuid", "responseUuid", "timestamp"] } }, - "additionalProperties": false, - "required": ["requestUuid", "responseUuid", "timestamp"] + "required": ["type", "meta"], + "additionalProperties": false } - }, - "required": ["type", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json index 7b710aa62..17706795c 100644 --- a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json +++ b/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -1,65 +1,83 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json", - "title": "connectionStep6ConnectedAgentsUpdate", + "title": "ConnectionStep6ConnectedAgentsUpdate", "type": "object", - "properties": { - "type": { - "const": "connectedAgentsUpdate" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep6ConnectedAgentsUpdateBase" }, - "payload": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep6ConnectedAgentsUpdateBase": { + "type":"object", + "title": "ConnectionStep6ConnectedAgentsUpdateBase", + "description": "Message sent by Bridge to all Desktop Agent when an agent joins or leaves the bridge, includes the details of all agents, the change made and the expected channel state for all agents.", "properties": { - "addAgent": { - "type": "string", - "description": "Should be set when an agent first connects to the bridge and provide its assigned name." - }, - "removeAgent": { - "type": "string", - "description": "Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned." - }, - "allAgents": { - "type": "array", - "description": "Desktop Agent Bridge implementation metadata of all connected agents.", - "items": { - "$ref": "../api/implementationMetadata.schema.json" - } + "type": { + "title": "Connection Step 6 Message Type", + "const": "connectedAgentsUpdate" }, - "channelsState": { + "payload": { + "title": "Connection Step 6 Payload", "type": "object", - "description": "The updated state of channels that should be adopted by the agents. Should only be set when an agent is connecting to the bridge.", - "additionalProperties": { - "type": "array", + "properties": { + "addAgent": { + "title": "Agents To Add", + "type": "string", + "description": "Should be set when an agent first connects to the bridge and provide its assigned name." + }, + "removeAgent": { + "title": "Agents To Remove", + "type": "string", + "description": "Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned." + }, + "allAgents": { + "title": "All Connected Agents", + "type": "array", + "description": "Desktop Agent Bridge implementation metadata of all connected agents.", "items": { - "$ref": "../context/context.schema.json" + "$ref": "../api/baseImplementationMetadata.schema.json" } - } - } - }, - "additionalProperties": false, - "required": ["allAgents"] - }, - "meta": { - "type": "object", - "properties": { - "requestUuid": { - "type": "string", - "description": "Unique UUID for the request" - }, - "responseUuid": { - "type": "string", - "description": "Unique UUID for the response" + }, + "channelsState": { + "title": "Channel State", + "type": "object", + "description": "The updated state of channels that should be adopted by the agents. Should only be set when an agent is connecting to the bridge.", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } + } + } + }, + "additionalProperties": false, + "required": ["allAgents"] }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 6 Metadata", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["requestUuid", "responseUuid", "timestamp"] } }, - "additionalProperties": false, - "required": ["requestUuid", "responseUuid", "timestamp"] + "required": ["type", "payload", "meta"], + "additionalProperties": false } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/schemas/bridging/findInstancesAgentRequest.schema.json b/schemas/bridging/findInstancesAgentRequest.schema.json index 926ab7f09..f4cd4ba54 100644 --- a/schemas/bridging/findInstancesAgentRequest.schema.json +++ b/schemas/bridging/findInstancesAgentRequest.schema.json @@ -1,46 +1,48 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentRequest.schema.json", - "title": "findInstances Agent Request", + "title": "FindInstances Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/FindInstancesRequestBase" }, { - "$ref": "#/$defs/FindInstancesRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "FindInstancesRequestBase": { + "title": "FindInstances Request", "type": "object", "description": "A request for details of instances of a particular app", "properties":{ "type": { + "title": "FindInstances Request Message Type", "const": "findInstancesRequest" }, "payload": { "type": "object", - "title": "findInstances request payload", + "title": "FindInstances Request Payload", "properties": { "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["app"], "additionalProperties": false }, "meta": { + "title": "FindInstances request metadata", "type": "object", - "title": "findInstances request metadata", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/desktopAgentIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/findInstancesAgentResponse.schema.json b/schemas/bridging/findInstancesAgentResponse.schema.json index bc2a778f8..67f3937c6 100644 --- a/schemas/bridging/findInstancesAgentResponse.schema.json +++ b/schemas/bridging/findInstancesAgentResponse.schema.json @@ -1,39 +1,44 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json", - "title": "findInstances Agent Response", + "title": "FindInstances Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/FindInstancesResponseBase" }, { - "$ref": "#/$defs/FindInstancesResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "FindInstancesResponseBase": { + "title": "FindInstances Response", "type": "object", "description": "A response to a findInstances request.", "properties": { "type": { + "title": "FindInstances Response Message Type", "const": "findInstancesResponse" }, "payload": { + "title": "FindInstances Response Payload", "type": "object", - "title": "findInstances Response Payload", "properties": { "appIdentifiers": { "type": "array", "items": { - "$ref": "../api/appMetadata.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppMetadata" } } }, "required": ["appIdentifiers"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "FindInstances Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/schemas/bridging/findInstancesBridgeRequest.schema.json b/schemas/bridging/findInstancesBridgeRequest.schema.json index 59079fff6..9b27a2e19 100644 --- a/schemas/bridging/findInstancesBridgeRequest.schema.json +++ b/schemas/bridging/findInstancesBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeRequest.schema.json", - "title": "findInstances Bridge Request", + "title": "FindInstances Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "findInstancesAgentRequest.schema.json#/$defs/FindInstancesRequestBase" }, { - "$ref": "findInstancesAgentRequest.schema.json#/$defs/FindInstancesRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/findInstancesBridgeResponse.schema.json b/schemas/bridging/findInstancesBridgeResponse.schema.json index 034cc3c68..17d398845 100644 --- a/schemas/bridging/findInstancesBridgeResponse.schema.json +++ b/schemas/bridging/findInstancesBridgeResponse.schema.json @@ -1,39 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json", - "title": "findInstances Bridge Response", + "title": "FindInstances Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "findInstancesAgentResponse.schema.json#/$defs/FindInstancesResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "title": "findInstances bridge response metadata", - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/schemas/bridging/findIntentAgentRequest.schema.json b/schemas/bridging/findIntentAgentRequest.schema.json index b91e0bb87..d5255f07c 100644 --- a/schemas/bridging/findIntentAgentRequest.schema.json +++ b/schemas/bridging/findIntentAgentRequest.schema.json @@ -1,32 +1,36 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json", - "title": "findIntents Agent Request", + "title": "FindIntents Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/FindIntentRequestBase" }, { - "$ref": "#/$defs/FindIntentRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "FindIntentRequestBase": { + "title": "FindIntent Request", "type": "object", "description": "A request for details of apps available to resolve a particular intent and context pair.", "properties": { "type": { + "title": "FindIntent Request Message Type", "const": "findIntentRequest" }, "payload": { - "title": "findIntent request payload", + "title": "FindIntent Request Payload", "type": "object", "properties": { "intent": { + "title": "Intent name", "type": "string" }, "context": { + "title": "Context argument", "$ref": "../context/context.schema.json" } }, @@ -34,13 +38,13 @@ "additionalProperties": false }, "meta": { + "title" : "FindIntent Request Metadata", "type": "object", - "title" : "findIntent request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/findIntentAgentResponse.schema.json b/schemas/bridging/findIntentAgentResponse.schema.json index 3a7a98508..8969469bf 100644 --- a/schemas/bridging/findIntentAgentResponse.schema.json +++ b/schemas/bridging/findIntentAgentResponse.schema.json @@ -1,36 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json", - "title": "findIntent Agent Response", + "title": "FindIntent Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/FindIntentResponseBase" }, { - "$ref": "#/$defs/FindIntentResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "FindIntentResponseBase": { + "title": "FindIntent Response", "type": "object", "description": "A response to a findIntent request.", "properties": { "type": { + "title": "FindIntent Response Message Type", "const": "findIntentResponse" }, "payload": { + "title": "FindIntent Response Payload", "type": "object", - "title": "findIntent response payload", "properties": { "appIntent": { - "$ref": "../api/appIntent.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIntent" } }, "required": ["appIntent"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "FindIntent Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/schemas/bridging/findIntentBridgeRequest.schema.json b/schemas/bridging/findIntentBridgeRequest.schema.json index 5c3a7b480..8903f567f 100644 --- a/schemas/bridging/findIntentBridgeRequest.schema.json +++ b/schemas/bridging/findIntentBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeRequest.schema.json", - "title": "findIntent Bridge Request", + "title": "FindIntent Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "findIntentAgentRequest.schema.json#/$defs/FindIntentRequestBase" }, { - "$ref": "findIntentAgentRequest.schema.json#/$defs/FindIntentRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/findIntentBridgeResponse.schema.json b/schemas/bridging/findIntentBridgeResponse.schema.json index b608bbb73..43655a400 100644 --- a/schemas/bridging/findIntentBridgeResponse.schema.json +++ b/schemas/bridging/findIntentBridgeResponse.schema.json @@ -1,39 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json", - "title": "findIntent Bridge Response", + "title": "FindIntent Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "findIntentAgentResponse.schema.json#/$defs/FindIntentResponseBase" }, + { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "title": "findIntent bridge response metadata", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/schemas/bridging/findIntentsByContextAgentRequest.schema.json b/schemas/bridging/findIntentsByContextAgentRequest.schema.json index 9df449fcc..9b191234c 100644 --- a/schemas/bridging/findIntentsByContextAgentRequest.schema.json +++ b/schemas/bridging/findIntentsByContextAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json", - "title": "findIntentsByContext Agent Request", + "title": "FindIntentsByContext Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/FindIntentsByContextRequestBase" }, { - "$ref": "#/$defs/FindIntentsByContextRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "FindIntentsByContextRequestBase": { + "title": "FindIntentsByContext Request", "type": "object", "description": "A request for details of intents and apps available to resolve them for a particular context.", "properties": { "type": { + "title": "FindIntentsByContext Request Message Type", "const": "findIntentsByContextRequest" }, "payload": { + "title": "FindIntentsByContext Request Payload", "type": "object", - "title": "findIntentsByContext request payload", "properties": { "context": { "$ref": "../context/context.schema.json" @@ -31,13 +33,13 @@ "additionalProperties": false }, "meta": { + "title": "FindIntentsByContext Request Metadata", "type": "object", - "title": "findIntentsByContext request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/findIntentsByContextAgentResponse.schema.json b/schemas/bridging/findIntentsByContextAgentResponse.schema.json index f4815d5bf..7f909d419 100644 --- a/schemas/bridging/findIntentsByContextAgentResponse.schema.json +++ b/schemas/bridging/findIntentsByContextAgentResponse.schema.json @@ -1,32 +1,34 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json", - "title": "findIntentsByContext Agent Response", + "title": "FindIntentsByContext Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/FindIntentsByContextResponseBase" }, { - "$ref": "#/$defs/FindIntentsByContextResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "FindIntentsByContextResponseBase": { + "title": "FindIntentsByContext Response", "type": "object", "description": "A response to a findIntentsByContext request.", "properties": { "type": { + "title": "FindIntentsByContext Response Message Type", "const": "findIntentsByContextResponse" }, "payload": { + "title": "FindIntentsByContext Response Payload", "type": "object", - "title": "findIntentsByContext response payload", "properties": { "appIntents": { "type": "array", "items": { - "$ref": "../api/appIntent.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIntent" }, "additionalProperties": false } @@ -34,7 +36,10 @@ "additionalProperties": false, "required": ["appIntents"] }, - "meta": true + "meta": { + "title": "FindIntentsByContext Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/schemas/bridging/findIntentsByContextBridgeRequest.schema.json b/schemas/bridging/findIntentsByContextBridgeRequest.schema.json index 8f5a8e193..61ad738d7 100644 --- a/schemas/bridging/findIntentsByContextBridgeRequest.schema.json +++ b/schemas/bridging/findIntentsByContextBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json", - "title": "findIntentsByContext Bridge Request", + "title": "FindIntentsByContext Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "findIntentsByContextAgentRequest.schema.json#/$defs/FindIntentsByContextRequestBase" }, { - "$ref": "findIntentsByContextAgentRequest.schema.json#/$defs/FindIntentsByContextRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/findIntentsByContextBridgeResponse.schema.json b/schemas/bridging/findIntentsByContextBridgeResponse.schema.json index b930113aa..edb5c0683 100644 --- a/schemas/bridging/findIntentsByContextBridgeResponse.schema.json +++ b/schemas/bridging/findIntentsByContextBridgeResponse.schema.json @@ -1,39 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json", - "title": "findIntentsByContext Bridge Response", - "type": "object", + "title": "FindIntentsByContext Bridge Response", + "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "findIntentsByContextAgentResponse.schema.json#/$defs/FindIntentsByContextResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "title": "findIntentsByContext response metadata", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/schemas/bridging/getAppMetadataAgentRequest.schema.json b/schemas/bridging/getAppMetadataAgentRequest.schema.json index 07fce5ed5..6f313c27c 100644 --- a/schemas/bridging/getAppMetadataAgentRequest.schema.json +++ b/schemas/bridging/getAppMetadataAgentRequest.schema.json @@ -1,45 +1,48 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentRequest.schema.json", - "title": "getAppMetadata Agent Request", + "title": "GetAppMetadata Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/GetAppMetadataRequestBase" }, { - "$ref": "#/$defs/GetAppMetadataRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "GetAppMetadataRequestBase": { + "title": "GetAppMetadata Request", "type": "object", "description": "A request for metadata about an app", "properties": { "type": { + "title": "GetAppMetadata Request Message Type", "const": "getAppMetadataRequest" }, "payload": { + "title": "GetAppMetadata Request Payload", "type": "object", "properties": { "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["app"], "additionalProperties": false }, "meta": { + "title" : "GetAppMetadata Request Metadata", "type": "object", - "title" : "getAppMetadata request metadata", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/desktopAgentIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/getAppMetadataAgentResponse.schema.json b/schemas/bridging/getAppMetadataAgentResponse.schema.json index 59d3eb5f8..65aad070c 100644 --- a/schemas/bridging/getAppMetadataAgentResponse.schema.json +++ b/schemas/bridging/getAppMetadataAgentResponse.schema.json @@ -1,35 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json", - "title": "getAppMetadata Agent Response", + "title": "GetAppMetadata Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/GetAppMetadataResponseBase" }, { - "$ref": "#/$defs/GetAppMetadataResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "GetAppMetadataResponseBase": { + "title": "GetAppMetadata Response", "type": "object", "description": "A response to a getAppMetadata request.", "properties": { "type": { + "title": "GetAppMetadata Response Message Type", "const": "getAppMetadataResponse" }, "payload": { + "title": "GetAppMetadata Response Payload", "type": "object", "properties": { "appMetadata": { - "$ref": "../api/appMetadata.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppMetadata" } }, "required": ["appMetadata"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "GetAppMetadata Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/schemas/bridging/getAppMetadataBridgeRequest.schema.json b/schemas/bridging/getAppMetadataBridgeRequest.schema.json index 8b8ba164d..a5bccc3d8 100644 --- a/schemas/bridging/getAppMetadataBridgeRequest.schema.json +++ b/schemas/bridging/getAppMetadataBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json", - "title": "getAppMetadata Bridge Request", + "title": "GetAppMetadata Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "getAppMetadataAgentRequest.schema.json#/$defs/GetAppMetadataRequestBase" }, { - "$ref": "getAppMetadataAgentRequest.schema.json#/$defs/GetAppMetadataRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/getAppMetadataBridgeResponse.schema.json b/schemas/bridging/getAppMetadataBridgeResponse.schema.json index 6809f5366..2b883d7c5 100644 --- a/schemas/bridging/getAppMetadataBridgeResponse.schema.json +++ b/schemas/bridging/getAppMetadataBridgeResponse.schema.json @@ -1,38 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json", - "title": "getAppMetadata Bridge Response", + "title": "GetAppMetadata Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "getAppMetadataAgentResponse.schema.json#/$defs/GetAppMetadataResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/schemas/bridging/openAgentRequest.schema.json b/schemas/bridging/openAgentRequest.schema.json index 6e3f917d8..e72813efd 100644 --- a/schemas/bridging/openAgentRequest.schema.json +++ b/schemas/bridging/openAgentRequest.schema.json @@ -1,29 +1,32 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentRequest.schema.json", - "title": "open Agent Request", + "title": "Open Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/OpenRequestBase" }, { - "$ref": "#/$defs/OpenRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "OpenRequestBase": { + "title": "Open Request", "type": "object", "description": "A request to open an application", "properties": { "type": { + "title": "Open Request Message Type", "const": "openRequest" }, "payload": { + "title": "Open Request Payload", "type": "object", "properties": { "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "context": { "$ref": "../context/context.schema.json" @@ -33,14 +36,15 @@ "additionalProperties": false }, "meta": { + "title": "Open Request Metadata", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/desktopAgentIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "additionalProperties": false diff --git a/schemas/bridging/openAgentResponse.schema.json b/schemas/bridging/openAgentResponse.schema.json index 62a49ac63..5c714f260 100644 --- a/schemas/bridging/openAgentResponse.schema.json +++ b/schemas/bridging/openAgentResponse.schema.json @@ -1,35 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json", - "title": "open Agent Response", + "title": "Open Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/OpenResponseBase" }, { - "$ref": "#/$defs/OpenResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "OpenResponseBase": { + "title": "Open Response", "type": "object", "description": "A response to an open request", "properties": { "type": { + "title": "Open Response Message Type", "const": "openResponse" }, "payload": { + "title": "Open Response Payload", "type": "object", "properties": { "appIdentifier": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["appIdentifier"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "Open Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/schemas/bridging/openBridgeRequest.schema.json b/schemas/bridging/openBridgeRequest.schema.json index 2d9034bdc..55ec1515a 100644 --- a/schemas/bridging/openBridgeRequest.schema.json +++ b/schemas/bridging/openBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeRequest.schema.json", - "title": "open Bridge Request", + "title": "Open Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "openAgentRequest.schema.json#/$defs/OpenRequestBase" }, { - "$ref": "openAgentRequest.schema.json#/$defs/OpenRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/openBridgeResponse.schema.json b/schemas/bridging/openBridgeResponse.schema.json index 4bfd321f5..8d69b1d50 100644 --- a/schemas/bridging/openBridgeResponse.schema.json +++ b/schemas/bridging/openBridgeResponse.schema.json @@ -1,38 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json", - "title": "open Bridge Response", + "title": "Open Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "openAgentResponse.schema.json#/$defs/OpenResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json index ef9d06e28..17b5b6519 100644 --- a/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json +++ b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json", - "title": "privateChannelBroadcast Agent Request", + "title": "PrivateChannelBroadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelBroadcastRequestBase" }, { - "$ref": "#/$defs/PrivateChannelBroadcastRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelBroadcastRequestBase": { + "title": "PrivateChannelBroadcast Request", "type": "object", "description": "A request to broadcast on a PrivateChannel.", "properties": { "type": { + "title": "Private Channel Broadcast Message type", "const": "PrivateChannel.broadcast" }, "payload": { + "title": "PrivateChannelBroadcast Request Payload", "type": "object", - "title": "privateChannel broadcast request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "context"] }, "meta": { + "title": "PrivateChannelBroadcast Request Metadata", "type": "object", - "title": "privateChannel broadcast request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json b/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json index ed80f6fd9..38bbd4f45 100644 --- a/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json +++ b/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json", - "title": "privateChannelBroadcast Bridge Request", + "title": "PrivateChannelBroadcast Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelBroadcastAgentRequest.schema.json#/$defs/PrivateChannelBroadcastRequestBase" }, { - "$ref": "privateChannelBroadcastAgentRequest.schema.json#/$defs/PrivateChannelBroadcastRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json b/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json index 089323c44..4a212b3d0 100644 --- a/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json +++ b/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json", - "title": "privateChannelEventListenerAdded Agent Request", + "title": "PrivateChannelEventListenerAdded Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelEventListenerAddedRequestBase" }, { - "$ref": "#/$defs/PrivateChannelEventListenerAddedRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelEventListenerAddedRequestBase": { + "title": "PrivateChannelEventListenerAdded Request", "type": "object", "description": "A request to forward on an EventListenerAdded event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel EventListenerAdded Message type", "const": "PrivateChannel.eventListenerAdded" }, "payload": { + "title": "PrivateChannelEventListenerAdded Request Payload", "type": "object", - "title": "privateChannel eventListenerAdded request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "context"] }, "meta": { + "title": "PrivateChannelEventListenerAdded Request Metadata", "type": "object", - "title": "privateChannel eventListenerAdded request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json b/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json index 3b7397b74..31993207b 100644 --- a/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json +++ b/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json", - "title": "privateChannelEventListenerAdded Bridge Request", + "title": "PrivateChannelEventListenerAdded Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelEventListenerAddedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerAddedRequestBase" }, { - "$ref": "privateChannelEventListenerAddedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerAddedRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json b/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json index 546e31374..4a0ffedd1 100644 --- a/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json +++ b/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json", - "title": "privateChannelEventListenerRemoved Agent Request", + "title": "PrivateChannelEventListenerRemoved Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelEventListenerRemovedRequestBase" }, { - "$ref": "#/$defs/PrivateChannelEventListenerRemovedRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelEventListenerRemovedRequestBase": { + "title": "PrivateChannelEventListenerRemoved Request", "type": "object", "description": "A request to forward on an EventListenerRemoved event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel EventListenerRemoved Message type", "const": "PrivateChannel.eventListenerRemoved" }, "payload": { + "title": "PrivateChannelEventListenerRemoved Request Payload", "type": "object", - "title": "privateChannel eventListenerRemoved request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "listenerType"] }, "meta": { + "title": "PrivateChannelEventListenerRemoved Request Metadata", "type": "object", - "title": "privateChannel eventListenerRemoved request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json b/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json index 24b8b3cec..e41b1e1b5 100644 --- a/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json +++ b/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json", - "title": "privateChannelEventListenerRemoved Bridge Request", + "title": "PrivateChannelEventListenerRemoved Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelEventListenerRemovedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerRemovedRequestBase" }, { - "$ref": "privateChannelEventListenerRemovedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerRemovedRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json index 169857930..b73b53a26 100644 --- a/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json +++ b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json", - "title": "privateChannelOnAddContextListener Agent Request", + "title": "PrivateChannelOnAddContextListener Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelOnAddContextListenerRequestBase" }, { - "$ref": "#/$defs/PrivateChannelOnAddContextListenerRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelOnAddContextListenerRequestBase": { + "title": "PrivateChannelOnAddContextListener Request", "type": "object", "description": "A request to forward on an AddCOntextListener event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel OnAddContextListener Message type", "const": "PrivateChannel.onAddContextListener" }, "payload": { + "title": "PrivateChannelOnAddContextListener Request Payload", "type": "object", - "title": "privateChannel onAddContextListener request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "contextType"] }, "meta": { + "title": "PrivateChannelOnAddContextListener Request Metadata", "type": "object", - "title": "privateChannel onAddContextListener request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json b/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json index 05ea74b49..c8f093481 100644 --- a/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json +++ b/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json", - "title": "privateChannelOnAddContextListener Bridge Request", + "title": "PrivateChannelOnAddContextListener Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelOnAddContextListenerAgentRequest.schema.json#/$defs/PrivateChannelOnAddContextListenerRequestBase" }, { - "$ref": "privateChannelOnAddContextListenerAgentRequest.schema.json#/$defs/PrivateChannelOnAddContextListenerRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json b/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json index 8b137372c..dda363660 100644 --- a/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json +++ b/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json", - "title": "privateChannelOnDisconnect Agent Request", + "title": "PrivateChannelOnDisconnect Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelOnDisconnectRequestBase" }, { - "$ref": "#/$defs/PrivateChannelOnDisconnectRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelOnDisconnectRequestBase": { + "title": "PrivateChannelOnDisconnect Request", "type": "object", "description": "A request to forward on a Disconnect event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel OnDisconnect Message type", "const": "PrivateChannel.onDisconnect" }, "payload": { + "title": "PrivateChannelOnDisconnect Request Payload", "type": "object", - "title": "privateChannel onDisconnect request payload", "properties": { "channel": { "type": "string" @@ -31,16 +33,16 @@ "required": ["channel"] }, "meta": { + "title": "PrivateChannelOnDisconnect Request Metadata", "type": "object", - "title": "privateChannel onDisconnect request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json b/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json index b4e31ddcc..73742515f 100644 --- a/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json +++ b/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json", - "title": "privateChannelOnDisconnect Bridge Request", + "title": "PrivateChannelOnDisconnect Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelOnDisconnectAgentRequest.schema.json#/$defs/PrivateChannelOnDisconnectRequestBase" }, { - "$ref": "privateChannelOnDisconnectAgentRequest.schema.json#/$defs/PrivateChannelOnDisconnectRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json b/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json index 75649b334..45c9b178a 100644 --- a/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json +++ b/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json", - "title": "privateChannelOnUnsubscribe Agent Request", + "title": "PrivateChannelOnUnsubscribe Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelOnUnsubscribeRequestBase" }, { - "$ref": "#/$defs/PrivateChannelOnUnsubscribeRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelOnUnsubscribeRequestBase": { + "title": "PrivateChannelOnUnsubscribe Request", "type": "object", "description": "A request to forward on an Unsubscribe event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel OnUnsubscribe Message type", "const": "PrivateChannel.onUnsubscribe" }, "payload": { + "title": "PrivateChannelOnUnsubscribe Request Payload", "type": "object", - "title": "privateChannel onUnsubscribe request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "contextType"] }, "meta": { + "title": "PrivateChannelOnUnsubscribe Request Metadata", "type": "object", - "title": "privateChannel onUnsubscribe request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json b/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json index 0f76ebd19..5e364e3db 100644 --- a/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json +++ b/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json @@ -5,10 +5,10 @@ "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelOnUnsubscribeAgentRequest.schema.json#/$defs/PrivateChannelOnUnsubscribeRequestBase" }, { - "$ref": "privateChannelOnUnsubscribeAgentRequest.schema.json#/$defs/PrivateChannelOnUnsubscribeRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/raiseIntentAgentRequest.schema.json b/schemas/bridging/raiseIntentAgentRequest.schema.json index d597f673a..a4bf1f4e9 100644 --- a/schemas/bridging/raiseIntentAgentRequest.schema.json +++ b/schemas/bridging/raiseIntentAgentRequest.schema.json @@ -1,25 +1,28 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentRequest.schema.json", - "title": "raiseIntent Agent Request", + "title": "RaiseIntent Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/RaiseIntentRequestBase" }, { - "$ref": "#/$defs/RaiseIntentRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "RaiseIntentRequestBase": { + "title": "RaiseIntent Request", "type": "object", "description": "A request to raise an intent.", "properties": { "type": { + "title": "RaiseIntent Request Message type", "const": "raiseIntentRequest" }, "payload": { + "title": "RaiseIntent Request Payload", "type": "object", "properties": { "intent": { @@ -29,21 +32,23 @@ "$ref": "../context/context.schema.json" }, "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["intent", "context", "app"], "additionalProperties": false }, "meta": { + "title": "RaiseIntent Request Metadata", + "type": "object", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false, diff --git a/schemas/bridging/raiseIntentAgentResponse.schema.json b/schemas/bridging/raiseIntentAgentResponse.schema.json index 52caf1369..30c0ec397 100644 --- a/schemas/bridging/raiseIntentAgentResponse.schema.json +++ b/schemas/bridging/raiseIntentAgentResponse.schema.json @@ -1,35 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentResponse.schema.json", - "title": "raiseIntent Agent Response", + "title": "RaiseIntent Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/RaiseIntentResponseBase" }, { - "$ref": "#/$defs/RaiseIntentResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "RaiseIntentResponseBase": { + "title": "RaiseIntent Response", "type": "object", "description": "A response to a request to raise an intent.", "properties": { "type": { + "title": "RaiseIntent Response Message type", "const": "raiseIntentResponse" }, "payload": { + "title": "RaiseIntent Response Payload", "type": "object", "properties": { "intentResolution": { - "$ref": "../api/intentResolution.schema.json" + "$ref": "../api/api.schema.json#/definitions/IntentResolution" } }, "required": ["intentResolution"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "RaiseIntent Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/schemas/bridging/raiseIntentBridgeRequest.schema.json b/schemas/bridging/raiseIntentBridgeRequest.schema.json index 1db051e5e..6922eae4a 100644 --- a/schemas/bridging/raiseIntentBridgeRequest.schema.json +++ b/schemas/bridging/raiseIntentBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeRequest.schema.json", - "title": "raiseIntent Bridge Request", + "title": "RaiseIntent Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "raiseIntentAgentRequest.schema.json#/$defs/RaiseIntentRequestBase" }, { - "$ref": "raiseIntentAgentRequest.schema.json#/$defs/RaiseIntentRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/schemas/bridging/raiseIntentBridgeResponse.schema.json b/schemas/bridging/raiseIntentBridgeResponse.schema.json index b9fbd772c..4f2116658 100644 --- a/schemas/bridging/raiseIntentBridgeResponse.schema.json +++ b/schemas/bridging/raiseIntentBridgeResponse.schema.json @@ -1,38 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json", - "title": "raiseIntent Bridge Response", + "title": "RaiseIntent Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "raiseIntentAgentResponse.schema.json#/$defs/RaiseIntentResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/schemas/bridging/raiseIntentResultAgentResponse.schema.json b/schemas/bridging/raiseIntentResultAgentResponse.schema.json index 17437e3d8..4768d58f5 100644 --- a/schemas/bridging/raiseIntentResultAgentResponse.schema.json +++ b/schemas/bridging/raiseIntentResultAgentResponse.schema.json @@ -1,31 +1,36 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json", - "title": "raiseIntentResult Agent Response", + "title": "RaiseIntent Result Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/RaiseIntentResultResponseBase" }, { - "$ref": "#/$defs/RaiseIntentResultResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "RaiseIntentResultResponseBase": { + "title": "RaiseIntent Result Response", "type": "object", "description": "A secondary response to a request to raise an intent used to deliver the intent result", "properties": { "type": { + "title": "RaiseIntent Result Response Message type", "const": "raiseIntentResultResponse" }, "payload": { + "title": "RaiseIntent Result Response Payload", "type": "object", "properties": { "intentResult": { + "title": "IntentResult", "oneOf": [ { "type": "object", + "title": "IntentResult Context", "properties": { "context": { "$ref": "../context/context.schema.json" @@ -36,9 +41,10 @@ }, { "type": "object", + "title": "IntentResult Channel", "properties": { "channel": { - "$ref": "../api/channel.schema.json" + "$ref": "../api/api.schema.json#/definitions/Channel" } }, "required": ["channel"], @@ -50,7 +56,10 @@ "required": ["intentResult"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "RaiseIntent Result Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/schemas/bridging/raiseIntentResultBridgeResponse.schema.json b/schemas/bridging/raiseIntentResultBridgeResponse.schema.json index 0d06c0e72..30c0e680f 100644 --- a/schemas/bridging/raiseIntentResultBridgeResponse.schema.json +++ b/schemas/bridging/raiseIntentResultBridgeResponse.schema.json @@ -1,32 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json", - "title": "raiseIntentResult Bridge Response", + "title": "RaiseIntent Result Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "raiseIntentResultAgentResponse.schema.json#/$defs/RaiseIntentResultResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/appIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/src/api/AppMetadata.ts b/src/api/AppMetadata.ts index 90e3e2034..3d6aa3f72 100644 --- a/src/api/AppMetadata.ts +++ b/src/api/AppMetadata.ts @@ -26,7 +26,7 @@ export interface AppMetadata extends AppIdentifier { readonly version?: string; /** An optional set of, implementation specific, metadata fields that can be used to disambiguate instances, such as a window title or screen position. Must only be set if `instanceId` is set. */ - readonly instanceMetadata?: Record; + readonly instanceMetadata?: { [key: string]: any }; /** A more user-friendly application title that can be used to render UI elements */ readonly title?: string; diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index e86797e25..d832d0d4f 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,29 +1,17 @@ // To parse this data: // -// import { Convert, AppIdentifier, AppIntent, AppMetadata, BaseImplementationMetadata, Channel, ContextMetadata, DesktopAgentIdentifier, DisplayMetadata, Icon, Image, ImplementationMetadata, IntentMetadata, IntentResolution, IntentResult, AgentRequestMessage, AgentResponseMessage, BridgeParticipantIdentifier, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; +// import { Convert, BaseImplementationMetadata, AgentRequestMessage, AgentResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; // -// const appIdentifier = Convert.toAppIdentifier(json); -// const appIntent = Convert.toAppIntent(json); -// const appMetadata = Convert.toAppMetadata(json); +// const schemasAPIAPISchema = Convert.toSchemasAPIAPISchema(json); // const baseImplementationMetadata = Convert.toBaseImplementationMetadata(json); -// const channel = Convert.toChannel(json); -// const contextMetadata = Convert.toContextMetadata(json); -// const desktopAgentIdentifier = Convert.toDesktopAgentIdentifier(json); -// const displayMetadata = Convert.toDisplayMetadata(json); -// const schemasAPIErrorsSchema = Convert.toSchemasAPIErrorsSchema(json); -// const icon = Convert.toIcon(json); -// const image = Convert.toImage(json); -// const implementationMetadata = Convert.toImplementationMetadata(json); -// const intentMetadata = Convert.toIntentMetadata(json); -// const intentResolution = Convert.toIntentResolution(json); -// const intentResult = Convert.toIntentResult(json); // const agentRequestMessage = Convert.toAgentRequestMessage(json); // const agentResponseMessage = Convert.toAgentResponseMessage(json); -// const bridgeParticipantIdentifier = Convert.toBridgeParticipantIdentifier(json); // const bridgeRequestMessage = Convert.toBridgeRequestMessage(json); // const bridgeResponseMessage = Convert.toBridgeResponseMessage(json); // const broadcastAgentRequest = Convert.toBroadcastAgentRequest(json); // const broadcastBridgeRequest = Convert.toBroadcastBridgeRequest(json); +// const bridgingCommons = Convert.toBridgingCommons(json); +// const connectionStepMessage = Convert.toConnectionStepMessage(json); // const connectionStep2Hello = Convert.toConnectionStep2Hello(json); // const connectionStep3Handshake = Convert.toConnectionStep3Handshake(json); // const connectionStep4AuthenticationFailed = Convert.toConnectionStep4AuthenticationFailed(json); @@ -72,215 +60,58 @@ // match the expected interface, even if the JSON is valid. /** - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. - */ -export interface AppIdentifier { - appId: string; - desktopAgent?: string; - instanceId?: string; -} - -/** - * Represents the binding of an intent to apps - */ -export interface AppIntent { - apps: AppMetadataElement[]; - intent: IntentClass; -} - -/** - * Extends an AppIdentifier, describing an application or instance of an application. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. - */ -export interface AppMetadataElement { - appId: string; - desktopAgent?: string; - instanceId?: string; -} - -/** - * The interface used to describe an intent within the platform. - */ -export interface IntentClass { - displayName: string; - name?: string; -} - -/** - * Extends an AppIdentifier, describing an application or instance of an application. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. - */ -export interface AppMetadata { - appId: string; - desktopAgent?: string; - instanceId?: string; -} - -/** - * Base of Implementation Metadata used by Bridging that leaves out the metadata of the - * calling application (appMetadata) + * Metadata relating to the FDC3 Desktop Agent implementation and its provider. */ export interface BaseImplementationMetadata { + /** + * The version number of the FDC3 specification that the implementation provides. + * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. + */ fdc3Version: string; + /** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ optionalFeatures: BaseImplementationMetadataOptionalFeatures; + /** + * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, + * OpenFin etc.). + */ provider: string; + /** + * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). + */ providerVersion?: string; } -export interface BaseImplementationMetadataOptionalFeatures { - DesktopAgentBridging: boolean; - OriginatingAppMetadata: boolean; - UserChannelMembershipAPIs: boolean; -} - /** - * Represents a context channel that applications can join to share context data. + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. */ -export interface Channel { - displayMetadata?: DisplayMetadataClass; - id: string; - type: Type; -} - -/** - * A desktop agent (typically for user channels) may want to provide additional information - * about how a channel can be represented in a UI. A common use case is for color linking. - */ -export interface DisplayMetadataClass { - color?: string; - glyph?: string; - name?: string; -} - -export enum Type { - App = 'app', - Private = 'private', - User = 'user', -} - -/** - * Metadata relating to a context or intent & context received through the - * addContextListener and addIntentListener functions. - */ -export interface ContextMetadata { - source: SourceElement; -} - -/** - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. - */ -export interface SourceElement { - appId: string; - desktopAgent?: string; - instanceId?: string; -} - -/** - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. - */ -export interface DesktopAgentIdentifier { - desktopAgent: string; - [property: string]: any; -} - -/** - * A desktop agent (typically for user channels) may want to provide additional information - * about how a channel can be represented in a UI. A common use case is for color linking. - */ -export interface DisplayMetadata { - color?: string; - glyph?: string; - name?: string; -} - -/** - * Metadata relating to a single icon image at a remote URL, used to represent an - * application in a user interface. - */ -export interface Icon { - size?: string; - src: string; - type?: string; -} - -/** - * Metadata relating to a single image at a remote URL, used to represent screenshot images. - */ -export interface Image { - label?: string; - size?: string; - src: string; - type?: string; -} - -/** - * Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields - * from BaseImplementationMetadata and the metadata of the calling application according to - * the desktop agent. - * - * Base of Implementation Metadata used by Bridging that leaves out the metadata of the - * calling application (appMetadata) - * - * DesktopAgent implementationMetadata trying to connect to the bridge. - */ -export interface ImplementationMetadata { - fdc3Version: string; - optionalFeatures: ImplementationMetadataOptionalFeatures; - provider: string; - providerVersion?: string; -} - -export interface ImplementationMetadataOptionalFeatures { +export interface BaseImplementationMetadataOptionalFeatures { + /** + * Used to indicate whether the experimental Desktop Agent Bridging + * feature is implemented by the Desktop Agent. + */ DesktopAgentBridging: boolean; + /** + * Used to indicate whether the exposure of 'originating app metadata' for + * context and intent messages is supported by the Desktop Agent. + */ OriginatingAppMetadata: boolean; + /** + * Used to indicate whether the optional `fdc3.joinUserChannel`, + * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by + * the Desktop Agent. + */ UserChannelMembershipAPIs: boolean; } -/** - * The interface used to describe an intent within the platform. - */ -export interface IntentMetadata { - displayName: string; - name?: string; -} - -/** - * IntentResolution provides a standard format for data returned upon resolving an intent. - */ -export interface IntentResolution { - intent: string; - source: SourceElement; - version?: string; -} - -/** - * Describes results that an Intent handler may optionally return that should be - * communicated back to the app that raised the intent, via the IntentResolution. - * - * Represents a context channel that applications can join to share context data. - */ -export interface IntentResult { - id?: { [key: string]: any } | string; - name?: string; - type: string; - displayMetadata?: DisplayMetadataClass; - [property: string]: any; -} - /** * A request message from a Desktop Agent to the Bridge. */ export interface AgentRequestMessage { - meta: AgentRequestMessageMeta; + meta: AgentRequestMetadata; /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -289,31 +120,25 @@ export interface AgentRequestMessage { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** * Metadata for a request message sent by Desktop Agents to the Bridge. */ -export interface AgentRequestMessageMeta { +export interface AgentRequestMetadata { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: BridgeParticipantIdentifierElement; - /** - * UUID for the request - */ + destination?: BridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceIdentifier; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -322,47 +147,148 @@ export interface AgentRequestMessageMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. * * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. */ -export interface BridgeParticipantIdentifierElement { +export interface BridgeParticipantIdentifier { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ appId?: string; - desktopAgent: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ instanceId?: string; - [property: string]: any; } /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * * Field that represents the source application instance that the response was produced by, * or the Desktop Agent if it produced the response without an application. * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. + * Field that represents the source Desktop Agent that a response was received from. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. */ export interface SourceIdentifier { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ appId?: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ instanceId?: string; - [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ +export enum RequestMessageType { + BroadcastRequest = 'broadcastRequest', + FindInstancesRequest = 'findInstancesRequest', + FindIntentRequest = 'findIntentRequest', + FindIntentsByContextRequest = 'findIntentsByContextRequest', + GetAppMetadataRequest = 'getAppMetadataRequest', + OpenRequest = 'openRequest', + PrivateChannelBroadcast = 'PrivateChannel.broadcast', + PrivateChannelEventListenerAdded = 'PrivateChannel.eventListenerAdded', + PrivateChannelOnAddContextListener = 'PrivateChannel.onAddContextListener', + PrivateChannelOnDisconnect = 'PrivateChannel.onDisconnect', + PrivateChannelOnUnsubscribe = 'PrivateChannel.onUnsubscribe', + RaiseIntentRequest = 'raiseIntentRequest', + RaiseIntentResultResponse = 'raiseIntentResultResponse', } /** @@ -378,56 +304,71 @@ export interface AgentResponseMessage { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - type: string; + type: ResponseMessageType; } /** * Metadata for a response messages sent by a Desktop Agent to the Bridge */ export interface AgentResponseMetadata { - /** - * UUID for the request this message is responding to. - */ requestUuid: string; - /** - * UUID for this specific response message. - */ responseUuid: string; /** * Field that represents the source application instance that the response was produced by, * or the Desktop Agent if it produced the response without an application. */ - source: SourceIdentifier; - /** - * Timestamp at which the response was generated - */ + source: DesktopAgentIdentifier; timestamp: Date; } /** - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. */ -export interface BridgeParticipantIdentifier { - appId?: string; +export interface DesktopAgentIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ desktopAgent: string; - instanceId?: string; - [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ +export enum ResponseMessageType { + FindInstancesResponse = 'findInstancesResponse', + FindIntentResponse = 'findIntentResponse', + FindIntentsByContextResponse = 'findIntentsByContextResponse', + GetAppMetadataResponse = 'getAppMetadataResponse', + OpenResponse = 'openResponse', + RaiseIntentResponse = 'raiseIntentResponse', + RaiseIntentResultResponse = 'raiseIntentResultResponse', } /** * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface BridgeRequestMessage { - meta: BridgeRequestMessageMeta; + meta: BridgeRequestMetadata; /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -442,25 +383,19 @@ export interface BridgeRequestMessage { /** * Metadata required in a request message forwarded on by the Bridge */ -export interface BridgeRequestMessageMeta { +export interface BridgeRequestMetadata { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: BridgeParticipantIdentifierElement; - /** - * UUID for the request - */ + destination?: BridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: BridgeParticipantIdentifierElement; - /** - * Timestamp at which request or response was generated - */ + source: SourceIdentifier; timestamp: Date; } @@ -469,7 +404,7 @@ export interface BridgeRequestMessageMeta { * request. */ export interface BridgeResponseMessage { - meta: BridgeResponseMessageMeta; + meta: BridgeResponseMetadata; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -484,45 +419,19 @@ export interface BridgeResponseMessage { /** * Metadata required in a response message collated and/or forwarded on by the Bridge */ -export interface BridgeResponseMessageMeta { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ +export interface BridgeResponseMetadata { errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: BridgeParticipantIdentifierElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: BridgeParticipantIdentifierElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to broadcast context on a channel. + * + * A request message from a Desktop Agent to the Bridge. */ export interface BroadcastAgentRequest { meta: BroadcastAgentRequestMeta; @@ -534,46 +443,80 @@ export interface BroadcastAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** * Metadata for a request message sent by Desktop Agents to the Bridge. */ export interface BroadcastAgentRequestMeta { - /** - * UUID for the request - */ requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } /** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * * Field that represents the source application instance that the response was produced by, * or the Desktop Agent if it produced the response without an application. * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. + * Field that represents the source Desktop Agent that a response was received from. * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. */ export interface SourceClass { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ instanceId?: string; } @@ -581,17 +524,77 @@ export interface SourceClass { * The message payload typically contains the arguments to FDC3 API functions. */ export interface BroadcastAgentRequestPayload { - channel: ChannelClass; + channel: Channel; context: ContextElement; } /** - * Represents a context channel that applications can join to share context data. + * Represents a context channel that applications can use to send and receive + * context data. + * + * Please note that There are differences in behavior when you interact with a + * User channel via the `DesktopAgent` interface and the `Channel` interface. + * Specifically, when 'joining' a User channel or adding a context listener + * when already joined to a channel via the `DesktopAgent` interface, existing + * context (matching the type of the context listener) on the channel is + * received by the context listener immediately. Whereas, when a context + * listener is added via the Channel interface, context is not received + * automatically, but may be retrieved manually via the `getCurrentContext()` + * function. + */ +export interface Channel { + /** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + */ + displayMetadata?: DisplayMetadata; + /** + * Constant that uniquely identifies this channel. + */ + id: string; + /** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". + */ + type: Type; +} + +/** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + * + * A system channel will be global enough to have a presence across many apps. This gives us + * some hints + * to render them in a standard way. It is assumed it may have other properties too, but if + * it has these, + * this is their meaning. + */ +export interface DisplayMetadata { + /** + * The color that should be associated within this channel when displaying this channel in a + * UI, e.g: `0xFF0000`. + */ + color?: string; + /** + * A URL of an image that can be used to display this channel + */ + glyph?: string; + /** + * A user-readable name for this channel, e.g: `"Red"` + */ + name?: string; +} + +/** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". */ -export interface ChannelClass { - displayMetadata?: DisplayMetadataClass; - id: string; - type: Type; +export enum Type { + App = 'app', + Private = 'private', + User = 'user', } export interface ContextElement { @@ -602,9 +605,9 @@ export interface ContextElement { } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to broadcast context on a channel. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface BroadcastBridgeRequest { meta: BroadcastBridgeRequestMeta; @@ -623,67 +626,87 @@ export interface BroadcastBridgeRequest { * Metadata required in a request message forwarded on by the Bridge */ export interface BroadcastBridgeRequestMeta { - /** - * UUID for the request - */ requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; + source: SourceClass; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface BroadcastBridgeRequestPayload { + channel: Channel; + context: ContextElement; +} + +/** + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ +export interface ConnectionStepMessage { + meta: ConnectionStepMetadata; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: { [key: string]: any }; /** - * Timestamp at which request or response was generated + * Identifies the type of the connection step message. */ - timestamp: Date; + type: ConnectionStepMessageType; } /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. - * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. + * Metadata for this connection step message. */ -export interface DestinationClass { - appId: string; - desktopAgent: string; - instanceId?: string; +export interface ConnectionStepMetadata { + requestUuid?: string; + responseUuid?: string; + timestamp: Date; } /** - * The message payload typically contains the arguments to FDC3 API functions. + * Identifies the type of the connection step message. */ -export interface BroadcastBridgeRequestPayload { - channel: ChannelClass; - context: ContextElement; +export enum ConnectionStepMessageType { + AuthenticationFailed = 'authenticationFailed', + ConnectedAgentsUpdate = 'connectedAgentsUpdate', + Handshake = 'handshake', + Hello = 'hello', } +/** + * Hello message sent by the Bridge to anyone connecting to the Bridge (enables + * identification as a bridge and confirmation of whether authentication is required) + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ export interface ConnectionStep2Hello { meta: ConnectionStep2HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ payload: ConnectionStep2HelloPayload; - type: any; + /** + * Identifies the type of the connection step message. + */ + type: ConnectionStepMessageType; } +/** + * Metadata for this connection step message. + */ export interface ConnectionStep2HelloMeta { - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } +/** + * The message payload, containing data pertaining to this connection step. + */ export interface ConnectionStep2HelloPayload { /** * A flag indicating whether the Desktop Agent Bridge requires authentication or not. @@ -704,23 +727,36 @@ export interface ConnectionStep2HelloPayload { supportedFDC3Versions: string[]; } +/** + * Handshake message sent by the Desktop Agent to the Bridge (including requested name, + * channel state and authentication data) + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ export interface ConnectionStep3Handshake { meta: ConnectionStep3HandshakeMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ payload: ConnectionStep3HandshakePayload; - type: any; + /** + * Identifies the type of the connection step message. + */ + type: ConnectionStepMessageType; } +/** + * Metadata for this connection step message. + */ export interface ConnectionStep3HandshakeMeta { - /** - * Unique UUID for the request - */ requestUuid: string; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } +/** + * The message payload, containing data pertaining to this connection step. + */ export interface ConnectionStep3HandshakePayload { authToken?: string; /** @@ -729,9 +765,9 @@ export interface ConnectionStep3HandshakePayload { */ channelsState: { [key: string]: ContextElement[] }; /** - * DesktopAgent implementationMetadata trying to connect to the bridge. + * Desktop Agent ImplementationMetadata trying to connect to the bridge. */ - implementationMetadata: ImplementationMetadataClass; + implementationMetadata: ImplementationMetadataElement; /** * The requested Desktop Agent name */ @@ -739,64 +775,121 @@ export interface ConnectionStep3HandshakePayload { } /** - * Base of Implementation Metadata used by Bridging that leaves out the metadata of the - * calling application (appMetadata) + * Desktop Agent ImplementationMetadata trying to connect to the bridge. * - * DesktopAgent implementationMetadata trying to connect to the bridge. + * Metadata relating to the FDC3 Desktop Agent implementation and its provider. */ -export interface ImplementationMetadataClass { +export interface ImplementationMetadataElement { + /** + * The version number of the FDC3 specification that the implementation provides. + * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. + */ fdc3Version: string; + /** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ optionalFeatures: ImplementationMetadataOptionalFeatures; + /** + * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, + * OpenFin etc.). + */ provider: string; + /** + * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). + */ providerVersion?: string; } -export interface ConnectionStep4AuthenticationFailed { - meta: ConnectionStep4AuthenticationFailedMeta; - payload?: ConnectionStep4AuthenticationFailedPayload; - type: any; +/** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ +export interface ImplementationMetadataOptionalFeatures { + /** + * Used to indicate whether the experimental Desktop Agent Bridging + * feature is implemented by the Desktop Agent. + */ + DesktopAgentBridging: boolean; + /** + * Used to indicate whether the exposure of 'originating app metadata' for + * context and intent messages is supported by the Desktop Agent. + */ + OriginatingAppMetadata: boolean; + /** + * Used to indicate whether the optional `fdc3.joinUserChannel`, + * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by + * the Desktop Agent. + */ + UserChannelMembershipAPIs: boolean; } -export interface ConnectionStep4AuthenticationFailedMeta { +/** + * Message sent by Bridge to Desktop Agent if their authentication fails. + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ +export interface ConnectionStep4AuthenticationFailed { + meta: ConnectionStep4AuthenticationFailedMeta; /** - * Unique UUID for the request + * The message payload, containing data pertaining to this connection step. */ - requestUuid: string; + payload: ConnectionStep4AuthenticationFailedPayload; /** - * Unique UUID for the response + * Identifies the type of the connection step message. */ + type: ConnectionStepMessageType; +} + +/** + * Metadata for this connection step message. + */ +export interface ConnectionStep4AuthenticationFailedMeta { + requestUuid: string; responseUuid: string; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } +/** + * The message payload, containing data pertaining to this connection step. + */ export interface ConnectionStep4AuthenticationFailedPayload { message?: string; } +/** + * Message sent by Bridge to all Desktop Agent when an agent joins or leaves the bridge, + * includes the details of all agents, the change made and the expected channel state for + * all agents. + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ export interface ConnectionStep6ConnectedAgentsUpdate { meta: ConnectionStep6ConnectedAgentsUpdateMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ payload: ConnectionStep6ConnectedAgentsUpdatePayload; - type: any; + /** + * Identifies the type of the connection step message. + */ + type: ConnectionStepMessageType; } +/** + * Metadata for this connection step message. + */ export interface ConnectionStep6ConnectedAgentsUpdateMeta { - /** - * Unique UUID for the request - */ requestUuid: string; - /** - * Unique UUID for the response - */ responseUuid: string; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } +/** + * The message payload, containing data pertaining to this connection step. + */ export interface ConnectionStep6ConnectedAgentsUpdatePayload { /** * Should be set when an agent first connects to the bridge and provide its assigned name. @@ -819,26 +912,9 @@ export interface ConnectionStep6ConnectedAgentsUpdatePayload { } /** - * Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields - * from BaseImplementationMetadata and the metadata of the calling application according to - * the desktop agent. - * - * Base of Implementation Metadata used by Bridging that leaves out the metadata of the - * calling application (appMetadata) + * A request for details of instances of a particular app * - * DesktopAgent implementationMetadata trying to connect to the bridge. - */ -export interface ImplementationMetadataElement { - fdc3Version: string; - optionalFeatures: ImplementationMetadataOptionalFeatures; - provider: string; - providerVersion?: string; -} - -/** * A request message from a Desktop Agent to the Bridge. - * - * A request for details of instances of a particular app */ export interface FindInstancesAgentRequest { meta: FindInstancesAgentRequestMeta; @@ -850,7 +926,7 @@ export interface FindInstancesAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -862,84 +938,273 @@ export interface FindInstancesAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationObject; - /** - * UUID for the request - */ + destination?: PurpleBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } /** + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. * * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls at specific applications. + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. * - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. */ -export interface DestinationObject { - appId?: string; +export interface PurpleBridgeParticipantIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ desktopAgent: string; - instanceId?: string; - [property: string]: any; } /** * The message payload typically contains the arguments to FDC3 API functions. */ export interface FindInstancesAgentRequestPayload { - app: SourceElement; + app: AppIdentifier; +} + +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppIdentifier { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; +} + +/** + * A response to a findInstances request. + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface FindInstancesAgentResponse { + meta: FindInstancesAgentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindInstancesAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindInstancesAgentResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindInstancesAgentResponsePayload { + appIdentifiers: AppMetadata[]; +} + +/** + * Extends an `AppIdentifier`, describing an application or instance of an application, with + * additional descriptive metadata that is usually provided by an FDC3 App Directory that + * the desktop agent connects to. + * + * The additional information from an app directory can aid in rendering UI elements, such + * as a launcher menu or resolver UI. This includes a title, description, tooltip and icon + * and screenshot URLs. + * + * Note that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the + * `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc. + */ +export interface AppMetadata { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId: string; + /** + * A longer, multi-paragraph description for the application that could include markup + */ + description?: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent?: string; + /** + * A list of icon URLs for the application that can be used to render UI elements + */ + icons?: Icon[]; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + /** + * An optional set of, implementation specific, metadata fields that can be used to + * disambiguate instances, such as a window title or screen position. Must only be set if + * `instanceId` is set. + */ + instanceMetadata?: { [key: string]: any }; + /** + * The 'friendly' app name. + * This field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now + * require an `AppIdentifier` wth `appId` set. + * Note that for display purposes the `title` field should be used, if set, in preference to + * this field. + */ + name?: string; + /** + * The type of output returned for any intent specified during resolution. May express a + * particular context type (e.g. "fdc3.instrument"), channel (e.g. "channel") or a channel + * that will receive a specified type (e.g. "channel"). + */ + resultType?: null | string; + /** + * Images representing the app in common usage scenarios that can be used to render UI + * elements + */ + screenshots?: Image[]; + /** + * A more user-friendly application title that can be used to render UI elements + */ + title?: string; + /** + * A tooltip for the application that can be used to render UI elements + */ + tooltip?: string; + /** + * The Version of the application. + */ + version?: string; } /** - * A response message from a Desktop Agent to the Bridge. - * - * A response to a findInstances request. + * SPDX-License-Identifier: Apache-2.0 + * Copyright FINOS FDC3 contributors - see NOTICE file */ -export interface FindInstancesAgentResponse { - meta: AgentResponseMetadata; +export interface Icon { /** - * The message payload typically contains return values for FDC3 API functions. + * The icon dimension, formatted as `x`. */ - payload: FindInstancesAgentResponsePayload; + size?: string; /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. + * The icon url */ - type: string; + src: string; + /** + * Icon media type. If not present the Desktop Agent may use the src file extension. + */ + type?: string; } /** - * The message payload typically contains return values for FDC3 API functions. + * SPDX-License-Identifier: Apache-2.0 + * Copyright FINOS FDC3 contributors - see NOTICE file */ -export interface FindInstancesAgentResponsePayload { - appIdentifiers: AppMetadataElement[]; +export interface Image { + /** + * Caption for the image. + */ + label?: string; + /** + * The image dimension, formatted as `x`. + */ + size?: string; + /** + * The image url. + */ + src: string; + /** + * Image media type. If not present the Desktop Agent may use the src file extension. + */ + type?: string; } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request for details of instances of a particular app + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface FindInstancesBridgeRequest { meta: FindInstancesBridgeRequestMeta; @@ -963,19 +1228,13 @@ export interface FindInstancesBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationObject; - /** - * UUID for the request - */ + destination?: PurpleBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -983,14 +1242,14 @@ export interface FindInstancesBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface FindInstancesBridgeRequestPayload { - app: SourceElement; + app: AppIdentifier; } /** + * A response to a findInstances request. + * * A response message from the Bridge back to the original Desktop Agent that raised the * request. - * - * A response to a findInstances request. */ export interface FindInstancesBridgeResponse { meta: FindInstancesBridgeResponseMeta; @@ -1009,65 +1268,28 @@ export interface FindInstancesBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface FindInstancesBridgeResponseMeta { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: ErrorSourceElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: ErrorSourceElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } -/** - * Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the - * source or destination of a message which was produced by or should be processed by the - * Desktop Agent itself rather than a specific application. Often added to messages by the - * Desktop Agent Bridge. - */ -export interface ErrorSourceElement { - desktopAgent: string; - [property: string]: any; -} - /** * The message payload typically contains return values for FDC3 API functions. */ export interface FindInstancesBridgeResponsePayload { - appIdentifiers: AppMetadataElement[]; + appIdentifiers: AppMetadata[]; } /** - * A request message from a Desktop Agent to the Bridge. - * * A request for details of apps available to resolve a particular intent and context pair. + * + * A request message from a Desktop Agent to the Bridge. */ export interface FindIntentsAgentRequest { - meta: EntRequestMetadata; + meta: FindIntentsAgentRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -1076,32 +1298,26 @@ export interface FindIntentsAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** * Metadata for a request message sent by Desktop Agents to the Bridge. */ -export interface EntRequestMetadata { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifierElement; - /** - * UUID for the request - */ +export interface FindIntentsAgentRequestMeta { requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; + timestamp: Date; /** - * Timestamp at which request or response was generated + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. */ - timestamp: Date; + destination?: BridgeParticipantIdentifier; } /** @@ -1113,12 +1329,12 @@ export interface FindIntentsAgentRequestPayload { } /** - * A response message from a Desktop Agent to the Bridge. - * * A response to a findIntent request. + * + * A response message from a Desktop Agent to the Bridge. */ export interface FindIntentAgentResponse { - meta: AgentResponseMetadata; + meta: FindIntentAgentResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -1127,28 +1343,64 @@ export interface FindIntentAgentResponse { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - type: string; + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentAgentResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ export interface FindIntentAgentResponsePayload { - appIntent: AppIntentElement; + appIntent: AppIntent; } /** - * Represents the binding of an intent to apps + * An interface that relates an intent to apps */ -export interface AppIntentElement { - apps: AppMetadataElement[]; - intent: IntentClass; +export interface AppIntent { + /** + * Details of applications that can resolve the intent. + */ + apps: AppMetadata[]; + /** + * Details of the intent whose relationship to resolving applications is being described. + */ + intent: IntentMetadata; } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + * Details of the intent whose relationship to resolving applications is being described. * + * Intent descriptor + */ +export interface IntentMetadata { + /** + * Display name for the intent. + */ + displayName: string; + /** + * The unique name of the intent that can be invoked by the raiseIntent call + */ + name: string; +} + +/** * A request for details of apps available to resolve a particular intent and context pair. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface FindIntentBridgeRequest { meta: FindIntentBridgeRequestMeta; @@ -1167,25 +1419,19 @@ export interface FindIntentBridgeRequest { * Metadata required in a request message forwarded on by the Bridge */ export interface FindIntentBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifierElement; - /** - * UUID for the request - */ requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; + source: SourceClass; + timestamp: Date; /** - * Timestamp at which request or response was generated + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. */ - timestamp: Date; + destination?: BridgeParticipantIdentifier; } /** @@ -1197,10 +1443,10 @@ export interface FindIntentBridgeRequestPayload { } /** + * A response to a findIntent request. + * * A response message from the Bridge back to the original Desktop Agent that raised the * request. - * - * A response to a findIntent request. */ export interface FindIntentBridgeResponse { meta: FindIntentBridgeResponseMeta; @@ -1219,37 +1465,11 @@ export interface FindIntentBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface FindIntentBridgeResponseMeta { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: ErrorSourceElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: ErrorSourceElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } @@ -1257,14 +1477,14 @@ export interface FindIntentBridgeResponseMeta { * The message payload typically contains return values for FDC3 API functions. */ export interface FindIntentBridgeResponsePayload { - appIntent: AppIntentElement; + appIntent: AppIntent; } /** - * A request message from a Desktop Agent to the Bridge. - * * A request for details of intents and apps available to resolve them for a particular * context. + * + * A request message from a Desktop Agent to the Bridge. */ export interface FindIntentsByContextAgentRequest { meta: FindIntentsByContextAgentRequestMeta; @@ -1276,32 +1496,26 @@ export interface FindIntentsByContextAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** * Metadata for a request message sent by Desktop Agents to the Bridge. */ export interface FindIntentsByContextAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifierElement; - /** - * UUID for the request - */ requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; + timestamp: Date; /** - * Timestamp at which request or response was generated + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. */ - timestamp: Date; + destination?: BridgeParticipantIdentifier; } /** @@ -1312,12 +1526,12 @@ export interface FindIntentsByContextAgentRequestPayload { } /** - * A response message from a Desktop Agent to the Bridge. - * * A response to a findIntentsByContext request. + * + * A response message from a Desktop Agent to the Bridge. */ export interface FindIntentsByContextAgentResponse { - meta: AgentResponseMetadata; + meta: FindIntentsByContextAgentResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -1326,21 +1540,35 @@ export interface FindIntentsByContextAgentResponse { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - type: string; + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentsByContextAgentResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ export interface FindIntentsByContextAgentResponsePayload { - appIntents: AppIntentElement[]; + appIntents: AppIntent[]; } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request for details of intents and apps available to resolve them for a particular * context. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface FindIntentsByContextBridgeRequest { meta: FindIntentsByContextBridgeRequestMeta; @@ -1359,25 +1587,19 @@ export interface FindIntentsByContextBridgeRequest { * Metadata required in a request message forwarded on by the Bridge */ export interface FindIntentsByContextBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifierElement; - /** - * UUID for the request - */ requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; + source: SourceClass; + timestamp: Date; /** - * Timestamp at which request or response was generated + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. */ - timestamp: Date; + destination?: BridgeParticipantIdentifier; } /** @@ -1388,13 +1610,13 @@ export interface FindIntentsByContextBridgeRequestPayload { } /** + * A response to a findIntentsByContext request. + * * A response message from the Bridge back to the original Desktop Agent that raised the * request. - * - * A response to a findIntentsByContext request. */ export interface FindIntentsByContextBridgeResponse { - meta: ResponseMetadata; + meta: FindIntentsByContextBridgeResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -1409,38 +1631,12 @@ export interface FindIntentsByContextBridgeResponse { /** * Metadata required in a response message collated and/or forwarded on by the Bridge */ -export interface ResponseMetadata { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ +export interface FindIntentsByContextBridgeResponseMeta { errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: ErrorSourceElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: ErrorSourceElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } @@ -1448,13 +1644,13 @@ export interface ResponseMetadata { * The message payload typically contains return values for FDC3 API functions. */ export interface FindIntentsByContextBridgeResponsePayload { - appIntents: AppIntentElement[]; + appIntents: AppIntent[]; } /** - * A request message from a Desktop Agent to the Bridge. - * * A request for metadata about an app + * + * A request message from a Desktop Agent to the Bridge. */ export interface GetAppMetadataAgentRequest { meta: GetAppMetadataAgentRequestMeta; @@ -1466,7 +1662,7 @@ export interface GetAppMetadataAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -1478,19 +1674,13 @@ export interface GetAppMetadataAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationObject; - /** - * UUID for the request - */ + destination?: PurpleBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -1498,16 +1688,16 @@ export interface GetAppMetadataAgentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface GetAppMetadataAgentRequestPayload { - app: SourceElement; + app: AppIdentifier; } /** - * A response message from a Desktop Agent to the Bridge. - * * A response to a getAppMetadata request. + * + * A response message from a Desktop Agent to the Bridge. */ export interface GetAppMetadataAgentResponse { - meta: AgentResponseMetadata; + meta: GetAppMetadataAgentResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -1516,20 +1706,34 @@ export interface GetAppMetadataAgentResponse { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - type: string; + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface GetAppMetadataAgentResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ export interface GetAppMetadataAgentResponsePayload { - appMetadata: AppMetadataElement; + appMetadata: AppMetadata; } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request for metadata about an app + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface GetAppMetadataBridgeRequest { meta: GetAppMetadataBridgeRequestMeta; @@ -1553,19 +1757,13 @@ export interface GetAppMetadataBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationObject; - /** - * UUID for the request - */ + destination?: PurpleBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -1573,14 +1771,14 @@ export interface GetAppMetadataBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface GetAppMetadataBridgeRequestPayload { - app: SourceElement; + app: AppIdentifier; } /** + * A response to a getAppMetadata request. + * * A response message from the Bridge back to the original Desktop Agent that raised the * request. - * - * A response to a getAppMetadata request. */ export interface GetAppMetadataBridgeResponse { meta: GetAppMetadataBridgeResponseMeta; @@ -1599,37 +1797,11 @@ export interface GetAppMetadataBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface GetAppMetadataBridgeResponseMeta { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: ErrorSourceElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: ErrorSourceElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } @@ -1637,13 +1809,13 @@ export interface GetAppMetadataBridgeResponseMeta { * The message payload typically contains return values for FDC3 API functions. */ export interface GetAppMetadataBridgeResponsePayload { - appMetadata: AppMetadataElement; + appMetadata: AppMetadata; } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to open an application + * + * A request message from a Desktop Agent to the Bridge. */ export interface OpenAgentRequest { meta: OpenAgentRequestMeta; @@ -1655,7 +1827,7 @@ export interface OpenAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -1667,19 +1839,13 @@ export interface OpenAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationObject; - /** - * UUID for the request - */ + destination?: PurpleBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -1687,17 +1853,17 @@ export interface OpenAgentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface OpenAgentRequestPayload { - app: SourceElement; + app: AppIdentifier; context?: ContextElement; } /** - * A response message from a Desktop Agent to the Bridge. - * * A response to an open request + * + * A response message from a Desktop Agent to the Bridge. */ export interface OpenAgentResponse { - meta: AgentResponseMetadata; + meta: OpenAgentResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -1706,20 +1872,34 @@ export interface OpenAgentResponse { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - type: string; + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface OpenAgentResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ export interface OpenAgentResponsePayload { - appIdentifier: SourceElement; + appIdentifier: AppIdentifier; } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to open an application + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface OpenBridgeRequest { meta: OpenBridgeRequestMeta; @@ -1743,19 +1923,13 @@ export interface OpenBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationObject; - /** - * UUID for the request - */ + destination?: PurpleBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -1763,15 +1937,15 @@ export interface OpenBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface OpenBridgeRequestPayload { - app: SourceElement; + app: AppIdentifier; context?: ContextElement; } /** + * A response to an open request + * * A response message from the Bridge back to the original Desktop Agent that raised the * request. - * - * A response to an open request */ export interface OpenBridgeResponse { meta: OpenBridgeResponseMeta; @@ -1790,37 +1964,11 @@ export interface OpenBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface OpenBridgeResponseMeta { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: ErrorSourceElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: ErrorSourceElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } @@ -1828,13 +1976,13 @@ export interface OpenBridgeResponseMeta { * The message payload typically contains return values for FDC3 API functions. */ export interface OpenBridgeResponsePayload { - appIdentifier: SourceElement; + appIdentifier: AppIdentifier; } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to broadcast on a PrivateChannel. + * + * A request message from a Desktop Agent to the Bridge. */ export interface PrivateChannelBroadcastAgentRequest { meta: PrivateChannelBroadcastAgentRequestMeta; @@ -1846,7 +1994,7 @@ export interface PrivateChannelBroadcastAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -1858,20 +2006,82 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; + timestamp: Date; +} + +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + */ +export interface FluffyBridgeParticipantIdentifier { /** - * Timestamp at which request or response was generated + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' */ - timestamp: Date; + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; } /** @@ -1883,9 +2093,9 @@ export interface PrivateChannelBroadcastAgentRequestPayload { } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to broadcast on a PrivateChannel. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface PrivateChannelBroadcastBridgeRequest { meta: PrivateChannelBroadcastBridgeRequestMeta; @@ -1909,19 +2119,13 @@ export interface PrivateChannelBroadcastBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -1934,9 +2138,9 @@ export interface PrivateChannelBroadcastBridgeRequestPayload { } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to forward on an EventListenerAdded event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. */ export interface PrivateChannelEventListenerAddedAgentRequest { meta: PrivateChannelEventListenerAddedAgentRequestMeta; @@ -1948,7 +2152,7 @@ export interface PrivateChannelEventListenerAddedAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -1960,19 +2164,13 @@ export interface PrivateChannelEventListenerAddedAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -1985,9 +2183,9 @@ export interface PrivateChannelEventListenerAddedAgentRequestPayload { } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to forward on an EventListenerAdded event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface PrivateChannelEventListenerAddedBridgeRequest { meta: PrivateChannelEventListenerAddedBridgeRequestMeta; @@ -2011,19 +2209,13 @@ export interface PrivateChannelEventListenerAddedBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -2036,9 +2228,9 @@ export interface PrivateChannelEventListenerAddedBridgeRequestPayload { } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. */ export interface PrivateChannelEventListenerRemovedAgentRequest { meta: PrivateChannelEventListenerRemovedAgentRequestMeta; @@ -2050,7 +2242,7 @@ export interface PrivateChannelEventListenerRemovedAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -2062,19 +2254,13 @@ export interface PrivateChannelEventListenerRemovedAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -2087,9 +2273,9 @@ export interface PrivateChannelEventListenerRemovedAgentRequestPayload { } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface PrivateChannelEventListenerRemovedBridgeRequest { meta: PrivateChannelEventListenerRemovedBridgeRequestMeta; @@ -2113,19 +2299,13 @@ export interface PrivateChannelEventListenerRemovedBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -2138,9 +2318,9 @@ export interface PrivateChannelEventListenerRemovedBridgeRequestPayload { } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to forward on an AddCOntextListener event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. */ export interface PrivateChannelOnAddContextListenerAgentRequest { meta: PrivateChannelOnAddContextListenerAgentRequestMeta; @@ -2152,7 +2332,7 @@ export interface PrivateChannelOnAddContextListenerAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -2164,19 +2344,13 @@ export interface PrivateChannelOnAddContextListenerAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -2189,9 +2363,9 @@ export interface PrivateChannelOnAddContextListenerAgentRequestPayload { } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to forward on an AddCOntextListener event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface PrivateChannelOnAddContextListenerBridgeRequest { meta: PrivateChannelOnAddContextListenerBridgeRequestMeta; @@ -2215,19 +2389,13 @@ export interface PrivateChannelOnAddContextListenerBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -2240,9 +2408,9 @@ export interface PrivateChannelOnAddContextListenerBridgeRequestPayload { } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to forward on a Disconnect event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. */ export interface PrivateChannelOnDisconnectAgentRequest { meta: PrivateChannelOnDisconnectAgentRequestMeta; @@ -2254,7 +2422,7 @@ export interface PrivateChannelOnDisconnectAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -2266,19 +2434,13 @@ export interface PrivateChannelOnDisconnectAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -2290,9 +2452,9 @@ export interface PrivateChannelOnDisconnectAgentRequestPayload { } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to forward on a Disconnect event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface PrivateChannelOnDisconnectBridgeRequest { meta: PrivateChannelOnDisconnectBridgeRequestMeta; @@ -2316,19 +2478,13 @@ export interface PrivateChannelOnDisconnectBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -2340,9 +2496,9 @@ export interface PrivateChannelOnDisconnectBridgeRequestPayload { } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to forward on an Unsubscribe event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. */ export interface PrivateChannelOnUnsubscribeAgentRequest { meta: PrivateChannelOnUnsubscribeAgentRequestMeta; @@ -2354,7 +2510,7 @@ export interface PrivateChannelOnUnsubscribeAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -2366,19 +2522,13 @@ export interface PrivateChannelOnUnsubscribeAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source?: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -2391,9 +2541,9 @@ export interface PrivateChannelOnUnsubscribeAgentRequestPayload { } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to forward on an Unsubscribe event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface PrivateChannelOnUnsubscribeBridgeRequest { meta: ERequestMetadata; @@ -2417,19 +2567,13 @@ export interface ERequestMetadata { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: DestinationClass; - /** - * UUID for the request - */ + destination?: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -2442,9 +2586,9 @@ export interface PrivateChannelOnUnsubscribeBridgeRequestPayload { } /** - * A request message from a Desktop Agent to the Bridge. - * * A request to raise an intent. + * + * A request message from a Desktop Agent to the Bridge. */ export interface RaiseIntentAgentRequest { meta: RaiseIntentAgentRequestMeta; @@ -2456,7 +2600,7 @@ export interface RaiseIntentAgentRequest { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. */ - type: string; + type: RequestMessageType; } /** @@ -2468,19 +2612,13 @@ export interface RaiseIntentAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination: DestinationClass; - /** - * UUID for the request - */ + destination: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ source: SourceClass; - /** - * Timestamp at which request or response was generated - */ timestamp: Date; } @@ -2488,18 +2626,18 @@ export interface RaiseIntentAgentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface RaiseIntentAgentRequestPayload { - app: SourceElement; + app: AppIdentifier; context: ContextElement; intent: string; } /** - * A response message from a Desktop Agent to the Bridge. - * * A response to a request to raise an intent. + * + * A response message from a Desktop Agent to the Bridge. */ export interface RaiseIntentAgentResponse { - meta: AgentResponseMetadata; + meta: RaiseIntentAgentResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -2508,29 +2646,78 @@ export interface RaiseIntentAgentResponse { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - type: string; + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentAgentResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ export interface RaiseIntentAgentResponsePayload { - intentResolution: IntentResolutionClass; + intentResolution: IntentResolution; } /** * IntentResolution provides a standard format for data returned upon resolving an intent. + * + * ```javascript + * //resolve a "Chain" type intent + * let resolution = await agent.raiseIntent("intentName", context); + * + * //resolve a "Client-Service" type intent with a data response or a Channel + * let resolution = await agent.raiseIntent("intentName", context); + * try { + * const result = await resolution.getResult(); + * if (result && result.broadcast) { + * console.log(`${resolution.source} returned a channel with id ${result.id}`); + * } else if (result){ + * console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`); + * } else { + * console.error(`${resolution.source} didn't return data` + * } + * } catch(error) { + * console.error(`${resolution.source} returned an error: ${error}`); + * } + * + * // Use metadata about the resolving app instance to target a further intent + * await agent.raiseIntent("intentName", context, resolution.source); + * ``` */ -export interface IntentResolutionClass { +export interface IntentResolution { + /** + * The intent that was raised. May be used to determine which intent the user + * chose in response to `fdc3.raiseIntentForContext()`. + */ intent: string; - source: SourceElement; + /** + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ + source: AppIdentifier; + /** + * The version number of the Intents schema being used. + */ version?: string; } /** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - * * A request to raise an intent. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ export interface RaiseIntentBridgeRequest { meta: RaiseIntentBridgeRequestMeta; @@ -2552,21 +2739,15 @@ export interface RaiseIntentBridgeRequestMeta { /** * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination: DestinationClass; - /** - * UUID for the request + * include the name of the Desktop Agent hosting the target application. */ + destination: FluffyBridgeParticipantIdentifier; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: DestinationClass; - /** - * Timestamp at which request or response was generated - */ + source: SourceClass; timestamp: Date; } @@ -2574,16 +2755,16 @@ export interface RaiseIntentBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface RaiseIntentBridgeRequestPayload { - app: SourceElement; + app: AppIdentifier; context: ContextElement; intent: string; } /** + * A response to a request to raise an intent. + * * A response message from the Bridge back to the original Desktop Agent that raised the * request. - * - * A response to a request to raise an intent. */ export interface RaiseIntentBridgeResponse { meta: RaiseIntentBridgeResponseMeta; @@ -2602,37 +2783,11 @@ export interface RaiseIntentBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface RaiseIntentBridgeResponseMeta { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: BridgeParticipantIdentifierElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: ErrorSourceElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } @@ -2640,16 +2795,16 @@ export interface RaiseIntentBridgeResponseMeta { * The message payload typically contains return values for FDC3 API functions. */ export interface RaiseIntentBridgeResponsePayload { - intentResolution: IntentResolutionClass; + intentResolution: IntentResolution; } /** - * A response message from a Desktop Agent to the Bridge. - * * A secondary response to a request to raise an intent used to deliver the intent result + * + * A response message from a Desktop Agent to the Bridge. */ export interface RaiseIntentResultAgentResponse { - meta: AgentResponseMetadata; + meta: RaiseIntentResultAgentResponseMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -2658,26 +2813,40 @@ export interface RaiseIntentResultAgentResponse { * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Response' appended. */ - type: string; + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentResultAgentResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; } /** * The message payload typically contains return values for FDC3 API functions. */ export interface RaiseIntentResultAgentResponsePayload { - intentResult: IntentResultClass; + intentResult: IntentResult; } -export interface IntentResultClass { +export interface IntentResult { context?: ContextElement; - channel?: ChannelClass; + channel?: Channel; } /** + * A secondary response to a request to raise an intent used to deliver the intent result + * * A response message from the Bridge back to the original Desktop Agent that raised the * request. - * - * A secondary response to a request to raise an intent used to deliver the intent result */ export interface RaiseIntentResultBridgeResponse { meta: RaiseIntentResultBridgeResponseMeta; @@ -2696,37 +2865,11 @@ export interface RaiseIntentResultBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface RaiseIntentResultBridgeResponseMeta { - /** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - */ errorDetails?: string[]; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned - * to the bridge before the timeout or because an error occurred. May be omitted if all - * sources responded without errors. MUST include the `desktopAgent` field when returned by - * the bridge. - */ - errorSources?: BridgeParticipantIdentifierElement[]; - /** - * UUID for the request this message is responding to - */ + errorSources?: DesktopAgentIdentifier[]; requestUuid: string; - /** - * Unique UUID for this collated response (generated by the bridge). - */ responseUuid: string; - /** - * Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated - * responses to the request. Will contain a single value for individual responses and - * multiple values for responses that were collated by the bridge. May be omitted if all - * sources errored. MUST include the `desktopAgent` field when returned by the bridge. - */ - sources?: SourceElement[]; - /** - * Timestamp at which the response was generated - */ + sources?: DesktopAgentIdentifier[]; timestamp: Date; } @@ -2734,7 +2877,7 @@ export interface RaiseIntentResultBridgeResponseMeta { * The message payload typically contains return values for FDC3 API functions. */ export interface RaiseIntentResultBridgeResponsePayload { - intentResult: IntentResultClass; + intentResult: IntentResult; } export interface Context { @@ -2747,28 +2890,12 @@ export interface Context { // Converts JSON strings to/from your types // and asserts the results of JSON.parse at runtime export class Convert { - public static toAppIdentifier(json: string): AppIdentifier { - return cast(JSON.parse(json), r('AppIdentifier')); - } - - public static appIdentifierToJson(value: AppIdentifier): string { - return JSON.stringify(uncast(value, r('AppIdentifier')), null, 2); - } - - public static toAppIntent(json: string): AppIntent { - return cast(JSON.parse(json), r('AppIntent')); - } - - public static appIntentToJson(value: AppIntent): string { - return JSON.stringify(uncast(value, r('AppIntent')), null, 2); - } - - public static toAppMetadata(json: string): AppMetadata { - return cast(JSON.parse(json), r('AppMetadata')); + public static toSchemasAPIAPISchema(json: string): any { + return cast(JSON.parse(json), 'any'); } - public static appMetadataToJson(value: AppMetadata): string { - return JSON.stringify(uncast(value, r('AppMetadata')), null, 2); + public static schemasAPIAPISchemaToJson(value: any): string { + return JSON.stringify(uncast(value, 'any'), null, 2); } public static toBaseImplementationMetadata(json: string): BaseImplementationMetadata { @@ -2779,94 +2906,6 @@ export class Convert { return JSON.stringify(uncast(value, r('BaseImplementationMetadata')), null, 2); } - public static toChannel(json: string): Channel { - return cast(JSON.parse(json), r('Channel')); - } - - public static channelToJson(value: Channel): string { - return JSON.stringify(uncast(value, r('Channel')), null, 2); - } - - public static toContextMetadata(json: string): ContextMetadata { - return cast(JSON.parse(json), r('ContextMetadata')); - } - - public static contextMetadataToJson(value: ContextMetadata): string { - return JSON.stringify(uncast(value, r('ContextMetadata')), null, 2); - } - - public static toDesktopAgentIdentifier(json: string): DesktopAgentIdentifier { - return cast(JSON.parse(json), r('DesktopAgentIdentifier')); - } - - public static desktopAgentIdentifierToJson(value: DesktopAgentIdentifier): string { - return JSON.stringify(uncast(value, r('DesktopAgentIdentifier')), null, 2); - } - - public static toDisplayMetadata(json: string): DisplayMetadata { - return cast(JSON.parse(json), r('DisplayMetadata')); - } - - public static displayMetadataToJson(value: DisplayMetadata): string { - return JSON.stringify(uncast(value, r('DisplayMetadata')), null, 2); - } - - public static toSchemasAPIErrorsSchema(json: string): any { - return cast(JSON.parse(json), 'any'); - } - - public static schemasAPIErrorsSchemaToJson(value: any): string { - return JSON.stringify(uncast(value, 'any'), null, 2); - } - - public static toIcon(json: string): Icon { - return cast(JSON.parse(json), r('Icon')); - } - - public static iconToJson(value: Icon): string { - return JSON.stringify(uncast(value, r('Icon')), null, 2); - } - - public static toImage(json: string): Image { - return cast(JSON.parse(json), r('Image')); - } - - public static imageToJson(value: Image): string { - return JSON.stringify(uncast(value, r('Image')), null, 2); - } - - public static toImplementationMetadata(json: string): ImplementationMetadata { - return cast(JSON.parse(json), r('ImplementationMetadata')); - } - - public static implementationMetadataToJson(value: ImplementationMetadata): string { - return JSON.stringify(uncast(value, r('ImplementationMetadata')), null, 2); - } - - public static toIntentMetadata(json: string): IntentMetadata { - return cast(JSON.parse(json), r('IntentMetadata')); - } - - public static intentMetadataToJson(value: IntentMetadata): string { - return JSON.stringify(uncast(value, r('IntentMetadata')), null, 2); - } - - public static toIntentResolution(json: string): IntentResolution { - return cast(JSON.parse(json), r('IntentResolution')); - } - - public static intentResolutionToJson(value: IntentResolution): string { - return JSON.stringify(uncast(value, r('IntentResolution')), null, 2); - } - - public static toIntentResult(json: string): IntentResult { - return cast(JSON.parse(json), r('IntentResult')); - } - - public static intentResultToJson(value: IntentResult): string { - return JSON.stringify(uncast(value, r('IntentResult')), null, 2); - } - public static toAgentRequestMessage(json: string): AgentRequestMessage { return cast(JSON.parse(json), r('AgentRequestMessage')); } @@ -2883,14 +2922,6 @@ export class Convert { return JSON.stringify(uncast(value, r('AgentResponseMessage')), null, 2); } - public static toBridgeParticipantIdentifier(json: string): BridgeParticipantIdentifier { - return cast(JSON.parse(json), r('BridgeParticipantIdentifier')); - } - - public static bridgeParticipantIdentifierToJson(value: BridgeParticipantIdentifier): string { - return JSON.stringify(uncast(value, r('BridgeParticipantIdentifier')), null, 2); - } - public static toBridgeRequestMessage(json: string): BridgeRequestMessage { return cast(JSON.parse(json), r('BridgeRequestMessage')); } @@ -2923,6 +2954,22 @@ export class Convert { return JSON.stringify(uncast(value, r('BroadcastBridgeRequest')), null, 2); } + public static toBridgingCommons(json: string): { [key: string]: any } { + return cast(JSON.parse(json), m('any')); + } + + public static bridgingCommonsToJson(value: { [key: string]: any }): string { + return JSON.stringify(uncast(value, m('any')), null, 2); + } + + public static toConnectionStepMessage(json: string): ConnectionStepMessage { + return cast(JSON.parse(json), r('ConnectionStepMessage')); + } + + public static connectionStepMessageToJson(value: ConnectionStepMessage): string { + return JSON.stringify(uncast(value, r('ConnectionStepMessage')), null, 2); + } + public static toConnectionStep2Hello(json: string): ConnectionStep2Hello { return cast(JSON.parse(json), r('ConnectionStep2Hello')); } @@ -3425,158 +3472,52 @@ function transform(val: any, typ: any, getProps: any, key: any = '', parent: any } // Numbers can be parsed by Date but shouldn't be. if (typ === Date && typeof val !== 'number') return transformDate(val); - return transformPrimitive(typ, val); -} - -function cast(val: any, typ: any): T { - return transform(val, typ, jsonToJSProps); -} - -function uncast(val: T, typ: any): any { - return transform(val, typ, jsToJSONProps); -} - -function l(typ: any) { - return { literal: typ }; -} - -function a(typ: any) { - return { arrayItems: typ }; -} - -function u(...typs: any[]) { - return { unionMembers: typs }; -} - -function o(props: any[], additional: any) { - return { props, additional }; -} - -function m(additional: any) { - return { props: [], additional }; -} - -function r(name: string) { - return { ref: name }; -} - -const typeMap: any = { - AppIdentifier: o( - [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - ], - false - ), - AppIntent: o( - [ - { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, - { json: 'intent', js: 'intent', typ: r('IntentClass') }, - ], - false - ), - AppMetadataElement: o( - [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - ], - false - ), - IntentClass: o( - [ - { json: 'displayName', js: 'displayName', typ: '' }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - ], - false - ), - AppMetadata: o( - [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - ], - false - ), - BaseImplementationMetadata: o( - [ - { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('BaseImplementationMetadataOptionalFeatures') }, - { json: 'provider', js: 'provider', typ: '' }, - { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, - ], - false - ), - BaseImplementationMetadataOptionalFeatures: o( - [ - { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, - { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, - { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, - ], - false - ), - Channel: o( - [ - { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, - { json: 'id', js: 'id', typ: '' }, - { json: 'type', js: 'type', typ: r('Type') }, - ], - false - ), - DisplayMetadataClass: o( - [ - { json: 'color', js: 'color', typ: u(undefined, '') }, - { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - ], - false - ), - ContextMetadata: o([{ json: 'source', js: 'source', typ: r('SourceElement') }], false), - SourceElement: o( - [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - ], - false - ), - DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), - DisplayMetadata: o( - [ - { json: 'color', js: 'color', typ: u(undefined, '') }, - { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - ], - false - ), - Icon: o( - [ - { json: 'size', js: 'size', typ: u(undefined, '') }, - { json: 'src', js: 'src', typ: '' }, - { json: 'type', js: 'type', typ: u(undefined, '') }, - ], - false - ), - Image: o( - [ - { json: 'label', js: 'label', typ: u(undefined, '') }, - { json: 'size', js: 'size', typ: u(undefined, '') }, - { json: 'src', js: 'src', typ: '' }, - { json: 'type', js: 'type', typ: u(undefined, '') }, - ], - false - ), - ImplementationMetadata: o( + return transformPrimitive(typ, val); +} + +function cast(val: any, typ: any): T { + return transform(val, typ, jsonToJSProps); +} + +function uncast(val: T, typ: any): any { + return transform(val, typ, jsToJSONProps); +} + +function l(typ: any) { + return { literal: typ }; +} + +function a(typ: any) { + return { arrayItems: typ }; +} + +function u(...typs: any[]) { + return { unionMembers: typs }; +} + +function o(props: any[], additional: any) { + return { props, additional }; +} + +function m(additional: any) { + return { props: [], additional }; +} + +function r(name: string) { + return { ref: name }; +} + +const typeMap: any = { + BaseImplementationMetadata: o( [ { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('BaseImplementationMetadataOptionalFeatures') }, { json: 'provider', js: 'provider', typ: '' }, { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, ], false ), - ImplementationMetadataOptionalFeatures: o( + BaseImplementationMetadataOptionalFeatures: o( [ { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, @@ -3584,54 +3525,30 @@ const typeMap: any = { ], false ), - IntentMetadata: o( - [ - { json: 'displayName', js: 'displayName', typ: '' }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - ], - false - ), - IntentResolution: o( - [ - { json: 'intent', js: 'intent', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceElement') }, - { json: 'version', js: 'version', typ: u(undefined, '') }, - ], - false - ), - IntentResult: o( - [ - { json: 'id', js: 'id', typ: u(undefined, u(m('any'), '')) }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - { json: 'type', js: 'type', typ: '' }, - { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, - ], - 'any' - ), AgentRequestMessage: o( [ - { json: 'meta', js: 'meta', typ: r('AgentRequestMessageMeta') }, + { json: 'meta', js: 'meta', typ: r('AgentRequestMetadata') }, { json: 'payload', js: 'payload', typ: m('any') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), - AgentRequestMessageMeta: o( + AgentRequestMetadata: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - BridgeParticipantIdentifierElement: o( + BridgeParticipantIdentifier: o( [ { json: 'appId', js: 'appId', typ: u(undefined, '') }, - { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - 'any' + false ), SourceIdentifier: o( [ @@ -3639,13 +3556,13 @@ const typeMap: any = { { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - 'any' + false ), AgentResponseMessage: o( [ { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, { json: 'payload', js: 'payload', typ: m('any') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, ], false ), @@ -3653,51 +3570,44 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceIdentifier') }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - BridgeParticipantIdentifier: o( - [ - { json: 'appId', js: 'appId', typ: u(undefined, '') }, - { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - ], - 'any' - ), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), BridgeRequestMessage: o( [ - { json: 'meta', js: 'meta', typ: r('BridgeRequestMessageMeta') }, + { json: 'meta', js: 'meta', typ: r('BridgeRequestMetadata') }, { json: 'payload', js: 'payload', typ: m('any') }, { json: 'type', js: 'type', typ: '' }, ], false ), - BridgeRequestMessageMeta: o( + BridgeRequestMetadata: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('BridgeParticipantIdentifierElement') }, + { json: 'source', js: 'source', typ: r('SourceIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), BridgeResponseMessage: o( [ - { json: 'meta', js: 'meta', typ: r('BridgeResponseMessageMeta') }, + { json: 'meta', js: 'meta', typ: r('BridgeResponseMetadata') }, { json: 'payload', js: 'payload', typ: m('any') }, { json: 'type', js: 'type', typ: '' }, ], false ), - BridgeResponseMessageMeta: o( + BridgeResponseMetadata: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -3706,7 +3616,7 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('BroadcastAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('BroadcastAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), @@ -3728,19 +3638,27 @@ const typeMap: any = { ), BroadcastAgentRequestPayload: o( [ - { json: 'channel', js: 'channel', typ: r('ChannelClass') }, + { json: 'channel', js: 'channel', typ: r('Channel') }, { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), - ChannelClass: o( + Channel: o( [ - { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadataClass')) }, + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadata')) }, { json: 'id', js: 'id', typ: '' }, { json: 'type', js: 'type', typ: r('Type') }, ], false ), + DisplayMetadata: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), ContextElement: o( [ { json: 'id', js: 'id', typ: u(undefined, m('any')) }, @@ -3760,23 +3678,31 @@ const typeMap: any = { BroadcastBridgeRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - DestinationClass: o( + BroadcastBridgeRequestPayload: o( [ - { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'channel', js: 'channel', typ: r('Channel') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), - BroadcastBridgeRequestPayload: o( + ConnectionStepMessage: o( [ - { json: 'channel', js: 'channel', typ: r('ChannelClass') }, - { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'meta', js: 'meta', typ: r('ConnectionStepMetadata') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: r('ConnectionStepMessageType') }, + ], + false + ), + ConnectionStepMetadata: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: u(undefined, '') }, + { json: 'responseUuid', js: 'responseUuid', typ: u(undefined, '') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), @@ -3784,7 +3710,7 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('ConnectionStep2HelloMeta') }, { json: 'payload', js: 'payload', typ: r('ConnectionStep2HelloPayload') }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'type', js: 'type', typ: r('ConnectionStepMessageType') }, ], false ), @@ -3802,7 +3728,7 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('ConnectionStep3HandshakeMeta') }, { json: 'payload', js: 'payload', typ: r('ConnectionStep3HandshakePayload') }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'type', js: 'type', typ: r('ConnectionStepMessageType') }, ], false ), @@ -3817,12 +3743,12 @@ const typeMap: any = { [ { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, { json: 'channelsState', js: 'channelsState', typ: m(a(r('ContextElement'))) }, - { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadataClass') }, + { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadataElement') }, { json: 'requestedName', js: 'requestedName', typ: '' }, ], false ), - ImplementationMetadataClass: o( + ImplementationMetadataElement: o( [ { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, @@ -3831,11 +3757,19 @@ const typeMap: any = { ], false ), + ImplementationMetadataOptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), ConnectionStep4AuthenticationFailed: o( [ { json: 'meta', js: 'meta', typ: r('ConnectionStep4AuthenticationFailedMeta') }, - { json: 'payload', js: 'payload', typ: u(undefined, r('ConnectionStep4AuthenticationFailedPayload')) }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep4AuthenticationFailedPayload') }, + { json: 'type', js: 'type', typ: r('ConnectionStepMessageType') }, ], false ), @@ -3852,7 +3786,7 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('ConnectionStep6ConnectedAgentsUpdateMeta') }, { json: 'payload', js: 'payload', typ: r('ConnectionStep6ConnectedAgentsUpdatePayload') }, - { json: 'type', js: 'type', typ: 'any' }, + { json: 'type', js: 'type', typ: r('ConnectionStepMessageType') }, ], false ), @@ -3873,51 +3807,86 @@ const typeMap: any = { ], false ), - ImplementationMetadataElement: o( - [ - { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, - { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('ImplementationMetadataOptionalFeatures') }, - { json: 'provider', js: 'provider', typ: '' }, - { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, - ], - false - ), FindInstancesAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindInstancesAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('FindInstancesAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), FindInstancesAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - DestinationObject: o( + PurpleBridgeParticipantIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), + FindInstancesAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), + AppIdentifier: o( [ - { json: 'appId', js: 'appId', typ: u(undefined, '') }, - { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - 'any' + false ), - FindInstancesAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), FindInstancesAgentResponse: o( [ - { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('FindInstancesAgentResponseMeta') }, { json: 'payload', js: 'payload', typ: r('FindInstancesAgentResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + FindInstancesAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), FindInstancesAgentResponsePayload: o( - [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadataElement')) }], + [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadata')) }], + false + ), + AppMetadata: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'description', js: 'description', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'icons', js: 'icons', typ: u(undefined, a(r('Icon'))) }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'instanceMetadata', js: 'instanceMetadata', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, u(null, '')) }, + { json: 'screenshots', js: 'screenshots', typ: u(undefined, a(r('Image'))) }, + { json: 'title', js: 'title', typ: u(undefined, '') }, + { json: 'tooltip', js: 'tooltip', typ: u(undefined, '') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + Icon: o( + [ + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + Image: o( + [ + { json: 'label', js: 'label', typ: u(undefined, '') }, + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], false ), FindInstancesBridgeRequest: o( @@ -3930,14 +3899,14 @@ const typeMap: any = { ), FindInstancesBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - FindInstancesBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + FindInstancesBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), FindInstancesBridgeResponse: o( [ { json: 'meta', js: 'meta', typ: r('FindInstancesBridgeResponseMeta') }, @@ -3949,33 +3918,32 @@ const typeMap: any = { FindInstancesBridgeResponseMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - ErrorSourceElement: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), FindInstancesBridgeResponsePayload: o( - [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadataElement')) }], + [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadata')) }], false ), FindIntentsAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('EntRequestMetadata') }, + { json: 'meta', js: 'meta', typ: r('FindIntentsAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('FindIntentsAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), - EntRequestMetadata: o( + FindIntentsAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], false ), @@ -3988,17 +3956,33 @@ const typeMap: any = { ), FindIntentAgentResponse: o( [ - { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('FindIntentAgentResponseMeta') }, { json: 'payload', js: 'payload', typ: r('FindIntentAgentResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + FindIntentAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentAgentResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntent') }], false), + AppIntent: o( + [ + { json: 'apps', js: 'apps', typ: a(r('AppMetadata')) }, + { json: 'intent', js: 'intent', typ: r('IntentMetadata') }, ], false ), - FindIntentAgentResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntentElement') }], false), - AppIntentElement: o( + IntentMetadata: o( [ - { json: 'apps', js: 'apps', typ: a(r('AppMetadataElement')) }, - { json: 'intent', js: 'intent', typ: r('IntentClass') }, + { json: 'displayName', js: 'displayName', typ: '' }, + { json: 'name', js: 'name', typ: '' }, ], false ), @@ -4012,10 +3996,10 @@ const typeMap: any = { ), FindIntentBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], false ), @@ -4037,43 +4021,52 @@ const typeMap: any = { FindIntentBridgeResponseMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - FindIntentBridgeResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntentElement') }], false), + FindIntentBridgeResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntent') }], false), FindIntentsByContextAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), FindIntentsByContextAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], false ), FindIntentsByContextAgentRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextElement') }], false), FindIntentsByContextAgentResponse: o( [ - { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentResponseMeta') }, { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + FindIntentsByContextAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), FindIntentsByContextAgentResponsePayload: o( - [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntentElement')) }], + [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntent')) }], false ), FindIntentsByContextBridgeRequest: o( @@ -4086,67 +4079,73 @@ const typeMap: any = { ), FindIntentsByContextBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifierElement')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], false ), FindIntentsByContextBridgeRequestPayload: o([{ json: 'context', js: 'context', typ: r('ContextElement') }], false), FindIntentsByContextBridgeResponse: o( [ - { json: 'meta', js: 'meta', typ: r('ResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextBridgeResponseMeta') }, { json: 'payload', js: 'payload', typ: r('FindIntentsByContextBridgeResponsePayload') }, { json: 'type', js: 'type', typ: '' }, ], false ), - ResponseMetadata: o( + FindIntentsByContextBridgeResponseMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), FindIntentsByContextBridgeResponsePayload: o( - [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntentElement')) }], + [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntent')) }], false ), GetAppMetadataAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), GetAppMetadataAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - GetAppMetadataAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + GetAppMetadataAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), GetAppMetadataAgentResponse: o( [ - { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentResponseMeta') }, { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, ], false ), - GetAppMetadataAgentResponsePayload: o( - [{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }], + GetAppMetadataAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], false ), + GetAppMetadataAgentResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadata') }], false), GetAppMetadataBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeRequestMeta') }, @@ -4157,14 +4156,14 @@ const typeMap: any = { ), GetAppMetadataBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - GetAppMetadataBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('SourceElement') }], false), + GetAppMetadataBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), GetAppMetadataBridgeResponse: o( [ { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeResponseMeta') }, @@ -4176,29 +4175,26 @@ const typeMap: any = { GetAppMetadataBridgeResponseMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - GetAppMetadataBridgeResponsePayload: o( - [{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadataElement') }], - false - ), + GetAppMetadataBridgeResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadata') }], false), OpenAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('OpenAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('OpenAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), OpenAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -4207,20 +4203,29 @@ const typeMap: any = { ), OpenAgentRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'app', js: 'app', typ: r('AppIdentifier') }, { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, ], false ), OpenAgentResponse: o( [ - { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('OpenAgentResponseMeta') }, { json: 'payload', js: 'payload', typ: r('OpenAgentResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + OpenAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - OpenAgentResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('SourceElement') }], false), + OpenAgentResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('AppIdentifier') }], false), OpenBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('OpenBridgeRequestMeta') }, @@ -4231,16 +4236,16 @@ const typeMap: any = { ), OpenBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), OpenBridgeRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'app', js: 'app', typ: r('AppIdentifier') }, { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, ], false @@ -4256,32 +4261,40 @@ const typeMap: any = { OpenBridgeResponseMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - OpenBridgeResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('SourceElement') }], false), + OpenBridgeResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('AppIdentifier') }], false), PrivateChannelBroadcastAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('PrivateChannelBroadcastAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('PrivateChannelBroadcastAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), PrivateChannelBroadcastAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), + FluffyBridgeParticipantIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + false + ), PrivateChannelBroadcastAgentRequestPayload: o( [ { json: 'channel', js: 'channel', typ: '' }, @@ -4299,9 +4312,9 @@ const typeMap: any = { ), PrivateChannelBroadcastBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -4317,13 +4330,13 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerAddedAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerAddedAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), PrivateChannelEventListenerAddedAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -4347,9 +4360,9 @@ const typeMap: any = { ), PrivateChannelEventListenerAddedBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -4365,13 +4378,13 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerRemovedAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerRemovedAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), PrivateChannelEventListenerRemovedAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -4395,9 +4408,9 @@ const typeMap: any = { ), PrivateChannelEventListenerRemovedBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -4413,13 +4426,13 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('PrivateChannelOnAddContextListenerAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), PrivateChannelOnAddContextListenerAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -4443,9 +4456,9 @@ const typeMap: any = { ), PrivateChannelOnAddContextListenerBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -4461,13 +4474,13 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('PrivateChannelOnDisconnectAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), PrivateChannelOnDisconnectAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -4485,9 +4498,9 @@ const typeMap: any = { ), PrivateChannelOnDisconnectBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -4497,13 +4510,13 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('PrivateChannelOnUnsubscribeAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribeAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), PrivateChannelOnUnsubscribeAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -4527,9 +4540,9 @@ const typeMap: any = { ), ERequestMetadata: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationClass')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -4545,13 +4558,13 @@ const typeMap: any = { [ { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentRequestMeta') }, { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentRequestPayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), RaiseIntentAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: r('DestinationClass') }, + { json: 'destination', js: 'destination', typ: r('FluffyBridgeParticipantIdentifier') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -4560,7 +4573,7 @@ const typeMap: any = { ), RaiseIntentAgentRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'app', js: 'app', typ: r('AppIdentifier') }, { json: 'context', js: 'context', typ: r('ContextElement') }, { json: 'intent', js: 'intent', typ: '' }, ], @@ -4568,20 +4581,29 @@ const typeMap: any = { ), RaiseIntentAgentResponse: o( [ - { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentResponseMeta') }, { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + RaiseIntentAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), RaiseIntentAgentResponsePayload: o( - [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolutionClass') }], + [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolution') }], false ), - IntentResolutionClass: o( + IntentResolution: o( [ { json: 'intent', js: 'intent', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceElement') }, + { json: 'source', js: 'source', typ: r('AppIdentifier') }, { json: 'version', js: 'version', typ: u(undefined, '') }, ], false @@ -4596,16 +4618,16 @@ const typeMap: any = { ), RaiseIntentBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: r('DestinationClass') }, + { json: 'destination', js: 'destination', typ: r('FluffyBridgeParticipantIdentifier') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DestinationClass') }, + { json: 'source', js: 'source', typ: r('SourceClass') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), RaiseIntentBridgeRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('SourceElement') }, + { json: 'app', js: 'app', typ: r('AppIdentifier') }, { json: 'context', js: 'context', typ: r('ContextElement') }, { json: 'intent', js: 'intent', typ: '' }, ], @@ -4622,34 +4644,43 @@ const typeMap: any = { RaiseIntentBridgeResponseMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('ErrorSourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), RaiseIntentBridgeResponsePayload: o( - [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolutionClass') }], + [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolution') }], false ), RaiseIntentResultAgentResponse: o( [ - { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultAgentResponseMeta') }, { json: 'payload', js: 'payload', typ: r('RaiseIntentResultAgentResponsePayload') }, - { json: 'type', js: 'type', typ: '' }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + RaiseIntentResultAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), RaiseIntentResultAgentResponsePayload: o( - [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResultClass') }], + [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResult') }], false ), - IntentResultClass: o( + IntentResult: o( [ { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, - { json: 'channel', js: 'channel', typ: u(undefined, r('ChannelClass')) }, + { json: 'channel', js: 'channel', typ: u(undefined, r('Channel')) }, ], false ), @@ -4664,16 +4695,16 @@ const typeMap: any = { RaiseIntentResultBridgeResponseMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, - { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('BridgeParticipantIdentifierElement'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'sources', js: 'sources', typ: u(undefined, a(r('SourceElement'))) }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), RaiseIntentResultBridgeResponsePayload: o( - [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResultClass') }], + [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResult') }], false ), Context: o( @@ -4684,5 +4715,30 @@ const typeMap: any = { ], 'any' ), + RequestMessageType: [ + 'broadcastRequest', + 'findInstancesRequest', + 'findIntentRequest', + 'findIntentsByContextRequest', + 'getAppMetadataRequest', + 'openRequest', + 'PrivateChannel.broadcast', + 'PrivateChannel.eventListenerAdded', + 'PrivateChannel.onAddContextListener', + 'PrivateChannel.onDisconnect', + 'PrivateChannel.onUnsubscribe', + 'raiseIntentRequest', + 'raiseIntentResultResponse', + ], + ResponseMessageType: [ + 'findInstancesResponse', + 'findIntentResponse', + 'findIntentsByContextResponse', + 'getAppMetadataResponse', + 'openResponse', + 'raiseIntentResponse', + 'raiseIntentResultResponse', + ], Type: ['app', 'private', 'user'], + ConnectionStepMessageType: ['authenticationFailed', 'connectedAgentsUpdate', 'handshake', 'hello'], }; From 4375bd662659ec913a2f41a58651d06fad9101d1 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 12:56:10 +0100 Subject: [PATCH 067/106] Fixing channel args to broadcast in bridging schemas and changing field name to `channelId` to be more intuitive --- .../ref/PrivateChannel.broadcast.md | 2 +- docs/agent-bridging/ref/broadcast.md | 4 +- .../broadcastAgentRequest.schema.json | 12 +- ...teChannelBroadcastAgentRequest.schema.json | 12 +- src/bridging/BridgingTypes.ts | 213 ++++++++++-------- 5 files changed, 139 insertions(+), 104 deletions(-) diff --git a/docs/agent-bridging/ref/PrivateChannel.broadcast.md b/docs/agent-bridging/ref/PrivateChannel.broadcast.md index 3533c40f0..30c389d6b 100644 --- a/docs/agent-bridging/ref/PrivateChannel.broadcast.md +++ b/docs/agent-bridging/ref/PrivateChannel.broadcast.md @@ -65,7 +65,7 @@ Hence, the broadcast message should be repeated once for each subscriber, and mo { "type": "PrivateChannel.broadcast", //modified type for PrivateChannel broadcasts "payload": { - "channel": "private-channel-ABC123", + "channelId": "private-channel-ABC123", "context": { /*contextObj*/} }, "meta": { diff --git a/docs/agent-bridging/ref/broadcast.md b/docs/agent-bridging/ref/broadcast.md index be7e216f0..d657035e2 100644 --- a/docs/agent-bridging/ref/broadcast.md +++ b/docs/agent-bridging/ref/broadcast.md @@ -58,7 +58,7 @@ Outward message to the DAB: { "type": "broadcastRequest", "payload": { - "channel": "myChannel", + "channelId": "myChannel", "context": { /*contextObj*/ } }, "meta": { @@ -80,7 +80,7 @@ which it repeats on to agent-B AND agent-C with the `source.desktopAgent` metada { "type": "broadcastRequest", "payload": { - "channel": "myChannel", + "channelId": "myChannel", "context": { /*contextObj*/} }, "meta": { diff --git a/schemas/bridging/broadcastAgentRequest.schema.json b/schemas/bridging/broadcastAgentRequest.schema.json index 328cdff50..f9faa2795 100644 --- a/schemas/bridging/broadcastAgentRequest.schema.json +++ b/schemas/bridging/broadcastAgentRequest.schema.json @@ -25,15 +25,19 @@ "title": "broadcast Request Payload", "type": "object", "properties": { - "channel": { - "$ref": "../api/api.schema.json#/definitions/Channel" + "channelId": { + "type": "string", + "title": "Channel Id", + "description": "The Id of the PrivateChannel that the broadcast was sent on" }, "context": { - "$ref": "../context/context.schema.json" + "$ref": "../context/context.schema.json", + "title": "Context", + "description": "The context object that was the payload of a broadcast message." } }, "additionalProperties": false, - "required": ["channel", "context"] + "required": ["channelId", "context"] }, "meta": { "type": "object", diff --git a/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json index 17b5b6519..fb36fa38d 100644 --- a/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json +++ b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json @@ -25,15 +25,19 @@ "title": "PrivateChannelBroadcast Request Payload", "type": "object", "properties": { - "channel": { - "type": "string" + "channelId": { + "type": "string", + "title": "Channel Id", + "description": "The Id of the PrivateChannel that the broadcast was sent on" }, "context": { - "type": "string" + "$ref": "../context/context.schema.json", + "title": "Context", + "description": "The context object that was the payload of a broadcast message." } }, "additionalProperties": false, - "required": ["channel", "context"] + "required": ["channelId", "context"] }, "meta": { "title": "PrivateChannelBroadcast Request Metadata", diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index d832d0d4f..3012a23ab 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -524,79 +524,19 @@ export interface SourceClass { * The message payload typically contains the arguments to FDC3 API functions. */ export interface BroadcastAgentRequestPayload { - channel: Channel; - context: ContextElement; -} - -/** - * Represents a context channel that applications can use to send and receive - * context data. - * - * Please note that There are differences in behavior when you interact with a - * User channel via the `DesktopAgent` interface and the `Channel` interface. - * Specifically, when 'joining' a User channel or adding a context listener - * when already joined to a channel via the `DesktopAgent` interface, existing - * context (matching the type of the context listener) on the channel is - * received by the context listener immediately. Whereas, when a context - * listener is added via the Channel interface, context is not received - * automatically, but may be retrieved manually via the `getCurrentContext()` - * function. - */ -export interface Channel { - /** - * Channels may be visualized and selectable by users. DisplayMetadata may be used to - * provide hints on how to see them. - * For App channels, displayMetadata would typically not be present. - */ - displayMetadata?: DisplayMetadata; - /** - * Constant that uniquely identifies this channel. - */ - id: string; - /** - * Uniquely defines each channel type. - * Can be "user", "app" or "private". - */ - type: Type; -} - -/** - * Channels may be visualized and selectable by users. DisplayMetadata may be used to - * provide hints on how to see them. - * For App channels, displayMetadata would typically not be present. - * - * A system channel will be global enough to have a presence across many apps. This gives us - * some hints - * to render them in a standard way. It is assumed it may have other properties too, but if - * it has these, - * this is their meaning. - */ -export interface DisplayMetadata { - /** - * The color that should be associated within this channel when displaying this channel in a - * UI, e.g: `0xFF0000`. - */ - color?: string; /** - * A URL of an image that can be used to display this channel + * The Id of the PrivateChannel that the broadcast was sent on */ - glyph?: string; + channelId: string; /** - * A user-readable name for this channel, e.g: `"Red"` + * The context object that was the payload of a broadcast message. */ - name?: string; + context: ContextElement; } /** - * Uniquely defines each channel type. - * Can be "user", "app" or "private". + * The context object that was the payload of a broadcast message. */ -export enum Type { - App = 'app', - Private = 'private', - User = 'user', -} - export interface ContextElement { id?: { [key: string]: any }; name?: string; @@ -639,7 +579,13 @@ export interface BroadcastBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface BroadcastBridgeRequestPayload { - channel: Channel; + /** + * The Id of the PrivateChannel that the broadcast was sent on + */ + channelId: string; + /** + * The context object that was the payload of a broadcast message. + */ context: ContextElement; } @@ -2088,8 +2034,14 @@ export interface FluffyBridgeParticipantIdentifier { * The message payload typically contains the arguments to FDC3 API functions. */ export interface PrivateChannelBroadcastAgentRequestPayload { - channel: string; - context: string; + /** + * The Id of the PrivateChannel that the broadcast was sent on + */ + channelId: string; + /** + * The context object that was the payload of a broadcast message. + */ + context: ContextElement; } /** @@ -2133,8 +2085,14 @@ export interface PrivateChannelBroadcastBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface PrivateChannelBroadcastBridgeRequestPayload { - channel: string; - context: string; + /** + * The Id of the PrivateChannel that the broadcast was sent on + */ + channelId: string; + /** + * The context object that was the payload of a broadcast message. + */ + context: ContextElement; } /** @@ -2842,6 +2800,75 @@ export interface IntentResult { channel?: Channel; } +/** + * Represents a context channel that applications can use to send and receive + * context data. + * + * Please note that There are differences in behavior when you interact with a + * User channel via the `DesktopAgent` interface and the `Channel` interface. + * Specifically, when 'joining' a User channel or adding a context listener + * when already joined to a channel via the `DesktopAgent` interface, existing + * context (matching the type of the context listener) on the channel is + * received by the context listener immediately. Whereas, when a context + * listener is added via the Channel interface, context is not received + * automatically, but may be retrieved manually via the `getCurrentContext()` + * function. + */ +export interface Channel { + /** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + */ + displayMetadata?: DisplayMetadata; + /** + * Constant that uniquely identifies this channel. + */ + id: string; + /** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". + */ + type: Type; +} + +/** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + * + * A system channel will be global enough to have a presence across many apps. This gives us + * some hints + * to render them in a standard way. It is assumed it may have other properties too, but if + * it has these, + * this is their meaning. + */ +export interface DisplayMetadata { + /** + * The color that should be associated within this channel when displaying this channel in a + * UI, e.g: `0xFF0000`. + */ + color?: string; + /** + * A URL of an image that can be used to display this channel + */ + glyph?: string; + /** + * A user-readable name for this channel, e.g: `"Red"` + */ + name?: string; +} + +/** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". + */ +export enum Type { + App = 'app', + Private = 'private', + User = 'user', +} + /** * A secondary response to a request to raise an intent used to deliver the intent result * @@ -3638,27 +3665,11 @@ const typeMap: any = { ), BroadcastAgentRequestPayload: o( [ - { json: 'channel', js: 'channel', typ: r('Channel') }, + { json: 'channelId', js: 'channelId', typ: '' }, { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), - Channel: o( - [ - { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadata')) }, - { json: 'id', js: 'id', typ: '' }, - { json: 'type', js: 'type', typ: r('Type') }, - ], - false - ), - DisplayMetadata: o( - [ - { json: 'color', js: 'color', typ: u(undefined, '') }, - { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, - { json: 'name', js: 'name', typ: u(undefined, '') }, - ], - false - ), ContextElement: o( [ { json: 'id', js: 'id', typ: u(undefined, m('any')) }, @@ -3685,7 +3696,7 @@ const typeMap: any = { ), BroadcastBridgeRequestPayload: o( [ - { json: 'channel', js: 'channel', typ: r('Channel') }, + { json: 'channelId', js: 'channelId', typ: '' }, { json: 'context', js: 'context', typ: r('ContextElement') }, ], false @@ -4297,8 +4308,8 @@ const typeMap: any = { ), PrivateChannelBroadcastAgentRequestPayload: o( [ - { json: 'channel', js: 'channel', typ: '' }, - { json: 'context', js: 'context', typ: '' }, + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), @@ -4321,8 +4332,8 @@ const typeMap: any = { ), PrivateChannelBroadcastBridgeRequestPayload: o( [ - { json: 'channel', js: 'channel', typ: '' }, - { json: 'context', js: 'context', typ: '' }, + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'context', js: 'context', typ: r('ContextElement') }, ], false ), @@ -4684,6 +4695,22 @@ const typeMap: any = { ], false ), + Channel: o( + [ + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadata')) }, + { json: 'id', js: 'id', typ: '' }, + { json: 'type', js: 'type', typ: r('Type') }, + ], + false + ), + DisplayMetadata: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), RaiseIntentResultBridgeResponse: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentResultBridgeResponseMeta') }, @@ -4739,6 +4766,6 @@ const typeMap: any = { 'raiseIntentResponse', 'raiseIntentResultResponse', ], - Type: ['app', 'private', 'user'], ConnectionStepMessageType: ['authenticationFailed', 'connectedAgentsUpdate', 'handshake', 'hello'], + Type: ['app', 'private', 'user'], }; From 7fcdc16262056e04e24b7e6aa4e2e214dccb88bd Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 15:12:34 +0100 Subject: [PATCH 068/106] Adding separate schemas for error responses in order to provide precise types for standard and error responses --- .../bridging/agentErrorResponse.schema.json | 40 + schemas/bridging/common.schema.json | 11 +- ...indInstancesAgentErrorResponse.schema.json | 47 + .../findIntentAgentErrorResponse.schema.json | 47 + ...ntsByContextAgentErrorResponse.schema.json | 47 + ...tAppMetadataAgentErrorResponse.schema.json | 47 + .../openAgentErrorResponse.schema.json | 47 + .../raiseIntentAgentErrorResponse.schema.json | 47 + ...IntentResultAgentErrorResponse.schema.json | 47 + src/bridging/BridgingTypes.ts | 918 +++++++++++++++--- 10 files changed, 1176 insertions(+), 122 deletions(-) create mode 100644 schemas/bridging/agentErrorResponse.schema.json create mode 100644 schemas/bridging/findInstancesAgentErrorResponse.schema.json create mode 100644 schemas/bridging/findIntentAgentErrorResponse.schema.json create mode 100644 schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json create mode 100644 schemas/bridging/getAppMetadataAgentErrorResponse.schema.json create mode 100644 schemas/bridging/openAgentErrorResponse.schema.json create mode 100644 schemas/bridging/raiseIntentAgentErrorResponse.schema.json create mode 100644 schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json diff --git a/schemas/bridging/agentErrorResponse.schema.json b/schemas/bridging/agentErrorResponse.schema.json new file mode 100644 index 000000000..75a0051c8 --- /dev/null +++ b/schemas/bridging/agentErrorResponse.schema.json @@ -0,0 +1,40 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/agentErrorResponse.schema.json", + "title": "Agent Error Response Message", + "type": "object", + "description": "A response message from a Desktop Agent to the Bridge containing an error, to be used in preference to the standard response when an error needs to be returned.", + "properties": { + "type": { + "title": "Response Message Type", + "type": "string", + "enum": [ + "findInstancesResponse", + "findIntentResponse", + "findIntentsByContextResponse", + "getAppMetadataResponse", + "openResponse", + "raiseIntentResponse", + "raiseIntentResultResponse" + ], + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "title": "Error Response Message Payload", + "type": "object", + "description": "Error message payload containing an standardized error string.", + "properties": { + "error": { + "$ref": "common.schema.json#/$defs/ErrorMessages" + } + }, + "unevaluatedProperties": false, + "required": ["error"] + }, + "meta": { + "$ref": "agentResponse.schema.json#/$defs/AgentResponseMeta" + } + }, + "additionalProperties": false, + "required": ["type", "payload", "meta"] +} diff --git a/schemas/bridging/common.schema.json b/schemas/bridging/common.schema.json index 1044c969b..06854c600 100644 --- a/schemas/bridging/common.schema.json +++ b/schemas/bridging/common.schema.json @@ -97,11 +97,20 @@ ], "description": "Array of DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." }, + "ErrorMessages": { + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ChannelError" }, + { "$ref": "../api/api.schema.json#/definitions/OpenError" }, + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/ResultError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + }, "ResponseErrorDetails": { "title": "Response Error Details", "type": "array", "items": { - "type": "string" + "$ref": "#/$defs/ErrorMessages" }, "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." } diff --git a/schemas/bridging/findInstancesAgentErrorResponse.schema.json b/schemas/bridging/findInstancesAgentErrorResponse.schema.json new file mode 100644 index 000000000..798840f59 --- /dev/null +++ b/schemas/bridging/findInstancesAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json", + "title": "FindInstances Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/FindInstancesErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "FindInstancesErrorResponseBase": { + "title": "FindInstances Error Response", + "type": "object", + "description": "A response to a findInstances request that contains an error.", + "properties": { + "type": { + "title": "FindInstances Response Message Type", + "const": "findInstancesResponse" + }, + "payload": { + "title": "FindInstances Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "FindInstances Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "FindInstances Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/findIntentAgentErrorResponse.schema.json b/schemas/bridging/findIntentAgentErrorResponse.schema.json new file mode 100644 index 000000000..b8d89cd9b --- /dev/null +++ b/schemas/bridging/findIntentAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentErrorResponse.schema.json", + "title": "FindIntent Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/FindIntentErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "FindIntentErrorResponseBase": { + "title": "FindIntent Error Response", + "type": "object", + "description": "A response to a findIntent request that contains an error.", + "properties": { + "type": { + "title": "FindIntent Response Message Type", + "const": "findIntentResponse" + }, + "payload": { + "title": "FindIntent Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "FindIntent Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "FindIntent Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json b/schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json new file mode 100644 index 000000000..0bd1646c5 --- /dev/null +++ b/schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json", + "title": "FindIntentsByContext Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/FindIntentsByContextErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "FindIntentsByContextErrorResponseBase": { + "title": "FindIntentsByContext Error Response", + "type": "object", + "description": "A response to a findIntentsByContext request that contains an error.", + "properties": { + "type": { + "title": "FindIntentsByContext Response Message Type", + "const": "findIntentsByContextResponse" + }, + "payload": { + "title": "FindIntentsByContext Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "FindIntentsByContext Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "additionalProperties": false, + "required": ["error"] + }, + "meta": { + "title": "FindIntentsByContext Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/getAppMetadataAgentErrorResponse.schema.json b/schemas/bridging/getAppMetadataAgentErrorResponse.schema.json new file mode 100644 index 000000000..57cad8b2c --- /dev/null +++ b/schemas/bridging/getAppMetadataAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json", + "title": "GetAppMetadata Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/GetAppMetadataErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "GetAppMetadataErrorResponseBase": { + "title": "GetAppMetadata Error Response", + "type": "object", + "description": "A response to a getAppMetadata request that contains an error.", + "properties": { + "type": { + "title": "GetAppMetadata Response Message Type", + "const": "getAppMetadataResponse" + }, + "payload": { + "title": "GetAppMetadata Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "GetAppMetadata Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "GetAppMetadata Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/openAgentErrorResponse.schema.json b/schemas/bridging/openAgentErrorResponse.schema.json new file mode 100644 index 000000000..6041edcb5 --- /dev/null +++ b/schemas/bridging/openAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentErrorResponse.schema.json", + "title": "Open Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/OpenErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "OpenErrorResponseBase": { + "title": "Open Error Response", + "type": "object", + "description": "A response to an open request that contains an error", + "properties": { + "type": { + "title": "Open Response Message Type", + "const": "openResponse" + }, + "payload": { + "title": "Open Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "Open Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/OpenError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "Open Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/raiseIntentAgentErrorResponse.schema.json b/schemas/bridging/raiseIntentAgentErrorResponse.schema.json new file mode 100644 index 000000000..c7dd9dcfb --- /dev/null +++ b/schemas/bridging/raiseIntentAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json", + "title": "RaiseIntent Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/RaiseIntentErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "RaiseIntentErrorResponseBase": { + "title": "RaiseIntent Error Response", + "type": "object", + "description": "A response to a request to raise an intent that contains an error.", + "properties": { + "type": { + "title": "RaiseIntent Response Message type", + "const": "raiseIntentResponse" + }, + "payload": { + "title": "RaiseIntent Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "RaiseIntent Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "RaiseIntent Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json b/schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json new file mode 100644 index 000000000..d2ec66e4f --- /dev/null +++ b/schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json", + "title": "RaiseIntent Result Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/RaiseIntentResultErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "RaiseIntentResultErrorResponseBase": { + "title": "RaiseIntent Result Error Response", + "type": "object", + "description": "A secondary response to a request to raise an intent used to deliver the intent result, which contains an error", + "properties": { + "type": { + "title": "RaiseIntent Result Response Message type", + "const": "raiseIntentResultResponse" + }, + "payload": { + "title": "RaiseIntent Result Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "RaiseIntent Result Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResultError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "RaiseIntent Result Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 3012a23ab..cacd5a739 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,9 +1,10 @@ // To parse this data: // -// import { Convert, BaseImplementationMetadata, AgentRequestMessage, AgentResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; +// import { Convert, BaseImplementationMetadata, AgentErrorResponseMessage, AgentRequestMessage, AgentResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentErrorResponse, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentAgentErrorResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentErrorResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentErrorResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentErrorResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentErrorResponse, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentErrorResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; // // const schemasAPIAPISchema = Convert.toSchemasAPIAPISchema(json); // const baseImplementationMetadata = Convert.toBaseImplementationMetadata(json); +// const agentErrorResponseMessage = Convert.toAgentErrorResponseMessage(json); // const agentRequestMessage = Convert.toAgentRequestMessage(json); // const agentResponseMessage = Convert.toAgentResponseMessage(json); // const bridgeRequestMessage = Convert.toBridgeRequestMessage(json); @@ -16,22 +17,27 @@ // const connectionStep3Handshake = Convert.toConnectionStep3Handshake(json); // const connectionStep4AuthenticationFailed = Convert.toConnectionStep4AuthenticationFailed(json); // const connectionStep6ConnectedAgentsUpdate = Convert.toConnectionStep6ConnectedAgentsUpdate(json); +// const findInstancesAgentErrorResponse = Convert.toFindInstancesAgentErrorResponse(json); // const findInstancesAgentRequest = Convert.toFindInstancesAgentRequest(json); // const findInstancesAgentResponse = Convert.toFindInstancesAgentResponse(json); // const findInstancesBridgeRequest = Convert.toFindInstancesBridgeRequest(json); // const findInstancesBridgeResponse = Convert.toFindInstancesBridgeResponse(json); +// const findIntentAgentErrorResponse = Convert.toFindIntentAgentErrorResponse(json); // const findIntentsAgentRequest = Convert.toFindIntentsAgentRequest(json); // const findIntentAgentResponse = Convert.toFindIntentAgentResponse(json); // const findIntentBridgeRequest = Convert.toFindIntentBridgeRequest(json); // const findIntentBridgeResponse = Convert.toFindIntentBridgeResponse(json); +// const findIntentsByContextAgentErrorResponse = Convert.toFindIntentsByContextAgentErrorResponse(json); // const findIntentsByContextAgentRequest = Convert.toFindIntentsByContextAgentRequest(json); // const findIntentsByContextAgentResponse = Convert.toFindIntentsByContextAgentResponse(json); // const findIntentsByContextBridgeRequest = Convert.toFindIntentsByContextBridgeRequest(json); // const findIntentsByContextBridgeResponse = Convert.toFindIntentsByContextBridgeResponse(json); +// const getAppMetadataAgentErrorResponse = Convert.toGetAppMetadataAgentErrorResponse(json); // const getAppMetadataAgentRequest = Convert.toGetAppMetadataAgentRequest(json); // const getAppMetadataAgentResponse = Convert.toGetAppMetadataAgentResponse(json); // const getAppMetadataBridgeRequest = Convert.toGetAppMetadataBridgeRequest(json); // const getAppMetadataBridgeResponse = Convert.toGetAppMetadataBridgeResponse(json); +// const openAgentErrorResponse = Convert.toOpenAgentErrorResponse(json); // const openAgentRequest = Convert.toOpenAgentRequest(json); // const openAgentResponse = Convert.toOpenAgentResponse(json); // const openBridgeRequest = Convert.toOpenBridgeRequest(json); @@ -48,10 +54,12 @@ // const privateChannelOnDisconnectBridgeRequest = Convert.toPrivateChannelOnDisconnectBridgeRequest(json); // const privateChannelOnUnsubscribeAgentRequest = Convert.toPrivateChannelOnUnsubscribeAgentRequest(json); // const privateChannelOnUnsubscribeBridgeRequest = Convert.toPrivateChannelOnUnsubscribeBridgeRequest(json); +// const raiseIntentAgentErrorResponse = Convert.toRaiseIntentAgentErrorResponse(json); // const raiseIntentAgentRequest = Convert.toRaiseIntentAgentRequest(json); // const raiseIntentAgentResponse = Convert.toRaiseIntentAgentResponse(json); // const raiseIntentBridgeRequest = Convert.toRaiseIntentBridgeRequest(json); // const raiseIntentBridgeResponse = Convert.toRaiseIntentBridgeResponse(json); +// const raiseIntentResultAgentErrorResponse = Convert.toRaiseIntentResultAgentErrorResponse(json); // const raiseIntentResultAgentResponse = Convert.toRaiseIntentResultAgentResponse(json); // const raiseIntentResultBridgeResponse = Convert.toRaiseIntentResultBridgeResponse(json); // const context = Convert.toContext(json); @@ -107,6 +115,123 @@ export interface BaseImplementationMetadataOptionalFeatures { UserChannelMembershipAPIs: boolean; } +/** + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface AgentErrorResponseMessage { + meta: AgentResponseMetadata; + /** + * Error message payload containing an standardized error string. + */ + payload: ErrorResponseMessagePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface AgentResponseMetadata { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + */ +export interface DesktopAgentIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface ErrorResponseMessagePayload { + error: ResponseErrorDetail; + [property: string]: any; +} + +/** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export enum ResponseErrorDetail { + AccessDenied = 'AccessDenied', + AgentDisconnected = 'AgentDisconnected', + AppNotFound = 'AppNotFound', + AppTimeout = 'AppTimeout', + CreationFailed = 'CreationFailed', + DesktopAgentNotFound = 'DesktopAgentNotFound', + ErrorOnLaunch = 'ErrorOnLaunch', + IntentDeliveryFailed = 'IntentDeliveryFailed', + IntentHandlerRejected = 'IntentHandlerRejected', + MalformedContext = 'MalformedContext', + NoAppsFound = 'NoAppsFound', + NoChannelFound = 'NoChannelFound', + NoResultReturned = 'NoResultReturned', + NotConnectedToBridge = 'NotConnectedToBridge', + ResolverTimeout = 'ResolverTimeout', + ResolverUnavailable = 'ResolverUnavailable', + ResponseToBridgeTimedOut = 'ResponseToBridgeTimedOut', + TargetAppUnavailable = 'TargetAppUnavailable', + TargetInstanceUnavailable = 'TargetInstanceUnavailable', + UserCancelledResolution = 'UserCancelledResolution', +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ +export enum ResponseMessageType { + FindInstancesResponse = 'findInstancesResponse', + FindIntentResponse = 'findIntentResponse', + FindIntentsByContextResponse = 'findIntentsByContextResponse', + GetAppMetadataResponse = 'getAppMetadataResponse', + OpenResponse = 'openResponse', + RaiseIntentResponse = 'raiseIntentResponse', + RaiseIntentResultResponse = 'raiseIntentResultResponse', +} + /** * A request message from a Desktop Agent to the Bridge. */ @@ -169,17 +294,17 @@ export interface AgentRequestMetadata { * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge * before the timeout or because an error occurred. May be omitted if all sources responded * without errors. MUST include the `desktopAgent` field when returned by the bridge. @@ -230,17 +355,17 @@ export interface BridgeParticipantIdentifier { * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge * before the timeout or because an error occurred. May be omitted if all sources responded * without errors. MUST include the `desktopAgent` field when returned by the bridge. @@ -307,63 +432,6 @@ export interface AgentResponseMessage { type: ResponseMessageType; } -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface AgentResponseMetadata { - requestUuid: string; - responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; - timestamp: Date; -} - -/** - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - */ -export interface DesktopAgentIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ -export enum ResponseMessageType { - FindInstancesResponse = 'findInstancesResponse', - FindIntentResponse = 'findIntentResponse', - FindIntentsByContextResponse = 'findIntentsByContextResponse', - GetAppMetadataResponse = 'getAppMetadataResponse', - OpenResponse = 'openResponse', - RaiseIntentResponse = 'raiseIntentResponse', - RaiseIntentResultResponse = 'raiseIntentResultResponse', -} - /** * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ @@ -420,7 +488,7 @@ export interface BridgeResponseMessage { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface BridgeResponseMetadata { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -479,17 +547,17 @@ export interface BroadcastAgentRequestMeta { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge * before the timeout or because an error occurred. May be omitted if all sources responded * without errors. MUST include the `desktopAgent` field when returned by the bridge. @@ -857,6 +925,73 @@ export interface ConnectionStep6ConnectedAgentsUpdatePayload { removeAgent?: string; } +/** + * A response to a findInstances request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface FindInstancesAgentErrorResponse { + meta: FindInstancesAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: FindInstancesAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindInstancesAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface FindInstancesAgentErrorResponsePayload { + error: ErrorMessage; +} + +/** + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + * + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + */ +export enum ErrorMessage { + AgentDisconnected = 'AgentDisconnected', + DesktopAgentNotFound = 'DesktopAgentNotFound', + IntentDeliveryFailed = 'IntentDeliveryFailed', + MalformedContext = 'MalformedContext', + NoAppsFound = 'NoAppsFound', + NotConnectedToBridge = 'NotConnectedToBridge', + ResolverTimeout = 'ResolverTimeout', + ResolverUnavailable = 'ResolverUnavailable', + ResponseToBridgeTimedOut = 'ResponseToBridgeTimedOut', + TargetAppUnavailable = 'TargetAppUnavailable', + TargetInstanceUnavailable = 'TargetInstanceUnavailable', + UserCancelledResolution = 'UserCancelledResolution', +} + /** * A request for details of instances of a particular app * @@ -895,17 +1030,17 @@ export interface FindInstancesAgentRequestMeta { } /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge * before the timeout or because an error occurred. May be omitted if all sources responded * without errors. MUST include the `desktopAgent` field when returned by the bridge. @@ -1214,7 +1349,7 @@ export interface FindInstancesBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface FindInstancesBridgeResponseMeta { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -1229,6 +1364,46 @@ export interface FindInstancesBridgeResponsePayload { appIdentifiers: AppMetadata[]; } +/** + * A response to a findIntent request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface FindIntentAgentErrorResponse { + meta: FindIntentAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: FindIntentAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface FindIntentAgentErrorResponsePayload { + error: ErrorMessage; +} + /** * A request for details of apps available to resolve a particular intent and context pair. * @@ -1411,7 +1586,7 @@ export interface FindIntentBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface FindIntentBridgeResponseMeta { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -1426,6 +1601,46 @@ export interface FindIntentBridgeResponsePayload { appIntent: AppIntent; } +/** + * A response to a findIntentsByContext request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface FindIntentsByContextAgentErrorResponse { + meta: FindIntentsByContextAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: FindIntentsByContextAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentsByContextAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface FindIntentsByContextAgentErrorResponsePayload { + error: ErrorMessage; +} + /** * A request for details of intents and apps available to resolve them for a particular * context. @@ -1578,7 +1793,7 @@ export interface FindIntentsByContextBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface FindIntentsByContextBridgeResponseMeta { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -1593,6 +1808,46 @@ export interface FindIntentsByContextBridgeResponsePayload { appIntents: AppIntent[]; } +/** + * A response to a getAppMetadata request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface GetAppMetadataAgentErrorResponse { + meta: GetAppMetadataAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: GetAppMetadataAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface GetAppMetadataAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface GetAppMetadataAgentErrorResponsePayload { + error: ErrorMessage; +} + /** * A request for metadata about an app * @@ -1743,7 +1998,7 @@ export interface GetAppMetadataBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface GetAppMetadataBridgeResponseMeta { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -1752,10 +2007,74 @@ export interface GetAppMetadataBridgeResponseMeta { } /** - * The message payload typically contains return values for FDC3 API functions. + * The message payload typically contains return values for FDC3 API functions. + */ +export interface GetAppMetadataBridgeResponsePayload { + appMetadata: AppMetadata; +} + +/** + * A response to an open request that contains an error + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface OpenAgentErrorResponse { + meta: OpenAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: OpenAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface OpenAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. */ -export interface GetAppMetadataBridgeResponsePayload { - appMetadata: AppMetadata; +export interface OpenAgentErrorResponsePayload { + error: OpenErrorMessage; +} + +/** + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export enum OpenErrorMessage { + AgentDisconnected = 'AgentDisconnected', + AppNotFound = 'AppNotFound', + AppTimeout = 'AppTimeout', + DesktopAgentNotFound = 'DesktopAgentNotFound', + ErrorOnLaunch = 'ErrorOnLaunch', + MalformedContext = 'MalformedContext', + NotConnectedToBridge = 'NotConnectedToBridge', + ResolverUnavailable = 'ResolverUnavailable', + ResponseToBridgeTimedOut = 'ResponseToBridgeTimedOut', } /** @@ -1910,7 +2229,7 @@ export interface OpenBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface OpenBridgeResponseMeta { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -1989,17 +2308,17 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge * before the timeout or because an error occurred. May be omitted if all sources responded * without errors. MUST include the `desktopAgent` field when returned by the bridge. @@ -2543,6 +2862,46 @@ export interface PrivateChannelOnUnsubscribeBridgeRequestPayload { contextType: string; } +/** + * A response to a request to raise an intent that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface RaiseIntentAgentErrorResponse { + meta: RaiseIntentAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: RaiseIntentAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface RaiseIntentAgentErrorResponsePayload { + error: ErrorMessage; +} + /** * A request to raise an intent. * @@ -2741,7 +3100,7 @@ export interface RaiseIntentBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface RaiseIntentBridgeResponseMeta { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -2756,6 +3115,67 @@ export interface RaiseIntentBridgeResponsePayload { intentResolution: IntentResolution; } +/** + * A secondary response to a request to raise an intent used to deliver the intent result, + * which contains an error + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface RaiseIntentResultAgentErrorResponse { + meta: RaiseIntentResultAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: RaiseIntentResultAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentResultAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + */ + source: DesktopAgentIdentifier; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface RaiseIntentResultAgentErrorResponsePayload { + error: RaiseIntentResultErrorMessage; +} + +/** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export enum RaiseIntentResultErrorMessage { + AgentDisconnected = 'AgentDisconnected', + IntentHandlerRejected = 'IntentHandlerRejected', + NoResultReturned = 'NoResultReturned', + NotConnectedToBridge = 'NotConnectedToBridge', + ResponseToBridgeTimedOut = 'ResponseToBridgeTimedOut', +} + /** * A secondary response to a request to raise an intent used to deliver the intent result * @@ -2892,7 +3312,7 @@ export interface RaiseIntentResultBridgeResponse { * Metadata required in a response message collated and/or forwarded on by the Bridge */ export interface RaiseIntentResultBridgeResponseMeta { - errorDetails?: string[]; + errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; responseUuid: string; @@ -2933,6 +3353,14 @@ export class Convert { return JSON.stringify(uncast(value, r('BaseImplementationMetadata')), null, 2); } + public static toAgentErrorResponseMessage(json: string): AgentErrorResponseMessage { + return cast(JSON.parse(json), r('AgentErrorResponseMessage')); + } + + public static agentErrorResponseMessageToJson(value: AgentErrorResponseMessage): string { + return JSON.stringify(uncast(value, r('AgentErrorResponseMessage')), null, 2); + } + public static toAgentRequestMessage(json: string): AgentRequestMessage { return cast(JSON.parse(json), r('AgentRequestMessage')); } @@ -3029,6 +3457,14 @@ export class Convert { return JSON.stringify(uncast(value, r('ConnectionStep6ConnectedAgentsUpdate')), null, 2); } + public static toFindInstancesAgentErrorResponse(json: string): FindInstancesAgentErrorResponse { + return cast(JSON.parse(json), r('FindInstancesAgentErrorResponse')); + } + + public static findInstancesAgentErrorResponseToJson(value: FindInstancesAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesAgentErrorResponse')), null, 2); + } + public static toFindInstancesAgentRequest(json: string): FindInstancesAgentRequest { return cast(JSON.parse(json), r('FindInstancesAgentRequest')); } @@ -3061,6 +3497,14 @@ export class Convert { return JSON.stringify(uncast(value, r('FindInstancesBridgeResponse')), null, 2); } + public static toFindIntentAgentErrorResponse(json: string): FindIntentAgentErrorResponse { + return cast(JSON.parse(json), r('FindIntentAgentErrorResponse')); + } + + public static findIntentAgentErrorResponseToJson(value: FindIntentAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentAgentErrorResponse')), null, 2); + } + public static toFindIntentsAgentRequest(json: string): FindIntentsAgentRequest { return cast(JSON.parse(json), r('FindIntentsAgentRequest')); } @@ -3093,6 +3537,14 @@ export class Convert { return JSON.stringify(uncast(value, r('FindIntentBridgeResponse')), null, 2); } + public static toFindIntentsByContextAgentErrorResponse(json: string): FindIntentsByContextAgentErrorResponse { + return cast(JSON.parse(json), r('FindIntentsByContextAgentErrorResponse')); + } + + public static findIntentsByContextAgentErrorResponseToJson(value: FindIntentsByContextAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextAgentErrorResponse')), null, 2); + } + public static toFindIntentsByContextAgentRequest(json: string): FindIntentsByContextAgentRequest { return cast(JSON.parse(json), r('FindIntentsByContextAgentRequest')); } @@ -3125,6 +3577,14 @@ export class Convert { return JSON.stringify(uncast(value, r('FindIntentsByContextBridgeResponse')), null, 2); } + public static toGetAppMetadataAgentErrorResponse(json: string): GetAppMetadataAgentErrorResponse { + return cast(JSON.parse(json), r('GetAppMetadataAgentErrorResponse')); + } + + public static getAppMetadataAgentErrorResponseToJson(value: GetAppMetadataAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataAgentErrorResponse')), null, 2); + } + public static toGetAppMetadataAgentRequest(json: string): GetAppMetadataAgentRequest { return cast(JSON.parse(json), r('GetAppMetadataAgentRequest')); } @@ -3157,6 +3617,14 @@ export class Convert { return JSON.stringify(uncast(value, r('GetAppMetadataBridgeResponse')), null, 2); } + public static toOpenAgentErrorResponse(json: string): OpenAgentErrorResponse { + return cast(JSON.parse(json), r('OpenAgentErrorResponse')); + } + + public static openAgentErrorResponseToJson(value: OpenAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('OpenAgentErrorResponse')), null, 2); + } + public static toOpenAgentRequest(json: string): OpenAgentRequest { return cast(JSON.parse(json), r('OpenAgentRequest')); } @@ -3311,6 +3779,14 @@ export class Convert { return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribeBridgeRequest')), null, 2); } + public static toRaiseIntentAgentErrorResponse(json: string): RaiseIntentAgentErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentAgentErrorResponse')); + } + + public static raiseIntentAgentErrorResponseToJson(value: RaiseIntentAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentAgentErrorResponse')), null, 2); + } + public static toRaiseIntentAgentRequest(json: string): RaiseIntentAgentRequest { return cast(JSON.parse(json), r('RaiseIntentAgentRequest')); } @@ -3343,6 +3819,14 @@ export class Convert { return JSON.stringify(uncast(value, r('RaiseIntentBridgeResponse')), null, 2); } + public static toRaiseIntentResultAgentErrorResponse(json: string): RaiseIntentResultAgentErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentResultAgentErrorResponse')); + } + + public static raiseIntentResultAgentErrorResponseToJson(value: RaiseIntentResultAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultAgentErrorResponse')), null, 2); + } + public static toRaiseIntentResultAgentResponse(json: string): RaiseIntentResultAgentResponse { return cast(JSON.parse(json), r('RaiseIntentResultAgentResponse')); } @@ -3552,6 +4036,25 @@ const typeMap: any = { ], false ), + AgentErrorResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('ErrorResponseMessagePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + AgentResponseMetadata: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), + ErrorResponseMessagePayload: o([{ json: 'error', js: 'error', typ: r('ResponseErrorDetail') }], 'any'), AgentRequestMessage: o( [ { json: 'meta', js: 'meta', typ: r('AgentRequestMetadata') }, @@ -3593,16 +4096,6 @@ const typeMap: any = { ], false ), - AgentResponseMetadata: o( - [ - { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, - { json: 'timestamp', js: 'timestamp', typ: Date }, - ], - false - ), - DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), BridgeRequestMessage: o( [ { json: 'meta', js: 'meta', typ: r('BridgeRequestMetadata') }, @@ -3630,7 +4123,7 @@ const typeMap: any = { ), BridgeResponseMetadata: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -3818,6 +4311,24 @@ const typeMap: any = { ], false ), + FindInstancesAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + FindInstancesAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindInstancesAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), FindInstancesAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindInstancesAgentRequestMeta') }, @@ -3928,7 +4439,7 @@ const typeMap: any = { ), FindInstancesBridgeResponseMeta: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -3941,6 +4452,24 @@ const typeMap: any = { [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadata')) }], false ), + FindIntentAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + FindIntentAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), FindIntentsAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindIntentsAgentRequestMeta') }, @@ -4031,7 +4560,7 @@ const typeMap: any = { ), FindIntentBridgeResponseMeta: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -4041,6 +4570,24 @@ const typeMap: any = { false ), FindIntentBridgeResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntent') }], false), + FindIntentsByContextAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + FindIntentsByContextAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsByContextAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), FindIntentsByContextAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentRequestMeta') }, @@ -4108,7 +4655,7 @@ const typeMap: any = { ), FindIntentsByContextBridgeResponseMeta: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -4121,6 +4668,24 @@ const typeMap: any = { [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntent')) }], false ), + GetAppMetadataAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + GetAppMetadataAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), GetAppMetadataAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentRequestMeta') }, @@ -4185,7 +4750,7 @@ const typeMap: any = { ), GetAppMetadataBridgeResponseMeta: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -4195,6 +4760,24 @@ const typeMap: any = { false ), GetAppMetadataBridgeResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadata') }], false), + OpenAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + OpenAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('OpenErrorMessage') }], false), OpenAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('OpenAgentRequestMeta') }, @@ -4271,7 +4854,7 @@ const typeMap: any = { ), OpenBridgeResponseMeta: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -4565,6 +5148,24 @@ const typeMap: any = { ], false ), + RaiseIntentAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + RaiseIntentAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), RaiseIntentAgentRequest: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentRequestMeta') }, @@ -4654,7 +5255,7 @@ const typeMap: any = { ), RaiseIntentBridgeResponseMeta: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -4667,6 +5268,27 @@ const typeMap: any = { [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolution') }], false ), + RaiseIntentResultAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + RaiseIntentResultAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentResultAgentErrorResponsePayload: o( + [{ json: 'error', js: 'error', typ: r('RaiseIntentResultErrorMessage') }], + false + ), RaiseIntentResultAgentResponse: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentResultAgentResponseMeta') }, @@ -4721,7 +5343,7 @@ const typeMap: any = { ), RaiseIntentResultBridgeResponseMeta: o( [ - { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a('')) }, + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, @@ -4742,6 +5364,37 @@ const typeMap: any = { ], 'any' ), + ResponseErrorDetail: [ + 'AccessDenied', + 'AgentDisconnected', + 'AppNotFound', + 'AppTimeout', + 'CreationFailed', + 'DesktopAgentNotFound', + 'ErrorOnLaunch', + 'IntentDeliveryFailed', + 'IntentHandlerRejected', + 'MalformedContext', + 'NoAppsFound', + 'NoChannelFound', + 'NoResultReturned', + 'NotConnectedToBridge', + 'ResolverTimeout', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + 'TargetAppUnavailable', + 'TargetInstanceUnavailable', + 'UserCancelledResolution', + ], + ResponseMessageType: [ + 'findInstancesResponse', + 'findIntentResponse', + 'findIntentsByContextResponse', + 'getAppMetadataResponse', + 'openResponse', + 'raiseIntentResponse', + 'raiseIntentResultResponse', + ], RequestMessageType: [ 'broadcastRequest', 'findInstancesRequest', @@ -4757,15 +5410,38 @@ const typeMap: any = { 'raiseIntentRequest', 'raiseIntentResultResponse', ], - ResponseMessageType: [ - 'findInstancesResponse', - 'findIntentResponse', - 'findIntentsByContextResponse', - 'getAppMetadataResponse', - 'openResponse', - 'raiseIntentResponse', - 'raiseIntentResultResponse', - ], ConnectionStepMessageType: ['authenticationFailed', 'connectedAgentsUpdate', 'handshake', 'hello'], + ErrorMessage: [ + 'AgentDisconnected', + 'DesktopAgentNotFound', + 'IntentDeliveryFailed', + 'MalformedContext', + 'NoAppsFound', + 'NotConnectedToBridge', + 'ResolverTimeout', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + 'TargetAppUnavailable', + 'TargetInstanceUnavailable', + 'UserCancelledResolution', + ], + OpenErrorMessage: [ + 'AgentDisconnected', + 'AppNotFound', + 'AppTimeout', + 'DesktopAgentNotFound', + 'ErrorOnLaunch', + 'MalformedContext', + 'NotConnectedToBridge', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + ], + RaiseIntentResultErrorMessage: [ + 'AgentDisconnected', + 'IntentHandlerRejected', + 'NoResultReturned', + 'NotConnectedToBridge', + 'ResponseToBridgeTimedOut', + ], Type: ['app', 'private', 'user'], }; From ee09ec220e97a47d6e6c8aef414c2169d333fcde Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 15:12:56 +0100 Subject: [PATCH 069/106] Adding updated async API schema for bridging --- schemas/bridgingAsyncAPI/README.md | 38 ++ .../bridgingAsyncAPI/bridgingAsyncAPI.json | 351 ++++++++++++++++++ 2 files changed, 389 insertions(+) create mode 100644 schemas/bridgingAsyncAPI/README.md create mode 100644 schemas/bridgingAsyncAPI/bridgingAsyncAPI.json diff --git a/schemas/bridgingAsyncAPI/README.md b/schemas/bridgingAsyncAPI/README.md new file mode 100644 index 000000000..f097af5b5 --- /dev/null +++ b/schemas/bridgingAsyncAPI/README.md @@ -0,0 +1,38 @@ +# Agent Bridging AsyncAPI schema + +This folder contains an AsyncAPI schema that may be used to generate clients and server stubs for Desktop Agent Bridging. It is based on references to the JSON schema files that define the various messages in the adjacent schemas/bridging folder. + +Example commands to generate code from the AsyncAPI schema: +(run from the root of your FDC3 checkout) + +First run: + +```ps +npm install -g @asyncapi/generator +``` + +Then: + +- .NET + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/dotnet-nats-template -o ../some/path/outside/FDC3/folder + ``` + +- Node.js + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/nodejs-ws-template -o ../some/path/outside/FDC3/folder -p server=local + ``` + +- Markdown + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/markdown-template -o ../some/path/outside/FDC3/folder + ``` + +- HTML + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/html-template -o ../some/path/outside/FDC3/folder + ``` diff --git a/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json b/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json new file mode 100644 index 000000000..86e100bb9 --- /dev/null +++ b/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @@ -0,0 +1,351 @@ +{ + "asyncapi": "2.6.0", + "info": { + "title": "Desktop Agent Bridge", + "version": "1.0.0", + "description": "API for an FDC3 Desktop Agent to communicate with an FDC3 Desktop Agent Bridge and through it, other Desktop Agents.", + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + }, + "servers": { + "local": { + "url": "ws://localhost:4475", + "description": "Desktop agent bridge server exposing websocket connection", + "protocol": "ws" + } + }, + "defaultContentType": "application/json", + "channels": { + "/": { + "publish": { + "message": { + "oneOf": [ + { + "$ref": "#/components/messages/broadcastRequest-Agent" + }, + { + "$ref": "#/components/messages/handshake" + }, + { + "$ref": "#/components/messages/findInstancesRequest-Agent" + }, + { + "$ref": "#/components/messages/findInstancesResponse-Agent" + }, + { + "$ref": "#/components/messages/findInstancesErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentRequest-Agent" + }, + { + "$ref": "#/components/messages/findIntentResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentsByContextRequest-Agent" + }, + { + "$ref": "#/components/messages/findIntentsByContextResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentsByContextErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/getAppMetadataRequest-Agent" + }, + { + "$ref": "#/components/messages/getAppMetadataResponse-Agent" + }, + { + "$ref": "#/components/messages/getAppMetadataErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/openRequest-Agent" + }, + { + "$ref": "#/components/messages/openResponse-Agent" + }, + { + "$ref": "#/components/messages/openErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentRequest-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentResponse-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/privateChannelBroadcast-Agent" + }, + { + "$ref": "#/components/messages/privateChannelEventListenerAdded-Agent" + }, + { + "$ref": "#/components/messages/privateChannelEventListenerRemoved-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnAddContextListener-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnDisconnect-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnUnsubscribe-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnDisconnect-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentResultResponse-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentResultErrorResponse-Agent" + } + ] + }, + "description": "Messages sent by desktop agent to bridge", + "operationId": "Send" + }, + "subscribe": { + "message": { + "oneOf": [ + { + "$ref": "#/components/messages/hello" + }, + { + "$ref": "#/components/messages/authenticationFailed" + }, + { + "$ref": "#/components/messages/connectedAgentsUpdate" + }, + { + "$ref": "#/components/messages/findInstancesResponse-Bridge" + }, + { + "$ref": "#/components/messages/findIntentResponse-Bridge" + }, + { + "$ref": "#/components/messages/findIntentsByContextResponse-Bridge" + }, + { + "$ref": "#/components/messages/raiseIntentResponse-Bridge" + }, + { + "$ref": "#/components/messages/raiseIntentResultResponse-Bridge" + }, + { + "$ref": "#/components/messages/openResponse-Bridge" + }, + { + "$ref": "#/components/messages/getAppMetadataResponse-Bridge" + } + ] + }, + "description": "Messages sent by bridge to desktop agent", + "operationId": "Receive" + } + } + }, + "components": { + "messages": { + "broadcastRequest-Agent": { + "payload": { + "$ref": "../bridging/broadcastAgentRequest.schema.json#" + } + }, + "hello": { + "payload": { + "$ref": "../bridging/connectionStep2Hello.schema.json#" + } + }, + "handshake": { + "payload": { + "$ref": "../bridging/connectionStep3Handshake.schema.json#" + } + }, + "authenticationFailed": { + "payload": { + "$ref": "../bridging/connectionStep4AuthenticationFailed.schema.json#" + } + }, + "connectedAgentsUpdate": { + "payload": { + "$ref": "../bridging/connectionStep6ConnectedAgentsUpdate.schema.json#" + } + }, + "findInstancesRequest-Agent": { + "payload": { + "$ref": "../bridging/findInstancesAgentRequest.schema.json#" + } + }, + "findInstancesResponse-Agent": { + "payload": { + "$ref": "../bridging/findInstancesAgentResponse.schema.json#" + } + }, + "findInstancesErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/findInstancesAgentErrorResponse.schema.json#" + } + }, + "findInstancesResponse-Bridge": { + "payload": { + "$ref": "../bridging/findInstancesBridgeResponse.schema.json#" + } + }, + "findIntentRequest-Agent": { + "payload": { + "$ref": "../bridging/findIntentAgentRequest.schema.json#" + } + }, + "findIntentResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentAgentResponse.schema.json#" + } + }, + "findIntentErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentAgentErrorResponse.schema.json#" + } + }, + "findIntentResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentBridgeResponse.schema.json#" + } + }, + "findIntentsByContextRequest-Agent": { + "payload": { + "$ref": "../bridging/findIntentsByContextAgentRequest.schema.json#" + } + }, + "findIntentsByContextResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentsByContextAgentResponse.schema.json#" + } + }, + "findIntentsByContextErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentsByContextAgentErrorResponse.schema.json#" + } + }, + "findIntentsByContextResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentsByContextBridgeResponse.schema.json#" + } + }, + "getAppMetadataRequest-Agent": { + "payload": { + "$ref": "../bridging/getAppMetadataAgentRequest.schema.json#" + } + }, + "getAppMetadataResponse-Agent": { + "payload": { + "$ref": "../bridging/getAppMetadataAgentResponse.schema.json#" + } + }, + "getAppMetadataErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/getAppMetadataAgentErrorResponse.schema.json#" + } + }, + "getAppMetadataResponse-Bridge": { + "payload": { + "$ref": "../bridging/getAppMetadataBridgeResponse.schema.json#" + } + }, + "openRequest-Agent": { + "payload": { + "$ref": "../bridging/openAgentRequest.schema.json#" + } + }, + "openResponse-Agent": { + "payload": { + "$ref": "../bridging/openAgentResponse.schema.json#" + } + }, + "openErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/openAgentErrorResponse.schema.json#" + } + }, + "openResponse-Bridge": { + "payload": { + "$ref": "../bridging/openBridgeResponse.schema.json#" + } + }, + "privateChannelBroadcast-Agent": { + "payload": { + "$ref": "../bridging/privateChannelBroadcastAgentRequest.schema.json#" + } + }, + "privateChannelEventListenerAdded-Agent": { + "payload": { + "$ref": "../bridging/privateChannelEventListenerAddedAgentRequest.schema.json#" + } + }, + "privateChannelEventListenerRemoved-Agent": { + "payload": { + "$ref": "../bridging/privateChannelEventListenerRemovedAgentRequest.schema.json#" + } + }, + "privateChannelOnAddContextListener-Agent": { + "payload": { + "$ref": "../bridging/privateChannelOnAddContextListenerAgentRequest.schema.json#" + } + }, + "privateChannelOnDisconnect-Agent": { + "payload": { + "$ref": "../bridging/privateChannelOnDisconnectAgentRequest.schema.json#" + } + }, + "privateChannelOnUnsubscribe-Agent": { + "payload": { + "$ref": "../bridging/privateChannelOnUnsubscribeAgentRequest.schema.json#" + } + }, + "raiseIntentRequest-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentAgentRequest.schema.json#" + } + }, + "raiseIntentResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentAgentResponse.schema.json#" + } + }, + "raiseIntentErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentAgentErrorResponse.schema.json#" + } + }, + "raiseIntentResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentBridgeResponse.schema.json#" + } + }, + "raiseIntentResultResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentResultAgentResponse.schema.json#" + } + }, + "raiseIntentResultErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentResultAgentErrorResponse.schema.json#" + } + }, + "raiseIntentResultResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentResultBridgeResponse.schema.json#" + } + } + } + } +} \ No newline at end of file From 066e2683378887d0f4b0b5a737f5d5e95939f021 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 15:16:05 +0100 Subject: [PATCH 070/106] minor tweaks to aysnc API comments + sorting messages --- schemas/bridgingAsyncAPI/bridgingAsyncAPI.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json b/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json index 86e100bb9..3910c4b71 100644 --- a/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json +++ b/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @@ -111,7 +111,7 @@ } ] }, - "description": "Messages sent by desktop agent to bridge", + "description": "Messages sent by A Desktop Agent to a Bridge", "operationId": "Send" }, "subscribe": { @@ -136,20 +136,20 @@ "$ref": "#/components/messages/findIntentsByContextResponse-Bridge" }, { - "$ref": "#/components/messages/raiseIntentResponse-Bridge" + "$ref": "#/components/messages/getAppMetadataResponse-Bridge" }, { - "$ref": "#/components/messages/raiseIntentResultResponse-Bridge" + "$ref": "#/components/messages/openResponse-Bridge" }, { - "$ref": "#/components/messages/openResponse-Bridge" + "$ref": "#/components/messages/raiseIntentResponse-Bridge" }, { - "$ref": "#/components/messages/getAppMetadataResponse-Bridge" + "$ref": "#/components/messages/raiseIntentResultResponse-Bridge" } ] }, - "description": "Messages sent by bridge to desktop agent", + "description": "Messages sent by a Bridge to a Desktop Agent", "operationId": "Receive" } } From e7f310fa2a3916cdc14af145721e18b3112d7096 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 15:36:41 +0100 Subject: [PATCH 071/106] Adding agent error response schema links to docs --- docs/agent-bridging/ref/findInstances.md | 1 + docs/agent-bridging/ref/findIntent.md | 1 + docs/agent-bridging/ref/findIntentsByContext.md | 1 + docs/agent-bridging/ref/getAppMetadata.md | 1 + docs/agent-bridging/ref/open.md | 1 + docs/agent-bridging/ref/raiseIntent.md | 2 ++ docs/agent-bridging/spec.md | 7 ++++++- 7 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/agent-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md index d229bab17..9d44a96f1 100644 --- a/docs/agent-bridging/ref/findInstances.md +++ b/docs/agent-bridging/ref/findInstances.md @@ -121,6 +121,7 @@ The Desktop Agent Bridge should only forward the request to the requested Deskto ### Response message schemas - [https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json](/schemas/next/bridging/findInstancesAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json](/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json](/schemas/next/bridging/findInstancesBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/findIntent.md b/docs/agent-bridging/ref/findIntent.md index 448360713..0f1386128 100644 --- a/docs/agent-bridging/ref/findIntent.md +++ b/docs/agent-bridging/ref/findIntent.md @@ -92,6 +92,7 @@ Note that the `source.desktopAgent` field has been populated with the id of the ### Response message schemas - [https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json](/schemas/next/bridging/findIntentAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentAgentErrorResponse.schema.json](/schemas/next/bridging/findIntentAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json](/schemas/next/bridging/findIntentBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/findIntentsByContext.md b/docs/agent-bridging/ref/findIntentsByContext.md index 0cb327b1d..0220e1ee9 100644 --- a/docs/agent-bridging/ref/findIntentsByContext.md +++ b/docs/agent-bridging/ref/findIntentsByContext.md @@ -92,6 +92,7 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the ### Response message schemas - [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json](/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json](/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json](/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index b65f7bfcc..d25369208 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -94,6 +94,7 @@ which is repeated on to the target agent as: ### Response message schemas - [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json](/schemas/next/bridging/getAppMetadataAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json](/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json](/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/open.md b/docs/agent-bridging/ref/open.md index 024a42d7b..4003c69bc 100644 --- a/docs/agent-bridging/ref/open.md +++ b/docs/agent-bridging/ref/open.md @@ -113,6 +113,7 @@ which is repeated on to the target agent as: ### Response message schemas - [https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json](/schemas/next/bridging/openAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/openAgentErrorResponse.schema.json](/schemas/next/bridging/openAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json](/schemas/next/bridging/openBridgeResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index 1124724f9..f57250e48 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -138,7 +138,9 @@ The bridge fills in the `source.desktopAgent` field and forwards the request to ### Response message schemas - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentResponse.schema.json](/schemas/next/bridging/raiseIntentAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json](/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json](/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json](/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json](/schemas/next/bridging/raiseIntentBridgeResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json](/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 4850e6805..a2450036d 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -575,9 +575,14 @@ Response messages from a Desktop Agent back to the Bridge use a similar format t } ``` -**Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentResponse.schema.json](/schemas/next/bridging/agentResponse.schema.json) +**Response Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentResponse.schema.json](/schemas/next/bridging/agentResponse.schema.json) +**Error Response Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentErrorResponse.schema.json](/schemas/next/bridging/agentErrorResponse.schema.json) + + +:::info Response messages do not include a `meta.destination` as the routing of responses is handled by the Bridge via the `meta.requestUuid` field. +::: ##### Response Messages Collated and Forwarded by the Bridge From 10fd7949779243255529535db3e3b64f29b8d237 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 17:52:43 +0100 Subject: [PATCH 072/106] Adding error responses from bridge for cases where all agents errored --- docs/agent-bridging/ref/findInstances.md | 1 + docs/agent-bridging/ref/findIntent.md | 1 + .../ref/findIntentsByContext.md | 1 + docs/agent-bridging/ref/getAppMetadata.md | 1 + docs/agent-bridging/ref/open.md | 1 + docs/agent-bridging/ref/raiseIntent.md | 2 + docs/agent-bridging/spec.md | 97 +++- .../bridging/bridgeErrorResponse.schema.json | 55 ++ ...ndInstancesBridgeErrorResponse.schema.json | 14 + .../findIntentBridgeErrorResponse.schema.json | 15 + ...tsByContextBridgeErrorResponse.schema.json | 14 + ...AppMetadataBridgeErrorResponse.schema.json | 14 + .../openBridgeErrorResponse.schema.json | 14 + ...raiseIntentBridgeErrorResponse.schema.json | 14 + ...ntentResultBridgeErrorResponse.schema.json | 14 + .../bridgingAsyncAPI/bridgingAsyncAPI.json | 60 +- src/bridging/BridgingTypes.ts | 549 +++++++++++++++++- 17 files changed, 847 insertions(+), 20 deletions(-) create mode 100644 schemas/bridging/bridgeErrorResponse.schema.json create mode 100644 schemas/bridging/findInstancesBridgeErrorResponse.schema.json create mode 100644 schemas/bridging/findIntentBridgeErrorResponse.schema.json create mode 100644 schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json create mode 100644 schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json create mode 100644 schemas/bridging/openBridgeErrorResponse.schema.json create mode 100644 schemas/bridging/raiseIntentBridgeErrorResponse.schema.json create mode 100644 schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json diff --git a/docs/agent-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md index 9d44a96f1..7cf0cc2e5 100644 --- a/docs/agent-bridging/ref/findInstances.md +++ b/docs/agent-bridging/ref/findInstances.md @@ -123,6 +123,7 @@ The Desktop Agent Bridge should only forward the request to the requested Deskto - [https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json](/schemas/next/bridging/findInstancesAgentResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json](/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json](/schemas/next/bridging/findInstancesBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json](/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/findIntent.md b/docs/agent-bridging/ref/findIntent.md index 0f1386128..846873b97 100644 --- a/docs/agent-bridging/ref/findIntent.md +++ b/docs/agent-bridging/ref/findIntent.md @@ -94,6 +94,7 @@ Note that the `source.desktopAgent` field has been populated with the id of the - [https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json](/schemas/next/bridging/findIntentAgentResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findIntentAgentErrorResponse.schema.json](/schemas/next/bridging/findIntentAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json](/schemas/next/bridging/findIntentBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json](/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/findIntentsByContext.md b/docs/agent-bridging/ref/findIntentsByContext.md index 0220e1ee9..61e74352c 100644 --- a/docs/agent-bridging/ref/findIntentsByContext.md +++ b/docs/agent-bridging/ref/findIntentsByContext.md @@ -94,6 +94,7 @@ The DAB fills in the `source.desktopAgent` field and forwards the request to the - [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json](/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json](/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json](/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json](/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index d25369208..33848012f 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -96,6 +96,7 @@ which is repeated on to the target agent as: - [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json](/schemas/next/bridging/getAppMetadataAgentResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json](/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json](/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json](/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/open.md b/docs/agent-bridging/ref/open.md index 4003c69bc..32c40b8f9 100644 --- a/docs/agent-bridging/ref/open.md +++ b/docs/agent-bridging/ref/open.md @@ -115,6 +115,7 @@ which is repeated on to the target agent as: - [https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json](/schemas/next/bridging/openAgentResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/openAgentErrorResponse.schema.json](/schemas/next/bridging/openAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json](/schemas/next/bridging/openBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/openBridgeErrorResponse.schema.json](/schemas/next/bridging/openBridgeErrorResponse.schema.json) ### Example diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index f57250e48..f9dda058d 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -142,7 +142,9 @@ The bridge fills in the `source.desktopAgent` field and forwards the request to - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json](/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json](/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json](/schemas/next/bridging/raiseIntentBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json](/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json](/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json](/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json) ### Example diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index a2450036d..213bb88ce 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -476,7 +476,7 @@ Request messages from a Desktop Agent use the following format: /** Request body, typically containing the arguments to the function called.*/ payload: { /** Used to indicate which channel `broadcast` functions were called on.*/ - channel?: string, + channelId?: string, /** Used as an argument to `findIntent` and `raiseIntent` functions.`*/ intent?: string, /** Used as an argument to `broadcast`, `findIntent` and `raiseIntent` @@ -525,6 +525,14 @@ Request messages forwarded by the Bridge onto other Desktop Agents use the same Response messages from a Desktop Agent back to the Bridge use a similar format that is differentiated from requests by the presence of a `meta.responseUuid` field. They MUST also quote the `meta.requestUuid` that they are responding to. +:::info +Response messages do not include a `meta.destination` as the routing of responses is handled by the Bridge via the `meta.requestUuid` field. +::: + +There are two types of each response message, a successful response and an error response. + +##### Successful Responses + ```typescript { /** Identifies the type of the message and it is typically set to the @@ -533,9 +541,6 @@ Response messages from a Desktop Agent back to the Bridge use a similar format t type: string, /** Response body, containing the actual response data. */ payload: { - /** Standardized error strings from an appropriate FDC3 API Error - * enumeration. */ - error?: string, /** Response to `open` */ appIdentifier?: AppIdentifier, /** Response to `findInstances` */ @@ -577,18 +582,43 @@ Response messages from a Desktop Agent back to the Bridge use a similar format t **Response Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentResponse.schema.json](/schemas/next/bridging/agentResponse.schema.json) -**Error Response Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentErrorResponse.schema.json](/schemas/next/bridging/agentErrorResponse.schema.json) +##### Error Responses +```typescript +{ + /** Identifies the type of the message and it is typically set to the + * FDC3 function name that the message relates to, e.g. 'findIntent', + * with 'Response' appended.*/ + type: string, + /** Response body, containing the actual response data. */ + payload: { + /** Standardized error strings from an appropriate FDC3 API Error + * enumeration. */ + error?: string, + }, + meta: { + /** UUID for the request this message is responding to.*/ + requestUuid: string, + /** UUID for this specific response message. */ + responseUuid: string, + /** Timestamp at which request was generated */ + timestamp: Date, + /** AppIdentifiers or DesktopAgentIdentifiers for the source + * that generated the response to the request. */ + source?: (AppIdentifier | DesktopAgentIdentifier), + } +} +``` -:::info -Response messages do not include a `meta.destination` as the routing of responses is handled by the Bridge via the `meta.requestUuid` field. -::: +**Error Response Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentErrorResponse.schema.json](/schemas/next/bridging/agentErrorResponse.schema.json) ##### Response Messages Collated and Forwarded by the Bridge Responses from individual Desktop Agents are collated by the Bridge and are forwarded on to the the Desktop Agent that initiated the interaction. The format used is very similar to that used for responses by the Desktop Agents, with the exception of the source information in the `meta` field. Specifically, the `meta.source` field is replaced by two arrays, `meta.sources` and `meta.errorSources`, which provide details on the Desktop agents that responded normally or responded with errors. The detail of any errors returned (in the `payload.error` field of a Desktop Agent's response) is collected up into a `meta.errorDetails` field. Moving the error details from the `payload` to the `meta` field enables the return of a valid response to the originating Desktop Agent in cases where some agents produced valid responses, and others produced errors. -Hence, response messages from the Bridge returned to agents use the following format: +Hence, for responses forwarded by the bridge there is only a single type of response messages from the Bridge returned to agents, one for requests that received at least one successful response, and another for use when all agents (or the targeted agent) returned an error. + +##### At Least One Successful Response ```typescript { @@ -598,9 +628,6 @@ Hence, response messages from the Bridge returned to agents use the following fo type: string, /** Response body, containing the actual response data. */ payload: { - /** Standardized error strings from an appropriate FDC3 API Error - * enumeration. */ - error?: string, /** Response to `open` */ appIdentifier?: AppIdentifier, /** Response to `findInstances` */ @@ -654,7 +681,49 @@ Hence, response messages from the Bridge returned to agents use the following fo } ``` -**Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json](/schemas/next/bridging/bridgeResponse.schema.json) +**Response Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json](/schemas/next/bridging/bridgeResponse.schema.json) + +##### All Responses are Errors + +:::info +In this case there are no successful response and the bridge must populate the `payload.error` field in the response to the agent with one of the error messages returned, so that the receiving Desktop Agent may return it to the app that made the original call. +::: + +```typescript +{ + /** Identifies the type of the message and it is typically set to the + * FDC3 function name that the message relates to, e.g. 'findIntent', + * with 'Response' appended.*/ + type: string, + /** Response body, containing the actual response data. */ + payload: { + /** Standardized error string from an appropriate FDC3 API Error + * enumeration. This should also appear in `meta.errorDetails`.*/ + error?: string, + }, + meta: { + /** UUID for the request this message is responding to.*/ + requestUuid: string, + /** Unique UUID for this collated response (generated by the bridge). */ + responseUuid: string, + /** Timestamp at which the collated response was generated */ + timestamp: Date, + /** Array of AppIdentifiers or DesktopAgentIdentifiers for responses + * that were not returned to the bridge before the timeout or because + * an error occurred. May be omitted if all sources responded without + * errors. MUST include the `desktopAgent` field when returned by the + * bridge. */ + errorSources?: (AppIdentifier | DesktopAgentIdentifier)[], + /** Array of error message strings for responses that were not returned + * to the bridge before the timeout or because an error occurred. + * Should be the same length as the `errorSources` array and ordered the + * same. */ + errorDetails?: string[] + } +} +``` + +**Error Response Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeErrorResponse.schema.json](/schemas/next/bridging/bridgeErrorResponse.schema.json) ### Identifying Individual Messages @@ -732,6 +801,8 @@ For example, a `raiseIntent` targeted at an app instance that no longer exists m For messages that target a specific agent, the Desktop Agent Bridge will augment the message with a `source` field and return it to the calling agent and the app that made the original request. +If all agents (or the targeted agent) return errors, then a suitable error string should be forwarded in the `payload.error` field as returned by at least one of the agents. This allows the agent that made the original request to return that error to the app that made the original API call. All agents that returned errors should be listed in the `errorSources` array and the error message strings they returned (or that were applied because they timed out) listed in the `errorDetails` array (in the same order as `errorSources`). + However, API calls that require a collated response from all agents where at least one agent returns a successful response, will result in a successful response from the Desktop Agent Bridge (i.e. no `error` element should be included), with the agents returning errors listed in the `errorSources` array and the error message strings they returned (or that were applied because they timed out) listed in the `errorDetails` array (in the same order as `errorSources`). This allows for successful exchanges on API calls such as `fdc3.findIntent` where some agents do not have options to return and would normally respond with (for example) `ResolveError.NoAppsFound`. Finally, to facilitate easier debugging, errors specific to Desktop Agent Bridge are added to the Error enumerations, including: diff --git a/schemas/bridging/bridgeErrorResponse.schema.json b/schemas/bridging/bridgeErrorResponse.schema.json new file mode 100644 index 000000000..6f1a7c3ea --- /dev/null +++ b/schemas/bridging/bridgeErrorResponse.schema.json @@ -0,0 +1,55 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeErrorResponse.schema.json", + "title": "Bridge Error Response Message", + "type": "object", + "description": "A response message from the Bridge back to the original Desktop Agent that raised the request, used where all connected agents returned errors.", + "properties": { + "type": { + "title": "Response Message Type", + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "title": "Response Error Message Payload", + "type": "object", + "description": "The error message payload contains details of an error return to the app or agent that raised the original request.", + "properties": { + "error": { + "$ref": "common.schema.json#/$defs/ErrorMessages" + } + } + }, + "meta": { + "$ref": "#/$defs/BridgeErrorResponseMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "BridgeErrorResponseMeta": { + "title": "Bridge Response Metadata", + "description": "Metadata required in a response message collated and/or forwarded on by the Bridge", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + }, + "errorSources": { + "$ref": "common.schema.json#/$defs/ResponseErrorSources" + }, + "errorDetails": { + "$ref": "common.schema.json#/$defs/ResponseErrorDetails" + } + }, + "required": ["requestUuid", "responseUuid", "timestamp", "errorSources", "errorDetails"], + "additionalProperties": false + } + } +} diff --git a/schemas/bridging/findInstancesBridgeErrorResponse.schema.json b/schemas/bridging/findInstancesBridgeErrorResponse.schema.json new file mode 100644 index 000000000..705c9f62e --- /dev/null +++ b/schemas/bridging/findInstancesBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json", + "title": "FindInstances Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "findInstancesAgentErrorResponse.schema.json#/$defs/FindInstancesErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/schemas/bridging/findIntentBridgeErrorResponse.schema.json b/schemas/bridging/findIntentBridgeErrorResponse.schema.json new file mode 100644 index 000000000..76efa5430 --- /dev/null +++ b/schemas/bridging/findIntentBridgeErrorResponse.schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json", + "title": "FindIntent Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "findIntentAgentErrorResponse.schema.json#/$defs/FindIntentErrorResponseBase" + }, + + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json b/schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json new file mode 100644 index 000000000..045d2c6cc --- /dev/null +++ b/schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json", + "title": "FindIntentsByContext Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "findIntentsByContextAgentErrorResponse.schema.json#/$defs/FindIntentsByContextErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json b/schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json new file mode 100644 index 000000000..14c3b1e77 --- /dev/null +++ b/schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json", + "title": "GetAppMetadata Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "getAppMetadataAgentErrorResponse.schema.json#/$defs/GetAppMetadataErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/schemas/bridging/openBridgeErrorResponse.schema.json b/schemas/bridging/openBridgeErrorResponse.schema.json new file mode 100644 index 000000000..7668e8cea --- /dev/null +++ b/schemas/bridging/openBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeErrorResponse.schema.json", + "title": "Open Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "openAgentErrorResponse.schema.json#/$defs/OpenErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/schemas/bridging/raiseIntentBridgeErrorResponse.schema.json b/schemas/bridging/raiseIntentBridgeErrorResponse.schema.json new file mode 100644 index 000000000..e01cd3510 --- /dev/null +++ b/schemas/bridging/raiseIntentBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json", + "title": "RaiseIntent Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "raiseIntentAgentErrorResponse.schema.json#/$defs/RaiseIntentErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json b/schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json new file mode 100644 index 000000000..280475f34 --- /dev/null +++ b/schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json", + "title": "RaiseIntent Result Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "raiseIntentResultAgentErrorResponse.schema.json#/$defs/RaiseIntentResultErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json b/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json index 3910c4b71..657a4212c 100644 --- a/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json +++ b/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @@ -23,10 +23,10 @@ "message": { "oneOf": [ { - "$ref": "#/components/messages/broadcastRequest-Agent" + "$ref": "#/components/messages/handshake" }, { - "$ref": "#/components/messages/handshake" + "$ref": "#/components/messages/broadcastRequest-Agent" }, { "$ref": "#/components/messages/findInstancesRequest-Agent" @@ -129,23 +129,44 @@ { "$ref": "#/components/messages/findInstancesResponse-Bridge" }, + { + "$ref": "#/components/messages/findInstancesErrorResponse-Bridge" + }, { "$ref": "#/components/messages/findIntentResponse-Bridge" }, + { + "$ref": "#/components/messages/findIntentErrorResponse-Bridge" + }, { "$ref": "#/components/messages/findIntentsByContextResponse-Bridge" }, + { + "$ref": "#/components/messages/findIntentsByContextErrorResponse-Bridge" + }, { "$ref": "#/components/messages/getAppMetadataResponse-Bridge" }, + { + "$ref": "#/components/messages/getAppMetadataErrorResponse-Bridge" + }, { "$ref": "#/components/messages/openResponse-Bridge" }, + { + "$ref": "#/components/messages/openErrorResponse-Bridge" + }, { "$ref": "#/components/messages/raiseIntentResponse-Bridge" }, + { + "$ref": "#/components/messages/raiseIntentErrorResponse-Bridge" + }, { "$ref": "#/components/messages/raiseIntentResultResponse-Bridge" + }, + { + "$ref": "#/components/messages/raiseIntentResultErrorResponse-Bridge" } ] }, @@ -201,6 +222,11 @@ "$ref": "../bridging/findInstancesBridgeResponse.schema.json#" } }, + "findInstancesErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/findInstancesBridgeErrorResponse.schema.json#" + } + }, "findIntentRequest-Agent": { "payload": { "$ref": "../bridging/findIntentAgentRequest.schema.json#" @@ -221,6 +247,11 @@ "$ref": "../bridging/findIntentBridgeResponse.schema.json#" } }, + "findIntentErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentBridgeErrorResponse.schema.json#" + } + }, "findIntentsByContextRequest-Agent": { "payload": { "$ref": "../bridging/findIntentsByContextAgentRequest.schema.json#" @@ -241,6 +272,11 @@ "$ref": "../bridging/findIntentsByContextBridgeResponse.schema.json#" } }, + "findIntentsByContextErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentsByContextBridgeErrorResponse.schema.json#" + } + }, "getAppMetadataRequest-Agent": { "payload": { "$ref": "../bridging/getAppMetadataAgentRequest.schema.json#" @@ -261,6 +297,11 @@ "$ref": "../bridging/getAppMetadataBridgeResponse.schema.json#" } }, + "getAppMetadataErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/getAppMetadataBridgeErrorResponse.schema.json#" + } + }, "openRequest-Agent": { "payload": { "$ref": "../bridging/openAgentRequest.schema.json#" @@ -281,6 +322,11 @@ "$ref": "../bridging/openBridgeResponse.schema.json#" } }, + "openErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/openBridgeErrorResponse.schema.json#" + } + }, "privateChannelBroadcast-Agent": { "payload": { "$ref": "../bridging/privateChannelBroadcastAgentRequest.schema.json#" @@ -331,6 +377,11 @@ "$ref": "../bridging/raiseIntentBridgeResponse.schema.json#" } }, + "raiseIntentErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentBridgeErrorResponse.schema.json#" + } + }, "raiseIntentResultResponse-Agent": { "payload": { "$ref": "../bridging/raiseIntentResultAgentResponse.schema.json#" @@ -345,6 +396,11 @@ "payload": { "$ref": "../bridging/raiseIntentResultBridgeResponse.schema.json#" } + }, + "raiseIntentResultErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentResultBridgeErrorResponse.schema.json#" + } } } } diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index cacd5a739..31829e33f 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,12 +1,13 @@ // To parse this data: // -// import { Convert, BaseImplementationMetadata, AgentErrorResponseMessage, AgentRequestMessage, AgentResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentErrorResponse, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentAgentErrorResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentErrorResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentErrorResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentErrorResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentErrorResponse, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentErrorResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; +// import { Convert, BaseImplementationMetadata, AgentErrorResponseMessage, AgentRequestMessage, AgentResponseMessage, BridgeErrorResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentErrorResponse, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeErrorResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentAgentErrorResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeErrorResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentErrorResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeErrorResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentErrorResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeErrorResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentErrorResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeErrorResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentErrorResponse, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeErrorResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentErrorResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeErrorResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; // // const schemasAPIAPISchema = Convert.toSchemasAPIAPISchema(json); // const baseImplementationMetadata = Convert.toBaseImplementationMetadata(json); // const agentErrorResponseMessage = Convert.toAgentErrorResponseMessage(json); // const agentRequestMessage = Convert.toAgentRequestMessage(json); // const agentResponseMessage = Convert.toAgentResponseMessage(json); +// const bridgeErrorResponseMessage = Convert.toBridgeErrorResponseMessage(json); // const bridgeRequestMessage = Convert.toBridgeRequestMessage(json); // const bridgeResponseMessage = Convert.toBridgeResponseMessage(json); // const broadcastAgentRequest = Convert.toBroadcastAgentRequest(json); @@ -20,26 +21,31 @@ // const findInstancesAgentErrorResponse = Convert.toFindInstancesAgentErrorResponse(json); // const findInstancesAgentRequest = Convert.toFindInstancesAgentRequest(json); // const findInstancesAgentResponse = Convert.toFindInstancesAgentResponse(json); +// const findInstancesBridgeErrorResponse = Convert.toFindInstancesBridgeErrorResponse(json); // const findInstancesBridgeRequest = Convert.toFindInstancesBridgeRequest(json); // const findInstancesBridgeResponse = Convert.toFindInstancesBridgeResponse(json); // const findIntentAgentErrorResponse = Convert.toFindIntentAgentErrorResponse(json); // const findIntentsAgentRequest = Convert.toFindIntentsAgentRequest(json); // const findIntentAgentResponse = Convert.toFindIntentAgentResponse(json); +// const findIntentBridgeErrorResponse = Convert.toFindIntentBridgeErrorResponse(json); // const findIntentBridgeRequest = Convert.toFindIntentBridgeRequest(json); // const findIntentBridgeResponse = Convert.toFindIntentBridgeResponse(json); // const findIntentsByContextAgentErrorResponse = Convert.toFindIntentsByContextAgentErrorResponse(json); // const findIntentsByContextAgentRequest = Convert.toFindIntentsByContextAgentRequest(json); // const findIntentsByContextAgentResponse = Convert.toFindIntentsByContextAgentResponse(json); +// const findIntentsByContextBridgeErrorResponse = Convert.toFindIntentsByContextBridgeErrorResponse(json); // const findIntentsByContextBridgeRequest = Convert.toFindIntentsByContextBridgeRequest(json); // const findIntentsByContextBridgeResponse = Convert.toFindIntentsByContextBridgeResponse(json); // const getAppMetadataAgentErrorResponse = Convert.toGetAppMetadataAgentErrorResponse(json); // const getAppMetadataAgentRequest = Convert.toGetAppMetadataAgentRequest(json); // const getAppMetadataAgentResponse = Convert.toGetAppMetadataAgentResponse(json); +// const getAppMetadataBridgeErrorResponse = Convert.toGetAppMetadataBridgeErrorResponse(json); // const getAppMetadataBridgeRequest = Convert.toGetAppMetadataBridgeRequest(json); // const getAppMetadataBridgeResponse = Convert.toGetAppMetadataBridgeResponse(json); // const openAgentErrorResponse = Convert.toOpenAgentErrorResponse(json); // const openAgentRequest = Convert.toOpenAgentRequest(json); // const openAgentResponse = Convert.toOpenAgentResponse(json); +// const openBridgeErrorResponse = Convert.toOpenBridgeErrorResponse(json); // const openBridgeRequest = Convert.toOpenBridgeRequest(json); // const openBridgeResponse = Convert.toOpenBridgeResponse(json); // const privateChannelBroadcastAgentRequest = Convert.toPrivateChannelBroadcastAgentRequest(json); @@ -57,10 +63,12 @@ // const raiseIntentAgentErrorResponse = Convert.toRaiseIntentAgentErrorResponse(json); // const raiseIntentAgentRequest = Convert.toRaiseIntentAgentRequest(json); // const raiseIntentAgentResponse = Convert.toRaiseIntentAgentResponse(json); +// const raiseIntentBridgeErrorResponse = Convert.toRaiseIntentBridgeErrorResponse(json); // const raiseIntentBridgeRequest = Convert.toRaiseIntentBridgeRequest(json); // const raiseIntentBridgeResponse = Convert.toRaiseIntentBridgeResponse(json); // const raiseIntentResultAgentErrorResponse = Convert.toRaiseIntentResultAgentErrorResponse(json); // const raiseIntentResultAgentResponse = Convert.toRaiseIntentResultAgentResponse(json); +// const raiseIntentResultBridgeErrorResponse = Convert.toRaiseIntentResultBridgeErrorResponse(json); // const raiseIntentResultBridgeResponse = Convert.toRaiseIntentResultBridgeResponse(json); // const context = Convert.toContext(json); // @@ -432,6 +440,44 @@ export interface AgentResponseMessage { type: ResponseMessageType; } +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface BridgeErrorResponseMessage { + meta: BridgeErrorResponseMessageMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: ResponseErrorMessagePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface BridgeErrorResponseMessageMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface ResponseErrorMessagePayload { + error?: ResponseErrorDetail; + [property: string]: any; +} + /** * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */ @@ -472,7 +518,7 @@ export interface BridgeRequestMetadata { * request. */ export interface BridgeResponseMessage { - meta: BridgeResponseMetadata; + meta: BridgeResponseMessageMeta; /** * The message payload typically contains return values for FDC3 API functions. */ @@ -487,7 +533,7 @@ export interface BridgeResponseMessage { /** * Metadata required in a response message collated and/or forwarded on by the Bridge */ -export interface BridgeResponseMetadata { +export interface BridgeResponseMessageMeta { errorDetails?: ResponseErrorDetail[]; errorSources?: DesktopAgentIdentifier[]; requestUuid: string; @@ -1282,6 +1328,45 @@ export interface Image { type?: string; } +/** + * A response to a findInstances request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface FindInstancesBridgeErrorResponse { + meta: FindInstancesBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: FindInstancesBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindInstancesBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface FindInstancesBridgeErrorResponsePayload { + error: ErrorMessage; +} + /** * A request for details of instances of a particular app * @@ -1518,6 +1603,45 @@ export interface IntentMetadata { name: string; } +/** + * A response to a findIntent request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface FindIntentBridgeErrorResponse { + meta: FindIntentBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: FindIntentBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindIntentBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface FindIntentBridgeErrorResponsePayload { + error: ErrorMessage; +} + /** * A request for details of apps available to resolve a particular intent and context pair. * @@ -1725,6 +1849,45 @@ export interface FindIntentsByContextAgentResponsePayload { appIntents: AppIntent[]; } +/** + * A response to a findIntentsByContext request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface FindIntentsByContextBridgeErrorResponse { + meta: FindIntentsByContextBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: FindIntentsByContextBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindIntentsByContextBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface FindIntentsByContextBridgeErrorResponsePayload { + error: ErrorMessage; +} + /** * A request for details of intents and apps available to resolve them for a particular * context. @@ -1931,6 +2094,45 @@ export interface GetAppMetadataAgentResponsePayload { appMetadata: AppMetadata; } +/** + * A response to a getAppMetadata request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface GetAppMetadataBridgeErrorResponse { + meta: GetAppMetadataBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: GetAppMetadataBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface GetAppMetadataBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface GetAppMetadataBridgeErrorResponsePayload { + error: ErrorMessage; +} + /** * A request for metadata about an app * @@ -2161,6 +2363,45 @@ export interface OpenAgentResponsePayload { appIdentifier: AppIdentifier; } +/** + * A response to an open request that contains an error + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface OpenBridgeErrorResponse { + meta: OpenBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: OpenBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface OpenBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface OpenBridgeErrorResponsePayload { + error: OpenErrorMessage; +} + /** * A request to open an application * @@ -3031,6 +3272,45 @@ export interface IntentResolution { version?: string; } +/** + * A response to a request to raise an intent that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface RaiseIntentBridgeErrorResponse { + meta: RaiseIntentBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: RaiseIntentBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface RaiseIntentBridgeErrorResponsePayload { + error: ErrorMessage; +} + /** * A request to raise an intent. * @@ -3289,6 +3569,46 @@ export enum Type { User = 'user', } +/** + * A secondary response to a request to raise an intent used to deliver the intent result, + * which contains an error + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface RaiseIntentResultBridgeErrorResponse { + meta: RaiseIntentResultBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: RaiseIntentResultBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentResultBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface RaiseIntentResultBridgeErrorResponsePayload { + error: RaiseIntentResultErrorMessage; +} + /** * A secondary response to a request to raise an intent used to deliver the intent result * @@ -3377,6 +3697,14 @@ export class Convert { return JSON.stringify(uncast(value, r('AgentResponseMessage')), null, 2); } + public static toBridgeErrorResponseMessage(json: string): BridgeErrorResponseMessage { + return cast(JSON.parse(json), r('BridgeErrorResponseMessage')); + } + + public static bridgeErrorResponseMessageToJson(value: BridgeErrorResponseMessage): string { + return JSON.stringify(uncast(value, r('BridgeErrorResponseMessage')), null, 2); + } + public static toBridgeRequestMessage(json: string): BridgeRequestMessage { return cast(JSON.parse(json), r('BridgeRequestMessage')); } @@ -3481,6 +3809,14 @@ export class Convert { return JSON.stringify(uncast(value, r('FindInstancesAgentResponse')), null, 2); } + public static toFindInstancesBridgeErrorResponse(json: string): FindInstancesBridgeErrorResponse { + return cast(JSON.parse(json), r('FindInstancesBridgeErrorResponse')); + } + + public static findInstancesBridgeErrorResponseToJson(value: FindInstancesBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesBridgeErrorResponse')), null, 2); + } + public static toFindInstancesBridgeRequest(json: string): FindInstancesBridgeRequest { return cast(JSON.parse(json), r('FindInstancesBridgeRequest')); } @@ -3521,6 +3857,14 @@ export class Convert { return JSON.stringify(uncast(value, r('FindIntentAgentResponse')), null, 2); } + public static toFindIntentBridgeErrorResponse(json: string): FindIntentBridgeErrorResponse { + return cast(JSON.parse(json), r('FindIntentBridgeErrorResponse')); + } + + public static findIntentBridgeErrorResponseToJson(value: FindIntentBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentBridgeErrorResponse')), null, 2); + } + public static toFindIntentBridgeRequest(json: string): FindIntentBridgeRequest { return cast(JSON.parse(json), r('FindIntentBridgeRequest')); } @@ -3561,6 +3905,14 @@ export class Convert { return JSON.stringify(uncast(value, r('FindIntentsByContextAgentResponse')), null, 2); } + public static toFindIntentsByContextBridgeErrorResponse(json: string): FindIntentsByContextBridgeErrorResponse { + return cast(JSON.parse(json), r('FindIntentsByContextBridgeErrorResponse')); + } + + public static findIntentsByContextBridgeErrorResponseToJson(value: FindIntentsByContextBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextBridgeErrorResponse')), null, 2); + } + public static toFindIntentsByContextBridgeRequest(json: string): FindIntentsByContextBridgeRequest { return cast(JSON.parse(json), r('FindIntentsByContextBridgeRequest')); } @@ -3601,6 +3953,14 @@ export class Convert { return JSON.stringify(uncast(value, r('GetAppMetadataAgentResponse')), null, 2); } + public static toGetAppMetadataBridgeErrorResponse(json: string): GetAppMetadataBridgeErrorResponse { + return cast(JSON.parse(json), r('GetAppMetadataBridgeErrorResponse')); + } + + public static getAppMetadataBridgeErrorResponseToJson(value: GetAppMetadataBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataBridgeErrorResponse')), null, 2); + } + public static toGetAppMetadataBridgeRequest(json: string): GetAppMetadataBridgeRequest { return cast(JSON.parse(json), r('GetAppMetadataBridgeRequest')); } @@ -3641,6 +4001,14 @@ export class Convert { return JSON.stringify(uncast(value, r('OpenAgentResponse')), null, 2); } + public static toOpenBridgeErrorResponse(json: string): OpenBridgeErrorResponse { + return cast(JSON.parse(json), r('OpenBridgeErrorResponse')); + } + + public static openBridgeErrorResponseToJson(value: OpenBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('OpenBridgeErrorResponse')), null, 2); + } + public static toOpenBridgeRequest(json: string): OpenBridgeRequest { return cast(JSON.parse(json), r('OpenBridgeRequest')); } @@ -3803,6 +4171,14 @@ export class Convert { return JSON.stringify(uncast(value, r('RaiseIntentAgentResponse')), null, 2); } + public static toRaiseIntentBridgeErrorResponse(json: string): RaiseIntentBridgeErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentBridgeErrorResponse')); + } + + public static raiseIntentBridgeErrorResponseToJson(value: RaiseIntentBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentBridgeErrorResponse')), null, 2); + } + public static toRaiseIntentBridgeRequest(json: string): RaiseIntentBridgeRequest { return cast(JSON.parse(json), r('RaiseIntentBridgeRequest')); } @@ -3835,6 +4211,14 @@ export class Convert { return JSON.stringify(uncast(value, r('RaiseIntentResultAgentResponse')), null, 2); } + public static toRaiseIntentResultBridgeErrorResponse(json: string): RaiseIntentResultBridgeErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentResultBridgeErrorResponse')); + } + + public static raiseIntentResultBridgeErrorResponseToJson(value: RaiseIntentResultBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultBridgeErrorResponse')), null, 2); + } + public static toRaiseIntentResultBridgeResponse(json: string): RaiseIntentResultBridgeResponse { return cast(JSON.parse(json), r('RaiseIntentResultBridgeResponse')); } @@ -4096,6 +4480,25 @@ const typeMap: any = { ], false ), + BridgeErrorResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('BridgeErrorResponseMessageMeta') }, + { json: 'payload', js: 'payload', typ: r('ResponseErrorMessagePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BridgeErrorResponseMessageMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ResponseErrorMessagePayload: o([{ json: 'error', js: 'error', typ: u(undefined, r('ResponseErrorDetail')) }], 'any'), BridgeRequestMessage: o( [ { json: 'meta', js: 'meta', typ: r('BridgeRequestMetadata') }, @@ -4115,13 +4518,13 @@ const typeMap: any = { ), BridgeResponseMessage: o( [ - { json: 'meta', js: 'meta', typ: r('BridgeResponseMetadata') }, + { json: 'meta', js: 'meta', typ: r('BridgeResponseMessageMeta') }, { json: 'payload', js: 'payload', typ: m('any') }, { json: 'type', js: 'type', typ: '' }, ], false ), - BridgeResponseMetadata: o( + BridgeResponseMessageMeta: o( [ { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, @@ -4411,6 +4814,25 @@ const typeMap: any = { ], false ), + FindInstancesBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindInstancesBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindInstancesBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), FindInstancesBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindInstancesBridgeRequestMeta') }, @@ -4526,6 +4948,25 @@ const typeMap: any = { ], false ), + FindIntentBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindIntentBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), FindIntentBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindIntentBridgeRequestMeta') }, @@ -4627,6 +5068,25 @@ const typeMap: any = { [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntent')) }], false ), + FindIntentsByContextBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + FindIntentsByContextBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsByContextBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), FindIntentsByContextBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('FindIntentsByContextBridgeRequestMeta') }, @@ -4722,6 +5182,25 @@ const typeMap: any = { false ), GetAppMetadataAgentResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadata') }], false), + GetAppMetadataBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + GetAppMetadataBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), GetAppMetadataBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeRequestMeta') }, @@ -4820,6 +5299,25 @@ const typeMap: any = { false ), OpenAgentResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('AppIdentifier') }], false), + OpenBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + OpenBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('OpenErrorMessage') }], false), OpenBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('OpenBridgeRequestMeta') }, @@ -5220,6 +5718,25 @@ const typeMap: any = { ], false ), + RaiseIntentBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + RaiseIntentBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), RaiseIntentBridgeRequest: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentBridgeRequestMeta') }, @@ -5333,6 +5850,28 @@ const typeMap: any = { ], false ), + RaiseIntentResultBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + RaiseIntentResultBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentResultBridgeErrorResponsePayload: o( + [{ json: 'error', js: 'error', typ: r('RaiseIntentResultErrorMessage') }], + false + ), RaiseIntentResultBridgeResponse: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentResultBridgeResponseMeta') }, From 403289c878bd3607bc526178d8c1c9f9b79c3ebe Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 18:12:06 +0100 Subject: [PATCH 073/106] Adding a MalformedMessage error to BridgingError and comments to API docs about the return of bridging errors through the API --- docs/agent-bridging/spec.md | 10 +++++++++- docs/api/ref/DesktopAgent.md | 15 +++++++++------ docs/api/ref/Errors.md | 25 +++++++++++++++---------- schemas/api/api.schema.json | 3 ++- src/api/DesktopAgent.ts | 16 +++++++++------- src/api/Errors.ts | 2 ++ src/api/IntentResolution.ts | 3 ++- src/bridging/BridgingTypes.ts | 8 ++++++++ 8 files changed, 56 insertions(+), 26 deletions(-) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 213bb88ce..9dc826506 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -821,7 +821,11 @@ enum ResolveError { Desktop Agent Bridge. */ DesktopAgentNotFound = 'DesktopAgentNotFound', } +``` + +And an error enumeration is created for errors related to bridging that may occur on any request, and are returnable through the FDC3 API. +```typescript enum BridgingError { /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, * within the alloted timeout. */ @@ -833,7 +837,11 @@ enum BridgingError { * a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a * remote DesktopAgent targeted), when the local Desktop Agent is not connected to * a bridge. */ - NotConnectedToBridge = 'NotConnectedToBridge' + NotConnectedToBridge = 'NotConnectedToBridge', + /** Returned if a message to a Bridge deviates from the schema for that message + * sufficiently that it could not be processed. + */ + MalformedMessage = 'MalformedMessage' } ``` diff --git a/docs/api/ref/DesktopAgent.md b/docs/api/ref/DesktopAgent.md index 0e705655b..a8fdd866e 100644 --- a/docs/api/ref/DesktopAgent.md +++ b/docs/api/ref/DesktopAgent.md @@ -258,7 +258,7 @@ Find all the available instances for a particular application. If there are no instances of the specified application the returned promise should resolve to an empty array. -If the request fails for another reason, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration. +If the request fails for another reason, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration, or (if connected to a Desktop Agent Bridge) the [`BridgingError`](Errors#bridgingerror) enumeration. **Example:** @@ -281,7 +281,7 @@ Find out more information about a particular intent by passing its name, and opt `findIntent` is effectively granting programmatic access to the Desktop Agent's resolver. It returns a promise resolving to an `AppIntent` which provides details of the intent, its metadata and metadata about the apps and app instances that are registered to handle it. This can be used to raise the intent against a specific app or app instance. -If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration. This includes the case where no apps are found that resolve the intent, when the [`ResolveError.NoAppsFound`](Errors#resolveerror) message should be used, and when an invalid context object is passed as an argument, when the [`ResolveError.MalformedContext`](Errors#resolveerror) message should be used. +If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration, or (if connected to a Desktop Agent Bridge) the [`BridgingError`](Errors#bridgingerror) enumeration. This includes the case where no apps are found that resolve the intent, when the [`ResolveError.NoAppsFound`](Errors#resolveerror) message should be used, and when an invalid context object is passed as an argument, when the [`ResolveError.MalformedContext`](Errors#resolveerror) message should be used. Result types may be a type name, the string `"channel"` (which indicates that the app will return a channel) or a string indicating a channel that returns a specific type, e.g. `"channel"`. If intent resolution to an app returning a channel is requested, the desktop agent MUST include both apps that are registered as returning a channel and those registered as returning a channel with a specific type in the response. @@ -359,7 +359,7 @@ Find all the available intents for a particular context, and optionally a desire `findIntentsByContext` is effectively granting programmatic access to the Desktop Agent's resolver. A promise resolving to all the intents, their metadata and metadata about the apps and app instances that registered as handlers is returned, based on the context types the intents have registered. -If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration. This includes the case where no intents with associated apps are found, when the `ResolveError.NoAppsFound` message should be used, and when an invalid context object is passed as an argument, when the [`ResolveError.MalformedContext`](Errors#resolveerror) message should be used. +If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration, or (if connected to a Desktop Agent Bridge) the [`BridgingError`](Errors#bridgingerror) enumeration. This includes the case where no intents with associated apps are found, when the `ResolveError.NoAppsFound` message should be used, and when an invalid context object is passed as an argument, when the [`ResolveError.MalformedContext`](Errors#resolveerror) message should be used. The optional `resultType` argument may be a type name, the string `"channel"` (which indicates that the app will return a channel) or a string indicating a channel that returns a specific type, e.g. `"channel"`. If intent resolution to an app returning a channel is requested without a specified context type, the desktop agent MUST include both apps that are registered as returning a channel and those registered as returning a channel with a specific type in the response. @@ -425,6 +425,9 @@ getAppMetadata(app: AppIdentifier): Promise; Retrieves the [`AppMetadata`](Metadata#appmetadata) for an [`AppIdentifier`](Types#appidentifier), which provides additional metadata (such as icons, a title and description) from the App Directory record for the application, that may be used for display purposes. +If the app is not found, the promise MUST be rejected with an `Error` Object with the `message` given by [`ResolveError.TargetAppUnavailable`](Errors#resolveerror), or (if connected to a Desktop Agent Bridge) an error from the [`BridgingError`](Errors#bridgingerror) enumeration. + + **Examples:** ```js @@ -610,7 +613,7 @@ If a [`Context`](Types#context) object is passed in, this object will be provide Returns an [`AppIdentifier`](Types#appidentifier) object with the `instanceId` field set to identify the instance of the application opened by this call. -If an error occurs while opening the app, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`OpenError`](Errors#openerror) enumeration. +If an error occurs while opening the app, the promise MUST be rejected with an `Error` Object with a `message` chosen from the [`OpenError`](Errors#openerror) enumeration, or (if connected to a Desktop Agent Bridge) the [`BridgingError`](Errors#bridgingerror) enumeration. **Example:** @@ -641,7 +644,7 @@ Raises a specific intent for resolution against apps registered with the desktop The desktop agent MUST resolve the correct app to target based on the provided intent name and context data. If multiple matching apps are found, a method for resolving the intent to a target app, such as presenting the user with a resolver UI allowing them to pick an app, SHOULD be provided. Alternatively, the specific app or app instance to target can also be provided. A list of valid target applications and instances can be retrieved via [`findIntent`](DesktopAgent#findintent). -If a target app for the intent cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the [`ResolveError.MalformedContext`](Errors#resolveerror) string as its `message`. +If a target app for the intent cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration, or (if connected to a Desktop Agent Bridge) the [`BridgingError`](Errors#bridgingerror) enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the [`ResolveError.MalformedContext`](Errors#resolveerror) string as its `message`. If you wish to raise an intent without a context, use the `fdc3.nothing` context type. This type exists so that apps can explicitly declare support for raising an intent without context. @@ -707,7 +710,7 @@ Using `raiseIntentForContext` is similar to calling `findIntentsByContext`, and Returns an `IntentResolution` object, see [`raiseIntent()`](#raiseintent) for details. -If a target intent and app cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the [`ResolveError.MalformedContext`](Errors#resolveerror) string as its `message`. +If a target intent and app cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the [`ResolveError`](Errors#resolveerror) enumeration, or (if connected to a Desktop Agent Bridge) the [`BridgingError`](Errors#bridgingerror) enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the [`ResolveError.MalformedContext`](Errors#resolveerror) string as its `message`. **Example:** diff --git a/docs/api/ref/Errors.md b/docs/api/ref/Errors.md index 0c4f5ca3a..b5a9144f7 100644 --- a/docs/api/ref/Errors.md +++ b/docs/api/ref/Errors.md @@ -173,21 +173,26 @@ Contains constants representing the errors that can be encountered when calling ```typescript enum BridgingError { - /** Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, - * within the alloted timeout. */ + /** @experimental Returned if a Desktop Agent did not return a response, via + * Desktop Agent Bridging, within the alloted timeout. */ ResponseTimedOut = 'ResponseToBridgeTimedOut', - /** Returned if a Desktop Agent that has been targeted by a particular request has - * been disconnected from the Bridge before a response has been received from it. */ + /** @experimental Returned if a Desktop Agent that has been targeted by a + * particular request has been disconnected from the Bridge before a + * response has been received from it. */ AgentDisconnected = 'AgentDisconnected', - /** Returned for FDC3 API calls that are specified with arguments indicating that - * a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a - * remote DesktopAgent targeted), when the local Desktop Agent is not connected to - * a bridge. */ - NotConnectedToBridge = 'NotConnectedToBridge' + /** @experimental Returned for FDC3 API calls that are specified with + * arguments indicating that a remote Desktop agent should be targeted + * (e.g. raiseIntent with an app on a remote DesktopAgent targeted), + * when the local Desktop Agent is not connected to a bridge. */ + NotConnectedToBridge = 'NotConnectedToBridge', + /** @experimental Returned if a message to a Bridge deviates from the schema + * for that message sufficiently that it could not be processed. + */ + MalformedMessage = 'MalformedMessage' } ``` -Contains constants representing the errors that can be encountered when queries are forwarded to a Desktop Agent bridge, but one or more remote Desktop Agents connected to it disconnects or times-out while a particular request is in flight. +Contains constants representing the errors that can be encountered when queries are forwarded to a Desktop Agent Bridge, but one or more remote Desktop Agents connected to it disconnects, times-out or a malformed message is encountered while a particular request is in flight. These errors may be returned via the FDC3 API when a Desktop Agent is (or was) connected to a Desktop Agent Bridge. **See also:** diff --git a/schemas/api/api.schema.json b/schemas/api/api.schema.json index dec1bdc9e..1721a4d49 100644 --- a/schemas/api/api.schema.json +++ b/schemas/api/api.schema.json @@ -352,7 +352,8 @@ "enum": [ "AgentDisconnected", "NotConnectedToBridge", - "ResponseToBridgeTimedOut" + "ResponseToBridgeTimedOut", + "MalformedMessage" ], "type": "string" }, diff --git a/src/api/DesktopAgent.ts b/src/api/DesktopAgent.ts index feaad94b1..f824fb8ca 100644 --- a/src/api/DesktopAgent.ts +++ b/src/api/DesktopAgent.ts @@ -36,7 +36,7 @@ export interface DesktopAgent { * * Returns an `AppIdentifier` object with the `instanceId` field set identifying the instance of the application opened by this call. * - * If an error occurs while opening the app, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `OpenError` enumeration. + * If an error occurs while opening the app, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `OpenError` enumeration, or (if connected to a Desktop Agent Bridge) the `BridgingError` enumeration. * * ```javascript * //Open an app without context, using an AppIdentifier object to specify the target by `appId`. @@ -56,7 +56,7 @@ export interface DesktopAgent { * It returns a promise resolving to the intent, its metadata and metadata about the apps and app instances that registered that intent. * This can be used to raise the intent against a specific app or app instance. * - * If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration. This includes the case where no apps are found that resolve the intent, when the `ResolveError.NoAppsFound` message should be used, and when an invalid context object is passed as an argument, when the `ResolveError.MalformedContext` message should be used. + * If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration, or (if connected to a Desktop Agent Bridge) the `BridgingError` enumeration. This includes the case where no apps are found that resolve the intent, when the `ResolveError.NoAppsFound` message should be used, and when an invalid context object is passed as an argument, when the `ResolveError.MalformedContext` message should be used. * * Result types may be a type name, the string "channel" (which indicates that the app * will return a channel) or a string indicating a channel that returns a specific type, @@ -133,7 +133,7 @@ export interface DesktopAgent { * `findIntentsByContext` is effectively granting programmatic access to the Desktop Agent's resolver. * It returns a promise resolving to an `AppIntent` which provides details of the intent, its metadata and metadata about the apps and app instances that are registered to handle it. This can be used to raise the intent against a specific app or app instance. * - * If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration. This includes the case where no intents with associated apps are found, when the `ResolveError.NoAppsFound` message should be used, and when an invalid context object is passed as an argument, when the `ResolveError.MalformedContext` message should be used. + * If the resolution fails, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration, or (if connected to a Desktop Agent Bridge) the `BridgingError` enumeration. This includes the case where no intents with associated apps are found, when the `ResolveError.NoAppsFound` message should be used, and when an invalid context object is passed as an argument, when the `ResolveError.MalformedContext` message should be used. * * The optional `resultType` argument may be a type name, the string "channel" (which indicates that the app * should return a channel) or a string indicating a channel that returns a specific type, @@ -187,7 +187,7 @@ export interface DesktopAgent { * * If there are no instances of the specified application the returned promise should resolve to an empty array. * - * If the request fails for another reason, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration. + * If the request fails for another reason, the promise MUST be rejected with an `Error` Object with a `message` chosen from the `ResolveError` enumeration, or (if connected to a Desktop Agent Bridge) the `BridgingError` enumeration. * * ```javascript * // Retrieve a list of instances of an application @@ -225,12 +225,12 @@ export interface DesktopAgent { broadcast(context: Context): Promise; /** - * Raises a specific intent for resolution against apps registered with the desktop agent. + * Raises a specific intent for resolution against apps registered with the Desktop Agent. * * The desktop agent MUST resolve the correct app to target based on the provided intent name and context data. If multiple matching apps are found, the user MAY be presented with a Resolver UI allowing them to pick one, or another method of Resolution applied to select an app. * Alternatively, the specific app or app instance to target can also be provided. A list of valid target applications and instances can be retrieved via `findIntent`. * - * If a target app for the intent cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the `ResolveError` enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the `ResolveError.MalformedContext` string as its `message`. + * If a target app for the intent cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the `ResolveError` enumeration, or (if connected to a Desktop Agent Bridge) the `BridgingError` enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the `ResolveError.MalformedContext` string as its `message`. * * If you wish to raise an Intent without a context, use the `fdc3.nothing` context type. This type exists so that apps can explicitly declare support for raising an intent without context. * @@ -280,7 +280,7 @@ export interface DesktopAgent { * * Returns an `IntentResolution` object, see `raiseIntent()` for details. * - * If a target intent and app cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the `ResolveError` enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the `ResolveError.MalformedContext` string as its `message`. + * If a target intent and app cannot be found with the criteria provided or the user either closes the resolver UI or otherwise cancels resolution, the promise MUST be rejected with an `Error` object with a `message` chosen from the `ResolveError` enumeration, or (if connected to a Desktop Agent Bridge) the `BridgingError` enumeration. If a specific target `app` parameter was set, but either the app or app instance is not available, the promise MUST be rejected with an `Error` object with either the `ResolveError.TargetAppUnavailable` or `ResolveError.TargetInstanceUnavailable` string as its `message`. If an invalid context object is passed as an argument the promise MUST be rejected with an `Error` object with the `ResolveError.MalformedContext` string as its `message`. * * ```javascript * // Resolve against all intents registered for the type of the specified context @@ -513,6 +513,8 @@ export interface DesktopAgent { * Retrieves the `AppMetadata` for an `AppIdentifier`, which provides additional metadata (such as icons, * a title and description) from the App Directory record for the application, that may be used for display * purposes. + * + * If the app is not found, the promise MUST be rejected with an `Error` Object with the `message` given by `ResolveError.TargetAppUnavailable`, or (if connected to a Desktop Agent Bridge) an error from the `BridgingError` enumeration. * * ```js * let appIdentifier = { appId: "MyAppId@my.appd.com" } diff --git a/src/api/Errors.ts b/src/api/Errors.ts index 0fcd5dea3..2b10d5944 100644 --- a/src/api/Errors.ts +++ b/src/api/Errors.ts @@ -66,4 +66,6 @@ export enum BridgingError { AgentDisconnected = 'AgentDisconnected', /** @experimental Returned for FDC3 API calls that are specified with arguments indicating that a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a remote DesktopAgent targeted), when the local Desktop Agent is not connected to a bridge. */ NotConnectedToBridge = 'NotConnectedToBridge', + /** @experimental Returned if a message to a Bridge deviates from the schema for that message sufficiently that it could not be processed. */ + MalformedMessage = 'MalformedMessage', } diff --git a/src/api/IntentResolution.ts b/src/api/IntentResolution.ts index 3f7640fdd..82a899d64 100644 --- a/src/api/IntentResolution.ts +++ b/src/api/IntentResolution.ts @@ -61,7 +61,8 @@ export interface IntentResolution { * the promise it returns is rejected, or the promise resolved to an invalid * type) then the Desktop Agent MUST reject the promise returned by the * `getResult()` function of the `IntentResolution` with a string from - * the `ResultError` enumeration. + * the `ResultError` enumeration, or (if connected to a Desktop Agent + * Bridge) the `BridgingError` enumeration. */ getResult(): Promise; } diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 31829e33f..68ac5b997 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -214,6 +214,7 @@ export enum ResponseErrorDetail { IntentDeliveryFailed = 'IntentDeliveryFailed', IntentHandlerRejected = 'IntentHandlerRejected', MalformedContext = 'MalformedContext', + MalformedMessage = 'MalformedMessage', NoAppsFound = 'NoAppsFound', NoChannelFound = 'NoChannelFound', NoResultReturned = 'NoResultReturned', @@ -1028,6 +1029,7 @@ export enum ErrorMessage { DesktopAgentNotFound = 'DesktopAgentNotFound', IntentDeliveryFailed = 'IntentDeliveryFailed', MalformedContext = 'MalformedContext', + MalformedMessage = 'MalformedMessage', NoAppsFound = 'NoAppsFound', NotConnectedToBridge = 'NotConnectedToBridge', ResolverTimeout = 'ResolverTimeout', @@ -2274,6 +2276,7 @@ export enum OpenErrorMessage { DesktopAgentNotFound = 'DesktopAgentNotFound', ErrorOnLaunch = 'ErrorOnLaunch', MalformedContext = 'MalformedContext', + MalformedMessage = 'MalformedMessage', NotConnectedToBridge = 'NotConnectedToBridge', ResolverUnavailable = 'ResolverUnavailable', ResponseToBridgeTimedOut = 'ResponseToBridgeTimedOut', @@ -3451,6 +3454,7 @@ export interface RaiseIntentResultAgentErrorResponsePayload { export enum RaiseIntentResultErrorMessage { AgentDisconnected = 'AgentDisconnected', IntentHandlerRejected = 'IntentHandlerRejected', + MalformedMessage = 'MalformedMessage', NoResultReturned = 'NoResultReturned', NotConnectedToBridge = 'NotConnectedToBridge', ResponseToBridgeTimedOut = 'ResponseToBridgeTimedOut', @@ -5914,6 +5918,7 @@ const typeMap: any = { 'IntentDeliveryFailed', 'IntentHandlerRejected', 'MalformedContext', + 'MalformedMessage', 'NoAppsFound', 'NoChannelFound', 'NoResultReturned', @@ -5955,6 +5960,7 @@ const typeMap: any = { 'DesktopAgentNotFound', 'IntentDeliveryFailed', 'MalformedContext', + 'MalformedMessage', 'NoAppsFound', 'NotConnectedToBridge', 'ResolverTimeout', @@ -5971,6 +5977,7 @@ const typeMap: any = { 'DesktopAgentNotFound', 'ErrorOnLaunch', 'MalformedContext', + 'MalformedMessage', 'NotConnectedToBridge', 'ResolverUnavailable', 'ResponseToBridgeTimedOut', @@ -5978,6 +5985,7 @@ const typeMap: any = { RaiseIntentResultErrorMessage: [ 'AgentDisconnected', 'IntentHandlerRejected', + 'MalformedMessage', 'NoResultReturned', 'NotConnectedToBridge', 'ResponseToBridgeTimedOut', From bfc100fe335b86da7116d1230958cbdcd3747cc0 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Mon, 17 Jul 2023 10:16:59 -0700 Subject: [PATCH 074/106] Bug fixes (#74) * Bug fixes * clean up --------- Co-authored-by: Kris West --- schemas/api/api.schema.json | 4 +- schemas/bridging/bridgeRequest.schema.json | 2 +- .../broadcastAgentRequest.schema.json | 1 + schemas/bridging/common.schema.json | 19 ++ schemas/bridging/openAgentRequest.schema.json | 1 + src/bridging/BridgingTypes.ts | 302 ++++++++++++++---- 6 files changed, 257 insertions(+), 72 deletions(-) diff --git a/schemas/api/api.schema.json b/schemas/api/api.schema.json index 1721a4d49..d96ba28ee 100644 --- a/schemas/api/api.schema.json +++ b/schemas/api/api.schema.json @@ -23,7 +23,7 @@ "title": "desktopAgent" } }, - "additionalProperties": false, + "unevaluatedProperties": false, "required": [ "appId" ] @@ -295,7 +295,7 @@ "title": "desktopAgent" } }, - "additionalProperties": false, + "unevaluatedProperties": false, "required": [ "desktopAgent" ] diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json index 3c4f54d5f..6fc223518 100644 --- a/schemas/bridging/bridgeRequest.schema.json +++ b/schemas/bridging/bridgeRequest.schema.json @@ -36,7 +36,7 @@ "source": { "title": "Source identifier", "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "$ref": "common.schema.json#/$defs/RequestSource" + "$ref": "common.schema.json#/$defs/BridgeRequestSource" }, "destination": { "title": "Destination identifier", diff --git a/schemas/bridging/broadcastAgentRequest.schema.json b/schemas/bridging/broadcastAgentRequest.schema.json index f9faa2795..a8f1e1e06 100644 --- a/schemas/bridging/broadcastAgentRequest.schema.json +++ b/schemas/bridging/broadcastAgentRequest.schema.json @@ -49,6 +49,7 @@ "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, + "required": ["source"], "additionalProperties": false } }, diff --git a/schemas/bridging/common.schema.json b/schemas/bridging/common.schema.json index 06854c600..7efc0ba31 100644 --- a/schemas/bridging/common.schema.json +++ b/schemas/bridging/common.schema.json @@ -59,6 +59,25 @@ "description": "Field that represents the source Desktop Agent that a response was received from.", "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, + "BridgeRequestSource": { + "title": "Bridge Source identifier", + "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", + "oneOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "allOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + } + ] + } + ] + }, "BridgeParticipantIdentifier": { "title": "Bridge Participant Identifier", "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", diff --git a/schemas/bridging/openAgentRequest.schema.json b/schemas/bridging/openAgentRequest.schema.json index e72813efd..13f4cbf01 100644 --- a/schemas/bridging/openAgentRequest.schema.json +++ b/schemas/bridging/openAgentRequest.schema.json @@ -47,6 +47,7 @@ "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, + "required": ["source"], "additionalProperties": false } }, diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 68ac5b997..c820f38f1 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -342,6 +342,7 @@ export interface BridgeParticipantIdentifier { * instance of the application described. */ instanceId?: string; + [property: string]: any; } /** @@ -403,6 +404,7 @@ export interface SourceIdentifier { * instance of the application described. */ instanceId?: string; + [property: string]: any; } /** @@ -462,12 +464,13 @@ export interface BridgeErrorResponseMessage { /** * Metadata required in a response message collated and/or forwarded on by the Bridge */ -export interface BridgeErrorResponseMessageMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; +export interface DesktopAgentIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; + [property: string]: any; } /** @@ -510,10 +513,72 @@ export interface BridgeRequestMetadata { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceIdentifier; + source: BridgeSourceIdentifier; timestamp: Date; } +/** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface BridgeSourceIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + /** * A response message from the Bridge back to the original Desktop Agent that raised the * request. @@ -570,7 +635,7 @@ export interface BroadcastAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source: SourceObject; timestamp: Date; } @@ -614,7 +679,7 @@ export interface BroadcastAgentRequestMeta { * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. */ -export interface SourceClass { +export interface SourceObject { /** * The unique application identifier located within a specific application directory * instance. An example of an appId might be 'app@sub.root' @@ -633,6 +698,7 @@ export interface SourceClass { * instance of the application described. */ instanceId?: string; + [property: string]: any; } /** @@ -686,10 +752,72 @@ export interface BroadcastBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + */ +export interface MetaSource { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -1073,7 +1201,7 @@ export interface FindInstancesAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -1133,6 +1261,17 @@ export interface PurpleBridgeParticipantIdentifier { * identify the Desktop Agent to target. */ desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; } /** @@ -1172,6 +1311,7 @@ export interface AppIdentifier { * instance of the application described. */ instanceId?: string; + [property: string]: any; } /** @@ -1402,7 +1542,7 @@ export interface FindInstancesBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -1518,7 +1658,7 @@ export interface FindIntentsAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; /** * Optional field that represents the destination that the request should be routed to. Must @@ -1671,7 +1811,7 @@ export interface FindIntentBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; /** * Optional field that represents the destination that the request should be routed to. Must @@ -1795,7 +1935,7 @@ export interface FindIntentsByContextAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; /** * Optional field that represents the destination that the request should be routed to. Must @@ -1918,7 +2058,7 @@ export interface FindIntentsByContextBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; /** * Optional field that represents the destination that the request should be routed to. Must @@ -2046,7 +2186,7 @@ export interface GetAppMetadataAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -2168,7 +2308,7 @@ export interface GetAppMetadataBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -2315,7 +2455,7 @@ export interface OpenAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source: SourceObject; timestamp: Date; } @@ -2438,7 +2578,7 @@ export interface OpenBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -2521,7 +2661,7 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -2591,6 +2731,7 @@ export interface FluffyBridgeParticipantIdentifier { * instance of the application described. */ instanceId?: string; + [property: string]: any; } /** @@ -2640,7 +2781,7 @@ export interface PrivateChannelBroadcastBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -2691,7 +2832,7 @@ export interface PrivateChannelEventListenerAddedAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -2736,7 +2877,7 @@ export interface PrivateChannelEventListenerAddedBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -2781,7 +2922,7 @@ export interface PrivateChannelEventListenerRemovedAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -2826,7 +2967,7 @@ export interface PrivateChannelEventListenerRemovedBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -2871,7 +3012,7 @@ export interface PrivateChannelOnAddContextListenerAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -2916,7 +3057,7 @@ export interface PrivateChannelOnAddContextListenerBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -2961,7 +3102,7 @@ export interface PrivateChannelOnDisconnectAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -3005,7 +3146,7 @@ export interface PrivateChannelOnDisconnectBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -3049,7 +3190,7 @@ export interface PrivateChannelOnUnsubscribeAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceClass; + source?: SourceObject; timestamp: Date; } @@ -3094,7 +3235,7 @@ export interface ERequestMetadata { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -3179,7 +3320,7 @@ export interface RaiseIntentAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: SourceObject; timestamp: Date; } @@ -3347,7 +3488,7 @@ export interface RaiseIntentBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: SourceClass; + source: MetaSource; timestamp: Date; } @@ -4466,7 +4607,7 @@ const typeMap: any = { { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - false + 'any' ), SourceIdentifier: o( [ @@ -4474,7 +4615,7 @@ const typeMap: any = { { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - false + 'any' ), AgentResponseMessage: o( [ @@ -4502,7 +4643,7 @@ const typeMap: any = { ], false ), - ResponseErrorMessagePayload: o([{ json: 'error', js: 'error', typ: u(undefined, r('ResponseErrorDetail')) }], 'any'), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), BridgeRequestMessage: o( [ { json: 'meta', js: 'meta', typ: r('BridgeRequestMetadata') }, @@ -4515,11 +4656,19 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceIdentifier') }, + { json: 'source', js: 'source', typ: r('BridgeSourceIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), + BridgeSourceIdentifier: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), BridgeResponseMessage: o( [ { json: 'meta', js: 'meta', typ: r('BridgeResponseMessageMeta') }, @@ -4550,18 +4699,18 @@ const typeMap: any = { BroadcastAgentRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: r('SourceObject') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - SourceClass: o( + SourceObject: o( [ { json: 'appId', js: 'appId', typ: '' }, { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - false + 'any' ), BroadcastAgentRequestPayload: o( [ @@ -4589,11 +4738,19 @@ const typeMap: any = { BroadcastBridgeRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), + MetaSource: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), BroadcastBridgeRequestPayload: o( [ { json: 'channelId', js: 'channelId', typ: '' }, @@ -4748,12 +4905,19 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PurpleBridgeParticipantIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), + PurpleBridgeParticipantIdentifier: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), FindInstancesAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), AppIdentifier: o( [ @@ -4761,7 +4925,7 @@ const typeMap: any = { { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - false + 'any' ), FindInstancesAgentResponse: o( [ @@ -4849,7 +5013,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -4907,7 +5071,7 @@ const typeMap: any = { FindIntentsAgentRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], @@ -4982,7 +5146,7 @@ const typeMap: any = { FindIntentBridgeRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], @@ -5044,7 +5208,7 @@ const typeMap: any = { FindIntentsByContextAgentRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], @@ -5102,7 +5266,7 @@ const typeMap: any = { FindIntentsByContextBridgeRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], @@ -5162,7 +5326,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5217,7 +5381,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5273,7 +5437,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: r('SourceObject') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5334,7 +5498,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5378,7 +5542,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5389,7 +5553,7 @@ const typeMap: any = { { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], - false + 'any' ), PrivateChannelBroadcastAgentRequestPayload: o( [ @@ -5410,7 +5574,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5434,7 +5598,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5458,7 +5622,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5482,7 +5646,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5506,7 +5670,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5530,7 +5694,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5554,7 +5718,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5578,7 +5742,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5596,7 +5760,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5614,7 +5778,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceClass')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5638,7 +5802,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5680,7 +5844,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: r('FluffyBridgeParticipantIdentifier') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('SourceObject') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5753,7 +5917,7 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: r('FluffyBridgeParticipantIdentifier') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('SourceClass') }, + { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false From fc90cc1b4fc20add74313b55740cc6ed78ff9887 Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 18:18:54 +0100 Subject: [PATCH 075/106] regenerate BridgingTypes.ts and copy schemas to website --- src/bridging/BridgingTypes.ts | 38 +- website/static/schemas/next/api/README.md | 10 + .../static/schemas/next/api/api.schema.json | 450 ++++++++++++++++++ .../next/api/appIdentifier.schema.json | 22 - .../schemas/next/api/appIntent.schema.json | 23 - .../schemas/next/api/appMetadata.schema.json | 54 --- .../baseImplementationMetadata.schema.json | 80 ++-- .../schemas/next/api/channel.schema.json | 28 -- .../next/api/contextMetadata.schema.json | 16 - .../api/desktopAgentIdentifier.schema.json | 16 - .../next/api/displayMetadata.schema.json | 19 - .../schemas/next/api/errors.schema.json | 57 --- .../static/schemas/next/api/icon.schema.json | 22 - .../static/schemas/next/api/image.schema.json | 25 - .../api/implementationMetadata.schema.json | 31 -- .../next/api/intentMetadata.schema.json | 19 - .../next/api/intentResolution.schema.json | 23 - .../schemas/next/api/intentResult.schema.json | 15 - .../schemas/next/api/t2sQuicktypeUtil.js | 64 +++ .../bridging/agentErrorResponse.schema.json | 40 ++ .../next/bridging/agentRequest.schema.json | 35 +- .../next/bridging/agentResponse.schema.json | 28 +- .../bridging/bridgeErrorResponse.schema.json | 55 +++ .../bridgeParticipantIdentifier.schema.json | 23 - .../next/bridging/bridgeRequest.schema.json | 11 +- .../next/bridging/bridgeResponse.schema.json | 35 +- .../broadcastAgentRequest.schema.json | 23 +- .../broadcastBridgeRequest.schema.json | 6 +- .../schemas/next/bridging/common.schema.json | 137 ++++++ .../next/bridging/connectionStep.schema.json | 51 ++ .../bridging/connectionStep2Hello.schema.json | 98 ++-- .../connectionStep3Handshake.schema.json | 106 +++-- ...ctionStep4AuthenticationFailed.schema.json | 75 +-- ...tionStep6ConnectedAgentsUpdate.schema.json | 118 +++-- ...indInstancesAgentErrorResponse.schema.json | 47 ++ .../findInstancesAgentRequest.schema.json | 18 +- .../findInstancesAgentResponse.schema.json | 17 +- ...ndInstancesBridgeErrorResponse.schema.json | 14 + .../findInstancesBridgeRequest.schema.json | 6 +- .../findInstancesBridgeResponse.schema.json | 29 +- .../findIntentAgentErrorResponse.schema.json | 47 ++ .../findIntentAgentRequest.schema.json | 16 +- .../findIntentAgentResponse.schema.json | 17 +- .../findIntentBridgeErrorResponse.schema.json | 15 + .../findIntentBridgeRequest.schema.json | 6 +- .../findIntentBridgeResponse.schema.json | 30 +- ...ntsByContextAgentErrorResponse.schema.json | 47 ++ ...ndIntentsByContextAgentRequest.schema.json | 14 +- ...dIntentsByContextAgentResponse.schema.json | 17 +- ...tsByContextBridgeErrorResponse.schema.json | 14 + ...dIntentsByContextBridgeRequest.schema.json | 6 +- ...IntentsByContextBridgeResponse.schema.json | 31 +- ...tAppMetadataAgentErrorResponse.schema.json | 47 ++ .../getAppMetadataAgentRequest.schema.json | 17 +- .../getAppMetadataAgentResponse.schema.json | 16 +- ...AppMetadataBridgeErrorResponse.schema.json | 14 + .../getAppMetadataBridgeRequest.schema.json | 6 +- .../getAppMetadataBridgeResponse.schema.json | 28 +- .../openAgentErrorResponse.schema.json | 47 ++ .../bridging/openAgentRequest.schema.json | 17 +- .../bridging/openAgentResponse.schema.json | 16 +- .../openBridgeErrorResponse.schema.json | 14 + .../bridging/openBridgeRequest.schema.json | 6 +- .../bridging/openBridgeResponse.schema.json | 28 +- ...teChannelBroadcastAgentRequest.schema.json | 28 +- ...eChannelBroadcastBridgeRequest.schema.json | 6 +- ...EventListenerAddedAgentRequest.schema.json | 16 +- ...ventListenerAddedBridgeRequest.schema.json | 6 +- ...entListenerRemovedAgentRequest.schema.json | 16 +- ...ntListenerRemovedBridgeRequest.schema.json | 6 +- ...AddContextListenerAgentRequest.schema.json | 16 +- ...ddContextListenerBridgeRequest.schema.json | 6 +- ...hannelOnDisconnectAgentRequest.schema.json | 16 +- ...annelOnDisconnectBridgeRequest.schema.json | 6 +- ...annelOnUnsubscribeAgentRequest.schema.json | 16 +- ...nnelOnUnsubscribeBridgeRequest.schema.json | 4 +- .../raiseIntentAgentErrorResponse.schema.json | 47 ++ .../raiseIntentAgentRequest.schema.json | 17 +- .../raiseIntentAgentResponse.schema.json | 16 +- ...raiseIntentBridgeErrorResponse.schema.json | 14 + .../raiseIntentBridgeRequest.schema.json | 6 +- .../raiseIntentBridgeResponse.schema.json | 28 +- ...IntentResultAgentErrorResponse.schema.json | 47 ++ ...raiseIntentResultAgentResponse.schema.json | 19 +- ...ntentResultBridgeErrorResponse.schema.json | 14 + ...aiseIntentResultBridgeResponse.schema.json | 22 +- .../schemas/next/bridgingAsyncAPI/README.md | 38 ++ .../bridgingAsyncAPI/bridgingAsyncAPI.json | 407 ++++++++++++++++ 88 files changed, 2295 insertions(+), 1022 deletions(-) create mode 100644 website/static/schemas/next/api/README.md create mode 100644 website/static/schemas/next/api/api.schema.json delete mode 100644 website/static/schemas/next/api/appIdentifier.schema.json delete mode 100644 website/static/schemas/next/api/appIntent.schema.json delete mode 100644 website/static/schemas/next/api/appMetadata.schema.json delete mode 100644 website/static/schemas/next/api/channel.schema.json delete mode 100644 website/static/schemas/next/api/contextMetadata.schema.json delete mode 100644 website/static/schemas/next/api/desktopAgentIdentifier.schema.json delete mode 100644 website/static/schemas/next/api/displayMetadata.schema.json delete mode 100644 website/static/schemas/next/api/errors.schema.json delete mode 100644 website/static/schemas/next/api/icon.schema.json delete mode 100644 website/static/schemas/next/api/image.schema.json delete mode 100644 website/static/schemas/next/api/implementationMetadata.schema.json delete mode 100644 website/static/schemas/next/api/intentMetadata.schema.json delete mode 100644 website/static/schemas/next/api/intentResolution.schema.json delete mode 100644 website/static/schemas/next/api/intentResult.schema.json create mode 100644 website/static/schemas/next/api/t2sQuicktypeUtil.js create mode 100644 website/static/schemas/next/bridging/agentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/bridgeErrorResponse.schema.json delete mode 100644 website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json create mode 100644 website/static/schemas/next/bridging/common.schema.json create mode 100644 website/static/schemas/next/bridging/connectionStep.schema.json create mode 100644 website/static/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentAgentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/openAgentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/openBridgeErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json create mode 100644 website/static/schemas/next/bridgingAsyncAPI/README.md create mode 100644 website/static/schemas/next/bridgingAsyncAPI/bridgingAsyncAPI.json diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index c820f38f1..3f99c36b9 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -181,6 +181,7 @@ export interface DesktopAgentIdentifier { * particular Desktop Agent. */ desktopAgent: string; + [property: string]: any; } /** @@ -464,13 +465,12 @@ export interface BridgeErrorResponseMessage { /** * Metadata required in a response message collated and/or forwarded on by the Bridge */ -export interface DesktopAgentIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent: string; - [property: string]: any; +export interface BridgeErrorResponseMessageMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; } /** @@ -524,17 +524,17 @@ export interface BridgeRequestMetadata { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge * before the timeout or because an error occurred. May be omitted if all sources responded * without errors. MUST include the `desktopAgent` field when returned by the bridge. @@ -776,17 +776,17 @@ export interface BroadcastBridgeRequestMeta { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no * app details are available or are appropriate. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge * before the timeout or because an error occurred. May be omitted if all sources responded * without errors. MUST include the `desktopAgent` field when returned by the bridge. @@ -4582,7 +4582,7 @@ const typeMap: any = { ], false ), - DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], false), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), ErrorResponseMessagePayload: o([{ json: 'error', js: 'error', typ: r('ResponseErrorDetail') }], 'any'), AgentRequestMessage: o( [ @@ -4643,7 +4643,7 @@ const typeMap: any = { ], false ), - DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), + ResponseErrorMessagePayload: o([{ json: 'error', js: 'error', typ: u(undefined, r('ResponseErrorDetail')) }], 'any'), BridgeRequestMessage: o( [ { json: 'meta', js: 'meta', typ: r('BridgeRequestMetadata') }, diff --git a/website/static/schemas/next/api/README.md b/website/static/schemas/next/api/README.md new file mode 100644 index 000000000..c782f2e7a --- /dev/null +++ b/website/static/schemas/next/api/README.md @@ -0,0 +1,10 @@ +# Intro + +Quicktype, the chosen generation tool currently has some limitations that prevent fully automatic schema generation from the existing TS types. For example it can not handle interfaces that contain methods in their definition. It also fails to generate schemas even if a type contains unused references to other types or interfaces that contain async functions (Promise return types). Therefore, in order to generate the `api\schemas\api.schema.json` some manual intervention was needed. + +Once these limitations are not an issue the `api\schemas\t2sQuicktypeUtil.js` script should be moved to the root level of the project and a new npm script `"api-schema-gen": "node t2sQuicktypeUtil.js src/api schemas/api/api.schema.json"` should be added. + +`api\schemas\api.schema.json` - partially auto-generated schema from the existing `src\api` types. +`api\schemas\baseImplementationMetadata.schema.json` - Used by bridging types that leave out the metadata of the calling application as it does not apply to bridging. +`api\schemas\intentResolution.schema.json` - At the moment it is not possible to auto-generate this due to limitations in the generation tool (quicktype) +`api\schemas\t2sQuicktypeUtil.js` - Script used to run the generation of the schema from the types. Should be moved to the root level of the repo once fully-automated generation can be achieved. diff --git a/website/static/schemas/next/api/api.schema.json b/website/static/schemas/next/api/api.schema.json new file mode 100644 index 000000000..d96ba28ee --- /dev/null +++ b/website/static/schemas/next/api/api.schema.json @@ -0,0 +1,450 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/api/api.schema.json", + "definitions": { + "AppIdentifier": { + "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application instances.\n\nWill always include at least an `appId` field, which uniquely identifies a specific app.\n\nIf the `instanceId` field is set then the `AppMetadata` object represents a specific instance of the application that may be addressed using that Id.", + "title": "AppIdentifier", + "type": "object", + "properties": { + "appId": { + "description": "The unique application identifier located within a specific application directory instance. An example of an appId might be 'app@sub.root'", + "type": "string", + "title": "appId" + }, + "instanceId": { + "description": "An optional instance identifier, indicating that this object represents a specific instance of the application described.", + "type": "string", + "title": "instanceId" + }, + "desktopAgent": { + "description": "The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to identify the Desktop Agent to target.", + "type": "string", + "title": "desktopAgent" + } + }, + "unevaluatedProperties": false, + "required": [ + "appId" + ] + }, + "Icon": { + "description": "SPDX-License-Identifier: Apache-2.0\nCopyright FINOS FDC3 contributors - see NOTICE file", + "title": "Icon", + "type": "object", + "properties": { + "src": { + "description": "The icon url", + "type": "string", + "title": "src" + }, + "size": { + "description": "The icon dimension, formatted as `x`.", + "type": "string", + "title": "size" + }, + "type": { + "description": "Icon media type. If not present the Desktop Agent may use the src file extension.", + "type": "string", + "title": "type" + } + }, + "additionalProperties": false, + "required": [ + "src" + ] + }, + "Image": { + "description": "SPDX-License-Identifier: Apache-2.0\nCopyright FINOS FDC3 contributors - see NOTICE file", + "title": "Image", + "type": "object", + "properties": { + "src": { + "description": "The image url.", + "type": "string", + "title": "src" + }, + "size": { + "description": "The image dimension, formatted as `x`.", + "type": "string", + "title": "size" + }, + "type": { + "description": "Image media type. If not present the Desktop Agent may use the src file extension.", + "type": "string", + "title": "type" + }, + "label": { + "description": "Caption for the image.", + "type": "string", + "title": "label" + } + }, + "additionalProperties": false, + "required": [ + "src" + ] + }, + "AppMetadata": { + "description": "Extends an `AppIdentifier`, describing an application or instance of an application, with additional descriptive metadata that is usually provided by an FDC3 App Directory that the desktop agent connects to.\n\nThe additional information from an app directory can aid in rendering UI elements, such as a launcher menu or resolver UI. This includes a title, description, tooltip and icon and screenshot URLs.\n\nNote that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc.", + "title": "AppMetadata", + "type": "object", + "properties": { + "name": { + "description": "The 'friendly' app name. \nThis field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now require an `AppIdentifier` wth `appId` set. \nNote that for display purposes the `title` field should be used, if set, in preference to this field.", + "type": "string", + "title": "name" + }, + "version": { + "description": "The Version of the application.", + "type": "string", + "title": "version" + }, + "instanceMetadata": { + "description": "An optional set of, implementation specific, metadata fields that can be used to disambiguate instances, such as a window title or screen position. Must only be set if `instanceId` is set.", + "type": "object", + "additionalProperties": {}, + "title": "instanceMetadata" + }, + "title": { + "description": "A more user-friendly application title that can be used to render UI elements", + "type": "string", + "title": "title" + }, + "tooltip": { + "description": "A tooltip for the application that can be used to render UI elements", + "type": "string", + "title": "tooltip" + }, + "description": { + "description": "A longer, multi-paragraph description for the application that could include markup", + "type": "string", + "title": "description" + }, + "icons": { + "description": "A list of icon URLs for the application that can be used to render UI elements", + "type": "array", + "items": { + "$ref": "#/definitions/Icon" + }, + "title": "icons" + }, + "screenshots": { + "description": "Images representing the app in common usage scenarios that can be used to render UI elements", + "type": "array", + "items": { + "$ref": "#/definitions/Image" + }, + "title": "screenshots" + }, + "resultType": { + "description": "The type of output returned for any intent specified during resolution. May express a particular context type (e.g. \"fdc3.instrument\"), channel (e.g. \"channel\") or a channel that will receive a specified type (e.g. \"channel\").", + "type": [ + "null", + "string" + ], + "title": "resultType" + }, + "appId": { + "description": "The unique application identifier located within a specific application directory instance. An example of an appId might be 'app@sub.root'", + "type": "string", + "title": "appId" + }, + "instanceId": { + "description": "An optional instance identifier, indicating that this object represents a specific instance of the application described.", + "type": "string", + "title": "instanceId" + }, + "desktopAgent": { + "description": "The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to identify the Desktop Agent to target.", + "type": "string", + "title": "desktopAgent" + } + }, + "additionalProperties": false, + "required": [ + "appId" + ] + }, + "IntentMetadata": { + "description": "Intent descriptor", + "title": "IntentMetadata", + "type": "object", + "properties": { + "name": { + "description": "The unique name of the intent that can be invoked by the raiseIntent call", + "type": "string", + "title": "name" + }, + "displayName": { + "description": "Display name for the intent.", + "type": "string", + "title": "displayName" + } + }, + "additionalProperties": false, + "required": [ + "displayName", + "name" + ] + }, + "AppIntent": { + "description": "An interface that relates an intent to apps", + "title": "AppIntent", + "type": "object", + "properties": { + "intent": { + "$ref": "#/definitions/IntentMetadata", + "description": "Details of the intent whose relationship to resolving applications is being described.", + "title": "intent" + }, + "apps": { + "description": "Details of applications that can resolve the intent.", + "type": "array", + "items": { + "$ref": "#/definitions/AppMetadata" + }, + "title": "apps" + } + }, + "additionalProperties": false, + "required": [ + "apps", + "intent" + ] + }, + "DisplayMetadata": { + "description": "A system channel will be global enough to have a presence across many apps. This gives us some hints\nto render them in a standard way. It is assumed it may have other properties too, but if it has these,\nthis is their meaning.", + "title": "DisplayMetadata", + "type": "object", + "properties": { + "name": { + "description": "A user-readable name for this channel, e.g: `\"Red\"`", + "type": "string", + "title": "name" + }, + "color": { + "description": "The color that should be associated within this channel when displaying this channel in a UI, e.g: `0xFF0000`.", + "type": "string", + "title": "color" + }, + "glyph": { + "description": "A URL of an image that can be used to display this channel", + "type": "string", + "title": "glyph" + } + }, + "additionalProperties": false + }, + "Channel": { + "description": "Represents a context channel that applications can use to send and receive\ncontext data.\n\nPlease note that There are differences in behavior when you interact with a\nUser channel via the `DesktopAgent` interface and the `Channel` interface.\nSpecifically, when 'joining' a User channel or adding a context listener\nwhen already joined to a channel via the `DesktopAgent` interface, existing\ncontext (matching the type of the context listener) on the channel is\nreceived by the context listener immediately. Whereas, when a context\nlistener is added via the Channel interface, context is not received\nautomatically, but may be retrieved manually via the `getCurrentContext()`\nfunction.", + "title": "Channel", + "type": "object", + "properties": { + "id": { + "description": "Constant that uniquely identifies this channel.", + "type": "string", + "title": "id" + }, + "type": { + "description": "Uniquely defines each channel type.\nCan be \"user\", \"app\" or \"private\".", + "enum": [ + "app", + "private", + "user" + ], + "type": "string", + "title": "type" + }, + "displayMetadata": { + "description": "Channels may be visualized and selectable by users. DisplayMetadata may be used to provide hints on how to see them.\nFor App channels, displayMetadata would typically not be present.", + "$ref": "#/definitions/DisplayMetadata", + "title": "displayMetadata" + } + }, + "additionalProperties": false, + "required": [ + "id", + "type" + ] + }, + "ContextMetadata": { + "description": "Metadata relating to a context or intent and context received through the\n`addContextListener` and `addIntentListener` functions.", + "title": "ContextMetadata", + "type": "object", + "properties": { + "source": { + "$ref": "#/definitions/AppIdentifier", + "description": "Identifier for the app instance that sent the context and/or intent.", + "title": "source" + } + }, + "additionalProperties": false, + "required": [ + "source" + ] + }, + "DesktopAgentIdentifier": { + "description": "Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios\nwhere a request needs to be directed to a Desktop Agent rather than a specific app, or a\nresponse message is returned by the Desktop Agent (or more specifically its resolver)\nrather than a specific app. Used as a substitute for `AppIdentifier` in cases where no\napp details are available or are appropriate.", + "title": "DesktopAgentIdentifier", + "type": "object", + "properties": { + "desktopAgent": { + "description": "Used in Desktop Agent Bridging to attribute or target a message to a\nparticular Desktop Agent.", + "type": "string", + "title": "desktopAgent" + } + }, + "unevaluatedProperties": false, + "required": [ + "desktopAgent" + ] + }, + "OpenError": { + "description": "Constants representing the errors that can be encountered when calling the `open` method on the DesktopAgent object (`fdc3`).", + "title": "OpenError", + "enum": [ + "AppNotFound", + "AppTimeout", + "DesktopAgentNotFound", + "ErrorOnLaunch", + "MalformedContext", + "ResolverUnavailable" + ], + "type": "string" + }, + "ResolveError": { + "description": "Constants representing the errors that can be encountered when calling the `findIntent`, `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the DesktopAgent (`fdc3`).", + "title": "ResolveError", + "enum": [ + "DesktopAgentNotFound", + "IntentDeliveryFailed", + "MalformedContext", + "NoAppsFound", + "ResolverTimeout", + "ResolverUnavailable", + "TargetAppUnavailable", + "TargetInstanceUnavailable", + "UserCancelledResolution" + ], + "type": "string" + }, + "ResultError": { + "title": "ResultError", + "enum": [ + "IntentHandlerRejected", + "NoResultReturned" + ], + "type": "string" + }, + "ChannelError": { + "title": "ChannelError", + "enum": [ + "AccessDenied", + "CreationFailed", + "MalformedContext", + "NoChannelFound" + ], + "type": "string" + }, + "BridgingError": { + "title": "BridgingError", + "enum": [ + "AgentDisconnected", + "NotConnectedToBridge", + "ResponseToBridgeTimedOut", + "MalformedMessage" + ], + "type": "string" + }, + "ImplementationMetadata": { + "description": "Metadata relating to the FDC3 Desktop Agent implementation and its provider.", + "title": "ImplementationMetadata", + "type": "object", + "properties": { + "fdc3Version": { + "description": "The version number of the FDC3 specification that the implementation provides.\nThe string must be a numeric semver version, e.g. 1.2 or 1.2.1.", + "type": "string", + "title": "fdc3Version" + }, + "provider": { + "description": "The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, OpenFin etc.).", + "type": "string", + "title": "provider" + }, + "providerVersion": { + "description": "The version of the provider of the Desktop Agent implementation (e.g. 5.3.0).", + "type": "string", + "title": "providerVersion" + }, + "optionalFeatures": { + "description": "Metadata indicating whether the Desktop Agent implements optional features of\nthe Desktop Agent API.", + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "description": "Used to indicate whether the exposure of 'originating app metadata' for\ncontext and intent messages is supported by the Desktop Agent.", + "type": "boolean", + "title": "OriginatingAppMetadata" + }, + "UserChannelMembershipAPIs": { + "description": "Used to indicate whether the optional `fdc3.joinUserChannel`,\n`fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by\nthe Desktop Agent.", + "type": "boolean", + "title": "UserChannelMembershipAPIs" + }, + "DesktopAgentBridging": { + "description": "Used to indicate whether the experimental Desktop Agent Bridging\nfeature is implemented by the Desktop Agent.", + "type": "boolean", + "title": "DesktopAgentBridging" + } + }, + "additionalProperties": false, + "required": [ + "DesktopAgentBridging", + "OriginatingAppMetadata", + "UserChannelMembershipAPIs" + ], + "title": "optionalFeatures" + }, + "appMetadata": { + "$ref": "#/definitions/AppMetadata", + "description": "The calling application instance's own metadata, according to the Desktop Agent (MUST include at least the `appId` and `instanceId`).", + "title": "appMetadata" + } + }, + "additionalProperties": false, + "required": [ + "appMetadata", + "fdc3Version", + "optionalFeatures", + "provider" + ] + }, + "IntentResolution": { + "description": "IntentResolution provides a standard format for data returned upon resolving an intent.\n\n```javascript\n//resolve a \"Chain\" type intent\nlet resolution = await agent.raiseIntent(\"intentName\", context);\n\n//resolve a \"Client-Service\" type intent with a data response or a Channel\nlet resolution = await agent.raiseIntent(\"intentName\", context);\ntry {\n\t const result = await resolution.getResult();\n if (result && result.broadcast) {\n console.log(`${resolution.source} returned a channel with id ${result.id}`);\n } else if (result){\n console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`);\n } else {\n console.error(`${resolution.source} didn't return data`\n }\n} catch(error) {\n console.error(`${resolution.source} returned an error: ${error}`);\n}\n\n// Use metadata about the resolving app instance to target a further intent\nawait agent.raiseIntent(\"intentName\", context, resolution.source);\n```", + "title": "IntentResolution", + "type": "object", + "properties": { + "source": { + "$ref": "#/definitions/AppIdentifier", + "description": "Identifier for the app instance that was selected (or started) to resolve the intent.\n`source.instanceId` MUST be set, indicating the specific app instance that\nreceived the intent.", + "title": "source" + }, + "intent": { + "description": "The intent that was raised. May be used to determine which intent the user\nchose in response to `fdc3.raiseIntentForContext()`.", + "type": "string", + "title": "intent" + }, + "version": { + "description": "The version number of the Intents schema being used.", + "type": "string", + "title": "version" + } + }, + "additionalProperties": false, + "required": [ + "intent", + "source" + ] + } + } +} diff --git a/website/static/schemas/next/api/appIdentifier.schema.json b/website/static/schemas/next/api/appIdentifier.schema.json deleted file mode 100644 index 6bd36fdb2..000000000 --- a/website/static/schemas/next/api/appIdentifier.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/appIdentifier.schema.json", - "title": "AppIdentifier", - "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls at specific applications.", - "type": "object", - "properties": { - "appId": { - "type": "string" - }, - "instanceId": { - "type": "string" - }, - "desktopAgent": { - "type": "string" - } - }, - "required": [ - "appId" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/appIntent.schema.json b/website/static/schemas/next/api/appIntent.schema.json deleted file mode 100644 index 1f2315d37..000000000 --- a/website/static/schemas/next/api/appIntent.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/appIntent.schema.json", - "title": "AppIntent", - "description": "Represents the binding of an intent to apps", - "type": "object", - "properties": { - "intent": { - "$ref": "intentMetadata.schema.json" - }, - "apps": { - "type": "array", - "items": { - "$ref": "appMetadata.schema.json" - } - } - }, - "required": [ - "intent", - "apps" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/appMetadata.schema.json b/website/static/schemas/next/api/appMetadata.schema.json deleted file mode 100644 index 14bfc1a8f..000000000 --- a/website/static/schemas/next/api/appMetadata.schema.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/appMetadata.schema.json", - "title": "AppMetadata", - "description": "Extends an AppIdentifier, describing an application or instance of an application.", - "type": "object", - "allOf": [ - { - "$ref": "appIdentifier.schema.json" - } - ], - "properties": { - "appId": true, - "instanceId": true, - "desktopAgent": true, - "name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "instanceMetadata": { - "type": "object" - }, - "title": { - "type": "string" - }, - "tooltip": { - "type": "string" - }, - "description": { - "type": "string" - }, - "icons": { - "type": "array", - "items": { - "$ref": "icon.schema.json" - } - }, - "screenshots": { - "type": "array", - "items": { - "$ref": "image.schema.json" - } - }, - "resultType": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/baseImplementationMetadata.schema.json b/website/static/schemas/next/api/baseImplementationMetadata.schema.json index a07bc7cfa..28050a414 100644 --- a/website/static/schemas/next/api/baseImplementationMetadata.schema.json +++ b/website/static/schemas/next/api/baseImplementationMetadata.schema.json @@ -2,43 +2,57 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/api/baseImplementationMetadata.schema.json", "title": "BaseImplementationMetadata", - "description": "Base of Implementation Metadata used by Bridging that leaves out the metadata of the calling application (appMetadata)", + "description": "Metadata relating to the FDC3 Desktop Agent implementation and its provider.", "type": "object", "properties": { - "fdc3Version": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "providerVersion": { - "type": "string" - }, - "optionalFeatures": { - "type": "object", - "properties": { - "OriginatingAppMetadata": { - "type": "boolean" - }, - "UserChannelMembershipAPIs": { - "type": "boolean" - }, - "DesktopAgentBridging": { - "type": "boolean" - } + "fdc3Version": { + "description": "The version number of the FDC3 specification that the implementation provides.\nThe string must be a numeric semver version, e.g. 1.2 or 1.2.1.", + "type": "string", + "title": "fdc3Version" }, - "required": [ - "OriginatingAppMetadata", - "UserChannelMembershipAPIs", - "DesktopAgentBridging" - ], - "additionalProperties": false - } + "provider": { + "description": "The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, OpenFin etc.).", + "type": "string", + "title": "provider" + }, + "providerVersion": { + "description": "The version of the provider of the Desktop Agent implementation (e.g. 5.3.0).", + "type": "string", + "title": "providerVersion" + }, + "optionalFeatures": { + "description": "Metadata indicating whether the Desktop Agent implements optional features of\nthe Desktop Agent API.", + "type": "object", + "properties": { + "OriginatingAppMetadata": { + "description": "Used to indicate whether the exposure of 'originating app metadata' for\ncontext and intent messages is supported by the Desktop Agent.", + "type": "boolean", + "title": "OriginatingAppMetadata" + }, + "UserChannelMembershipAPIs": { + "description": "Used to indicate whether the optional `fdc3.joinUserChannel`,\n`fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by\nthe Desktop Agent.", + "type": "boolean", + "title": "UserChannelMembershipAPIs" + }, + "DesktopAgentBridging": { + "description": "Used to indicate whether the experimental Desktop Agent Bridging\nfeature is implemented by the Desktop Agent.", + "type": "boolean", + "title": "DesktopAgentBridging" + } + }, + "additionalProperties": false, + "required": [ + "DesktopAgentBridging", + "OriginatingAppMetadata", + "UserChannelMembershipAPIs" + ], + "title": "optionalFeatures" + } }, + "additionalProperties": false, "required": [ "fdc3Version", - "provider", - "optionalFeatures" - ], - "additionalProperties": false + "optionalFeatures", + "provider" + ] } \ No newline at end of file diff --git a/website/static/schemas/next/api/channel.schema.json b/website/static/schemas/next/api/channel.schema.json deleted file mode 100644 index 76c80ce80..000000000 --- a/website/static/schemas/next/api/channel.schema.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/channel.schema.json", - "title": "Channel", - "description": "Represents a context channel that applications can join to share context data.", - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "user", - "app", - "private" - ] - }, - "displayMetadata": { - "$ref": "displayMetadata.schema.json" - } - }, - "required": [ - "id", - "type" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/contextMetadata.schema.json b/website/static/schemas/next/api/contextMetadata.schema.json deleted file mode 100644 index 29dd86436..000000000 --- a/website/static/schemas/next/api/contextMetadata.schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/contextMetadata.schema.json", - "title": "ContextMetadata", - "description": "Metadata relating to a context or intent & context received through the addContextListener and addIntentListener functions.", - "type": "object", - "properties": { - "source": { - "$ref": "appIdentifier.schema.json" - } - }, - "required": [ - "source" - ], - "additionalProperties": false -} diff --git a/website/static/schemas/next/api/desktopAgentIdentifier.schema.json b/website/static/schemas/next/api/desktopAgentIdentifier.schema.json deleted file mode 100644 index 471a65d05..000000000 --- a/website/static/schemas/next/api/desktopAgentIdentifier.schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/desktopAgentIdentifier.schema.json", - "title": "DesktopAgentIdentifier", - "description": "Identifies a particular Desktop Agent. Used by Desktop Agent Bridging to indicate the source or destination of a message which was produced by or should be processed by the Desktop Agent itself rather than a specific application. Often added to messages by the Desktop Agent Bridge.", - "type": "object", - "properties": { - "desktopAgent": { - "type": "string" - } - }, - "required": [ - "desktopAgent" - ], - "unevaluatedProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/displayMetadata.schema.json b/website/static/schemas/next/api/displayMetadata.schema.json deleted file mode 100644 index a83f5ef9a..000000000 --- a/website/static/schemas/next/api/displayMetadata.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/displayMetadata.schema.json", - "title": "DisplayMetadata", - "description": "A desktop agent (typically for user channels) may want to provide additional information about how a channel can be represented in a UI. A common use case is for color linking.", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "color": { - "type": "string" - }, - "glyph": { - "type": "string" - } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/errors.schema.json b/website/static/schemas/next/api/errors.schema.json deleted file mode 100644 index 2c50b00b1..000000000 --- a/website/static/schemas/next/api/errors.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/errors.schema.json", - "definitions": { - "OpenError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling the open method on the DesktopAgent object.", - "enum": [ - "AppNotFound", - "ErrorOnLaunch", - "AppTimeout", - "ResolverUnavailable", - "DesktopAgentNotFound" - ] - }, - "ResolveError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling the findIntent, findIntentsByContext, raiseIntent or raiseIntentForContext methods on the DesktopAgent.", - "enum": [ - "NoAppsFound", - "ResolverUnavailable", - "UserCancelledResolution", - "ResolverTimeout", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "IntentDeliveryFailed", - "DesktopAgentNotFound" - ] - }, - "ResultError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling the getResult method on the IntentResolution Object.", - "enum": [ - "NoResultReturned", - "IntentHandlerRejected" - ] - }, - "ChannelError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered when calling channels using the joinUserChannel or getOrCreateChannel methods, or the getCurrentContext, broadcast or addContextListener methods on the Channel object.", - "enum": [ - "NoChannelFound", - "AccessDenied", - "CreationFailed" - ] - }, - "BridgingError": { - "type": "string", - "description": "Contains constants representing the errors that can be encountered by Desktop Agents when exchanging bridging messages.", - "enum": [ - "ResponseToBridgeTimedOut", - "AgentDisconnected", - "NotConnectedToBridge" - ] - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/api/icon.schema.json b/website/static/schemas/next/api/icon.schema.json deleted file mode 100644 index 951356324..000000000 --- a/website/static/schemas/next/api/icon.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/icon.schema.json", - "title": "Icon", - "description": "Metadata relating to a single icon image at a remote URL, used to represent an application in a user interface.", - "type": "object", - "properties": { - "src": { - "type": "string" - }, - "size": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "src" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/image.schema.json b/website/static/schemas/next/api/image.schema.json deleted file mode 100644 index 1f962a601..000000000 --- a/website/static/schemas/next/api/image.schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/image.schema.json", - "title": "Image", - "description": "Metadata relating to a single image at a remote URL, used to represent screenshot images.", - "type": "object", - "properties": { - "src": { - "type": "string" - }, - "size": { - "type": "string" - }, - "type": { - "type": "string" - }, - "label": { - "type": "string" - } - }, - "required": [ - "src" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/implementationMetadata.schema.json b/website/static/schemas/next/api/implementationMetadata.schema.json deleted file mode 100644 index cbfa33cc1..000000000 --- a/website/static/schemas/next/api/implementationMetadata.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/implementationMetadata.schema.json", - "title": "ImplementationMetadata", - "description": "Metadata relating to the FDC3 DesktopAgent object and its provider. Includes all fields from BaseImplementationMetadata and the metadata of the calling application according to the desktop agent.", - "type": "object", - "allOf": [ - { - "$ref": "baseImplementationMetadata.schema.json" - }, - { - "type":"object", - "properties": { - "fdc3Version":true, - "provider": true, - "providerVersion": true, - "optionalFeatures": true, - "appMetadata": { - "$ref": "appMetadata.schema.json" - } - }, - "required": [ - "fdc3Version", - "provider", - "optionalFeatures", - "appMetadata" - ], - "additionalProperties": false - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/api/intentMetadata.schema.json b/website/static/schemas/next/api/intentMetadata.schema.json deleted file mode 100644 index 61cba896c..000000000 --- a/website/static/schemas/next/api/intentMetadata.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/intentMetadata.schema.json", - "title": "IntentMetadata", - "description": "The interface used to describe an intent within the platform.", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "displayName": { - "type": "string" - } - }, - "required": [ - "displayName" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/intentResolution.schema.json b/website/static/schemas/next/api/intentResolution.schema.json deleted file mode 100644 index 65a6138ed..000000000 --- a/website/static/schemas/next/api/intentResolution.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/intentResolution.schema.json", - "title": "IntentResolution", - "description": "IntentResolution provides a standard format for data returned upon resolving an intent.", - "type": "object", - "properties": { - "source": { - "$ref": "appIdentifier.schema.json" - }, - "intent": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "source", - "intent" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/website/static/schemas/next/api/intentResult.schema.json b/website/static/schemas/next/api/intentResult.schema.json deleted file mode 100644 index 4d8d89ea9..000000000 --- a/website/static/schemas/next/api/intentResult.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/intentResult.schema.json", - "title": "IntentResult", - "description": "Describes results that an Intent handler may optionally return that should be communicated back to the app that raised the intent, via the IntentResolution.", - "type": "object", - "oneOf": [ - { - "$ref": "../context/context.schema.json" - }, - { - "$ref": "channel.schema.json" - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/api/t2sQuicktypeUtil.js b/website/static/schemas/next/api/t2sQuicktypeUtil.js new file mode 100644 index 000000000..86e6c270b --- /dev/null +++ b/website/static/schemas/next/api/t2sQuicktypeUtil.js @@ -0,0 +1,64 @@ +/** Utility for preparing arguments to quicktype, which workaround a specific + * quicktype bug in command line argument handling (where a directory is used + * as input the source language argument is ignored which causes our schemas + * to be interpreted as JSON input, rather than JSONSchema). + * Bug issue: + * */ + +const path = require('path'); +const fs = require('fs'); +const exec = require('child_process').exec; + +const args = process.argv.slice(2); +const outputPath = args.pop(); +const inputs = args; + +console.log('Inputs: ' + inputs.join(' | ')); +console.log('Output path argument: ' + outputPath); + +let source = ''; + +let dirIndex = 0; + +const excludedTypes = [ + 'DesktopAgent.ts', + 'Listener.ts', + 'Methods.ts', + 'PrivateChannel.ts', + 'Types.ts', + 'RecommendedChannels.ts', +]; + +let sources = ''; + +while (dirIndex < inputs.length) { + if (inputs[dirIndex].endsWith('.ts')) { + sources += `--src ${path.join(inputs[dirIndex])} `; + } else { + fs.readdirSync(inputs[dirIndex], { withFileTypes: true }).forEach(file => { + if (file.isDirectory()) { + inputs.push(path.join(inputs[dirIndex], file.name)); + } else { + if (!excludedTypes.includes(file.name)) { + sources += `--src ${path.join(inputs[dirIndex], file.name)} `; + } + } + }); + } + dirIndex++; +} + +// Normalise path to local quicktype executable. +const quicktypeExec = ['.', 'node_modules', '.bin', 'quicktype'].join(path.sep); + +const command = `${quicktypeExec} -l schema -o ${outputPath} ${sources}`; +console.log('command to run: ' + command); + +exec(command, function(error, stdout, stderr) { + if (stdout) { + console.log(stdout); + } + if (stderr) { + console.log(stderr); + } +}); diff --git a/website/static/schemas/next/bridging/agentErrorResponse.schema.json b/website/static/schemas/next/bridging/agentErrorResponse.schema.json new file mode 100644 index 000000000..75a0051c8 --- /dev/null +++ b/website/static/schemas/next/bridging/agentErrorResponse.schema.json @@ -0,0 +1,40 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/agentErrorResponse.schema.json", + "title": "Agent Error Response Message", + "type": "object", + "description": "A response message from a Desktop Agent to the Bridge containing an error, to be used in preference to the standard response when an error needs to be returned.", + "properties": { + "type": { + "title": "Response Message Type", + "type": "string", + "enum": [ + "findInstancesResponse", + "findIntentResponse", + "findIntentsByContextResponse", + "getAppMetadataResponse", + "openResponse", + "raiseIntentResponse", + "raiseIntentResultResponse" + ], + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "title": "Error Response Message Payload", + "type": "object", + "description": "Error message payload containing an standardized error string.", + "properties": { + "error": { + "$ref": "common.schema.json#/$defs/ErrorMessages" + } + }, + "unevaluatedProperties": false, + "required": ["error"] + }, + "meta": { + "$ref": "agentResponse.schema.json#/$defs/AgentResponseMeta" + } + }, + "additionalProperties": false, + "required": ["type", "payload", "meta"] +} diff --git a/website/static/schemas/next/bridging/agentRequest.schema.json b/website/static/schemas/next/bridging/agentRequest.schema.json index ca594f659..d88e78639 100644 --- a/website/static/schemas/next/bridging/agentRequest.schema.json +++ b/website/static/schemas/next/bridging/agentRequest.schema.json @@ -6,8 +6,23 @@ "description": "A request message from a Desktop Agent to the Bridge.", "properties": { "type": { - "title": "Message type", + "title": "Request Message type", "type": "string", + "enum": [ + "broadcastRequest", + "findInstancesRequest", + "findIntentRequest", + "findIntentsByContextRequest", + "getAppMetadataRequest", + "openRequest", + "PrivateChannel.broadcast", + "PrivateChannel.eventListenerAdded", + "PrivateChannel.onAddContextListener", + "PrivateChannel.onDisconnect", + "PrivateChannel.onUnsubscribe", + "raiseIntentRequest", + "raiseIntentResultResponse" + ], "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." }, "payload": { @@ -28,30 +43,20 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request" + "$ref": "common.schema.json#/$defs/RequestUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { "title": "Source identifier", "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "$ref": "common.schema.json#/$defs/RequestSource" }, "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "bridgeParticipantIdentifier.schema.json" + "$ref": "common.schema.json#/$defs/Destination" } }, "required": ["requestUuid", "timestamp"], diff --git a/website/static/schemas/next/bridging/agentResponse.schema.json b/website/static/schemas/next/bridging/agentResponse.schema.json index 2d8950258..b25fe59bf 100644 --- a/website/static/schemas/next/bridging/agentResponse.schema.json +++ b/website/static/schemas/next/bridging/agentResponse.schema.json @@ -8,6 +8,15 @@ "type": { "title": "Response Message Type", "type": "string", + "enum": [ + "findInstancesResponse", + "findIntentResponse", + "findIntentsByContextResponse", + "getAppMetadataResponse", + "openResponse", + "raiseIntentResponse", + "raiseIntentResultResponse" + ], "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." }, "payload": { @@ -28,29 +37,18 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request this message is responding to." + "$ref": "common.schema.json#/$defs/RequestUuid" }, "responseUuid": { - "type": "string", - "description": "UUID for this specific response message." + "$ref": "common.schema.json#/$defs/ResponseUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which the response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { "title": "Response Source identifier", "description": "Field that represents the source application instance that the response was produced by, or the Desktop Agent if it produced the response without an application.", - "oneOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] + "$ref": "common.schema.json#/$defs/ResponseSource" } }, "required": ["requestUuid", "responseUuid", "timestamp", "source"], diff --git a/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json new file mode 100644 index 000000000..6f1a7c3ea --- /dev/null +++ b/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json @@ -0,0 +1,55 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeErrorResponse.schema.json", + "title": "Bridge Error Response Message", + "type": "object", + "description": "A response message from the Bridge back to the original Desktop Agent that raised the request, used where all connected agents returned errors.", + "properties": { + "type": { + "title": "Response Message Type", + "type": "string", + "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." + }, + "payload": { + "title": "Response Error Message Payload", + "type": "object", + "description": "The error message payload contains details of an error return to the app or agent that raised the original request.", + "properties": { + "error": { + "$ref": "common.schema.json#/$defs/ErrorMessages" + } + } + }, + "meta": { + "$ref": "#/$defs/BridgeErrorResponseMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "BridgeErrorResponseMeta": { + "title": "Bridge Response Metadata", + "description": "Metadata required in a response message collated and/or forwarded on by the Bridge", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + }, + "errorSources": { + "$ref": "common.schema.json#/$defs/ResponseErrorSources" + }, + "errorDetails": { + "$ref": "common.schema.json#/$defs/ResponseErrorDetails" + } + }, + "required": ["requestUuid", "responseUuid", "timestamp", "errorSources", "errorDetails"], + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json b/website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json deleted file mode 100644 index 3c56f7606..000000000 --- a/website/static/schemas/next/bridging/bridgeParticipantIdentifier.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeParticipantIdentifier.schema.json", - "title": "Bridge Participant Identifier", - "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", - "type": "object", - "oneOf": [ - { - "type": "object", - "allOf": [ - { - "$ref": "../api/appIdentifier.schema.json" - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] - }, - { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/bridgeRequest.schema.json b/website/static/schemas/next/bridging/bridgeRequest.schema.json index cbc42eea9..6fc223518 100644 --- a/website/static/schemas/next/bridging/bridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/bridgeRequest.schema.json @@ -28,23 +28,20 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request" + "$ref": "common.schema.json#/$defs/RequestUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { "title": "Source identifier", "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "$ref": "bridgeParticipantIdentifier.schema.json" + "$ref": "common.schema.json#/$defs/BridgeRequestSource" }, "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "bridgeParticipantIdentifier.schema.json" + "$ref": "common.schema.json#/$defs/Destination" } }, "required": ["requestUuid", "timestamp", "source"], diff --git a/website/static/schemas/next/bridging/bridgeResponse.schema.json b/website/static/schemas/next/bridging/bridgeResponse.schema.json index 31a0e2796..67823287d 100644 --- a/website/static/schemas/next/bridging/bridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/bridgeResponse.schema.json @@ -28,45 +28,22 @@ "type": "object", "properties": { "requestUuid": { - "type": "string", - "description": "UUID for the request this message is responding to" + "$ref": "common.schema.json#/$defs/RequestUuid" }, "responseUuid": { - "type": "string", - "description": "Unique UUID for this collated response (generated by the bridge)." + "$ref": "common.schema.json#/$defs/ResponseUuid" }, "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which the response was generated" + "$ref": "common.schema.json#/$defs/Timestamp" }, "sources": { - "type": "array", - "items": [ - { - "$ref": "bridgeParticipantIdentifier.schema.json" - } - ], - "title": "Desktop Agents that responded", - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." + "$ref": "common.schema.json#/$defs/ResponseSources" }, "errorSources": { - "type": "array", - "items": [ - { - "$ref": "bridgeParticipantIdentifier.schema.json" - } - ], - "title": "Desktop Agents that errored", - "description": "Array of AppIdentifiers or DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." + "$ref": "common.schema.json#/$defs/ResponseErrorSources" }, "errorDetails": { - "title": "Detail of errors returned", - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + "$ref": "common.schema.json#/$defs/ResponseErrorDetails" } }, "required": ["requestUuid", "responseUuid", "timestamp"], diff --git a/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json b/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json index 119a2c7ba..a8f1e1e06 100644 --- a/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json @@ -1,37 +1,43 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastAgentRequest.schema.json", - "title": "broadcast Agent Request", + "title": "Broadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/BroadcastRequestBase" }, { - "$ref": "#/$defs/BroadcastRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "BroadcastRequestBase": { + "title": "Broadcast Request", "type":"object", "description": "A request to broadcast context on a channel.", "properties": { "type": { + "title": "Broadcast Request Message Type", "const": "broadcastRequest" }, "payload": { "title": "broadcast Request Payload", "type": "object", "properties": { - "channel": { - "$ref": "../api/channel.schema.json" + "channelId": { + "type": "string", + "title": "Channel Id", + "description": "The Id of the PrivateChannel that the broadcast was sent on" }, "context": { - "$ref": "../context/context.schema.json" + "$ref": "../context/context.schema.json", + "title": "Context", + "description": "The context object that was the payload of a broadcast message." } }, "additionalProperties": false, - "required": ["channel", "context"] + "required": ["channelId", "context"] }, "meta": { "type": "object", @@ -40,9 +46,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, + "required": ["source"], "additionalProperties": false } }, diff --git a/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json b/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json index 33341fd16..0ef5401aa 100644 --- a/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastBridgeRequest.schema.json", - "title": "broadcast Bridge Request", + "title": "Broadcast Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "broadcastAgentRequest.schema.json#/$defs/BroadcastRequestBase" }, { - "$ref": "broadcastAgentRequest.schema.json#/$defs/BroadcastRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/common.schema.json b/website/static/schemas/next/bridging/common.schema.json new file mode 100644 index 000000000..7efc0ba31 --- /dev/null +++ b/website/static/schemas/next/bridging/common.schema.json @@ -0,0 +1,137 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/common.schema.json", + "title": "Bridging Commons", + "type": "object", + "description": "Common elements referenced by other schemas", + "$defs": { + "AgentRequestMeta": { + "title": "Agent Request Metadata", + "description": "Metadata for a request message sent by Desktop Agents to the Bridge.", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "#/$defs/RequestUuid" + }, + "timestamp": { + "$ref": "#/$defs/Timestamp" + }, + "source": { + "$ref": "#/$defs/Source" + }, + "destination": { + "$ref": "#/$defs/Destination" + } + }, + "required": ["requestUuid", "timestamp"], + "additionalProperties": false + }, + "RequestUuid": { + "title": "Request UUID", + "type": "string", + "description": "UUID for the request" + }, + "ResponseUuid": { + "title": "Response UUID", + "type": "string", + "description": "UUID for this specific response message." + }, + "Timestamp": { + "title": "Timestamp", + "type": "string", + "format": "date-time", + "description": "Timestamp at which request was generated" + }, + "RequestSource": { + "title": "Source identifier", + "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", + "oneOf": [ + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ] + }, + "ResponseSource": { + "title": "Source identifier", + "description": "Field that represents the source Desktop Agent that a response was received from.", + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + "BridgeRequestSource": { + "title": "Bridge Source identifier", + "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", + "oneOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "allOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + } + ] + } + ] + }, + "BridgeParticipantIdentifier": { + "title": "Bridge Participant Identifier", + "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", + "type": "object", + "oneOf": [ + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ] + }, + "Destination": { + "title": "Destination identifier", + "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", + "$ref": "#/$defs/BridgeParticipantIdentifier" + }, + "ResponseSources": { + "title": "Desktop Agents that responded", + "type": "array", + "items": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ], + "description": "Array of DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." + }, + "ResponseErrorSources": { + "title": "Desktop Agents that errored", + "type": "array", + "items": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + } + ], + "description": "Array of DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." + }, + "ErrorMessages": { + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ChannelError" }, + { "$ref": "../api/api.schema.json#/definitions/OpenError" }, + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/ResultError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + }, + "ResponseErrorDetails": { + "title": "Response Error Details", + "type": "array", + "items": { + "$ref": "#/$defs/ErrorMessages" + }, + "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." + } + } +} diff --git a/website/static/schemas/next/bridging/connectionStep.schema.json b/website/static/schemas/next/bridging/connectionStep.schema.json new file mode 100644 index 000000000..3c3a377b0 --- /dev/null +++ b/website/static/schemas/next/bridging/connectionStep.schema.json @@ -0,0 +1,51 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep.schema.json", + "title": "Connection Step Message", + "type": "object", + "description": "A message used during the connection flow for a Desktop Agent to the Bridge. Used for messages sent in either direction.", + "properties": { + "type": { + "title": "Connection Step Message type", + "type": "string", + "enum": [ + "hello", + "handshake", + "authenticationFailed", + "connectedAgentsUpdate" + ], + "description": "Identifies the type of the connection step message." + }, + "payload": { + "title": "Message payload", + "type": "object", + "description": "The message payload, containing data pertaining to this connection step.", + "unevaluatedProperties": false + }, + "meta": { + "$ref": "#/$defs/ConnectionStepMeta" + } + }, + "required": ["type", "payload", "meta"], + "additionalProperties": false, + "$defs": { + "ConnectionStepMeta": { + "title": "Connection Step Metadata", + "description": "Metadata for this connection step message.", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + } + }, + "required": ["timestamp"], + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/connectionStep2Hello.schema.json b/website/static/schemas/next/bridging/connectionStep2Hello.schema.json index 37b34c920..0ac240f6c 100644 --- a/website/static/schemas/next/bridging/connectionStep2Hello.schema.json +++ b/website/static/schemas/next/bridging/connectionStep2Hello.schema.json @@ -1,51 +1,71 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep2Hello.schema.json", - "title": "connectionStep2Hello", + "title": "ConnectionStep2Hello", "type": "object", - "properties": { - "type": { - "const": "hello" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep2HelloBase" }, - "payload": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep2HelloBase": { + "type":"object", + "title": "ConnectionStep2Hello", + "description": "Hello message sent by the Bridge to anyone connecting to the Bridge (enables identification as a bridge and confirmation of whether authentication is required)", "properties": { - "desktopAgentBridgeVersion": { - "description": "The version of the Bridge", - "type": "string" - }, - "supportedFDC3Versions": { - "type": "array", - "description": "The FDC3 versions supported by the Bridge", - "items": { - "type": "string" - } + "type": { + "title": "Connection Step 2 Message Type", + "const": "hello" }, - "authRequired": { - "type": "boolean", - "description": "A flag indicating whether the Desktop Agent Bridge requires authentication or not." + "payload": { + "title": "Connection Step 2 Payload", + "type": "object", + "properties": { + "desktopAgentBridgeVersion": { + "title": "Desktop Agent Bridge Version Number", + "description": "The version of the Bridge", + "type": "string" + }, + "supportedFDC3Versions": { + "title": "Supported FDC3 Versions", + "type": "array", + "description": "The FDC3 versions supported by the Bridge", + "items": { + "type": "string" + } + }, + "authRequired": { + "title": "Authentication Required", + "type": "boolean", + "description": "A flag indicating whether the Desktop Agent Bridge requires authentication or not." + }, + "authToken": { + "title": "Authentication Token", + "type": "string", + "description": "An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to authenticate a bridge." + } + }, + "additionalProperties": false, + "required": ["desktopAgentBridgeVersion", "supportedFDC3Versions", "authRequired"] }, - "authToken": { - "type": "string", - "description": "An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to authenticate a bridge." - } - }, - "additionalProperties": false, - "required": ["desktopAgentBridgeVersion", "supportedFDC3Versions", "authRequired"] - }, - "meta": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 2 Metadata", + "type": "object", + "properties": { + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["timestamp"] } }, - "additionalProperties": false, - "required": ["timestamp"] + "required": ["type", "payload", "meta"], + "additionalProperties": false } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json index 50b49f193..dbc046463 100644 --- a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json +++ b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json @@ -1,57 +1,77 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep3Handshake.schema.json", - "title": "connectionStep3Handshake", + "title": "ConnectionStep3Handshake", "type": "object", - "properties": { - "type": { - "const": "handshake" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep3HandshakeBase" }, - "payload": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep3HandshakeBase": { + "type":"object", + "title": "ConnectionStep3Handshake", + "description": "Handshake message sent by the Desktop Agent to the Bridge (including requested name, channel state and authentication data)", "properties": { - "implementationMetadata": { - "description": "DesktopAgent implementationMetadata trying to connect to the bridge.", - "$ref": "../api/baseImplementationMetadata.schema.json" - }, - "requestedName": { - "description": "The requested Desktop Agent name", - "type": "string" + "type": { + "title": "Connection Step 3 Message Type", + "const": "handshake" }, - "channelsState": { + "payload": { + "title": "Connection Step 3 Payload", "type": "object", - "description": "The current state of the Desktop Agent's channels, excluding any private channels, as a mapping of channel id to an array of Context objects, most recent first.", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "../context/context.schema.json" + "properties": { + "implementationMetadata": { + "title": "Desktop Agent ImplementationMetadata", + "description": "Desktop Agent ImplementationMetadata trying to connect to the bridge.", + "$ref": "../api/baseImplementationMetadata.schema.json" + }, + "requestedName": { + "title": "Requested name", + "description": "The requested Desktop Agent name", + "type": "string" + }, + "channelsState": { + "title": "Channel State", + "type": "object", + "description": "The current state of the Desktop Agent's channels, excluding any private channels, as a mapping of channel id to an array of Context objects, most recent first.", + "additionalProperties": { + "title": "Channel ", + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } } - } - }, - "authToken": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["implementationMetadata", "requestedName", "channelsState"] - }, - "meta": { - "type": "object", - "properties": { - "requestUuid": { - "type": "string", - "description": "Unique UUID for the request" + }, + "authToken": { + "title": "Authentication Token", + "type": "string" + } + }, + "additionalProperties": false, + "required": ["implementationMetadata", "requestedName", "channelsState"] }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 3 Metadata", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["requestUuid", "timestamp"] } }, - "additionalProperties": false, - "required": ["requestUuid", "timestamp"] + "required": ["type", "payload", "meta"], + "additionalProperties": false } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json b/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json index 28e2c11cf..6cae52eca 100644 --- a/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json +++ b/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json @@ -1,42 +1,57 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json", - "title": "connectionStep4AuthenticationFailed", + "title": "ConnectionStep4AuthenticationFailed", "type": "object", - "properties": { - "type": { - "const": "authenticationFailed" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep4AuthenticationFailedBase" }, - "payload": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "additionalProperties": false - }, - "meta": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep4AuthenticationFailedBase": { + "type":"object", + "title": "ConnectionStep4AuthenticationFailed", + "description": "Message sent by Bridge to Desktop Agent if their authentication fails.", "properties": { - "requestUuid": { - "type": "string", - "description": "Unique UUID for the request" + "type": { + "title": "Connection Step 4 Message Type", + "const": "authenticationFailed" }, - "responseUuid": { - "type": "string", - "description": "Unique UUID for the response" + "payload": { + "title": "Connection Step 4 Payload", + "type": "object", + "properties": { + "message": { + "title": "Authentication failed message", + "type": "string" + } + }, + "additionalProperties": false }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 4 Metadata", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["requestUuid", "responseUuid", "timestamp"] } }, - "additionalProperties": false, - "required": ["requestUuid", "responseUuid", "timestamp"] + "required": ["type", "meta"], + "additionalProperties": false } - }, - "required": ["type", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json index 7b710aa62..17706795c 100644 --- a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json +++ b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json @@ -1,65 +1,83 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json", - "title": "connectionStep6ConnectedAgentsUpdate", + "title": "ConnectionStep6ConnectedAgentsUpdate", "type": "object", - "properties": { - "type": { - "const": "connectedAgentsUpdate" + "allOf": [ + { + "$ref": "#/$defs/ConnectionStep6ConnectedAgentsUpdateBase" }, - "payload": { - "type": "object", + { + "$ref": "connectionStep.schema.json" + } + ], + "$defs": { + "ConnectionStep6ConnectedAgentsUpdateBase": { + "type":"object", + "title": "ConnectionStep6ConnectedAgentsUpdateBase", + "description": "Message sent by Bridge to all Desktop Agent when an agent joins or leaves the bridge, includes the details of all agents, the change made and the expected channel state for all agents.", "properties": { - "addAgent": { - "type": "string", - "description": "Should be set when an agent first connects to the bridge and provide its assigned name." - }, - "removeAgent": { - "type": "string", - "description": "Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned." - }, - "allAgents": { - "type": "array", - "description": "Desktop Agent Bridge implementation metadata of all connected agents.", - "items": { - "$ref": "../api/implementationMetadata.schema.json" - } + "type": { + "title": "Connection Step 6 Message Type", + "const": "connectedAgentsUpdate" }, - "channelsState": { + "payload": { + "title": "Connection Step 6 Payload", "type": "object", - "description": "The updated state of channels that should be adopted by the agents. Should only be set when an agent is connecting to the bridge.", - "additionalProperties": { - "type": "array", + "properties": { + "addAgent": { + "title": "Agents To Add", + "type": "string", + "description": "Should be set when an agent first connects to the bridge and provide its assigned name." + }, + "removeAgent": { + "title": "Agents To Remove", + "type": "string", + "description": "Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned." + }, + "allAgents": { + "title": "All Connected Agents", + "type": "array", + "description": "Desktop Agent Bridge implementation metadata of all connected agents.", "items": { - "$ref": "../context/context.schema.json" + "$ref": "../api/baseImplementationMetadata.schema.json" } - } - } - }, - "additionalProperties": false, - "required": ["allAgents"] - }, - "meta": { - "type": "object", - "properties": { - "requestUuid": { - "type": "string", - "description": "Unique UUID for the request" - }, - "responseUuid": { - "type": "string", - "description": "Unique UUID for the response" + }, + "channelsState": { + "title": "Channel State", + "type": "object", + "description": "The updated state of channels that should be adopted by the agents. Should only be set when an agent is connecting to the bridge.", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "../context/context.schema.json" + } + } + } + }, + "additionalProperties": false, + "required": ["allAgents"] }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Timestamp at which request or response was generated" + "meta": { + "title": "Connection Step 6 Metadata", + "type": "object", + "properties": { + "requestUuid": { + "$ref": "common.schema.json#/$defs/RequestUuid" + }, + "responseUuid": { + "$ref": "common.schema.json#/$defs/ResponseUuid" + }, + "timestamp": { + "$ref": "common.schema.json#/$defs/Timestamp" + } + }, + "additionalProperties": false, + "required": ["requestUuid", "responseUuid", "timestamp"] } }, - "additionalProperties": false, - "required": ["requestUuid", "responseUuid", "timestamp"] + "required": ["type", "payload", "meta"], + "additionalProperties": false } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false + } } \ No newline at end of file diff --git a/website/static/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json new file mode 100644 index 000000000..798840f59 --- /dev/null +++ b/website/static/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json", + "title": "FindInstances Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/FindInstancesErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "FindInstancesErrorResponseBase": { + "title": "FindInstances Error Response", + "type": "object", + "description": "A response to a findInstances request that contains an error.", + "properties": { + "type": { + "title": "FindInstances Response Message Type", + "const": "findInstancesResponse" + }, + "payload": { + "title": "FindInstances Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "FindInstances Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "FindInstances Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json b/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json index 926ab7f09..f4cd4ba54 100644 --- a/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json @@ -1,46 +1,48 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentRequest.schema.json", - "title": "findInstances Agent Request", + "title": "FindInstances Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/FindInstancesRequestBase" }, { - "$ref": "#/$defs/FindInstancesRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "FindInstancesRequestBase": { + "title": "FindInstances Request", "type": "object", "description": "A request for details of instances of a particular app", "properties":{ "type": { + "title": "FindInstances Request Message Type", "const": "findInstancesRequest" }, "payload": { "type": "object", - "title": "findInstances request payload", + "title": "FindInstances Request Payload", "properties": { "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["app"], "additionalProperties": false }, "meta": { + "title": "FindInstances request metadata", "type": "object", - "title": "findInstances request metadata", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/desktopAgentIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json b/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json index bc2a778f8..67f3937c6 100644 --- a/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json +++ b/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json @@ -1,39 +1,44 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json", - "title": "findInstances Agent Response", + "title": "FindInstances Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/FindInstancesResponseBase" }, { - "$ref": "#/$defs/FindInstancesResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "FindInstancesResponseBase": { + "title": "FindInstances Response", "type": "object", "description": "A response to a findInstances request.", "properties": { "type": { + "title": "FindInstances Response Message Type", "const": "findInstancesResponse" }, "payload": { + "title": "FindInstances Response Payload", "type": "object", - "title": "findInstances Response Payload", "properties": { "appIdentifiers": { "type": "array", "items": { - "$ref": "../api/appMetadata.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppMetadata" } } }, "required": ["appIdentifiers"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "FindInstances Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/website/static/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json new file mode 100644 index 000000000..705c9f62e --- /dev/null +++ b/website/static/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json", + "title": "FindInstances Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "findInstancesAgentErrorResponse.schema.json#/$defs/FindInstancesErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json index 59079fff6..9b27a2e19 100644 --- a/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeRequest.schema.json", - "title": "findInstances Bridge Request", + "title": "FindInstances Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "findInstancesAgentRequest.schema.json#/$defs/FindInstancesRequestBase" }, { - "$ref": "findInstancesAgentRequest.schema.json#/$defs/FindInstancesRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json index 034cc3c68..17d398845 100644 --- a/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json @@ -1,39 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json", - "title": "findInstances Bridge Response", + "title": "FindInstances Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "findInstancesAgentResponse.schema.json#/$defs/FindInstancesResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "title": "findInstances bridge response metadata", - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/findIntentAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentAgentErrorResponse.schema.json new file mode 100644 index 000000000..b8d89cd9b --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentErrorResponse.schema.json", + "title": "FindIntent Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/FindIntentErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "FindIntentErrorResponseBase": { + "title": "FindIntent Error Response", + "type": "object", + "description": "A response to a findIntent request that contains an error.", + "properties": { + "type": { + "title": "FindIntent Response Message Type", + "const": "findIntentResponse" + }, + "payload": { + "title": "FindIntent Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "FindIntent Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "FindIntent Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json index b91e0bb87..d5255f07c 100644 --- a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json @@ -1,32 +1,36 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json", - "title": "findIntents Agent Request", + "title": "FindIntents Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/FindIntentRequestBase" }, { - "$ref": "#/$defs/FindIntentRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "FindIntentRequestBase": { + "title": "FindIntent Request", "type": "object", "description": "A request for details of apps available to resolve a particular intent and context pair.", "properties": { "type": { + "title": "FindIntent Request Message Type", "const": "findIntentRequest" }, "payload": { - "title": "findIntent request payload", + "title": "FindIntent Request Payload", "type": "object", "properties": { "intent": { + "title": "Intent name", "type": "string" }, "context": { + "title": "Context argument", "$ref": "../context/context.schema.json" } }, @@ -34,13 +38,13 @@ "additionalProperties": false }, "meta": { + "title" : "FindIntent Request Metadata", "type": "object", - "title" : "findIntent request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json b/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json index 3a7a98508..8969469bf 100644 --- a/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json @@ -1,36 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json", - "title": "findIntent Agent Response", + "title": "FindIntent Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/FindIntentResponseBase" }, { - "$ref": "#/$defs/FindIntentResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "FindIntentResponseBase": { + "title": "FindIntent Response", "type": "object", "description": "A response to a findIntent request.", "properties": { "type": { + "title": "FindIntent Response Message Type", "const": "findIntentResponse" }, "payload": { + "title": "FindIntent Response Payload", "type": "object", - "title": "findIntent response payload", "properties": { "appIntent": { - "$ref": "../api/appIntent.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIntent" } }, "required": ["appIntent"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "FindIntent Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/website/static/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json new file mode 100644 index 000000000..76efa5430 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json", + "title": "FindIntent Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "findIntentAgentErrorResponse.schema.json#/$defs/FindIntentErrorResponseBase" + }, + + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json b/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json index 5c3a7b480..8903f567f 100644 --- a/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeRequest.schema.json", - "title": "findIntent Bridge Request", + "title": "FindIntent Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "findIntentAgentRequest.schema.json#/$defs/FindIntentRequestBase" }, { - "$ref": "findIntentAgentRequest.schema.json#/$defs/FindIntentRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json b/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json index b608bbb73..43655a400 100644 --- a/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json @@ -1,39 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json", - "title": "findIntent Bridge Response", + "title": "FindIntent Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "findIntentAgentResponse.schema.json#/$defs/FindIntentResponseBase" }, + { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "title": "findIntent bridge response metadata", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json new file mode 100644 index 000000000..0bd1646c5 --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json", + "title": "FindIntentsByContext Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/FindIntentsByContextErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "FindIntentsByContextErrorResponseBase": { + "title": "FindIntentsByContext Error Response", + "type": "object", + "description": "A response to a findIntentsByContext request that contains an error.", + "properties": { + "type": { + "title": "FindIntentsByContext Response Message Type", + "const": "findIntentsByContextResponse" + }, + "payload": { + "title": "FindIntentsByContext Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "FindIntentsByContext Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "additionalProperties": false, + "required": ["error"] + }, + "meta": { + "title": "FindIntentsByContext Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json index 9df449fcc..9b191234c 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json", - "title": "findIntentsByContext Agent Request", + "title": "FindIntentsByContext Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/FindIntentsByContextRequestBase" }, { - "$ref": "#/$defs/FindIntentsByContextRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "FindIntentsByContextRequestBase": { + "title": "FindIntentsByContext Request", "type": "object", "description": "A request for details of intents and apps available to resolve them for a particular context.", "properties": { "type": { + "title": "FindIntentsByContext Request Message Type", "const": "findIntentsByContextRequest" }, "payload": { + "title": "FindIntentsByContext Request Payload", "type": "object", - "title": "findIntentsByContext request payload", "properties": { "context": { "$ref": "../context/context.schema.json" @@ -31,13 +33,13 @@ "additionalProperties": false }, "meta": { + "title": "FindIntentsByContext Request Metadata", "type": "object", - "title": "findIntentsByContext request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json index f4815d5bf..7f909d419 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json @@ -1,32 +1,34 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json", - "title": "findIntentsByContext Agent Response", + "title": "FindIntentsByContext Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/FindIntentsByContextResponseBase" }, { - "$ref": "#/$defs/FindIntentsByContextResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "FindIntentsByContextResponseBase": { + "title": "FindIntentsByContext Response", "type": "object", "description": "A response to a findIntentsByContext request.", "properties": { "type": { + "title": "FindIntentsByContext Response Message Type", "const": "findIntentsByContextResponse" }, "payload": { + "title": "FindIntentsByContext Response Payload", "type": "object", - "title": "findIntentsByContext response payload", "properties": { "appIntents": { "type": "array", "items": { - "$ref": "../api/appIntent.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIntent" }, "additionalProperties": false } @@ -34,7 +36,10 @@ "additionalProperties": false, "required": ["appIntents"] }, - "meta": true + "meta": { + "title": "FindIntentsByContext Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/website/static/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json new file mode 100644 index 000000000..045d2c6cc --- /dev/null +++ b/website/static/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json", + "title": "FindIntentsByContext Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "findIntentsByContextAgentErrorResponse.schema.json#/$defs/FindIntentsByContextErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json index 8f5a8e193..61ad738d7 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json", - "title": "findIntentsByContext Bridge Request", + "title": "FindIntentsByContext Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "findIntentsByContextAgentRequest.schema.json#/$defs/FindIntentsByContextRequestBase" }, { - "$ref": "findIntentsByContextAgentRequest.schema.json#/$defs/FindIntentsByContextRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json index b930113aa..edb5c0683 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json @@ -1,39 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json", - "title": "findIntentsByContext Bridge Response", - "type": "object", + "title": "FindIntentsByContext Bridge Response", + "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "findIntentsByContextAgentResponse.schema.json#/$defs/FindIntentsByContextResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "title": "findIntentsByContext response metadata", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json new file mode 100644 index 000000000..57cad8b2c --- /dev/null +++ b/website/static/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json", + "title": "GetAppMetadata Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/GetAppMetadataErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "GetAppMetadataErrorResponseBase": { + "title": "GetAppMetadata Error Response", + "type": "object", + "description": "A response to a getAppMetadata request that contains an error.", + "properties": { + "type": { + "title": "GetAppMetadata Response Message Type", + "const": "getAppMetadataResponse" + }, + "payload": { + "title": "GetAppMetadata Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "GetAppMetadata Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "GetAppMetadata Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json index 07fce5ed5..6f313c27c 100644 --- a/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json @@ -1,45 +1,48 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentRequest.schema.json", - "title": "getAppMetadata Agent Request", + "title": "GetAppMetadata Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/GetAppMetadataRequestBase" }, { - "$ref": "#/$defs/GetAppMetadataRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "GetAppMetadataRequestBase": { + "title": "GetAppMetadata Request", "type": "object", "description": "A request for metadata about an app", "properties": { "type": { + "title": "GetAppMetadata Request Message Type", "const": "getAppMetadataRequest" }, "payload": { + "title": "GetAppMetadata Request Payload", "type": "object", "properties": { "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["app"], "additionalProperties": false }, "meta": { + "title" : "GetAppMetadata Request Metadata", "type": "object", - "title" : "getAppMetadata request metadata", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/desktopAgentIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json index 59d3eb5f8..65aad070c 100644 --- a/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json @@ -1,35 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json", - "title": "getAppMetadata Agent Response", + "title": "GetAppMetadata Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/GetAppMetadataResponseBase" }, { - "$ref": "#/$defs/GetAppMetadataResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "GetAppMetadataResponseBase": { + "title": "GetAppMetadata Response", "type": "object", "description": "A response to a getAppMetadata request.", "properties": { "type": { + "title": "GetAppMetadata Response Message Type", "const": "getAppMetadataResponse" }, "payload": { + "title": "GetAppMetadata Response Payload", "type": "object", "properties": { "appMetadata": { - "$ref": "../api/appMetadata.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppMetadata" } }, "required": ["appMetadata"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "GetAppMetadata Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/website/static/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json new file mode 100644 index 000000000..14c3b1e77 --- /dev/null +++ b/website/static/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json", + "title": "GetAppMetadata Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "getAppMetadataAgentErrorResponse.schema.json#/$defs/GetAppMetadataErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json index 8b8ba164d..a5bccc3d8 100644 --- a/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json", - "title": "getAppMetadata Bridge Request", + "title": "GetAppMetadata Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "getAppMetadataAgentRequest.schema.json#/$defs/GetAppMetadataRequestBase" }, { - "$ref": "getAppMetadataAgentRequest.schema.json#/$defs/GetAppMetadataRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json index 6809f5366..2b883d7c5 100644 --- a/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json @@ -1,38 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json", - "title": "getAppMetadata Bridge Response", + "title": "GetAppMetadata Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "getAppMetadataAgentResponse.schema.json#/$defs/GetAppMetadataResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/openAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/openAgentErrorResponse.schema.json new file mode 100644 index 000000000..6041edcb5 --- /dev/null +++ b/website/static/schemas/next/bridging/openAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentErrorResponse.schema.json", + "title": "Open Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/OpenErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "OpenErrorResponseBase": { + "title": "Open Error Response", + "type": "object", + "description": "A response to an open request that contains an error", + "properties": { + "type": { + "title": "Open Response Message Type", + "const": "openResponse" + }, + "payload": { + "title": "Open Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "Open Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/OpenError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "Open Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/openAgentRequest.schema.json b/website/static/schemas/next/bridging/openAgentRequest.schema.json index 6e3f917d8..13f4cbf01 100644 --- a/website/static/schemas/next/bridging/openAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/openAgentRequest.schema.json @@ -1,29 +1,32 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentRequest.schema.json", - "title": "open Agent Request", + "title": "Open Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/OpenRequestBase" }, { - "$ref": "#/$defs/OpenRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "OpenRequestBase": { + "title": "Open Request", "type": "object", "description": "A request to open an application", "properties": { "type": { + "title": "Open Request Message Type", "const": "openRequest" }, "payload": { + "title": "Open Request Payload", "type": "object", "properties": { "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "context": { "$ref": "../context/context.schema.json" @@ -33,16 +36,18 @@ "additionalProperties": false }, "meta": { + "title": "Open Request Metadata", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/desktopAgentIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, + "required": ["source"], "additionalProperties": false } }, diff --git a/website/static/schemas/next/bridging/openAgentResponse.schema.json b/website/static/schemas/next/bridging/openAgentResponse.schema.json index 62a49ac63..5c714f260 100644 --- a/website/static/schemas/next/bridging/openAgentResponse.schema.json +++ b/website/static/schemas/next/bridging/openAgentResponse.schema.json @@ -1,35 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json", - "title": "open Agent Response", + "title": "Open Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/OpenResponseBase" }, { - "$ref": "#/$defs/OpenResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "OpenResponseBase": { + "title": "Open Response", "type": "object", "description": "A response to an open request", "properties": { "type": { + "title": "Open Response Message Type", "const": "openResponse" }, "payload": { + "title": "Open Response Payload", "type": "object", "properties": { "appIdentifier": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["appIdentifier"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "Open Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/website/static/schemas/next/bridging/openBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/openBridgeErrorResponse.schema.json new file mode 100644 index 000000000..7668e8cea --- /dev/null +++ b/website/static/schemas/next/bridging/openBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeErrorResponse.schema.json", + "title": "Open Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "openAgentErrorResponse.schema.json#/$defs/OpenErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/website/static/schemas/next/bridging/openBridgeRequest.schema.json b/website/static/schemas/next/bridging/openBridgeRequest.schema.json index 2d9034bdc..55ec1515a 100644 --- a/website/static/schemas/next/bridging/openBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/openBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeRequest.schema.json", - "title": "open Bridge Request", + "title": "Open Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "openAgentRequest.schema.json#/$defs/OpenRequestBase" }, { - "$ref": "openAgentRequest.schema.json#/$defs/OpenRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/openBridgeResponse.schema.json b/website/static/schemas/next/bridging/openBridgeResponse.schema.json index 4bfd321f5..8d69b1d50 100644 --- a/website/static/schemas/next/bridging/openBridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/openBridgeResponse.schema.json @@ -1,38 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json", - "title": "open Bridge Response", + "title": "Open Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "openAgentResponse.schema.json#/$defs/OpenResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json index ef9d06e28..fb36fa38d 100644 --- a/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json @@ -1,49 +1,55 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json", - "title": "privateChannelBroadcast Agent Request", + "title": "PrivateChannelBroadcast Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelBroadcastRequestBase" }, { - "$ref": "#/$defs/PrivateChannelBroadcastRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelBroadcastRequestBase": { + "title": "PrivateChannelBroadcast Request", "type": "object", "description": "A request to broadcast on a PrivateChannel.", "properties": { "type": { + "title": "Private Channel Broadcast Message type", "const": "PrivateChannel.broadcast" }, "payload": { + "title": "PrivateChannelBroadcast Request Payload", "type": "object", - "title": "privateChannel broadcast request payload", "properties": { - "channel": { - "type": "string" + "channelId": { + "type": "string", + "title": "Channel Id", + "description": "The Id of the PrivateChannel that the broadcast was sent on" }, "context": { - "type": "string" + "$ref": "../context/context.schema.json", + "title": "Context", + "description": "The context object that was the payload of a broadcast message." } }, "additionalProperties": false, - "required": ["channel", "context"] + "required": ["channelId", "context"] }, "meta": { + "title": "PrivateChannelBroadcast Request Metadata", "type": "object", - "title": "privateChannel broadcast request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json index ed80f6fd9..38bbd4f45 100644 --- a/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json", - "title": "privateChannelBroadcast Bridge Request", + "title": "PrivateChannelBroadcast Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelBroadcastAgentRequest.schema.json#/$defs/PrivateChannelBroadcastRequestBase" }, { - "$ref": "privateChannelBroadcastAgentRequest.schema.json#/$defs/PrivateChannelBroadcastRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json index 089323c44..4a212b3d0 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json", - "title": "privateChannelEventListenerAdded Agent Request", + "title": "PrivateChannelEventListenerAdded Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelEventListenerAddedRequestBase" }, { - "$ref": "#/$defs/PrivateChannelEventListenerAddedRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelEventListenerAddedRequestBase": { + "title": "PrivateChannelEventListenerAdded Request", "type": "object", "description": "A request to forward on an EventListenerAdded event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel EventListenerAdded Message type", "const": "PrivateChannel.eventListenerAdded" }, "payload": { + "title": "PrivateChannelEventListenerAdded Request Payload", "type": "object", - "title": "privateChannel eventListenerAdded request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "context"] }, "meta": { + "title": "PrivateChannelEventListenerAdded Request Metadata", "type": "object", - "title": "privateChannel eventListenerAdded request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json index 3b7397b74..31993207b 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json", - "title": "privateChannelEventListenerAdded Bridge Request", + "title": "PrivateChannelEventListenerAdded Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelEventListenerAddedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerAddedRequestBase" }, { - "$ref": "privateChannelEventListenerAddedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerAddedRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json index 546e31374..4a0ffedd1 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json", - "title": "privateChannelEventListenerRemoved Agent Request", + "title": "PrivateChannelEventListenerRemoved Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelEventListenerRemovedRequestBase" }, { - "$ref": "#/$defs/PrivateChannelEventListenerRemovedRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelEventListenerRemovedRequestBase": { + "title": "PrivateChannelEventListenerRemoved Request", "type": "object", "description": "A request to forward on an EventListenerRemoved event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel EventListenerRemoved Message type", "const": "PrivateChannel.eventListenerRemoved" }, "payload": { + "title": "PrivateChannelEventListenerRemoved Request Payload", "type": "object", - "title": "privateChannel eventListenerRemoved request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "listenerType"] }, "meta": { + "title": "PrivateChannelEventListenerRemoved Request Metadata", "type": "object", - "title": "privateChannel eventListenerRemoved request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json index 24b8b3cec..e41b1e1b5 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json", - "title": "privateChannelEventListenerRemoved Bridge Request", + "title": "PrivateChannelEventListenerRemoved Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelEventListenerRemovedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerRemovedRequestBase" }, { - "$ref": "privateChannelEventListenerRemovedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerRemovedRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json index 169857930..b73b53a26 100644 --- a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json", - "title": "privateChannelOnAddContextListener Agent Request", + "title": "PrivateChannelOnAddContextListener Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelOnAddContextListenerRequestBase" }, { - "$ref": "#/$defs/PrivateChannelOnAddContextListenerRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelOnAddContextListenerRequestBase": { + "title": "PrivateChannelOnAddContextListener Request", "type": "object", "description": "A request to forward on an AddCOntextListener event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel OnAddContextListener Message type", "const": "PrivateChannel.onAddContextListener" }, "payload": { + "title": "PrivateChannelOnAddContextListener Request Payload", "type": "object", - "title": "privateChannel onAddContextListener request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "contextType"] }, "meta": { + "title": "PrivateChannelOnAddContextListener Request Metadata", "type": "object", - "title": "privateChannel onAddContextListener request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json index 05ea74b49..c8f093481 100644 --- a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json", - "title": "privateChannelOnAddContextListener Bridge Request", + "title": "PrivateChannelOnAddContextListener Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelOnAddContextListenerAgentRequest.schema.json#/$defs/PrivateChannelOnAddContextListenerRequestBase" }, { - "$ref": "privateChannelOnAddContextListenerAgentRequest.schema.json#/$defs/PrivateChannelOnAddContextListenerRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json index 8b137372c..dda363660 100644 --- a/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json", - "title": "privateChannelOnDisconnect Agent Request", + "title": "PrivateChannelOnDisconnect Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelOnDisconnectRequestBase" }, { - "$ref": "#/$defs/PrivateChannelOnDisconnectRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelOnDisconnectRequestBase": { + "title": "PrivateChannelOnDisconnect Request", "type": "object", "description": "A request to forward on a Disconnect event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel OnDisconnect Message type", "const": "PrivateChannel.onDisconnect" }, "payload": { + "title": "PrivateChannelOnDisconnect Request Payload", "type": "object", - "title": "privateChannel onDisconnect request payload", "properties": { "channel": { "type": "string" @@ -31,16 +33,16 @@ "required": ["channel"] }, "meta": { + "title": "PrivateChannelOnDisconnect Request Metadata", "type": "object", - "title": "privateChannel onDisconnect request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json index b4e31ddcc..73742515f 100644 --- a/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json", - "title": "privateChannelOnDisconnect Bridge Request", + "title": "PrivateChannelOnDisconnect Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelOnDisconnectAgentRequest.schema.json#/$defs/PrivateChannelOnDisconnectRequestBase" }, { - "$ref": "privateChannelOnDisconnectAgentRequest.schema.json#/$defs/PrivateChannelOnDisconnectRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json index 75649b334..45c9b178a 100644 --- a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json @@ -1,27 +1,29 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json", - "title": "privateChannelOnUnsubscribe Agent Request", + "title": "PrivateChannelOnUnsubscribe Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/PrivateChannelOnUnsubscribeRequestBase" }, { - "$ref": "#/$defs/PrivateChannelOnUnsubscribeRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "PrivateChannelOnUnsubscribeRequestBase": { + "title": "PrivateChannelOnUnsubscribe Request", "type": "object", "description": "A request to forward on an Unsubscribe event, relating to a PrivateChannel", "properties": { "type": { + "title": "Private Channel OnUnsubscribe Message type", "const": "PrivateChannel.onUnsubscribe" }, "payload": { + "title": "PrivateChannelOnUnsubscribe Request Payload", "type": "object", - "title": "privateChannel onUnsubscribe request payload", "properties": { "channel": { "type": "string" @@ -34,16 +36,16 @@ "required": ["channel", "contextType"] }, "meta": { + "title": "PrivateChannelOnUnsubscribe Request Metadata", "type": "object", - "title": "privateChannel onUnsubscribe request metadata", "properties": { "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json index 0f76ebd19..5e364e3db 100644 --- a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json @@ -5,10 +5,10 @@ "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "privateChannelOnUnsubscribeAgentRequest.schema.json#/$defs/PrivateChannelOnUnsubscribeRequestBase" }, { - "$ref": "privateChannelOnUnsubscribeAgentRequest.schema.json#/$defs/PrivateChannelOnUnsubscribeRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json new file mode 100644 index 000000000..c7dd9dcfb --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json", + "title": "RaiseIntent Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/RaiseIntentErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "RaiseIntentErrorResponseBase": { + "title": "RaiseIntent Error Response", + "type": "object", + "description": "A response to a request to raise an intent that contains an error.", + "properties": { + "type": { + "title": "RaiseIntent Response Message type", + "const": "raiseIntentResponse" + }, + "payload": { + "title": "RaiseIntent Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "RaiseIntent Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "RaiseIntent Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json index d597f673a..a4bf1f4e9 100644 --- a/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json @@ -1,25 +1,28 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentRequest.schema.json", - "title": "raiseIntent Agent Request", + "title": "RaiseIntent Agent Request", "type": "object", "allOf": [ { - "$ref": "agentRequest.schema.json" + "$ref": "#/$defs/RaiseIntentRequestBase" }, { - "$ref": "#/$defs/RaiseIntentRequestBase" + "$ref": "agentRequest.schema.json" } ], "$defs": { "RaiseIntentRequestBase": { + "title": "RaiseIntent Request", "type": "object", "description": "A request to raise an intent.", "properties": { "type": { + "title": "RaiseIntent Request Message type", "const": "raiseIntentRequest" }, "payload": { + "title": "RaiseIntent Request Payload", "type": "object", "properties": { "intent": { @@ -29,21 +32,23 @@ "$ref": "../context/context.schema.json" }, "app": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "required": ["intent", "context", "app"], "additionalProperties": false }, "meta": { + "title": "RaiseIntent Request Metadata", + "type": "object", "properties": { "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" }, "source": { - "$ref": "../api/appIdentifier.schema.json" + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } }, "unevaluatedProperties": false, diff --git a/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json index 52caf1369..30c0ec397 100644 --- a/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json @@ -1,35 +1,41 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentResponse.schema.json", - "title": "raiseIntent Agent Response", + "title": "RaiseIntent Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/RaiseIntentResponseBase" }, { - "$ref": "#/$defs/RaiseIntentResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "RaiseIntentResponseBase": { + "title": "RaiseIntent Response", "type": "object", "description": "A response to a request to raise an intent.", "properties": { "type": { + "title": "RaiseIntent Response Message type", "const": "raiseIntentResponse" }, "payload": { + "title": "RaiseIntent Response Payload", "type": "object", "properties": { "intentResolution": { - "$ref": "../api/intentResolution.schema.json" + "$ref": "../api/api.schema.json#/definitions/IntentResolution" } }, "required": ["intentResolution"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "RaiseIntent Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/website/static/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json new file mode 100644 index 000000000..e01cd3510 --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json", + "title": "RaiseIntent Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "raiseIntentAgentErrorResponse.schema.json#/$defs/RaiseIntentErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json index 1db051e5e..6922eae4a 100644 --- a/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json @@ -1,14 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeRequest.schema.json", - "title": "raiseIntent Bridge Request", + "title": "RaiseIntent Bridge Request", "type": "object", "allOf": [ { - "$ref": "bridgeRequest.schema.json" + "$ref": "raiseIntentAgentRequest.schema.json#/$defs/RaiseIntentRequestBase" }, { - "$ref": "raiseIntentAgentRequest.schema.json#/$defs/RaiseIntentRequestBase" + "$ref": "bridgeRequest.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json index b9fbd772c..4f2116658 100644 --- a/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json @@ -1,38 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json", - "title": "raiseIntent Bridge Response", + "title": "RaiseIntent Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "raiseIntentAgentResponse.schema.json#/$defs/RaiseIntentResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - }, - "errorSources": { - "type": "array", - "items": { - "$ref": "../api/desktopAgentIdentifier.schema.json" - } - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/website/static/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json new file mode 100644 index 000000000..d2ec66e4f --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json", + "title": "RaiseIntent Result Agent Error Response", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/RaiseIntentResultErrorResponseBase" + }, + { + "$ref": "agentErrorResponse.schema.json" + } + ], + "$defs": { + "RaiseIntentResultErrorResponseBase": { + "title": "RaiseIntent Result Error Response", + "type": "object", + "description": "A secondary response to a request to raise an intent used to deliver the intent result, which contains an error", + "properties": { + "type": { + "title": "RaiseIntent Result Response Message type", + "const": "raiseIntentResultResponse" + }, + "payload": { + "title": "RaiseIntent Result Error Response Payload", + "type": "object", + "properties": { + "error": { + "title": "RaiseIntent Result Error Message", + "oneOf": [ + { "$ref": "../api/api.schema.json#/definitions/ResultError" }, + { "$ref": "../api/api.schema.json#/definitions/BridgingError" } + ] + } + }, + "required": ["error"], + "additionalProperties": false + }, + "meta": { + "title": "RaiseIntent Result Response Metadata", + "type": "object" + } + }, + "additionalProperties": false + } + } +} diff --git a/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json index 17437e3d8..4768d58f5 100644 --- a/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json @@ -1,31 +1,36 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json", - "title": "raiseIntentResult Agent Response", + "title": "RaiseIntent Result Agent Response", "type": "object", "allOf": [ { - "$ref": "agentResponse.schema.json" + "$ref": "#/$defs/RaiseIntentResultResponseBase" }, { - "$ref": "#/$defs/RaiseIntentResultResponseBase" + "$ref": "agentResponse.schema.json" } ], "$defs": { "RaiseIntentResultResponseBase": { + "title": "RaiseIntent Result Response", "type": "object", "description": "A secondary response to a request to raise an intent used to deliver the intent result", "properties": { "type": { + "title": "RaiseIntent Result Response Message type", "const": "raiseIntentResultResponse" }, "payload": { + "title": "RaiseIntent Result Response Payload", "type": "object", "properties": { "intentResult": { + "title": "IntentResult", "oneOf": [ { "type": "object", + "title": "IntentResult Context", "properties": { "context": { "$ref": "../context/context.schema.json" @@ -36,9 +41,10 @@ }, { "type": "object", + "title": "IntentResult Channel", "properties": { "channel": { - "$ref": "../api/channel.schema.json" + "$ref": "../api/api.schema.json#/definitions/Channel" } }, "required": ["channel"], @@ -50,7 +56,10 @@ "required": ["intentResult"], "additionalProperties": false }, - "meta": true + "meta": { + "title": "RaiseIntent Result Response Metadata", + "type": "object" + } }, "additionalProperties": false } diff --git a/website/static/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json new file mode 100644 index 000000000..280475f34 --- /dev/null +++ b/website/static/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json", + "title": "RaiseIntent Result Bridge Error Response", + "type": "object", + "allOf": [ + { + "$ref": "raiseIntentResultAgentErrorResponse.schema.json#/$defs/RaiseIntentResultErrorResponseBase" + }, + { + "$ref": "bridgeErrorResponse.schema.json" + } + ] +} diff --git a/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json index 0d06c0e72..30c0e680f 100644 --- a/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json @@ -1,32 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json", - "title": "raiseIntentResult Bridge Response", + "title": "RaiseIntent Result Bridge Response", "type": "object", "allOf": [ - { - "$ref": "bridgeResponse.schema.json" - }, { "$ref": "raiseIntentResultAgentResponse.schema.json#/$defs/RaiseIntentResultResponseBase" }, { - "type": "object", - "properties": { - "type": true, - "payload": true, - "meta": { - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "../api/appIdentifier.schema.json" - } - } - } - } - } + "$ref": "bridgeResponse.schema.json" } ] } diff --git a/website/static/schemas/next/bridgingAsyncAPI/README.md b/website/static/schemas/next/bridgingAsyncAPI/README.md new file mode 100644 index 000000000..f097af5b5 --- /dev/null +++ b/website/static/schemas/next/bridgingAsyncAPI/README.md @@ -0,0 +1,38 @@ +# Agent Bridging AsyncAPI schema + +This folder contains an AsyncAPI schema that may be used to generate clients and server stubs for Desktop Agent Bridging. It is based on references to the JSON schema files that define the various messages in the adjacent schemas/bridging folder. + +Example commands to generate code from the AsyncAPI schema: +(run from the root of your FDC3 checkout) + +First run: + +```ps +npm install -g @asyncapi/generator +``` + +Then: + +- .NET + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/dotnet-nats-template -o ../some/path/outside/FDC3/folder + ``` + +- Node.js + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/nodejs-ws-template -o ../some/path/outside/FDC3/folder -p server=local + ``` + +- Markdown + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/markdown-template -o ../some/path/outside/FDC3/folder + ``` + +- HTML + + ```ps + ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/html-template -o ../some/path/outside/FDC3/folder + ``` diff --git a/website/static/schemas/next/bridgingAsyncAPI/bridgingAsyncAPI.json b/website/static/schemas/next/bridgingAsyncAPI/bridgingAsyncAPI.json new file mode 100644 index 000000000..657a4212c --- /dev/null +++ b/website/static/schemas/next/bridgingAsyncAPI/bridgingAsyncAPI.json @@ -0,0 +1,407 @@ +{ + "asyncapi": "2.6.0", + "info": { + "title": "Desktop Agent Bridge", + "version": "1.0.0", + "description": "API for an FDC3 Desktop Agent to communicate with an FDC3 Desktop Agent Bridge and through it, other Desktop Agents.", + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + } + }, + "servers": { + "local": { + "url": "ws://localhost:4475", + "description": "Desktop agent bridge server exposing websocket connection", + "protocol": "ws" + } + }, + "defaultContentType": "application/json", + "channels": { + "/": { + "publish": { + "message": { + "oneOf": [ + { + "$ref": "#/components/messages/handshake" + }, + { + "$ref": "#/components/messages/broadcastRequest-Agent" + }, + { + "$ref": "#/components/messages/findInstancesRequest-Agent" + }, + { + "$ref": "#/components/messages/findInstancesResponse-Agent" + }, + { + "$ref": "#/components/messages/findInstancesErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentRequest-Agent" + }, + { + "$ref": "#/components/messages/findIntentResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentsByContextRequest-Agent" + }, + { + "$ref": "#/components/messages/findIntentsByContextResponse-Agent" + }, + { + "$ref": "#/components/messages/findIntentsByContextErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/getAppMetadataRequest-Agent" + }, + { + "$ref": "#/components/messages/getAppMetadataResponse-Agent" + }, + { + "$ref": "#/components/messages/getAppMetadataErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/openRequest-Agent" + }, + { + "$ref": "#/components/messages/openResponse-Agent" + }, + { + "$ref": "#/components/messages/openErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentRequest-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentResponse-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentErrorResponse-Agent" + }, + { + "$ref": "#/components/messages/privateChannelBroadcast-Agent" + }, + { + "$ref": "#/components/messages/privateChannelEventListenerAdded-Agent" + }, + { + "$ref": "#/components/messages/privateChannelEventListenerRemoved-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnAddContextListener-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnDisconnect-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnUnsubscribe-Agent" + }, + { + "$ref": "#/components/messages/privateChannelOnDisconnect-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentResultResponse-Agent" + }, + { + "$ref": "#/components/messages/raiseIntentResultErrorResponse-Agent" + } + ] + }, + "description": "Messages sent by A Desktop Agent to a Bridge", + "operationId": "Send" + }, + "subscribe": { + "message": { + "oneOf": [ + { + "$ref": "#/components/messages/hello" + }, + { + "$ref": "#/components/messages/authenticationFailed" + }, + { + "$ref": "#/components/messages/connectedAgentsUpdate" + }, + { + "$ref": "#/components/messages/findInstancesResponse-Bridge" + }, + { + "$ref": "#/components/messages/findInstancesErrorResponse-Bridge" + }, + { + "$ref": "#/components/messages/findIntentResponse-Bridge" + }, + { + "$ref": "#/components/messages/findIntentErrorResponse-Bridge" + }, + { + "$ref": "#/components/messages/findIntentsByContextResponse-Bridge" + }, + { + "$ref": "#/components/messages/findIntentsByContextErrorResponse-Bridge" + }, + { + "$ref": "#/components/messages/getAppMetadataResponse-Bridge" + }, + { + "$ref": "#/components/messages/getAppMetadataErrorResponse-Bridge" + }, + { + "$ref": "#/components/messages/openResponse-Bridge" + }, + { + "$ref": "#/components/messages/openErrorResponse-Bridge" + }, + { + "$ref": "#/components/messages/raiseIntentResponse-Bridge" + }, + { + "$ref": "#/components/messages/raiseIntentErrorResponse-Bridge" + }, + { + "$ref": "#/components/messages/raiseIntentResultResponse-Bridge" + }, + { + "$ref": "#/components/messages/raiseIntentResultErrorResponse-Bridge" + } + ] + }, + "description": "Messages sent by a Bridge to a Desktop Agent", + "operationId": "Receive" + } + } + }, + "components": { + "messages": { + "broadcastRequest-Agent": { + "payload": { + "$ref": "../bridging/broadcastAgentRequest.schema.json#" + } + }, + "hello": { + "payload": { + "$ref": "../bridging/connectionStep2Hello.schema.json#" + } + }, + "handshake": { + "payload": { + "$ref": "../bridging/connectionStep3Handshake.schema.json#" + } + }, + "authenticationFailed": { + "payload": { + "$ref": "../bridging/connectionStep4AuthenticationFailed.schema.json#" + } + }, + "connectedAgentsUpdate": { + "payload": { + "$ref": "../bridging/connectionStep6ConnectedAgentsUpdate.schema.json#" + } + }, + "findInstancesRequest-Agent": { + "payload": { + "$ref": "../bridging/findInstancesAgentRequest.schema.json#" + } + }, + "findInstancesResponse-Agent": { + "payload": { + "$ref": "../bridging/findInstancesAgentResponse.schema.json#" + } + }, + "findInstancesErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/findInstancesAgentErrorResponse.schema.json#" + } + }, + "findInstancesResponse-Bridge": { + "payload": { + "$ref": "../bridging/findInstancesBridgeResponse.schema.json#" + } + }, + "findInstancesErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/findInstancesBridgeErrorResponse.schema.json#" + } + }, + "findIntentRequest-Agent": { + "payload": { + "$ref": "../bridging/findIntentAgentRequest.schema.json#" + } + }, + "findIntentResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentAgentResponse.schema.json#" + } + }, + "findIntentErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentAgentErrorResponse.schema.json#" + } + }, + "findIntentResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentBridgeResponse.schema.json#" + } + }, + "findIntentErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentBridgeErrorResponse.schema.json#" + } + }, + "findIntentsByContextRequest-Agent": { + "payload": { + "$ref": "../bridging/findIntentsByContextAgentRequest.schema.json#" + } + }, + "findIntentsByContextResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentsByContextAgentResponse.schema.json#" + } + }, + "findIntentsByContextErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/findIntentsByContextAgentErrorResponse.schema.json#" + } + }, + "findIntentsByContextResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentsByContextBridgeResponse.schema.json#" + } + }, + "findIntentsByContextErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/findIntentsByContextBridgeErrorResponse.schema.json#" + } + }, + "getAppMetadataRequest-Agent": { + "payload": { + "$ref": "../bridging/getAppMetadataAgentRequest.schema.json#" + } + }, + "getAppMetadataResponse-Agent": { + "payload": { + "$ref": "../bridging/getAppMetadataAgentResponse.schema.json#" + } + }, + "getAppMetadataErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/getAppMetadataAgentErrorResponse.schema.json#" + } + }, + "getAppMetadataResponse-Bridge": { + "payload": { + "$ref": "../bridging/getAppMetadataBridgeResponse.schema.json#" + } + }, + "getAppMetadataErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/getAppMetadataBridgeErrorResponse.schema.json#" + } + }, + "openRequest-Agent": { + "payload": { + "$ref": "../bridging/openAgentRequest.schema.json#" + } + }, + "openResponse-Agent": { + "payload": { + "$ref": "../bridging/openAgentResponse.schema.json#" + } + }, + "openErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/openAgentErrorResponse.schema.json#" + } + }, + "openResponse-Bridge": { + "payload": { + "$ref": "../bridging/openBridgeResponse.schema.json#" + } + }, + "openErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/openBridgeErrorResponse.schema.json#" + } + }, + "privateChannelBroadcast-Agent": { + "payload": { + "$ref": "../bridging/privateChannelBroadcastAgentRequest.schema.json#" + } + }, + "privateChannelEventListenerAdded-Agent": { + "payload": { + "$ref": "../bridging/privateChannelEventListenerAddedAgentRequest.schema.json#" + } + }, + "privateChannelEventListenerRemoved-Agent": { + "payload": { + "$ref": "../bridging/privateChannelEventListenerRemovedAgentRequest.schema.json#" + } + }, + "privateChannelOnAddContextListener-Agent": { + "payload": { + "$ref": "../bridging/privateChannelOnAddContextListenerAgentRequest.schema.json#" + } + }, + "privateChannelOnDisconnect-Agent": { + "payload": { + "$ref": "../bridging/privateChannelOnDisconnectAgentRequest.schema.json#" + } + }, + "privateChannelOnUnsubscribe-Agent": { + "payload": { + "$ref": "../bridging/privateChannelOnUnsubscribeAgentRequest.schema.json#" + } + }, + "raiseIntentRequest-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentAgentRequest.schema.json#" + } + }, + "raiseIntentResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentAgentResponse.schema.json#" + } + }, + "raiseIntentErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentAgentErrorResponse.schema.json#" + } + }, + "raiseIntentResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentBridgeResponse.schema.json#" + } + }, + "raiseIntentErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentBridgeErrorResponse.schema.json#" + } + }, + "raiseIntentResultResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentResultAgentResponse.schema.json#" + } + }, + "raiseIntentResultErrorResponse-Agent": { + "payload": { + "$ref": "../bridging/raiseIntentResultAgentErrorResponse.schema.json#" + } + }, + "raiseIntentResultResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentResultBridgeResponse.schema.json#" + } + }, + "raiseIntentResultErrorResponse-Bridge": { + "payload": { + "$ref": "../bridging/raiseIntentResultBridgeErrorResponse.schema.json#" + } + } + } + } +} \ No newline at end of file From 4a36deb1a3844a874aa5636950fb41012e1c17dc Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 17 Jul 2023 18:42:07 +0100 Subject: [PATCH 076/106] prettier --- src/api/DesktopAgent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/DesktopAgent.ts b/src/api/DesktopAgent.ts index f824fb8ca..f9b989c2b 100644 --- a/src/api/DesktopAgent.ts +++ b/src/api/DesktopAgent.ts @@ -513,7 +513,7 @@ export interface DesktopAgent { * Retrieves the `AppMetadata` for an `AppIdentifier`, which provides additional metadata (such as icons, * a title and description) from the App Directory record for the application, that may be used for display * purposes. - * + * * If the app is not found, the promise MUST be rejected with an `Error` Object with the `message` given by `ResolveError.TargetAppUnavailable`, or (if connected to a Desktop Agent Bridge) an error from the `BridgingError` enumeration. * * ```js From 2a5ba3305be45e7aea4147805a81840735068c1a Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 18 Jul 2023 10:48:32 +0100 Subject: [PATCH 077/106] improve labelling of schema links --- docs/agent-bridging/spec.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 9dc826506..6005e7e43 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -509,7 +509,7 @@ Request messages from a Desktop Agent use the following format: } ``` -**Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentRequest.schema.json](/schemas/next/bridging/agentRequest.schema.json) +**Request Schema**: [https://fdc3.finos.org/schemas/next/bridging/agentRequest.schema.json](/schemas/next/bridging/agentRequest.schema.json) If the FDC3 API call underlying the request message includes a target (typically defined by an `app` argument, in the form of an AppIdentifier object) it is the responsibility of the Desktop Agent to copy that argument into the `meta.destination` field of the message and to ensure that it includes a `meta.destination.desktopAgent` value. If the target is provided in the FDC3 API call, but without a `meta.destination.desktopAgent` value, the Desktop Agent should assume that the call relates to a local application and does not need to send it to the bridge. @@ -519,7 +519,7 @@ Requests without a `meta.destination` field will be forwarded to all other agent Request messages forwarded by the Bridge onto other Desktop Agents use the same format as incoming requests from Desktop Agents, with the exception that the `desktopAgent` properties of the `meta.source` field MUST be provided, and should be overwritten by the Bridge (based on the connection that the message was received from) to prevent spoofing of request message origins. -**Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json](/schemas/next/bridging/bridgeRequest.schema.json) +**Bridge Request Schema**: [https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json](/schemas/next/bridging/bridgeRequest.schema.json) #### Response Messages From ebf97b140400a5a3560617f091075b9932f1e489 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 18 Jul 2023 10:52:46 +0100 Subject: [PATCH 078/106] Update .semgrepignore --- .semgrepignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.semgrepignore b/.semgrepignore index bd09db44d..b7682dfb6 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -3,3 +3,6 @@ website/** # Just used for build so ignoring s2tQuicktypeUtil.js schemas/api/t2sQuicktypeUtil.js + +# API schema set for localhost gets picked up by semgrep rule +schemas/bridgingAsyncAPI/bridgingAsyncAPI.json From be527e6d6f7eff79c263ee1ac9f98b4c0e435381 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 18 Jul 2023 11:49:25 +0100 Subject: [PATCH 079/106] migrating new context schemas to schemas folder --- .../schemas/next => schemas/context}/action.schema.json | 0 schemas/context/chart.schema.json | 5 ++++- .../schemas/next => schemas/context}/chatMessage.schema.json | 0 .../schemas/next => schemas/context}/chatRoom.schema.json | 0 .../next => schemas/context}/chatSearchCriteria.schema.json | 0 .../schemas/next => schemas/context}/interaction.schema.json | 0 .../schemas/next => schemas/context}/message.schema.json | 0 .../next => schemas/context}/transactionresult.schema.json | 0 8 files changed, 4 insertions(+), 1 deletion(-) rename {website/static/schemas/next => schemas/context}/action.schema.json (100%) rename {website/static/schemas/next => schemas/context}/chatMessage.schema.json (100%) rename {website/static/schemas/next => schemas/context}/chatRoom.schema.json (100%) rename {website/static/schemas/next => schemas/context}/chatSearchCriteria.schema.json (100%) rename {website/static/schemas/next => schemas/context}/interaction.schema.json (100%) rename {website/static/schemas/next => schemas/context}/message.schema.json (100%) rename {website/static/schemas/next => schemas/context}/transactionresult.schema.json (100%) diff --git a/website/static/schemas/next/action.schema.json b/schemas/context/action.schema.json similarity index 100% rename from website/static/schemas/next/action.schema.json rename to schemas/context/action.schema.json diff --git a/schemas/context/chart.schema.json b/schemas/context/chart.schema.json index d5b493a7d..215326f61 100644 --- a/schemas/context/chart.schema.json +++ b/schemas/context/chart.schema.json @@ -20,7 +20,10 @@ "enum": [ "line", "bar", "stacked-bar", "mountain", "candle", "pie", "scatter", "histogram", "heatmap", "custom"] }, "otherConfig": { - "type": "object" + "type": "array", + "items": { + "$ref": "context.schema.json#" + } } }, "required": ["instruments"] diff --git a/website/static/schemas/next/chatMessage.schema.json b/schemas/context/chatMessage.schema.json similarity index 100% rename from website/static/schemas/next/chatMessage.schema.json rename to schemas/context/chatMessage.schema.json diff --git a/website/static/schemas/next/chatRoom.schema.json b/schemas/context/chatRoom.schema.json similarity index 100% rename from website/static/schemas/next/chatRoom.schema.json rename to schemas/context/chatRoom.schema.json diff --git a/website/static/schemas/next/chatSearchCriteria.schema.json b/schemas/context/chatSearchCriteria.schema.json similarity index 100% rename from website/static/schemas/next/chatSearchCriteria.schema.json rename to schemas/context/chatSearchCriteria.schema.json diff --git a/website/static/schemas/next/interaction.schema.json b/schemas/context/interaction.schema.json similarity index 100% rename from website/static/schemas/next/interaction.schema.json rename to schemas/context/interaction.schema.json diff --git a/website/static/schemas/next/message.schema.json b/schemas/context/message.schema.json similarity index 100% rename from website/static/schemas/next/message.schema.json rename to schemas/context/message.schema.json diff --git a/website/static/schemas/next/transactionresult.schema.json b/schemas/context/transactionresult.schema.json similarity index 100% rename from website/static/schemas/next/transactionresult.schema.json rename to schemas/context/transactionresult.schema.json From 6bb5028926a93e880f80ec11914aa50e9532e614 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 18 Jul 2023 12:00:27 +0100 Subject: [PATCH 080/106] clean up duplication in references --- docs/references.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/references.md b/docs/references.md index 03e138e3e..4e30a63f0 100644 --- a/docs/references.md +++ b/docs/references.md @@ -7,28 +7,28 @@ sidebar_label: References The following normative documents contain provisions, which, through reference in this text, constitute provisions of this Standard. For dated references, subsequent amendments to, or revisions of, any of these publications do not apply. However, parties to agreements based on this Standard are encouraged to investigate the possibility of applying the most recent editions of the normative documents indicated below. For undated references, the latest edition of the normative document referred to applies: -- **Apache 2.0 open-source license**, [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0). -- **Community Specification license**, [https://github.com/CommunitySpecification/1.0](https://github.com/CommunitySpecification/1.0) -- **ISO 3166-1**, _Codes for the representation of names of countries and their subdivisions – Part 1: Country codes_, [https://www.iso.org/iso-3166-country-codes.html](https://www.iso.org/iso-3166-country-codes.html). -- **ISO 8601-1:2019**, _Date and time — Representations for information interchange — Part 1: Basic rules_, [https://www.iso.org/standard/70907.html](https://www.iso.org/standard/70907.html) -- **JSON Schema**, [https://json-schema.org/](https://json-schema.org/). -- **OpenAPI Standard v3.0**, [https://www.openapis.org/](https://www.openapis.org/). -- **RFC 2119**, _Keywords for use in RFCs to Indicate Requirement Levels, March 1997_, [https://datatracker.ietf.org/doc/html/rfc2119](https://datatracker.ietf.org/doc/html/rfc2119). -- **RFC 2782**, _A DNS RR for specifying the location of services (DNS SRV), February 2000_, [https://datatracker.ietf.org/doc/html/rfc2782](https://datatracker.ietf.org/doc/html/rfc2782). -- **RFC 4122**, _A Universally Unique IDentifier (UUID) URN Namespace, July 2005_, [https://datatracker.ietf.org/doc/html/rfc4122](https://datatracker.ietf.org/doc/html/rfc4122). -- **RFC 5646**, _Tags for Identifying Languages, September 2009_, [https://datatracker.ietf.org/doc/html/rfc5646](https://datatracker.ietf.org/doc/html/rfc5646). -- **TypeScript Programming Language**, [https://www.typescriptlang.org/](https://www.typescriptlang.org/). -- **Web Application Manifest**, _W3C Working Draft_, February 2022 [https://www.w3.org/TR/appmanifest/](https://www.w3.org/TR/appmanifest/) +- **Apache 2.0 open-source license**, . +- **Community Specification license**, +- **ISO 3166-1**, _Codes for the representation of names of countries and their subdivisions – Part 1: Country codes_, . +- **ISO 8601-1:2019**, _Date and time — Representations for information interchange — Part 1: Basic rules_, +- **JSON Schema**, . +- **OpenAPI Standard v3.0**, . +- **RFC 2119**, _Keywords for use in RFCs to Indicate Requirement Levels, March 1997_, . +- **RFC 2782**, _A DNS RR for specifying the location of services (DNS SRV), February 2000_, . +- **RFC 4122**, _A Universally Unique IDentifier (UUID) URN Namespace, July 2005_, . +- **RFC 5646**, _Tags for Identifying Languages, September 2009_, . +- **TypeScript Programming Language**, . +- **Web Application Manifest**, _W3C Working Draft_, February 2022 The following documents may be useful in understanding certain aspects of this Standard; however, knowledge of them is not essential to the creation of a compliant implementation of this Standard: -- **CUSIP**, _Committee on Uniform Security Identification Procedures_, [https://www.cusip.com/identifiers.html#/CUSIP](https://www.cusip.com/identifiers.html#/CUSIP). -- **FIGI**, _Financial Instrument Global Identifier_, [https://www.openfigi.com/about/figi](https://www.openfigi.com/about/figi). -- **ISIN**, _International Securities Identification Number_, [https://www.isin.org/isin/](https://www.isin.org/isin/) -- **LEI**, _Legal Entity Identifier based on the ISO 17442 standard_, [https://www.legalentityidentifier.co.uk/what-is-lei-code/](https://www.legalentityidentifier.co.uk/what-is-lei-code/). -- **npm**, [https://docs.npmjs.com/about-npm](https://docs.npmjs.com/about-npm). -- **PermID**, _Permanent Identifiers_, [https://permid.org/](https://permid.org/). -- **pnpm**, [https://pnpm.io/motivation](https://pnpm.io/motivation]). -- **REST**, [https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm), [https://restfulapi.net/](https://restfulapi.net/). -- **SEDOL**, _Stock Exchange Daily Official List_, [https://www.lseg.com/sedol](https://www.lseg.com/sedol). -- **yarn**, [https://yarnpkg.com/getting-started](https://yarnpkg.com/getting-started). +- **CUSIP**, _Committee on Uniform Security Identification Procedures_, . +- **FIGI**, _Financial Instrument Global Identifier_, . +- **ISIN**, _International Securities Identification Number_, +- **LEI**, _Legal Entity Identifier based on the ISO 17442 standard_, . +- **npm**, . +- **PermID**, _Permanent Identifiers_, . +- **pnpm**, . +- **REST**, , . +- **SEDOL**, _Stock Exchange Daily Official List_, . +- **yarn**, . From 5aca58b08459013fbc32bbbe4033ecbb8137c315 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 18 Jul 2023 13:38:03 +0100 Subject: [PATCH 081/106] Update bridging type generation README.md --- src/bridging/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/bridging/README.md b/src/bridging/README.md index 6b20e09e3..5626b716a 100644 --- a/src/bridging/README.md +++ b/src/bridging/README.md @@ -1,16 +1,16 @@ # Bridging Message types generation README -This folder contains Typescript interfaces, in BridgingTypes.ts generated from the context JSONSchema (https://json-schema.org/) files via quicktype (https://quicktype.io/). Source files may also be generated for us in other languages supported by quicktype. +This folder contains Typescript interfaces, in BridgingTypes.ts generated from the context JSONSchema (https://json-schema.org/) files via quicktype (https://quicktype.io/). Source files may also be generated for us in other languages supported by Quicktype. Please note that these definitions are provided to help developers working in TypeScript to produce valid bridging messages objects - but should not be considered the 'source of truth' for message definitions (instead look to the schemas and documentation). -It is not always possible to perfectly replicate a type/interface defined in JSONSchema via TypeScript. Hence, in the event of any disagreement between the definitions, the JSONSchema should be assumed to be correct, rather than the Typescript. For example, JSONSchema may define optional fields on an object + a restriction on the type of additional properties (via `"additionalProperties": { "type": "string"}`), which will result in an index signature `[property: string]: string;` in generated TypeScript. That signature, is incompatible with with an optional properties (including string properties) as they have type `string | undefined`. A similar problem may occur in JSON Schema if the schema is used to create a subtype via composition as `additionalProperties` is not aware of teh subschema's definitions. Both issues can be worked around by using `unevaluatedProperties` in the schema, which will defer to the declared type of the optional property in the subschema, but is also currently ignored by quicktype - resulting in a type that will compile, but doesn't restrict the type of optional property values as defined in the schema. +It is not always possible to perfectly replicate a type/interface defined in JSONSchema via TypeScript. Hence, if there is any disagreement between the definitions, the JSON Schema should be assumed to be correct, rather than the TypeScript. For example, JSON Schema may define optional fields on an object + a restriction on the type of additional properties (via `"additionalProperties": { "type": "string"}`), which will result in an index signature `[property: string]: string;` in generated TypeScript. That signature is incompatible with optional properties (including string properties) as they have type `string | undefined`. A similar problem may occur in JSON Schema if the schema is used to create a subtype via composition as `additionalProperties` is not aware of the subschema's definitions. Both issues can be worked around by using `unevaluatedProperties` in the schema, which will defer to the declared type of the optional property in the subschema, but is also currently ignored by Quicktype - resulting in a type that will compile but doesn't restrict the type of optional property values as defined in the schema. -Further, quicktype doesn't always perfectly replicate polymorphic fields specified with `oneOf` in JSONSchema as it will usually merge the different objects into a single type (where fields not in one of the constituent schemas become optional) rather than creating a union type. In such situations, the type produced is usable (has all the necessary fields) but may allow the construction of invalid instances which are missing required properties or include properties from the multiple schemas combined, which are not possible/valid according to JSONSchema. +Further, Quicktype doesn't always perfectly replicate polymorphic fields specified with `oneOf` in JSON Schema as it will usually merge the different objects into a single type (where fields not in one of the constituent schemas become optional) rather than creating a union type. In such situations, the type produced is usable (has all the necessary fields) but may allow the construction of invalid instances which are missing required properties or include properties from the multiple schemas combined, which are not possible/valid according to JSON Schema. -Hence, the Types provided here can be used to provide valid message objects and to read/write their JSON encodings, but may not detect or prevent a limited set of invalid objects that would be identified by JSONSchema. +Hence, the Types provided here can be used to provide valid message objects and to read/write their JSON encodings, but may not detect or prevent a limited set of invalid objects that would be identified by JSON Schema. -Finally, quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the main interface definition. These often do not have unique names. Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the main type, e.g.: +Finally, Quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the primary interface definition. These often do not have unique names (generated from title fields in the schemas). If a name conflict is encountered, Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the primary type, e.g.: ```TypeScript export interface Instrument { @@ -43,10 +43,11 @@ export interface FluffyMarket { } ``` -and should not be considered a planned part of the type structure (which should not be replicated in any derivative work). When applied, the naming of these sub-units is not used, rather they are replaced with their contents. It is hoped that we will be to generate better names of these sub-units in future. +and should not be considered a planned part of the type structure (which should not be replicated in any derivative work). When applied, the naming of these sub-units is not used, rather they are replaced with their contents. Generating better names for these sub-units is usually a case of adding or adjusting `title` fields on the relevant elements of the schema documents. -Finally, please note that the latest version of quicktype (at the time of writing `23.0.19`) has a number of bugs that must be worked around: +Finally, please note that the latest version of Quicktype (at the time of writing `23.0.49`) has a number of bugs that must be worked around: - Using a directory or .schema.json files as a source will cause the input type argument `-s schema` to be ignored, causing the files to be interpreted as JSON rather than JSON Schema. - A utility is provided in this repository (_../../quicktypeUtil.js_) to work around this bug by listing directories and constructing a call to quicktype where each file is provided as an individual source. - Setting the `--nice-property-names` TypeScript output option will crash the generator and can't be used. +- The --debug setting must be the first argument passed or it will be ignored. From 0385be12f9b2014529d64a39011121bd727068f6 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Tue, 18 Jul 2023 05:55:22 -0700 Subject: [PATCH 082/106] small cleanup (#75) * small cleanup * regenerate types/copy schemas --------- Co-authored-by: Kris West --- schemas/bridging/openAgentRequest.schema.json | 12 ++- src/bridging/BridgingTypes.ts | 80 ++++++++++++++++++- .../bridging/openAgentRequest.schema.json | 12 ++- 3 files changed, 98 insertions(+), 6 deletions(-) diff --git a/schemas/bridging/openAgentRequest.schema.json b/schemas/bridging/openAgentRequest.schema.json index 13f4cbf01..2e2fcc9c5 100644 --- a/schemas/bridging/openAgentRequest.schema.json +++ b/schemas/bridging/openAgentRequest.schema.json @@ -26,7 +26,17 @@ "type": "object", "properties": { "app": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "type": "object", + "title": "App to open", + "description": "The application to open on the specified Desktop Agent", + "allOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + } + ] }, "context": { "$ref": "../context/context.schema.json" diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 3f99c36b9..18450f121 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -2463,10 +2463,71 @@ export interface OpenAgentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface OpenAgentRequestPayload { - app: AppIdentifier; + /** + * The application to open on the specified Desktop Agent + */ + app: AppToOpen; context?: ContextElement; } +/** + * The application to open on the specified Desktop Agent + * + * Field that represents the source application instance that the response was produced by, + * or the Desktop Agent if it produced the response without an application. + * + * Field that represents the source Desktop Agent that a response was received from. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppToOpen { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + /** * A response to an open request * @@ -2586,7 +2647,10 @@ export interface OpenBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface OpenBridgeRequestPayload { - app: AppIdentifier; + /** + * The application to open on the specified Desktop Agent + */ + app: AppToOpen; context?: ContextElement; } @@ -5444,11 +5508,19 @@ const typeMap: any = { ), OpenAgentRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('AppIdentifier') }, + { json: 'app', js: 'app', typ: r('AppToOpen') }, { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, ], false ), + AppToOpen: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), OpenAgentResponse: o( [ { json: 'meta', js: 'meta', typ: r('OpenAgentResponseMeta') }, @@ -5505,7 +5577,7 @@ const typeMap: any = { ), OpenBridgeRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('AppIdentifier') }, + { json: 'app', js: 'app', typ: r('AppToOpen') }, { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, ], false diff --git a/website/static/schemas/next/bridging/openAgentRequest.schema.json b/website/static/schemas/next/bridging/openAgentRequest.schema.json index 13f4cbf01..2e2fcc9c5 100644 --- a/website/static/schemas/next/bridging/openAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/openAgentRequest.schema.json @@ -26,7 +26,17 @@ "type": "object", "properties": { "app": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "type": "object", + "title": "App to open", + "description": "The application to open on the specified Desktop Agent", + "allOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + } + ] }, "context": { "$ref": "../context/context.schema.json" From 4b09896c026bf241e9acd1cd8963b8aaf5c6c179 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 18 Jul 2023 14:00:50 +0100 Subject: [PATCH 083/106] Adding clarification to SCOPE.md --- SCOPE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SCOPE.md b/SCOPE.md index 285f81a38..99da1459e 100644 --- a/SCOPE.md +++ b/SCOPE.md @@ -1,6 +1,6 @@ # Scope -The FDC3 standard specifies protocols and taxonomies to advance the ability of desktop applications in financial workflows to interoperate in a plug-and-play fashion, without prior bi-lateral agreements. +The FDC3 Standard specifies protocols and taxonomies to advance the ability of desktop applications in financial workflows to interoperate in a plug-and-play fashion, without prior bi-lateral agreements. Financial desktop applications include any app used in common financial workflows: @@ -10,12 +10,12 @@ Financial desktop applications include any app used in common financial workflow * Common desktop applications not specific to finance, but critical to workflows - such as Excel, Outlook, etc. * PWAs & Web applications running in a commercial browser -This standards group is focused specifically on the desktop. Activities of the desktop interoperability group do not include: +This standards group is focused specifically on the desktop, hence, it's activities do not include: * Defining financial objects - where existing standards are well established * Interoperability between mobile apps -* Interoperability via REST or other client to server communication +* Interoperability via REST or other client to server communication, except where used locally for Desktop Agents to communicate with each other in support of desktop interoperability (Agent Bridging) -Note: While these areas are out of scope, compatibility with Mobile and/or REST are still valid points of consideration for the FDC3. +Note: While these areas are out of scope, compatibility with Mobile and/or REST are still valid points of consideration for the FDC3 Standard. Any changes of Scope are not retroactive. From 018108d223c783f6d55f3ea8f6ea38585f750221 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Tue, 18 Jul 2023 06:03:21 -0700 Subject: [PATCH 084/106] findIntent fix (#76) * findIntent fix * Regenerate types and copy schemas again --------- Co-authored-by: Kris West --- schemas/bridging/findIntentAgentRequest.schema.json | 4 +--- src/bridging/BridgingTypes.ts | 8 ++++---- .../next/bridging/findIntentAgentRequest.schema.json | 4 +--- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/schemas/bridging/findIntentAgentRequest.schema.json b/schemas/bridging/findIntentAgentRequest.schema.json index d5255f07c..ce93447db 100644 --- a/schemas/bridging/findIntentAgentRequest.schema.json +++ b/schemas/bridging/findIntentAgentRequest.schema.json @@ -43,9 +43,7 @@ "properties": { "requestUuid": true, "timestamp": true, - "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } + "source": true }, "unevaluatedProperties": false } diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 18450f121..e683959cb 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1658,7 +1658,7 @@ export interface FindIntentsAgentRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceObject; + source?: SourceIdentifier; timestamp: Date; /** * Optional field that represents the destination that the request should be routed to. Must @@ -1811,7 +1811,7 @@ export interface FindIntentBridgeRequestMeta { * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source: MetaSource; + source: BridgeSourceIdentifier; timestamp: Date; /** * Optional field that represents the destination that the request should be routed to. Must @@ -5135,7 +5135,7 @@ const typeMap: any = { FindIntentsAgentRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], @@ -5210,7 +5210,7 @@ const typeMap: any = { FindIntentBridgeRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'source', js: 'source', typ: r('BridgeSourceIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], diff --git a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json index d5255f07c..ce93447db 100644 --- a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json @@ -43,9 +43,7 @@ "properties": { "requestUuid": true, "timestamp": true, - "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } + "source": true }, "unevaluatedProperties": false } From 499e5bb2bf2a64e52959e9e22637df301d3f8c60 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 19 Jul 2023 16:02:12 +0100 Subject: [PATCH 085/106] update readme for bridging --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 90a163e26..60b6c2ee2 100755 --- a/README.md +++ b/README.md @@ -51,17 +51,17 @@ # How Does It Work? -FDC3 includes a standardized API for a Desktop agent, an OpenAPI App Directory, standard verbs to invoke actions between applications (called "intents") and standard formats for data passed between applications (called "context data"). +FDC3 includes a standardized API for a Desktop agent, an OpenAPI App Directory, standard verbs to invoke actions between applications (called "intents"), standard formats for data passed between applications (called "context data") and a wire-protocol for Desktop Agents to communicate with each other (called "Desktop Agent Bridging"). -Hence, the standard currently consists of four parts: +Hence, the standard currently consists of five parts: 1. [API Part](https://fdc3.finos.org/docs/api/spec) 2. [App Directory Part](https://fdc3.finos.org/docs/app-directory/overview) 3. [Intents part](https://fdc3.finos.org/docs/intents/spec) 4. [Context Data Part](https://fdc3.finos.org/docs/context/spec) +5. [Agent Bridging Part](https://fdc3.finos.org/docs/next/agent-bridging/spec) [`@experimental`](https://fdc3.finos.org/docs/fdc3-compliance#experimental-features) -The specifications are informed by agreed [business use cases](https://fdc3.finos.org/docs/use-cases/overview), -and implemented and used by leading [financial industry participants](https://fdc3.finos.org/community#type-all). +The specifications are informed by agreed [business use cases](https://fdc3.finos.org/docs/use-cases/overview), and implemented and used by leading [financial industry participants](https://fdc3.finos.org/community#type-all). ## More Resources From d584d51c2f41c65408320b27d16ed5d04cfb4794 Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Wed, 19 Jul 2023 09:43:50 -0700 Subject: [PATCH 086/106] context is options in findIntent (#77) --- schemas/bridging/findIntentAgentRequest.schema.json | 2 +- src/bridging/BridgingTypes.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/schemas/bridging/findIntentAgentRequest.schema.json b/schemas/bridging/findIntentAgentRequest.schema.json index ce93447db..c4e8a89fa 100644 --- a/schemas/bridging/findIntentAgentRequest.schema.json +++ b/schemas/bridging/findIntentAgentRequest.schema.json @@ -34,7 +34,7 @@ "$ref": "../context/context.schema.json" } }, - "required": ["intent", "context"], + "required": ["intent"], "additionalProperties": false }, "meta": { diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index e683959cb..588e92e34 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1672,7 +1672,7 @@ export interface FindIntentsAgentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface FindIntentsAgentRequestPayload { - context: ContextElement; + context?: ContextElement; intent: string; } @@ -1825,7 +1825,7 @@ export interface FindIntentBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface FindIntentBridgeRequestPayload { - context: ContextElement; + context?: ContextElement; intent: string; } @@ -5143,7 +5143,7 @@ const typeMap: any = { ), FindIntentsAgentRequestPayload: o( [ - { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, { json: 'intent', js: 'intent', typ: '' }, ], false @@ -5218,7 +5218,7 @@ const typeMap: any = { ), FindIntentBridgeRequestPayload: o( [ - { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, { json: 'intent', js: 'intent', typ: '' }, ], false From 37decfdff4d2cc0828e5b952a40d9d9d45892830 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 19 Jul 2023 18:14:09 +0100 Subject: [PATCH 087/106] response messages don't need a source field --- docs/agent-bridging/spec.md | 18 +- schemas/bridging/agentResponse.schema.json | 7 +- schemas/bridging/common.schema.json | 5 - src/bridging/BridgingTypes.ts | 187 +++------------------ 4 files changed, 33 insertions(+), 184 deletions(-) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 6005e7e43..0d0419fd7 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -526,7 +526,7 @@ Request messages forwarded by the Bridge onto other Desktop Agents use the same Response messages from a Desktop Agent back to the Bridge use a similar format that is differentiated from requests by the presence of a `meta.responseUuid` field. They MUST also quote the `meta.requestUuid` that they are responding to. :::info -Response messages do not include a `meta.destination` as the routing of responses is handled by the Bridge via the `meta.requestUuid` field. +Response messages do not include a `meta.destination` as the routing of responses is handled by the Bridge via the `meta.requestUuid` field. They also do not include a `source` field as responses are currently always from the Desktop Agent, and the bridge is required to provide this information itself to prevent spoofing. ::: There are two types of each response message, a successful response and an error response. @@ -572,10 +572,7 @@ There are two types of each response message, a successful response and an error /** UUID for this specific response message. */ responseUuid: string, /** Timestamp at which request was generated */ - timestamp: Date, - /** AppIdentifiers or DesktopAgentIdentifiers for the source - * that generated the response to the request. */ - source?: (AppIdentifier | DesktopAgentIdentifier), + timestamp: Date } } ``` @@ -602,10 +599,7 @@ There are two types of each response message, a successful response and an error /** UUID for this specific response message. */ responseUuid: string, /** Timestamp at which request was generated */ - timestamp: Date, - /** AppIdentifiers or DesktopAgentIdentifiers for the source - * that generated the response to the request. */ - source?: (AppIdentifier | DesktopAgentIdentifier), + timestamp: Date } } ``` @@ -614,9 +608,9 @@ There are two types of each response message, a successful response and an error ##### Response Messages Collated and Forwarded by the Bridge -Responses from individual Desktop Agents are collated by the Bridge and are forwarded on to the the Desktop Agent that initiated the interaction. The format used is very similar to that used for responses by the Desktop Agents, with the exception of the source information in the `meta` field. Specifically, the `meta.source` field is replaced by two arrays, `meta.sources` and `meta.errorSources`, which provide details on the Desktop agents that responded normally or responded with errors. The detail of any errors returned (in the `payload.error` field of a Desktop Agent's response) is collected up into a `meta.errorDetails` field. Moving the error details from the `payload` to the `meta` field enables the return of a valid response to the originating Desktop Agent in cases where some agents produced valid responses, and others produced errors. +Responses from individual Desktop Agents are collated by the Bridge and are forwarded on to the the Desktop Agent that initiated the interaction. The format used is very similar to that used for responses by the Desktop Agents, with the exception of the source information in the `meta` field. Specifically, the `meta.source` field does not need to be provided by agents, as responses are currently always provided by the desktop agent, whose details will be provided by the bridge when it receives the response. In responses from the bridge, the `meta.source` is replaced by two arrays, `meta.sources` and `meta.errorSources`, which provide details on the Desktop agents that responded normally or responded with errors. The detail of any errors returned (in the `payload.error` field of a Desktop Agent's response) is collected up into a `meta.errorDetails` field. Moving the error details from the `payload` to the `meta` field enables the return of a valid response to the originating Desktop Agent in cases where some agents produced valid responses, and others produced errors. -Hence, for responses forwarded by the bridge there is only a single type of response messages from the Bridge returned to agents, one for requests that received at least one successful response, and another for use when all agents (or the targeted agent) returned an error. +Hence, for responses forwarded by the bridge there are two type of response messages from the Bridge returned to agents, one for requests that received at least one successful response, and another for use when all agents (or the targeted agent) returned an error. ##### At Least One Successful Response @@ -799,7 +793,7 @@ For example, a `raiseIntent` targeted at an app instance that no longer exists m } ``` -For messages that target a specific agent, the Desktop Agent Bridge will augment the message with a `source` field and return it to the calling agent and the app that made the original request. +For messages that target a specific agent, the Desktop Agent Bridge will augment the message with source information and return it to the calling agent, which will then respond to the app that made the original request. If all agents (or the targeted agent) return errors, then a suitable error string should be forwarded in the `payload.error` field as returned by at least one of the agents. This allows the agent that made the original request to return that error to the app that made the original API call. All agents that returned errors should be listed in the `errorSources` array and the error message strings they returned (or that were applied because they timed out) listed in the `errorDetails` array (in the same order as `errorSources`). diff --git a/schemas/bridging/agentResponse.schema.json b/schemas/bridging/agentResponse.schema.json index b25fe59bf..8c795b59e 100644 --- a/schemas/bridging/agentResponse.schema.json +++ b/schemas/bridging/agentResponse.schema.json @@ -44,14 +44,9 @@ }, "timestamp": { "$ref": "common.schema.json#/$defs/Timestamp" - }, - "source": { - "title": "Response Source identifier", - "description": "Field that represents the source application instance that the response was produced by, or the Desktop Agent if it produced the response without an application.", - "$ref": "common.schema.json#/$defs/ResponseSource" } }, - "required": ["requestUuid", "responseUuid", "timestamp", "source"], + "required": ["requestUuid", "responseUuid", "timestamp"], "additionalProperties": false } } diff --git a/schemas/bridging/common.schema.json b/schemas/bridging/common.schema.json index 7efc0ba31..bcf56e865 100644 --- a/schemas/bridging/common.schema.json +++ b/schemas/bridging/common.schema.json @@ -54,11 +54,6 @@ } ] }, - "ResponseSource": { - "title": "Source identifier", - "description": "Field that represents the source Desktop Agent that a response was received from.", - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, "BridgeRequestSource": { "title": "Bridge Source identifier", "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 588e92e34..5ebbbad05 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -146,44 +146,9 @@ export interface AgentErrorResponseMessage { export interface AgentResponseMetadata { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } -/** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - */ -export interface DesktopAgentIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent: string; - [property: string]: any; -} - /** * Error message payload containing an standardized error string. */ @@ -304,11 +269,6 @@ export interface AgentRequestMetadata { * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -366,11 +326,6 @@ export interface BridgeParticipantIdentifier { * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -473,6 +428,31 @@ export interface BridgeErrorResponseMessageMeta { timestamp: Date; } +/** + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + */ +export interface DesktopAgentIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; + [property: string]: any; +} + /** * The error message payload contains details of an error return to the app or agent that * raised the original request. @@ -524,11 +504,6 @@ export interface BridgeRequestMetadata { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -659,11 +634,6 @@ export interface BroadcastAgentRequestMeta { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -776,11 +746,6 @@ export interface BroadcastBridgeRequestMeta { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -1125,11 +1090,6 @@ export interface FindInstancesAgentErrorResponse { export interface FindInstancesAgentErrorResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -1206,11 +1166,6 @@ export interface FindInstancesAgentRequestMeta { } /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -1338,11 +1293,6 @@ export interface FindInstancesAgentResponse { export interface FindInstancesAgentResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -1616,11 +1566,6 @@ export interface FindIntentAgentErrorResponse { export interface FindIntentAgentErrorResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -1700,11 +1645,6 @@ export interface FindIntentAgentResponse { export interface FindIntentAgentResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -1892,11 +1832,6 @@ export interface FindIntentsByContextAgentErrorResponse { export interface FindIntentsByContextAgentErrorResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -1976,11 +1911,6 @@ export interface FindIntentsByContextAgentResponse { export interface FindIntentsByContextAgentResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -2138,11 +2068,6 @@ export interface GetAppMetadataAgentErrorResponse { export interface GetAppMetadataAgentErrorResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -2221,11 +2146,6 @@ export interface GetAppMetadataAgentResponse { export interface GetAppMetadataAgentResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -2382,11 +2302,6 @@ export interface OpenAgentErrorResponse { export interface OpenAgentErrorResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -2473,11 +2388,6 @@ export interface OpenAgentRequestPayload { /** * The application to open on the specified Desktop Agent * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -2552,11 +2462,6 @@ export interface OpenAgentResponse { export interface OpenAgentResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -2756,11 +2661,6 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * Field that represents the source application that a request or response was received * from, or the source Desktop Agent if it issued the request or response itself. * - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - * - * Field that represents the source Desktop Agent that a response was received from. - * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a * response message is returned by the Desktop Agent (or more specifically its resolver) @@ -3336,11 +3236,6 @@ export interface RaiseIntentAgentErrorResponse { export interface RaiseIntentAgentErrorResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -3421,11 +3316,6 @@ export interface RaiseIntentAgentResponse { export interface RaiseIntentAgentResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -3629,11 +3519,6 @@ export interface RaiseIntentResultAgentErrorResponse { export interface RaiseIntentResultAgentErrorResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -3689,11 +3574,6 @@ export interface RaiseIntentResultAgentResponse { export interface RaiseIntentResultAgentResponseMeta { requestUuid: string; responseUuid: string; - /** - * Field that represents the source application instance that the response was produced by, - * or the Desktop Agent if it produced the response without an application. - */ - source: DesktopAgentIdentifier; timestamp: Date; } @@ -4641,12 +4521,10 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), ErrorResponseMessagePayload: o([{ json: 'error', js: 'error', typ: r('ResponseErrorDetail') }], 'any'), AgentRequestMessage: o( [ @@ -4707,6 +4585,7 @@ const typeMap: any = { ], false ), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), ResponseErrorMessagePayload: o([{ json: 'error', js: 'error', typ: u(undefined, r('ResponseErrorDetail')) }], 'any'), BridgeRequestMessage: o( [ @@ -4951,7 +4830,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5003,7 +4881,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5118,7 +4995,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5160,7 +5036,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5255,7 +5130,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5291,7 +5165,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5372,7 +5245,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5408,7 +5280,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5483,7 +5354,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5533,7 +5403,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5898,7 +5767,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5941,7 +5809,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -6037,7 +5904,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -6058,7 +5924,6 @@ const typeMap: any = { [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'responseUuid', js: 'responseUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('DesktopAgentIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false From 152f7ea696f6b4f26c9145aa2aa9c6ad4adec77e Mon Sep 17 00:00:00 2001 From: Tiago Pina Date: Thu, 20 Jul 2023 01:36:22 -0700 Subject: [PATCH 088/106] fixed typo (#79) --- .../findIntentAgentRequest.schema.json | 2 +- src/bridging/BridgingTypes.ts | 32 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/schemas/bridging/findIntentAgentRequest.schema.json b/schemas/bridging/findIntentAgentRequest.schema.json index c4e8a89fa..efa536276 100644 --- a/schemas/bridging/findIntentAgentRequest.schema.json +++ b/schemas/bridging/findIntentAgentRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json", - "title": "FindIntents Agent Request", + "title": "FindIntent Agent Request", "type": "object", "allOf": [ { diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 5ebbbad05..8740fbd8e 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -1,6 +1,6 @@ // To parse this data: // -// import { Convert, BaseImplementationMetadata, AgentErrorResponseMessage, AgentRequestMessage, AgentResponseMessage, BridgeErrorResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentErrorResponse, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeErrorResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentAgentErrorResponse, FindIntentsAgentRequest, FindIntentAgentResponse, FindIntentBridgeErrorResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentErrorResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeErrorResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentErrorResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeErrorResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentErrorResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeErrorResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentErrorResponse, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeErrorResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentErrorResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeErrorResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; +// import { Convert, BaseImplementationMetadata, AgentErrorResponseMessage, AgentRequestMessage, AgentResponseMessage, BridgeErrorResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentErrorResponse, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeErrorResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentAgentErrorResponse, FindIntentAgentRequest, FindIntentAgentResponse, FindIntentBridgeErrorResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentErrorResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeErrorResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentErrorResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeErrorResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentErrorResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeErrorResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentErrorResponse, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeErrorResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentErrorResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeErrorResponse, RaiseIntentResultBridgeResponse, Context } from "./file"; // // const schemasAPIAPISchema = Convert.toSchemasAPIAPISchema(json); // const baseImplementationMetadata = Convert.toBaseImplementationMetadata(json); @@ -25,7 +25,7 @@ // const findInstancesBridgeRequest = Convert.toFindInstancesBridgeRequest(json); // const findInstancesBridgeResponse = Convert.toFindInstancesBridgeResponse(json); // const findIntentAgentErrorResponse = Convert.toFindIntentAgentErrorResponse(json); -// const findIntentsAgentRequest = Convert.toFindIntentsAgentRequest(json); +// const findIntentAgentRequest = Convert.toFindIntentAgentRequest(json); // const findIntentAgentResponse = Convert.toFindIntentAgentResponse(json); // const findIntentBridgeErrorResponse = Convert.toFindIntentBridgeErrorResponse(json); // const findIntentBridgeRequest = Convert.toFindIntentBridgeRequest(json); @@ -1581,12 +1581,12 @@ export interface FindIntentAgentErrorResponsePayload { * * A request message from a Desktop Agent to the Bridge. */ -export interface FindIntentsAgentRequest { - meta: FindIntentsAgentRequestMeta; +export interface FindIntentAgentRequest { + meta: FindIntentAgentRequestMeta; /** * The message payload typically contains the arguments to FDC3 API functions. */ - payload: FindIntentsAgentRequestPayload; + payload: FindIntentAgentRequestPayload; /** * Identifies the type of the message and it is typically set to the FDC3 function name that * the message relates to, e.g. 'findIntent', with 'Request' appended. @@ -1597,7 +1597,7 @@ export interface FindIntentsAgentRequest { /** * Metadata for a request message sent by Desktop Agents to the Bridge. */ -export interface FindIntentsAgentRequestMeta { +export interface FindIntentAgentRequestMeta { requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -1616,7 +1616,7 @@ export interface FindIntentsAgentRequestMeta { /** * The message payload typically contains the arguments to FDC3 API functions. */ -export interface FindIntentsAgentRequestPayload { +export interface FindIntentAgentRequestPayload { context?: ContextElement; intent: string; } @@ -3930,12 +3930,12 @@ export class Convert { return JSON.stringify(uncast(value, r('FindIntentAgentErrorResponse')), null, 2); } - public static toFindIntentsAgentRequest(json: string): FindIntentsAgentRequest { - return cast(JSON.parse(json), r('FindIntentsAgentRequest')); + public static toFindIntentAgentRequest(json: string): FindIntentAgentRequest { + return cast(JSON.parse(json), r('FindIntentAgentRequest')); } - public static findIntentsAgentRequestToJson(value: FindIntentsAgentRequest): string { - return JSON.stringify(uncast(value, r('FindIntentsAgentRequest')), null, 2); + public static findIntentAgentRequestToJson(value: FindIntentAgentRequest): string { + return JSON.stringify(uncast(value, r('FindIntentAgentRequest')), null, 2); } public static toFindIntentAgentResponse(json: string): FindIntentAgentResponse { @@ -5000,15 +5000,15 @@ const typeMap: any = { false ), FindIntentAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('ErrorMessage') }], false), - FindIntentsAgentRequest: o( + FindIntentAgentRequest: o( [ - { json: 'meta', js: 'meta', typ: r('FindIntentsAgentRequestMeta') }, - { json: 'payload', js: 'payload', typ: r('FindIntentsAgentRequestPayload') }, + { json: 'meta', js: 'meta', typ: r('FindIntentAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentAgentRequestPayload') }, { json: 'type', js: 'type', typ: r('RequestMessageType') }, ], false ), - FindIntentsAgentRequestMeta: o( + FindIntentAgentRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, @@ -5017,7 +5017,7 @@ const typeMap: any = { ], false ), - FindIntentsAgentRequestPayload: o( + FindIntentAgentRequestPayload: o( [ { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, { json: 'intent', js: 'intent', typ: '' }, From 01385d5f4ac80ad1b4aac0746b8a18df1de4aa96 Mon Sep 17 00:00:00 2001 From: Kris West Date: Fri, 21 Jul 2023 11:49:09 +0100 Subject: [PATCH 089/106] Adding missing sources element to getAppMetadata bridge response in docs --- docs/agent-bridging/ref/getAppMetadata.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index 33848012f..7b5261259 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -149,6 +149,7 @@ The bridge receives the response, augments the appMetadata with a `desktopAgent` "requestUuid": "", "responseUuid": "", "timestamp": "2020-03-...", + "sources": [{ "desktopAgent": "agent-B" }] } } ``` From 1c50b9e6b4fef79aa6eba670829bd6167da75a47 Mon Sep 17 00:00:00 2001 From: Kris West Date: Fri, 21 Jul 2023 11:54:42 +0100 Subject: [PATCH 090/106] reoving meta.sources from raiseIntentResultResponse docs to match schema --- docs/agent-bridging/ref/raiseIntent.md | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index f9dda058d..0819c3359 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -215,7 +215,7 @@ The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.des } ``` -When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application (setting either `payload.context` or `payload.channel` to indicate the type of the `IntentResult`). +When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application (setting either `payload.context` or `payload.channel` to indicate the type of the `IntentResult`). There is no need to provide a `source` field in this response as the source information was already provided in the `raiseIntentResponse` message preceeding it. ```json // agent-B -> DAB @@ -233,11 +233,7 @@ When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent "meta": { "requestUuid": "", "responseUuid": "", //a different UUID should be used for the result response - "timestamp": "2020-03-...", - "sources": [{ - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706" //instance Id should be included now that its known - }] + "timestamp": "2020-03-..." } } ``` @@ -261,11 +257,7 @@ Finally, the bridge augments the response with `sources[0].desktopAgent` and pas "requestUuid": "", "responseUuid": "", "timestamp": "2020-03-...", - "sources": [{ - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", - "desktopAgent": "agent-B" // added by DAB - }] + "sources": [{ "desktopAgent": "agent-B" }] // added by DAB } } ``` @@ -281,11 +273,7 @@ If the `IntentHandler` returned `void` rather than an intent result `payload` sh "requestUuid": "", "responseUuid": "", "timestamp": "2020-03-...", - "sources": [{ - "appId": "Slack", - "instanceId": "e36d43e1-4fd3-447a-a227-38ec48a92706", - "desktopAgent": "agent-B" // added by DAB - }] + "sources": [{ "desktopAgent": "agent-B" }] // added by DAB } } ``` From 894ab62a27ad7ca8be86cdfd6eaaf3ae14af8bcf Mon Sep 17 00:00:00 2001 From: Kris West Date: Fri, 21 Jul 2023 14:20:58 +0100 Subject: [PATCH 091/106] Further refining schemas to improve naming in generated code --- schemas/bridging/agentRequest.schema.json | 2 +- .../bridging/bridgeErrorResponse.schema.json | 4 +- schemas/bridging/bridgeRequest.schema.json | 8 +- schemas/bridging/bridgeResponse.schema.json | 6 +- .../broadcastAgentRequest.schema.json | 2 +- schemas/bridging/common.schema.json | 71 +-- .../findInstancesAgentRequest.schema.json | 4 +- ...ndIntentsByContextAgentRequest.schema.json | 2 +- .../getAppMetadataAgentRequest.schema.json | 4 +- schemas/bridging/openAgentRequest.schema.json | 4 +- ...teChannelBroadcastAgentRequest.schema.json | 4 +- ...EventListenerAddedAgentRequest.schema.json | 4 +- ...entListenerRemovedAgentRequest.schema.json | 4 +- ...AddContextListenerAgentRequest.schema.json | 4 +- ...hannelOnDisconnectAgentRequest.schema.json | 4 +- ...annelOnUnsubscribeAgentRequest.schema.json | 4 +- .../raiseIntentAgentRequest.schema.json | 6 +- src/bridging/BridgingTypes.ts | 543 +++++++++++------- 18 files changed, 407 insertions(+), 273 deletions(-) diff --git a/schemas/bridging/agentRequest.schema.json b/schemas/bridging/agentRequest.schema.json index d88e78639..bf11e36f4 100644 --- a/schemas/bridging/agentRequest.schema.json +++ b/schemas/bridging/agentRequest.schema.json @@ -56,7 +56,7 @@ "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "common.schema.json#/$defs/Destination" + "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" } }, "required": ["requestUuid", "timestamp"], diff --git a/schemas/bridging/bridgeErrorResponse.schema.json b/schemas/bridging/bridgeErrorResponse.schema.json index 6f1a7c3ea..bd6fd15c0 100644 --- a/schemas/bridging/bridgeErrorResponse.schema.json +++ b/schemas/bridging/bridgeErrorResponse.schema.json @@ -42,10 +42,10 @@ "$ref": "common.schema.json#/$defs/Timestamp" }, "errorSources": { - "$ref": "common.schema.json#/$defs/ResponseErrorSources" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorSources" }, "errorDetails": { - "$ref": "common.schema.json#/$defs/ResponseErrorDetails" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorDetails" } }, "required": ["requestUuid", "responseUuid", "timestamp", "errorSources", "errorDetails"], diff --git a/schemas/bridging/bridgeRequest.schema.json b/schemas/bridging/bridgeRequest.schema.json index 6fc223518..27d50f8d8 100644 --- a/schemas/bridging/bridgeRequest.schema.json +++ b/schemas/bridging/bridgeRequest.schema.json @@ -34,14 +34,14 @@ "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { - "title": "Source identifier", - "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "$ref": "common.schema.json#/$defs/BridgeRequestSource" + "title": "Bridge Source identifier", + "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST be set by the bridge.", + "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" }, "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "common.schema.json#/$defs/Destination" + "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" } }, "required": ["requestUuid", "timestamp", "source"], diff --git a/schemas/bridging/bridgeResponse.schema.json b/schemas/bridging/bridgeResponse.schema.json index 67823287d..0e3a23bdf 100644 --- a/schemas/bridging/bridgeResponse.schema.json +++ b/schemas/bridging/bridgeResponse.schema.json @@ -37,13 +37,13 @@ "$ref": "common.schema.json#/$defs/Timestamp" }, "sources": { - "$ref": "common.schema.json#/$defs/ResponseSources" + "$ref": "common.schema.json#/$defs/BridgeResponseSources" }, "errorSources": { - "$ref": "common.schema.json#/$defs/ResponseErrorSources" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorSources" }, "errorDetails": { - "$ref": "common.schema.json#/$defs/ResponseErrorDetails" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorDetails" } }, "required": ["requestUuid", "responseUuid", "timestamp"], diff --git a/schemas/bridging/broadcastAgentRequest.schema.json b/schemas/bridging/broadcastAgentRequest.schema.json index a8f1e1e06..64457d5e1 100644 --- a/schemas/bridging/broadcastAgentRequest.schema.json +++ b/schemas/bridging/broadcastAgentRequest.schema.json @@ -46,7 +46,7 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "required": ["source"], diff --git a/schemas/bridging/common.schema.json b/schemas/bridging/common.schema.json index bcf56e865..be1170beb 100644 --- a/schemas/bridging/common.schema.json +++ b/schemas/bridging/common.schema.json @@ -5,27 +5,6 @@ "type": "object", "description": "Common elements referenced by other schemas", "$defs": { - "AgentRequestMeta": { - "title": "Agent Request Metadata", - "description": "Metadata for a request message sent by Desktop Agents to the Bridge.", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "#/$defs/RequestUuid" - }, - "timestamp": { - "$ref": "#/$defs/Timestamp" - }, - "source": { - "$ref": "#/$defs/Source" - }, - "destination": { - "$ref": "#/$defs/Destination" - } - }, - "required": ["requestUuid", "timestamp"], - "additionalProperties": false - }, "RequestUuid": { "title": "Request UUID", "type": "string", @@ -54,44 +33,48 @@ } ] }, - "BridgeRequestSource": { - "title": "Bridge Source identifier", - "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", - "oneOf": [ + "AppRequestSource": { + "title": "App Source identifier", + "description": "Field that represents the source application that a request or response was received from.", + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + }, + "AgentDestination": { + "title": "Agent Destination identifier", + "description": "Field that represents a destination Desktop Agent that a request is to be sent to.", + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + "AppDestination": { + "title": "App Destination identifier", + "description": "Field that represents a destination App on a remote Desktop Agent that a request is to be sent to.", + "allOf": [ { "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, { - "allOf": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - ] + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } ] }, "BridgeParticipantIdentifier": { "title": "Bridge Participant Identifier", "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", - "type": "object", "oneOf": [ { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "allOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + } + ] } ] }, - "Destination": { - "title": "Destination identifier", - "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "#/$defs/BridgeParticipantIdentifier" - }, - "ResponseSources": { + "BridgeResponseSources": { "title": "Desktop Agents that responded", "type": "array", "items": [ @@ -101,7 +84,7 @@ ], "description": "Array of DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." }, - "ResponseErrorSources": { + "BridgeResponseErrorSources": { "title": "Desktop Agents that errored", "type": "array", "items": [ @@ -120,7 +103,7 @@ { "$ref": "../api/api.schema.json#/definitions/BridgingError" } ] }, - "ResponseErrorDetails": { + "BridgeResponseErrorDetails": { "title": "Response Error Details", "type": "array", "items": { diff --git a/schemas/bridging/findInstancesAgentRequest.schema.json b/schemas/bridging/findInstancesAgentRequest.schema.json index f4cd4ba54..cf9bc12cb 100644 --- a/schemas/bridging/findInstancesAgentRequest.schema.json +++ b/schemas/bridging/findInstancesAgentRequest.schema.json @@ -39,10 +39,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "$ref": "common.schema.json#/$defs/AgentDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/findIntentsByContextAgentRequest.schema.json b/schemas/bridging/findIntentsByContextAgentRequest.schema.json index 9b191234c..9f1bacf86 100644 --- a/schemas/bridging/findIntentsByContextAgentRequest.schema.json +++ b/schemas/bridging/findIntentsByContextAgentRequest.schema.json @@ -39,7 +39,7 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/getAppMetadataAgentRequest.schema.json b/schemas/bridging/getAppMetadataAgentRequest.schema.json index 6f313c27c..8bcfc73d3 100644 --- a/schemas/bridging/getAppMetadataAgentRequest.schema.json +++ b/schemas/bridging/getAppMetadataAgentRequest.schema.json @@ -39,10 +39,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "$ref": "common.schema.json#/$defs/AgentDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/RequestSource" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/openAgentRequest.schema.json b/schemas/bridging/openAgentRequest.schema.json index 2e2fcc9c5..3b20d30e6 100644 --- a/schemas/bridging/openAgentRequest.schema.json +++ b/schemas/bridging/openAgentRequest.schema.json @@ -51,10 +51,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "$ref": "common.schema.json#/$defs/AgentDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "required": ["source"], diff --git a/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json index fb36fa38d..16c4ca25e 100644 --- a/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json +++ b/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json @@ -46,10 +46,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json b/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json index 4a212b3d0..34b0403fb 100644 --- a/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json +++ b/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json b/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json index 4a0ffedd1..a139c2d74 100644 --- a/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json +++ b/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json index b73b53a26..8e3d224e6 100644 --- a/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json +++ b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json b/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json index dda363660..d65b03e08 100644 --- a/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json +++ b/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json @@ -39,10 +39,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json b/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json index 45c9b178a..b760da6a6 100644 --- a/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json +++ b/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/schemas/bridging/raiseIntentAgentRequest.schema.json b/schemas/bridging/raiseIntentAgentRequest.schema.json index a4bf1f4e9..4a9921859 100644 --- a/schemas/bridging/raiseIntentAgentRequest.schema.json +++ b/schemas/bridging/raiseIntentAgentRequest.schema.json @@ -32,7 +32,7 @@ "$ref": "../context/context.schema.json" }, "app": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "required": ["intent", "context", "app"], @@ -45,10 +45,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "unevaluatedProperties": false, diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 8740fbd8e..fc5a87417 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -251,23 +251,8 @@ export interface AgentRequestMetadata { * specific app or instance. * * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a @@ -283,21 +268,42 @@ export interface AgentRequestMetadata { * Will contain a single value for individual responses and multiple values for responses * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. */ export interface BridgeParticipantIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; /** * The unique application identifier located within a specific application directory * instance. An example of an appId might be 'app@sub.root' */ appId?: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - * - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent?: string; /** * An optional instance identifier, indicating that this object represents a specific * instance of the application described. @@ -322,6 +328,9 @@ export interface BridgeParticipantIdentifier { * If the `instanceId` field is set then the `AppMetadata` object represents a specific * instance of the application that may be addressed using that Id. * + * Field that represents the source application that a request or response was received + * from. + * * Identifier for the app instance that was selected (or started) to resolve the intent. * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. @@ -340,6 +349,8 @@ export interface BridgeParticipantIdentifier { * Will contain a single value for individual responses and multiple values for responses * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. */ export interface SourceIdentifier { /** @@ -443,6 +454,8 @@ export interface BridgeErrorResponseMessageMeta { * Will contain a single value for individual responses and multiple values for responses * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. */ export interface DesktopAgentIdentifier { /** @@ -491,69 +504,13 @@ export interface BridgeRequestMetadata { requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ - source: BridgeSourceIdentifier; + source: BridgeParticipantIdentifier; timestamp: Date; } -/** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface BridgeSourceIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root' - */ - appId?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - /** * A response message from the Bridge back to the original Desktop Agent that raised the * request. @@ -624,6 +581,9 @@ export interface BroadcastAgentRequestMeta { * If the `instanceId` field is set then the `AppMetadata` object represents a specific * instance of the application that may be addressed using that Id. * + * Field that represents the source application that a request or response was received + * from. + * * Identifier for the app instance that was selected (or started) to resolve the intent. * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. @@ -648,6 +608,8 @@ export interface BroadcastAgentRequestMeta { * Will contain a single value for individual responses and multiple values for responses * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. */ export interface SourceObject { /** @@ -720,7 +682,8 @@ export interface BroadcastBridgeRequestMeta { requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -736,15 +699,23 @@ export interface BroadcastBridgeRequestMeta { * If the `instanceId` field is set then the `AppMetadata` object represents a specific * instance of the application that may be addressed using that Id. * + * Field that represents the source application that a request or response was received + * from. + * * Identifier for the app instance that was selected (or started) to resolve the intent. * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. * * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios * where a request needs to be directed to a Desktop Agent rather than a specific app, or a @@ -760,6 +731,11 @@ export interface BroadcastBridgeRequestMeta { * Will contain a single value for individual responses and multiple values for responses * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. */ export interface MetaSource { /** @@ -1155,7 +1131,7 @@ export interface FindInstancesAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleBridgeParticipantIdentifier; + destination?: DestinationObject; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -1181,6 +1157,8 @@ export interface FindInstancesAgentRequestMeta { * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * * Optional field that represents the destination that the request should be routed to. Must * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. @@ -1189,10 +1167,11 @@ export interface FindInstancesAgentRequestMeta { * specific app or instance. * * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. * * Identifies an application, or instance of an application, and is used to target FDC3 API * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application @@ -1203,11 +1182,14 @@ export interface FindInstancesAgentRequestMeta { * If the `instanceId` field is set then the `AppMetadata` object represents a specific * instance of the application that may be addressed using that Id. * + * Field that represents the source application that a request or response was received + * from. + * * Identifier for the app instance that was selected (or started) to resolve the intent. * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. */ -export interface PurpleBridgeParticipantIdentifier { +export interface DestinationObject { /** * Used in Desktop Agent Bridging to attribute or target a message to a * particular Desktop Agent. @@ -1246,6 +1228,9 @@ export interface FindInstancesAgentRequestPayload { * If the `instanceId` field is set then the `AppMetadata` object represents a specific * instance of the application that may be addressed using that Id. * + * Field that represents the source application that a request or response was received + * from. + * * Identifier for the app instance that was selected (or started) to resolve the intent. * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. @@ -1486,11 +1471,12 @@ export interface FindInstancesBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleBridgeParticipantIdentifier; + destination?: DestinationObject; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -1749,9 +1735,10 @@ export interface FindIntentBridgeRequestMeta { requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ - source: BridgeSourceIdentifier; + source: BridgeParticipantIdentifier; timestamp: Date; /** * Optional field that represents the destination that the request should be routed to. Must @@ -1986,7 +1973,8 @@ export interface FindIntentsByContextBridgeRequestMeta { requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -2105,13 +2093,13 @@ export interface GetAppMetadataAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleBridgeParticipantIdentifier; + destination?: DestinationObject; requestUuid: string; /** * Field that represents the source application that the request was received from, or the * source Desktop Agent if it issued the request itself. */ - source?: SourceObject; + source?: SourceIdentifier; timestamp: Date; } @@ -2222,16 +2210,93 @@ export interface GetAppMetadataBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleBridgeParticipantIdentifier; + destination?: DestinationObject; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ - source: MetaSource; + source: MetaSourceObject; timestamp: Date; } +/** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + * + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + */ +export interface MetaSourceObject { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId?: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + /** * The message payload typically contains the arguments to FDC3 API functions. */ @@ -2364,7 +2429,7 @@ export interface OpenAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleBridgeParticipantIdentifier; + destination?: DestinationObject; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -2403,6 +2468,8 @@ export interface OpenAgentRequestPayload { * that were collated by the bridge. May be omitted if all sources errored. MUST include the * `desktopAgent` field when returned by the bridge. * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * * Identifies an application, or instance of an application, and is used to target FDC3 API * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application * instances. @@ -2412,6 +2479,9 @@ export interface OpenAgentRequestPayload { * If the `instanceId` field is set then the `AppMetadata` object represents a specific * instance of the application that may be addressed using that Id. * + * Field that represents the source application that a request or response was received + * from. + * * Identifier for the app instance that was selected (or started) to resolve the intent. * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. @@ -2538,11 +2608,12 @@ export interface OpenBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: PurpleBridgeParticipantIdentifier; + destination?: DestinationObject; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -2624,7 +2695,7 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -2635,6 +2706,26 @@ export interface PrivateChannelBroadcastAgentRequestMeta { } /** + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * * Identifies an application, or instance of an application, and is used to target FDC3 API * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application * instances. @@ -2644,6 +2735,9 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * If the `instanceId` field is set then the `AppMetadata` object represents a specific * instance of the application that may be addressed using that Id. * + * Field that represents the source application that a request or response was received + * from. + * * Identifier for the app instance that was selected (or started) to resolve the intent. * `source.instanceId` MUST be set, indicating the specific app instance that * received the intent. @@ -2656,40 +2750,23 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * specific app or instance. * * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ -export interface FluffyBridgeParticipantIdentifier { +export interface MetaDestination { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; /** * The unique application identifier located within a specific application directory * instance. An example of an appId might be 'app@sub.root' */ appId: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - * - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent?: string; /** * An optional instance identifier, indicating that this object represents a specific * instance of the application described. @@ -2739,11 +2816,12 @@ export interface PrivateChannelBroadcastBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -2790,7 +2868,7 @@ export interface PrivateChannelEventListenerAddedAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -2835,11 +2913,12 @@ export interface PrivateChannelEventListenerAddedBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -2880,7 +2959,7 @@ export interface PrivateChannelEventListenerRemovedAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -2925,11 +3004,12 @@ export interface PrivateChannelEventListenerRemovedBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -2970,7 +3050,7 @@ export interface PrivateChannelOnAddContextListenerAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -3015,11 +3095,12 @@ export interface PrivateChannelOnAddContextListenerBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -3060,7 +3141,7 @@ export interface PrivateChannelOnDisconnectAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -3104,11 +3185,12 @@ export interface PrivateChannelOnDisconnectBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -3148,7 +3230,7 @@ export interface PrivateChannelOnUnsubscribeAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -3193,11 +3275,12 @@ export interface ERequestMetadata { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination?: FluffyBridgeParticipantIdentifier; + destination?: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -3273,7 +3356,7 @@ export interface RaiseIntentAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination: FluffyBridgeParticipantIdentifier; + destination: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the @@ -3287,11 +3370,70 @@ export interface RaiseIntentAgentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface RaiseIntentAgentRequestPayload { - app: AppIdentifier; + app: AppDestinationIdentifier; context: ContextElement; intent: string; } +/** + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppDestinationIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + /** * A response to a request to raise an intent. * @@ -3436,11 +3578,12 @@ export interface RaiseIntentBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. */ - destination: FluffyBridgeParticipantIdentifier; + destination: MetaDestination; requestUuid: string; /** * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. */ source: MetaSource; timestamp: Date; @@ -3450,7 +3593,7 @@ export interface RaiseIntentBridgeRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface RaiseIntentBridgeRequestPayload { - app: AppIdentifier; + app: AppDestinationIdentifier; context: ContextElement; intent: string; } @@ -4545,8 +4688,8 @@ const typeMap: any = { ), BridgeParticipantIdentifier: o( [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, { json: 'appId', js: 'appId', typ: u(undefined, '') }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], 'any' @@ -4599,19 +4742,11 @@ const typeMap: any = { [ { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('BridgeSourceIdentifier') }, + { json: 'source', js: 'source', typ: r('BridgeParticipantIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - BridgeSourceIdentifier: o( - [ - { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, - { json: 'appId', js: 'appId', typ: u(undefined, '') }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - ], - 'any' - ), BridgeResponseMessage: o( [ { json: 'meta', js: 'meta', typ: r('BridgeResponseMessageMeta') }, @@ -4845,14 +4980,14 @@ const typeMap: any = { ), FindInstancesAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - PurpleBridgeParticipantIdentifier: o( + DestinationObject: o( [ { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, { json: 'appId', js: 'appId', typ: u(undefined, '') }, @@ -4952,7 +5087,7 @@ const typeMap: any = { ), FindInstancesBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5085,7 +5220,7 @@ const typeMap: any = { FindIntentBridgeRequestMeta: o( [ { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('BridgeSourceIdentifier') }, + { json: 'source', js: 'source', typ: r('BridgeParticipantIdentifier') }, { json: 'timestamp', js: 'timestamp', typ: Date }, { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, ], @@ -5260,9 +5395,9 @@ const typeMap: any = { ), GetAppMetadataAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false @@ -5314,13 +5449,21 @@ const typeMap: any = { ), GetAppMetadataBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, - { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'source', js: 'source', typ: r('MetaSourceObject') }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), + MetaSourceObject: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), GetAppMetadataBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), GetAppMetadataBridgeResponse: o( [ @@ -5369,7 +5512,7 @@ const typeMap: any = { ), OpenAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('SourceObject') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5437,7 +5580,7 @@ const typeMap: any = { ), OpenBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('PurpleBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5481,17 +5624,17 @@ const typeMap: any = { ), PrivateChannelBroadcastAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, ], false ), - FluffyBridgeParticipantIdentifier: o( + MetaDestination: o( [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, { json: 'appId', js: 'appId', typ: '' }, - { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, ], 'any' @@ -5513,7 +5656,7 @@ const typeMap: any = { ), PrivateChannelBroadcastBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5537,7 +5680,7 @@ const typeMap: any = { ), PrivateChannelEventListenerAddedAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5561,7 +5704,7 @@ const typeMap: any = { ), PrivateChannelEventListenerAddedBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5585,7 +5728,7 @@ const typeMap: any = { ), PrivateChannelEventListenerRemovedAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5609,7 +5752,7 @@ const typeMap: any = { ), PrivateChannelEventListenerRemovedBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5633,7 +5776,7 @@ const typeMap: any = { ), PrivateChannelOnAddContextListenerAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5657,7 +5800,7 @@ const typeMap: any = { ), PrivateChannelOnAddContextListenerBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5681,7 +5824,7 @@ const typeMap: any = { ), PrivateChannelOnDisconnectAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5699,7 +5842,7 @@ const typeMap: any = { ), PrivateChannelOnDisconnectBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5717,7 +5860,7 @@ const typeMap: any = { ), PrivateChannelOnUnsubscribeAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5741,7 +5884,7 @@ const typeMap: any = { ), ERequestMetadata: o( [ - { json: 'destination', js: 'destination', typ: u(undefined, r('FluffyBridgeParticipantIdentifier')) }, + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5782,7 +5925,7 @@ const typeMap: any = { ), RaiseIntentAgentRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: r('FluffyBridgeParticipantIdentifier') }, + { json: 'destination', js: 'destination', typ: r('MetaDestination') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('SourceObject') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5791,12 +5934,20 @@ const typeMap: any = { ), RaiseIntentAgentRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('AppIdentifier') }, + { json: 'app', js: 'app', typ: r('AppDestinationIdentifier') }, { json: 'context', js: 'context', typ: r('ContextElement') }, { json: 'intent', js: 'intent', typ: '' }, ], false ), + AppDestinationIdentifier: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), RaiseIntentAgentResponse: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentResponseMeta') }, @@ -5854,7 +6005,7 @@ const typeMap: any = { ), RaiseIntentBridgeRequestMeta: o( [ - { json: 'destination', js: 'destination', typ: r('FluffyBridgeParticipantIdentifier') }, + { json: 'destination', js: 'destination', typ: r('MetaDestination') }, { json: 'requestUuid', js: 'requestUuid', typ: '' }, { json: 'source', js: 'source', typ: r('MetaSource') }, { json: 'timestamp', js: 'timestamp', typ: Date }, @@ -5863,7 +6014,7 @@ const typeMap: any = { ), RaiseIntentBridgeRequestPayload: o( [ - { json: 'app', js: 'app', typ: r('AppIdentifier') }, + { json: 'app', js: 'app', typ: r('AppDestinationIdentifier') }, { json: 'context', js: 'context', typ: r('ContextElement') }, { json: 'intent', js: 'intent', typ: '' }, ], From d3926f2a34a23722e0aacc7ed346bc4f65db20a7 Mon Sep 17 00:00:00 2001 From: Kris West Date: Fri, 21 Jul 2023 14:23:28 +0100 Subject: [PATCH 092/106] ENsuring desktopAgent is required on getAppMetadata payload as we must only receive a single response --- .../getAppMetadataAgentRequest.schema.json | 2 +- src/bridging/BridgingTypes.ts | 142 +++++++++--------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/schemas/bridging/getAppMetadataAgentRequest.schema.json b/schemas/bridging/getAppMetadataAgentRequest.schema.json index 8bcfc73d3..6a6fd59ec 100644 --- a/schemas/bridging/getAppMetadataAgentRequest.schema.json +++ b/schemas/bridging/getAppMetadataAgentRequest.schema.json @@ -26,7 +26,7 @@ "type": "object", "properties": { "app": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "required": ["app"], diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index fc5a87417..95ce4c7af 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -2107,7 +2107,66 @@ export interface GetAppMetadataAgentRequestMeta { * The message payload typically contains the arguments to FDC3 API functions. */ export interface GetAppMetadataAgentRequestPayload { - app: AppIdentifier; + app: AppDestinationIdentifier; +} + +/** + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppDestinationIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root' + */ + appId: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; } /** @@ -2301,7 +2360,7 @@ export interface MetaSourceObject { * The message payload typically contains the arguments to FDC3 API functions. */ export interface GetAppMetadataBridgeRequestPayload { - app: AppIdentifier; + app: AppDestinationIdentifier; } /** @@ -3375,65 +3434,6 @@ export interface RaiseIntentAgentRequestPayload { intent: string; } -/** - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface AppDestinationIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root' - */ - appId: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - /** * A response to a request to raise an intent. * @@ -5402,7 +5402,15 @@ const typeMap: any = { ], false ), - GetAppMetadataAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), + GetAppMetadataAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppDestinationIdentifier') }], false), + AppDestinationIdentifier: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), GetAppMetadataAgentResponse: o( [ { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentResponseMeta') }, @@ -5464,7 +5472,7 @@ const typeMap: any = { ], 'any' ), - GetAppMetadataBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), + GetAppMetadataBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppDestinationIdentifier') }], false), GetAppMetadataBridgeResponse: o( [ { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeResponseMeta') }, @@ -5940,14 +5948,6 @@ const typeMap: any = { ], false ), - AppDestinationIdentifier: o( - [ - { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, - { json: 'appId', js: 'appId', typ: '' }, - { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, - ], - 'any' - ), RaiseIntentAgentResponse: o( [ { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentResponseMeta') }, From 0cd58f5f4e0fc84879ce8643f44e792c72953d84 Mon Sep 17 00:00:00 2001 From: Kris West Date: Fri, 21 Jul 2023 14:24:34 +0100 Subject: [PATCH 093/106] comment --- docs/agent-bridging/ref/getAppMetadata.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index 7b5261259..e415926ef 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -18,7 +18,7 @@ let appMetadata = await fdc3.getAppMetadata(appIdentifier); ``` :::info -`fdc3.getAppMetadata` calls should only involve the Desktop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. +`fdc3.getAppMetadata` calls should only involve the Desktop Agent Bridge where a `desktopAgent` field appears in the AppIdentifier being queried, all other calls should be handled locally by the Desktop Agent. Hence, the `payload.app.desktopAgent` is required on all requests. ::: ## Message exchange From eeaa75be2a6868b39f966bedc93558942733995c Mon Sep 17 00:00:00 2001 From: Kris West Date: Mon, 24 Jul 2023 15:57:34 +0100 Subject: [PATCH 094/106] adding note that apps don't need to do anything special to use bridging --- docs/agent-bridging/spec.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 0d0419fd7..2e472b8a7 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -13,7 +13,6 @@ Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, i @@ -50,9 +49,17 @@ The Desktop Agent Bridge Part of the FDC3 Standard is composed of three componen Detail on each of these components is defined in the following sections. -:::info +:::note + +Although this specification defines a particular [connection](#connection) type (based on a websocket server), it has been divided into parts so that the protocol definitions might be reused to implement a bridge over an alternative connection in future. + +::: + +:::tip + +The Desktop Agent Bridging protocol has been designed such that an application using the FDC3 API does not need to make any significant changes in order to make use of the Bridging connection between its Desktop Agent and another agent. This is achieved via messaging workflows that allow the bridged agents to cooperate on behalf of the applications, for example, by retrieving options for intent resolution from other agent or forwarding on messages that were broadcast on channels. -Although this specification defines a particular [connection](#connection) type (based on a websocket server), it has been divided into parts so that the protocol definitions might be reused to implement a bridge over an alternative connection. +However, Bridging should still be visible to applications, which is achieved through the addition of a `desktopAgent` field to the `AppIdentifier` type allowing it to indicate that an app or app instance exists on another agent, as well as a number of new error messages that may be returned to indicate bridging issues. ::: From c3ed1b41e38b2531f56c416b2e09be0a5ac354b0 Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Jul 2023 12:16:44 +0100 Subject: [PATCH 095/106] Adding agent bridging to FDC3 abstract page --- docs/fdc3-standard.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/fdc3-standard.md b/docs/fdc3-standard.md index 2711b49c9..39cf8e2a6 100644 --- a/docs/fdc3-standard.md +++ b/docs/fdc3-standard.md @@ -14,12 +14,13 @@ FDC3 aims to provide an open standard for interoperability on the financial desk The specifications are informed by agreed business [use cases](use-cases/overview), and implemented and used by leading [financial industry participants](../../users). -The standard currently consists of four complementary parts: +The standard currently consists of five complementary parts: - **[Desktop Agent API](api/spec)**: An API interface for working with a Desktop agent, which acts as launcher and message router (broker) for applications in its domain. - **[Intents](intents/spec)**: A set of verbs that, in conjunction with context data acting as nouns, can be used to put together common cross-application workflows on the financial desktop. - **[Context Data](context/spec)**: A message format for passing common identifiers and data between apps to create a seamless workflow. - **[App Directory](app-directory/spec)**: A structured repository of information about apps that can be used in an FDC3-enabled desktop. +- **[Agent Bridging](agent-bridging/spec)**: An [@experimental](fdc3-compliance#experimental-features) API interface for the interconnection of Desktop Agents (DAs) such that apps running under different Desktop Agents can interoperate. ## Versioning @@ -37,3 +38,4 @@ For more details on FDC3's versioning, deprecation and experimental features pol - [Intents Part](intents/spec) - [Context Data Part](context/spec) - [App Directory Part](app-directory/spec) +- [Agent Bridging Part](agent-bridging/spec) From cb6ff38e68d626afab7dac51d6f653542da32b3a Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Jul 2023 12:31:37 +0100 Subject: [PATCH 096/106] updating comments in docs that mention 4, rather than 5 parts to FDC3 --- docs/api/spec.md | 6 +++--- docs/fdc3-intro.md | 3 ++- docs/supported-platforms.md | 9 +++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/api/spec.md b/docs/api/spec.md index fe0834ff2..bafbad461 100644 --- a/docs/api/spec.md +++ b/docs/api/spec.md @@ -22,7 +22,7 @@ Examples of Desktop Agents include: - OpenFin - Refinitiv Eikon -An FDC3-compliant Desktop Agent exposes an FDC3 standard API to applications they have launched. When an App is launched by a Desktop Agent and is given access to the Agent's API to interoperate, it is running in that Desktop Agent's *context*. +An FDC3-compliant Desktop Agent exposes an FDC3 Standard API to applications they have launched. When an App is launched by a Desktop Agent and is given access to the Agent's API to interoperate, it is running in that Desktop Agent's *context*. ### Application @@ -86,11 +86,11 @@ Are all areas of functionality that any feature-complete desktop agent would imp A goal of the FDC3 Standard is that applications running in different Desktop Agent contexts on the same desktop, or operated by the same user, would be able to interoperate and that one Desktop Agent context would be able to discover and launch an application in another Desktop Application context. As Desktop Agent interop is supported by common standards for APIs an app in one Desktop Agent context would not need to know a different syntax to launch or interact with an app in another Desktop Agent context. -Inter-agent communication at the API layer may be achieved via the [Desktop Agent Bridging Part of the FDC3 Standard](../agent-bridging/spec) *([Experimental](../fdc3-compliance#experimental-features))*, which defines an independent service that Desktop Agents may connect to, and a protocol for the exchange of messages relating to FDC3 API calls. Hence, by implementing support for Desktop Agent Bridging, a platform may extend interop across applications running in multiple Desktop Agent contexts. +Inter-agent communication at the API layer may be achieved via the [Desktop Agent Bridging Part of the FDC3 Standard](../agent-bridging/spec) ([@experimental](../fdc3-compliance#experimental-features)), which defines an independent service that Desktop Agents may connect to, and a protocol for the exchange of messages relating to FDC3 API calls. Hence, by implementing support for Desktop Agent Bridging, a platform may extend interop across applications running in multiple Desktop Agent contexts. Desktop Agent Bridging provides message exchanges and a workflow for performing intent resolution across multiple agents. Hence, app discovery is supported across the agents connected to the bridge for intent-based workflows. Further, as channels are also supported by bridging, context sharing also works across multiple agents. -There is currently no method of discovering all the apps supported by a Desktop Agent in the FDC3 API nor bridging. Hence, to support launching, vis `fdc3.open` across the connected Desktop Agents, application details must be known in advance. This may be achieved by connecting Desktop Agents to the same App Directories. +There is currently no method of discovering all the apps supported by a Desktop Agent in the FDC3 API nor bridging. Hence, to support launching, via `fdc3.open` across the connected Desktop Agents, application details must be known in advance. This may be achieved by connecting Desktop Agents to the same App Directories. ![Desktop Agent - Interop](/assets/api-2.png) diff --git a/docs/fdc3-intro.md b/docs/fdc3-intro.md index 9afe63d9e..5a321b102 100644 --- a/docs/fdc3-intro.md +++ b/docs/fdc3-intro.md @@ -18,12 +18,13 @@ For more information, see [Why FDC3?](why-fdc3) ## Parts of the Standard -The [Standard](fdc3-standard) currently consists of four complementary parts: +The [Standard](fdc3-standard) currently consists of five complementary parts: - [API](api/spec) - [Intents](intents/spec) - [Context Data](context/spec) - [App Directory](app-directory/spec) +- [Agent Bridging](agent-bridging/spec) ## Use Cases diff --git a/docs/supported-platforms.md b/docs/supported-platforms.md index 23e5c2fb1..eb12eda4f 100644 --- a/docs/supported-platforms.md +++ b/docs/supported-platforms.md @@ -9,7 +9,7 @@ There are two main categories of platform: web and native, both of which are des ## Web -For a web application to be FDC3-enabled, it needs to run in the context of an environment or **_Platform Provider_** that makes the FDC3 API available to the application. This environment could be a browser extension, a web or native app, or fully-fledged desktop container framework. +For a web application to be FDC3-enabled, it needs to run in the context of an environment or **_Platform Provider_** that makes the FDC3 API available to the application. This environment could be a browser extension, a web or native app, or a fully-fledged desktop container framework. ### Usage @@ -94,9 +94,10 @@ const listener = await addIntentListener('ViewAnalysis', instrument => { ## Native -The FDC3 standard does not define wire formats for communication, nor does it define language specific API bindings, other than JavaScript and TypeScript. Hence, for a native application to be FDC3-enabled, it needs to make use of a shared library (such as a .NET DLL or JAR file) that provides it with an implementation of the FDC3 API. Therefore, an FDC3-enabled native application is currently specific to a particular desktop container framework (or other suitable environment) that provides the necessary library. +The FDC3 Standard does not currently define wire formats for an app to communicate with a Desktop Agent, nor does it define language specific API bindings, other than JavaScript and TypeScript. Hence, for a native application to be FDC3-enabled, it needs to either: -Despite this limitation, implementing support for FDC3 in a native application can allow it to interact with a wide variety of FDC3-enabled web applications. +- Make use of a shared library (such as a .NET DLL or JAR file) that provides it with an implementation of the FDC3 API (which ties it to a specific desktop agent implementation). +- Model itself as a Desktop Agent (rather than just an app working with one) and use the Agent Bridging protocol to connect to a Desktop Agent Bridge and work through it to interoperate with apps managed by other Desktop Agents. ## Hybrid @@ -106,4 +107,4 @@ In a hybrid application, a standalone native application incorporates a web view Support for each platform is optional and compliance with the FDC3 standard should be assessed for each platform implemented independently of any other, with the exception of ensuring that where applications running on multiple platforms are used together, communication between them still complies with the standard. -The web API binding is expressed using TypeScript syntax that defines the API interface (for both TypeScript and JavaScript). Adherence to the specific binding is required for web application platforms. No specific API binding for native platforms is currently expressed in the standard. Hence, native applications may be implemented with any programming language binding that supports the constructs required by the API specification, until such time that the FDC3 standard introduces an appropriate language-specific binding. +The Web API binding is expressed using TypeScript syntax that defines the API interface (for both TypeScript and JavaScript). Adherence to the specific binding is required for Web application platforms. No specific API binding for native platforms is currently expressed in the Standard. Hence, native applications may be implemented with any programming language binding that supports the constructs required by the API specification, until such time that the FDC3 Standard introduces an appropriate language-specific binding. From f9e4cdf386ae3a71e3728c259ce41be4330bb3ba Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 25 Jul 2023 12:42:55 +0100 Subject: [PATCH 097/106] Markdown lint in readme --- README.md | 101 ++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 60b6c2ee2..76ab7caf2 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# FDC3 Logo +# FDC3 - Financial Desktop Connectivity and Collaboration Consortium + +FDC3 Logo [![Latest Standard](https://img.shields.io/badge/release-2.0-blue)](https://github.com/finos/fdc3/releases/v2.0) [![npm](https://img.shields.io/npm/v/@finos/fdc3)](https://www.npmjs.com/package/@finos/fdc3) @@ -9,8 +11,6 @@ [![Slack](https://img.shields.io/badge/slack-@finos/fdc3-green.svg?logo=slack)](https://finos-lf.slack.com/messages/fdc3/) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6579/badge)](https://bestpractices.coreinfrastructure.org/projects/6579) -# FDC3 - Financial Desktop Connectivity and Collaboration Consortium - ## What Is It? [FDC3](https://fdc3.finos.org) is an open standard for applications on financial desktop to interoperate and exchange data with each other. @@ -21,35 +21,35 @@ - respond to activity in other apps (context sharing), - request functionality from other apps (raising intents). -## What Are The Benefits? +### What Are The Benefits? -### 📇 Help Manage Information Overload +#### 📇 Help Manage Information Overload > Finance is an information-dense environment. > Typically, traders will use serveral different displays so that they can keep track of multiple information sources at once. > FDC3 helps with this by sharing the "context" between multiple applications, so that they collectively track the topic the user is focused on. -### 🏃‍♂️ Work Faster +#### 🏃‍♂️ Work Faster > FDC3 standardizes a way to call actions between applications (called "intents"). > Applications can raise intents for other apps to resolve, extending each other's functionality. > Instead of the user copy-and-pasting bits of data from one application to another, FDC3 makes sure the intents have the data they need to seamlessly transition activity between applications. -### 🖥️ Platform Agnostic +#### 🖥️ Platform Agnostic > As an open standard, FDC3 can be implemented on any platform and in any language. > All that is required is a "Desktop Agent" that implements the FDC3 standard, which is responsible for co-ordinating application interactions. (For a list of open source and proprietary desktop agents, see "Platform providers" [here](https://fdc3.finos.org/community#type-platform-provider).) > FDC3 is successfully running on Web and Native platforms in financial institutions around the world. -### 🔌 End the Integration Nightmare +#### 🔌 End the Integration Nightmare > By providing support for FDC3, vendors and financial organizations alike can avoid the bilateral or trilateral integration projects that plague desktop app roll-out, cause vendor lock-in and result in a slow pace of change on the Financial Services desktop. -### 👐 Open Standards Promote Innovation +#### 👐 Open Standards Promote Innovation > FDC3 is developed collaboratively by a [consortium of industry participants](https://fdc3.finos.org/community#type-all) including banks, agent vendors, app developers and FinTech firms. By design, FDC3 is open to extension. We have an active community working on growing and improving the standard with new data and intents. -# How Does It Work? +## How Does It Work? FDC3 includes a standardized API for a Desktop agent, an OpenAPI App Directory, standard verbs to invoke actions between applications (called "intents"), standard formats for data passed between applications (called "context data") and a wire-protocol for Desktop Agents to communicate with each other (called "Desktop Agent Bridging"). @@ -63,86 +63,86 @@ Hence, the standard currently consists of five parts: The specifications are informed by agreed [business use cases](https://fdc3.finos.org/docs/use-cases/overview), and implemented and used by leading [financial industry participants](https://fdc3.finos.org/community#type-all). -## More Resources +### More Resources - - See https://fdc3.finos.org for more information, including on [Compliance](https://fdc3.finos.org/docs/fdc3-compliance) and the [FDC3 charter](https://fdc3.finos.org/docs/fdc3-charter), as well as a comprehensive [API Reference](https://fdc3.finos.org/docs/api/ref/DesktopAgent). - - You can also take the free [FDC3 Training](https://www.edx.org/course/fdc3-interoperability-for-the-financial-desktop) for an introduction to FDC3's core concepts and usage. - - The [FDC3 Community Page Training Tab](https://fdc3.finos.org/community#type-examples-and-training) also contains a selection of online resources to browse. - - FINOS' open source Desktop Agent, [FDC3 Sail](https://github.com/finos/FDC3-Sail) project written with Node / Electron. +- See for more information, including on [Compliance](https://fdc3.finos.org/docs/fdc3-compliance) and the [FDC3 charter](https://fdc3.finos.org/docs/fdc3-charter), as well as a comprehensive [API Reference](https://fdc3.finos.org/docs/api/ref/DesktopAgent). +- You can also take the free [FDC3 Training](https://www.edx.org/course/fdc3-interoperability-for-the-financial-desktop) for an introduction to FDC3's core concepts and usage. +- The [FDC3 Community Page Training Tab](https://fdc3.finos.org/community#type-examples-and-training) also contains a selection of online resources to browse. +- FINOS' open source Desktop Agent, [FDC3 Sail](https://github.com/finos/FDC3-Sail) project written with Node / Electron. -# Supported Platforms +## Supported Platforms - - As an open standard, FDC3 can be implemented on any platform and in any language. - - All that is required is a "desktop agent" that supports the FDC3 standard, which is responsible for co-ordinating application interactions. - - Get started using FDC3 on the web with TypeScript by reading the [supported platforms](https://fdc3.finos.org/docs/supported-platforms) page. +- As an open standard, FDC3 can be implemented on any platform and in any language. +- All that is required is a "desktop agent" that supports the FDC3 standard, which is responsible for coordinating application interactions. +- Get started using FDC3 on the web with TypeScript by reading the [supported platforms](https://fdc3.finos.org/docs/supported-platforms) page. -## FDC3 npm module +### FDC3 npm module The FDC3 npm package does NOT provide a Desktop Agent implementation. Rather, it can by used by web applications to target operations from the API Specification in a consistent way. Each FDC3-compliant desktop agent that the application runs in, can then provide an implementation of the FDC3 API operations. -For installation and usage instructions, see: https://fdc3.finos.org/docs/supported-platforms#usage +For installation and usage instructions, see: -# Getting Involved +## Getting Involved -## Using the standard? Let us know! +### Using the standard? Let us know If you are an existing individual or corporate user of the FDC3 standard, we would love to hear from you: just email [fdc3@finos.org](mailto:fdc3@finos.org) with details about how you are using the standard. -- If you'd like to be listed as on the community page, please fill out the [Usage Form](https://share.hsforms.com/1gOo0_A70QqyahOygzryVQg1fux8). +- If you'd like to be listed as on the community page, please fill out the [Usage Form](https://share.hsforms.com/1gOo0_A70QqyahOygzryVQg1fux8). - If listing your logo publicly requires legal evaluation, you can reach out **privately** to [FDC3 Maintainers](mailto:fdc3-maintainers-private@finos.org). -## Interact with the FDC3 community +### Interact with the FDC3 community -### GitHub +#### GitHub - FDC3 activity primarily happens in this [FDC3 GitHub repository](https://github.com/finos/fdc3). [Watch](https://docs.github.com/en/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository) the repository in order to be notified of new Pull Requests and issues. -### Slack +#### Slack - The fastest and more interactive way to connect and ask questions to the FDC3 community is to join the [#fdc3 channel on the FINOS slack](https://finos-lf.slack.com/messages/fdc3/). -### Email +#### Email - If you'd like to receive official updates, and/or you don't have access to Slack, please send an email to [fdc3@finos.org](mailto:fdc3@finos.org). You can join the list by sending an email to [fdc3+subscribe@finos.org](mailto:fdc3+subscribe@finos.org). - To contact the FDC3 maintainers, send an email to [fdc3-maintainers@finos.org](mailto:fdc3-maintainers@finos.org). -### Meetings +#### Meetings -- Finally, another great way to interact with the community, is to attend the monthly [FDC3 Standard Working Group Meeting](https://github.com/finos/FDC3/issues?q=label%3A%22Standard+WG+Meeting%22) and/or the quarterly [FDC3 General Meeting](https://github.com/finos/FDC3/issues?q=label%3A%22General+Meeting%22). +- Finally, another great way to interact with the community, is to attend the monthly [FDC3 Standard Working Group Meeting](https://github.com/finos/FDC3/issues?q=label%3A%22Standard+WG+Meeting%22) and/or the quarterly [FDC3 General Meeting](https://github.com/finos/FDC3/issues?q=label%3A%22General+Meeting%22). - Email [help@finos.org](mailto:help@finos.org) to be added to the meeting invite directly, or find the meeting in the [FINOS Community Calendar](https://calendar.google.com/calendar/embed?src=finos.org_fac8mo1rfc6ehscg0d80fi8jig%40group.calendar.google.com). -### Need help? +#### Need help? -- Email [fdc3@finos.org](mailto:fdc3@finos.org) if you need help getting started in the FDC3 Community. +- Email [fdc3@finos.org](mailto:fdc3@finos.org) if you need help getting started in the FDC3 Community. - If you encounter technical difficulties accessing repositories, joining Slack, mailing lists or meetings, please email [help@finos.org](mailto:help@finos.org). -## Roadmap +### Roadmap Work on FDC3 is split into several working groups and releases. - Working groups each have their own regular meetings in the [FINOS Community Calendar](https://calendar.google.com/calendar/embed?src=finos.org_fac8mo1rfc6ehscg0d80fi8jig%40group.calendar.google.com). - Releases can be tracked on the [FDC3 Milestones](https://github.com/finos/FDC3/milestones) page. - -## Contributing + +### Contributing If you'd like to contribute to the FDC3 standard, or have noticed something that needs correcting, the first step is to [raise an issue on the FDC3 Github Repo](https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue) and describe what you'd like to see changed. There are a number of issue templates that you can choose from [here](https://github.com/finos/FDC3/issues/new/choose). _NOTE:_ - Issues that change the Standard usually need discussion. You can post comments directly on the issue or can ask for it to be added to a Standards Working Group meeting agenda by emailing [fdc3@finos.org](mailto:fdc3@finos.org), sending a message to the [#fdc3 channel on the FINOS slack](https://finos-lf.slack.com/messages/fdc3/) or tag the FDC3 maintainers (`@finos/fdc3-maintainers`) in your issue. -- To implement changes in the FDC3 repository resolving an issue please read our [contribution guidelines](CONTRIBUTING.md). +- To implement changes in the FDC3 repository resolving an issue please read our [contribution guidelines](CONTRIBUTING.md). - Contributions merged into the master branch of the FDC3 repository will form part of the next pre-draft of the FDC3 Standard (as defined by the [FDC3 Governance document](./GOVERNANCE.md)), which must be approved by a Standard Working Group vote before it is accepted as a draft and subsequently released as the next version of the Standard. - Commits and pull requests to FINOS repositories will only be accepted from those contributors with an active, executed Individual Contributor License Agreement (ICLA) with FINOS, _OR_ who are covered under an existing and active Corporate Contribution License Agreement (CCLA) executed with FINOS. Commits from individuals not covered under an ICLA or CCLA will be flagged and blocked by the [Linux Foundation `EasyCLA` tool](https://easycla.lfx.linuxfoundation.org/#/). Please note that some CCLAs require individuals/employees to be explicitly named on the CCLA. _Need an ICLA? Unsure if you are covered under an existing CCLA? Email [help@finos.org](mailto:help@finos.org)._ -## Why should you get involved in FDC3? +### Why should you get involved in FDC3? If you or your firm intends to make use of the FDC3 Standard (by implementing a Desktop Agent or App Directory, by adding support to apps to interoperate with others via FDC3, or even by using apps, Desktop Agents or App Directories written by others) then participating in the governance, maintenance and onward development of the FDC3 Standard will help to protect and strengthen the ecosystem developing around FDC3. Doing so will also empower you to help guide the Standard in directions that are relevant to your use or that of your firm. -If you or your firm are new to contributing to open source projects, please see the variety of resources available from FINOS, (such as the [Open Source readiness project](https://www.finos.org/open-source-readiness)), Linux Foundation ([Participating in Open Source communities](https://www.linuxfoundation.org/tools/participating-in-open-source-communities/)) and others (e.g. [opensource.guide](https://opensource.guide/)). +If you or your firm are new to contributing to open source projects, please see the variety of resources available from FINOS, (such as the [Open Source readiness project](https://www.finos.org/open-source-readiness)), Linux Foundation ([Participating in Open Source communities](https://www.linuxfoundation.org/tools/participating-in-open-source-communities/)) and others (e.g. [opensource.guide](https://opensource.guide/)). -## What it means to be an FDC3 Participant, Editor or Maintainer +### What it means to be an FDC3 Participant, Editor or Maintainer According to [Governance document](GOVERNANCE.md) document: @@ -152,7 +152,7 @@ According to [Governance document](GOVERNANCE.md) document: Whilst all 3 roles require some amount of attention, being an Editor or Maintainer will obviously require a greater and more regular investment of time from anyone taking on that role. -### How do you become a Participant? +#### How do you become a Participant? Becoming an **FDC3 Participant** is as easy as attending a meeting and/or raising issues for changes you'd like see in the Standard, commenting on issues others have raised or even asking questions (which can often result in the clarification of the Standard's documentation to help others with the same questions in future). @@ -160,15 +160,15 @@ If you are going to use, implement or benefit from the FDC3 Standard, we also re Upon enrollment as an [FDC3 voting participant](https://github.com/orgs/finos/teams/fdc3-participants), you will be invited to join the [FINOS GitHub organization](https://github.com/orgs/finos/people) and the [fdc3-participants](https://github.com/orgs/finos/teams/fdc3-participants) GitHub team. -### How do you become an Editor or Maintainer? +#### How do you become an Editor or Maintainer? Once you are an enrolled participant in FDC3, you can apply to become an **editor** or **maintainer** by contacting the existing FDC3 maintainers at [fdc3-maintainers@finos.org](mailto:fdc3-maintainers@finos.org) and then seeking the approval of the FDC3 Standards Working Group. Generally, the maintainers will look for both a history of contribution to FDC3 and a commitment to investing sufficient time in the role from any prospective candidates before proposing them to the Standards Working Group for approval. If you are new to FDC3, but willing to make the investment of time, the maintainers can work with you to build up a history of contribution. -## FINOS Code of Conduct +### FINOS Code of Conduct -Participants in FINOS standards projects should follow the FINOS Code of Conduct, which can be found at: https://community.finos.org/docs/governance/code-of-conduct +Participants in FINOS standards projects should follow the FINOS Code of Conduct, which can be found at: -# License +## License Copyright 2017-2022 FINOS and FDC3 Participants @@ -178,19 +178,16 @@ Subsequent FDC3 specifications and draft specifications are subject to the [FINO Reference implementations and other software contained in FDC3 repositories is licensed under the [Apache License, Version 2.0](LICENSE) unless otherwise noted. SPDX-License-Identifier: [Apache-2.0](https://spdx.org/licenses/Apache-2.0). -# Vulnerabilities / Security +## Vulnerabilities / Security Please see our [Security Policy](SECURITY.md) -# Intellectual Property Claims +## Intellectual Property Claims -Users of the FDC3 standard are requested to submit, with their comments, notification of -any relevant patent claims or other intellectual property rights of which they may be aware that -might be infringed by any implementation of the standard set forth in this document, and to provide -supporting documentation. +Users of the FDC3 standard are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by any implementation of the standard set forth in this document, and to provide supporting documentation. THIS STANDARD IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NON-INFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS STANDARD SHALL BE MADE ENTIRELY AT THE IMPLEMENTER'S OWN RISK, AND NEITHER THE FOUNDATION, NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS STANDARD. -# FDC3 Archive +## FDC3 Archive -An archive of FDC3 documentation and meeting notes is available at https://finosfoundation.atlassian.net/wiki/spaces/FDC3/overview. The mailing list archive for fdc3@finos.org is available at https://groups.google.com/a/finos.org/g/fdc3 \ No newline at end of file +An archive of FDC3 documentation and meeting notes is available at . The mailing list archive for [fdc3@finos.org](mailto:fdc3@finos.org) is available at From 14d1277c3ad44dca54763a47412b0f8823cb4d44 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 10:44:11 +0100 Subject: [PATCH 098/106] Apply suggestions from code review Co-authored-by: Hugh Troeger --- SCOPE.md | 4 ++-- .../ref/PrivateChannel.eventListenerAdded.md | 6 +++--- .../PrivateChannel.eventListenerRemoved.md | 10 +++++----- .../PrivateChannel.onAddContextListener.md | 2 +- .../ref/PrivateChannel.onDisconnect.md | 2 +- .../ref/PrivateChannel.onUnsubscribe.md | 2 +- docs/agent-bridging/ref/broadcast.md | 4 ++-- docs/agent-bridging/ref/findInstances.md | 2 +- docs/agent-bridging/ref/findIntent.md | 2 +- .../ref/findIntentsByContext.md | 2 +- docs/agent-bridging/ref/getAppMetadata.md | 2 +- docs/agent-bridging/ref/open.md | 2 +- docs/agent-bridging/ref/raiseIntent.md | 6 +++--- docs/agent-bridging/spec.md | 20 +++++++++---------- schemas/bridging/common.schema.json | 2 +- ...AddContextListenerAgentRequest.schema.json | 2 +- 16 files changed, 35 insertions(+), 35 deletions(-) diff --git a/SCOPE.md b/SCOPE.md index 99da1459e..f189f2127 100644 --- a/SCOPE.md +++ b/SCOPE.md @@ -10,11 +10,11 @@ Financial desktop applications include any app used in common financial workflow * Common desktop applications not specific to finance, but critical to workflows - such as Excel, Outlook, etc. * PWAs & Web applications running in a commercial browser -This standards group is focused specifically on the desktop, hence, it's activities do not include: +This standards group is focused specifically on the desktop, hence, its activities do not include: * Defining financial objects - where existing standards are well established * Interoperability between mobile apps -* Interoperability via REST or other client to server communication, except where used locally for Desktop Agents to communicate with each other in support of desktop interoperability (Agent Bridging) +* Interoperability via REST or other client to server communication, except where used locally for Desktop Agents to communicate with each other in support of desktop interoperability (Agent Bridging) Note: While these areas are out of scope, compatibility with Mobile and/or REST are still valid points of consideration for the FDC3 Standard. diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md index afca79c01..5adffcf63 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md @@ -6,9 +6,9 @@ title: PrivateChannel.eventListenerAdded Desktop Agent bridging message exchange for the addition of an event handler to a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: -- [`PrivateChannel.onAddContextListener(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onaddcontextlistener) -- [`PrivateChannel.onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) -- [`PrivateChannel.onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) +- [`PrivateChannel.onAddContextListener(handler: (contextType?: string) => void): Listener`](../../api/ref/PrivateChannel#onaddcontextlistener) +- [`PrivateChannel.onUnsubscribe(handler: (contextType?: string) => void): Listener`](../../api/ref/PrivateChannel#onunsubscribe) +- [`PrivateChannel.onDisconnect(handler: () => void): Listener`](../../api/ref/PrivateChannel#ondisconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md index 402e21a86..da997e6a9 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -6,12 +6,12 @@ title: PrivateChannel.eventListenerRemoved Desktop Agent bridging message exchange for the removal of an event handler from a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: -- [`listener.unsubscribe()`](../../api/ref/Types#listener) +- [`listener.unsubscribe(): void`](../../api/ref/Types#listener) - for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: - - [`onAddContextListener(handler: (contextType?: string)`](../../api/ref/PrivateChannel#onaddcontextlistener) - - [`onUnsubscribe(handler: (contextType?: string) => void)`](../../api/ref/PrivateChannel#onunsubscribe) - - [`onDisconnect(handler: () => void)`](../../api/ref/PrivateChannel#ondisconnect) -- [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) + - [`onAddContextListener(handler: (contextType?: string) => void): Promise`](../../api/ref/PrivateChannel#onaddcontextlistener) + - [`onUnsubscribe(handler: (contextType?: string) => void): Promise`](../../api/ref/PrivateChannel#onunsubscribe) + - [`onDisconnect(handler: () => void): Promise`](../../api/ref/PrivateChannel#ondisconnect) +- [`PrivateChannel.disconnect(): void`](../../api/ref/PrivateChannel#disconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** diff --git a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md index 2c55b7890..10f1bc412 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md +++ b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md @@ -6,7 +6,7 @@ title: PrivateChannel.onAddContextListener Desktop Agent bridging message exchange for the addition of a [`ContextHandler`](../../api/ref/Types#contexthandler) to a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API call: -- [`PrivateChannel.addContextListener(contextType: string | null, handler: ContextHandler)`](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) +- [`PrivateChannel.addContextListener(contextType: string | null, handler: ContextHandler): Promise`](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** diff --git a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md index ccd73ce69..1be1ccfd6 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md +++ b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md @@ -6,7 +6,7 @@ title: PrivateChannel.onDisconnect Desktop Agent bridging message exchange for a `disconnect()` API call on [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API call: -- [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) +- [`PrivateChannel.disconnect(): void`](../../api/ref/PrivateChannel#disconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** diff --git a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md index 6fd902543..e454b6a76 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -8,7 +8,7 @@ Desktop Agent bridging message exchange for the removal of a [`ContextHandler`]( - [`listener.unsubscribe()`](../../api/ref/Types#listener) - for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: - - [addContextListener(handler: (contextType?: string)](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) + - [addContextListener(handler: (contextType?: string) => void): Promise](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) - [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** diff --git a/docs/agent-bridging/ref/broadcast.md b/docs/agent-bridging/ref/broadcast.md index d657035e2..02e060914 100644 --- a/docs/agent-bridging/ref/broadcast.md +++ b/docs/agent-bridging/ref/broadcast.md @@ -6,8 +6,8 @@ title: broadcast Desktop Agent bridging message exchange for a `broadcast()` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent) or a [`Channel`](../../api/ref/Channel). Generated by API calls: -- [`fdc3.broadcast(context: Context)`](../../api/ref/DesktopAgent#broadcast) -- [`Channel.broadcast(context: Context)`](../../api/ref/Channel#broadcast) +- [`fdc3.broadcast(context: Context): Promise`](../../api/ref/DesktopAgent#broadcast) +- [`Channel.broadcast(context: Context): Promise`](../../api/ref/Channel#broadcast) :::caution diff --git a/docs/agent-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md index 7cf0cc2e5..105f065c6 100644 --- a/docs/agent-bridging/ref/findInstances.md +++ b/docs/agent-bridging/ref/findInstances.md @@ -6,7 +6,7 @@ title: findInstances Desktop Agent bridging message exchange for a `findInstances` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -- [`findInstances(app: AppIdentifier)`](../../api/ref/DesktopAgent#findinstances) +- [`findInstances(app: AppIdentifier): Promise>`](../../api/ref/DesktopAgent#findinstances) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** or **Request Response (single)** diff --git a/docs/agent-bridging/ref/findIntent.md b/docs/agent-bridging/ref/findIntent.md index 846873b97..4092c37ba 100644 --- a/docs/agent-bridging/ref/findIntent.md +++ b/docs/agent-bridging/ref/findIntent.md @@ -6,7 +6,7 @@ title: findIntent Desktop Agent bridging message exchange for a `findIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API call: -- [`findIntent(intent: string, context?: Context, resultType?: string)`](../../api/ref/DesktopAgent#findintent) +- [`findIntent(intent: string, context?: Context, resultType?: string): Promise`](../../api/ref/DesktopAgent#findintent) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** diff --git a/docs/agent-bridging/ref/findIntentsByContext.md b/docs/agent-bridging/ref/findIntentsByContext.md index 61e74352c..3ea9c1392 100644 --- a/docs/agent-bridging/ref/findIntentsByContext.md +++ b/docs/agent-bridging/ref/findIntentsByContext.md @@ -6,7 +6,7 @@ title: findIntentsByContext Desktop Agent bridging message exchange for a `findIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API call: -- [`findIntentsByContext(context: Context)`](../../api/ref/DesktopAgent#findintentsbycontext) +- [`findIntentsByContext(context: Context): Promise>`](../../api/ref/DesktopAgent#findintentsbycontext) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (collated)** diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index e415926ef..f3538b024 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -6,7 +6,7 @@ title: getAppMetadata Desktop Agent bridging message exchange for a `getAppMetadata` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -- [`getAppMetadata(app: AppIdentifier)`](../../api/ref/DesktopAgent#getappmetadata) +- [`getAppMetadata(app: AppIdentifier): Promise`](../../api/ref/DesktopAgent#getappmetadata) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (single)** diff --git a/docs/agent-bridging/ref/open.md b/docs/agent-bridging/ref/open.md index 32c40b8f9..77f2996d9 100644 --- a/docs/agent-bridging/ref/open.md +++ b/docs/agent-bridging/ref/open.md @@ -6,7 +6,7 @@ title: open Desktop Agent bridging message exchange for a `open` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -- [`open(app: AppIdentifier, context?: Context)`](../../api/ref/DesktopAgent#open) +- [`open(app: AppIdentifier, context?: Context): Promise`](../../api/ref/DesktopAgent#open) [Message Exchange Type](../spec#individual-message-exchanges): **Request Response (single)** diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index 0819c3359..5e5d8c73f 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -6,8 +6,8 @@ title: raiseIntent Desktop Agent bridging message exchange for a `raiseIntent` API call on the [`DesktopAgent`](../../api/ref/DesktopAgent). Generated by API calls: -- [`raiseIntent(intent: string, context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintent) -- [`raiseIntentForContext(context: Context, app: AppIdentifier)`](../../api/ref/DesktopAgent#raiseintentforcontext) +- [`raiseIntent(intent: string, context: Context, app: AppIdentifier): Promise`](../../api/ref/DesktopAgent#raiseintent) +- [`raiseIntentForContext(context: Context, app: AppIdentifier): Promise`](../../api/ref/DesktopAgent#raiseintentforcontext) [Message Exchange Type](../spec#individual-message-exchanges): **Request Multiple Response (single)** @@ -215,7 +215,7 @@ The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.des } ``` -When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that its finished running and to pass any `IntentResult` onto the raising application (setting either `payload.context` or `payload.channel` to indicate the type of the `IntentResult`). There is no need to provide a `source` field in this response as the source information was already provided in the `raiseIntentResponse` message preceeding it. +When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that it's finished running and to pass any `IntentResult` onto the raising application (setting either `payload.context` or `payload.channel` to indicate the type of the `IntentResult`). There is no need to provide a `source` field in this response as the source information was already provided in the `raiseIntentResponse` message preceding it. ```json // agent-B -> DAB diff --git a/docs/agent-bridging/spec.md b/docs/agent-bridging/spec.md index 2e472b8a7..0f0bf5936 100644 --- a/docs/agent-bridging/spec.md +++ b/docs/agent-bridging/spec.md @@ -6,7 +6,7 @@ title: Agent Bridging Overview (next) :::info _[@experimental](../fdc3-compliance#experimental-features)_ -Desktop Agent Bridging in an experimental feature added to FDC3 in 2.1, hence, it's design may change in future and it is exempted from the FDC3 Standards's normal versioning and deprecation polices in order to facilitate any necessary change. +Desktop Agent Bridging is an experimental feature added to FDC3 in 2.1, hence, its design may change in the future and it is exempted from the FDC3 Standard's normal versioning and deprecation polices in order to facilitate any necessary change. ::: @@ -110,7 +110,7 @@ Hence, message paths and propagation are simple. All messages to other Desktop A #### Multi-Machine Use Cases -In Financial services it is not unusual for a single user to be working with applications on more than one desktop. As Desktop Agents do not span desktops bridging Desktop Agents across multiple machines is an additional use case for Desktop Agent bridging. However, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. +In financial services it is not unusual for a single user to be working with applications on more than one desktop. As Desktop Agents do not span desktops bridging Desktop Agents across multiple machines is an additional use case for Desktop Agent bridging. However, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. ```mermaid flowchart LR; @@ -136,7 +136,7 @@ flowchart LR; However, cross-machine routing is currently considered to be an internal concern of a Desktop Agent Bridge implementation, with each Desktop Agent simply communicating with a bridge instance located on the same machine. Hence, the connection protocol between bridges themselves is currently beyond the scope of this standard and my be implemented via any suitable means. -Further, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. However, methods of verifying the identity of user are currently beyond the scope of the Standard. +Further, as FDC3 only contemplates interoperability between apps for a single user, it is expected that in multi-machine use cases each machine is being operated by the same user. However, methods of verifying the identity of users are currently beyond the scope of the Standard. ### Websocket Connection @@ -154,9 +154,9 @@ As the bridge binds its websocket on the loopback address (127.0.0.1) it cannot ## Connection Protocol -On connection to the bridge's websocket, a handshake must be completed that may include an authentication step before a name is assigned to the Desktop Agent for use in routing messages. The purpose of the handshake is to allow: +On connection to the bridge's websocket, a handshake must be completed that may include an authentication step before a name is assigned to the Desktop Agent for use in routing messages. The purpose of the handshake is to allow: -- The Desktop Agent to confirm that it is connecting to Desktop Agent Bridge, rather than another service exposed via a websocket. +- The Desktop Agent to confirm that it is connecting to the Desktop Agent Bridge, rather than another service exposed via a websocket. - The Desktop Agent Bridge to require that the Desktop Agent authenticate itself, allowing it to control access to the network of bridged Desktop Agents. - The Desktop Agent to request a particular name by which it will be addressed by other agents and for the bridge to assign the requested name, after confirming that no other agent is connected with that name, or a derivative of that name if it is already in use. @@ -615,7 +615,7 @@ There are two types of each response message, a successful response and an error ##### Response Messages Collated and Forwarded by the Bridge -Responses from individual Desktop Agents are collated by the Bridge and are forwarded on to the the Desktop Agent that initiated the interaction. The format used is very similar to that used for responses by the Desktop Agents, with the exception of the source information in the `meta` field. Specifically, the `meta.source` field does not need to be provided by agents, as responses are currently always provided by the desktop agent, whose details will be provided by the bridge when it receives the response. In responses from the bridge, the `meta.source` is replaced by two arrays, `meta.sources` and `meta.errorSources`, which provide details on the Desktop agents that responded normally or responded with errors. The detail of any errors returned (in the `payload.error` field of a Desktop Agent's response) is collected up into a `meta.errorDetails` field. Moving the error details from the `payload` to the `meta` field enables the return of a valid response to the originating Desktop Agent in cases where some agents produced valid responses, and others produced errors. +Responses from individual Desktop Agents are collated by the Bridge and are forwarded on to the the Desktop Agent that initiated the interaction. The format used is very similar to that used for responses by the Desktop Agents, with the exception of the source information in the `meta` field. Specifically, the `meta.source` field does not need to be provided by agents, as responses are currently always provided by the Desktop Agent, whose details will be provided by the bridge when it receives the response. In responses from the bridge, the `meta.source` is replaced by two arrays, `meta.sources` and `meta.errorSources`, which provide details on the Desktop Agents that responded normally or responded with errors. The detail of any errors returned (in the `payload.error` field of a Desktop Agent's response) is collected up into a `meta.errorDetails` field. Moving the error details from the `payload` to the `meta` field enables the return of a valid response to the originating Desktop Agent in cases where some agents produced valid responses, and others produced errors. Hence, for responses forwarded by the bridge there are two type of response messages from the Bridge returned to agents, one for requests that received at least one successful response, and another for use when all agents (or the targeted agent) returned an error. @@ -687,7 +687,7 @@ Hence, for responses forwarded by the bridge there are two type of response mess ##### All Responses are Errors :::info -In this case there are no successful response and the bridge must populate the `payload.error` field in the response to the agent with one of the error messages returned, so that the receiving Desktop Agent may return it to the app that made the original call. +In this case there are no successful responses and the bridge must populate the `payload.error` field in the response to the agent with one of the error messages returned, so that the receiving Desktop Agent may return it to the app that made the original call. ::: ```typescript @@ -728,7 +728,7 @@ In this case there are no successful response and the bridge must populate the ` ### Identifying Individual Messages -There are a variety of message types need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Universally Unique Identifier (UUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. +There are a variety of message types that need to be sent between bridged Desktop Agents, several of which will need to be replied to specifically (e.g. a `fdc3.raiseIntent` call should receive an `IntentResolution` when an app has been chosen, and may subsequently receive an `IntentResult` after the intent handler has run). Hence, messages also need a unique identity, which should be generated at the Desktop Agent that is the source of that message, in the form of a Universally Unique Identifier (UUID). Response messages will include the identity of the request message they are related to, allowing multiple message exchanges to be 'in-flight' at the same time. Hence, whenever a request message is generated by a Desktop Agent it should contain a unique `meta.requestUuid` value. Response messages should quote that same value in the `meta.requestUuid` field and generate a further unique identity for their response, which is included in the `meta.responseUuid` field. Where a response is collated by the Desktop Agent Bridge, the Bridge should generate its own `meta.responseUuid` for the collated response message. @@ -835,7 +835,7 @@ enum BridgingError { * been disconnected from the Bridge before a response has been received from it. */ AgentDisconnected = 'AgentDisconnected', /** Returned for FDC3 API calls that are specified with arguments indicating that - * a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a + * a remote Desktop Agent should be targeted (e.g. raiseIntent with an app on a * remote DesktopAgent targeted), when the local Desktop Agent is not connected to * a bridge. */ NotConnectedToBridge = 'NotConnectedToBridge', @@ -995,7 +995,7 @@ However, `PrivateChannel` instances allow the registration of additional event h JSONSchema definitions are provided for all Desktop Agent Bridging message exchanges (see links in each reference page), which may be used to validate the correct generation of messages to or from a bridge (a separate schema is provided for the agent and bridge versions of each message). -The JSONSchema definitions are also used to generate TypeScript interfaces for the messages to aid in implementation of a Desktop Agent Bridge or Client library. These may be imported from the FDC3 npm module: +The JSONSchema definitions are also used to generate TypeScript interfaces for the messages to aid in implementation of a Desktop Agent Bridge or client library. These may be imported from the FDC3 npm module: ```typescript import { BridgingTypes } from "@finos/fdc3"; diff --git a/schemas/bridging/common.schema.json b/schemas/bridging/common.schema.json index be1170beb..31e4ccebf 100644 --- a/schemas/bridging/common.schema.json +++ b/schemas/bridging/common.schema.json @@ -57,7 +57,7 @@ }, "BridgeParticipantIdentifier": { "title": "Bridge Participant Identifier", - "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", + "description": "Represents identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", "oneOf": [ { "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" diff --git a/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json index 8e3d224e6..61d50d82a 100644 --- a/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json +++ b/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json @@ -15,7 +15,7 @@ "PrivateChannelOnAddContextListenerRequestBase": { "title": "PrivateChannelOnAddContextListener Request", "type": "object", - "description": "A request to forward on an AddCOntextListener event, relating to a PrivateChannel", + "description": "A request to forward on an AddContextListener event, relating to a PrivateChannel", "properties": { "type": { "title": "Private Channel OnAddContextListener Message type", From 959d8b4bb8fff4c2762216d27c6f08164ef713dc Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 10:48:06 +0100 Subject: [PATCH 099/106] Correcting schema ids on new context schemas --- schemas/context/action.schema.json | 2 +- schemas/context/chatMessage.schema.json | 2 +- schemas/context/chatRoom.schema.json | 2 +- schemas/context/chatSearchCriteria.schema.json | 2 +- schemas/context/interaction.schema.json | 2 +- schemas/context/message.schema.json | 2 +- schemas/context/transactionresult.schema.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/schemas/context/action.schema.json b/schemas/context/action.schema.json index 553631232..388eb5073 100644 --- a/schemas/context/action.schema.json +++ b/schemas/context/action.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/action.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/action.schema.json", "type": "object", "title": "Action", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/schemas/context/chatMessage.schema.json b/schemas/context/chatMessage.schema.json index 72171d832..be443e915 100644 --- a/schemas/context/chatMessage.schema.json +++ b/schemas/context/chatMessage.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatMessage.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatMessage.schema.json", "type": "object", "title": "ChatMessage", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/schemas/context/chatRoom.schema.json b/schemas/context/chatRoom.schema.json index a5a430a6b..d0cd00664 100644 --- a/schemas/context/chatRoom.schema.json +++ b/schemas/context/chatRoom.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatRoom.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatRoom.schema.json", "type": "object", "title": "ChatRoom", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/schemas/context/chatSearchCriteria.schema.json b/schemas/context/chatSearchCriteria.schema.json index 932418859..95cdf90d7 100644 --- a/schemas/context/chatSearchCriteria.schema.json +++ b/schemas/context/chatSearchCriteria.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatSearchCriteria.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatSearchCriteria.schema.json", "type": "object", "title": "ChatSearchCriteria", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/schemas/context/interaction.schema.json b/schemas/context/interaction.schema.json index ed32dfbc0..b5ed532d3 100644 --- a/schemas/context/interaction.schema.json +++ b/schemas/context/interaction.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/interaction.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/interaction.schema.json", "type": "object", "title": "Interaction", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/schemas/context/message.schema.json b/schemas/context/message.schema.json index 05d44205d..9f69e5b3f 100644 --- a/schemas/context/message.schema.json +++ b/schemas/context/message.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/message.schema.json", + "$id": "https://fdc3.finos.org/schemas/context/message.schema.json", "type": "object", "title": "Message", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/schemas/context/transactionresult.schema.json b/schemas/context/transactionresult.schema.json index a2db6370d..11370018e 100644 --- a/schemas/context/transactionresult.schema.json +++ b/schemas/context/transactionresult.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/transactionresult.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/transactionresult.schema.json", "type": "object", "title": "TransactionResult", "allOf": [{ "$ref": "context.schema.json#" }], From 0b481f0681364f59a4ee573b54a1a1f6d54655ba Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 11:21:54 +0100 Subject: [PATCH 100/106] Apply suggestions from code review Co-authored-by: Matt Jamieson <10372+mattjamieson@users.noreply.github.com> --- docs/agent-bridging/ref/findInstances.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/agent-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md index 105f065c6..a6708366c 100644 --- a/docs/agent-bridging/ref/findInstances.md +++ b/docs/agent-bridging/ref/findInstances.md @@ -105,7 +105,7 @@ If results should be constrained to a particular Desktop Agent, then set a `desk "meta": { "requestUuid": "", "timestamp": "2020-03-...", - "destination": { "desktopAgent": "agent-B"}, //destination agent + "destination": { "desktopAgent": "agent-B" }, //destination agent "source": { "appId": "AChatApp", "instanceId": "02e575aa-4c3a-4b66-acad-155073be21f6" @@ -135,8 +135,8 @@ Response message from a Desktop Agent: "type": "findInstancesResponse", "payload": { "appIdentifiers": [ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344"}, - { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d"}, + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344" }, + { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d" }, ] }, "meta": { @@ -155,7 +155,7 @@ The bridge receives and collates the responses, augmenting each appIdentifier wi "type": "findInstancesResponse", "payload": { "appIdentifiers": [ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B" }, //"desktopAgent" added by DAB { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, @@ -174,7 +174,7 @@ The bridge receives and collates the responses, augmenting each appIdentifier wi ``` :::info -If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.responseUuid` and can quote that given by the responding Desktop Agent. +If a target Desktop Agent was specified in the request (via a `desktopAgent` field in `payload.app`), then the DAB is not collating responses and does not need to generate a unique `meta.responseUuid` and MUST quote that given by the responding Desktop Agent. ::: :::note @@ -186,7 +186,7 @@ Finally, agent-A combines the data received from the bridge, with its own local ```json // DAB -> agent-A [ - { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B"}, + { "appId": "myApp", "instanceId": "4bf39be1-a25b-4ad5-8dbc-ce37b436a344", "desktopAgent": "agent-B" }, { "appId": "myApp", "instanceId": "4f10abb7-4df4-4fc6-8813-bbf0dc1b393d", "desktopAgent": "agent-B" }, { "appId": "myApp", "instanceId": "920b74f7-1fef-4076-adef-63b82bae0dd9", "desktopAgent": "agent-C" }, { "appId": "myApp", "instanceId": "688dbd5e-21dc-4469-b8cf-4b6a606f9a27" } //local response From a6fb49b221fcfe8e5f3ddbcc30ec657a85b50aac Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 14:11:18 +0100 Subject: [PATCH 101/106] =?UTF-8?q?Add=20the=20app=20to=20each=20reference?= =?UTF-8?q?=20page=20mermaid=20diagram=20to=20clarify=20how=20mes=E2=80=A6?= =?UTF-8?q?=20(#80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add the app to each reference page mermaid diagram to clarify how message exchanges work * Changing arrow style for FDC3 API calls + adding expect type for promise resolution to mermaid diagrams * fix box in mermaid diagram --- .../ref/PrivateChannel.broadcast.md | 8 ++++++-- .../ref/PrivateChannel.eventListenerAdded.md | 8 ++++++-- .../PrivateChannel.eventListenerRemoved.md | 8 ++++++-- .../PrivateChannel.onAddContextListener.md | 8 ++++++-- .../ref/PrivateChannel.onDisconnect.md | 8 ++++++-- .../ref/PrivateChannel.onUnsubscribe.md | 4 ++++ docs/agent-bridging/ref/broadcast.md | 10 +++++++--- docs/agent-bridging/ref/findInstances.md | 13 +++++++++---- docs/agent-bridging/ref/findIntent.md | 17 +++++++++++------ .../ref/findIntentsByContext.md | 17 +++++++++++------ docs/agent-bridging/ref/getAppMetadata.md | 11 ++++++++--- docs/agent-bridging/ref/open.md | 13 +++++++++---- docs/agent-bridging/ref/raiseIntent.md | 19 +++++++++++++------ 13 files changed, 102 insertions(+), 42 deletions(-) diff --git a/docs/agent-bridging/ref/PrivateChannel.broadcast.md b/docs/agent-bridging/ref/PrivateChannel.broadcast.md index 30c389d6b..51695afcf 100644 --- a/docs/agent-bridging/ref/PrivateChannel.broadcast.md +++ b/docs/agent-bridging/ref/PrivateChannel.broadcast.md @@ -20,12 +20,16 @@ Some additional tracking of PrivateChannel metadata is required on the Desktop A ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: PrivateChannel.broadcast - DAB ->>+ DB: PrivateChannel.broadcast + AA --) DA: privateChannel.broadcast() + DA ->> DAB: PrivateChannel.broadcast + DAB ->> DB: PrivateChannel.broadcast ``` ## Request format diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md index 5adffcf63..b92c3fd9f 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md @@ -24,12 +24,16 @@ Private channels support a number of additional event listeners (`onAddContextLi ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: PrivateChannel.eventListenerAdded - DAB ->>+ DB: PrivateChannel.eventListenerAdded + AA --) DA: adds an event listener + DA ->> DAB: PrivateChannel.eventListenerAdded + DAB ->> DB: PrivateChannel.eventListenerAdded ``` ## Request format diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md index da997e6a9..12dfae6bd 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -27,12 +27,16 @@ Private channels support a number of additional event listeners (`onAddContextLi ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: PrivateChannel.eventListenerRemoved - DAB ->>+ DB: PrivateChannel.eventListenerRemoved + AA --) DA: removes an event listener + DA ->> DAB: PrivateChannel.eventListenerRemoved + DAB ->> DB: PrivateChannel.eventListenerRemoved ``` ## Request format diff --git a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md index 10f1bc412..60f94165c 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md +++ b/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md @@ -22,12 +22,16 @@ When a `ContextListener` is added to a `PrivateChannel` any applications that ha ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: PrivateChannel.onAddContextListener - DAB ->>+ DB: PrivateChannel.onAddContextListener + AA --) DA: privateChannel.addContextListener() + DA ->> DAB: PrivateChannel.onAddContextListener + DAB ->> DB: PrivateChannel.onAddContextListener ``` ## Request format diff --git a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md index 1be1ccfd6..7aa41dc6f 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md +++ b/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md @@ -22,12 +22,16 @@ When the `disconnect` function is is called on a `PrivateChannel` any applicatio ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: PrivateChannel.onDisconnect - DAB ->>+ DB: PrivateChannel.onDisconnect + AA --) DA: privateChannel.disconnect() + DA ->> DAB: PrivateChannel.onDisconnect + DAB ->> DB: PrivateChannel.onDisconnect ``` ### Request message schemas diff --git a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md index e454b6a76..8aa27e2c5 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -25,10 +25,14 @@ When a `ContextListener` is removed from a `PrivateChannel` (via `listener.unsub ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C + AA --) DA: listener.unsubscribe() DA ->>+ DAB: PrivateChannel.onUnsubscribe DAB ->>+ DB: PrivateChannel.onUnsubscribe ``` diff --git a/docs/agent-bridging/ref/broadcast.md b/docs/agent-bridging/ref/broadcast.md index 02e060914..fe6f7fa08 100644 --- a/docs/agent-bridging/ref/broadcast.md +++ b/docs/agent-bridging/ref/broadcast.md @@ -33,13 +33,17 @@ or ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: broadcastRequest - DAB ->>+ DB: broadcastRequest - DAB ->>+ DC: broadcastRequest + AA --) DA: fdc3.broadcast() / channel.broadcast() + DA ->> DAB: broadcastRequest + DAB ->> DB: broadcastRequest + DAB ->> DC: broadcastRequest ``` ## Request format diff --git a/docs/agent-bridging/ref/findInstances.md b/docs/agent-bridging/ref/findInstances.md index a6708366c..367cd4f88 100644 --- a/docs/agent-bridging/ref/findInstances.md +++ b/docs/agent-bridging/ref/findInstances.md @@ -24,16 +24,21 @@ let instances = await fdc3.findInstances({appId: "MyAppId", desktopAgent: "agent ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: findInstancesRequest - DAB ->>+ DB: findInstancesRequest - DAB ->>+ DC: findInstancesRequest + AA --) DA: fdc3.findInstances() + DA ->> DAB: findInstancesRequest + DAB ->> DB: findInstancesRequest + DAB ->> DC: findInstancesRequest DB ->> DAB: findInstancesResponse (B) DC ->> DAB: findInstancesResponse (C) - DAB -->>- DA: findInstancesResponse (B + C) + DAB ->> DA: findInstancesResponse (B + C) + DA --) AA: resolve (AppIdentifier[]) ``` ## Request format diff --git a/docs/agent-bridging/ref/findIntent.md b/docs/agent-bridging/ref/findIntent.md index 4092c37ba..6bf85da90 100644 --- a/docs/agent-bridging/ref/findIntent.md +++ b/docs/agent-bridging/ref/findIntent.md @@ -20,16 +20,21 @@ let appIntent = await fdc3.findIntent("StartChat", context); ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: findIntentRequest - DAB ->>+ DB: findIntentRequest - DAB ->>+ DC: findIntentRequest - DB -->>- DAB: findIntentResponse (B) - DC -->>- DAB: findIntentResponse (C) - DAB -->>- DA: findIntentResponse (B + C) + AA --) DA: fdc3.findIntent() + DA ->> DAB: findIntentRequest + DAB ->> DB: findIntentRequest + DAB ->> DC: findIntentRequest + DB ->> DAB: findIntentResponse (B) + DC ->> DAB: findIntentResponse (C) + DAB ->> DA: findIntentResponse (B + C) + DA --) AA: resolve (AppIntent) ``` ## Request format diff --git a/docs/agent-bridging/ref/findIntentsByContext.md b/docs/agent-bridging/ref/findIntentsByContext.md index 3ea9c1392..9dcf927bb 100644 --- a/docs/agent-bridging/ref/findIntentsByContext.md +++ b/docs/agent-bridging/ref/findIntentsByContext.md @@ -24,16 +24,21 @@ The message exchanges for this API call are nearly identical to that used for [` ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: findIntentsByContextRequest - DAB ->>+ DB: findIntentsByContextRequest - DAB ->>+ DC: findIntentsByContextRequest - DB -->>- DAB: findIntentsByContextResponse (B) - DC -->>- DAB: findIntentsByContextResponse (C) - DAB -->>- DA: findIntentsByContextResponse (B + C) + AA --) DA: fdc3.findIntentsByContext + DA ->> DAB: findIntentsByContextRequest + DAB ->> DB: findIntentsByContextRequest + DAB ->> DC: findIntentsByContextRequest + DB ->> DAB: findIntentsByContextResponse (B) + DC ->> DAB: findIntentsByContextResponse (C) + DAB ->> DA: findIntentsByContextResponse (B + C) + DA --) AA: resolve (AppIntent[]) ``` ## Request format diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/docs/agent-bridging/ref/getAppMetadata.md index f3538b024..b624cd435 100644 --- a/docs/agent-bridging/ref/getAppMetadata.md +++ b/docs/agent-bridging/ref/getAppMetadata.md @@ -25,14 +25,19 @@ let appMetadata = await fdc3.getAppMetadata(appIdentifier); ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: getAppMetadataRequest - DAB ->>+ DB: getAppMetadataRequest + AA --) DA: fdc3.getAppMetadata() + DA ->> DAB: getAppMetadataRequest + DAB ->> DB: getAppMetadataRequest DB ->> DAB: getAppMetadataResponse (B) - DAB -->>- DA: getAppMetadataResponse (B) + DAB ->> DA: getAppMetadataResponse (B) + DA --) AA: resolve (AppMetadata) ``` ## Request format diff --git a/docs/agent-bridging/ref/open.md b/docs/agent-bridging/ref/open.md index 77f2996d9..76c445732 100644 --- a/docs/agent-bridging/ref/open.md +++ b/docs/agent-bridging/ref/open.md @@ -40,14 +40,19 @@ If the remote Desktop Agent is not currently connected from the bridge, the [`Op ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: openRequest - DAB ->>+ DB: openRequest - DB -->>- DAB: openResponse - DAB -->>- DA: openResponse + AA --) DA: fdc3.open() + DA ->> DAB: openRequest + DAB ->> DB: openRequest + DB ->> DAB: openResponse + DAB ->> DA: openResponse + DA --) AA: resolve (AppIdentifier) ``` ## Request format diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index 5e5d8c73f..164bbc2f3 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -51,16 +51,23 @@ Agent-C is not involved in the diagram below as the `raiseIntent` is always spec ```mermaid sequenceDiagram + box Desktop Agent A + participant AA as App A participant DA as Desktop Agent A + end participant DAB as Desktop Agent Bridge participant DB as Desktop Agent B participant DC as Desktop Agent C - DA ->>+ DAB: raiseIntentRequest - DAB ->>+ DB: raiseIntentRequest - DB -->>- DAB: raiseIntentResponse - DAB -->>- DA: raiseIntentResponse - DB ->>+ DAB: raiseIntentResultResponse - DAB ->>+ DA: raiseIntentResultResponse + AA --) DA: fdc3.raiseIntent + DA ->> DAB: raiseIntentRequest + DAB ->> DB: raiseIntentRequest + DB ->> DAB: raiseIntentResponse + DAB ->> DA: raiseIntentResponse + DA -->> AA: resolve (IntentResolution) + AA --) DA: resolution.getResult() + DB ->> DAB: raiseIntentResultResponse + DAB ->> DA: raiseIntentResultResponse + DA --) AA: resolve (IntentResult) ``` ## Request format From fd9eef4fda4135cbd444ae7e35fada4fd79da127 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 18:08:42 +0100 Subject: [PATCH 102/106] Fixing build issue and copying schemas to website --- .../ref/PrivateChannel.onUnsubscribe.md | 4 +- website/static/schemas/next/appd.schema.json | 1531 +++++++++++++++++ .../next/bridging/agentRequest.schema.json | 2 +- .../next/bridging/agentResponse.schema.json | 7 +- .../bridging/bridgeErrorResponse.schema.json | 4 +- .../next/bridging/bridgeRequest.schema.json | 8 +- .../next/bridging/bridgeResponse.schema.json | 6 +- .../broadcastAgentRequest.schema.json | 2 +- .../schemas/next/bridging/common.schema.json | 74 +- .../findInstancesAgentRequest.schema.json | 4 +- .../findIntentAgentRequest.schema.json | 4 +- ...ndIntentsByContextAgentRequest.schema.json | 2 +- .../getAppMetadataAgentRequest.schema.json | 6 +- .../bridging/openAgentRequest.schema.json | 4 +- ...teChannelBroadcastAgentRequest.schema.json | 4 +- ...EventListenerAddedAgentRequest.schema.json | 4 +- ...entListenerRemovedAgentRequest.schema.json | 4 +- ...AddContextListenerAgentRequest.schema.json | 6 +- ...hannelOnDisconnectAgentRequest.schema.json | 4 +- ...annelOnUnsubscribeAgentRequest.schema.json | 4 +- .../raiseIntentAgentRequest.schema.json | 6 +- .../schemas/next/context/action.schema.json | 2 +- .../next/context/chatMessage.schema.json | 2 +- .../schemas/next/context/chatRoom.schema.json | 2 +- .../context/chatSearchCriteria.schema.json | 2 +- .../next/context/interaction.schema.json | 2 +- .../schemas/next/context/message.schema.json | 2 +- .../context/transactionresult.schema.json | 2 +- 28 files changed, 1604 insertions(+), 100 deletions(-) create mode 100644 website/static/schemas/next/appd.schema.json diff --git a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md index 8aa27e2c5..4c33e6189 100644 --- a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md +++ b/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md @@ -7,8 +7,8 @@ title: PrivateChannel.onUnsubscribe Desktop Agent bridging message exchange for the removal of a [`ContextHandler`](../../api/ref/Types#contexthandler) from a [`PrivateChannel`](../../api/ref/PrivateChannel). Generated by API calls: - [`listener.unsubscribe()`](../../api/ref/Types#listener) - - for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) functions: - - [addContextListener(handler: (contextType?: string) => void): Promise](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) + - for [`Listener`](../../api/ref/Types#listener) objects returned by [`PrivateChannel`](../../api/ref/PrivateChannel) function: + - [`addContextListener(handler: (contextType?: string) => void): Promise`](../../api/ref/Channel#addcontextlistener) (inherited from `Channel`) - [`PrivateChannel.disconnect()`](../../api/ref/PrivateChannel#disconnect) [Message Exchange Type](../spec#individual-message-exchanges): **Request only** diff --git a/website/static/schemas/next/appd.schema.json b/website/static/schemas/next/appd.schema.json new file mode 100644 index 000000000..466ded9b6 --- /dev/null +++ b/website/static/schemas/next/appd.schema.json @@ -0,0 +1,1531 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "FDC3 Application Directory", + "version": "next", + "description": "Application Directory specification providing both interface definition and objects necessary to construct an application directory service.", + "x-logo": { + "url": "/img/fdc3-logo-2019-color.png", + "altText": "FDC3 logo" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "paths": { + "/v2/apps/{appId}": { + "get": { + "summary": "Retrieve an application definition", + "parameters": [ + { + "name": "appId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Application" + }, + "examples": { + "MyAppDefinition": { + "$ref": "#/components/examples/MyAppDefinition" + }, + "FDC3WorkbenchAppDefinition": { + "$ref": "#/components/examples/FDC3WorkbenchAppDefinition" + } + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + }, + "examples": { + "Error400Example": { + "$ref": "#/components/examples/Error400Example" + } + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + }, + "examples": { + "Error403Example": { + "$ref": "#/components/examples/Error403Example" + } + } + } + } + }, + "500": { + "description": "Server error", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + }, + "examples": { + "Error500Example": { + "$ref": "#/components/examples/Error500Example" + } + } + } + } + } + }, + "tags": [ + "Application" + ] + } + }, + "/v2/apps": { + "get": { + "summary": "Retrieve all application definitions", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AllApplicationsResponse" + }, + "examples": { + "AllAppsResponse": { + "$ref": "#/components/examples/AllAppsResponse" + } + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + }, + "examples": { + "Error400Example": { + "$ref": "#/components/examples/Error400Example" + } + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + }, + "examples": { + "Error403Example": { + "$ref": "#/components/examples/Error403Example" + } + } + } + } + }, + "500": { + "description": "Server error", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + }, + "examples": { + "Error500Example": { + "$ref": "#/components/examples/Error500Example" + } + } + } + } + } + }, + "tags": [ + "Application" + ] + } + }, + "/v1/apps/{appId}": { + "get": { + "deprecated": true, + "summary": "Retrieve an application definition", + "parameters": [ + { + "name": "appId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplicationV1" + } + } + } + }, + "400": { + "description": "Bad request.", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + }, + "403": { + "description": "Forbidden: Certificate authentication is not allowed for the requested user.", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + }, + "500": { + "description": "Server error, see response body for further details.", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + } + }, + "tags": [ + "Application" + ] + } + }, + "/v1/apps": { + "post": { + "deprecated": true, + "summary": "Create a new application definition", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplicationSearchResponseV1" + } + } + } + }, + "400": { + "description": "Bad request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + }, + "403": { + "description": "Forbidden: Certificate authentication is not allowed for the requested user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + }, + "500": { + "description": "Server error, see response body for further details.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + } + }, + "tags": [ + "Application" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplicationV1" + } + } + }, + "required": true + } + } + }, + "/v1/apps/search": { + "get": { + "deprecated": true, + "summary": "Retrieve a list of applications based on parameters provided. Depending on implementation, parameter values should self describe search format and type (e.g. Regex)", + "parameters": [ + { + "in": "query", + "name": "appId", + "schema": { + "type": "string" + }, + "required": false, + "description": "The unique application identifier located within a specific application directory instance." + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "string" + }, + "required": false, + "description": "The name of the application. The name should be unique within an FDC3 App Directory instance. The exception to the uniqueness constraint is that an App Directory can hold definitions for multiple versions of the same app. The same appName could occur in other directories. We are not currently specifying app name conventions in the document." + }, + { + "in": "query", + "name": "version", + "schema": { + "type": "string" + }, + "required": false, + "description": "Version of the application. This allows multiple app versions to be defined using the same app name. This can be a triplet but can also include things like 1.2.5 (BETA)" + }, + { + "in": "query", + "name": "title", + "schema": { + "type": "string" + }, + "required": false, + "description": "Optional title for the application, if missing use appName, typically used in a launcher UI." + }, + { + "in": "query", + "name": "tooltip", + "schema": { + "type": "string" + }, + "required": false, + "description": "Optional tooltip description e.g. for a launcher" + }, + { + "in": "query", + "name": "description", + "schema": { + "type": "string" + }, + "required": false, + "description": "Description of the application. This will typically be a 1-2 paragraph style blurb about the application. Allow mark up language" + }, + { + "in": "query", + "name": "intent_name", + "schema": { + "type": "string" + }, + "required": false, + "description": "name of intent" + }, + { + "in": "query", + "name": "intent_displayName", + "schema": { + "type": "string" + }, + "required": false, + "description": "displayName of intent" + }, + { + "in": "query", + "name": "intent_context", + "schema": { + "type": "string" + }, + "required": false, + "description": "search contexts list" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplicationSearchResponseV1" + } + } + } + }, + "400": { + "description": "Bad request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + }, + "403": { + "description": "Forbidden: Certificate authentication is not allowed for the requested user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + }, + "500": { + "description": "Server error, see response body for further details.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDTO" + } + } + } + } + }, + "tags": [ + "Application" + ] + } + } + }, + "servers": [ + { + "url": "/appd" + } + ], + "components": { + "securitySchemes": { + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + }, + "schemas": { + "ErrorDTO": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + }, + "BaseApplication": { + "properties": { + "appId": { + "type": "string", + "description": "The unique application identifier located within a specific application directory instance." + }, + "title": { + "type": "string", + "description": "Title for the application, typically used in a launcher UI." + }, + "type": { + "$ref": "#/components/schemas/Type" + }, + "details": { + "$ref": "#/components/schemas/LaunchDetails" + }, + "name": { + "type": "string", + "description": "Deprecated in favour of using `appId` to identify apps and `title` for their display names. The name of the application. The name should be unique within an FDC3 App Directory instance. The exception to the uniqueness constraint is that an App Directory can hold definitions for multiple versions of the same app. The same appName could occur in other directories. We are not currently specifying app name conventions in the document.", + "deprecated": true + }, + "version": { + "type": "string", + "description": "Version of the application. This allows multiple app versions to be defined using the same app name. This can be a triplet but can also include things like 1.2.5 (BETA)" + }, + "tooltip": { + "type": "string", + "description": "Optional tooltip description e.g. for a launcher" + }, + "lang": { + "type": "string", + "pattern": "^[a-z]{2}(-[a-zA-Z0-9]{2,8}){0,1}$", + "description": "A language tag that specifies the primary language of both the application and its AppD entry, as defined by IETF RFC 5646." + }, + "description": { + "type": "string", + "description": "Description of the application. This will typically be a 1-2 paragraph style blurb about the application. " + }, + "categories": { + "description": "An array of string categories that describe the application. These are meant as a hint to catalogs or stores listing FDC3-enabled apps and it is expected that these will make a best effort to find appropriate categories (or category) under which to list the app. AppD record authors are encouraged to use lower-case and, where possible, to select categories from the following list:\n\n- allocations\n- analytics\n- charts\n- chat\n- communication\n- compliance\n- crm\n- developer tools\n- events\n- execution management\n- file sharing\n- market data\n- news\n- networking\n- office apps\n- order management\n- other\n- portfolio management\n- presentation\n- pricing\n- productivity\n- research\n- risk\n- screen sharing\n- security\n- spreadsheet\n- trade cost analysis\n- trading system\n- training\n- travel\n- video\n- visualization\n- weather\n", + "type": "array", + "items": { + "type": "string" + } + }, + "icons": { + "type": "array", + "description": "Holds Icons used for the application, a Launcher may be able to use multiple Icon sizes or there may be a 'button' Icon", + "items": { + "$ref": "#/components/schemas/Icon" + } + }, + "screenshots": { + "type": "array", + "description": "Array of images to show the user when they are looking at app description. Each image can have an optional description/tooltip", + "items": { + "$ref": "#/components/schemas/Screenshot" + } + }, + "contactEmail": { + "type": "string", + "format": "email", + "description": "Optional e-mail to receive queries about the application" + }, + "supportEmail": { + "type": "string", + "format": "email", + "description": "Optional e-mail to receive support requests for the application" + }, + "moreInfo": { + "type": "string", + "format": "uri", + "description": "Optional URL that provides more information about the application" + }, + "publisher": { + "type": "string", + "description": "The name of the company that owns the application. The publisher has control over their namespace/app/signature." + }, + "customConfig": { + "deprecated": true, + "type": "array", + "description": "An optional set of name value pairs that can be used to deliver custom data from an App Directory to a launcher. Deprecated due to a lack of a standard means of retrieval via the Desktop Agent API. To be replaced in a future version with an `applicationConfig` element and standard API to retrieve it. See issue [#1006](https://github.com/finos/FDC3/issues/1006) for details.", + "items": { + "$ref": "#/components/schemas/NameValuePair" + } + }, + "hostManifests": { + "$ref": "#/components/schemas/HostManifests" + }, + "interop": { + "$ref": "#/components/schemas/Interop" + } + } + }, + "Application": { + "description": "Defines an application retrieved from an FDC3 App Directory, which can then be launched. Launching typically means running for a user on a desktop. The details around 'launching' including who or what might do it, and how the launch action is initiated are discussed elsewhere in the FDC3 App Directory spec.", + "required": [ + "appId", + "title", + "type", + "details" + ], + "allOf": [ + { + "$ref": "#/components/schemas/BaseApplication" + }, + { + "type": "object", + "properties": { + "localizedVersions": { + "$ref": "#/components/schemas/LocalizedVersions" + } + } + } + ] + }, + "AllApplicationsResponse": { + "properties": { + "applications": { + "type": "array", + "description": "List of applications", + "items": { + "$ref": "#/components/schemas/Application" + } + }, + "message": { + "type": "string", + "description": "Response message providing status of query" + } + } + }, + "NameValuePair": { + "description": "Simple name value pair", + "properties": { + "name": { + "type": "string", + "description": "name" + }, + "value": { + "type": "string", + "description": "value" + } + } + }, + "Icon": { + "description": "Icon holder", + "properties": { + "src": { + "type": "string", + "format": "uri", + "description": "Icon URL" + }, + "size": { + "type": "string", + "description": "Icon dimension formatted as `x`" + }, + "type": { + "type": "string", + "description": "Image media type. If not present the Desktop Agent may use the src file extension" + } + }, + "required": [ + "src" + ], + "additionalProperties": false + }, + "Screenshot": { + "description": "Images representing the app in common usage scenarios", + "properties": { + "src": { + "type": "string", + "format": "uri", + "description": "App Image URL" + }, + "size": { + "type": "string", + "description": "Image dimension formatted as `x`" + }, + "type": { + "type": "string", + "description": "Image media type. If not present the Desktop Agent may use the src file extension." + }, + "label": { + "type": "string", + "description": "Optional caption for the image" + } + }, + "required": [ + "src" + ], + "additionalProperties": false + }, + "Type": { + "type": "string", + "description": "The technology type that is used to launch and run the application. Each application type implies a particular set of launch `details`.\nThe supported types include:\n\n- `web`: Web applications launched via a URL\n- `native`: Native applications pre-installed on a device and launch via a filesystem path\n- `citrix`: Apps virtualized via Citrix\n- `onlineNative`: Native apps that have an online launcher, e.g. online ClickOnce app deployments.\n- `other`: Used to represent apps that do not conform to or cannot be launched via the other types, and are likely to be defined solely by a hostManifest.\n\nFDC3 Desktop Agents MUST support at least the `web` application type and MAY support any or all of the other types.", + "enum": [ + "web", + "native", + "citrix", + "onlineNative", + "other" + ] + }, + "LaunchDetails": { + "description": "The type specific launch details of the application. These details are intended to be vendor-agnostic and MAY be duplicated or overridden by details provided in the hostManifests object for a specific host.", + "anyOf": [ + { + "$ref": "#/components/schemas/WebAppDetails" + }, + { + "$ref": "#/components/schemas/NativeAppDetails" + }, + { + "$ref": "#/components/schemas/CitrixAppDetails" + }, + { + "$ref": "#/components/schemas/OnlineNativeAppDetails" + }, + { + "$ref": "#/components/schemas/OtherAppDetails" + } + ] + }, + "WebAppDetails": { + "description": "Properties used to launch apps with `type: web`.", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Application start URL." + } + }, + "additionalProperties": false + }, + "NativeAppDetails": { + "description": "Properties used to launch apps with `type: native` that are already installed on the device.", + "required": [ + "path" + ], + "properties": { + "path": { + "type": "string", + "description": "The path on disk from which the application is launched." + }, + "arguments": { + "type": "string", + "description": "Arguments that must be passed on the command line to launch the app in the expected configuration." + } + }, + "additionalProperties": false + }, + "CitrixAppDetails": { + "description": "Properties used to launch apps virtualized apps with `type: citrix`.", + "required": [ + "alias" + ], + "properties": { + "alias": { + "type": "string", + "description": "The Citrix alias / name of the virtual app (passed to the Citrix SelfService qlaunch parameter)." + }, + "arguments": { + "type": "string", + "description": "Arguments that must be passed on the command line to launch the app in the expected configuration." + } + }, + "additionalProperties": false + }, + "OnlineNativeAppDetails": { + "description": "Properties used to launch a native apps with `type: onlineNative` that have an online launcher, e.g. online ClickOnce app deployments.", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Application URL." + } + }, + "additionalProperties": false + }, + "OtherAppDetails": { + "description": "Apps with `type: other` are defined by a hostManifest and do not require other details.", + "additionalProperties": false + }, + "HostManifests": { + "type": "object", + "description": "A mapping from host name to a host-specific application manifest object or URI from which that manifest can be retrieved. The manifest should provide details required to launch and use the application within the specified host. The manifest _MAY_ duplicate or override information provided in the `details` field.", + "additionalProperties": { + "x-additionalPropertiesName": "Host name", + "oneOf": [ + { + "type": "string", + "format": "uri" + }, + { + "$ref": "#/components/schemas/HostManifest" + } + ] + } + }, + "HostManifest": { + "type": "object", + "description": "Object containing all host specific properties." + }, + "LocalizedVersions": { + "type": "object", + "description": "Provides localized alternatives to any field of the AppD record, which may also refer to an alternative version of the application that is also localized (e.g. by providing an alternative URL). The keys to this object should be language tags as defined by IETF RFC 5646, e.g. en, en-GB or fr-FR.\n", + "additionalProperties": { + "x-additionalPropertiesName": "Language tag", + "$ref": "#/components/schemas/BaseApplication" + } + }, + "Intent": { + "description": "Definition of an intent that an app listens for", + "required": [ + "contexts" + ], + "properties": { + "displayName": { + "type": "string", + "description": "Optional display name for the intent. Deprecated in favour of the intent name, which is common amongst all apps that support it, where the display name may vary as it is defined in the app's AppD record.", + "deprecated": true + }, + "contexts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A comma separated list of the types of contexts the intent offered by the application can process, where the first part of the context type is the namespace e.g.\"fdc3.contact, org.symphony.contact\"" + }, + "resultType": { + "type": "string", + "description": "An optional type for output returned by the application, if any, when resolving this intent. May indicate a context type by type name (e.g. \"fdc3.instrument\"), a channel (e.g. \"channel\") or a combination that indicates a channel that returns a particular context type (e.g. \"channel\")." + }, + "customConfig": { + "deprecated": true, + "type": "object", + "description": "Custom configuration for the intent that may be required for a particular desktop agent. Deprecated due to a lack of defined use cases." + } + } + }, + "Interop": { + "type": "object", + "description": "Metadata that describes how the application uses FDC3 APIs. This metadata serves multiple purposes:\n\n- It supports intent resolution by a desktop agent, by declaring what intents an app listens for.\n- It may be used, for example in an app catalog UI, to find apps that 'interoperate with' other apps. \n- It provides a standard location to document how the app interacts with user channels, app channels, and intents, for use by other app developers and desktop assemblers.", + "properties": { + "intents": { + "type": "object", + "description": "Describes the app's interactions with intents.", + "properties": { + "listensFor": { + "type": "object", + "description": "A mapping of Intents names that an app listens for via `fdc3.addIntentListener()` to their configuration. \n\nUsed to support intent resolution by desktop agents. Replaces the `intents` element used in appD records prior to FDC3 2.0.", + "additionalProperties": { + "x-additionalPropertiesName": "Intent name", + "$ref": "#/components/schemas/Intent" + } + }, + "raises": { + "type": "object", + "description": "A mapping of Intent names that an app raises (via `fdc3.raiseIntent`) to an array of context type names that it may be raised with.\n\nUse the intent name \"any\" to represent use of the `fdc3.raiseIntentForContext` and `fdc3.findIntentForContext` functions, which allow the user to select from intents available for a specified context type.\n\nThis metadata is not currently used by the desktop agent, but is provided to help find apps that will interoperate with this app and to document API interactions for use by other app developers.", + "additionalProperties": { + "x-additionalPropertiesName": "Intent name", + "type": "array", + "description": "Context type names that the intent may be raised with.", + "items": { + "type": "string" + } + } + } + } + }, + "userChannels": { + "type": "object", + "description": "Describes the application's use of context types on User Channels.\n\nThis metadata is not currently used by the desktop agent, but is provided to help find apps that will interoperate with this app and to document API interactions for use by other app developers.", + "properties": { + "broadcasts": { + "type": "array", + "description": "Context type names that are broadcast by the application.", + "items": { + "type": "string" + } + }, + "listensFor": { + "type": "array", + "description": "Context type names that the application listens for.", + "items": { + "type": "string" + } + } + } + }, + "appChannels": { + "type": "array", + "description": "Describes the application's use of App Channels.\n\nThis metadata is not currently used by the desktop agent, but is provided to help find apps that will interoperate with this app and to document API interactions for use by other app developers.", + "items": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "The id of the App Channel. N.b. in FDC3 2.0 this field was incorrectly called `name`." + }, + "description": { + "type": "string", + "description": "A description of how the channel is used." + }, + "broadcasts": { + "type": "array", + "description": "Context type names that are broadcast by the application on the channel.", + "items": { + "type": "string" + } + }, + "listensFor": { + "type": "array", + "description": "Context type names that the application listens for on the channel.", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "AppImageV1": { + "description": "App Image holder", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "App Image URL" + } + } + }, + "IconV1": { + "description": "(Deprecated v1 API version) Icon holder", + "properties": { + "icon": { + "type": "string", + "format": "uri", + "description": "Icon URL" + } + } + }, + "IntentV1": { + "description": "(Deprecated v1 API version) An intent definition as defined by spec https://github.com/FDC3/Intents/blob/master/src/Intent.yaml", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the intent to 'launch'. In this case the name of an Intent supported by an application." + }, + "displayName": { + "type": "string", + "description": "An optional display name for the intent that may be used in UI instead of the name." + }, + "contexts": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A comma separated list of the types of contexts the intent offered by the application can process, where the first part of the context type is the namespace e.g.\"fdc3.contact, org.symphony.contact\"" + }, + "customConfig": { + "deprecated": true, + "type": "object", + "description": "Custom configuration for the intent that may be required for a particular desktop agent. Deprecated due to a lack of defined use cases." + } + } + }, + "ApplicationV1": { + "description": "(Deprecated v1 API version) Defines an application retrieved from an FDC3 App Directory, which can then be launched. Launching typically means running for a user on a desktop. The details around 'launching' including who or what might do it, and how the launch action is initiated are discussed elsewhere in the FDC3 App Directory spec.", + "required": [ + "appId", + "name", + "manifest", + "manifestType" + ], + "properties": { + "appId": { + "type": "string", + "description": "The unique application identifier located within a specific application directory instance." + }, + "name": { + "type": "string", + "description": "The name of the application. The name should be unique within an FDC3 App Directory instance. The exception to the uniqueness constraint is that an App Directory can hold definitions for multiple versions of the same app. The same appName could occur in other directories. We are not currently specifying app name conventions in the document." + }, + "manifest": { + "type": "string", + "description": "URI or full JSON of the application manifest providing all details related to launch and use requirements as described by the vendor. The format of this manifest is vendor specific, but can be identified by the manifestType attribute." + }, + "manifestType": { + "type": "string", + "description": "The manifest type which relates to the format and structure of the manifest content. The definition is based on the vendor specific format and definition outside of this specification." + }, + "version": { + "type": "string", + "description": "Version of the application. This allows multiple app versions to be defined using the same app name. This can be a triplet but can also include things like 1.2.5 (BETA)" + }, + "title": { + "type": "string", + "description": "Optional title for the application, if missing use appName, typically used in a launcher UI." + }, + "tooltip": { + "type": "string", + "description": "Optional tooltip description e.g. for a launcher" + }, + "description": { + "type": "string", + "description": "Description of the application. This will typically be a 1-2 paragraph style blurb about the application. Allow mark up language" + }, + "images": { + "type": "array", + "description": "Array of images to show the user when they are looking at app description. Each image can have an optional description/tooltip", + "items": { + "$ref": "#/components/schemas/AppImageV1" + } + }, + "contactEmail": { + "type": "string", + "format": "email", + "description": "Optional e-mail to receive queries about the application" + }, + "supportEmail": { + "type": "string", + "format": "email", + "description": "Optional e-mail to receive support requests for the application" + }, + "publisher": { + "type": "string", + "description": "The name of the company that owns the application. The publisher has control over their namespace/app/signature." + }, + "icons": { + "type": "array", + "description": "Holds Icons used for the application, a Launcher may be able to use multiple Icon sizes or there may be a 'button' Icon", + "items": { + "$ref": "#/components/schemas/IconV1" + } + }, + "customConfig": { + "deprecated": true, + "type": "array", + "description": "An optional set of name value pairs that can be used to deliver custom data from an App Directory to a launcher.", + "items": { + "$ref": "#/components/schemas/NameValuePair" + } + }, + "intents": { + "type": "array", + "description": "The list of intents implemented by the application as defined by https://github.com/FDC3/Intents/blob/master/src/Intent.yaml", + "items": { + "$ref": "#/components/schemas/IntentV1" + } + } + } + }, + "ApplicationSearchResponseV1": { + "properties": { + "applications": { + "type": "array", + "description": "List of applications", + "items": { + "$ref": "#/components/schemas/ApplicationV1" + } + }, + "message": { + "type": "string", + "description": "Response message providing status of query" + } + } + } + }, + "examples": { + "FDC3WorkbenchAppDefinition": { + "value": { + "appId": "fdc3-workbench", + "title": "FDC3 Workbench", + "description": "Development and test tool for FDC3 desktop agents and apps", + "categories": [ + "developer tools", + "training" + ], + "version": "1.0.0", + "tooltip": "FDC3 Workbench", + "lang": "en-US", + "icons": [ + { + "src": "https://fdc3.finos.org/toolbox/fdc3-workbench/fdc3-icon-256.png" + } + ], + "screenshots": [ + { + "src": "https://fdc3.finos.org/docs/assets/fdc3-logo.png", + "label": "FDC3 logo" + } + ], + "contactEmail": "fdc3@finos.org", + "supportEmail": "fdc3-maintainers@finos.org", + "moreInfo": "https://fdc3.finos.org", + "publisher": "FDC3", + "type": "web", + "details": { + "url": "https://fdc3.finos.org/toolbox/fdc3-workbench/" + }, + "hostManifests": { + "Glue42": { + "type": "window", + "icon": "https://fdc3.finos.org/docs/assets/fdc3-logo.png", + "details": { + "height": 640, + "width": 560, + "left": 120, + "top": 120, + "mode": "tab", + "allowChannels": true, + "loader": { + "enabled": true, + "hideOnLoad": true + } + }, + "customProperties": { + "folder": "FDC3 Toolbox" + } + }, + "Finsemble": { + "window": { + "left": 120, + "top": 120, + "width": 800, + "height": 750, + "options": { + "minWidth": 75 + } + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": true + }, + "Toolbar": { + "iconURL": "http://fdc3.finos.org/toolbox/fdc3-workbench/fdc3-icon-256.png" + }, + "Window Manager": { + "FSBLHeader": true, + "persistWindowState": true + } + } + }, + "interop": { + "autoConnect": true + } + }, + "Web App Manifest": "https://example.com/fdc3-workbench.json" + }, + "localizedVersions": { + "fr-FR": { + "title": "FDC3 Table de travail", + "description": "Outil de développement et de test pour les desktop agents et applications FDC3" + } + } + }, + "summary": "A sample app definition for the FDC3 Workbench" + }, + "MyAppDefinition": { + "value": { + "appId": "my-application", + "title": "My Application", + "description": "An example application that uses FDC3 and fully describes itself in an AppD record.", + "categories": [ + "market data", + "research", + "news" + ], + "version": "1.0.0", + "tooltip": "My example application definition", + "lang": "en-US", + "icons": [ + { + "src": "http://example.domain.com/assets/my-app-icon.png", + "size": "256x256", + "type": "image/png" + } + ], + "screenshots": [ + { + "src": "http://example.domain.com/assets/my-app-screenshot-1.png", + "label": "The first screenshot of my example app", + "type": "image/png", + "size": "800x600" + }, + { + "src": "http://example.domain.com/assets/my-app-screenshot-2.png", + "label": "The second screenshot of my example app", + "type": "image/png", + "size": "800x600" + } + ], + "contactEmail": "fdc3@finos.org", + "supportEmail": "fdc3-maintainers@finos.org", + "moreInfo": "http://example.domain.com/", + "publisher": "Example App, Inc.", + "type": "web", + "details": { + "url": "http://example.domain.com/app.html" + }, + "hostManifests": { + "Finsemble": { + "window": { + "left": 120, + "top": 120, + "width": 600, + "height": 800, + "options": { + "minWidth": 75 + } + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": true + }, + "Window Manager": { + "FSBLHeader": true, + "persistWindowState": true + } + } + }, + "interop": { + "autoConnect": true + } + }, + "Glue42": { + "type": "window", + "details": { + "height": 800, + "width": 600, + "left": 120, + "top": 120, + "mode": "tab", + "allowChannels": true, + "loader": { + "enabled": true, + "hideOnLoad": true + } + }, + "customProperties": { + "folder": "FDC3 Toolbox" + } + }, + "Web App Manifest": "http://example.domain.com/my-app.json" + }, + "interop": { + "intents": { + "listensFor": { + "ViewChart": { + "contexts": [ + "fdc3.instrument" + ] + }, + "myApp.GetPrice": { + "contexts": [ + "fdc3.instrument" + ], + "resultType": "myApp.quote" + } + }, + "raises": { + "ViewOrders": [ + "fdc3.instrument", + "fdc3.organization" + ], + "StartEmail": [ + "fdc3.email" + ] + } + }, + "userChannels": { + "broadcasts": [ + "fdc3.instrument", + "fdc3.organization" + ], + "listensFor": [ + "fdc3.instrument", + "fdc3.organization" + ] + }, + "appChannels": [ + { + "id": "myApp.quotes,", + "description": "Used to share a stream of quotes for currently displayed instrument and may be used to change the currently displayed symbol,", + "broadcasts": [ + "myApp.quote" + ], + "listensFor": [ + "fdc3.instrument" + ] + } + ] + }, + "localizedVersions": { + "fr-FR": { + "title": "Mon application,", + "description": "Un exemple d'application qui utilise FDC3 et se décrit entièrement dans un enregistrement AppD." + } + } + }, + "summary": "A sample app definition that describes the app's use of interop." + }, + "AllAppsResponse": { + "value": { + "applications": [ + { + "appId": "my-application", + "title": "My Application", + "description": "An example application that uses FDC3 and fully describes itself in an AppD record.", + "categories": [ + "market data", + "research", + "news" + ], + "version": "1.0.0", + "tooltip": "My example application definition", + "lang": "en-US", + "icons": [ + { + "src": "http://example.domain.com/assets/my-app-icon.png", + "size": "256x256", + "type": "image/png" + } + ], + "screenshots": [ + { + "src": "http://example.domain.com/assets/my-app-screenshot-1.png", + "label": "The first screenshot of my example app", + "type": "image/png", + "size": "800x600" + }, + { + "src": "http://example.domain.com/assets/my-app-screenshot-2.png", + "label": "The second screenshot of my example app", + "type": "image/png", + "size": "800x600" + } + ], + "contactEmail": "fdc3@finos.org", + "supportEmail": "fdc3-maintainers@finos.org", + "moreInfo": "http://example.domain.com/", + "publisher": "Example App, Inc.", + "type": "web", + "details": { + "url": "http://example.domain.com/app.html" + }, + "hostManifests": { + "Finsemble": { + "window": { + "left": 120, + "top": 120, + "width": 600, + "height": 800, + "options": { + "minWidth": 75 + } + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": true + }, + "Window Manager": { + "FSBLHeader": true, + "persistWindowState": true + } + } + }, + "interop": { + "autoConnect": true + } + }, + "Glue42": { + "type": "window", + "details": { + "height": 800, + "width": 600, + "left": 120, + "top": 120, + "mode": "tab", + "allowChannels": true, + "loader": { + "enabled": true, + "hideOnLoad": true + } + }, + "customProperties": { + "folder": "FDC3 Toolbox" + } + }, + "Web App Manifest": "http://example.domain.com/my-app.json" + }, + "interop": { + "intents": { + "listensFor": { + "ViewChart": { + "contexts": [ + "fdc3.instrument" + ] + }, + "myApp.GetPrice": { + "contexts": [ + "fdc3.instrument" + ], + "resultType": "myApp.quote" + } + }, + "raises": { + "ViewOrders": [ + "fdc3.instrument", + "fdc3.organization" + ], + "StartEmail": [ + "fdc3.email" + ] + } + }, + "userChannels": { + "broadcasts": [ + "fdc3.instrument", + "fdc3.organization" + ], + "listensFor": [ + "fdc3.instrument", + "fdc3.organization" + ] + }, + "appChannels": [ + { + "id": "myApp.quotes,", + "description": "Used to share a stream of quotes for currently displayed instrument and may be used to change the currently displayed symbol,", + "broadcasts": [ + "myApp.quote" + ], + "listensFor": [ + "fdc3.instrument" + ] + } + ] + }, + "localizedVersions": { + "fr-FR": { + "title": "Mon application,", + "description": "Un exemple d'application qui utilise FDC3 et se décrit entièrement dans un enregistrement AppD." + } + } + }, + { + "appId": "fdc3-workbench", + "title": "FDC3 Workbench", + "description": "Development and test tool for FDC3 desktop agents and apps", + "categories": [ + "developer tools", + "training" + ], + "version": "1.0.0", + "tooltip": "FDC3 Workbench", + "lang": "en-US", + "icons": [ + { + "src": "https://fdc3.finos.org/toolbox/fdc3-workbench/fdc3-icon-256.png" + } + ], + "screenshots": [ + { + "src": "https://fdc3.finos.org/docs/assets/fdc3-logo.png,", + "label": "FDC3 logo" + } + ], + "contactEmail": "fdc3@finos.org", + "supportEmail": "fdc3-maintainers@finos.org", + "publisher": "FDC3,", + "type": "web", + "details": { + "url": "https://fdc3.finos.org/toolbox/fdc3-workbench/" + }, + "hostManifests": { + "Glue42": { + "type": "window", + "icon": "https://fdc3.finos.org/docs/assets/fdc3-logo.png", + "details": { + "height": 640, + "width": 560, + "left": 120, + "top": 120, + "mode": "tab", + "allowChannels": true, + "loader": { + "enabled": true, + "hideOnLoad": true + } + }, + "customProperties": { + "folder": "FDC3 Toolbox" + } + }, + "Finsemble": { + "window": { + "left": 120, + "top": 120, + "width": 800, + "height": 750, + "options": { + "minWidth": 75 + } + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": true + }, + "Toolbar": { + "iconURL": "http://fdc3.finos.org/toolbox/fdc3-workbench/fdc3-icon-256.png" + }, + "Window Manager": { + "FSBLHeader": true, + "persistWindowState": true + } + } + }, + "interop": { + "autoConnect": true + } + }, + "Web App Manifest": "https://example.com/fdc3-workbench.json" + }, + "localizedVersions": { + "fr-FR": { + "title": "FDC3 Table de travail", + "description": "Outil de développement et de test pour les desktop agents et applications FDC3" + } + } + } + ], + "message": "OK" + }, + "summary": "A sample 'all applications' listing response" + }, + "Error400Example": { + "value": { + "code": 400, + "message": "There was an error in your request." + }, + "summary": "A sample Bad Request error." + }, + "Error403Example": { + "value": { + "code": 403, + "message": "Certificate authentication failed for the requested user." + }, + "summary": "A sample Forbidden error." + }, + "Error500Example": { + "value": { + "code": 500, + "message": "An internal server error occurred. See the response body for further details." + }, + "summary": "A sample Server error." + } + } + } + } \ No newline at end of file diff --git a/website/static/schemas/next/bridging/agentRequest.schema.json b/website/static/schemas/next/bridging/agentRequest.schema.json index d88e78639..bf11e36f4 100644 --- a/website/static/schemas/next/bridging/agentRequest.schema.json +++ b/website/static/schemas/next/bridging/agentRequest.schema.json @@ -56,7 +56,7 @@ "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "common.schema.json#/$defs/Destination" + "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" } }, "required": ["requestUuid", "timestamp"], diff --git a/website/static/schemas/next/bridging/agentResponse.schema.json b/website/static/schemas/next/bridging/agentResponse.schema.json index b25fe59bf..8c795b59e 100644 --- a/website/static/schemas/next/bridging/agentResponse.schema.json +++ b/website/static/schemas/next/bridging/agentResponse.schema.json @@ -44,14 +44,9 @@ }, "timestamp": { "$ref": "common.schema.json#/$defs/Timestamp" - }, - "source": { - "title": "Response Source identifier", - "description": "Field that represents the source application instance that the response was produced by, or the Desktop Agent if it produced the response without an application.", - "$ref": "common.schema.json#/$defs/ResponseSource" } }, - "required": ["requestUuid", "responseUuid", "timestamp", "source"], + "required": ["requestUuid", "responseUuid", "timestamp"], "additionalProperties": false } } diff --git a/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json index 6f1a7c3ea..bd6fd15c0 100644 --- a/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json +++ b/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json @@ -42,10 +42,10 @@ "$ref": "common.schema.json#/$defs/Timestamp" }, "errorSources": { - "$ref": "common.schema.json#/$defs/ResponseErrorSources" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorSources" }, "errorDetails": { - "$ref": "common.schema.json#/$defs/ResponseErrorDetails" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorDetails" } }, "required": ["requestUuid", "responseUuid", "timestamp", "errorSources", "errorDetails"], diff --git a/website/static/schemas/next/bridging/bridgeRequest.schema.json b/website/static/schemas/next/bridging/bridgeRequest.schema.json index 6fc223518..27d50f8d8 100644 --- a/website/static/schemas/next/bridging/bridgeRequest.schema.json +++ b/website/static/schemas/next/bridging/bridgeRequest.schema.json @@ -34,14 +34,14 @@ "$ref": "common.schema.json#/$defs/Timestamp" }, "source": { - "title": "Source identifier", - "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "$ref": "common.schema.json#/$defs/BridgeRequestSource" + "title": "Bridge Source identifier", + "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST be set by the bridge.", + "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" }, "destination": { "title": "Destination identifier", "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "common.schema.json#/$defs/Destination" + "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" } }, "required": ["requestUuid", "timestamp", "source"], diff --git a/website/static/schemas/next/bridging/bridgeResponse.schema.json b/website/static/schemas/next/bridging/bridgeResponse.schema.json index 67823287d..0e3a23bdf 100644 --- a/website/static/schemas/next/bridging/bridgeResponse.schema.json +++ b/website/static/schemas/next/bridging/bridgeResponse.schema.json @@ -37,13 +37,13 @@ "$ref": "common.schema.json#/$defs/Timestamp" }, "sources": { - "$ref": "common.schema.json#/$defs/ResponseSources" + "$ref": "common.schema.json#/$defs/BridgeResponseSources" }, "errorSources": { - "$ref": "common.schema.json#/$defs/ResponseErrorSources" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorSources" }, "errorDetails": { - "$ref": "common.schema.json#/$defs/ResponseErrorDetails" + "$ref": "common.schema.json#/$defs/BridgeResponseErrorDetails" } }, "required": ["requestUuid", "responseUuid", "timestamp"], diff --git a/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json b/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json index a8f1e1e06..64457d5e1 100644 --- a/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json @@ -46,7 +46,7 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "required": ["source"], diff --git a/website/static/schemas/next/bridging/common.schema.json b/website/static/schemas/next/bridging/common.schema.json index 7efc0ba31..31e4ccebf 100644 --- a/website/static/schemas/next/bridging/common.schema.json +++ b/website/static/schemas/next/bridging/common.schema.json @@ -5,27 +5,6 @@ "type": "object", "description": "Common elements referenced by other schemas", "$defs": { - "AgentRequestMeta": { - "title": "Agent Request Metadata", - "description": "Metadata for a request message sent by Desktop Agents to the Bridge.", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "#/$defs/RequestUuid" - }, - "timestamp": { - "$ref": "#/$defs/Timestamp" - }, - "source": { - "$ref": "#/$defs/Source" - }, - "destination": { - "$ref": "#/$defs/Destination" - } - }, - "required": ["requestUuid", "timestamp"], - "additionalProperties": false - }, "RequestUuid": { "title": "Request UUID", "type": "string", @@ -54,49 +33,48 @@ } ] }, - "ResponseSource": { - "title": "Source identifier", - "description": "Field that represents the source Desktop Agent that a response was received from.", + "AppRequestSource": { + "title": "App Source identifier", + "description": "Field that represents the source application that a request or response was received from.", + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + }, + "AgentDestination": { + "title": "Agent Destination identifier", + "description": "Field that represents a destination Desktop Agent that a request is to be sent to.", "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, - "BridgeRequestSource": { - "title": "Bridge Source identifier", - "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", - "oneOf": [ + "AppDestination": { + "title": "App Destination identifier", + "description": "Field that represents a destination App on a remote Desktop Agent that a request is to be sent to.", + "allOf": [ { "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, { - "allOf": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - ] + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" } ] }, "BridgeParticipantIdentifier": { "title": "Bridge Participant Identifier", - "description": "Represents Identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", - "type": "object", + "description": "Represents identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", "oneOf": [ { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" }, { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "allOf": [ + { + "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + }, + { + "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + } + ] } ] }, - "Destination": { - "title": "Destination identifier", - "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "#/$defs/BridgeParticipantIdentifier" - }, - "ResponseSources": { + "BridgeResponseSources": { "title": "Desktop Agents that responded", "type": "array", "items": [ @@ -106,7 +84,7 @@ ], "description": "Array of DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." }, - "ResponseErrorSources": { + "BridgeResponseErrorSources": { "title": "Desktop Agents that errored", "type": "array", "items": [ @@ -125,7 +103,7 @@ { "$ref": "../api/api.schema.json#/definitions/BridgingError" } ] }, - "ResponseErrorDetails": { + "BridgeResponseErrorDetails": { "title": "Response Error Details", "type": "array", "items": { diff --git a/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json b/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json index f4cd4ba54..cf9bc12cb 100644 --- a/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json @@ -39,10 +39,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "$ref": "common.schema.json#/$defs/AgentDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json index ce93447db..efa536276 100644 --- a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json", - "title": "FindIntents Agent Request", + "title": "FindIntent Agent Request", "type": "object", "allOf": [ { @@ -34,7 +34,7 @@ "$ref": "../context/context.schema.json" } }, - "required": ["intent", "context"], + "required": ["intent"], "additionalProperties": false }, "meta": { diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json index 9b191234c..9f1bacf86 100644 --- a/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json @@ -39,7 +39,7 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json index 6f313c27c..6a6fd59ec 100644 --- a/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json @@ -26,7 +26,7 @@ "type": "object", "properties": { "app": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "required": ["app"], @@ -39,10 +39,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "$ref": "common.schema.json#/$defs/AgentDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/RequestSource" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/openAgentRequest.schema.json b/website/static/schemas/next/bridging/openAgentRequest.schema.json index 2e2fcc9c5..3b20d30e6 100644 --- a/website/static/schemas/next/bridging/openAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/openAgentRequest.schema.json @@ -51,10 +51,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" + "$ref": "common.schema.json#/$defs/AgentDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "required": ["source"], diff --git a/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json index fb36fa38d..16c4ca25e 100644 --- a/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json @@ -46,10 +46,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json index 4a212b3d0..34b0403fb 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json index 4a0ffedd1..a139c2d74 100644 --- a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json index b73b53a26..61d50d82a 100644 --- a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json @@ -15,7 +15,7 @@ "PrivateChannelOnAddContextListenerRequestBase": { "title": "PrivateChannelOnAddContextListener Request", "type": "object", - "description": "A request to forward on an AddCOntextListener event, relating to a PrivateChannel", + "description": "A request to forward on an AddContextListener event, relating to a PrivateChannel", "properties": { "type": { "title": "Private Channel OnAddContextListener Message type", @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json index dda363660..d65b03e08 100644 --- a/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json @@ -39,10 +39,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json index 45c9b178a..b760da6a6 100644 --- a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json @@ -42,10 +42,10 @@ "requestUuid": true, "timestamp": true, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" }, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "unevaluatedProperties": false diff --git a/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json index a4bf1f4e9..4a9921859 100644 --- a/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json +++ b/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json @@ -32,7 +32,7 @@ "$ref": "../context/context.schema.json" }, "app": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" } }, "required": ["intent", "context", "app"], @@ -45,10 +45,10 @@ "requestUuid": true, "timestamp": true, "destination": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppDestination" }, "source": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" + "$ref": "common.schema.json#/$defs/AppRequestSource" } }, "unevaluatedProperties": false, diff --git a/website/static/schemas/next/context/action.schema.json b/website/static/schemas/next/context/action.schema.json index 553631232..388eb5073 100644 --- a/website/static/schemas/next/context/action.schema.json +++ b/website/static/schemas/next/context/action.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/action.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/action.schema.json", "type": "object", "title": "Action", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/context/chatMessage.schema.json b/website/static/schemas/next/context/chatMessage.schema.json index 72171d832..be443e915 100644 --- a/website/static/schemas/next/context/chatMessage.schema.json +++ b/website/static/schemas/next/context/chatMessage.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatMessage.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatMessage.schema.json", "type": "object", "title": "ChatMessage", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/context/chatRoom.schema.json b/website/static/schemas/next/context/chatRoom.schema.json index a5a430a6b..d0cd00664 100644 --- a/website/static/schemas/next/context/chatRoom.schema.json +++ b/website/static/schemas/next/context/chatRoom.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatRoom.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatRoom.schema.json", "type": "object", "title": "ChatRoom", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/context/chatSearchCriteria.schema.json b/website/static/schemas/next/context/chatSearchCriteria.schema.json index 932418859..95cdf90d7 100644 --- a/website/static/schemas/next/context/chatSearchCriteria.schema.json +++ b/website/static/schemas/next/context/chatSearchCriteria.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/chatSearchCriteria.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/chatSearchCriteria.schema.json", "type": "object", "title": "ChatSearchCriteria", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/context/interaction.schema.json b/website/static/schemas/next/context/interaction.schema.json index ed32dfbc0..b5ed532d3 100644 --- a/website/static/schemas/next/context/interaction.schema.json +++ b/website/static/schemas/next/context/interaction.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/interaction.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/interaction.schema.json", "type": "object", "title": "Interaction", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/context/message.schema.json b/website/static/schemas/next/context/message.schema.json index 05d44205d..9f69e5b3f 100644 --- a/website/static/schemas/next/context/message.schema.json +++ b/website/static/schemas/next/context/message.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/message.schema.json", + "$id": "https://fdc3.finos.org/schemas/context/message.schema.json", "type": "object", "title": "Message", "allOf": [{ "$ref": "context.schema.json#" }], diff --git a/website/static/schemas/next/context/transactionresult.schema.json b/website/static/schemas/next/context/transactionresult.schema.json index a2db6370d..11370018e 100644 --- a/website/static/schemas/next/context/transactionresult.schema.json +++ b/website/static/schemas/next/context/transactionresult.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/transactionresult.schema.json", + "$id": "https://fdc3.finos.org/schemas/next/context/transactionresult.schema.json", "type": "object", "title": "TransactionResult", "allOf": [{ "$ref": "context.schema.json#" }], From 870f542d16210fa93ccbae8cc0de0055122fbd3f Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 18:26:30 +0100 Subject: [PATCH 103/106] Fixing minor issue in raiseIntentResult bridging schema so that it can support void results --- docs/agent-bridging/ref/raiseIntent.md | 22 +++++++++++-------- ...raiseIntentResultAgentResponse.schema.json | 8 ++++++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/agent-bridging/ref/raiseIntent.md b/docs/agent-bridging/ref/raiseIntent.md index 164bbc2f3..441c0b3f0 100644 --- a/docs/agent-bridging/ref/raiseIntent.md +++ b/docs/agent-bridging/ref/raiseIntent.md @@ -13,7 +13,7 @@ Desktop Agent bridging message exchange for a `raiseIntent` API call on the [`De For Desktop Agent Bridging, a `raiseIntent` message exchange MUST always pass an `app: AppIdentifier` argument to target the intent. Further, if no `instanceId` is set in the `AppIdentifier`, then it should be interpreted to mean *'spawn a new instance of the target application'*. A local FDC3 API implementation call would normally defer to a resolver UI or similar if there are multiple options for resolving a specified `appId` (i.e. existing instance(s) and the option spawning a new instance), whereas this message exchange assumes that resolution has already taken place on the source Desktop Agent. -Hence, if a target [`AppIdentifier`](/api/ref/Types#appidentifier) is not passed in the original `DesktopAgent` API call, then the [`findIntent`](findIntent) message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. +Hence, if a target [`AppIdentifier`](../../api/ref/Types#appidentifier) is not passed in the original `DesktopAgent` API call, then the [`findIntent`](findIntent) message exchange should be used to collect options for the local resolver to use. Once an option has been selected (for example because there is only one option, or because the user selected an option in a local intent resolver UI), the `raiseIntent` message exchange may then be used (if a remote option was selected as the resolution) to raise the intent. :::info @@ -222,20 +222,24 @@ The bridge will fill in the `intentResolution.source.DesktopAgent` & `source.des } ``` -When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that it's finished running and to pass any `IntentResult` onto the raising application (setting either `payload.context` or `payload.channel` to indicate the type of the `IntentResult`). There is no need to provide a `source` field in this response as the source information was already provided in the `raiseIntentResponse` message preceding it. +When `Slack` produces an `IntentResult` from its `IntentHandler`, or the intent handler finishes running without returning a result, it should send a further `raiseIntentResultResponse` message to indicate that it's finished running and to pass any `IntentResult` onto the raising application (setting either `payload.intentResult.context` or `payload.intentResult.channel` to indicate the type of the `IntentResult`, or leaving `payload.intentResult` empty to indicate a `void` result). There is no need to provide a `source` field in this response as the source information was already provided in the `raiseIntentResponse` message preceding it. ```json // agent-B -> DAB { "type": "raiseIntentResultResponse", "payload": { - "context": {/*contextObj*/} - /* for a channel IntentResult use: - "channel": { - "id": "app-channel xyz", - "type": "user" - } - */ + "intentResult": { + "context": {/*contextObj*/} + /* for a channel IntentResult use: + "channel": { + "id": "app-channel xyz", + "type": "user" + } + + or for a void result use leave this object empty. + */ + }, "meta": { "requestUuid": "", diff --git a/schemas/bridging/raiseIntentResultAgentResponse.schema.json b/schemas/bridging/raiseIntentResultAgentResponse.schema.json index 4768d58f5..e5b8b36c7 100644 --- a/schemas/bridging/raiseIntentResultAgentResponse.schema.json +++ b/schemas/bridging/raiseIntentResultAgentResponse.schema.json @@ -27,7 +27,7 @@ "properties": { "intentResult": { "title": "IntentResult", - "oneOf": [ + "anyOf": [ { "type": "object", "title": "IntentResult Context", @@ -49,6 +49,12 @@ }, "required": ["channel"], "additionalProperties": false + }, + { + "type": "object", + "title": "IntentResult Void", + "properties": {}, + "additionalProperties": false } ] } From 6160f53decca45fa87d105b46ee11a1e2d0773e8 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 18:27:00 +0100 Subject: [PATCH 104/106] Fixing broken links in a few docs --- docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md | 2 +- docs/api/ref/Channel.md | 2 +- docs/context/ref/TransactionResult.md | 2 +- website/versioned_docs/version-2.0/api/ref/Channel.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md index 12dfae6bd..ac1da9de5 100644 --- a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md +++ b/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md @@ -43,7 +43,7 @@ sequenceDiagram ### Request message schemas -- [https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequestschema.json](/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequestschema.schema.json) +- [https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json](/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json) - [https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json](/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json) ### Example diff --git a/docs/api/ref/Channel.md b/docs/api/ref/Channel.md index 9e5d91a9b..0bd65aefb 100644 --- a/docs/api/ref/Channel.md +++ b/docs/api/ref/Channel.md @@ -8,7 +8,7 @@ hide_title: true Represents a context channel that applications can join to share context data and provides functions for interacting with it. -A channel can be either a ["User" channel](../api/spec#joining-user-channels) (retrieved with [`getUserChannels`](DesktopAgent#getuserchannels)), a custom ["App" channel](../api/spec#app-channels) (obtained through [`getOrCreateChannel`](DesktopAgent#getorcreatechannel)) or a ["Private" channel](../api/spec#private-channels) (obtained via an intent result). +A channel can be either a ["User" channel](../spec#joining-user-channels) (retrieved with [`getUserChannels`](DesktopAgent#getuserchannels)), a custom ["App" channel](../spec#app-channels) (obtained through [`getOrCreateChannel`](DesktopAgent#getorcreatechannel)) or a ["Private" channel](../spec#private-channels) (obtained via an intent result). :::note diff --git a/docs/context/ref/TransactionResult.md b/docs/context/ref/TransactionResult.md index 9cb1328d7..dbd0fd83f 100644 --- a/docs/context/ref/TransactionResult.md +++ b/docs/context/ref/TransactionResult.md @@ -6,7 +6,7 @@ hide_title: true --- # `TransactionResult` -A context type representing the result of a transaction initiated via FDC3, which SHOULD be returned as an [`IntentResult`](../../api/Types#intentresult) by intents that create, retrieve, update or delete content or records in another application. Its purpose is to provide a status and message (where needed) for the transaction and MAY wrap a returned context object. +A context type representing the result of a transaction initiated via FDC3, which SHOULD be returned as an [`IntentResult`](../../api/ref/Types#intentresult) by intents that create, retrieve, update or delete content or records in another application. Its purpose is to provide a status and message (where needed) for the transaction and MAY wrap a returned context object. ## Type diff --git a/website/versioned_docs/version-2.0/api/ref/Channel.md b/website/versioned_docs/version-2.0/api/ref/Channel.md index b19b937df..529107ec4 100644 --- a/website/versioned_docs/version-2.0/api/ref/Channel.md +++ b/website/versioned_docs/version-2.0/api/ref/Channel.md @@ -8,7 +8,7 @@ original_id: Channel Represents a context channel that applications can use to send and receive context data. -A channel can be either a ["User" channel](../api/spec#joining-user-channels) (retrieved with [`getUserChannels`](DesktopAgent#getuserchannels)), a custom ["App" channel](../api/spec#app-channels) (obtained through [`getOrCreateChannel`](DesktopAgent#getorcreatechannel)) or a ["Private" channel](../api/spec#private-channels) (obtained via an intent result). +A channel can be either a ["User" channel](../spec#joining-user-channels) (retrieved with [`getUserChannels`](DesktopAgent#getuserchannels)), a custom ["App" channel](../spec#app-channels) (obtained through [`getOrCreateChannel`](DesktopAgent#getorcreatechannel)) or a ["Private" channel](../spec#private-channels) (obtained via an intent result). :::note From cd425434601b79b58bb76a38c49408d372252ba1 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 18:29:56 +0100 Subject: [PATCH 105/106] npm audit fixes --- package-lock.json | 42 ++++++++++++------------ toolbox/fdc3-workbench/package-lock.json | 30 ++++++++--------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68ab1a02a..d5369b24f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2687,9 +2687,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4981,9 +4981,9 @@ } }, "node_modules/eslint/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -8582,9 +8582,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -10543,9 +10543,9 @@ } }, "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -10610,9 +10610,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -12042,9 +12042,9 @@ } }, "node_modules/tsdx/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -12085,9 +12085,9 @@ } }, "node_modules/tsdx/node_modules/ts-jest/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" diff --git a/toolbox/fdc3-workbench/package-lock.json b/toolbox/fdc3-workbench/package-lock.json index dd1c9cebb..0dc9f969b 100644 --- a/toolbox/fdc3-workbench/package-lock.json +++ b/toolbox/fdc3-workbench/package-lock.json @@ -123,9 +123,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -166,9 +166,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2501,9 +2501,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2568,9 +2568,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5178,9 +5178,9 @@ } }, "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" From 682d2879bf3ff8925c1caaf9d6c6ea7c5c570e32 Mon Sep 17 00:00:00 2001 From: Kris West Date: Wed, 26 Jul 2023 18:34:17 +0100 Subject: [PATCH 106/106] Regenerating bridging types --- src/bridging/BridgingTypes.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts index 95ce4c7af..4a29b5eb2 100644 --- a/src/bridging/BridgingTypes.ts +++ b/src/bridging/BridgingTypes.ts @@ -247,7 +247,7 @@ export interface AgentRequestMetadata { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a * specific app or instance. * * Field that represents the source application that the request was received from, or the @@ -710,7 +710,7 @@ export interface BroadcastBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a * specific app or instance. * * Field that represents the source application that the request was received from, or the @@ -1163,7 +1163,7 @@ export interface FindInstancesAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a * specific app or instance. * * Field that represents the source application that the request was received from, or the @@ -2324,7 +2324,7 @@ export interface GetAppMetadataBridgeRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a * specific app or instance. * * Field that represents the source application that the request was received from, or the @@ -2805,7 +2805,7 @@ export interface PrivateChannelBroadcastAgentRequestMeta { * be set by the Desktop Agent for API calls that include a target app parameter and must * include the name of the Desktop Agent hosting the target application. * - * Represents Identifiers that MUST include the Desktop Agent name and MAY identify a + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a * specific app or instance. * * Field that represents the source application that the request was received from, or the @@ -3083,7 +3083,7 @@ export interface PrivateChannelEventListenerRemovedBridgeRequestPayload { } /** - * A request to forward on an AddCOntextListener event, relating to a PrivateChannel + * A request to forward on an AddContextListener event, relating to a PrivateChannel * * A request message from a Desktop Agent to the Bridge. */ @@ -3128,7 +3128,7 @@ export interface PrivateChannelOnAddContextListenerAgentRequestPayload { } /** - * A request to forward on an AddCOntextListener event, relating to a PrivateChannel + * A request to forward on an AddContextListener event, relating to a PrivateChannel * * A request message forwarded from the Bridge onto a Desktop Agent connected to it. */