quidproquo-actionprocessor-awslambda 0.1.7 → 0.1.8

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 (168) hide show
  1. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js +1 -1
  2. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
  3. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +16 -5
  4. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js.map +1 -1
  5. package/lib/commonjs/getActionProcessor/core/ai/logic/createDriveFileResolver.js +2 -2
  6. package/lib/commonjs/getActionProcessor/core/ai/logic/createDriveFileResolver.js.map +1 -1
  7. package/lib/commonjs/getActionProcessor/core/ai/logic/index.d.ts +1 -0
  8. package/lib/commonjs/getActionProcessor/core/ai/logic/index.js +1 -0
  9. package/lib/commonjs/getActionProcessor/core/ai/logic/index.js.map +1 -1
  10. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinish.js +2 -1
  11. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinish.js.map +1 -1
  12. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js +2 -1
  13. package/lib/commonjs/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js.map +1 -1
  14. package/lib/commonjs/getActionProcessor/core/ai/logic/prepareAiPromptCall.js +10 -12
  15. package/lib/commonjs/getActionProcessor/core/ai/logic/prepareAiPromptCall.js.map +1 -1
  16. package/lib/commonjs/getActionProcessor/core/ai/logic/toAiStreamFinishReason.d.ts +2 -0
  17. package/lib/commonjs/getActionProcessor/core/ai/logic/toAiStreamFinishReason.js +10 -0
  18. package/lib/commonjs/getActionProcessor/core/ai/logic/toAiStreamFinishReason.js.map +1 -0
  19. package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableMessages.js +9 -9
  20. package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableMessages.js.map +1 -1
  21. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.d.ts +1 -1
  22. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.js +1 -1
  23. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.js.map +1 -1
  24. package/lib/commonjs/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.d.ts +2 -2
  25. package/lib/commonjs/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js +10 -6
  26. package/lib/commonjs/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js.map +1 -1
  27. package/lib/commonjs/getActionProcessor/core/file/getFileDeleteActionProcessor.js +4 -2
  28. package/lib/commonjs/getActionProcessor/core/file/getFileDeleteActionProcessor.js.map +1 -1
  29. package/lib/commonjs/getActionProcessor/core/file/getFileExistsActionProcessor.js +4 -2
  30. package/lib/commonjs/getActionProcessor/core/file/getFileExistsActionProcessor.js.map +1 -1
  31. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js +7 -3
  32. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js.map +1 -1
  33. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js +7 -3
  34. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js.map +1 -1
  35. package/lib/commonjs/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js +4 -2
  36. package/lib/commonjs/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js.map +1 -1
  37. package/lib/commonjs/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js +6 -4
  38. package/lib/commonjs/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js.map +1 -1
  39. package/lib/commonjs/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js +4 -2
  40. package/lib/commonjs/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js.map +1 -1
  41. package/lib/commonjs/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js +7 -2
  42. package/lib/commonjs/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js.map +1 -1
  43. package/lib/commonjs/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js +6 -2
  44. package/lib/commonjs/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js.map +1 -1
  45. package/lib/commonjs/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js +3 -2
  46. package/lib/commonjs/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js.map +1 -1
  47. package/lib/commonjs/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js +3 -2
  48. package/lib/commonjs/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js.map +1 -1
  49. package/lib/commonjs/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js +3 -2
  50. package/lib/commonjs/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js.map +1 -1
  51. package/lib/commonjs/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js +3 -2
  52. package/lib/commonjs/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js.map +1 -1
  53. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js +11 -9
  54. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js.map +1 -1
  55. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js +7 -3
  56. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js.map +1 -1
  57. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js +8 -3
  58. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js.map +1 -1
  59. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +9 -5
  60. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js.map +1 -1
  61. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js +9 -2
  62. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js.map +1 -1
  63. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js +10 -8
  64. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js.map +1 -1
  65. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js +13 -11
  66. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js.map +1 -1
  67. package/lib/commonjs/getActionProcessor/core/keyValueStore/index.js +2 -1
  68. package/lib/commonjs/getActionProcessor/core/keyValueStore/index.js.map +1 -1
  69. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js +2 -2
  70. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js.map +1 -1
  71. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js +11 -1
  72. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js.map +1 -1
  73. package/lib/commonjs/lambdaHandlers/getSqsEvent_queueEvent.js +3 -3
  74. package/lib/commonjs/lambdaHandlers/getSqsEvent_queueEvent.js.map +1 -1
  75. package/lib/commonjs/logic/cognito/requestEmailVerificationCode.d.ts +2 -1
  76. package/lib/commonjs/logic/cognito/requestEmailVerificationCode.js +8 -1
  77. package/lib/commonjs/logic/cognito/requestEmailVerificationCode.js.map +1 -1
  78. package/lib/commonjs/logic/dynamo/getAllItems.d.ts +2 -1
  79. package/lib/commonjs/logic/dynamo/getAllItems.js +7 -2
  80. package/lib/commonjs/logic/dynamo/getAllItems.js.map +1 -1
  81. package/lib/commonjs/logic/dynamo/getItem.d.ts +2 -1
  82. package/lib/commonjs/logic/dynamo/getItem.js +8 -5
  83. package/lib/commonjs/logic/dynamo/getItem.js.map +1 -1
  84. package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js +1 -1
  85. package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
  86. package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +16 -6
  87. package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js.map +1 -1
  88. package/lib/esm/getActionProcessor/core/ai/logic/createDriveFileResolver.js +2 -2
  89. package/lib/esm/getActionProcessor/core/ai/logic/createDriveFileResolver.js.map +1 -1
  90. package/lib/esm/getActionProcessor/core/ai/logic/index.d.ts +1 -0
  91. package/lib/esm/getActionProcessor/core/ai/logic/index.js +1 -0
  92. package/lib/esm/getActionProcessor/core/ai/logic/index.js.map +1 -1
  93. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinish.js +2 -1
  94. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinish.js.map +1 -1
  95. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js +2 -1
  96. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js.map +1 -1
  97. package/lib/esm/getActionProcessor/core/ai/logic/prepareAiPromptCall.js +13 -8
  98. package/lib/esm/getActionProcessor/core/ai/logic/prepareAiPromptCall.js.map +1 -1
  99. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamFinishReason.d.ts +2 -0
  100. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamFinishReason.js +6 -0
  101. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamFinishReason.js.map +1 -0
  102. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.js +15 -15
  103. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.js.map +1 -1
  104. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.d.ts +1 -1
  105. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.js +1 -1
  106. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.js.map +1 -1
  107. package/lib/esm/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.d.ts +2 -2
  108. package/lib/esm/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js +10 -6
  109. package/lib/esm/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js.map +1 -1
  110. package/lib/esm/getActionProcessor/core/file/getFileDeleteActionProcessor.js +5 -3
  111. package/lib/esm/getActionProcessor/core/file/getFileDeleteActionProcessor.js.map +1 -1
  112. package/lib/esm/getActionProcessor/core/file/getFileExistsActionProcessor.js +5 -3
  113. package/lib/esm/getActionProcessor/core/file/getFileExistsActionProcessor.js.map +1 -1
  114. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js +9 -5
  115. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js.map +1 -1
  116. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js +9 -5
  117. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js.map +1 -1
  118. package/lib/esm/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js +5 -3
  119. package/lib/esm/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js.map +1 -1
  120. package/lib/esm/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js +7 -4
  121. package/lib/esm/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js.map +1 -1
  122. package/lib/esm/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js +5 -3
  123. package/lib/esm/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js.map +1 -1
  124. package/lib/esm/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js +8 -3
  125. package/lib/esm/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js.map +1 -1
  126. package/lib/esm/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js +7 -3
  127. package/lib/esm/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js.map +1 -1
  128. package/lib/esm/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js +4 -3
  129. package/lib/esm/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js.map +1 -1
  130. package/lib/esm/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js +4 -3
  131. package/lib/esm/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js.map +1 -1
  132. package/lib/esm/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js +4 -3
  133. package/lib/esm/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js.map +1 -1
  134. package/lib/esm/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js +4 -3
  135. package/lib/esm/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js.map +1 -1
  136. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js +7 -5
  137. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js.map +1 -1
  138. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js +8 -4
  139. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js.map +1 -1
  140. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js +9 -4
  141. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js.map +1 -1
  142. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +10 -6
  143. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js.map +1 -1
  144. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js +11 -4
  145. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js.map +1 -1
  146. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js +7 -5
  147. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js.map +1 -1
  148. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js +14 -12
  149. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js.map +1 -1
  150. package/lib/esm/getActionProcessor/core/keyValueStore/index.js +2 -0
  151. package/lib/esm/getActionProcessor/core/keyValueStore/index.js.map +1 -1
  152. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js +2 -2
  153. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js.map +1 -1
  154. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js +12 -2
  155. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js.map +1 -1
  156. package/lib/esm/lambdaHandlers/getSqsEvent_queueEvent.js +3 -3
  157. package/lib/esm/lambdaHandlers/getSqsEvent_queueEvent.js.map +1 -1
  158. package/lib/esm/logic/cognito/requestEmailVerificationCode.d.ts +2 -1
  159. package/lib/esm/logic/cognito/requestEmailVerificationCode.js +7 -1
  160. package/lib/esm/logic/cognito/requestEmailVerificationCode.js.map +1 -1
  161. package/lib/esm/logic/dynamo/getAllItems.d.ts +2 -1
  162. package/lib/esm/logic/dynamo/getAllItems.js +7 -2
  163. package/lib/esm/logic/dynamo/getAllItems.js.map +1 -1
  164. package/lib/esm/logic/dynamo/getItem.d.ts +2 -1
  165. package/lib/esm/logic/dynamo/getItem.js +8 -5
  166. package/lib/esm/logic/dynamo/getItem.js.map +1 -1
  167. package/lib/extension-layer/qpq-log-extension/index.js +37 -37
  168. package/package.json +7 -7
@@ -30,7 +30,7 @@ const getProcessAiPrompt = (qpqConfig) => {
30
30
  const providerOptions = payload.reasoning
31
31
  ? { bedrock: { reasoningConfig: { type: 'enabled', budgetTokens: (_a = payload.reasoning.budgetTokens) !== null && _a !== void 0 ? _a : 4096 } } }
32
32
  : undefined;
33
- const result = yield (0, ai_1.generateText)(Object.assign(Object.assign({ model: prepared.model, system: (0, logic_1.toCacheableSystem)(payload.system, payload.caching) }, promptOrMessages), { tools: prepared.tools, providerOptions, stopWhen: (0, ai_1.stepCountIs)(10) }));
33
+ const result = yield (0, ai_1.generateText)(Object.assign(Object.assign({ model: prepared.model, system: (0, logic_1.toCacheableSystem)(payload.system, payload.caching) }, promptOrMessages), { tools: prepared.tools, providerOptions, stopWhen: (0, ai_1.stepCountIs)(20) }));
34
34
  if (payload.caching) {
35
35
  // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
36
36
  // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
@@ -1 +1 @@
1
- {"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDASyB;AAEzB,2BAA+C;AAE/C,mCAA8H;AAE9H,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAA2B,EAAE;IAC3E,OAAO,CAAO,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,EAAE;;QACjH,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;QACpI,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,OAAO,IAAA,mCAAiB,EAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ;gBACvC,CAAC,CAAC;oBACE,QAAQ,EAAE,IAAA,2BAAmB,EAC3B,MAAM,IAAA,qBAAa,EACjB,OAAO,CAAC,QAAQ,EAChB,IAAA,+BAAuB,EAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAC9G,EACD,OAAO,CAAC,OAAO,CAChB;iBACF;gBACH,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAE/B,mFAAmF;YACnF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS;gBACvC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,YAAY,EAAE,MAAA,OAAO,CAAC,SAAS,CAAC,YAAY,mCAAI,IAAI,EAAE,EAAE,EAAE;gBACtH,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAY,gCAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,MAAM,EAAE,IAAA,yBAAiB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,IACvD,gBAAgB,KACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,eAAe,EACf,QAAQ,EAAE,IAAA,gBAAW,EAAC,EAAE,CAAC,IACzB,CAAC;YAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,sFAAsF;gBACtF,uFAAuF;gBACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAA,MAAA,MAAM,CAAC,SAAS,0CAAE,KAAK,0CAAE,iBAAiB,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,IAAA,8BAAY,EAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,YAAY,EAAE,+CAA+C,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QACpI,CAAC,8BAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC;KACrD,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,0BAA0B,8BAEpC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { generateText, stepCountIs } from 'ai';\n\nimport { createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPrompt = (qpqConfig: QPQConfig): AiPromptActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — the model reasons before answering, within the token budget.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const result = await generateText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(10),\n });\n\n if (payload.caching) {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n console.log('AI prompt cache usage:', result.finalStep?.usage?.inputTokenDetails);\n }\n\n return actionResult({ text: result.text });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt execution.');\n }\n };\n};\n\nexport const getAiPromptActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.Prompt]: getProcessAiPrompt(qpqConfig),\n});\n"]}
1
+ {"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDASyB;AAEzB,2BAA+C;AAE/C,mCAA8H;AAE9H,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAA2B,EAAE;IAC3E,OAAO,CAAO,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,EAAE;;QACjH,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;QACpI,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,OAAO,IAAA,mCAAiB,EAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ;gBACvC,CAAC,CAAC;oBACE,QAAQ,EAAE,IAAA,2BAAmB,EAC3B,MAAM,IAAA,qBAAa,EACjB,OAAO,CAAC,QAAQ,EAChB,IAAA,+BAAuB,EAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAC9G,EACD,OAAO,CAAC,OAAO,CAChB;iBACF;gBACH,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAE/B,mFAAmF;YACnF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS;gBACvC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,YAAY,EAAE,MAAA,OAAO,CAAC,SAAS,CAAC,YAAY,mCAAI,IAAI,EAAE,EAAE,EAAE;gBACtH,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAY,gCAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,MAAM,EAAE,IAAA,yBAAiB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,IACvD,gBAAgB,KACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,eAAe,EACf,QAAQ,EAAE,IAAA,gBAAW,EAAC,EAAE,CAAC,IACzB,CAAC;YAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,sFAAsF;gBACtF,uFAAuF;gBACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAA,MAAA,MAAM,CAAC,SAAS,0CAAE,KAAK,0CAAE,iBAAiB,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,IAAA,8BAAY,EAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,YAAY,EAAE,+CAA+C,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QACpI,CAAC,8BAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC;KACrD,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,0BAA0B,8BAEpC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { generateText, stepCountIs } from 'ai';\n\nimport { createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPrompt = (qpqConfig: QPQConfig): AiPromptActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — the model reasons before answering, within the token budget.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const result = await generateText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(20),\n });\n\n if (payload.caching) {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n console.log('AI prompt cache usage:', result.finalStep?.usage?.inputTokenDetails);\n }\n\n return actionResult({ text: result.text });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt execution.');\n }\n };\n};\n\nexport const getAiPromptActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.Prompt]: getProcessAiPrompt(qpqConfig),\n});\n"]}
@@ -51,7 +51,10 @@ const getProcessAiPromptStream = (qpqConfig) => {
51
51
  const providerOptions = payload.reasoning
52
52
  ? { bedrock: { reasoningConfig: { type: 'enabled', budgetTokens: (_a = payload.reasoning.budgetTokens) !== null && _a !== void 0 ? _a : 4096 } } }
53
53
  : undefined;
54
- const { fullStream, finalStep } = (0, ai_1.streamText)(Object.assign(Object.assign({ model: prepared.model, system: (0, logic_1.toCacheableSystem)(payload.system, payload.caching) }, promptOrMessages), { tools: prepared.tools, providerOptions, stopWhen: (0, ai_1.stepCountIs)(10),
54
+ const { fullStream, finalStep } = (0, ai_1.streamText)(Object.assign(Object.assign({ model: prepared.model, system: (0, logic_1.toCacheableSystem)(payload.system, payload.caching) }, promptOrMessages), { tools: prepared.tools, providerOptions,
55
+ // Proof of concept for halt/resume: stop after every single step so the
56
+ // caller sees finishReason 'tool-calls' and must loop the turn back in.
57
+ stopWhen: (0, ai_1.stepCountIs)(20),
55
58
  // streamText swallows errors by default to keep the server alive — surface them to CloudWatch.
56
59
  onError: ({ error }) => {
57
60
  // todo yeild this out
@@ -78,10 +81,18 @@ const getProcessAiPromptStream = (qpqConfig) => {
78
81
  finally { if (e_1) throw e_1.error; }
79
82
  }
80
83
  if (payload.caching) {
81
- // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
82
- // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
83
- const step = yield __await(finalStep);
84
- console.log('AI prompt cache usage:', (_d = step.usage) === null || _d === void 0 ? void 0 : _d.inputTokenDetails);
84
+ try {
85
+ // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
86
+ // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
87
+ const step = yield __await(finalStep);
88
+ console.log('AI prompt cache usage:', (_d = step.usage) === null || _d === void 0 ? void 0 : _d.inputTokenDetails);
89
+ }
90
+ catch (error) {
91
+ // finalStep rejects (AI_NoOutputGeneratedError) when the stream errored before
92
+ // completing a step. The error part has already been streamed to the consumer;
93
+ // throwing here would replace that real error with the unhelpful wrapper.
94
+ console.warn('AI prompt cache usage unavailable:', (0, logic_1.toErrorMessage)(error));
95
+ }
85
96
  }
86
97
  });
87
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getAiPromptStreamActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptStreamActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { stepCountIs, streamText } from 'ai';\n\nimport { randomGuid } from '../../../awsLambdaUtils';\nimport { createDriveFileResolver, mapAiStreamPart, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPromptStream = (qpqConfig: QPQConfig): AiPromptStreamActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — thinking progress streams out as Reasoning* parts.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const { fullStream, finalStep } = streamText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(10),\n // streamText swallows errors by default to keep the server alive — surface them to CloudWatch.\n onError: ({ error }) => {\n // todo yeild this out\n console.error('AI prompt stream error:', error);\n },\n });\n\n const streamId = `ai-prompt-${Date.now()}-${randomGuid()}`;\n\n async function* aiStreamIterator(): AsyncIterableIterator<string> {\n for await (const part of fullStream) {\n yield JSON.stringify(mapAiStreamPart(part));\n }\n\n if (payload.caching) {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n const step = await finalStep;\n console.log('AI prompt cache usage:', step.usage?.inputTokenDetails);\n }\n }\n\n streamRegistry.register(streamId, aiStreamIterator());\n\n return actionResult({ id: streamId, encoding: 'json' as const });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt stream.');\n }\n };\n};\n\nexport const getAiPromptStreamActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.PromptStream]: getProcessAiPromptStream(qpqConfig),\n});\n"]}
1
+ {"version":3,"file":"getAiPromptStreamActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptStreamActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { stepCountIs, streamText } from 'ai';\n\nimport { randomGuid } from '../../../awsLambdaUtils';\nimport {\n createDriveFileResolver,\n mapAiStreamPart,\n prepareAiPromptCall,\n toCacheableMessages,\n toCacheableSystem,\n toErrorMessage,\n toSdkMessages,\n} from './logic';\n\nconst getProcessAiPromptStream = (qpqConfig: QPQConfig): AiPromptStreamActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — thinking progress streams out as Reasoning* parts.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const { fullStream, finalStep } = streamText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n // Proof of concept for halt/resume: stop after every single step so the\n // caller sees finishReason 'tool-calls' and must loop the turn back in.\n stopWhen: stepCountIs(20),\n // streamText swallows errors by default to keep the server alive — surface them to CloudWatch.\n onError: ({ error }) => {\n // todo yeild this out\n console.error('AI prompt stream error:', error);\n },\n });\n\n const streamId = `ai-prompt-${Date.now()}-${randomGuid()}`;\n\n async function* aiStreamIterator(): AsyncIterableIterator<string> {\n for await (const part of fullStream) {\n yield JSON.stringify(mapAiStreamPart(part));\n }\n\n if (payload.caching) {\n try {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n const step = await finalStep;\n console.log('AI prompt cache usage:', step.usage?.inputTokenDetails);\n } catch (error) {\n // finalStep rejects (AI_NoOutputGeneratedError) when the stream errored before\n // completing a step. The error part has already been streamed to the consumer;\n // throwing here would replace that real error with the unhelpful wrapper.\n console.warn('AI prompt cache usage unavailable:', toErrorMessage(error));\n }\n }\n }\n\n streamRegistry.register(streamId, aiStreamIterator());\n\n return actionResult({ id: streamId, encoding: 'json' as const });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt stream.');\n }\n };\n};\n\nexport const getAiPromptStreamActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.PromptStream]: getProcessAiPromptStream(qpqConfig),\n});\n"]}
@@ -15,9 +15,9 @@ const awsLambdaUtils_1 = require("../../../../awsLambdaUtils");
15
15
  // Reads drive-referenced files through the active file action processor, so the
16
16
  // same message works against S3 in production and local disk under the dev server.
17
17
  const createDriveFileResolver = (qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry) => {
18
- return (drive, filepath) => __awaiter(void 0, void 0, void 0, function* () {
18
+ return (drive, filepath, scope) => __awaiter(void 0, void 0, void 0, function* () {
19
19
  const resolveStory = (0, quidproquo_core_1.createImplementationRuntime)(qpqConfig, [`AI File: ${drive}/${filepath}`], () => new Date().toISOString(), awsLambdaUtils_1.randomGuid, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
20
- const storyResult = yield resolveStory(quidproquo_core_1.askFileReadBinaryContents, [drive, filepath]);
20
+ const storyResult = yield resolveStory(quidproquo_core_1.askFileReadBinaryContents, [drive, filepath, scope]);
21
21
  if (storyResult.error) {
22
22
  throw new Error(storyResult.error.errorText);
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createDriveFileResolver.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/createDriveFileResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDASyB;AAEzB,+DAAwD;AAGxD,gFAAgF;AAChF,mFAAmF;AAC5E,MAAM,uBAAuB,GAAG,CACrC,SAAoB,EACpB,OAAqB,EACrB,mBAAwC,EACxC,MAAiB,EACjB,mBAAwC,EACxC,cAA+B,EACV,EAAE;IACvB,OAAO,CAAO,KAAa,EAAE,QAAgB,EAAE,EAAE;QAC/C,MAAM,YAAY,GAAG,IAAA,6CAA2B,EAC9C,SAAS,EACT,CAAC,YAAY,KAAK,IAAI,QAAQ,EAAE,CAAC,EACjC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAC9B,2BAAU,EACV,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,mBAAmB,EACnB,cAAc,CACf,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2CAAyB,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAErF,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AA7BW,QAAA,uBAAuB,2BA6BlC","sourcesContent":["import {\n ActionProcessorList,\n askFileReadBinaryContents,\n createImplementationRuntime,\n DynamicModuleLoader,\n QPQConfig,\n QpqLogger,\n StorySession,\n StreamRegistry,\n} from 'quidproquo-core';\n\nimport { randomGuid } from '../../../../awsLambdaUtils';\nimport { AiDriveFileResolver } from './toSdkMessages';\n\n// Reads drive-referenced files through the active file action processor, so the\n// same message works against S3 in production and local disk under the dev server.\nexport const createDriveFileResolver = (\n qpqConfig: QPQConfig,\n session: StorySession,\n actionProcessorList: ActionProcessorList,\n logger: QpqLogger,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry?: StreamRegistry,\n): AiDriveFileResolver => {\n return async (drive: string, filepath: string) => {\n const resolveStory = createImplementationRuntime(\n qpqConfig,\n [`AI File: ${drive}/${filepath}`],\n () => new Date().toISOString(),\n randomGuid,\n session,\n actionProcessorList,\n logger,\n dynamicModuleLoader,\n streamRegistry,\n );\n\n const storyResult = await resolveStory(askFileReadBinaryContents, [drive, filepath]);\n\n if (storyResult.error) {\n throw new Error(storyResult.error.errorText);\n }\n\n return storyResult.result;\n };\n};\n"]}
1
+ {"version":3,"file":"createDriveFileResolver.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/createDriveFileResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDASyB;AAEzB,+DAAwD;AAGxD,gFAAgF;AAChF,mFAAmF;AAC5E,MAAM,uBAAuB,GAAG,CACrC,SAAoB,EACpB,OAAqB,EACrB,mBAAwC,EACxC,MAAiB,EACjB,mBAAwC,EACxC,cAA+B,EACV,EAAE;IACvB,OAAO,CAAO,KAAa,EAAE,QAAgB,EAAE,KAAc,EAAE,EAAE;QAC/D,MAAM,YAAY,GAAG,IAAA,6CAA2B,EAC9C,SAAS,EACT,CAAC,YAAY,KAAK,IAAI,QAAQ,EAAE,CAAC,EACjC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAC9B,2BAAU,EACV,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,mBAAmB,EACnB,cAAc,CACf,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2CAAyB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAE5F,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AA7BW,QAAA,uBAAuB,2BA6BlC","sourcesContent":["import {\n ActionProcessorList,\n askFileReadBinaryContents,\n createImplementationRuntime,\n DynamicModuleLoader,\n QPQConfig,\n QpqLogger,\n StorySession,\n StreamRegistry,\n} from 'quidproquo-core';\n\nimport { randomGuid } from '../../../../awsLambdaUtils';\nimport { AiDriveFileResolver } from './toSdkMessages';\n\n// Reads drive-referenced files through the active file action processor, so the\n// same message works against S3 in production and local disk under the dev server.\nexport const createDriveFileResolver = (\n qpqConfig: QPQConfig,\n session: StorySession,\n actionProcessorList: ActionProcessorList,\n logger: QpqLogger,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry?: StreamRegistry,\n): AiDriveFileResolver => {\n return async (drive: string, filepath: string, scope?: string) => {\n const resolveStory = createImplementationRuntime(\n qpqConfig,\n [`AI File: ${drive}/${filepath}`],\n () => new Date().toISOString(),\n randomGuid,\n session,\n actionProcessorList,\n logger,\n dynamicModuleLoader,\n streamRegistry,\n );\n\n const storyResult = await resolveStory(askFileReadBinaryContents, [drive, filepath, scope]);\n\n if (storyResult.error) {\n throw new Error(storyResult.error.errorText);\n }\n\n return storyResult.result;\n };\n};\n"]}
@@ -28,6 +28,7 @@ export * from './mapAiStreamToolInputStart';
28
28
  export * from './mapAiStreamToolOutputDenied';
29
29
  export * from './mapAiStreamToolResult';
30
30
  export * from './prepareAiPromptCall';
31
+ export * from './toAiStreamFinishReason';
31
32
  export * from './toAiStreamUsage';
32
33
  export * from './toCacheableMessages';
33
34
  export * from './toCacheableSystem';
@@ -44,6 +44,7 @@ __exportStar(require("./mapAiStreamToolInputStart"), exports);
44
44
  __exportStar(require("./mapAiStreamToolOutputDenied"), exports);
45
45
  __exportStar(require("./mapAiStreamToolResult"), exports);
46
46
  __exportStar(require("./prepareAiPromptCall"), exports);
47
+ __exportStar(require("./toAiStreamFinishReason"), exports);
47
48
  __exportStar(require("./toAiStreamUsage"), exports);
48
49
  __exportStar(require("./toCacheableMessages"), exports);
49
50
  __exportStar(require("./toCacheableSystem"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,sDAAoC;AACpC,qDAAmC;AACnC,wDAAsC;AACtC,sDAAoC;AACpC,0DAAwC;AACxC,oDAAkC;AAClC,mDAAiC;AACjC,8DAA4C;AAC5C,4DAA0C;AAC1C,iEAA+C;AAC/C,8DAA4C;AAC5C,0DAAwC;AACxC,qDAAmC;AACnC,yDAAuC;AACvC,yDAAuC;AACvC,uDAAqC;AACrC,yDAAuC;AACvC,mEAAiD;AACjD,oEAAkD;AAClD,wDAAsC;AACtC,yDAAuC;AACvC,8DAA4C;AAC5C,4DAA0C;AAC1C,8DAA4C;AAC5C,gEAA8C;AAC9C,0DAAwC;AACxC,wDAAsC;AACtC,oDAAkC;AAClC,wDAAsC;AACtC,sDAAoC;AACpC,mDAAiC;AACjC,kDAAgC","sourcesContent":["export * from './aiStreamPartMappers';\nexport * from './createDriveFileResolver';\nexport * from './mapAiStreamAbort';\nexport * from './mapAiStreamCustom';\nexport * from './mapAiStreamError';\nexport * from './mapAiStreamFilePart';\nexport * from './mapAiStreamFinish';\nexport * from './mapAiStreamFinishStep';\nexport * from './mapAiStreamPart';\nexport * from './mapAiStreamRaw';\nexport * from './mapAiStreamReasoningDelta';\nexport * from './mapAiStreamReasoningEnd';\nexport * from './mapAiStreamReasoningFilePart';\nexport * from './mapAiStreamReasoningStart';\nexport * from './mapAiStreamSourcePart';\nexport * from './mapAiStreamStart';\nexport * from './mapAiStreamStartStep';\nexport * from './mapAiStreamTextDelta';\nexport * from './mapAiStreamTextEnd';\nexport * from './mapAiStreamTextStart';\nexport * from './mapAiStreamToolApprovalRequest';\nexport * from './mapAiStreamToolApprovalResponse';\nexport * from './mapAiStreamToolCall';\nexport * from './mapAiStreamToolError';\nexport * from './mapAiStreamToolInputDelta';\nexport * from './mapAiStreamToolInputEnd';\nexport * from './mapAiStreamToolInputStart';\nexport * from './mapAiStreamToolOutputDenied';\nexport * from './mapAiStreamToolResult';\nexport * from './prepareAiPromptCall';\nexport * from './toAiStreamUsage';\nexport * from './toCacheableMessages';\nexport * from './toCacheableSystem';\nexport * from './toErrorMessage';\nexport * from './toSdkMessages';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,sDAAoC;AACpC,qDAAmC;AACnC,wDAAsC;AACtC,sDAAoC;AACpC,0DAAwC;AACxC,oDAAkC;AAClC,mDAAiC;AACjC,8DAA4C;AAC5C,4DAA0C;AAC1C,iEAA+C;AAC/C,8DAA4C;AAC5C,0DAAwC;AACxC,qDAAmC;AACnC,yDAAuC;AACvC,yDAAuC;AACvC,uDAAqC;AACrC,yDAAuC;AACvC,mEAAiD;AACjD,oEAAkD;AAClD,wDAAsC;AACtC,yDAAuC;AACvC,8DAA4C;AAC5C,4DAA0C;AAC1C,8DAA4C;AAC5C,gEAA8C;AAC9C,0DAAwC;AACxC,wDAAsC;AACtC,2DAAyC;AACzC,oDAAkC;AAClC,wDAAsC;AACtC,sDAAoC;AACpC,mDAAiC;AACjC,kDAAgC","sourcesContent":["export * from './aiStreamPartMappers';\nexport * from './createDriveFileResolver';\nexport * from './mapAiStreamAbort';\nexport * from './mapAiStreamCustom';\nexport * from './mapAiStreamError';\nexport * from './mapAiStreamFilePart';\nexport * from './mapAiStreamFinish';\nexport * from './mapAiStreamFinishStep';\nexport * from './mapAiStreamPart';\nexport * from './mapAiStreamRaw';\nexport * from './mapAiStreamReasoningDelta';\nexport * from './mapAiStreamReasoningEnd';\nexport * from './mapAiStreamReasoningFilePart';\nexport * from './mapAiStreamReasoningStart';\nexport * from './mapAiStreamSourcePart';\nexport * from './mapAiStreamStart';\nexport * from './mapAiStreamStartStep';\nexport * from './mapAiStreamTextDelta';\nexport * from './mapAiStreamTextEnd';\nexport * from './mapAiStreamTextStart';\nexport * from './mapAiStreamToolApprovalRequest';\nexport * from './mapAiStreamToolApprovalResponse';\nexport * from './mapAiStreamToolCall';\nexport * from './mapAiStreamToolError';\nexport * from './mapAiStreamToolInputDelta';\nexport * from './mapAiStreamToolInputEnd';\nexport * from './mapAiStreamToolInputStart';\nexport * from './mapAiStreamToolOutputDenied';\nexport * from './mapAiStreamToolResult';\nexport * from './prepareAiPromptCall';\nexport * from './toAiStreamFinishReason';\nexport * from './toAiStreamUsage';\nexport * from './toCacheableMessages';\nexport * from './toCacheableSystem';\nexport * from './toErrorMessage';\nexport * from './toSdkMessages';\n"]}
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mapAiStreamFinish = void 0;
4
4
  const quidproquo_core_1 = require("quidproquo-core");
5
+ const toAiStreamFinishReason_1 = require("./toAiStreamFinishReason");
5
6
  const toAiStreamUsage_1 = require("./toAiStreamUsage");
6
7
  const mapAiStreamFinish = (part) => ({
7
8
  type: quidproquo_core_1.AiStreamPartType.Finish,
8
- finishReason: part.finishReason,
9
+ finishReason: (0, toAiStreamFinishReason_1.toAiStreamFinishReason)(part.finishReason),
9
10
  usage: (0, toAiStreamUsage_1.toAiStreamUsage)(part.totalUsage),
10
11
  });
11
12
  exports.mapAiStreamFinish = mapAiStreamFinish;
@@ -1 +1 @@
1
- {"version":3,"file":"mapAiStreamFinish.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/mapAiStreamFinish.ts"],"names":[],"mappings":";;;AAAA,qDAAmE;AAGnE,uDAAoD;AAE7C,MAAM,iBAAiB,GAAG,CAAC,IAAqC,EAAkB,EAAE,CAAC,CAAC;IAC3F,IAAI,EAAE,kCAAgB,CAAC,MAAM;IAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;IAC/B,KAAK,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC,UAAU,CAAC;CACxC,CAAC,CAAC;AAJU,QAAA,iBAAiB,qBAI3B","sourcesContent":["import { AiStreamFinish, AiStreamPartType } from 'quidproquo-core';\n\nimport { AiSdkStreamPartOfType } from '../types';\nimport { toAiStreamUsage } from './toAiStreamUsage';\n\nexport const mapAiStreamFinish = (part: AiSdkStreamPartOfType<'finish'>): AiStreamFinish => ({\n type: AiStreamPartType.Finish,\n finishReason: part.finishReason,\n usage: toAiStreamUsage(part.totalUsage),\n});\n"]}
1
+ {"version":3,"file":"mapAiStreamFinish.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/mapAiStreamFinish.ts"],"names":[],"mappings":";;;AAAA,qDAAmE;AAGnE,qEAAkE;AAClE,uDAAoD;AAE7C,MAAM,iBAAiB,GAAG,CAAC,IAAqC,EAAkB,EAAE,CAAC,CAAC;IAC3F,IAAI,EAAE,kCAAgB,CAAC,MAAM;IAC7B,YAAY,EAAE,IAAA,+CAAsB,EAAC,IAAI,CAAC,YAAY,CAAC;IACvD,KAAK,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC,UAAU,CAAC;CACxC,CAAC,CAAC;AAJU,QAAA,iBAAiB,qBAI3B","sourcesContent":["import { AiStreamFinish, AiStreamPartType } from 'quidproquo-core';\n\nimport { AiSdkStreamPartOfType } from '../types';\nimport { toAiStreamFinishReason } from './toAiStreamFinishReason';\nimport { toAiStreamUsage } from './toAiStreamUsage';\n\nexport const mapAiStreamFinish = (part: AiSdkStreamPartOfType<'finish'>): AiStreamFinish => ({\n type: AiStreamPartType.Finish,\n finishReason: toAiStreamFinishReason(part.finishReason),\n usage: toAiStreamUsage(part.totalUsage),\n});\n"]}
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mapAiStreamFinishStep = void 0;
4
4
  const quidproquo_core_1 = require("quidproquo-core");
5
+ const toAiStreamFinishReason_1 = require("./toAiStreamFinishReason");
5
6
  const toAiStreamUsage_1 = require("./toAiStreamUsage");
6
7
  const mapAiStreamFinishStep = (part) => ({
7
8
  type: quidproquo_core_1.AiStreamPartType.FinishStep,
8
- finishReason: part.finishReason,
9
+ finishReason: (0, toAiStreamFinishReason_1.toAiStreamFinishReason)(part.finishReason),
9
10
  usage: (0, toAiStreamUsage_1.toAiStreamUsage)(part.usage),
10
11
  });
11
12
  exports.mapAiStreamFinishStep = mapAiStreamFinishStep;
@@ -1 +1 @@
1
- {"version":3,"file":"mapAiStreamFinishStep.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.ts"],"names":[],"mappings":";;;AAAA,qDAAuE;AAGvE,uDAAoD;AAE7C,MAAM,qBAAqB,GAAG,CAAC,IAA0C,EAAsB,EAAE,CAAC,CAAC;IACxG,IAAI,EAAE,kCAAgB,CAAC,UAAU;IACjC,YAAY,EAAE,IAAI,CAAC,YAAY;IAC/B,KAAK,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC;AAJU,QAAA,qBAAqB,yBAI/B","sourcesContent":["import { AiStreamFinishStep, AiStreamPartType } from 'quidproquo-core';\n\nimport { AiSdkStreamPartOfType } from '../types';\nimport { toAiStreamUsage } from './toAiStreamUsage';\n\nexport const mapAiStreamFinishStep = (part: AiSdkStreamPartOfType<'finish-step'>): AiStreamFinishStep => ({\n type: AiStreamPartType.FinishStep,\n finishReason: part.finishReason,\n usage: toAiStreamUsage(part.usage),\n});\n"]}
1
+ {"version":3,"file":"mapAiStreamFinishStep.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.ts"],"names":[],"mappings":";;;AAAA,qDAAuE;AAGvE,qEAAkE;AAClE,uDAAoD;AAE7C,MAAM,qBAAqB,GAAG,CAAC,IAA0C,EAAsB,EAAE,CAAC,CAAC;IACxG,IAAI,EAAE,kCAAgB,CAAC,UAAU;IACjC,YAAY,EAAE,IAAA,+CAAsB,EAAC,IAAI,CAAC,YAAY,CAAC;IACvD,KAAK,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC;AAJU,QAAA,qBAAqB,yBAI/B","sourcesContent":["import { AiStreamFinishStep, AiStreamPartType } from 'quidproquo-core';\n\nimport { AiSdkStreamPartOfType } from '../types';\nimport { toAiStreamFinishReason } from './toAiStreamFinishReason';\nimport { toAiStreamUsage } from './toAiStreamUsage';\n\nexport const mapAiStreamFinishStep = (part: AiSdkStreamPartOfType<'finish-step'>): AiStreamFinishStep => ({\n type: AiStreamPartType.FinishStep,\n finishReason: toAiStreamFinishReason(part.finishReason),\n usage: toAiStreamUsage(part.usage),\n});\n"]}
@@ -30,19 +30,17 @@ const prepareAiPromptCall = (qpqConfig, payload, session, actionProcessorList, l
30
30
  if (!aiConfig) {
31
31
  return { error: { type: quidproquo_core_1.ErrorTypeEnum.NotFound, message: `AI config not found: ${payload.aiName}` } };
32
32
  }
33
+ // Runs the tool's inline-function executor as its own story.
34
+ const createToolExecute = (toolName, executor) => (args) => __awaiter(void 0, void 0, void 0, function* () {
35
+ const resolveStory = (0, quidproquo_core_1.createImplementationRuntime)(qpqConfig, [`AI Tool: ${toolName}`], () => new Date().toISOString(), awsLambdaUtils_1.randomGuid, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
36
+ const storyResult = yield resolveStory(quidproquo_core_1.askInlineFunctionExecute, [executor, args]);
37
+ if (storyResult.error) {
38
+ throw new Error(storyResult.error.errorText);
39
+ }
40
+ return storyResult.result;
41
+ });
33
42
  for (const toolDef of aiConfig.tools) {
34
- aiTools[toolDef.name] = {
35
- description: toolDef.description,
36
- inputSchema: (0, ai_1.jsonSchema)(toolDef.inputSchema),
37
- execute: (args) => __awaiter(void 0, void 0, void 0, function* () {
38
- const resolveStory = (0, quidproquo_core_1.createImplementationRuntime)(qpqConfig, [`AI Tool: ${toolDef.name}`], () => new Date().toISOString(), awsLambdaUtils_1.randomGuid, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
39
- const storyResult = yield resolveStory(quidproquo_core_1.askInlineFunctionExecute, [toolDef.executor, args]);
40
- if (storyResult.error) {
41
- throw new Error(storyResult.error.errorText);
42
- }
43
- return storyResult.result;
44
- }),
45
- };
43
+ aiTools[toolDef.name] = Object.assign({ description: toolDef.description, inputSchema: (0, ai_1.jsonSchema)(toolDef.inputSchema) }, (toolDef.executor ? { execute: createToolExecute(toolDef.name, toolDef.executor) } : {}));
46
44
  }
47
45
  }
48
46
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"prepareAiPromptCall.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/prepareAiPromptCall.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA0D;AAC1D,qDAYyB;AAEzB,2BAAgC;AAChC,2DAA6D;AAE7D,+DAAwD;AACxD,8CAAgD;AAazC,MAAM,mBAAmB,GAAG,CACjC,SAAoB,EACpB,OAAmC,EACnC,OAAqB,EACrB,mBAAwC,EACxC,MAAiB,EACjB,mBAAwC,EACxC,cAA+B,EACJ,EAAE;IAC7B,MAAM,MAAM,GAAG,yCAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAA,oCAAmB,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEhD,MAAM,cAAc,GAAG,4BAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,+BAAa,CAAC,cAAc,EAAE,OAAO,EAAE,yBAAyB,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;IAC9G,CAAC;IAED,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,8BAAY,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,+BAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,wBAAwB,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;QACxG,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,WAAW,EAAE,IAAA,eAAU,EAAC,OAAO,CAAC,WAAW,CAAC;gBAC5C,OAAO,EAAE,CAAO,IAAa,EAAE,EAAE;oBAC/B,MAAM,YAAY,GAAG,IAAA,6CAA2B,EAC9C,SAAS,EACT,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,EAC5B,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAC9B,2BAAU,EACV,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,mBAAmB,EACnB,cAAc,CACf,CAAC;oBAEF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,0CAAwB,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;oBAE3F,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;wBACtB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC/C,CAAC;oBAED,OAAO,WAAW,CAAC,MAAM,CAAC;gBAC5B,CAAC,CAAA;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC,CAAC;AA5DW,QAAA,mBAAmB,uBA4D9B","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n ActionProcessorList,\n AiModel,\n askInlineFunctionExecute,\n createImplementationRuntime,\n DynamicModuleLoader,\n ErrorTypeEnum,\n QPQConfig,\n qpqCoreUtils,\n QpqLogger,\n StorySession,\n StreamRegistry,\n} from 'quidproquo-core';\n\nimport { jsonSchema } from 'ai';\nimport { createAmazonBedrock } from '@ai-sdk/amazon-bedrock';\n\nimport { randomGuid } from '../../../../awsLambdaUtils';\nimport { bedrockModelMap } from '../aiModelMap';\n\nexport interface PrepareAiPromptCallPayload {\n model: AiModel;\n aiName?: string;\n}\n\ntype BedrockProvider = ReturnType<typeof createAmazonBedrock>;\ntype BedrockLanguageModel = ReturnType<BedrockProvider>;\n\nexport type PrepareAiPromptCallResult =\n { error: { type: ErrorTypeEnum; message: string } } | { model: BedrockLanguageModel; tools: Record<string, any> | undefined };\n\nexport const prepareAiPromptCall = (\n qpqConfig: QPQConfig,\n payload: PrepareAiPromptCallPayload,\n session: StorySession,\n actionProcessorList: ActionProcessorList,\n logger: QpqLogger,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry?: StreamRegistry,\n): PrepareAiPromptCallResult => {\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n const bedrock = createAmazonBedrock({ region });\n\n const bedrockModelId = bedrockModelMap[payload.model];\n if (!bedrockModelId) {\n return { error: { type: ErrorTypeEnum.NotImplemented, message: `Unsupported AI model: ${payload.model}` } };\n }\n\n const aiTools: Record<string, any> = {};\n\n if (payload.aiName) {\n const aiConfigs = qpqCoreUtils.getAllAiConfigs(qpqConfig);\n const aiConfig = aiConfigs.find((c) => c.aiName === payload.aiName);\n\n if (!aiConfig) {\n return { error: { type: ErrorTypeEnum.NotFound, message: `AI config not found: ${payload.aiName}` } };\n }\n\n for (const toolDef of aiConfig.tools) {\n aiTools[toolDef.name] = {\n description: toolDef.description,\n inputSchema: jsonSchema(toolDef.inputSchema),\n execute: async (args: unknown) => {\n const resolveStory = createImplementationRuntime(\n qpqConfig,\n [`AI Tool: ${toolDef.name}`],\n () => new Date().toISOString(),\n randomGuid,\n session,\n actionProcessorList,\n logger,\n dynamicModuleLoader,\n streamRegistry,\n );\n\n const storyResult = await resolveStory(askInlineFunctionExecute, [toolDef.executor, args]);\n\n if (storyResult.error) {\n throw new Error(storyResult.error.errorText);\n }\n\n return storyResult.result;\n },\n };\n }\n }\n\n return {\n model: bedrock(bedrockModelId),\n tools: Object.keys(aiTools).length > 0 ? aiTools : undefined,\n };\n};\n"]}
1
+ {"version":3,"file":"prepareAiPromptCall.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/prepareAiPromptCall.ts"],"names":[],"mappings":"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","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n ActionProcessorList,\n AiModel,\n askInlineFunctionExecute,\n createImplementationRuntime,\n DynamicModuleLoader,\n ErrorTypeEnum,\n QPQConfig,\n qpqCoreUtils,\n QpqLogger,\n StorySession,\n StreamRegistry,\n} from 'quidproquo-core';\n\nimport { jsonSchema } from 'ai';\nimport { createAmazonBedrock } from '@ai-sdk/amazon-bedrock';\n\nimport { randomGuid } from '../../../../awsLambdaUtils';\nimport { bedrockModelMap } from '../aiModelMap';\n\nexport interface PrepareAiPromptCallPayload {\n model: AiModel;\n aiName?: string;\n}\n\ntype BedrockProvider = ReturnType<typeof createAmazonBedrock>;\ntype BedrockLanguageModel = ReturnType<BedrockProvider>;\n\nexport type PrepareAiPromptCallResult =\n { error: { type: ErrorTypeEnum; message: string } } | { model: BedrockLanguageModel; tools: Record<string, any> | undefined };\n\nexport const prepareAiPromptCall = (\n qpqConfig: QPQConfig,\n payload: PrepareAiPromptCallPayload,\n session: StorySession,\n actionProcessorList: ActionProcessorList,\n logger: QpqLogger,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry?: StreamRegistry,\n): PrepareAiPromptCallResult => {\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n const bedrock = createAmazonBedrock({ region });\n\n const bedrockModelId = bedrockModelMap[payload.model];\n if (!bedrockModelId) {\n return { error: { type: ErrorTypeEnum.NotImplemented, message: `Unsupported AI model: ${payload.model}` } };\n }\n\n const aiTools: Record<string, any> = {};\n\n if (payload.aiName) {\n const aiConfigs = qpqCoreUtils.getAllAiConfigs(qpqConfig);\n const aiConfig = aiConfigs.find((c) => c.aiName === payload.aiName);\n\n if (!aiConfig) {\n return { error: { type: ErrorTypeEnum.NotFound, message: `AI config not found: ${payload.aiName}` } };\n }\n\n // Runs the tool's inline-function executor as its own story.\n const createToolExecute = (toolName: string, executor: string) => async (args: unknown) => {\n const resolveStory = createImplementationRuntime(\n qpqConfig,\n [`AI Tool: ${toolName}`],\n () => new Date().toISOString(),\n randomGuid,\n session,\n actionProcessorList,\n logger,\n dynamicModuleLoader,\n streamRegistry,\n );\n\n const storyResult = await resolveStory(askInlineFunctionExecute, [executor, args]);\n\n if (storyResult.error) {\n throw new Error(storyResult.error.errorText);\n }\n\n return storyResult.result;\n };\n\n for (const toolDef of aiConfig.tools) {\n aiTools[toolDef.name] = {\n description: toolDef.description,\n inputSchema: jsonSchema(toolDef.inputSchema),\n // A tool without an executor is client-side: the AI SDK emits the tool call\n // but has nothing to run, so the loop halts with the call unresolved and the\n // client answers it out-of-band (see AiToolDefinition.executor).\n ...(toolDef.executor ? { execute: createToolExecute(toolDef.name, toolDef.executor) } : {}),\n };\n }\n }\n\n return {\n model: bedrock(bedrockModelId),\n tools: Object.keys(aiTools).length > 0 ? aiTools : undefined,\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import { AiStreamFinishReasonEnum } from 'quidproquo-core';
2
+ export declare const toAiStreamFinishReason: (finishReason: string) => AiStreamFinishReasonEnum;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toAiStreamFinishReason = void 0;
4
+ const quidproquo_core_1 = require("quidproquo-core");
5
+ const knownFinishReasons = new Set(Object.values(quidproquo_core_1.AiStreamFinishReasonEnum));
6
+ // The AI SDK's FinishReason strings map 1:1 onto the enum today; anything a future SDK version
7
+ // adds degrades to `unknown` instead of leaking an untyped string into core's typed parts.
8
+ const toAiStreamFinishReason = (finishReason) => knownFinishReasons.has(finishReason) ? finishReason : quidproquo_core_1.AiStreamFinishReasonEnum.unknown;
9
+ exports.toAiStreamFinishReason = toAiStreamFinishReason;
10
+ //# sourceMappingURL=toAiStreamFinishReason.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toAiStreamFinishReason.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toAiStreamFinishReason.ts"],"names":[],"mappings":";;;AAAA,qDAA2D;AAE3D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,0CAAwB,CAAC,CAAC,CAAC;AAEpF,+FAA+F;AAC/F,2FAA2F;AACpF,MAAM,sBAAsB,GAAG,CAAC,YAAoB,EAA4B,EAAE,CACvF,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAE,YAAyC,CAAC,CAAC,CAAC,0CAAwB,CAAC,OAAO,CAAC;AAD1G,QAAA,sBAAsB,0BACoF","sourcesContent":["import { AiStreamFinishReasonEnum } from 'quidproquo-core';\n\nconst knownFinishReasons = new Set<string>(Object.values(AiStreamFinishReasonEnum));\n\n// The AI SDK's FinishReason strings map 1:1 onto the enum today; anything a future SDK version\n// adds degrades to `unknown` instead of leaking an untyped string into core's typed parts.\nexport const toAiStreamFinishReason = (finishReason: string): AiStreamFinishReasonEnum =>\n knownFinishReasons.has(finishReason) ? (finishReason as AiStreamFinishReasonEnum) : AiStreamFinishReasonEnum.unknown;\n"]}
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.toCacheableMessages = void 0;
4
- // Marks the newest message as a cache point so the next call in the same conversation can read
5
- // everything up to here from cache. See toCacheableSystem for the fixed system/tools cache point
6
- // this is meant to be used alongside Bedrock's cache lookback only covers a limited number of
7
- // recent content blocks, so long conversations still need both.
4
+ const withCachePoint = (message) => (Object.assign(Object.assign({}, message), { providerOptions: Object.assign(Object.assign({}, message.providerOptions), { bedrock: { cachePoint: { type: 'default' } } }) }));
5
+ // Marks the newest TWO messages as cache points so the next call in the same conversation can
6
+ // read everything up to here from cache. The last message alone is not enough: callers that
7
+ // resume a halted turn append a transport-only continuation message each round, so the boundary
8
+ // after it never matches again. The second-to-last boundary (the newest durable message) is the
9
+ // one a resumed round's prefix actually re-sends byte-identically. See toCacheableSystem for the
10
+ // fixed system/tools cache point this is meant to be used alongside — Bedrock's cache lookback
11
+ // only covers a limited number of recent content blocks, so long conversations still need both.
8
12
  const toCacheableMessages = (messages, caching) => {
9
13
  if (!caching || messages.length === 0) {
10
14
  return messages;
11
15
  }
12
- const lastMessage = messages[messages.length - 1];
13
- return [
14
- ...messages.slice(0, -1),
15
- Object.assign(Object.assign({}, lastMessage), { providerOptions: Object.assign(Object.assign({}, lastMessage.providerOptions), { bedrock: { cachePoint: { type: 'default' } } }) }),
16
- ];
16
+ return messages.map((message, index) => (index >= messages.length - 2 ? withCachePoint(message) : message));
17
17
  };
18
18
  exports.toCacheableMessages = toCacheableMessages;
19
19
  //# sourceMappingURL=toCacheableMessages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toCacheableMessages.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toCacheableMessages.ts"],"names":[],"mappings":";;;AAEA,+FAA+F;AAC/F,iGAAiG;AACjG,gGAAgG;AAChG,gEAAgE;AACzD,MAAM,mBAAmB,GAAG,CAAC,QAAwB,EAAE,OAA4B,EAAkB,EAAE;IAC5G,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wCAEnB,WAAW,KACd,eAAe,kCACV,WAAW,CAAC,eAAe,KAC9B,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;KAGjD,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,mBAAmB,uBAiB9B","sourcesContent":["import type { ModelMessage } from 'ai';\n\n// Marks the newest message as a cache point so the next call in the same conversation can read\n// everything up to here from cache. See toCacheableSystem for the fixed system/tools cache point\n// this is meant to be used alongside — Bedrock's cache lookback only covers a limited number of\n// recent content blocks, so long conversations still need both.\nexport const toCacheableMessages = (messages: ModelMessage[], caching: boolean | undefined): ModelMessage[] => {\n if (!caching || messages.length === 0) {\n return messages;\n }\n\n const lastMessage = messages[messages.length - 1];\n\n return [\n ...messages.slice(0, -1),\n {\n ...lastMessage,\n providerOptions: {\n ...lastMessage.providerOptions,\n bedrock: { cachePoint: { type: 'default' } },\n },\n },\n ];\n};\n"]}
1
+ {"version":3,"file":"toCacheableMessages.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toCacheableMessages.ts"],"names":[],"mappings":";;;AAEA,MAAM,cAAc,GAAG,CAAC,OAAqB,EAAgB,EAAE,CAAC,iCAC3D,OAAO,KACV,eAAe,kCACV,OAAO,CAAC,eAAe,KAC1B,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,OAE9C,CAAC;AAEH,8FAA8F;AAC9F,4FAA4F;AAC5F,gGAAgG;AAChG,gGAAgG;AAChG,iGAAiG;AACjG,+FAA+F;AAC/F,gGAAgG;AACzF,MAAM,mBAAmB,GAAG,CAAC,QAAwB,EAAE,OAA4B,EAAkB,EAAE;IAC5G,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9G,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B","sourcesContent":["import type { ModelMessage } from 'ai';\n\nconst withCachePoint = (message: ModelMessage): ModelMessage => ({\n ...message,\n providerOptions: {\n ...message.providerOptions,\n bedrock: { cachePoint: { type: 'default' } },\n },\n});\n\n// Marks the newest TWO messages as cache points so the next call in the same conversation can\n// read everything up to here from cache. The last message alone is not enough: callers that\n// resume a halted turn append a transport-only continuation message each round, so the boundary\n// after it never matches again. The second-to-last boundary (the newest durable message) is the\n// one a resumed round's prefix actually re-sends byte-identically. See toCacheableSystem for the\n// fixed system/tools cache point this is meant to be used alongside — Bedrock's cache lookback\n// only covers a limited number of recent content blocks, so long conversations still need both.\nexport const toCacheableMessages = (messages: ModelMessage[], caching: boolean | undefined): ModelMessage[] => {\n if (!caching || messages.length === 0) {\n return messages;\n }\n\n return messages.map((message, index) => (index >= messages.length - 2 ? withCachePoint(message) : message));\n};\n"]}
@@ -1,4 +1,4 @@
1
1
  import { AiMessage, QPQBinaryData } from 'quidproquo-core';
2
2
  import type { ModelMessage } from 'ai';
3
- export type AiDriveFileResolver = (drive: string, filepath: string) => Promise<QPQBinaryData>;
3
+ export type AiDriveFileResolver = (drive: string, filepath: string, scope?: string) => Promise<QPQBinaryData>;
4
4
  export declare const toSdkMessages: (messages: AiMessage[], resolveDriveFile: AiDriveFileResolver) => Promise<ModelMessage[]>;
@@ -20,7 +20,7 @@ const mapFilePart = (part, resolveDriveFile) => __awaiter(void 0, void 0, void 0
20
20
  filename: part.filename,
21
21
  };
22
22
  }
23
- const binary = yield resolveDriveFile(part.drive, part.filepath);
23
+ const binary = yield resolveDriveFile(part.drive, part.filepath, part.scope);
24
24
  return {
25
25
  type: 'file',
26
26
  data: binary.base64Data,
@@ -1 +1 @@
1
- {"version":3,"file":"toSdkMessages.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toSdkMessages.ts"],"names":[],"mappings":";;;;;;;;;;;;AAgBA,MAAM,WAAW,GAAG,CAAO,IAAgB,EAAE,gBAAqC,EAAE,EAAE;;IACpF,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEjE,OAAO;QACL,IAAI,EAAE,MAAe;QACrB,IAAI,EAAE,MAAM,CAAC,UAAU;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,MAAA,IAAI,CAAC,QAAQ,mCAAI,MAAM,CAAC,QAAQ;KAC3C,CAAC;AACJ,CAAC,CAAA,CAAC;AAEF,MAAM,WAAW,GAAG,CAAO,IAAuB,EAAE,gBAAqC,EAAE,EAAE;IAC3F,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAC7C,CAAC,CAAA,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAO,IAA4B,EAAE,gBAAqC,EAAE,EAAE;IACrG,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACpD,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC7C,KAAK,WAAW;YACd,OAAO;gBACL,IAAI,EAAE,WAAoB;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;QACJ,KAAK,WAAW;YACd,OAAO;gBACL,IAAI,EAAE,WAAoB;gBAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,eAAe,EAAE,IAAI,CAAC,eAAwB;aAC/C,CAAC;IACN,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAsB,EAAE,EAAE;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;QACzB,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;YACrD,CAAC,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAe,EAAE;QAChE,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;YAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,KAAK,EAAE,IAAI,CAAC,MAAe,EAAE,CAAC;IAE7D,OAAO;QACL,IAAI,EAAE,aAAsB;QAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM;KACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAO,OAAsB,EAAE,gBAAqC,EAA6B,EAAE;IACxH,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1H,CAAC,CAAA,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAO,OAA2B,EAAE,gBAAqC,EAAkC,EAAE;IACvI,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;AACpI,CAAC,CAAA,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAoB,EAAE,CAAC,CAAC;IACpE,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;CAC5C,CAAC,CAAC;AAEI,MAAM,aAAa,GAAG,CAAC,QAAqB,EAAE,gBAAqC,EAA2B,EAAE,CACrH,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;IACvB,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACnD,KAAK,WAAW;YACd,OAAO,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACxD,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CAAC,CACH,CAAC;AAZS,QAAA,aAAa,iBAYtB","sourcesContent":["import {\n AiAssistantMessage,\n AiAssistantMessagePart,\n AiFilePart,\n AiMessage,\n AiToolMessage,\n AiToolResultPart,\n AiUserMessage,\n AiUserMessagePart,\n QPQBinaryData,\n} from 'quidproquo-core';\n\nimport type { AssistantModelMessage, ModelMessage, ToolModelMessage, UserModelMessage } from 'ai';\n\nexport type AiDriveFileResolver = (drive: string, filepath: string) => Promise<QPQBinaryData>;\n\nconst mapFilePart = async (part: AiFilePart, resolveDriveFile: AiDriveFileResolver) => {\n if ('url' in part) {\n return {\n type: 'file' as const,\n data: new URL(part.url),\n mediaType: part.mediaType,\n filename: part.filename,\n };\n }\n\n const binary = await resolveDriveFile(part.drive, part.filepath);\n\n return {\n type: 'file' as const,\n data: binary.base64Data,\n mediaType: part.mediaType,\n filename: part.filename ?? binary.filename,\n };\n};\n\nconst mapUserPart = async (part: AiUserMessagePart, resolveDriveFile: AiDriveFileResolver) => {\n if (part.type === 'text') {\n return { type: 'text' as const, text: part.text };\n }\n\n return mapFilePart(part, resolveDriveFile);\n};\n\nconst mapAssistantPart = async (part: AiAssistantMessagePart, resolveDriveFile: AiDriveFileResolver) => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, text: part.text };\n case 'file':\n return mapFilePart(part, resolveDriveFile);\n case 'tool-call':\n return {\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n };\n case 'reasoning':\n return {\n type: 'reasoning' as const,\n text: part.text,\n providerOptions: part.providerOptions as never,\n };\n }\n};\n\nconst mapToolResult = (part: AiToolResultPart) => {\n const output = part.isError\n ? typeof part.output === 'string'\n ? { type: 'error-text' as const, value: part.output }\n : { type: 'error-json' as const, value: part.output as never }\n : typeof part.output === 'string'\n ? { type: 'text' as const, value: part.output }\n : { type: 'json' as const, value: part.output as never };\n\n return {\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n };\n};\n\nconst mapUserMessage = async (message: AiUserMessage, resolveDriveFile: AiDriveFileResolver): Promise<UserModelMessage> => {\n if (typeof message.content === 'string') {\n return { role: 'user', content: message.content };\n }\n\n return { role: 'user', content: await Promise.all(message.content.map((part) => mapUserPart(part, resolveDriveFile))) };\n};\n\nconst mapAssistantMessage = async (message: AiAssistantMessage, resolveDriveFile: AiDriveFileResolver): Promise<AssistantModelMessage> => {\n if (typeof message.content === 'string') {\n return { role: 'assistant', content: message.content };\n }\n\n return { role: 'assistant', content: await Promise.all(message.content.map((part) => mapAssistantPart(part, resolveDriveFile))) };\n};\n\nconst mapToolMessage = (message: AiToolMessage): ToolModelMessage => ({\n role: 'tool',\n content: message.content.map(mapToolResult),\n});\n\nexport const toSdkMessages = (messages: AiMessage[], resolveDriveFile: AiDriveFileResolver): Promise<ModelMessage[]> =>\n Promise.all(\n messages.map((message) => {\n switch (message.role) {\n case 'user':\n return mapUserMessage(message, resolveDriveFile);\n case 'assistant':\n return mapAssistantMessage(message, resolveDriveFile);\n case 'tool':\n return mapToolMessage(message);\n }\n }),\n );\n"]}
1
+ {"version":3,"file":"toSdkMessages.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toSdkMessages.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AiAssistantMessage,\n AiAssistantMessagePart,\n AiFilePart,\n AiMessage,\n AiToolMessage,\n AiToolResultPart,\n AiUserMessage,\n AiUserMessagePart,\n QPQBinaryData,\n} from 'quidproquo-core';\n\nimport type { AssistantModelMessage, ModelMessage, ToolModelMessage, UserModelMessage } from 'ai';\n\nexport type AiDriveFileResolver = (drive: string, filepath: string, scope?: string) => Promise<QPQBinaryData>;\n\nconst mapFilePart = async (part: AiFilePart, resolveDriveFile: AiDriveFileResolver) => {\n if ('url' in part) {\n return {\n type: 'file' as const,\n data: new URL(part.url),\n mediaType: part.mediaType,\n filename: part.filename,\n };\n }\n\n const binary = await resolveDriveFile(part.drive, part.filepath, part.scope);\n\n return {\n type: 'file' as const,\n data: binary.base64Data,\n mediaType: part.mediaType,\n filename: part.filename ?? binary.filename,\n };\n};\n\nconst mapUserPart = async (part: AiUserMessagePart, resolveDriveFile: AiDriveFileResolver) => {\n if (part.type === 'text') {\n return { type: 'text' as const, text: part.text };\n }\n\n return mapFilePart(part, resolveDriveFile);\n};\n\nconst mapAssistantPart = async (part: AiAssistantMessagePart, resolveDriveFile: AiDriveFileResolver) => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, text: part.text };\n case 'file':\n return mapFilePart(part, resolveDriveFile);\n case 'tool-call':\n return {\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n };\n case 'reasoning':\n return {\n type: 'reasoning' as const,\n text: part.text,\n providerOptions: part.providerOptions as never,\n };\n }\n};\n\nconst mapToolResult = (part: AiToolResultPart) => {\n const output = part.isError\n ? typeof part.output === 'string'\n ? { type: 'error-text' as const, value: part.output }\n : { type: 'error-json' as const, value: part.output as never }\n : typeof part.output === 'string'\n ? { type: 'text' as const, value: part.output }\n : { type: 'json' as const, value: part.output as never };\n\n return {\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n };\n};\n\nconst mapUserMessage = async (message: AiUserMessage, resolveDriveFile: AiDriveFileResolver): Promise<UserModelMessage> => {\n if (typeof message.content === 'string') {\n return { role: 'user', content: message.content };\n }\n\n return { role: 'user', content: await Promise.all(message.content.map((part) => mapUserPart(part, resolveDriveFile))) };\n};\n\nconst mapAssistantMessage = async (message: AiAssistantMessage, resolveDriveFile: AiDriveFileResolver): Promise<AssistantModelMessage> => {\n if (typeof message.content === 'string') {\n return { role: 'assistant', content: message.content };\n }\n\n return { role: 'assistant', content: await Promise.all(message.content.map((part) => mapAssistantPart(part, resolveDriveFile))) };\n};\n\nconst mapToolMessage = (message: AiToolMessage): ToolModelMessage => ({\n role: 'tool',\n content: message.content.map(mapToolResult),\n});\n\nexport const toSdkMessages = (messages: AiMessage[], resolveDriveFile: AiDriveFileResolver): Promise<ModelMessage[]> =>\n Promise.all(\n messages.map((message) => {\n switch (message.role) {\n case 'user':\n return mapUserMessage(message, resolveDriveFile);\n case 'assistant':\n return mapAssistantMessage(message, resolveDriveFile);\n case 'tool':\n return mapToolMessage(message);\n }\n }),\n );\n"]}
@@ -1,3 +1,3 @@
1
- import { ActionProcessorListResolver, QueueQPQConfigSetting } from 'quidproquo-core';
2
- export declare const getQueueConfigSetting: () => QueueQPQConfigSetting;
1
+ import { ActionProcessorListResolver, QPQConfig, QueueQPQConfigSetting } from 'quidproquo-core';
2
+ export declare const getQueueConfigSetting: (qpqConfig: QPQConfig) => QueueQPQConfigSetting;
3
3
  export declare const getEventMatchStoryActionProcessor: ActionProcessorListResolver;
@@ -12,16 +12,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getEventMatchStoryActionProcessor = exports.getQueueConfigSetting = void 0;
13
13
  const quidproquo_core_1 = require("quidproquo-core");
14
14
  const awsLambdaUtils_1 = require("../../../../../awsLambdaUtils");
15
- const getQueueConfigSetting = () => {
16
- const queueQPQConfigSetting = JSON.parse(process.env.queueQPQConfigSetting);
17
- // TODO: Validate here
15
+ const getQueueConfigSetting = (qpqConfig) => {
16
+ // Only the queue name travels via the environment - the full setting lives in
17
+ // the bundled qpqConfig (serializing it into env blows the lambda 4KB limit).
18
+ const queueName = process.env.queueName;
19
+ const queueQPQConfigSetting = quidproquo_core_1.qpqCoreUtils.getQueueConfigSettingByName(queueName, qpqConfig);
20
+ if (!queueQPQConfigSetting) {
21
+ throw new Error(`No queue config setting found for queue [${queueName}]`);
22
+ }
18
23
  return queueQPQConfigSetting;
19
24
  };
20
25
  exports.getQueueConfigSetting = getQueueConfigSetting;
21
26
  const getProcessMatchStory = (qpqConfig) => {
22
- // TODO: Get this out of the qpqconfig like the other event processors
23
- const queueQPQConfigSetting = (0, exports.getQueueConfigSetting)();
24
- const queueQueueProcessors = quidproquo_core_1.qpqCoreUtils.getQueueQueueProcessors(queueQPQConfigSetting.name, qpqConfig);
27
+ const queueQPQConfigSetting = (0, exports.getQueueConfigSetting)(qpqConfig);
28
+ const queueQueueProcessors = queueQPQConfigSetting.qpqQueueProcessors;
25
29
  const queueTypes = Object.keys(queueQueueProcessors).sort();
26
30
  return (_a) => __awaiter(void 0, [_a], void 0, function* ({ qpqEventRecord }) {
27
31
  console.log('qpqEventRecord', JSON.stringify(qpqEventRecord, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"getEventMatchStoryActionProcessor.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAWyB;AAEzB,kEAAyD;AAGlD,MAAM,qBAAqB,GAAG,GAA0B,EAAE;IAC/D,MAAM,qBAAqB,GAA0B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAA+B,CAAC,CAAC;IAE7G,sBAAsB;IAEtB,OAAO,qBAAqB,CAAC;AAC/B,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC;AAEF,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAAgF,EAAE;IAClI,sEAAsE;IACtE,MAAM,qBAAqB,GAAG,IAAA,6BAAqB,GAAE,CAAC;IACtD,MAAM,oBAAoB,GAAG,8BAAY,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzG,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5D,OAAO,KAA2B,EAAE,4CAAtB,EAAE,cAAc,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvE,+BAA+B;QAC/B,MAAM,gBAAgB,GAAG,UAAU;aAChC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACZ,KAAK,EAAE,IAAA,yBAAQ,EAAC,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;YAChD,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,mFAAmF;YACnF,uCAAuC;YACvC,IAAI,qBAAqB,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,OAAO,IAAA,8BAAY,EAAc,EAAE,CAAC,CAAC;YACvC,CAAC;YAED,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,QAAQ,EAAE,wBAAwB,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1G,CAAC;QAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAErE,OAAO,IAAA,8BAAY,EAAc;YAC/B,OAAO,EAAE,WAAW;YACpB,cAAc,EAAE,gBAAgB,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE;YACnD,MAAM,EAAE,gBAAgB,CAAC,SAAS;SACnC,CAAC,CAAC;IACL,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,iCAAiC,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QAC3I,CAAC,iCAAe,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;KAC9D,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,iCAAiC,qCAE3C","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n ErrorTypeEnum,\n EventActionType,\n EventMatchStoryActionProcessor,\n QPQConfig,\n qpqCoreUtils,\n QueueQPQConfigSetting,\n} from 'quidproquo-core';\n\nimport { matchUrl } from '../../../../../awsLambdaUtils';\nimport { EventInput, InternalEventRecord, MatchResult } from './types';\n\nexport const getQueueConfigSetting = (): QueueQPQConfigSetting => {\n const queueQPQConfigSetting: QueueQPQConfigSetting = JSON.parse(process.env.queueQPQConfigSetting as string);\n\n // TODO: Validate here\n\n return queueQPQConfigSetting;\n};\n\nconst getProcessMatchStory = (qpqConfig: QPQConfig): EventMatchStoryActionProcessor<InternalEventRecord, MatchResult, EventInput> => {\n // TODO: Get this out of the qpqconfig like the other event processors\n const queueQPQConfigSetting = getQueueConfigSetting();\n const queueQueueProcessors = qpqCoreUtils.getQueueQueueProcessors(queueQPQConfigSetting.name, qpqConfig);\n const queueTypes = Object.keys(queueQueueProcessors).sort();\n\n return async ({ qpqEventRecord }) => {\n console.log('qpqEventRecord', JSON.stringify(qpqEventRecord, null, 2));\n\n // Find the most relevant match\n const matchedQueueType = queueTypes\n .map((qt) => ({\n match: matchUrl(qt, qpqEventRecord.message.type),\n queueType: qt,\n }))\n .find((m) => m.match.didMatch);\n\n if (!matchedQueueType) {\n // If we have event bus subscriptions then we don't want to error if we can't match\n // early exit will just exit gracefully\n if (queueQPQConfigSetting.eventBusSubscriptions.length > 0) {\n return actionResult<MatchResult>({});\n }\n\n return actionResultError(ErrorTypeEnum.NotFound, `queue type not found ${qpqEventRecord.message.type}`);\n }\n\n const sourceEntry = queueQueueProcessors[matchedQueueType.queueType];\n\n return actionResult<MatchResult>({\n runtime: sourceEntry,\n runtimeOptions: matchedQueueType.match.params || {},\n config: matchedQueueType.queueType,\n });\n };\n};\n\nexport const getEventMatchStoryActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [EventActionType.MatchStory]: getProcessMatchStory(qpqConfig),\n});\n"]}
1
+ {"version":3,"file":"getEventMatchStoryActionProcessor.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAWyB;AAEzB,kEAAyD;AAGlD,MAAM,qBAAqB,GAAG,CAAC,SAAoB,EAAyB,EAAE;IACnF,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAmB,CAAC;IAClD,MAAM,qBAAqB,GAAG,8BAAY,CAAC,2BAA2B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE7F,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,qBAAqB,CAAC;AAC/B,CAAC,CAAC;AAXW,QAAA,qBAAqB,yBAWhC;AAEF,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAAgF,EAAE;IAClI,MAAM,qBAAqB,GAAG,IAAA,6BAAqB,EAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,kBAAkB,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5D,OAAO,KAA2B,EAAE,4CAAtB,EAAE,cAAc,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvE,+BAA+B;QAC/B,MAAM,gBAAgB,GAAG,UAAU;aAChC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACZ,KAAK,EAAE,IAAA,yBAAQ,EAAC,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;YAChD,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,mFAAmF;YACnF,uCAAuC;YACvC,IAAI,qBAAqB,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,OAAO,IAAA,8BAAY,EAAc,EAAE,CAAC,CAAC;YACvC,CAAC;YAED,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,QAAQ,EAAE,wBAAwB,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1G,CAAC;QAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAErE,OAAO,IAAA,8BAAY,EAAc;YAC/B,OAAO,EAAE,WAAW;YACpB,cAAc,EAAE,gBAAgB,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE;YACnD,MAAM,EAAE,gBAAgB,CAAC,SAAS;SACnC,CAAC,CAAC;IACL,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,iCAAiC,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QAC3I,CAAC,iCAAe,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;KAC9D,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,iCAAiC,qCAE3C","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n ErrorTypeEnum,\n EventActionType,\n EventMatchStoryActionProcessor,\n QPQConfig,\n qpqCoreUtils,\n QueueQPQConfigSetting,\n} from 'quidproquo-core';\n\nimport { matchUrl } from '../../../../../awsLambdaUtils';\nimport { EventInput, InternalEventRecord, MatchResult } from './types';\n\nexport const getQueueConfigSetting = (qpqConfig: QPQConfig): QueueQPQConfigSetting => {\n // Only the queue name travels via the environment - the full setting lives in\n // the bundled qpqConfig (serializing it into env blows the lambda 4KB limit).\n const queueName = process.env.queueName as string;\n const queueQPQConfigSetting = qpqCoreUtils.getQueueConfigSettingByName(queueName, qpqConfig);\n\n if (!queueQPQConfigSetting) {\n throw new Error(`No queue config setting found for queue [${queueName}]`);\n }\n\n return queueQPQConfigSetting;\n};\n\nconst getProcessMatchStory = (qpqConfig: QPQConfig): EventMatchStoryActionProcessor<InternalEventRecord, MatchResult, EventInput> => {\n const queueQPQConfigSetting = getQueueConfigSetting(qpqConfig);\n const queueQueueProcessors = queueQPQConfigSetting.qpqQueueProcessors;\n const queueTypes = Object.keys(queueQueueProcessors).sort();\n\n return async ({ qpqEventRecord }) => {\n console.log('qpqEventRecord', JSON.stringify(qpqEventRecord, null, 2));\n\n // Find the most relevant match\n const matchedQueueType = queueTypes\n .map((qt) => ({\n match: matchUrl(qt, qpqEventRecord.message.type),\n queueType: qt,\n }))\n .find((m) => m.match.didMatch);\n\n if (!matchedQueueType) {\n // If we have event bus subscriptions then we don't want to error if we can't match\n // early exit will just exit gracefully\n if (queueQPQConfigSetting.eventBusSubscriptions.length > 0) {\n return actionResult<MatchResult>({});\n }\n\n return actionResultError(ErrorTypeEnum.NotFound, `queue type not found ${qpqEventRecord.message.type}`);\n }\n\n const sourceEntry = queueQueueProcessors[matchedQueueType.queueType];\n\n return actionResult<MatchResult>({\n runtime: sourceEntry,\n runtimeOptions: matchedQueueType.match.params || {},\n config: matchedQueueType.queueType,\n });\n };\n};\n\nexport const getEventMatchStoryActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [EventActionType.MatchStory]: getProcessMatchStory(qpqConfig),\n});\n"]}
@@ -15,10 +15,11 @@ const quidproquo_core_1 = require("quidproquo-core");
15
15
  const s3Utils_1 = require("../../../logic/s3/s3Utils");
16
16
  const utils_1 = require("./utils");
17
17
  const getProcessFileDelete = (qpqConfig) => {
18
- return (_a) => __awaiter(void 0, [_a], void 0, function* ({ drive, filepaths }) {
18
+ return (_a) => __awaiter(void 0, [_a], void 0, function* ({ drive, filepaths, scope }) {
19
19
  const s3BucketName = (0, utils_1.resolveStorageDriveBucketName)(drive, qpqConfig);
20
20
  try {
21
- const errored = yield (0, s3Utils_1.deleteFiles)(s3BucketName, filepaths, quidproquo_config_aws_1.qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig));
21
+ const keys = filepaths.map((filepath) => (0, quidproquo_core_1.composeScopedFilePath)(scope, filepath));
22
+ const errored = yield (0, s3Utils_1.deleteFiles)(s3BucketName, keys, quidproquo_config_aws_1.qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig));
22
23
  // errored deletes are a graceful success ~ Retry
23
24
  // if (errored.length > 0) {
24
25
  // return actionResultError(
@@ -32,6 +33,7 @@ const getProcessFileDelete = (qpqConfig) => {
32
33
  return (0, quidproquo_core_1.actionResultErrorFromCaughtError)(error, {
33
34
  AccessDenied: () => (0, quidproquo_core_1.actionResultError)(quidproquo_core_1.FileDeleteErrorTypeEnum.AccessDenied, 'Access denied deleting files'),
34
35
  NoSuchBucket: () => (0, quidproquo_core_1.actionResultError)(quidproquo_core_1.FileDeleteErrorTypeEnum.DriveNotFound, `Storage drive not found: ${drive}`),
36
+ InvalidScopeError: (error) => (0, quidproquo_core_1.actionResultError)(quidproquo_core_1.FileDeleteErrorTypeEnum.InvalidScope, error.message),
35
37
  });
36
38
  }
37
39
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getFileDeleteActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/file/getFileDeleteActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA0D;AAE1D,qDAOyB;AAEzB,uDAAwD;AACxD,mCAAwD;AAExD,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAA6B,EAAE;IAC/E,OAAO,KAA6B,EAAE,4CAAxB,EAAE,KAAK,EAAE,SAAS,EAAE;QAChC,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,YAAY,EAAE,SAAS,EAAE,yCAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC;YAE1H,iDAAiD;YACjD,4BAA4B;YAC5B,8BAA8B;YAC9B,kCAAkC;YAClC,kDAAkD;YAClD,OAAO;YACP,IAAI;YAEJ,OAAO,IAAA,8BAAY,EAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAA,kDAAgC,EAAC,KAAK,EAAE;gBAC7C,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,8BAA8B,CAAC;gBAC3G,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,aAAa,EAAE,4BAA4B,KAAK,EAAE,CAAC;aAClH,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,4BAA4B,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QACtI,CAAC,gCAAc,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;KACzD,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,4BAA4B,gCAEtC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport { ActionProcessorList, ActionProcessorListResolver, QPQConfig } from 'quidproquo-core';\nimport {\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n FileActionType,\n FileDeleteActionProcessor,\n FileDeleteErrorTypeEnum,\n} from 'quidproquo-core';\n\nimport { deleteFiles } from '../../../logic/s3/s3Utils';\nimport { resolveStorageDriveBucketName } from './utils';\n\nconst getProcessFileDelete = (qpqConfig: QPQConfig): FileDeleteActionProcessor => {\n return async ({ drive, filepaths }) => {\n const s3BucketName = resolveStorageDriveBucketName(drive, qpqConfig);\n\n try {\n const errored = await deleteFiles(s3BucketName, filepaths, qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig));\n\n // errored deletes are a graceful success ~ Retry\n // if (errored.length > 0) {\n // return actionResultError(\n // ErrorTypeEnum.GenericError,\n // `Could not delete files ${errored.length}`,\n // );\n // }\n\n return actionResult(errored);\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n AccessDenied: () => actionResultError(FileDeleteErrorTypeEnum.AccessDenied, 'Access denied deleting files'),\n NoSuchBucket: () => actionResultError(FileDeleteErrorTypeEnum.DriveNotFound, `Storage drive not found: ${drive}`),\n });\n }\n };\n};\n\nexport const getFileDeleteActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [FileActionType.Delete]: getProcessFileDelete(qpqConfig),\n});\n"]}
1
+ {"version":3,"file":"getFileDeleteActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/file/getFileDeleteActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA0D;AAE1D,qDAQyB;AAEzB,uDAAwD;AACxD,mCAAwD;AAExD,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAA6B,EAAE;IAC/E,OAAO,KAAoC,EAAE,4CAA/B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;QACvC,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,uCAAqB,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjF,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,YAAY,EAAE,IAAI,EAAE,yCAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC;YAErH,iDAAiD;YACjD,4BAA4B;YAC5B,8BAA8B;YAC9B,kCAAkC;YAClC,kDAAkD;YAClD,OAAO;YACP,IAAI;YAEJ,OAAO,IAAA,8BAAY,EAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAA,kDAAgC,EAAC,KAAK,EAAE;gBAC7C,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,8BAA8B,CAAC;gBAC3G,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,aAAa,EAAE,4BAA4B,KAAK,EAAE,CAAC;gBACjH,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;aACrG,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,4BAA4B,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QACtI,CAAC,gCAAc,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;KACzD,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,4BAA4B,gCAEtC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport { ActionProcessorList, ActionProcessorListResolver, QPQConfig } from 'quidproquo-core';\nimport {\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n composeScopedFilePath,\n FileActionType,\n FileDeleteActionProcessor,\n FileDeleteErrorTypeEnum,\n} from 'quidproquo-core';\n\nimport { deleteFiles } from '../../../logic/s3/s3Utils';\nimport { resolveStorageDriveBucketName } from './utils';\n\nconst getProcessFileDelete = (qpqConfig: QPQConfig): FileDeleteActionProcessor => {\n return async ({ drive, filepaths, scope }) => {\n const s3BucketName = resolveStorageDriveBucketName(drive, qpqConfig);\n\n try {\n const keys = filepaths.map((filepath) => composeScopedFilePath(scope, filepath));\n const errored = await deleteFiles(s3BucketName, keys, qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig));\n\n // errored deletes are a graceful success ~ Retry\n // if (errored.length > 0) {\n // return actionResultError(\n // ErrorTypeEnum.GenericError,\n // `Could not delete files ${errored.length}`,\n // );\n // }\n\n return actionResult(errored);\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n AccessDenied: () => actionResultError(FileDeleteErrorTypeEnum.AccessDenied, 'Access denied deleting files'),\n NoSuchBucket: () => actionResultError(FileDeleteErrorTypeEnum.DriveNotFound, `Storage drive not found: ${drive}`),\n InvalidScopeError: (error) => actionResultError(FileDeleteErrorTypeEnum.InvalidScope, error.message),\n });\n }\n };\n};\n\nexport const getFileDeleteActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [FileActionType.Delete]: getProcessFileDelete(qpqConfig),\n});\n"]}
@@ -15,15 +15,17 @@ const quidproquo_core_1 = require("quidproquo-core");
15
15
  const s3Utils_1 = require("../../../logic/s3/s3Utils");
16
16
  const utils_1 = require("./utils");
17
17
  const getProcessFileExists = (qpqConfig) => {
18
- return (_a) => __awaiter(void 0, [_a], void 0, function* ({ drive, filepath }) {
18
+ return (_a) => __awaiter(void 0, [_a], void 0, function* ({ drive, filepath, scope }) {
19
19
  const s3BucketName = (0, utils_1.resolveStorageDriveBucketName)(drive, qpqConfig);
20
20
  try {
21
- return (0, quidproquo_core_1.actionResult)(yield (0, s3Utils_1.objectExists)(s3BucketName, filepath, quidproquo_config_aws_1.qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig)));
21
+ const key = (0, quidproquo_core_1.composeScopedFilePath)(scope, filepath);
22
+ return (0, quidproquo_core_1.actionResult)(yield (0, s3Utils_1.objectExists)(s3BucketName, key, quidproquo_config_aws_1.qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig)));
22
23
  }
23
24
  catch (error) {
24
25
  return (0, quidproquo_core_1.actionResultErrorFromCaughtError)(error, {
25
26
  AccessDenied: () => (0, quidproquo_core_1.actionResultError)(quidproquo_core_1.FileExistsErrorTypeEnum.AccessDenied, 'Access denied checking file existence'),
26
27
  Forbidden: () => (0, quidproquo_core_1.actionResultError)(quidproquo_core_1.FileExistsErrorTypeEnum.AccessDenied, 'Access denied checking file existence'),
28
+ InvalidScopeError: (error) => (0, quidproquo_core_1.actionResultError)(quidproquo_core_1.FileExistsErrorTypeEnum.InvalidScope, error.message),
27
29
  });
28
30
  }
29
31
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getFileExistsActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/file/getFileExistsActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA0D;AAC1D,qDAUyB;AAEzB,uDAAyD;AACzD,mCAAwD;AAExD,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAA6B,EAAE;IAC/E,OAAO,KAA4B,EAAE,4CAAvB,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC/B,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,OAAO,IAAA,8BAAY,EAAC,MAAM,IAAA,sBAAY,EAAC,YAAY,EAAE,QAAQ,EAAE,yCAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjI,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAA,kDAAgC,EAAC,KAAK,EAAE;gBAC7C,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,uCAAuC,CAAC;gBACpH,SAAS,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,uCAAuC,CAAC;aAClH,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,4BAA4B,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QACtI,CAAC,gCAAc,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;KACzD,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,4BAA4B,gCAEtC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n FileActionType,\n FileExistsActionProcessor,\n FileExistsErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { objectExists } from '../../../logic/s3/s3Utils';\nimport { resolveStorageDriveBucketName } from './utils';\n\nconst getProcessFileExists = (qpqConfig: QPQConfig): FileExistsActionProcessor => {\n return async ({ drive, filepath }) => {\n const s3BucketName = resolveStorageDriveBucketName(drive, qpqConfig);\n\n try {\n return actionResult(await objectExists(s3BucketName, filepath, qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig)));\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n AccessDenied: () => actionResultError(FileExistsErrorTypeEnum.AccessDenied, 'Access denied checking file existence'),\n Forbidden: () => actionResultError(FileExistsErrorTypeEnum.AccessDenied, 'Access denied checking file existence'),\n });\n }\n };\n};\n\nexport const getFileExistsActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [FileActionType.Exists]: getProcessFileExists(qpqConfig),\n});\n"]}
1
+ {"version":3,"file":"getFileExistsActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/file/getFileExistsActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA0D;AAC1D,qDAWyB;AAEzB,uDAAyD;AACzD,mCAAwD;AAExD,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAA6B,EAAE;IAC/E,OAAO,KAAmC,EAAE,4CAA9B,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;QACtC,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAA,uCAAqB,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACnD,OAAO,IAAA,8BAAY,EAAC,MAAM,IAAA,sBAAY,EAAC,YAAY,EAAE,GAAG,EAAE,yCAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5H,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAA,kDAAgC,EAAC,KAAK,EAAE;gBAC7C,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,uCAAuC,CAAC;gBACpH,SAAS,EAAE,GAAG,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,uCAAuC,CAAC;gBACjH,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mCAAiB,EAAC,yCAAuB,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;aACrG,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,4BAA4B,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QACtI,CAAC,gCAAc,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;KACzD,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,4BAA4B,gCAEtC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n composeScopedFilePath,\n FileActionType,\n FileExistsActionProcessor,\n FileExistsErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { objectExists } from '../../../logic/s3/s3Utils';\nimport { resolveStorageDriveBucketName } from './utils';\n\nconst getProcessFileExists = (qpqConfig: QPQConfig): FileExistsActionProcessor => {\n return async ({ drive, filepath, scope }) => {\n const s3BucketName = resolveStorageDriveBucketName(drive, qpqConfig);\n\n try {\n const key = composeScopedFilePath(scope, filepath);\n return actionResult(await objectExists(s3BucketName, key, qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig)));\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n AccessDenied: () => actionResultError(FileExistsErrorTypeEnum.AccessDenied, 'Access denied checking file existence'),\n Forbidden: () => actionResultError(FileExistsErrorTypeEnum.AccessDenied, 'Access denied checking file existence'),\n InvalidScopeError: (error) => actionResultError(FileExistsErrorTypeEnum.InvalidScope, error.message),\n });\n }\n };\n};\n\nexport const getFileExistsActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [FileActionType.Exists]: getProcessFileExists(qpqConfig),\n});\n"]}
@@ -18,17 +18,21 @@ const utils_1 = require("./utils");
18
18
  // SigV4 presigned URLs cannot expire more than 7 days in the future
19
19
  const maxExpirationMs = 7 * 24 * 60 * 60 * 1000;
20
20
  const getProcessFileGenerateTemporarySecureUrl = (qpqConfig) => {
21
- return (_a) => __awaiter(void 0, [_a], void 0, function* ({ drive, filepath, expirationMs }) {
21
+ return (_a) => __awaiter(void 0, [_a], void 0, function* ({ drive, filepath, expirationMs, scope }) {
22
22
  if (expirationMs > maxExpirationMs) {
23
23
  return (0, quidproquo_core_1.actionResultError)(quidproquo_core_2.FileGenerateTemporarySecureUrlErrorTypeEnum.ExpirationTooLong, 'Expiration exceeds the 7 day maximum for presigned URLs');
24
24
  }
25
25
  try {
26
26
  const s3BucketName = (0, utils_1.resolveStorageDriveBucketName)(drive, qpqConfig);
27
- const url = yield (0, generatePresignedUrl_1.generatePresignedUrl)(s3BucketName, filepath, quidproquo_config_aws_1.qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig), expirationMs);
27
+ const url = yield (0, generatePresignedUrl_1.generatePresignedUrl)(s3BucketName, (0, quidproquo_core_2.composeScopedFilePath)(scope, filepath), quidproquo_config_aws_1.qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig), expirationMs);
28
28
  return (0, quidproquo_core_2.actionResult)(url);
29
29
  }
30
30
  catch (error) {
31
- return (0, quidproquo_core_1.actionResultError)(quidproquo_core_1.ErrorTypeEnum.GenericError, 'Unable to generate temporary secure URL', error);
31
+ // Name-keyed, not instanceof: under npm link / module federation the
32
+ // error can come from another copy of quidproquo-core.
33
+ return (0, quidproquo_core_1.actionResultErrorFromCaughtError)(error, {
34
+ InvalidScopeError: (error) => (0, quidproquo_core_1.actionResultError)(quidproquo_core_2.FileGenerateTemporarySecureUrlErrorTypeEnum.InvalidScope, error.message),
35
+ });
32
36
  }
33
37
  });
34
38
  };