diff --git a/opensearch_dashboards.json b/opensearch_dashboards.json index efde08bb..f7c8a96f 100644 --- a/opensearch_dashboards.json +++ b/opensearch_dashboards.json @@ -1,7 +1,7 @@ { "id": "assistantDashboards", "version": "2.11.0.0", - "opensearchDashboardsVersion": "opensearchDashboards", + "opensearchDashboardsVersion": "2.11.0", "server": true, "ui": true, "requiredPlugins": [ @@ -10,7 +10,7 @@ "opensearchDashboardsReact", "opensearchDashboardsUtils" ], - "optionalPlugins":[ - "observabilityDashboards" + "configPath": [ + "assistant" ] } diff --git a/public/index.ts b/public/index.ts index 4a9a2cca..30e31105 100644 --- a/public/index.ts +++ b/public/index.ts @@ -3,8 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { PluginInitializerContext } from '../../../src/core/public'; import { AssistantPlugin } from './plugin'; export { AssistantPlugin as Plugin }; -export const plugin = () => new AssistantPlugin(); +export function plugin(initializerContext: PluginInitializerContext) { + return new AssistantPlugin(initializerContext); +} diff --git a/public/plugin.tsx b/public/plugin.tsx index 06db1ddc..f3f2512e 100644 --- a/public/plugin.tsx +++ b/public/plugin.tsx @@ -4,7 +4,7 @@ */ import React from 'react'; -import { CoreSetup, CoreStart, Plugin } from '../../../src/core/public'; +import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '../../../src/core/public'; import { createOpenSearchDashboardsReactContext, toMountPoint, @@ -12,6 +12,7 @@ import { import { createGetterSetter } from '../../../src/plugins/opensearch_dashboards_utils/common'; import { HeaderChatButton } from './chat_header_button'; import { AssistantServices } from './contexts/core_context'; +import { SessionLoadService } from './services/session_load_service'; import { ActionExecutor, AppPluginStartDependencies, @@ -21,12 +22,22 @@ import { ContentRenderer, SetupDependencies, } from './types'; -import { SessionLoadService } from './services/session_load_service'; export const [getCoreStart, setCoreStart] = createGetterSetter('CoreStart'); +interface PublicConfig { + chat: { + enabled: boolean; + }; +} + export class AssistantPlugin implements Plugin { + private config: PublicConfig; + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + } + public setup( core: CoreSetup, setupDeps: SetupDependencies @@ -52,34 +63,36 @@ export class AssistantPlugin }; })(); - core.getStartServices().then(async ([coreStart, startDeps]) => { - const CoreContext = createOpenSearchDashboardsReactContext({ - ...coreStart, - setupDeps, - startDeps, - sessionLoad: new SessionLoadService(coreStart.http), - }); - const account = await getAccount(); - const username = account.data.user_name; + if (this.config.chat.enabled) { + core.getStartServices().then(async ([coreStart, startDeps]) => { + const CoreContext = createOpenSearchDashboardsReactContext({ + ...coreStart, + setupDeps, + startDeps, + sessionLoad: new SessionLoadService(coreStart.http), + }); + const account = await getAccount(); + const username = account.data.user_name; - coreStart.chrome.navControls.registerRight({ - order: 10000, - mount: toMountPoint( - - - ['all_access', 'assistant_user'].includes(role) - )} - contentRenderers={contentRenderers} - actionExecutors={actionExecutors} - assistantActions={assistantActions} - currentAccount={{ username }} - /> - - ), + coreStart.chrome.navControls.registerRight({ + order: 10000, + mount: toMountPoint( + + + ['all_access', 'assistant_user'].includes(role) + )} + contentRenderers={contentRenderers} + actionExecutors={actionExecutors} + assistantActions={assistantActions} + currentAccount={{ username }} + /> + + ), + }); }); - }); + } return { registerContentRenderer: (contentType, render) => { diff --git a/server/index.ts b/server/index.ts index c68277ae..8e2e488d 100644 --- a/server/index.ts +++ b/server/index.ts @@ -3,7 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { PluginInitializerContext } from '../../../src/core/server'; +import { schema, TypeOf } from '@osd/config-schema'; +import { PluginConfigDescriptor, PluginInitializerContext } from '../../../src/core/server'; import { AssistantPlugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { @@ -11,3 +12,20 @@ export function plugin(initializerContext: PluginInitializerContext) { } export { AssistantPluginSetup, AssistantPluginStart } from './types'; + +const assistantConfig = { + schema: schema.object({ + chat: schema.object({ + enabled: schema.boolean({ defaultValue: false }), + }), + }), +}; + +export type AssistantConfig = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: assistantConfig.schema, + exposeToBrowser: { + chat: true, + }, +}; diff --git a/server/plugin.ts b/server/plugin.ts index 3b3fc35f..b0d095cc 100644 --- a/server/plugin.ts +++ b/server/plugin.ts @@ -3,7 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { first } from 'rxjs/operators'; import 'web-streams-polyfill'; +import { AssistantConfig } from '.'; import { CoreSetup, CoreStart, @@ -15,6 +17,7 @@ import { import { OpenSearchAlertingPlugin } from './adaptors/opensearch_alerting_plugin'; import { OpenSearchObservabilityPlugin } from './adaptors/opensearch_observability_plugin'; import { PPLPlugin } from './adaptors/ppl_plugin'; +import { AssistantServerConfig } from './config/schema'; import './fetch-polyfill'; import { setupRoutes } from './routes/index'; import { chatSavedObject } from './saved_objects/chat_saved_object'; @@ -24,12 +27,16 @@ import { chatConfigSavedObject } from './saved_objects/chat_config_saved_object' export class AssistantPlugin implements Plugin { private readonly logger: Logger; - constructor(initializerContext: PluginInitializerContext) { + constructor(private readonly initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); } - public setup(core: CoreSetup) { + public async setup(core: CoreSetup) { this.logger.debug('Assistant: Setup'); + const config = await this.initializerContext.config + .create() + .pipe(first()) + .toPromise(); const router = core.http.createRouter(); const openSearchObservabilityClient: ILegacyClusterClient = core.opensearch.legacy.createClient( 'opensearch_observability', @@ -40,6 +47,7 @@ export class AssistantPlugin implements Plugin { return { + config, logger: this.logger, observabilityClient: openSearchObservabilityClient, };