@microsoft/agents-hosting 1.9.0-beta.8.gf58e66b2ee → 1.9.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 (139) hide show
  1. package/README.md +182 -4
  2. package/dist/package.json +3 -3
  3. package/dist/src/app/agentApplication.d.ts +4 -3
  4. package/dist/src/app/agentApplication.js +24 -21
  5. package/dist/src/app/agentApplication.js.map +1 -1
  6. package/dist/src/app/agentApplicationBuilder.d.ts +9 -2
  7. package/dist/src/app/agentApplicationBuilder.js +9 -0
  8. package/dist/src/app/agentApplicationBuilder.js.map +1 -1
  9. package/dist/src/app/agentApplicationOptions.d.ts +16 -4
  10. package/dist/src/app/auth/authorizationManager.d.ts +0 -8
  11. package/dist/src/app/auth/authorizationManager.js +104 -178
  12. package/dist/src/app/auth/authorizationManager.js.map +1 -1
  13. package/dist/src/app/auth/handlerStorage.d.ts +5 -3
  14. package/dist/src/app/auth/handlerStorage.js +36 -10
  15. package/dist/src/app/auth/handlerStorage.js.map +1 -1
  16. package/dist/src/app/auth/types.d.ts +2 -2
  17. package/dist/src/app/index.d.ts +1 -0
  18. package/dist/src/app/proactive/proactive.js +10 -6
  19. package/dist/src/app/proactive/proactive.js.map +1 -1
  20. package/dist/src/app/proactive/proactiveOptions.d.ts +2 -2
  21. package/dist/src/app/rateLimit.d.ts +315 -0
  22. package/dist/src/app/rateLimit.js +333 -0
  23. package/dist/src/app/rateLimit.js.map +1 -0
  24. package/dist/src/app/turnState.d.ts +6 -3
  25. package/dist/src/app/turnState.js +43 -4
  26. package/dist/src/app/turnState.js.map +1 -1
  27. package/dist/src/auth/authConfiguration.d.ts +10 -3
  28. package/dist/src/auth/authConfiguration.js +292 -259
  29. package/dist/src/auth/authConfiguration.js.map +1 -1
  30. package/dist/src/auth/settings.d.ts +8 -70
  31. package/dist/src/auth/settings.js +5 -67
  32. package/dist/src/auth/settings.js.map +1 -1
  33. package/dist/src/cloudAdapter.d.ts +5 -0
  34. package/dist/src/cloudAdapter.js +13 -103
  35. package/dist/src/cloudAdapter.js.map +1 -1
  36. package/dist/src/configuration/botFrameworkEnvironmentCompatibility.d.ts +23 -0
  37. package/dist/src/configuration/botFrameworkEnvironmentCompatibility.js +183 -0
  38. package/dist/src/configuration/botFrameworkEnvironmentCompatibility.js.map +1 -0
  39. package/dist/src/configuration/configuration.d.ts +83 -0
  40. package/dist/src/configuration/configuration.js +836 -0
  41. package/dist/src/configuration/configuration.js.map +1 -0
  42. package/dist/src/configuration/configurationSource.d.ts +57 -0
  43. package/dist/src/configuration/configurationSource.js +7 -0
  44. package/dist/src/configuration/configurationSource.js.map +1 -0
  45. package/dist/src/configuration/environmentConfiguration.d.ts +14 -0
  46. package/dist/src/configuration/environmentConfiguration.js +271 -0
  47. package/dist/src/configuration/environmentConfiguration.js.map +1 -0
  48. package/dist/src/configuration/index.d.ts +7 -0
  49. package/dist/src/configuration/index.js +14 -0
  50. package/dist/src/configuration/index.js.map +1 -0
  51. package/dist/src/configuration/jsonFileConfigurationSource.d.ts +15 -0
  52. package/dist/src/configuration/jsonFileConfigurationSource.js +58 -0
  53. package/dist/src/configuration/jsonFileConfigurationSource.js.map +1 -0
  54. package/dist/src/createCloudAdapter.d.ts +30 -5
  55. package/dist/src/createCloudAdapter.js +17 -10
  56. package/dist/src/createCloudAdapter.js.map +1 -1
  57. package/dist/src/errorHelper.js +117 -5
  58. package/dist/src/errorHelper.js.map +1 -1
  59. package/dist/src/index.d.ts +1 -0
  60. package/dist/src/index.js +1 -0
  61. package/dist/src/index.js.map +1 -1
  62. package/dist/src/observability/traces.d.ts +6 -4
  63. package/dist/src/observability/traces.js +10 -9
  64. package/dist/src/observability/traces.js.map +1 -1
  65. package/dist/src/outboundHostValidator.d.ts +4 -1
  66. package/dist/src/outboundHostValidator.js +25 -48
  67. package/dist/src/outboundHostValidator.js.map +1 -1
  68. package/dist/src/state/agentState.d.ts +8 -3
  69. package/dist/src/state/agentState.js +26 -8
  70. package/dist/src/state/agentState.js.map +1 -1
  71. package/dist/src/state/conversationState.d.ts +2 -2
  72. package/dist/src/state/conversationState.js.map +1 -1
  73. package/dist/src/state/userState.d.ts +2 -2
  74. package/dist/src/state/userState.js.map +1 -1
  75. package/dist/src/statusCodes.d.ts +5 -0
  76. package/dist/src/statusCodes.js +5 -0
  77. package/dist/src/statusCodes.js.map +1 -1
  78. package/dist/src/storage/fileStorage.d.ts +83 -68
  79. package/dist/src/storage/fileStorage.js +279 -105
  80. package/dist/src/storage/fileStorage.js.map +1 -1
  81. package/dist/src/storage/index.d.ts +1 -0
  82. package/dist/src/storage/index.js +1 -0
  83. package/dist/src/storage/index.js.map +1 -1
  84. package/dist/src/storage/memoryStorage.d.ts +85 -60
  85. package/dist/src/storage/memoryStorage.js +244 -87
  86. package/dist/src/storage/memoryStorage.js.map +1 -1
  87. package/dist/src/storage/storage.d.ts +100 -2
  88. package/dist/src/storage/storage.js +25 -0
  89. package/dist/src/storage/storage.js.map +1 -1
  90. package/dist/src/storage/storageCompatibility.d.ts +17 -0
  91. package/dist/src/storage/storageCompatibility.js +157 -0
  92. package/dist/src/storage/storageCompatibility.js.map +1 -0
  93. package/dist/src/storage/storageExpiry.d.ts +6 -0
  94. package/dist/src/storage/storageExpiry.js +20 -0
  95. package/dist/src/storage/storageExpiry.js.map +1 -0
  96. package/dist/src/utils/env.d.ts +43 -0
  97. package/dist/src/utils/env.js +42 -6
  98. package/dist/src/utils/env.js.map +1 -1
  99. package/dist/src/utils.d.ts +1 -0
  100. package/dist/src/utils.js +10 -1
  101. package/dist/src/utils.js.map +1 -1
  102. package/package.json +3 -3
  103. package/src/app/agentApplication.ts +27 -14
  104. package/src/app/agentApplicationBuilder.ts +13 -2
  105. package/src/app/agentApplicationOptions.ts +18 -4
  106. package/src/app/auth/authorizationManager.ts +126 -204
  107. package/src/app/auth/handlerStorage.ts +51 -7
  108. package/src/app/auth/types.ts +2 -2
  109. package/src/app/index.ts +7 -0
  110. package/src/app/proactive/proactive.ts +19 -9
  111. package/src/app/proactive/proactiveOptions.ts +2 -2
  112. package/src/app/rateLimit.ts +659 -0
  113. package/src/app/turnState.ts +50 -7
  114. package/src/auth/authConfiguration.ts +415 -260
  115. package/src/auth/settings.ts +5 -82
  116. package/src/cloudAdapter.ts +38 -113
  117. package/src/configuration/botFrameworkEnvironmentCompatibility.ts +245 -0
  118. package/src/configuration/configuration.ts +1076 -0
  119. package/src/configuration/configurationSource.ts +76 -0
  120. package/src/configuration/environmentConfiguration.ts +377 -0
  121. package/src/configuration/index.ts +19 -0
  122. package/src/configuration/jsonFileConfigurationSource.ts +74 -0
  123. package/src/createCloudAdapter.ts +52 -9
  124. package/src/errorHelper.ts +143 -5
  125. package/src/index.ts +1 -0
  126. package/src/observability/traces.ts +8 -7
  127. package/src/outboundHostValidator.ts +37 -44
  128. package/src/state/agentState.ts +39 -13
  129. package/src/state/conversationState.ts +2 -2
  130. package/src/state/userState.ts +2 -2
  131. package/src/statusCodes.ts +6 -0
  132. package/src/storage/fileStorage.ts +299 -106
  133. package/src/storage/index.ts +1 -0
  134. package/src/storage/memoryStorage.ts +268 -85
  135. package/src/storage/storage.ts +114 -2
  136. package/src/storage/storageCompatibility.ts +185 -0
  137. package/src/storage/storageExpiry.ts +21 -0
  138. package/src/utils/env.ts +63 -0
  139. package/src/utils.ts +10 -0
@@ -3,7 +3,14 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { Storage, StoreItems } from '../storage'
6
+ import { StorageOperationStatus, StorageProvider, StorageReadResults, StorageWriteMode, StoreItems } from '../storage'
7
+ import {
8
+ asStorageV2,
9
+ assertAgentStateWriteSucceeded,
10
+ assertStorageDeleteSucceeded,
11
+ getStorageReadValue,
12
+ isStorageV2,
13
+ } from '../storage/storageCompatibility'
7
14
  import { AppMemory } from './appMemory'
8
15
  import { TurnStateEntry } from './turnStateEntry'
9
16
  import { TurnContext } from '../turnContext'
@@ -73,6 +80,8 @@ export class TurnState<
73
80
  TUserState = DefaultUserState
74
81
  > implements AppMemory {
75
82
  private _scopes: Record<string, TurnStateEntry> = {}
83
+ private _versions: Record<string, string | undefined> = {}
84
+ private _missingStorageKeys = new Set<string>()
76
85
  private _isLoaded = false
77
86
  private _loadingPromise?: Promise<boolean>
78
87
 
@@ -256,7 +265,7 @@ export class TurnState<
256
265
  * @param force - If true, forces a reload from storage even if state is already loaded
257
266
  * @returns Promise that resolves to true if state was loaded, false if it was already loaded
258
267
  */
259
- public load (context: TurnContext, storage?: Storage, force: boolean = false): Promise<boolean> {
268
+ public load (context: TurnContext, storage?: StorageProvider, force: boolean = false): Promise<boolean> {
260
269
  if (this._isLoaded && !force) {
261
270
  return Promise.resolve(false)
262
271
  }
@@ -274,13 +283,21 @@ export class TurnState<
274
283
  }
275
284
  }
276
285
 
277
- const items = storage ? await storage.read(keys) : {}
286
+ const items: StorageReadResults<Record<string, unknown>> | undefined = storage
287
+ ? await asStorageV2(storage).read<Record<string, unknown>>(keys)
288
+ : undefined
278
289
 
279
290
  for (const key in scopes) {
280
291
  if (Object.prototype.hasOwnProperty.call(scopes, key)) {
281
292
  const storageKey = scopes[key]
282
- const value = items[storageKey]
293
+ const value = storage ? getStorageReadValue(items, storageKey) : undefined
283
294
  this._scopes[key] = new TurnStateEntry(value, storageKey)
295
+ this._versions[storageKey] = items?.[storageKey]?.version
296
+ if (items?.[storageKey]?.status === StorageOperationStatus.NotFound) {
297
+ this._missingStorageKeys.add(storageKey)
298
+ } else {
299
+ this._missingStorageKeys.delete(storageKey)
300
+ }
284
301
  }
285
302
  }
286
303
 
@@ -311,7 +328,7 @@ export class TurnState<
311
328
  * @remarks
312
329
  * Only changed scopes will be persisted.
313
330
  */
314
- public async save (context: TurnContext, storage?: Storage): Promise<void> {
331
+ public async save (context: TurnContext, storage?: StorageProvider): Promise<void> {
315
332
  if (!this._isLoaded && this._loadingPromise) {
316
333
  await this._loadingPromise
317
334
  }
@@ -346,12 +363,34 @@ export class TurnState<
346
363
 
347
364
  if (storage) {
348
365
  const promises: Promise<void>[] = []
366
+ const storageV2 = asStorageV2(storage)
349
367
  if (changes) {
350
- promises.push(storage.write(changes))
368
+ for (const [key, value] of Object.entries(changes)) {
369
+ const expectedVersion = this._versions[key]
370
+ const options = expectedVersion !== undefined
371
+ ? { expectedVersion }
372
+ : isStorageV2(storage) && this._missingStorageKeys.has(key)
373
+ ? { mode: StorageWriteMode.CreateOnly }
374
+ : undefined
375
+ promises.push(storageV2.write(
376
+ { [key]: value },
377
+ options
378
+ ).then(results => {
379
+ assertAgentStateWriteSucceeded(results, key, this.getStorageScopeName(key))
380
+ this._versions[key] = results?.[key]?.version
381
+ this._missingStorageKeys.delete(key)
382
+ }))
383
+ }
351
384
  }
352
385
 
353
386
  if (deletions) {
354
- promises.push(storage.delete(deletions))
387
+ promises.push(storageV2.delete(deletions).then(results => {
388
+ assertStorageDeleteSucceeded(results, deletions)
389
+ for (const key of deletions) {
390
+ delete this._versions[key]
391
+ this._missingStorageKeys.delete(key)
392
+ }
393
+ }))
355
394
  }
356
395
 
357
396
  if (promises.length > 0) {
@@ -360,6 +399,10 @@ export class TurnState<
360
399
  }
361
400
  }
362
401
 
402
+ private getStorageScopeName (storageKey: string): string {
403
+ return Object.entries(this._scopes).find(([, entry]) => entry.storageKey === storageKey)?.[0] ?? this.constructor.name
404
+ }
405
+
363
406
  /**
364
407
  * Computes the storage keys for each scope based on the turn context.
365
408
  *