// Copyright 2017 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.speech;
using fuchsia.sys;

interface UserIntelligenceProvider {
    // Creates an |IntelligenceServices| scoped to a specific Component,
    // identified by |scope|.
    //
    // NOTE: Eventually |component_id| will become more complex, specifying
    // information needed to evaluate access-control policies for downstream
    // services.
    //
    // ANOTHER NOTE: |IntelligenceServices| is a short-term "big bucket" in which
    // to put any and all services that are to be exposed to Agents and Modules.
    // Once our understanding of the needs of Agents/Modules is clearer, we
    // should break the bucket apart.
    1: GetComponentIntelligenceServices(ComponentScope scope,
                                        request<IntelligenceServices> services);

    2: GetSuggestionProvider(request<SuggestionProvider> suggestion_provider);

    3: GetSpeechToText(request<fuchsia.speech.SpeechToText> speech_to_text);

    // The |ComponentContext| is used to create agents and use message queues.
    5: StartAgents(ComponentContext user_intelligence_context,
                   vector<string> session_agents,
                   vector<string> startup_agents);

    // A standard set of services provided to all agents at startup,
    // along with services particuarly for this agent.
    6: GetServicesForAgent(string agent_url)
           -> (fuchsia.sys.ServiceList service_list);
};
