diff --git a/integrations/stepsailor/assets/logo.png b/integrations/stepsailor/assets/logo.png new file mode 100644 index 000000000..52e7e75d8 Binary files /dev/null and b/integrations/stepsailor/assets/logo.png differ diff --git a/integrations/stepsailor/gitbook-manifest.yaml b/integrations/stepsailor/gitbook-manifest.yaml new file mode 100644 index 000000000..ca34f9251 --- /dev/null +++ b/integrations/stepsailor/gitbook-manifest.yaml @@ -0,0 +1,56 @@ +name: stepsailor +title: Stepsailor Assistant +script: src/index.ts +icon: ./assets/logo.png +description: 'Add the Stepsailor assistant to your documentation' +externalLinks: + - label: Website + url: https://www.stepsailor.com/ +visibility: public +target: site +scopes: + - site:script:inject +contentSecurityPolicy: + font-src: | + static.api.stepsailor.com + script-src: | + static.api.stepsailor.com; + https://static.api.stepsailor.com/orion-ai/index.js; + style-src: | + static.api.stepsailor.com + https://static.api.stepsailor.com/orion-ai/main.css; +summary: | + # Overview + + The Stepsailor integration for GitBook brings Orion, an AI-powered assistant, to your documentation that enables your users to ask questions and get answers directly within your documentation. + + # How it works + + Orion provides an in-app AI assistant that answers product questions, displays educational videos within your published content. + + # Configure + + You can configure the integration on your GitBook spaces by providing your organization ID, deployConfig ID and API Key. These credentials connect your documentation to Stepsailor's knowledge base and enable the AI-powered features in your published content. +configurations: + site: + properties: + organizationId: + type: string + title: Organization ID + description: You can copy that in the deploy config page + deployConfigId: + type: string + title: Deploy Config ID + description: You can copy that in the deploy config page + apiKey: + type: string + title: API Key + description: You can copy that in the deploy config page + required: + - organizationId + - deployConfigId + - apiKey +categories: + - content +organization: GXGct7gbl46efsxXM5JQ +secrets: {} diff --git a/integrations/stepsailor/package.json b/integrations/stepsailor/package.json new file mode 100644 index 000000000..4e4a2483b --- /dev/null +++ b/integrations/stepsailor/package.json @@ -0,0 +1,16 @@ +{ + "name": "gitbook-orion", + "private": true, + "version": "0.1.0", + "scripts": { + "typecheck": "tsc --noEmit", + "publish": "gitbook publish ." + }, + "dependencies": { + "@gitbook/runtime": "*" + }, + "devDependencies": { + "@gitbook/cli": "^0.20.1", + "@gitbook/tsconfig": "*" + } +} diff --git a/integrations/stepsailor/src/index.ts b/integrations/stepsailor/src/index.ts new file mode 100644 index 000000000..abe5fa32a --- /dev/null +++ b/integrations/stepsailor/src/index.ts @@ -0,0 +1,52 @@ +import { + createIntegration, + FetchPublishScriptEventCallback, + RuntimeContext, + RuntimeEnvironment, +} from '@gitbook/runtime'; + +import script from './script.raw.js'; + +type StepsailorRuntimeContext = RuntimeContext< + RuntimeEnvironment< + {}, + { + organizationId?: string; + deployConfigId?: string; + apiKey?: string; + } + > +>; + +export const handleFetchEvent: FetchPublishScriptEventCallback = async ( + event, + { environment }: StepsailorRuntimeContext, +) => { + const organizationId = environment.siteInstallation?.configuration?.organizationId; + const deployConfigId = environment.siteInstallation?.configuration?.deployConfigId; + const apiKey = environment.siteInstallation?.configuration?.apiKey; + + if (!organizationId || !deployConfigId || !apiKey) { + throw new Error( + `The Stepsailor organization ID, deploy config ID and API key are missing from the configuration (ID: ${ + 'spaceId' in event ? event.spaceId : event.siteId + }).`, + ); + } + + const scriptContent = (script as string) + .replace('', organizationId) + .replace('', deployConfigId) + .replace('', apiKey); + + return new Response(scriptContent, { + headers: { + 'Content-Type': 'application/javascript', + 'Cache-Control': 'max-age=604800', + }, + }); +}; + +export default createIntegration({ + fetch_published_script: handleFetchEvent, +}); diff --git a/integrations/stepsailor/src/script.raw.js b/integrations/stepsailor/src/script.raw.js new file mode 100644 index 000000000..70c19e0a4 --- /dev/null +++ b/integrations/stepsailor/src/script.raw.js @@ -0,0 +1,10 @@ +(function (d, s) { + d = document; + s = d.createElement('script'); + s.src = 'https://static.api.stepsailor.com/orion-ai/index.js'; + s.setAttribute('data-company-id', ''); + s.setAttribute('data-deploy-config-id', ''); + s.setAttribute('data-secret', ''); + s.async = 1; + d.getElementsByTagName('body')[0].appendChild(s); +})(window, document); diff --git a/integrations/stepsailor/tsconfig.json b/integrations/stepsailor/tsconfig.json new file mode 100644 index 000000000..f839d1833 --- /dev/null +++ b/integrations/stepsailor/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@gitbook/tsconfig/integration.json" +} \ No newline at end of file