quidproquo-actionprocessor-awslambda 0.1.6 → 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 (176) hide show
  1. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js +8 -3
  2. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
  3. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +23 -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 +3 -0
  8. package/lib/commonjs/getActionProcessor/core/ai/logic/index.js +3 -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.d.ts +2 -0
  20. package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableMessages.js +19 -0
  21. package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableMessages.js.map +1 -0
  22. package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableSystem.d.ts +2 -0
  23. package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableSystem.js +23 -0
  24. package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableSystem.js.map +1 -0
  25. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.d.ts +1 -1
  26. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.js +1 -1
  27. package/lib/commonjs/getActionProcessor/core/ai/logic/toSdkMessages.js.map +1 -1
  28. package/lib/commonjs/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.d.ts +2 -2
  29. package/lib/commonjs/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js +10 -6
  30. package/lib/commonjs/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js.map +1 -1
  31. package/lib/commonjs/getActionProcessor/core/file/getFileDeleteActionProcessor.js +4 -2
  32. package/lib/commonjs/getActionProcessor/core/file/getFileDeleteActionProcessor.js.map +1 -1
  33. package/lib/commonjs/getActionProcessor/core/file/getFileExistsActionProcessor.js +4 -2
  34. package/lib/commonjs/getActionProcessor/core/file/getFileExistsActionProcessor.js.map +1 -1
  35. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js +7 -3
  36. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js.map +1 -1
  37. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js +7 -3
  38. package/lib/commonjs/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js.map +1 -1
  39. package/lib/commonjs/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js +4 -2
  40. package/lib/commonjs/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js.map +1 -1
  41. package/lib/commonjs/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js +6 -4
  42. package/lib/commonjs/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js.map +1 -1
  43. package/lib/commonjs/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js +4 -2
  44. package/lib/commonjs/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js.map +1 -1
  45. package/lib/commonjs/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js +7 -2
  46. package/lib/commonjs/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js.map +1 -1
  47. package/lib/commonjs/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js +6 -2
  48. package/lib/commonjs/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js.map +1 -1
  49. package/lib/commonjs/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js +3 -2
  50. package/lib/commonjs/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js.map +1 -1
  51. package/lib/commonjs/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js +3 -2
  52. package/lib/commonjs/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js.map +1 -1
  53. package/lib/commonjs/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js +3 -2
  54. package/lib/commonjs/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js.map +1 -1
  55. package/lib/commonjs/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js +3 -2
  56. package/lib/commonjs/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js.map +1 -1
  57. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js +11 -9
  58. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js.map +1 -1
  59. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js +7 -3
  60. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js.map +1 -1
  61. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js +8 -3
  62. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js.map +1 -1
  63. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +9 -5
  64. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js.map +1 -1
  65. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js +9 -2
  66. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js.map +1 -1
  67. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js +10 -8
  68. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js.map +1 -1
  69. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js +13 -11
  70. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js.map +1 -1
  71. package/lib/commonjs/getActionProcessor/core/keyValueStore/index.js +2 -1
  72. package/lib/commonjs/getActionProcessor/core/keyValueStore/index.js.map +1 -1
  73. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js +2 -2
  74. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js.map +1 -1
  75. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js +11 -1
  76. package/lib/commonjs/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js.map +1 -1
  77. package/lib/commonjs/lambdaHandlers/getSqsEvent_queueEvent.js +3 -3
  78. package/lib/commonjs/lambdaHandlers/getSqsEvent_queueEvent.js.map +1 -1
  79. package/lib/commonjs/logic/cognito/requestEmailVerificationCode.d.ts +2 -1
  80. package/lib/commonjs/logic/cognito/requestEmailVerificationCode.js +8 -1
  81. package/lib/commonjs/logic/cognito/requestEmailVerificationCode.js.map +1 -1
  82. package/lib/commonjs/logic/dynamo/getAllItems.d.ts +2 -1
  83. package/lib/commonjs/logic/dynamo/getAllItems.js +7 -2
  84. package/lib/commonjs/logic/dynamo/getAllItems.js.map +1 -1
  85. package/lib/commonjs/logic/dynamo/getItem.d.ts +2 -1
  86. package/lib/commonjs/logic/dynamo/getItem.js +8 -5
  87. package/lib/commonjs/logic/dynamo/getItem.js.map +1 -1
  88. package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js +9 -4
  89. package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
  90. package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +21 -5
  91. package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js.map +1 -1
  92. package/lib/esm/getActionProcessor/core/ai/logic/createDriveFileResolver.js +2 -2
  93. package/lib/esm/getActionProcessor/core/ai/logic/createDriveFileResolver.js.map +1 -1
  94. package/lib/esm/getActionProcessor/core/ai/logic/index.d.ts +3 -0
  95. package/lib/esm/getActionProcessor/core/ai/logic/index.js +3 -0
  96. package/lib/esm/getActionProcessor/core/ai/logic/index.js.map +1 -1
  97. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinish.js +2 -1
  98. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinish.js.map +1 -1
  99. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js +2 -1
  100. package/lib/esm/getActionProcessor/core/ai/logic/mapAiStreamFinishStep.js.map +1 -1
  101. package/lib/esm/getActionProcessor/core/ai/logic/prepareAiPromptCall.js +13 -8
  102. package/lib/esm/getActionProcessor/core/ai/logic/prepareAiPromptCall.js.map +1 -1
  103. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamFinishReason.d.ts +2 -0
  104. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamFinishReason.js +6 -0
  105. package/lib/esm/getActionProcessor/core/ai/logic/toAiStreamFinishReason.js.map +1 -0
  106. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.d.ts +2 -0
  107. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.js +21 -0
  108. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.js.map +1 -0
  109. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableSystem.d.ts +2 -0
  110. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableSystem.js +19 -0
  111. package/lib/esm/getActionProcessor/core/ai/logic/toCacheableSystem.js.map +1 -0
  112. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.d.ts +1 -1
  113. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.js +1 -1
  114. package/lib/esm/getActionProcessor/core/ai/logic/toSdkMessages.js.map +1 -1
  115. package/lib/esm/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.d.ts +2 -2
  116. package/lib/esm/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js +10 -6
  117. package/lib/esm/getActionProcessor/core/event/sqs/queue/getEventMatchStoryActionProcessor.js.map +1 -1
  118. package/lib/esm/getActionProcessor/core/file/getFileDeleteActionProcessor.js +5 -3
  119. package/lib/esm/getActionProcessor/core/file/getFileDeleteActionProcessor.js.map +1 -1
  120. package/lib/esm/getActionProcessor/core/file/getFileExistsActionProcessor.js +5 -3
  121. package/lib/esm/getActionProcessor/core/file/getFileExistsActionProcessor.js.map +1 -1
  122. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js +9 -5
  123. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporarySecureUrlActionProcessor.js.map +1 -1
  124. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js +9 -5
  125. package/lib/esm/getActionProcessor/core/file/getFileGenerateTemporaryUploadSecureUrlActionProcessor.js.map +1 -1
  126. package/lib/esm/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js +5 -3
  127. package/lib/esm/getActionProcessor/core/file/getFileIsColdStorageActionProcessor.js.map +1 -1
  128. package/lib/esm/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js +7 -4
  129. package/lib/esm/getActionProcessor/core/file/getFileListDirectoryActionProcessor.js.map +1 -1
  130. package/lib/esm/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js +5 -3
  131. package/lib/esm/getActionProcessor/core/file/getFileReadBinaryContentsActionProcessor.js.map +1 -1
  132. package/lib/esm/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js +8 -3
  133. package/lib/esm/getActionProcessor/core/file/getFileReadObjectJsonActionProcessor.js.map +1 -1
  134. package/lib/esm/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js +7 -3
  135. package/lib/esm/getActionProcessor/core/file/getFileReadTextContentsActionProcessor.js.map +1 -1
  136. package/lib/esm/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js +4 -3
  137. package/lib/esm/getActionProcessor/core/file/getFileStreamOpenActionProcessor.js.map +1 -1
  138. package/lib/esm/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js +4 -3
  139. package/lib/esm/getActionProcessor/core/file/getFileWriteBinaryContentsActionProcessor.js.map +1 -1
  140. package/lib/esm/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js +4 -3
  141. package/lib/esm/getActionProcessor/core/file/getFileWriteObjectJsonActionProcessor.js.map +1 -1
  142. package/lib/esm/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js +4 -3
  143. package/lib/esm/getActionProcessor/core/file/getFileWriteTextContentsActionProcessor.js.map +1 -1
  144. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js +7 -5
  145. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreDeleteActionProcessor.js.map +1 -1
  146. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js +8 -4
  147. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetActionProcessor.js.map +1 -1
  148. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js +9 -4
  149. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreGetAllActionProcessor.js.map +1 -1
  150. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +10 -6
  151. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js.map +1 -1
  152. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js +11 -4
  153. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanActionProcessor.js.map +1 -1
  154. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js +7 -5
  155. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpdateActionProcessor.js.map +1 -1
  156. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js +14 -12
  157. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreUpsertActionProcessor.js.map +1 -1
  158. package/lib/esm/getActionProcessor/core/keyValueStore/index.js +2 -0
  159. package/lib/esm/getActionProcessor/core/keyValueStore/index.js.map +1 -1
  160. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js +2 -2
  161. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectoryRequestEmailVerificationActionProcessor.js.map +1 -1
  162. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js +12 -2
  163. package/lib/esm/getActionProcessor/core/userDirectory/getUserDirectorySetAccessTokenActionProcessor.js.map +1 -1
  164. package/lib/esm/lambdaHandlers/getSqsEvent_queueEvent.js +3 -3
  165. package/lib/esm/lambdaHandlers/getSqsEvent_queueEvent.js.map +1 -1
  166. package/lib/esm/logic/cognito/requestEmailVerificationCode.d.ts +2 -1
  167. package/lib/esm/logic/cognito/requestEmailVerificationCode.js +7 -1
  168. package/lib/esm/logic/cognito/requestEmailVerificationCode.js.map +1 -1
  169. package/lib/esm/logic/dynamo/getAllItems.d.ts +2 -1
  170. package/lib/esm/logic/dynamo/getAllItems.js +7 -2
  171. package/lib/esm/logic/dynamo/getAllItems.js.map +1 -1
  172. package/lib/esm/logic/dynamo/getItem.d.ts +2 -1
  173. package/lib/esm/logic/dynamo/getItem.js +8 -5
  174. package/lib/esm/logic/dynamo/getItem.js.map +1 -1
  175. package/lib/extension-layer/qpq-log-extension/index.js +37 -37
  176. package/package.json +7 -7
@@ -15,7 +15,7 @@ const ai_1 = require("ai");
15
15
  const logic_1 = require("./logic");
16
16
  const getProcessAiPrompt = (qpqConfig) => {
17
17
  return (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => __awaiter(void 0, void 0, void 0, function* () {
18
- var _a;
18
+ var _a, _b, _c;
19
19
  const prepared = (0, logic_1.prepareAiPromptCall)(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
20
20
  if ('error' in prepared) {
21
21
  return (0, quidproquo_core_1.actionResultError)(prepared.error.type, prepared.error.message);
@@ -23,14 +23,19 @@ const getProcessAiPrompt = (qpqConfig) => {
23
23
  try {
24
24
  const promptOrMessages = payload.messages
25
25
  ? {
26
- messages: yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)),
26
+ messages: (0, logic_1.toCacheableMessages)(yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)), payload.caching),
27
27
  }
28
28
  : { prompt: payload.prompt };
29
29
  // Extended thinking — the model reasons before answering, within the token budget.
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: payload.system }, 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
+ if (payload.caching) {
35
+ // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
36
+ // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
37
+ console.log('AI prompt cache usage:', (_c = (_b = result.finalStep) === null || _b === void 0 ? void 0 : _b.usage) === null || _c === void 0 ? void 0 : _c.inputTokenDetails);
38
+ }
34
39
  return (0, quidproquo_core_1.actionResult)({ text: result.text });
35
40
  }
36
41
  catch (error) {
@@ -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,mCAAsF;AAEtF,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,MAAM,IAAA,qBAAa,EAC3B,OAAO,CAAC,QAAQ,EAChB,IAAA,+BAAuB,EAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAC9G;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,OAAO,CAAC,MAAM,IACnB,gBAAgB,KACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,eAAe,EACf,QAAQ,EAAE,IAAA,gBAAW,EAAC,EAAE,CAAC,IACzB,CAAC;YAEH,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, 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: await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\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: payload.system,\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(10),\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"]}
@@ -44,14 +44,17 @@ const getProcessAiPromptStream = (qpqConfig) => {
44
44
  try {
45
45
  const promptOrMessages = payload.messages
46
46
  ? {
47
- messages: yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)),
47
+ messages: (0, logic_1.toCacheableMessages)(yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)), payload.caching),
48
48
  }
49
49
  : { prompt: payload.prompt };
50
50
  // Extended thinking — thinking progress streams out as Reasoning* parts.
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 } = (0, ai_1.streamText)(Object.assign(Object.assign({ model: prepared.model, system: payload.system }, 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
@@ -61,10 +64,11 @@ const getProcessAiPromptStream = (qpqConfig) => {
61
64
  function aiStreamIterator() {
62
65
  return __asyncGenerator(this, arguments, function* aiStreamIterator_1() {
63
66
  var _a, e_1, _b, _c;
67
+ var _d;
64
68
  try {
65
- for (var _d = true, fullStream_1 = __asyncValues(fullStream), fullStream_1_1; fullStream_1_1 = yield __await(fullStream_1.next()), _a = fullStream_1_1.done, !_a; _d = true) {
69
+ for (var _e = true, fullStream_1 = __asyncValues(fullStream), fullStream_1_1; fullStream_1_1 = yield __await(fullStream_1.next()), _a = fullStream_1_1.done, !_a; _e = true) {
66
70
  _c = fullStream_1_1.value;
67
- _d = false;
71
+ _e = false;
68
72
  const part = _c;
69
73
  yield yield __await(JSON.stringify((0, logic_1.mapAiStreamPart)(part)));
70
74
  }
@@ -72,10 +76,24 @@ const getProcessAiPromptStream = (qpqConfig) => {
72
76
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
73
77
  finally {
74
78
  try {
75
- if (!_d && !_a && (_b = fullStream_1.return)) yield __await(_b.call(fullStream_1));
79
+ if (!_e && !_a && (_b = fullStream_1.return)) yield __await(_b.call(fullStream_1));
76
80
  }
77
81
  finally { if (e_1) throw e_1.error; }
78
82
  }
83
+ if (payload.caching) {
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
+ }
96
+ }
79
97
  });
80
98
  }
81
99
  streamRegistry.register(streamId, aiStreamIterator());
@@ -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, 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: await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\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 } = streamText({\n model: prepared.model,\n system: payload.system,\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\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,9 @@ 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';
33
+ export * from './toCacheableMessages';
34
+ export * from './toCacheableSystem';
32
35
  export * from './toErrorMessage';
33
36
  export * from './toSdkMessages';
@@ -44,7 +44,10 @@ __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);
49
+ __exportStar(require("./toCacheableMessages"), exports);
50
+ __exportStar(require("./toCacheableSystem"), exports);
48
51
  __exportStar(require("./toErrorMessage"), exports);
49
52
  __exportStar(require("./toSdkMessages"), exports);
50
53
  //# sourceMappingURL=index.js.map
@@ -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,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 './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"]}
@@ -0,0 +1,2 @@
1
+ import type { ModelMessage } from 'ai';
2
+ export declare const toCacheableMessages: (messages: ModelMessage[], caching: boolean | undefined) => ModelMessage[];
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toCacheableMessages = void 0;
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.
12
+ const toCacheableMessages = (messages, caching) => {
13
+ if (!caching || messages.length === 0) {
14
+ return messages;
15
+ }
16
+ return messages.map((message, index) => (index >= messages.length - 2 ? withCachePoint(message) : message));
17
+ };
18
+ exports.toCacheableMessages = toCacheableMessages;
19
+ //# sourceMappingURL=toCacheableMessages.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,2 @@
1
+ import type { SystemModelMessage } from 'ai';
2
+ export declare const toCacheableSystem: (system: string | undefined, caching: boolean | undefined) => string | SystemModelMessage | undefined;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toCacheableSystem = void 0;
4
+ // Bedrock only reads cache points off message objects, not the bare `system` string, so caching
5
+ // requires shaping system as a SystemModelMessage. @ai-sdk/amazon-bedrock (5.0.11) has no
6
+ // equivalent hook for the tools array, so tool definitions can't be cached this way yet.
7
+ const toCacheableSystem = (system, caching) => {
8
+ if (!system) {
9
+ return undefined;
10
+ }
11
+ if (!caching) {
12
+ return system;
13
+ }
14
+ return {
15
+ role: 'system',
16
+ content: system,
17
+ providerOptions: {
18
+ bedrock: { cachePoint: { type: 'default' } },
19
+ },
20
+ };
21
+ };
22
+ exports.toCacheableSystem = toCacheableSystem;
23
+ //# sourceMappingURL=toCacheableSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toCacheableSystem.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toCacheableSystem.ts"],"names":[],"mappings":";;;AAEA,gGAAgG;AAChG,0FAA0F;AAC1F,yFAAyF;AAClF,MAAM,iBAAiB,GAAG,CAAC,MAA0B,EAAE,OAA4B,EAA2C,EAAE;IACrI,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;SAC7C;KACF,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,iBAAiB,qBAgB5B","sourcesContent":["import type { SystemModelMessage } from 'ai';\n\n// Bedrock only reads cache points off message objects, not the bare `system` string, so caching\n// requires shaping system as a SystemModelMessage. @ai-sdk/amazon-bedrock (5.0.11) has no\n// equivalent hook for the tools array, so tool definitions can't be cached this way yet.\nexport const toCacheableSystem = (system: string | undefined, caching: boolean | undefined): string | SystemModelMessage | undefined => {\n if (!system) {\n return undefined;\n }\n\n if (!caching) {\n return system;\n }\n\n return {\n role: 'system',\n content: system,\n providerOptions: {\n bedrock: { cachePoint: { type: 'default' } },\n },\n };\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":"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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) => 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"]}