Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions contact-center/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Integrate Copilot Studio agents with contact center platforms and live agent han

| Folder | Description |
|--------|-------------|
| [Skill Handoff](./servicenow/HandoverToLiveAgentUsingSkill/) | Skill-based handoff to live agents using M365 Agents SDK |
| [Salesforce](./servicenow/Salesforce/) | Salesforce Einstein Bot integration via DirectLine API |
| [ServiceNow](./servicenow/ServiceNow/) | ServiceNow Virtual Agent integration via DirectLine |
| [Skill Handoff](./skill-handoff/) | Skill-based handoff to live agents using M365 Agents SDK |
| [Salesforce](./salesforce/) | Salesforce Einstein Bot integration via DirectLine API |
| [ServiceNow](./servicenow/) | ServiceNow Virtual Agent integration via DirectLine |
| [Genesys Handoff](./genesys-handoff/) | Live agent handoff to Genesys (.NET) — *M365 Agents SDK repo* |
22 changes: 12 additions & 10 deletions contact-center/servicenow/README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
---
nav_exclude: true
search_exclude: true
title: ServiceNow
parent: Contact Center
nav_order: 3
---
# Engagement Hub Integrations
# Copilot Studio - ServiceNow Integration Samples

Integrate Copilot Studio agents with engagement hub platforms including ServiceNow and Salesforce.
This folder contains sample code for integrating Microsoft Copilot Studio with ServiceNow Virtual Agent, enabling seamless handoff from virtual agent to live agent.

## Contents
## Assets Included

| Folder | Description |
|--------|-------------|
| [HandoverToLiveAgentUsingSkill/](./HandoverToLiveAgentUsingSkill/) | Skill-based handoff to live agents |
| [Salesforce/](./Salesforce/) | Salesforce Einstein Bot integration via DirectLine API |
| [ServiceNow/](./ServiceNow/) | ServiceNow integration via DirectLine |
| Asset | Description | File |
|-------|-------------|------|
| **Azure Function** | Relay service that bridges ServiceNow with the Direct Line API | [`DirectLineAzureFunction/relayToDirectLine`](./DirectLineAzureFunction/) |
| **ServiceNow Script Include** | Custom transformer that detects `handoff.initiate` events and triggers agent escalation | [`ScriptIncludes/CustomDirectLineInboundTransformer.js`](./ScriptIncludes/CustomDirectLineInboundTransformer.js) |

These samples are companion code for the official documentation at: [Microsoft Learn - Copilot Studio with ServiceNow](https://learn.microsoft.com/en-us/microsoft-copilot-studio/customer-copilot-servicenow)
162 changes: 0 additions & 162 deletions contact-center/servicenow/Salesforce/CLAUDE.md

This file was deleted.

17 changes: 0 additions & 17 deletions contact-center/servicenow/ServiceNow/README.md

This file was deleted.

42 changes: 4 additions & 38 deletions ui/embed/sharepoint-customizer/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,56 +12,22 @@ module.exports = {
'sourceType': 'module'
},
rules: {
'@typescript-eslint/no-empty-function': 0,
// Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin
'@rushstack/no-new-null': 0,
'@rushstack/no-new-null': 1,
// Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin
'@rushstack/hoist-jest-mock': 1,
// Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security
'@rushstack/security/no-unsafe-regexp': 1,
// STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json
'@typescript-eslint/adjacent-overload-signatures': 1,
// STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json
//
// CONFIGURATION: By default, these are banned: String, Boolean, Number, Object, Symbol
'@typescript-eslint/ban-types': [
1,
{
'extendDefaults': false,
'types': {
'String': {
'message': 'Use \'string\' instead',
'fixWith': 'string'
},
'Boolean': {
'message': 'Use \'boolean\' instead',
'fixWith': 'boolean'
},
'Number': {
'message': 'Use \'number\' instead',
'fixWith': 'number'
},
'Object': {
'message': 'Use \'object\' instead, or else define a proper TypeScript type:'
},
'Symbol': {
'message': 'Use \'symbol\' instead',
'fixWith': 'symbol'
},
'Function': {
'message': 'The \'Function\' type accepts any function-like value.\nIt provides no type safety when calling the function, which can be a common source of bugs.\nIt also accepts things like class declarations, which will throw at runtime as they will not be called with \'new\'.\nIf you are expecting the function to accept certain arguments, you should explicitly define the function shape.'
}
}
}
],
// RATIONALE: Code is more readable when the type of every variable is immediately obvious.
// Even if the compiler may be able to infer a type, this inference will be unavailable
// to a person who is reviewing a GitHub diff. This rule makes writing code harder,
// but writing code is a much less important activity than reading it.
//
// STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json
'@typescript-eslint/explicit-function-return-type': [
0,
1,
{
'allowExpressions': true,
'allowTypedFunctionExpressions': true,
Expand All @@ -80,7 +46,7 @@ module.exports = {
// This rule should be suppressed only in very special cases such as JSON.stringify()
// where the type really can be anything. Even if the type is flexible, another type
// may be more appropriate such as "unknown", "{}", or "Record<k,V>".
'@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/no-explicit-any': 1,
// RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch()
// handler. Thus wherever a Promise arises, the code must either append a catch handler,
// or else return the object to a caller (who assumes this responsibility). Unterminated
Expand Down Expand Up @@ -324,7 +290,7 @@ module.exports = {
// ====================================================================
'@microsoft/spfx/import-requires-chunk-name': 1,
'@microsoft/spfx/no-require-ensure': 2,
'@microsoft/spfx/pair-react-dom-render-unmount': 0
'@microsoft/spfx/pair-react-dom-render-unmount': 1
}
},
{
Expand Down
1 change: 1 addition & 0 deletions ui/embed/sharepoint-customizer/.vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"**/.DS_Store": true,
"**/bower_components": true,
"**/coverage": true,
"**/jest-output": true,
"**/lib-amd": true,
"src/**/*.scss.ts": true
},
Expand Down
17 changes: 7 additions & 10 deletions ui/embed/sharepoint-customizer/.yo-rc.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,15 @@
"@microsoft/generator-sharepoint": {
"plusBeta": false,
"isCreatingSolution": true,
"nodeVersion": "16.20.2",
"sdksVersions": {
"@microsoft/microsoft-graph-client": "3.0.2",
"@microsoft/teams-js": "2.12.0"
},
"version": "1.18.0",
"libraryName": "pva-extension-sso",
"libraryId": "14634225-91e5-41a4-b9cc-161ccb3400b4",
"nodeVersion": "22.17.0",
"sdksVersions": {},
"version": "1.21.1",
"libraryName": "sidebar-agent",
"libraryId": "54cbba6a-2459-43a9-80a4-bc0675a81ac0",
"environment": "spo",
"packageManager": "npm",
"solutionName": "pva-extension-sso",
"solutionShortDescription": "pva-extension-sso description",
"solutionName": "sidebar-agent",
"solutionShortDescription": "sidebar-agent description",
"skipFeatureDeployment": true,
"isDomainIsolated": false,
"componentType": "extension",
Expand Down
41 changes: 0 additions & 41 deletions ui/embed/sharepoint-customizer/Configure-McsForSite.ps1

This file was deleted.

Loading
Loading