blob: 61296efd8f117803659940b8e02f49aab9f1d2ae [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.modular;
using fuchsia.mem;
struct Proposal {
// Identifies a proposal, namespaced internally to the proposing component and
// proposal channel (Query or Next/Interruption).
string id;
// A client-assigned name for the story to which the actions in |on_selected|
// apply. If a story with the given name already exists (ie, because a past
// Proposal with the same |story_name| was executed), the actions in
// |on_selected| will apply to the existing story. Otherwise, a new story is
// created.
// If |story_name| is null, a new story is always created.
// This name is namespaced to the agent that submitted the proposal.
string? story_name;
// If set to true, this proposal will only show up when |story_id| is in the
// foreground.
bool story_affinity;
// The list of actions to take when the user selects the associated
// Suggestion.
vector<Action> on_selected;
// An optional hint about the probability that this proposal would be chosen
// if it were the only proposal presented to the user. A confidence of 0.0
// indicates no hint. The confidence assigned by the system may be subject to
// other considerations such as performance metrics.
float32 confidence = 0.0;
// True iff the proposal would like to make use of a rich suggestion. Only
// certain components are allowed to use rich suggestions.
bool wants_rich_suggestion = false;
SuggestionDisplay display;
// A listener interface that is notified when the proposal is accepted by
// the system.
// The listener is currently notified once when a proposal is accepted. Thus the
// |story_id| provided will be of the first create story action in |on_selected|,
// and subsequent create story actions will not notify the listener.
ProposalListener? listener;
// An interface that allows Proposal creators to be notified when a proposal
// is accepted by the system.
interface ProposalListener {
// Indicates that a proposal was accepted by the system.
// |proposal_id| The identifier of the accepted proposal.
// |story_id| The identifier of the created story, if a story was created.
1: OnProposalAccepted(string proposal_id, string? story_id);
union Action {
FocusStory focus_story;
FocusModule focus_module;
AddModule add_module;
UpdateModule update_module;
SetLinkValueAction set_link_value_action;
CustomAction custom_action;
// Brings an existing story into focus.
struct FocusStory {
// Struct can't be empty. This field is ignored.
bool hack;
// Brings an existing module into focus.
struct FocusModule {
// The module path of the existing module.
vector<string> module_path;
// Adds a module from an Intent to an existing story.
struct AddModule {
// The name of the module that will be added as a result of this proposal. A
// proposal for the same |story_id|, |module_name| and
// |surface_parent_module_path| from the same Agent will result in replacing
// the module at |module_name|, not adding a new one.
string module_name;
// The Intent that is to be added to the story.
Intent intent;
// The relation, relative to |surface_parent_module_path| to use. This
// information is passed to the story shell for visual module composition.
SurfaceRelation surface_relation;
// The module path of an existing module to assign as the surface-relationship
// parent of this new module.
vector<string> surface_parent_module_path;
struct SetLinkValueAction {
// Identifies the link within the story.
LinkPath link_path;
// The bytes that will be written to the link.
// If empty, unsets the link value.
fuchsia.mem.Buffer? value;
struct UpdateModule {
vector<string> module_name;
// For every entry |p| in |parameters|, update the value of the link
// backing || to that specified in ||.
vector<IntentParameter> parameters;
// An action that calls back to the proposal publisher to be performed.
interface CustomAction {
1: Execute();