quidproquo-actionprocessor-awslambda 0.1.23 → 0.1.25

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 (111) hide show
  1. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js +1 -1
  2. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
  3. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +1 -4
  4. package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js.map +1 -1
  5. package/lib/commonjs/getActionProcessor/core/ai/logic/buildAiStopConditions.d.ts +13 -0
  6. package/lib/commonjs/getActionProcessor/core/ai/logic/buildAiStopConditions.js +24 -0
  7. package/lib/commonjs/getActionProcessor/core/ai/logic/buildAiStopConditions.js.map +1 -0
  8. package/lib/commonjs/getActionProcessor/core/ai/logic/index.d.ts +1 -0
  9. package/lib/commonjs/getActionProcessor/core/ai/logic/index.js +1 -0
  10. package/lib/commonjs/getActionProcessor/core/ai/logic/index.js.map +1 -1
  11. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoGetPublicKeyActionProcessor.d.ts +1 -0
  12. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoGetPublicKeyActionProcessor.js +34 -0
  13. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoGetPublicKeyActionProcessor.js.map +1 -0
  14. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoSignActionProcessor.d.ts +1 -0
  15. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoSignActionProcessor.js +36 -0
  16. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoSignActionProcessor.js.map +1 -0
  17. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoVerifyActionProcessor.d.ts +1 -0
  18. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoVerifyActionProcessor.js +38 -0
  19. package/lib/commonjs/getActionProcessor/core/crypto/getCryptoVerifyActionProcessor.js.map +1 -0
  20. package/lib/commonjs/getActionProcessor/core/crypto/index.js +4 -1
  21. package/lib/commonjs/getActionProcessor/core/crypto/index.js.map +1 -1
  22. package/lib/commonjs/getActionProcessor/core/crypto/kmsSigningErrorMap.d.ts +13 -0
  23. package/lib/commonjs/getActionProcessor/core/crypto/kmsSigningErrorMap.js +17 -0
  24. package/lib/commonjs/getActionProcessor/core/crypto/kmsSigningErrorMap.js.map +1 -0
  25. package/lib/commonjs/getActionProcessor/core/crypto/utils/index.d.ts +1 -0
  26. package/lib/commonjs/getActionProcessor/core/crypto/utils/index.js +1 -0
  27. package/lib/commonjs/getActionProcessor/core/crypto/utils/index.js.map +1 -1
  28. package/lib/commonjs/getActionProcessor/core/crypto/utils/resolveSigningKeyAlias.d.ts +2 -0
  29. package/lib/commonjs/getActionProcessor/core/crypto/utils/resolveSigningKeyAlias.js +19 -0
  30. package/lib/commonjs/getActionProcessor/core/crypto/utils/resolveSigningKeyAlias.js.map +1 -0
  31. package/lib/commonjs/getActionProcessor/core/file/getFileCopyActionProcessor.d.ts +1 -0
  32. package/lib/commonjs/getActionProcessor/core/file/getFileCopyActionProcessor.js +37 -0
  33. package/lib/commonjs/getActionProcessor/core/file/getFileCopyActionProcessor.js.map +1 -0
  34. package/lib/commonjs/getActionProcessor/core/file/index.js +2 -1
  35. package/lib/commonjs/getActionProcessor/core/file/index.js.map +1 -1
  36. package/lib/commonjs/lambdaHandlers/helpers/getLambdaRuntimeRemainingTimeActionProcessor.d.ts +8 -0
  37. package/lib/commonjs/lambdaHandlers/helpers/getLambdaRuntimeRemainingTimeActionProcessor.js +26 -0
  38. package/lib/commonjs/lambdaHandlers/helpers/getLambdaRuntimeRemainingTimeActionProcessor.js.map +1 -0
  39. package/lib/commonjs/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.js +6 -3
  40. package/lib/commonjs/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.js.map +1 -1
  41. package/lib/commonjs/lambdaHandlers/helpers/index.d.ts +1 -0
  42. package/lib/commonjs/lambdaHandlers/helpers/index.js +1 -0
  43. package/lib/commonjs/lambdaHandlers/helpers/index.js.map +1 -1
  44. package/lib/commonjs/logic/kms/getCachedPublicKey.d.ts +1 -0
  45. package/lib/commonjs/logic/kms/getCachedPublicKey.js +45 -0
  46. package/lib/commonjs/logic/kms/getCachedPublicKey.js.map +1 -0
  47. package/lib/commonjs/logic/kms/signWithKey.d.ts +1 -0
  48. package/lib/commonjs/logic/kms/signWithKey.js +34 -0
  49. package/lib/commonjs/logic/kms/signWithKey.js.map +1 -0
  50. package/lib/commonjs/logic/s3/copyFile.d.ts +5 -0
  51. package/lib/commonjs/logic/s3/copyFile.js +31 -0
  52. package/lib/commonjs/logic/s3/copyFile.js.map +1 -0
  53. package/lib/commonjs/logic/s3/s3Utils.d.ts +1 -0
  54. package/lib/commonjs/logic/s3/s3Utils.js +1 -0
  55. package/lib/commonjs/logic/s3/s3Utils.js.map +1 -1
  56. package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js +4 -3
  57. package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
  58. package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +4 -5
  59. package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js.map +1 -1
  60. package/lib/esm/getActionProcessor/core/ai/logic/buildAiStopConditions.d.ts +13 -0
  61. package/lib/esm/getActionProcessor/core/ai/logic/buildAiStopConditions.js +20 -0
  62. package/lib/esm/getActionProcessor/core/ai/logic/buildAiStopConditions.js.map +1 -0
  63. package/lib/esm/getActionProcessor/core/ai/logic/index.d.ts +1 -0
  64. package/lib/esm/getActionProcessor/core/ai/logic/index.js +1 -0
  65. package/lib/esm/getActionProcessor/core/ai/logic/index.js.map +1 -1
  66. package/lib/esm/getActionProcessor/core/crypto/getCryptoGetPublicKeyActionProcessor.d.ts +1 -0
  67. package/lib/esm/getActionProcessor/core/crypto/getCryptoGetPublicKeyActionProcessor.js +22 -0
  68. package/lib/esm/getActionProcessor/core/crypto/getCryptoGetPublicKeyActionProcessor.js.map +1 -0
  69. package/lib/esm/getActionProcessor/core/crypto/getCryptoSignActionProcessor.d.ts +1 -0
  70. package/lib/esm/getActionProcessor/core/crypto/getCryptoSignActionProcessor.js +24 -0
  71. package/lib/esm/getActionProcessor/core/crypto/getCryptoSignActionProcessor.js.map +1 -0
  72. package/lib/esm/getActionProcessor/core/crypto/getCryptoVerifyActionProcessor.d.ts +1 -0
  73. package/lib/esm/getActionProcessor/core/crypto/getCryptoVerifyActionProcessor.js +29 -0
  74. package/lib/esm/getActionProcessor/core/crypto/getCryptoVerifyActionProcessor.js.map +1 -0
  75. package/lib/esm/getActionProcessor/core/crypto/index.js +6 -0
  76. package/lib/esm/getActionProcessor/core/crypto/index.js.map +1 -1
  77. package/lib/esm/getActionProcessor/core/crypto/kmsSigningErrorMap.d.ts +13 -0
  78. package/lib/esm/getActionProcessor/core/crypto/kmsSigningErrorMap.js +12 -0
  79. package/lib/esm/getActionProcessor/core/crypto/kmsSigningErrorMap.js.map +1 -0
  80. package/lib/esm/getActionProcessor/core/crypto/utils/index.d.ts +1 -0
  81. package/lib/esm/getActionProcessor/core/crypto/utils/index.js +1 -0
  82. package/lib/esm/getActionProcessor/core/crypto/utils/index.js.map +1 -1
  83. package/lib/esm/getActionProcessor/core/crypto/utils/resolveSigningKeyAlias.d.ts +2 -0
  84. package/lib/esm/getActionProcessor/core/crypto/utils/resolveSigningKeyAlias.js +14 -0
  85. package/lib/esm/getActionProcessor/core/crypto/utils/resolveSigningKeyAlias.js.map +1 -0
  86. package/lib/esm/getActionProcessor/core/file/getFileCopyActionProcessor.d.ts +1 -0
  87. package/lib/esm/getActionProcessor/core/file/getFileCopyActionProcessor.js +25 -0
  88. package/lib/esm/getActionProcessor/core/file/getFileCopyActionProcessor.js.map +1 -0
  89. package/lib/esm/getActionProcessor/core/file/index.js +2 -0
  90. package/lib/esm/getActionProcessor/core/file/index.js.map +1 -1
  91. package/lib/esm/lambdaHandlers/helpers/getLambdaRuntimeRemainingTimeActionProcessor.d.ts +8 -0
  92. package/lib/esm/lambdaHandlers/helpers/getLambdaRuntimeRemainingTimeActionProcessor.js +13 -0
  93. package/lib/esm/lambdaHandlers/helpers/getLambdaRuntimeRemainingTimeActionProcessor.js.map +1 -0
  94. package/lib/esm/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.js +6 -2
  95. package/lib/esm/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.js.map +1 -1
  96. package/lib/esm/lambdaHandlers/helpers/index.d.ts +1 -0
  97. package/lib/esm/lambdaHandlers/helpers/index.js +1 -0
  98. package/lib/esm/lambdaHandlers/helpers/index.js.map +1 -1
  99. package/lib/esm/logic/kms/getCachedPublicKey.d.ts +1 -0
  100. package/lib/esm/logic/kms/getCachedPublicKey.js +32 -0
  101. package/lib/esm/logic/kms/getCachedPublicKey.js.map +1 -0
  102. package/lib/esm/logic/kms/signWithKey.d.ts +1 -0
  103. package/lib/esm/logic/kms/signWithKey.js +21 -0
  104. package/lib/esm/logic/kms/signWithKey.js.map +1 -0
  105. package/lib/esm/logic/s3/copyFile.d.ts +5 -0
  106. package/lib/esm/logic/s3/copyFile.js +18 -0
  107. package/lib/esm/logic/s3/copyFile.js.map +1 -0
  108. package/lib/esm/logic/s3/s3Utils.d.ts +1 -0
  109. package/lib/esm/logic/s3/s3Utils.js +1 -0
  110. package/lib/esm/logic/s3/s3Utils.js.map +1 -1
  111. package/package.json +7 -7
@@ -14,6 +14,7 @@ const quidproquo_actionprocessor_js_1 = require("quidproquo-actionprocessor-js")
14
14
  const quidproquo_core_1 = require("quidproquo-core");
15
15
  const getActionProcessor_1 = require("../../getActionProcessor");
16
16
  const dynamicModuleLoaderWarmer_1 = require("./dynamicModuleLoaderWarmer");
17
+ const getLambdaRuntimeRemainingTimeActionProcessor_1 = require("./getLambdaRuntimeRemainingTimeActionProcessor");
17
18
  const getLogger_1 = require("./getLogger");
18
19
  const getRuntimeCorrelation_1 = require("./getRuntimeCorrelation");
19
20
  const isSnsWarmerRecord_1 = require("./isSnsWarmerRecord");
@@ -32,13 +33,15 @@ const isSnsEvent = (event) => {
32
33
  * short-circuits SNS warmer pings, runs the process-event story and ships logs.
33
34
  */
34
35
  const getQpqLambdaRuntimeForEvent = (runtimeType, getStorySession, getActionProcessorList, dynamicModuleLoader, qpqConfig, getProcessEventStory = () => quidproquo_core_1.askProcessEvent) => {
35
- const resolveActionProcessorList = () => __awaiter(void 0, void 0, void 0, function* () {
36
- return (Object.assign(Object.assign(Object.assign({}, (yield (0, getActionProcessor_1.getAwsActionProcessors)(qpqConfig, dynamicModuleLoader))), (yield getActionProcessorList(qpqConfig, dynamicModuleLoader))), (yield (0, quidproquo_actionprocessor_js_1.getCustomActionActionProcessor)(qpqConfig, dynamicModuleLoader))));
36
+ // Built per invoke: the lambda context (and so the execution deadline) is not
37
+ // known until the handler runs.
38
+ const getResolveActionProcessorList = (context) => () => __awaiter(void 0, void 0, void 0, function* () {
39
+ return (Object.assign(Object.assign(Object.assign(Object.assign({}, (yield (0, getActionProcessor_1.getAwsActionProcessors)(qpqConfig, dynamicModuleLoader))), (yield getActionProcessorList(qpqConfig, dynamicModuleLoader))), (0, getLambdaRuntimeRemainingTimeActionProcessor_1.getLambdaRuntimeRemainingTimeActionProcessor)(context)), (yield (0, quidproquo_actionprocessor_js_1.getCustomActionActionProcessor)(qpqConfig, dynamicModuleLoader))));
37
40
  });
38
41
  return (event, context) => __awaiter(void 0, void 0, void 0, function* () {
39
42
  console.log('tick: ', JSON.stringify(event, null, 2));
40
43
  const logger = (0, getLogger_1.getLogger)(qpqConfig);
41
- const resolveStory = (0, quidproquo_core_1.createRuntime)(qpqConfig, getStorySession(event), resolveActionProcessorList, () => new Date().toISOString(), logger, (0, getRuntimeCorrelation_1.getRuntimeCorrelation)(qpqConfig), runtimeType, dynamicModuleLoader);
44
+ const resolveStory = (0, quidproquo_core_1.createRuntime)(qpqConfig, getStorySession(event), getResolveActionProcessorList(context), () => new Date().toISOString(), logger, (0, getRuntimeCorrelation_1.getRuntimeCorrelation)(qpqConfig), runtimeType, dynamicModuleLoader);
42
45
  const processEvent = () => __awaiter(void 0, void 0, void 0, function* () {
43
46
  const result = yield resolveStory(getProcessEventStory(), [event, context]);
44
47
  yield logger.waitToFinishWriting();
@@ -1 +1 @@
1
- {"version":3,"file":"getQpqLambdaRuntimeForEvent.js","sourceRoot":"","sources":["../../../../src/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.ts"],"names":[],"mappings":"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","sourcesContent":["import { getCustomActionActionProcessor } from 'quidproquo-actionprocessor-js';\nimport {\n ActionProcessorList,\n ActionProcessorListResolver,\n askProcessEvent,\n createRuntime,\n DynamicModuleLoader,\n QPQConfig,\n QpqRuntimeType,\n StorySession,\n} from 'quidproquo-core';\n\nimport { Context, SNSEvent } from 'aws-lambda';\n\nimport { getAwsActionProcessors } from '../../getActionProcessor';\nimport { QpqFunctionExecutionEvent } from '../types';\nimport { dynamicModuleLoaderWarmer } from './dynamicModuleLoaderWarmer';\nimport { getLogger } from './getLogger';\nimport { getRuntimeCorrelation } from './getRuntimeCorrelation';\nimport { isSnsWarmerRecord } from './isSnsWarmerRecord';\n\n// SQS/S3/CloudFront events also have a Records array, so this matches more than\n// real SNS events. That is harmless: the warmer scan below only acts on records\n// whose EventSource is 'aws:sns', everything else falls through to processEvent.\nconst isSnsEvent = <T>(event: QpqFunctionExecutionEvent<T>): event is SNSEvent => {\n if (event && typeof event === 'object') {\n const possibleSnsEvent = event as unknown as SNSEvent;\n return possibleSnsEvent.Records && Array.isArray(possibleSnsEvent.Records);\n }\n\n return false;\n};\n\n/**\n * Builds the shared lambda handler: wires a qpq runtime for the event type,\n * short-circuits SNS warmer pings, runs the process-event story and ships logs.\n */\nexport const getQpqLambdaRuntimeForEvent = <E extends QpqFunctionExecutionEvent<any>>(\n runtimeType: QpqRuntimeType,\n getStorySession: (event: E) => StorySession,\n getActionProcessorList: ActionProcessorListResolver,\n dynamicModuleLoader: DynamicModuleLoader,\n qpqConfig: QPQConfig,\n getProcessEventStory: () => typeof askProcessEvent = () => askProcessEvent,\n) => {\n const resolveActionProcessorList = async (): Promise<ActionProcessorList> => ({\n ...(await getAwsActionProcessors(qpqConfig, dynamicModuleLoader)),\n ...(await getActionProcessorList(qpqConfig, dynamicModuleLoader)),\n\n // Always done last, so they can override the default ones if the user wants.\n ...(await getCustomActionActionProcessor(qpqConfig, dynamicModuleLoader)),\n });\n\n return async (event: E, context: Context) => {\n console.log('tick: ', JSON.stringify(event, null, 2));\n\n const logger = getLogger(qpqConfig);\n\n const resolveStory = createRuntime(\n qpqConfig,\n getStorySession(event),\n resolveActionProcessorList,\n () => new Date().toISOString(),\n logger,\n getRuntimeCorrelation(qpqConfig),\n runtimeType,\n dynamicModuleLoader,\n );\n\n const processEvent = async () => {\n const result = await resolveStory(getProcessEventStory(), [event, context]);\n await logger.waitToFinishWriting();\n\n if (result.error) {\n throw new Error(result.error.errorText);\n }\n\n console.log('Finished, returning: ', result.result);\n return result.result;\n };\n\n if (isSnsEvent(event)) {\n const recordsNoWarm = event.Records.filter((record) => !isSnsWarmerRecord(record));\n\n // A warmer ping arrives as its own single-record SNS event; any warmer\n // present means this invoke exists only to keep the sandbox warm.\n if (recordsNoWarm.length !== event.Records.length) {\n console.log('Found SNS warmer');\n\n // TODO: Warm qpq things with dynamic functions\n // federate in dynamic modules\n await dynamicModuleLoaderWarmer();\n\n // Might as well move the logs to permanent storage\n await logger.moveToPermanentStorage();\n\n return 'Warmed up!';\n }\n }\n\n return await processEvent();\n };\n};\n"]}
1
+ {"version":3,"file":"getQpqLambdaRuntimeForEvent.js","sourceRoot":"","sources":["../../../../src/lambdaHandlers/helpers/getQpqLambdaRuntimeForEvent.ts"],"names":[],"mappings":"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","sourcesContent":["import { getCustomActionActionProcessor } from 'quidproquo-actionprocessor-js';\nimport {\n ActionProcessorList,\n ActionProcessorListResolver,\n askProcessEvent,\n createRuntime,\n DynamicModuleLoader,\n QPQConfig,\n QpqRuntimeType,\n StorySession,\n} from 'quidproquo-core';\n\nimport { Context, SNSEvent } from 'aws-lambda';\n\nimport { getAwsActionProcessors } from '../../getActionProcessor';\nimport { QpqFunctionExecutionEvent } from '../types';\nimport { dynamicModuleLoaderWarmer } from './dynamicModuleLoaderWarmer';\nimport { getLambdaRuntimeRemainingTimeActionProcessor } from './getLambdaRuntimeRemainingTimeActionProcessor';\nimport { getLogger } from './getLogger';\nimport { getRuntimeCorrelation } from './getRuntimeCorrelation';\nimport { isSnsWarmerRecord } from './isSnsWarmerRecord';\n\n// SQS/S3/CloudFront events also have a Records array, so this matches more than\n// real SNS events. That is harmless: the warmer scan below only acts on records\n// whose EventSource is 'aws:sns', everything else falls through to processEvent.\nconst isSnsEvent = <T>(event: QpqFunctionExecutionEvent<T>): event is SNSEvent => {\n if (event && typeof event === 'object') {\n const possibleSnsEvent = event as unknown as SNSEvent;\n return possibleSnsEvent.Records && Array.isArray(possibleSnsEvent.Records);\n }\n\n return false;\n};\n\n/**\n * Builds the shared lambda handler: wires a qpq runtime for the event type,\n * short-circuits SNS warmer pings, runs the process-event story and ships logs.\n */\nexport const getQpqLambdaRuntimeForEvent = <E extends QpqFunctionExecutionEvent<any>>(\n runtimeType: QpqRuntimeType,\n getStorySession: (event: E) => StorySession,\n getActionProcessorList: ActionProcessorListResolver,\n dynamicModuleLoader: DynamicModuleLoader,\n qpqConfig: QPQConfig,\n getProcessEventStory: () => typeof askProcessEvent = () => askProcessEvent,\n) => {\n // Built per invoke: the lambda context (and so the execution deadline) is not\n // known until the handler runs.\n const getResolveActionProcessorList = (context: Context) => async (): Promise<ActionProcessorList> => ({\n ...(await getAwsActionProcessors(qpqConfig, dynamicModuleLoader)),\n ...(await getActionProcessorList(qpqConfig, dynamicModuleLoader)),\n ...getLambdaRuntimeRemainingTimeActionProcessor(context),\n\n // Always done last, so they can override the default ones if the user wants.\n ...(await getCustomActionActionProcessor(qpqConfig, dynamicModuleLoader)),\n });\n\n return async (event: E, context: Context) => {\n console.log('tick: ', JSON.stringify(event, null, 2));\n\n const logger = getLogger(qpqConfig);\n\n const resolveStory = createRuntime(\n qpqConfig,\n getStorySession(event),\n getResolveActionProcessorList(context),\n () => new Date().toISOString(),\n logger,\n getRuntimeCorrelation(qpqConfig),\n runtimeType,\n dynamicModuleLoader,\n );\n\n const processEvent = async () => {\n const result = await resolveStory(getProcessEventStory(), [event, context]);\n await logger.waitToFinishWriting();\n\n if (result.error) {\n throw new Error(result.error.errorText);\n }\n\n console.log('Finished, returning: ', result.result);\n return result.result;\n };\n\n if (isSnsEvent(event)) {\n const recordsNoWarm = event.Records.filter((record) => !isSnsWarmerRecord(record));\n\n // A warmer ping arrives as its own single-record SNS event; any warmer\n // present means this invoke exists only to keep the sandbox warm.\n if (recordsNoWarm.length !== event.Records.length) {\n console.log('Found SNS warmer');\n\n // TODO: Warm qpq things with dynamic functions\n // federate in dynamic modules\n await dynamicModuleLoaderWarmer();\n\n // Might as well move the logs to permanent storage\n await logger.moveToPermanentStorage();\n\n return 'Warmed up!';\n }\n }\n\n return await processEvent();\n };\n};\n"]}
@@ -1,5 +1,6 @@
1
1
  export * from './dynamicModuleLoaderWarmer';
2
2
  export * from './getBlankStorySession';
3
+ export * from './getLambdaRuntimeRemainingTimeActionProcessor';
3
4
  export * from './getLogger';
4
5
  export * from './getQpqLambdaRuntimeForEvent';
5
6
  export * from './getRuntimeCorrelation';
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./dynamicModuleLoaderWarmer"), exports);
18
18
  __exportStar(require("./getBlankStorySession"), exports);
19
+ __exportStar(require("./getLambdaRuntimeRemainingTimeActionProcessor"), exports);
19
20
  __exportStar(require("./getLogger"), exports);
20
21
  __exportStar(require("./getQpqLambdaRuntimeForEvent"), exports);
21
22
  __exportStar(require("./getRuntimeCorrelation"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lambdaHandlers/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,yDAAuC;AACvC,8CAA4B;AAC5B,gEAA8C;AAC9C,0DAAwC;AACxC,sDAAoC","sourcesContent":["export * from './dynamicModuleLoaderWarmer';\nexport * from './getBlankStorySession';\nexport * from './getLogger';\nexport * from './getQpqLambdaRuntimeForEvent';\nexport * from './getRuntimeCorrelation';\nexport * from './isSnsWarmerRecord';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lambdaHandlers/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,yDAAuC;AACvC,iFAA+D;AAC/D,8CAA4B;AAC5B,gEAA8C;AAC9C,0DAAwC;AACxC,sDAAoC","sourcesContent":["export * from './dynamicModuleLoaderWarmer';\nexport * from './getBlankStorySession';\nexport * from './getLambdaRuntimeRemainingTimeActionProcessor';\nexport * from './getLogger';\nexport * from './getQpqLambdaRuntimeForEvent';\nexport * from './getRuntimeCorrelation';\nexport * from './isSnsWarmerRecord';\n"]}
@@ -0,0 +1 @@
1
+ export declare const getCachedPublicKey: (keyAlias: string, region: string) => Promise<string>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getCachedPublicKey = void 0;
13
+ const quidproquo_actionprocessor_node_1 = require("quidproquo-actionprocessor-node");
14
+ const client_kms_1 = require("@aws-sdk/client-kms");
15
+ const createAwsClient_1 = require("../createAwsClient");
16
+ // The public half of a signing key is immutable for the life of the key, so it is
17
+ // fetched once per alias per runtime and verification runs locally from then on:
18
+ // askCryptoVerify costs no KMS call after warm-up, and needs no kms:Verify grant.
19
+ // Bounded by age only so a key replaced under the same alias is picked up.
20
+ const PUBLIC_KEY_MAX_AGE_MS = 60 * 60 * 1000;
21
+ const cache = new Map();
22
+ const getCachedPublicKey = (keyAlias, region) => __awaiter(void 0, void 0, void 0, function* () {
23
+ const cacheKey = `${region}|${keyAlias}`;
24
+ const cached = cache.get(cacheKey);
25
+ if (cached && cached.expiresAt > Date.now()) {
26
+ return cached.publicKeyPem;
27
+ }
28
+ const kmsClient = (0, createAwsClient_1.createAwsClient)(client_kms_1.KMSClient, {
29
+ region,
30
+ });
31
+ const response = yield kmsClient.send(new client_kms_1.GetPublicKeyCommand({
32
+ KeyId: keyAlias,
33
+ }));
34
+ if (!response.PublicKey) {
35
+ throw new Error(`KMS returned no public key for [${keyAlias}]`);
36
+ }
37
+ const publicKeyPem = (0, quidproquo_actionprocessor_node_1.spkiDerToPem)(Buffer.from(response.PublicKey));
38
+ cache.set(cacheKey, {
39
+ publicKeyPem,
40
+ expiresAt: Date.now() + PUBLIC_KEY_MAX_AGE_MS,
41
+ });
42
+ return publicKeyPem;
43
+ });
44
+ exports.getCachedPublicKey = getCachedPublicKey;
45
+ //# sourceMappingURL=getCachedPublicKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCachedPublicKey.js","sourceRoot":"","sources":["../../../../src/logic/kms/getCachedPublicKey.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qFAA+D;AAE/D,oDAAqE;AAErE,wDAAqD;AAErD,kFAAkF;AAClF,iFAAiF;AACjF,kFAAkF;AAClF,2EAA2E;AAC3E,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAO7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;AAE1C,MAAM,kBAAkB,GAAG,CAAO,QAAgB,EAAE,MAAc,EAAmB,EAAE;IAC5F,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,iCAAe,EAAC,sBAAS,EAAE;QAC3C,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CACnC,IAAI,gCAAmB,CAAC;QACtB,KAAK,EAAE,QAAQ;KAChB,CAAC,CACH,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,YAAY,GAAG,IAAA,8CAAY,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;QAClB,YAAY;QACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB;KAC9C,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC,CAAA,CAAC;AA9BW,QAAA,kBAAkB,sBA8B7B","sourcesContent":["import { spkiDerToPem } from 'quidproquo-actionprocessor-node';\n\nimport { GetPublicKeyCommand, KMSClient } from '@aws-sdk/client-kms';\n\nimport { createAwsClient } from '../createAwsClient';\n\n// The public half of a signing key is immutable for the life of the key, so it is\n// fetched once per alias per runtime and verification runs locally from then on:\n// askCryptoVerify costs no KMS call after warm-up, and needs no kms:Verify grant.\n// Bounded by age only so a key replaced under the same alias is picked up.\nconst PUBLIC_KEY_MAX_AGE_MS = 60 * 60 * 1000;\n\ntype CachedPublicKey = {\n publicKeyPem: string;\n expiresAt: number;\n};\n\nconst cache = new Map<string, CachedPublicKey>();\n\nexport const getCachedPublicKey = async (keyAlias: string, region: string): Promise<string> => {\n const cacheKey = `${region}|${keyAlias}`;\n\n const cached = cache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.publicKeyPem;\n }\n\n const kmsClient = createAwsClient(KMSClient, {\n region,\n });\n\n const response = await kmsClient.send(\n new GetPublicKeyCommand({\n KeyId: keyAlias,\n }),\n );\n\n if (!response.PublicKey) {\n throw new Error(`KMS returned no public key for [${keyAlias}]`);\n }\n\n const publicKeyPem = spkiDerToPem(Buffer.from(response.PublicKey));\n\n cache.set(cacheKey, {\n publicKeyPem,\n expiresAt: Date.now() + PUBLIC_KEY_MAX_AGE_MS,\n });\n\n return publicKeyPem;\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const signWithKey: (keyAlias: string, message: string, region: string) => Promise<Buffer>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.signWithKey = void 0;
13
+ const quidproquo_actionprocessor_node_1 = require("quidproquo-actionprocessor-node");
14
+ const client_kms_1 = require("@aws-sdk/client-kms");
15
+ const createAwsClient_1 = require("../createAwsClient");
16
+ // One kms:Sign per call: the private key never leaves KMS, so there is nothing
17
+ // to cache here. Returns the raw signature bytes.
18
+ const signWithKey = (keyAlias, message, region) => __awaiter(void 0, void 0, void 0, function* () {
19
+ const kmsClient = (0, createAwsClient_1.createAwsClient)(client_kms_1.KMSClient, {
20
+ region,
21
+ });
22
+ const response = yield kmsClient.send(new client_kms_1.SignCommand({
23
+ KeyId: keyAlias,
24
+ Message: Buffer.from(message, 'utf8'),
25
+ MessageType: 'RAW',
26
+ SigningAlgorithm: quidproquo_actionprocessor_node_1.RS256_KMS_SIGNING_ALGORITHM,
27
+ }));
28
+ if (!response.Signature) {
29
+ throw new Error(`KMS returned no signature for [${keyAlias}]`);
30
+ }
31
+ return Buffer.from(response.Signature);
32
+ });
33
+ exports.signWithKey = signWithKey;
34
+ //# sourceMappingURL=signWithKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signWithKey.js","sourceRoot":"","sources":["../../../../src/logic/kms/signWithKey.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qFAA8E;AAE9E,oDAA6D;AAE7D,wDAAqD;AAErD,+EAA+E;AAC/E,kDAAkD;AAC3C,MAAM,WAAW,GAAG,CAAO,QAAgB,EAAE,OAAe,EAAE,MAAc,EAAmB,EAAE;IACtG,MAAM,SAAS,GAAG,IAAA,iCAAe,EAAC,sBAAS,EAAE;QAC3C,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CACnC,IAAI,wBAAW,CAAC;QACd,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QACrC,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,6DAA2B;KAC9C,CAAC,CACH,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC,CAAA,CAAC;AAnBW,QAAA,WAAW,eAmBtB","sourcesContent":["import { RS256_KMS_SIGNING_ALGORITHM } from 'quidproquo-actionprocessor-node';\n\nimport { KMSClient, SignCommand } from '@aws-sdk/client-kms';\n\nimport { createAwsClient } from '../createAwsClient';\n\n// One kms:Sign per call: the private key never leaves KMS, so there is nothing\n// to cache here. Returns the raw signature bytes.\nexport const signWithKey = async (keyAlias: string, message: string, region: string): Promise<Buffer> => {\n const kmsClient = createAwsClient(KMSClient, {\n region,\n });\n\n const response = await kmsClient.send(\n new SignCommand({\n KeyId: keyAlias,\n Message: Buffer.from(message, 'utf8'),\n MessageType: 'RAW',\n SigningAlgorithm: RS256_KMS_SIGNING_ALGORITHM,\n }),\n );\n\n if (!response.Signature) {\n throw new Error(`KMS returned no signature for [${keyAlias}]`);\n }\n\n return Buffer.from(response.Signature);\n};\n"]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Server-side copies one object to another key (same or another bucket). The default COPY metadata
3
+ * directive carries the stored Content-Type / Content-Disposition across unchanged.
4
+ */
5
+ export declare const copyFile: (sourceBucketName: string, sourceKey: string, targetBucketName: string, targetKey: string, region: string) => Promise<void>;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.copyFile = void 0;
13
+ const client_s3_1 = require("@aws-sdk/client-s3");
14
+ const createAwsClient_1 = require("../createAwsClient");
15
+ // CopySource is a URL path, so each key segment is percent-encoded (a key can hold spaces, '+', '#'...);
16
+ // the '/' between segments stays a separator.
17
+ const encodeCopySource = (bucketName, key) => `${bucketName}/${key.split('/').map(encodeURIComponent).join('/')}`;
18
+ /**
19
+ * Server-side copies one object to another key (same or another bucket). The default COPY metadata
20
+ * directive carries the stored Content-Type / Content-Disposition across unchanged.
21
+ */
22
+ const copyFile = (sourceBucketName, sourceKey, targetBucketName, targetKey, region) => __awaiter(void 0, void 0, void 0, function* () {
23
+ const s3Client = (0, createAwsClient_1.createAwsClient)(client_s3_1.S3Client, { region });
24
+ yield s3Client.send(new client_s3_1.CopyObjectCommand({
25
+ CopySource: encodeCopySource(sourceBucketName, sourceKey),
26
+ Bucket: targetBucketName,
27
+ Key: targetKey,
28
+ }));
29
+ });
30
+ exports.copyFile = copyFile;
31
+ //# sourceMappingURL=copyFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyFile.js","sourceRoot":"","sources":["../../../../src/logic/s3/copyFile.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAAiE;AAEjE,wDAAqD;AAErD,yGAAyG;AACzG,8CAA8C;AAC9C,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,GAAW,EAAU,EAAE,CAAC,GAAG,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAE1I;;;GAGG;AACI,MAAM,QAAQ,GAAG,CACtB,gBAAwB,EACxB,SAAiB,EACjB,gBAAwB,EACxB,SAAiB,EACjB,MAAc,EACC,EAAE;IACjB,MAAM,QAAQ,GAAG,IAAA,iCAAe,EAAC,oBAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvD,MAAM,QAAQ,CAAC,IAAI,CACjB,IAAI,6BAAiB,CAAC;QACpB,UAAU,EAAE,gBAAgB,CAAC,gBAAgB,EAAE,SAAS,CAAC;QACzD,MAAM,EAAE,gBAAgB;QACxB,GAAG,EAAE,SAAS;KACf,CAAC,CACH,CAAC;AACJ,CAAC,CAAA,CAAC;AAhBW,QAAA,QAAQ,YAgBnB","sourcesContent":["import { CopyObjectCommand, S3Client } from '@aws-sdk/client-s3';\n\nimport { createAwsClient } from '../createAwsClient';\n\n// CopySource is a URL path, so each key segment is percent-encoded (a key can hold spaces, '+', '#'...);\n// the '/' between segments stays a separator.\nconst encodeCopySource = (bucketName: string, key: string): string => `${bucketName}/${key.split('/').map(encodeURIComponent).join('/')}`;\n\n/**\n * Server-side copies one object to another key (same or another bucket). The default COPY metadata\n * directive carries the stored Content-Type / Content-Disposition across unchanged.\n */\nexport const copyFile = async (\n sourceBucketName: string,\n sourceKey: string,\n targetBucketName: string,\n targetKey: string,\n region: string,\n): Promise<void> => {\n const s3Client = createAwsClient(S3Client, { region });\n\n await s3Client.send(\n new CopyObjectCommand({\n CopySource: encodeCopySource(sourceBucketName, sourceKey),\n Bucket: targetBucketName,\n Key: targetKey,\n }),\n );\n};\n"]}
@@ -1,3 +1,4 @@
1
+ export * from './copyFile';
1
2
  export * from './deleteFiles';
2
3
  export * from './generatePresignedUploadUrl';
3
4
  export * from './generatePresignedUrl';
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  // The s3 folder's barrel (kept under its historical name: many processors and their
18
18
  // vi.mock calls point at 'logic/s3/s3Utils').
19
+ __exportStar(require("./copyFile"), exports);
19
20
  __exportStar(require("./deleteFiles"), exports);
20
21
  __exportStar(require("./generatePresignedUploadUrl"), exports);
21
22
  __exportStar(require("./generatePresignedUrl"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"s3Utils.js","sourceRoot":"","sources":["../../../../src/logic/s3/s3Utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oFAAoF;AACpF,8CAA8C;AAC9C,gDAA8B;AAC9B,+DAA6C;AAC7C,yDAAuC;AACvC,0DAAwC;AACxC,8CAA4B;AAC5B,iDAA+B;AAC/B,mDAAiC;AACjC,iDAA+B;AAC/B,oDAAkC;AAClC,kDAAgC","sourcesContent":["// The s3 folder's barrel (kept under its historical name: many processors and their\n// vi.mock calls point at 'logic/s3/s3Utils').\nexport * from './deleteFiles';\nexport * from './generatePresignedUploadUrl';\nexport * from './generatePresignedUrl';\nexport * from './getObjectStorageClass';\nexport * from './listFiles';\nexport * from './objectExists';\nexport * from './readBinaryFile';\nexport * from './readTextFile';\nexport * from './writeBinaryFile';\nexport * from './writeTextFile';\n"]}
1
+ {"version":3,"file":"s3Utils.js","sourceRoot":"","sources":["../../../../src/logic/s3/s3Utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oFAAoF;AACpF,8CAA8C;AAC9C,6CAA2B;AAC3B,gDAA8B;AAC9B,+DAA6C;AAC7C,yDAAuC;AACvC,0DAAwC;AACxC,8CAA4B;AAC5B,iDAA+B;AAC/B,mDAAiC;AACjC,iDAA+B;AAC/B,oDAAkC;AAClC,kDAAgC","sourcesContent":["// The s3 folder's barrel (kept under its historical name: many processors and their\n// vi.mock calls point at 'logic/s3/s3Utils').\nexport * from './copyFile';\nexport * from './deleteFiles';\nexport * from './generatePresignedUploadUrl';\nexport * from './generatePresignedUrl';\nexport * from './getObjectStorageClass';\nexport * from './listFiles';\nexport * from './objectExists';\nexport * from './readBinaryFile';\nexport * from './readTextFile';\nexport * from './writeBinaryFile';\nexport * from './writeTextFile';\n"]}
@@ -1,6 +1,6 @@
1
1
  import { actionResult, actionResultError, askAiPrompt, createActionProcessor, ErrorTypeEnum, } from 'quidproquo-core';
2
- import { generateText, stepCountIs } from 'ai';
3
- import { createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';
2
+ import { generateText } from 'ai';
3
+ import { buildAiStopConditions, createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';
4
4
  const getProcessAiPrompt = (qpqConfig) => {
5
5
  return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {
6
6
  const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
@@ -23,7 +23,8 @@ const getProcessAiPrompt = (qpqConfig) => {
23
23
  ...promptOrMessages,
24
24
  tools: prepared.tools,
25
25
  providerOptions,
26
- stopWhen: stepCountIs(20),
26
+ stopWhen: buildAiStopConditions(payload),
27
+ maxOutputTokens: payload.maxOutputTokens,
27
28
  });
28
29
  if (payload.caching) {
29
30
  // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage; that
@@ -1 +1 @@
1
- {"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EAEjB,WAAW,EACX,qBAAqB,EACrB,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE9H,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAAoC,EAAE;IACpF,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,EAAE;QACjH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;QACpI,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,OAAO,iBAAiB,CAAC,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,mBAAmB,CAC3B,MAAM,aAAa,CACjB,OAAO,CAAC,QAAQ,EAChB,uBAAuB,CAAC,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,kFAAkF;YAClF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS;gBACvC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY,IAAI,IAAI,EAAE,EAAE,EAAE;gBACtH,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC1D,GAAG,gBAAgB;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,eAAe;gBACf,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;aAC1B,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,qFAAqF;gBACrF,uFAAuF;gBACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,YAAY,CAAC,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,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,+CAA+C,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,qBAAqB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC","sourcesContent":["import {\n actionResult,\n actionResultError,\n AiActionType,\n askAiPrompt,\n createActionProcessor,\n ErrorTypeEnum,\n ProcessorFor,\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): ProcessorFor<typeof askAiPrompt> => {\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 = createActionProcessor(askAiPrompt, getProcessAiPrompt);\n"]}
1
+ {"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EAEjB,WAAW,EACX,qBAAqB,EACrB,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErJ,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAAoC,EAAE;IACpF,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,EAAE;QACjH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;QACpI,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,OAAO,iBAAiB,CAAC,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,mBAAmB,CAC3B,MAAM,aAAa,CACjB,OAAO,CAAC,QAAQ,EAChB,uBAAuB,CAAC,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,kFAAkF;YAClF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS;gBACvC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY,IAAI,IAAI,EAAE,EAAE,EAAE;gBACtH,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC1D,GAAG,gBAAgB;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,eAAe;gBACf,QAAQ,EAAE,qBAAqB,CAAC,OAAO,CAAC;gBACxC,eAAe,EAAE,OAAO,CAAC,eAAe;aACzC,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,qFAAqF;gBACrF,uFAAuF;gBACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,YAAY,CAAC,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,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,+CAA+C,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,qBAAqB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC","sourcesContent":["import {\n actionResult,\n actionResultError,\n AiActionType,\n askAiPrompt,\n createActionProcessor,\n ErrorTypeEnum,\n ProcessorFor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { generateText } from 'ai';\n\nimport { buildAiStopConditions, createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPrompt = (qpqConfig: QPQConfig): ProcessorFor<typeof askAiPrompt> => {\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: buildAiStopConditions(payload),\n maxOutputTokens: payload.maxOutputTokens,\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 = createActionProcessor(askAiPrompt, getProcessAiPrompt);\n"]}
@@ -1,7 +1,7 @@
1
1
  import { actionResult, actionResultError, askAiPromptStream, createActionProcessor, ErrorTypeEnum, } from 'quidproquo-core';
2
- import { stepCountIs, streamText } from 'ai';
2
+ import { streamText } from 'ai';
3
3
  import { randomGuid } from '../../../awsLambdaUtils';
4
- import { createDriveFileResolver, mapAiStreamPart, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toErrorMessage, toSdkMessages, } from './logic';
4
+ import { buildAiStopConditions, createDriveFileResolver, mapAiStreamPart, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toErrorMessage, toSdkMessages, } from './logic';
5
5
  const getProcessAiPromptStream = (qpqConfig) => {
6
6
  return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {
7
7
  const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
@@ -24,9 +24,8 @@ const getProcessAiPromptStream = (qpqConfig) => {
24
24
  ...promptOrMessages,
25
25
  tools: prepared.tools,
26
26
  providerOptions,
27
- // Caps the server-side tool loop. Client-side tools (no executor) still halt
28
- // immediately with finishReason 'tool-calls' so the caller can resume the turn.
29
- stopWhen: stepCountIs(20),
27
+ stopWhen: buildAiStopConditions(payload),
28
+ maxOutputTokens: payload.maxOutputTokens,
30
29
  // streamText swallows errors by default to keep the server alive; surface them to
31
30
  // CloudWatch. The same error also reaches the consumer as an Error stream part.
32
31
  onError: ({ error }) => {
@@ -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 actionResult,\n actionResultError,\n AiActionType,\n askAiPromptStream,\n createActionProcessor,\n ErrorTypeEnum,\n ProcessorFor,\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): ProcessorFor<typeof askAiPromptStream> => {\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 // Caps the server-side tool loop. Client-side tools (no executor) still halt\n // immediately with finishReason 'tool-calls' so the caller can resume the turn.\n stopWhen: stepCountIs(20),\n // streamText swallows errors by default to keep the server alive; surface them to\n // CloudWatch. The same error also reaches the consumer as an Error stream part.\n onError: ({ error }) => {\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 = createActionProcessor(askAiPromptStream, getProcessAiPromptStream);\n"]}
1
+ {"version":3,"file":"getAiPromptStreamActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n actionResult,\n actionResultError,\n AiActionType,\n askAiPromptStream,\n createActionProcessor,\n ErrorTypeEnum,\n ProcessorFor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { streamText } from 'ai';\n\nimport { randomGuid } from '../../../awsLambdaUtils';\nimport {\n buildAiStopConditions,\n createDriveFileResolver,\n mapAiStreamPart,\n prepareAiPromptCall,\n toCacheableMessages,\n toCacheableSystem,\n toErrorMessage,\n toSdkMessages,\n} from './logic';\n\nconst getProcessAiPromptStream = (qpqConfig: QPQConfig): ProcessorFor<typeof askAiPromptStream> => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking: thinking progress streams out as Reasoning* parts.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const { fullStream, finalStep } = streamText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: buildAiStopConditions(payload),\n maxOutputTokens: payload.maxOutputTokens,\n // streamText swallows errors by default to keep the server alive; surface them to\n // CloudWatch. The same error also reaches the consumer as an Error stream part.\n onError: ({ error }) => {\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 = createActionProcessor(askAiPromptStream, getProcessAiPromptStream);\n"]}
@@ -0,0 +1,13 @@
1
+ import { StopCondition, ToolSet } from 'ai';
2
+ export type AiStopLimits = {
3
+ maxSteps?: number;
4
+ maxDurationMs?: number;
5
+ };
6
+ /**
7
+ * The `stopWhen` set for a prompt. The SDK defaults to a single step, so this always
8
+ * returns a list, even an empty one: with no limits the loop runs until the model stops
9
+ * on its own (a client-side tool call still halts it). Conditions only run between
10
+ * steps, so the time cap can overrun by one step; callers leave headroom. Its clock
11
+ * starts when this is built, which is just before the SDK call.
12
+ */
13
+ export declare const buildAiStopConditions: ({ maxSteps, maxDurationMs }: AiStopLimits, now?: () => number) => StopCondition<ToolSet>[];
@@ -0,0 +1,20 @@
1
+ import { stepCountIs } from 'ai';
2
+ /**
3
+ * The `stopWhen` set for a prompt. The SDK defaults to a single step, so this always
4
+ * returns a list, even an empty one: with no limits the loop runs until the model stops
5
+ * on its own (a client-side tool call still halts it). Conditions only run between
6
+ * steps, so the time cap can overrun by one step; callers leave headroom. Its clock
7
+ * starts when this is built, which is just before the SDK call.
8
+ */
9
+ export const buildAiStopConditions = ({ maxSteps, maxDurationMs }, now = Date.now) => {
10
+ const conditions = [];
11
+ if (maxSteps !== undefined) {
12
+ conditions.push(stepCountIs(maxSteps));
13
+ }
14
+ if (maxDurationMs !== undefined) {
15
+ const startedAt = now();
16
+ conditions.push(() => now() - startedAt >= maxDurationMs);
17
+ }
18
+ return conditions;
19
+ };
20
+ //# sourceMappingURL=buildAiStopConditions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildAiStopConditions.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/buildAiStopConditions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0B,MAAM,IAAI,CAAC;AAOzD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAgB,EAAE,MAAoB,IAAI,CAAC,GAAG,EAA4B,EAAE;IACzI,MAAM,UAAU,GAA6B,EAAE,CAAC;IAEhD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC","sourcesContent":["import { stepCountIs, StopCondition, ToolSet } from 'ai';\n\nexport type AiStopLimits = {\n maxSteps?: number;\n maxDurationMs?: number;\n};\n\n/**\n * The `stopWhen` set for a prompt. The SDK defaults to a single step, so this always\n * returns a list, even an empty one: with no limits the loop runs until the model stops\n * on its own (a client-side tool call still halts it). Conditions only run between\n * steps, so the time cap can overrun by one step; callers leave headroom. Its clock\n * starts when this is built, which is just before the SDK call.\n */\nexport const buildAiStopConditions = ({ maxSteps, maxDurationMs }: AiStopLimits, now: () => number = Date.now): StopCondition<ToolSet>[] => {\n const conditions: StopCondition<ToolSet>[] = [];\n\n if (maxSteps !== undefined) {\n conditions.push(stepCountIs(maxSteps));\n }\n\n if (maxDurationMs !== undefined) {\n const startedAt = now();\n conditions.push(() => now() - startedAt >= maxDurationMs);\n }\n\n return conditions;\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  export * from './aiStreamPartMappers';
2
+ export * from './buildAiStopConditions';
2
3
  export * from './createDriveFileResolver';
3
4
  export * from './mapAiStreamAbort';
4
5
  export * from './mapAiStreamCustom';
@@ -1,4 +1,5 @@
1
1
  export * from './aiStreamPartMappers';
2
+ export * from './buildAiStopConditions';
2
3
  export * from './createDriveFileResolver';
3
4
  export * from './mapAiStreamAbort';
4
5
  export * from './mapAiStreamCustom';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC","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"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC","sourcesContent":["export * from './aiStreamPartMappers';\nexport * from './buildAiStopConditions';\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"]}
@@ -0,0 +1 @@
1
+ export declare const getCryptoGetPublicKeyActionProcessor: import("quidproquo-core").ActionProcessorListResolver;
@@ -0,0 +1,22 @@
1
+ import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, askCryptoGetPublicKey, createActionProcessor, } from 'quidproquo-core';
3
+ import { getCachedPublicKey } from '../../../logic/kms/getCachedPublicKey';
4
+ import { kmsSigningErrorMap, signingKeyNotConfiguredMessage } from './kmsSigningErrorMap';
5
+ import { resolveSigningKeyAlias } from './utils';
6
+ const getProcessCryptoGetPublicKey = (qpqConfig) => {
7
+ return async ({ keyName }) => {
8
+ const keyAlias = resolveSigningKeyAlias(keyName, qpqConfig);
9
+ if (!keyAlias) {
10
+ return actionResultError(askCryptoGetPublicKey.errorType.KeyNotConfigured, signingKeyNotConfiguredMessage(keyName));
11
+ }
12
+ const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
13
+ try {
14
+ return actionResult(await getCachedPublicKey(keyAlias, region));
15
+ }
16
+ catch (error) {
17
+ return actionResultErrorFromCaughtError(error, kmsSigningErrorMap(askCryptoGetPublicKey.errorType, keyName));
18
+ }
19
+ };
20
+ };
21
+ export const getCryptoGetPublicKeyActionProcessor = createActionProcessor(askCryptoGetPublicKey, getProcessCryptoGetPublicKey);
22
+ //# sourceMappingURL=getCryptoGetPublicKeyActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCryptoGetPublicKeyActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/crypto/getCryptoGetPublicKeyActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gCAAgC,EAChC,qBAAqB,EACrB,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,4BAA4B,GAAG,CAAC,SAAoB,EAA8C,EAAE;IACxG,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,iBAAiB,CAAC,qBAAqB,CAAC,SAAS,CAAC,gBAAgB,EAAE,8BAA8B,CAAC,OAAO,CAAC,CAAC,CAAC;QACtH,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,MAAM,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,gCAAgC,CAAC,KAAK,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAG,qBAAqB,CAAC,qBAAqB,EAAE,4BAA4B,CAAC,CAAC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n askCryptoGetPublicKey,\n createActionProcessor,\n ProcessorFor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { getCachedPublicKey } from '../../../logic/kms/getCachedPublicKey';\nimport { kmsSigningErrorMap, signingKeyNotConfiguredMessage } from './kmsSigningErrorMap';\nimport { resolveSigningKeyAlias } from './utils';\n\nconst getProcessCryptoGetPublicKey = (qpqConfig: QPQConfig): ProcessorFor<typeof askCryptoGetPublicKey> => {\n return async ({ keyName }) => {\n const keyAlias = resolveSigningKeyAlias(keyName, qpqConfig);\n if (!keyAlias) {\n return actionResultError(askCryptoGetPublicKey.errorType.KeyNotConfigured, signingKeyNotConfiguredMessage(keyName));\n }\n\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n try {\n return actionResult(await getCachedPublicKey(keyAlias, region));\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, kmsSigningErrorMap(askCryptoGetPublicKey.errorType, keyName));\n }\n };\n};\n\nexport const getCryptoGetPublicKeyActionProcessor = createActionProcessor(askCryptoGetPublicKey, getProcessCryptoGetPublicKey);\n"]}
@@ -0,0 +1 @@
1
+ export declare const getCryptoSignActionProcessor: import("quidproquo-core").ActionProcessorListResolver;
@@ -0,0 +1,24 @@
1
+ import { base64UrlEncode } from 'quidproquo-actionprocessor-node';
2
+ import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
3
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, askCryptoSign, createActionProcessor, } from 'quidproquo-core';
4
+ import { signWithKey } from '../../../logic/kms/signWithKey';
5
+ import { kmsSigningErrorMap, signingKeyNotConfiguredMessage } from './kmsSigningErrorMap';
6
+ import { resolveSigningKeyAlias } from './utils';
7
+ const getProcessCryptoSign = (qpqConfig) => {
8
+ return async ({ keyName, message }) => {
9
+ const keyAlias = resolveSigningKeyAlias(keyName, qpqConfig);
10
+ if (!keyAlias) {
11
+ return actionResultError(askCryptoSign.errorType.KeyNotConfigured, signingKeyNotConfiguredMessage(keyName));
12
+ }
13
+ const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
14
+ try {
15
+ const signature = await signWithKey(keyAlias, message, region);
16
+ return actionResult(base64UrlEncode(signature));
17
+ }
18
+ catch (error) {
19
+ return actionResultErrorFromCaughtError(error, kmsSigningErrorMap(askCryptoSign.errorType, keyName));
20
+ }
21
+ };
22
+ };
23
+ export const getCryptoSignActionProcessor = createActionProcessor(askCryptoSign, getProcessCryptoSign);
24
+ //# sourceMappingURL=getCryptoSignActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCryptoSignActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/crypto/getCryptoSignActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gCAAgC,EAChC,aAAa,EACb,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAAsC,EAAE;IACxF,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAAC,gBAAgB,EAAE,8BAA8B,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9G,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/D,OAAO,YAAY,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,gCAAgC,CAAC,KAAK,EAAE,kBAAkB,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACvG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC","sourcesContent":["import { base64UrlEncode } from 'quidproquo-actionprocessor-node';\nimport { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n askCryptoSign,\n createActionProcessor,\n ProcessorFor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { signWithKey } from '../../../logic/kms/signWithKey';\nimport { kmsSigningErrorMap, signingKeyNotConfiguredMessage } from './kmsSigningErrorMap';\nimport { resolveSigningKeyAlias } from './utils';\n\nconst getProcessCryptoSign = (qpqConfig: QPQConfig): ProcessorFor<typeof askCryptoSign> => {\n return async ({ keyName, message }) => {\n const keyAlias = resolveSigningKeyAlias(keyName, qpqConfig);\n if (!keyAlias) {\n return actionResultError(askCryptoSign.errorType.KeyNotConfigured, signingKeyNotConfiguredMessage(keyName));\n }\n\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n try {\n const signature = await signWithKey(keyAlias, message, region);\n return actionResult(base64UrlEncode(signature));\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, kmsSigningErrorMap(askCryptoSign.errorType, keyName));\n }\n };\n};\n\nexport const getCryptoSignActionProcessor = createActionProcessor(askCryptoSign, getProcessCryptoSign);\n"]}
@@ -0,0 +1 @@
1
+ export declare const getCryptoVerifyActionProcessor: import("quidproquo-core").ActionProcessorListResolver;
@@ -0,0 +1,29 @@
1
+ import { rs256Verify } from 'quidproquo-actionprocessor-node';
2
+ import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
3
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, askCryptoVerify, createActionProcessor, } from 'quidproquo-core';
4
+ import { getCachedPublicKey } from '../../../logic/kms/getCachedPublicKey';
5
+ import { kmsSigningErrorMap, signingKeyNotConfiguredMessage } from './kmsSigningErrorMap';
6
+ import { resolveSigningKeyAlias } from './utils';
7
+ // Verifies locally against the cached public key rather than calling kms:Verify,
8
+ // so the hot path (every authenticated request) costs no KMS round trip.
9
+ const getProcessCryptoVerify = (qpqConfig) => {
10
+ return async ({ keyName, message, signature }) => {
11
+ const keyAlias = resolveSigningKeyAlias(keyName, qpqConfig);
12
+ if (!keyAlias) {
13
+ return actionResultError(askCryptoVerify.errorType.KeyNotConfigured, signingKeyNotConfiguredMessage(keyName));
14
+ }
15
+ const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
16
+ try {
17
+ const publicKeyPem = await getCachedPublicKey(keyAlias, region);
18
+ return actionResult(rs256Verify(publicKeyPem, message, signature));
19
+ }
20
+ catch (error) {
21
+ return actionResultErrorFromCaughtError(error, {
22
+ QpqSigningMalformedSignature: (e) => actionResultError(askCryptoVerify.errorType.MalformedSignature, e.message),
23
+ ...kmsSigningErrorMap(askCryptoVerify.errorType, keyName),
24
+ });
25
+ }
26
+ };
27
+ };
28
+ export const getCryptoVerifyActionProcessor = createActionProcessor(askCryptoVerify, getProcessCryptoVerify);
29
+ //# sourceMappingURL=getCryptoVerifyActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCryptoVerifyActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/crypto/getCryptoVerifyActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gCAAgC,EAChC,eAAe,EACf,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,iFAAiF;AACjF,yEAAyE;AACzE,MAAM,sBAAsB,GAAG,CAAC,SAAoB,EAAwC,EAAE;IAC5F,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC,gBAAgB,EAAE,8BAA8B,CAAC,OAAO,CAAC,CAAC,CAAC;QAChH,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChE,OAAO,YAAY,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,gCAAgC,CAAC,KAAK,EAAE;gBAC7C,4BAA4B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC;gBAC/G,GAAG,kBAAkB,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,qBAAqB,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC","sourcesContent":["import { rs256Verify } from 'quidproquo-actionprocessor-node';\nimport { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n askCryptoVerify,\n createActionProcessor,\n ProcessorFor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { getCachedPublicKey } from '../../../logic/kms/getCachedPublicKey';\nimport { kmsSigningErrorMap, signingKeyNotConfiguredMessage } from './kmsSigningErrorMap';\nimport { resolveSigningKeyAlias } from './utils';\n\n// Verifies locally against the cached public key rather than calling kms:Verify,\n// so the hot path (every authenticated request) costs no KMS round trip.\nconst getProcessCryptoVerify = (qpqConfig: QPQConfig): ProcessorFor<typeof askCryptoVerify> => {\n return async ({ keyName, message, signature }) => {\n const keyAlias = resolveSigningKeyAlias(keyName, qpqConfig);\n if (!keyAlias) {\n return actionResultError(askCryptoVerify.errorType.KeyNotConfigured, signingKeyNotConfiguredMessage(keyName));\n }\n\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n try {\n const publicKeyPem = await getCachedPublicKey(keyAlias, region);\n return actionResult(rs256Verify(publicKeyPem, message, signature));\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n QpqSigningMalformedSignature: (e) => actionResultError(askCryptoVerify.errorType.MalformedSignature, e.message),\n ...kmsSigningErrorMap(askCryptoVerify.errorType, keyName),\n });\n }\n };\n};\n\nexport const getCryptoVerifyActionProcessor = createActionProcessor(askCryptoVerify, getProcessCryptoVerify);\n"]}
@@ -1,7 +1,13 @@
1
1
  import { getCryptoDecryptActionProcessor } from './getCryptoDecryptActionProcessor';
2
2
  import { getCryptoEncryptActionProcessor } from './getCryptoEncryptActionProcessor';
3
+ import { getCryptoGetPublicKeyActionProcessor } from './getCryptoGetPublicKeyActionProcessor';
4
+ import { getCryptoSignActionProcessor } from './getCryptoSignActionProcessor';
5
+ import { getCryptoVerifyActionProcessor } from './getCryptoVerifyActionProcessor';
3
6
  export const getCryptoActionProcessor = async (qpqConfig, dynamicModuleLoader) => ({
4
7
  ...(await getCryptoEncryptActionProcessor(qpqConfig, dynamicModuleLoader)),
5
8
  ...(await getCryptoDecryptActionProcessor(qpqConfig, dynamicModuleLoader)),
9
+ ...(await getCryptoSignActionProcessor(qpqConfig, dynamicModuleLoader)),
10
+ ...(await getCryptoVerifyActionProcessor(qpqConfig, dynamicModuleLoader)),
11
+ ...(await getCryptoGetPublicKeyActionProcessor(qpqConfig, dynamicModuleLoader)),
6
12
  });
7
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/crypto/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,MAAM,CAAC,MAAM,wBAAwB,GAAgC,KAAK,EACxE,SAAoB,EACpB,mBAAwC,EACV,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,+BAA+B,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC1E,GAAG,CAAC,MAAM,+BAA+B,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;CAC3E,CAAC,CAAC","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from 'quidproquo-core';\n\nimport { getCryptoDecryptActionProcessor } from './getCryptoDecryptActionProcessor';\nimport { getCryptoEncryptActionProcessor } from './getCryptoEncryptActionProcessor';\n\nexport const getCryptoActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getCryptoEncryptActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getCryptoDecryptActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/crypto/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAC9F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAElF,MAAM,CAAC,MAAM,wBAAwB,GAAgC,KAAK,EACxE,SAAoB,EACpB,mBAAwC,EACV,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,+BAA+B,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC1E,GAAG,CAAC,MAAM,+BAA+B,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC1E,GAAG,CAAC,MAAM,4BAA4B,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACvE,GAAG,CAAC,MAAM,8BAA8B,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACzE,GAAG,CAAC,MAAM,oCAAoC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;CAChF,CAAC,CAAC","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from 'quidproquo-core';\n\nimport { getCryptoDecryptActionProcessor } from './getCryptoDecryptActionProcessor';\nimport { getCryptoEncryptActionProcessor } from './getCryptoEncryptActionProcessor';\nimport { getCryptoGetPublicKeyActionProcessor } from './getCryptoGetPublicKeyActionProcessor';\nimport { getCryptoSignActionProcessor } from './getCryptoSignActionProcessor';\nimport { getCryptoVerifyActionProcessor } from './getCryptoVerifyActionProcessor';\n\nexport const getCryptoActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getCryptoEncryptActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getCryptoDecryptActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getCryptoSignActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getCryptoVerifyActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getCryptoGetPublicKeyActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}