@microsoft/agents-hosting 1.5.0-beta.6.ga236d9a19c → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/package.json +10 -9
  2. package/dist/src/activityHandler.js +2 -2
  3. package/dist/src/activityHandler.js.map +1 -1
  4. package/dist/src/agent-client/agentClient.js +49 -40
  5. package/dist/src/agent-client/agentClient.js.map +1 -1
  6. package/dist/src/agent-client/agentResponseHandler.js +2 -2
  7. package/dist/src/agent-client/agentResponseHandler.js.map +1 -1
  8. package/dist/src/app/agentApplication.d.ts +36 -10
  9. package/dist/src/app/agentApplication.js +169 -99
  10. package/dist/src/app/agentApplication.js.map +1 -1
  11. package/dist/src/app/agentApplicationBuilder.d.ts +15 -0
  12. package/dist/src/app/agentApplicationBuilder.js +22 -4
  13. package/dist/src/app/agentApplicationBuilder.js.map +1 -1
  14. package/dist/src/app/agentApplicationOptions.d.ts +38 -0
  15. package/dist/src/app/attachmentDownloader.js +2 -2
  16. package/dist/src/app/attachmentDownloader.js.map +1 -1
  17. package/dist/src/app/auth/authorization.js +12 -9
  18. package/dist/src/app/auth/authorization.js.map +1 -1
  19. package/dist/src/app/auth/authorizationManager.d.ts +18 -5
  20. package/dist/src/app/auth/authorizationManager.js +258 -45
  21. package/dist/src/app/auth/authorizationManager.js.map +1 -1
  22. package/dist/src/app/auth/handlerStorage.js +3 -1
  23. package/dist/src/app/auth/handlerStorage.js.map +1 -1
  24. package/dist/src/app/auth/handlers/agenticAuthorization.d.ts +19 -16
  25. package/dist/src/app/auth/handlers/agenticAuthorization.js +46 -52
  26. package/dist/src/app/auth/handlers/agenticAuthorization.js.map +1 -1
  27. package/dist/src/app/auth/handlers/azureBotAuthorization.d.ts +51 -75
  28. package/dist/src/app/auth/handlers/azureBotAuthorization.js +217 -192
  29. package/dist/src/app/auth/handlers/azureBotAuthorization.js.map +1 -1
  30. package/dist/src/app/auth/types.d.ts +100 -1
  31. package/dist/src/app/auth/utils.d.ts +10 -0
  32. package/dist/src/app/auth/utils.js +21 -0
  33. package/dist/src/app/auth/utils.js.map +1 -0
  34. package/dist/src/app/index.d.ts +1 -0
  35. package/dist/src/app/index.js +1 -0
  36. package/dist/src/app/index.js.map +1 -1
  37. package/dist/src/app/proactive/conversation.d.ts +43 -0
  38. package/dist/src/app/proactive/conversation.js +67 -0
  39. package/dist/src/app/proactive/conversation.js.map +1 -0
  40. package/dist/src/app/proactive/conversationBuilder.d.ts +54 -0
  41. package/dist/src/app/proactive/conversationBuilder.js +110 -0
  42. package/dist/src/app/proactive/conversationBuilder.js.map +1 -0
  43. package/dist/src/app/proactive/conversationReferenceBuilder.d.ts +68 -0
  44. package/dist/src/app/proactive/conversationReferenceBuilder.js +125 -0
  45. package/dist/src/app/proactive/conversationReferenceBuilder.js.map +1 -0
  46. package/dist/src/app/proactive/createConversationOptions.d.ts +30 -0
  47. package/dist/src/app/proactive/createConversationOptions.js +10 -0
  48. package/dist/src/app/proactive/createConversationOptions.js.map +1 -0
  49. package/dist/src/app/proactive/createConversationOptionsBuilder.d.ts +69 -0
  50. package/dist/src/app/proactive/createConversationOptionsBuilder.js +141 -0
  51. package/dist/src/app/proactive/createConversationOptionsBuilder.js.map +1 -0
  52. package/dist/src/app/proactive/index.d.ts +7 -0
  53. package/dist/src/app/proactive/index.js +26 -0
  54. package/dist/src/app/proactive/index.js.map +1 -0
  55. package/dist/src/app/proactive/proactive.d.ts +248 -0
  56. package/dist/src/app/proactive/proactive.js +310 -0
  57. package/dist/src/app/proactive/proactive.js.map +1 -0
  58. package/dist/src/app/proactive/proactiveOptions.d.ts +19 -0
  59. package/dist/src/app/proactive/proactiveOptions.js +5 -0
  60. package/dist/src/app/proactive/proactiveOptions.js.map +1 -0
  61. package/dist/src/app/streaming/streamingResponse.js +2 -2
  62. package/dist/src/app/streaming/streamingResponse.js.map +1 -1
  63. package/dist/src/app/teamsAttachmentDownloader.js +2 -2
  64. package/dist/src/app/teamsAttachmentDownloader.js.map +1 -1
  65. package/dist/src/app/turnState.js +2 -2
  66. package/dist/src/app/turnState.js.map +1 -1
  67. package/dist/src/auth/authConfiguration.d.ts +61 -0
  68. package/dist/src/auth/authConfiguration.js +52 -3
  69. package/dist/src/auth/authConfiguration.js.map +1 -1
  70. package/dist/src/auth/jwt-middleware.js +2 -2
  71. package/dist/src/auth/jwt-middleware.js.map +1 -1
  72. package/dist/src/auth/msalConnectionManager.js +20 -0
  73. package/dist/src/auth/msalConnectionManager.js.map +1 -1
  74. package/dist/src/auth/msalTokenCredential.js +3 -0
  75. package/dist/src/auth/msalTokenCredential.js.map +1 -1
  76. package/dist/src/auth/msalTokenProvider.js +136 -110
  77. package/dist/src/auth/msalTokenProvider.js.map +1 -1
  78. package/dist/src/baseAdapter.js +2 -2
  79. package/dist/src/baseAdapter.js.map +1 -1
  80. package/dist/src/cloudAdapter.js +201 -154
  81. package/dist/src/cloudAdapter.js.map +1 -1
  82. package/dist/src/connector-client/connectorClient.js +176 -127
  83. package/dist/src/connector-client/connectorClient.js.map +1 -1
  84. package/dist/src/errorHelper.js +108 -0
  85. package/dist/src/errorHelper.js.map +1 -1
  86. package/dist/src/middlewareSet.js +2 -2
  87. package/dist/src/middlewareSet.js.map +1 -1
  88. package/dist/src/oauth/userTokenClient.js +78 -48
  89. package/dist/src/oauth/userTokenClient.js.map +1 -1
  90. package/dist/src/observability/index.d.ts +2 -0
  91. package/dist/src/observability/index.js +21 -0
  92. package/dist/src/observability/index.js.map +1 -0
  93. package/dist/src/observability/metrics.d.ts +21 -0
  94. package/dist/src/observability/metrics.js +87 -0
  95. package/dist/src/observability/metrics.js.map +1 -0
  96. package/dist/src/observability/traces.d.ts +234 -0
  97. package/dist/src/observability/traces.js +962 -0
  98. package/dist/src/observability/traces.js.map +1 -0
  99. package/dist/src/state/agentState.js +2 -2
  100. package/dist/src/state/agentState.js.map +1 -1
  101. package/dist/src/storage/fileStorage.js +38 -28
  102. package/dist/src/storage/fileStorage.js.map +1 -1
  103. package/dist/src/storage/memoryStorage.js +41 -30
  104. package/dist/src/storage/memoryStorage.js.map +1 -1
  105. package/dist/src/transcript/fileTranscriptLogger.js +2 -2
  106. package/dist/src/transcript/fileTranscriptLogger.js.map +1 -1
  107. package/dist/src/transcript/transcriptLoggerMiddleware.js +2 -2
  108. package/dist/src/transcript/transcriptLoggerMiddleware.js.map +1 -1
  109. package/dist/src/turnContext.js +48 -42
  110. package/dist/src/turnContext.js.map +1 -1
  111. package/package.json +10 -9
  112. package/src/activityHandler.ts +1 -1
  113. package/src/agent-client/agentClient.ts +53 -42
  114. package/src/agent-client/agentResponseHandler.ts +1 -1
  115. package/src/app/agentApplication.ts +212 -86
  116. package/src/app/agentApplicationBuilder.ts +26 -4
  117. package/src/app/agentApplicationOptions.ts +43 -0
  118. package/src/app/attachmentDownloader.ts +1 -1
  119. package/src/app/auth/authorization.ts +11 -8
  120. package/src/app/auth/authorizationManager.ts +297 -45
  121. package/src/app/auth/handlerStorage.ts +3 -1
  122. package/src/app/auth/handlers/agenticAuthorization.ts +68 -72
  123. package/src/app/auth/handlers/azureBotAuthorization.ts +260 -264
  124. package/src/app/auth/types.ts +102 -1
  125. package/src/app/auth/utils.ts +22 -0
  126. package/src/app/index.ts +1 -0
  127. package/src/app/proactive/conversation.ts +87 -0
  128. package/src/app/proactive/conversationBuilder.ts +139 -0
  129. package/src/app/proactive/conversationReferenceBuilder.ts +161 -0
  130. package/src/app/proactive/createConversationOptions.ts +35 -0
  131. package/src/app/proactive/createConversationOptionsBuilder.ts +181 -0
  132. package/src/app/proactive/index.ts +10 -0
  133. package/src/app/proactive/proactive.ts +524 -0
  134. package/src/app/proactive/proactiveOptions.ts +24 -0
  135. package/src/app/streaming/streamingResponse.ts +1 -1
  136. package/src/app/teamsAttachmentDownloader.ts +1 -1
  137. package/src/app/turnState.ts +1 -1
  138. package/src/auth/authConfiguration.ts +58 -1
  139. package/src/auth/jwt-middleware.ts +1 -1
  140. package/src/auth/msalConnectionManager.ts +22 -0
  141. package/src/auth/msalTokenCredential.ts +4 -0
  142. package/src/auth/msalTokenProvider.ts +138 -107
  143. package/src/baseAdapter.ts +1 -1
  144. package/src/cloudAdapter.ts +239 -184
  145. package/src/connector-client/connectorClient.ts +169 -126
  146. package/src/errorHelper.ts +124 -0
  147. package/src/middlewareSet.ts +1 -1
  148. package/src/oauth/userTokenClient.ts +70 -46
  149. package/src/observability/index.ts +5 -0
  150. package/src/observability/metrics.ts +103 -0
  151. package/src/observability/traces.ts +988 -0
  152. package/src/state/agentState.ts +1 -1
  153. package/src/storage/fileStorage.ts +36 -26
  154. package/src/storage/memoryStorage.ts +40 -29
  155. package/src/transcript/fileTranscriptLogger.ts +1 -1
  156. package/src/transcript/transcriptLoggerMiddleware.ts +1 -1
  157. package/src/turnContext.ts +47 -41
@@ -7,7 +7,7 @@ import { Storage, StorageKeyFactory, StoreItem } from '../storage/storage'
7
7
  import { TurnContext } from '../turnContext'
8
8
  import { createHash } from 'node:crypto'
9
9
  import { AgentStatePropertyAccessor } from './agentStatePropertyAccesor'
10
- import { debug } from '@microsoft/agents-activity/logger'
10
+ import { debug } from '@microsoft/agents-telemetry'
11
11
 
12
12
  const logger = debug('agents:state')
13
13
 
@@ -6,6 +6,8 @@
6
6
  import path from 'path'
7
7
  import fs from 'fs'
8
8
  import { Storage, StoreItem } from './storage'
9
+ import { trace } from '@microsoft/agents-telemetry'
10
+ import { StorageTraceDefinitions } from '../observability'
9
11
 
10
12
  /**
11
13
  * A file-based storage implementation that persists data to the local filesystem.
@@ -91,19 +93,22 @@ export class FileStorage implements Storage {
91
93
  *
92
94
  */
93
95
  read (keys: string[]) : Promise<StoreItem> {
94
- return new Promise((resolve, reject) => {
95
- if (!keys || keys.length === 0) {
96
- reject(new ReferenceError('Keys are required when reading.'))
97
- } else {
98
- const data: StoreItem = {}
99
- for (const key of keys) {
100
- const item = this._stateFile[key]
101
- if (item) {
102
- data[key] = item
96
+ return trace(StorageTraceDefinitions.read, async ({ record }) => {
97
+ record({ keyCount: keys?.length })
98
+ return new Promise<StoreItem>((resolve, reject) => {
99
+ if (!keys || keys.length === 0) {
100
+ reject(new ReferenceError('Keys are required when reading.'))
101
+ } else {
102
+ const data: StoreItem = {}
103
+ for (const key of keys) {
104
+ const item = this._stateFile[key]
105
+ if (item) {
106
+ data[key] = item
107
+ }
103
108
  }
109
+ resolve(data)
104
110
  }
105
- resolve(data)
106
- }
111
+ })
107
112
  })
108
113
  }
109
114
 
@@ -124,12 +129,14 @@ export class FileStorage implements Storage {
124
129
  *
125
130
  */
126
131
  write (changes: StoreItem) : Promise<void> {
127
- const keys = Object.keys(changes)
128
- for (const key of keys) {
129
- this._stateFile[key] = changes[key]
130
- }
131
- fs.writeFileSync(this._folder + '/state.json', JSON.stringify(this._stateFile, null, 2))
132
- return Promise.resolve()
132
+ return trace(StorageTraceDefinitions.write, async ({ record }) => {
133
+ const keys = Object.keys(changes)
134
+ record({ keyCount: keys?.length })
135
+ for (const key of keys) {
136
+ this._stateFile[key] = changes[key]
137
+ }
138
+ fs.writeFileSync(this._folder + '/state.json', JSON.stringify(this._stateFile, null, 2))
139
+ })
133
140
  }
134
141
 
135
142
  /**
@@ -147,16 +154,19 @@ export class FileStorage implements Storage {
147
154
  *
148
155
  */
149
156
  delete (keys: string[]) : Promise<void> {
150
- return new Promise((resolve, reject) => {
151
- if (!keys || keys.length === 0) {
152
- reject(new ReferenceError('Keys are required when deleting.'))
153
- } else {
154
- for (const key of keys) {
155
- delete this._stateFile[key]
157
+ return trace(StorageTraceDefinitions.delete, async ({ record }) => {
158
+ record({ keyCount: keys?.length })
159
+ return new Promise<void>((resolve, reject) => {
160
+ if (!keys || keys.length === 0) {
161
+ reject(new ReferenceError('Keys are required when deleting.'))
162
+ } else {
163
+ for (const key of keys) {
164
+ delete this._stateFile[key]
165
+ }
166
+ fs.writeFileSync(this._folder + '/state.json', JSON.stringify(this._stateFile, null, 2))
167
+ resolve(undefined)
156
168
  }
157
- fs.writeFileSync(this._folder + '/state.json', JSON.stringify(this._stateFile, null, 2))
158
- }
159
- resolve()
169
+ })
160
170
  })
161
171
  }
162
172
  }
@@ -3,8 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { trace } from '@microsoft/agents-telemetry'
7
+ import { StorageTraceDefinitions } from '../observability'
6
8
  import { Storage, StoreItem } from './storage'
7
- import { debug } from '@microsoft/agents-activity/logger'
9
+ import { debug } from '@microsoft/agents-telemetry'
8
10
 
9
11
  const logger = debug('agents:memory-storage')
10
12
 
@@ -61,20 +63,23 @@ export class MemoryStorage implements Storage {
61
63
  * @throws Will throw an error if keys are not provided or the array is empty
62
64
  */
63
65
  async read (keys: string[]): Promise<StoreItem> {
64
- if (!keys || keys.length === 0) {
65
- throw new ReferenceError('Keys are required when reading.')
66
- }
66
+ return trace(StorageTraceDefinitions.read, async ({ record }) => {
67
+ record({ keyCount: keys?.length })
68
+ if (!keys || keys.length === 0) {
69
+ throw new ReferenceError('Keys are required when reading.')
70
+ }
67
71
 
68
- const data: StoreItem = {}
69
- for (const key of keys) {
70
- logger.debug(`Reading key: ${key}`)
71
- const item = this.memory[key]
72
- if (item) {
73
- data[key] = JSON.parse(item)
72
+ const data: StoreItem = {}
73
+ for (const key of keys) {
74
+ logger.debug(`Reading key: ${key}`)
75
+ const item = this.memory[key]
76
+ if (item) {
77
+ data[key] = JSON.parse(item)
78
+ }
74
79
  }
75
- }
76
80
 
77
- return data
81
+ return data
82
+ })
78
83
  }
79
84
 
80
85
  /**
@@ -91,24 +96,27 @@ export class MemoryStorage implements Storage {
91
96
  * always be written regardless of the current state.
92
97
  */
93
98
  async write (changes: StoreItem): Promise<void> {
94
- if (!changes || changes.length === 0) {
95
- throw new ReferenceError('Changes are required when writing.')
96
- }
99
+ return trace(StorageTraceDefinitions.write, async ({ record }) => {
100
+ if (!changes || changes.length === 0) {
101
+ throw new ReferenceError('Changes are required when writing.')
102
+ }
103
+ record({ keyCount: changes.length })
97
104
 
98
- for (const [key, newItem] of Object.entries(changes)) {
99
- logger.debug(`Writing key: ${key}`)
100
- const oldItemStr = this.memory[key]
101
- if (!oldItemStr || newItem.eTag === '*' || !newItem.eTag) {
102
- this.saveItem(key, newItem)
103
- } else {
104
- const oldItem = JSON.parse(oldItemStr)
105
- if (newItem.eTag === oldItem.eTag) {
105
+ for (const [key, newItem] of Object.entries(changes)) {
106
+ logger.debug(`Writing key: ${key}`)
107
+ const oldItemStr = this.memory[key]
108
+ if (!oldItemStr || newItem.eTag === '*' || !newItem.eTag) {
106
109
  this.saveItem(key, newItem)
107
110
  } else {
108
- throw new Error(`Storage: error writing "${key}" due to eTag conflict.`)
111
+ const oldItem = JSON.parse(oldItemStr)
112
+ if (newItem.eTag === oldItem.eTag) {
113
+ this.saveItem(key, newItem)
114
+ } else {
115
+ throw new Error(`Storage: error writing "${key}" due to eTag conflict.`)
116
+ }
109
117
  }
110
118
  }
111
- }
119
+ })
112
120
  }
113
121
 
114
122
  /**
@@ -118,10 +126,13 @@ export class MemoryStorage implements Storage {
118
126
  * @returns A promise that resolves when the delete operation is complete
119
127
  */
120
128
  async delete (keys: string[]): Promise<void> {
121
- logger.debug(`Deleting keys: ${keys.join(', ')}`)
122
- for (const key of keys) {
123
- delete this.memory[key]
124
- }
129
+ return trace(StorageTraceDefinitions.delete, async ({ record }) => {
130
+ record({ keyCount: keys?.length })
131
+ logger.debug(`Deleting keys: ${keys.join(', ')}`)
132
+ for (const key of keys) {
133
+ delete this.memory[key]
134
+ }
135
+ })
125
136
  }
126
137
 
127
138
  /**
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { debug } from '@microsoft/agents-activity/logger'
6
+ import { debug } from '@microsoft/agents-telemetry'
7
7
  import { PagedResult, TranscriptInfo } from './transcriptLogger'
8
8
  import { TranscriptStore } from './transcriptStore'
9
9
  import * as fs from 'fs/promises'
@@ -3,7 +3,7 @@ import { ResourceResponse } from '../connector-client'
3
3
  import { Middleware } from '../middlewareSet'
4
4
  import { TranscriptLogger } from './transcriptLogger'
5
5
  import { Activity, ActivityEventNames, ActivityTypes, ConversationReference, RoleTypes } from '@microsoft/agents-activity'
6
- import { debug } from '@microsoft/agents-activity/logger'
6
+ import { debug } from '@microsoft/agents-telemetry'
7
7
 
8
8
  const appLogger = debug('agents:rest-client')
9
9
 
@@ -8,6 +8,8 @@ import { AttachmentInfo } from './connector-client/attachmentInfo'
8
8
  import { AttachmentData } from './connector-client/attachmentData'
9
9
  import { StreamingResponse } from './app/streaming/streamingResponse'
10
10
  import { JwtPayload } from 'jsonwebtoken'
11
+ import { trace } from '@microsoft/agents-telemetry'
12
+ import { TurnContextTraceDefinitions } from './observability'
11
13
 
12
14
  /**
13
15
  * Defines a handler for processing and sending activities.
@@ -166,50 +168,54 @@ export class TurnContext {
166
168
  * the adapter.
167
169
  */
168
170
  async sendActivities (activities: Activity[]): Promise<ResourceResponse[]> {
169
- let sentNonTraceActivity = false
170
- const ref = this.activity.getConversationReference()
171
- const output = activities.map((activity) => {
172
- const newActivity = Activity.fromObject(activity)
173
- const result = newActivity.applyConversationReference(ref)
174
- if (!result.type) {
175
- result.type = ActivityTypes.Message
176
- }
177
- if (result.type === ActivityTypes.InvokeResponse) {
178
- this.turnState.set(INVOKE_RESPONSE_KEY, result)
179
- }
180
- if (result.type !== ActivityTypes.Trace) {
181
- sentNonTraceActivity = true
182
- }
183
- if (result.id) {
184
- delete result.id
185
- }
186
- return result
187
- })
188
- return await this.emit(this._onSendActivities, output, async () => {
189
- if (this.activity.deliveryMode === DeliveryModes.ExpectReplies) {
190
- const responses: ResourceResponse[] = []
191
- output.forEach((a) => {
192
- this.bufferedReplyActivities.push(a)
193
- if (a.type === ActivityTypes.InvokeResponse) {
194
- this.turnState.set(INVOKE_RESPONSE_KEY, a)
195
- }
196
- responses.push({ id: '' })
197
- })
198
- if (sentNonTraceActivity) {
199
- this.responded = true
171
+ return trace(TurnContextTraceDefinitions.sendActivities, async ({ record, actions }) => {
172
+ record({ activityCount: activities?.length })
173
+ let sentNonTraceActivity = false
174
+ const ref = this.activity.getConversationReference()
175
+ const output = activities.map((activity) => {
176
+ actions.recordActivity(activity)
177
+ const newActivity = Activity.fromObject(activity)
178
+ const result = newActivity.applyConversationReference(ref)
179
+ if (!result.type) {
180
+ result.type = ActivityTypes.Message
200
181
  }
201
- return responses
202
- } else {
203
- const responses = await this.adapter.sendActivities(this, output)
204
- for (let index = 0; index < responses?.length; index++) {
205
- const activity = output[index]
206
- activity.id = responses[index].id
182
+ if (result.type === ActivityTypes.InvokeResponse) {
183
+ this.turnState.set(INVOKE_RESPONSE_KEY, result)
207
184
  }
208
- if (sentNonTraceActivity) {
209
- this.responded = true
185
+ if (result.type !== ActivityTypes.Trace) {
186
+ sentNonTraceActivity = true
210
187
  }
211
- return responses
212
- }
188
+ if (result.id) {
189
+ delete result.id
190
+ }
191
+ return result
192
+ })
193
+ return await this.emit(this._onSendActivities, output, async () => {
194
+ if (this.activity.deliveryMode === DeliveryModes.ExpectReplies) {
195
+ const responses: ResourceResponse[] = []
196
+ output.forEach((a) => {
197
+ this.bufferedReplyActivities.push(a)
198
+ if (a.type === ActivityTypes.InvokeResponse) {
199
+ this.turnState.set(INVOKE_RESPONSE_KEY, a)
200
+ }
201
+ responses.push({ id: '' })
202
+ })
203
+ if (sentNonTraceActivity) {
204
+ this.responded = true
205
+ }
206
+ return responses
207
+ } else {
208
+ const responses = await this.adapter.sendActivities(this, output)
209
+ for (let index = 0; index < responses?.length; index++) {
210
+ const activity = output[index]
211
+ activity.id = responses[index].id
212
+ }
213
+ if (sentNonTraceActivity) {
214
+ this.responded = true
215
+ }
216
+ return responses
217
+ }
218
+ })
213
219
  })
214
220
  }
215
221