callman-core 1.31.0 → 1.33.0

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 (126) hide show
  1. package/ai-packs/db-queries.md +1 -1
  2. package/ai-packs/scenario-nodes.md +89 -15
  3. package/dist/ai/prompts/scenario.d.ts +1 -1
  4. package/dist/ai/prompts/scenario.d.ts.map +1 -1
  5. package/dist/ai/prompts/scenario.js +6 -3
  6. package/dist/ai/prompts/scenario.js.map +1 -1
  7. package/dist/ai/prompts/scenarioNodeDefaults.d.ts.map +1 -1
  8. package/dist/ai/prompts/scenarioNodeDefaults.js +9 -0
  9. package/dist/ai/prompts/scenarioNodeDefaults.js.map +1 -1
  10. package/dist/ai/prompts/scenarioNodeReference.d.ts.map +1 -1
  11. package/dist/ai/prompts/scenarioNodeReference.js +136 -17
  12. package/dist/ai/prompts/scenarioNodeReference.js.map +1 -1
  13. package/dist/host/db/db-query-reference.js +1 -1
  14. package/dist/host/db/db-query-reference.js.map +1 -1
  15. package/dist/host/db/mongoAdapter.d.ts +1 -0
  16. package/dist/host/db/mongoAdapter.d.ts.map +1 -1
  17. package/dist/host/db/mongoAdapter.js +21 -0
  18. package/dist/host/db/mongoAdapter.js.map +1 -1
  19. package/dist/host/db/queryExecutor.js +2 -2
  20. package/dist/host/db/queryExecutor.js.map +1 -1
  21. package/dist/host/index.d.ts +3 -1
  22. package/dist/host/index.d.ts.map +1 -1
  23. package/dist/host/index.js +4 -1
  24. package/dist/host/index.js.map +1 -1
  25. package/dist/host/temporal/temporalService.d.ts +67 -0
  26. package/dist/host/temporal/temporalService.d.ts.map +1 -0
  27. package/dist/host/temporal/temporalService.js +1182 -0
  28. package/dist/host/temporal/temporalService.js.map +1 -0
  29. package/dist/host/temporal/types.d.ts +13 -0
  30. package/dist/host/temporal/types.d.ts.map +1 -0
  31. package/dist/host/temporal/types.js +5 -0
  32. package/dist/host/temporal/types.js.map +1 -0
  33. package/dist/scenario-runner/adapters/connection-config.d.ts +17 -1
  34. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -1
  35. package/dist/scenario-runner/adapters/index.d.ts +4 -2
  36. package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
  37. package/dist/scenario-runner/adapters/index.js +8 -0
  38. package/dist/scenario-runner/adapters/index.js.map +1 -1
  39. package/dist/scenario-runner/adapters/kafka-executor.d.ts +5 -0
  40. package/dist/scenario-runner/adapters/kafka-executor.d.ts.map +1 -1
  41. package/dist/scenario-runner/adapters/kafka-executor.js +12 -3
  42. package/dist/scenario-runner/adapters/kafka-executor.js.map +1 -1
  43. package/dist/scenario-runner/adapters/temporal-executor.d.ts +10 -0
  44. package/dist/scenario-runner/adapters/temporal-executor.d.ts.map +1 -0
  45. package/dist/scenario-runner/adapters/temporal-executor.js +186 -0
  46. package/dist/scenario-runner/adapters/temporal-executor.js.map +1 -0
  47. package/dist/scenario-runner/adapters/types.d.ts +17 -5
  48. package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
  49. package/dist/scenario-runner/condition.d.ts.map +1 -1
  50. package/dist/scenario-runner/condition.js +73 -0
  51. package/dist/scenario-runner/condition.js.map +1 -1
  52. package/dist/scenario-runner/graphTraversal.d.ts +6 -0
  53. package/dist/scenario-runner/graphTraversal.d.ts.map +1 -1
  54. package/dist/scenario-runner/graphTraversal.js +9 -0
  55. package/dist/scenario-runner/graphTraversal.js.map +1 -1
  56. package/dist/scenario-runner/index.d.ts +4 -0
  57. package/dist/scenario-runner/index.d.ts.map +1 -1
  58. package/dist/scenario-runner/index.js +8 -0
  59. package/dist/scenario-runner/index.js.map +1 -1
  60. package/dist/scenario-runner/kafkaEvent.d.ts +3 -0
  61. package/dist/scenario-runner/kafkaEvent.d.ts.map +1 -0
  62. package/dist/scenario-runner/kafkaEvent.js +18 -0
  63. package/dist/scenario-runner/kafkaEvent.js.map +1 -0
  64. package/dist/scenario-runner/nodePolicy.d.ts +9 -2
  65. package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
  66. package/dist/scenario-runner/nodePolicy.js +53 -0
  67. package/dist/scenario-runner/nodePolicy.js.map +1 -1
  68. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  69. package/dist/scenario-runner/runScenario.js +115 -22
  70. package/dist/scenario-runner/runScenario.js.map +1 -1
  71. package/dist/scenario-runner/scenarioReference.d.ts +45 -0
  72. package/dist/scenario-runner/scenarioReference.d.ts.map +1 -0
  73. package/dist/scenario-runner/scenarioReference.js +151 -0
  74. package/dist/scenario-runner/scenarioReference.js.map +1 -0
  75. package/dist/scenario-runner/temporal.d.ts +73 -0
  76. package/dist/scenario-runner/temporal.d.ts.map +1 -0
  77. package/dist/scenario-runner/temporal.js +377 -0
  78. package/dist/scenario-runner/temporal.js.map +1 -0
  79. package/dist/scenario-runner/types.d.ts +211 -4
  80. package/dist/scenario-runner/types.d.ts.map +1 -1
  81. package/dist/ui-test/commands.d.ts.map +1 -1
  82. package/dist/ui-test/commands.js +71 -0
  83. package/dist/ui-test/commands.js.map +1 -1
  84. package/dist-cjs/ai/prompts/scenario.js +6 -3
  85. package/dist-cjs/ai/prompts/scenario.js.map +1 -1
  86. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js +9 -0
  87. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js.map +1 -1
  88. package/dist-cjs/ai/prompts/scenarioNodeReference.js +135 -16
  89. package/dist-cjs/ai/prompts/scenarioNodeReference.js.map +1 -1
  90. package/dist-cjs/host/db/db-query-reference.js +1 -1
  91. package/dist-cjs/host/db/db-query-reference.js.map +1 -1
  92. package/dist-cjs/host/db/mongoAdapter.js +23 -1
  93. package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
  94. package/dist-cjs/host/db/queryExecutor.js +1 -1
  95. package/dist-cjs/host/db/queryExecutor.js.map +1 -1
  96. package/dist-cjs/host/index.js +21 -2
  97. package/dist-cjs/host/index.js.map +1 -1
  98. package/dist-cjs/host/temporal/temporalService.js +1200 -0
  99. package/dist-cjs/host/temporal/temporalService.js.map +1 -0
  100. package/dist-cjs/host/temporal/types.js +6 -0
  101. package/dist-cjs/host/temporal/types.js.map +1 -0
  102. package/dist-cjs/scenario-runner/adapters/index.js +17 -3
  103. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
  104. package/dist-cjs/scenario-runner/adapters/kafka-executor.js +15 -4
  105. package/dist-cjs/scenario-runner/adapters/kafka-executor.js.map +1 -1
  106. package/dist-cjs/scenario-runner/adapters/temporal-executor.js +190 -0
  107. package/dist-cjs/scenario-runner/adapters/temporal-executor.js.map +1 -0
  108. package/dist-cjs/scenario-runner/condition.js +73 -0
  109. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  110. package/dist-cjs/scenario-runner/graphTraversal.js +10 -1
  111. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -1
  112. package/dist-cjs/scenario-runner/index.js +24 -1
  113. package/dist-cjs/scenario-runner/index.js.map +1 -1
  114. package/dist-cjs/scenario-runner/kafkaEvent.js +22 -0
  115. package/dist-cjs/scenario-runner/kafkaEvent.js.map +1 -0
  116. package/dist-cjs/scenario-runner/nodePolicy.js +56 -1
  117. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
  118. package/dist-cjs/scenario-runner/runScenario.js +114 -21
  119. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  120. package/dist-cjs/scenario-runner/scenarioReference.js +159 -0
  121. package/dist-cjs/scenario-runner/scenarioReference.js.map +1 -0
  122. package/dist-cjs/scenario-runner/temporal.js +386 -0
  123. package/dist-cjs/scenario-runner/temporal.js.map +1 -0
  124. package/dist-cjs/ui-test/commands.js +71 -0
  125. package/dist-cjs/ui-test/commands.js.map +1 -1
  126. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nodePolicy.js","sourceRoot":"","sources":["../../src/scenario-runner/nodePolicy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nodePolicy.js","sourceRoot":"","sources":["../../src/scenario-runner/nodePolicy.ts"],"names":[],"mappings":";;;AAuBa,QAAA,qCAAqC,GAAgC;IAChF,SAAS,EAAE,MAAM;IACjB,KAAK,EAAE;QACL,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;KACX;CACF,CAAC;AAEF,MAAM,mCAAmC,GAGrC;IACF,OAAO,EAAE,6CAAqC;IAC9C,EAAE,EAAE,6CAAqC;IACzC,IAAI,EAAE,6CAAqC;IAC3C,MAAM,EAAE,6CAAqC;IAC7C,sEAAsE;IACtE,SAAS,EAAE,6CAAqC;IAChD,KAAK,EAAE;QACL,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,IAAI;SACd;KACF;IACD,KAAK,EAAE;QACL,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,IAAI;SACd;KACF;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;SACX;KACF;IACD,UAAU,EAAE,6CAAqC;IACjD,wEAAwE;IACxE,gEAAgE;IAChE,IAAI,EAAE,6CAAqC;IAC3C,GAAG,EAAE,6CAAqC;IAC1C,UAAU,EAAE,6CAAqC;IACjD,WAAW,EAAE,6CAAqC;IAClD,cAAc,EAAE,6CAAqC;IACrD,yEAAyE;IACzE,gEAAgE;IAChE,OAAO,EAAE,6CAAqC;IAC9C,oEAAoE;IACpE,SAAS,EAAE,6CAAqC;IAChD,wEAAwE;IACxE,EAAE,EAAE,6CAAqC;IACzC,kEAAkE;IAClE,QAAQ,EAAE,6CAAqC;CAChD,CAAC;AAEF,MAAM,WAAW,GAAG,CAClB,MAAmC,EACN,EAAE,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;QAC7B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;QACrC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;KAC9B;CACF,CAAC,CAAC;AAEU,QAAA,iCAAiC,GAAG,GAAG,CAAC;AAErD,wEAAwE;AACxE,sEAAsE;AACtE,+DAA+D;AAClD,QAAA,kCAAkC,GAAgC;IAC7E,SAAS;IACT,IAAI;IACJ,OAAO;IACP,OAAO;IACP,WAAW;IACX,QAAQ;IACR,WAAW;IACX,MAAM;IACN,IAAI;IACJ,UAAU;IACV,cAAc;CACf,CAAC;AAEK,MAAM,mCAAmC,GAAG,CAAC,IAAsB,EAAW,EAAE,CACrF,0CAAkC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AADvC,QAAA,mCAAmC,uCACI;AAEpD,MAAM,wBAAwB,GAAG,CAAC,KAAc,EAA2C,EAAE;IAC3F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAI,KAAsC,CAAC,cAAc,CAAC;IACnE,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,yCAAiC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,4EAA4E;AAC5E,qEAAqE;AAC9D,MAAM,4BAA4B,GAAG,CAC1C,WAAwC,EACxC,OAAe,EACsC,EAAE;IACvD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,+CAA+C,OAAO,EAAE,EAAE,CAAC;IACtG,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;QACrB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;QACzC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,4BAA4B,OAAO,GAAG,EAAE,CAAC;AACjF,CAAC,CAAC;AAjBW,QAAA,4BAA4B,gCAiBvC;AAEK,MAAM,mCAAmC,GAAG,CACjD,UAAwD,EACiB,EAAE;IAC3E,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IAE3E,OAAO,IAAI,KAAK,WAAW,CAAC;AAC9B,CAAC,CAAC;AANW,QAAA,mCAAmC,uCAM9C;AAEK,MAAM,oCAAoC,GAAG,CAClD,KAAc,EACd,WAAwC,6CAAqC,EAChD,EAAE;IAC/B,MAAM,mBAAmB,GACvB,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,WAAW,IAAI,KAAK;QACpB,CAAC,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC;QAC5D,CAAC,CAAC,KAAK,CAAC,SAAS;QACjB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;IAEzB,MAAM,UAAU,GACd,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK;QAC5E,CAAC,CAAC,KAAK,CAAC,KAAK;QACb,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IAErB,MAAM,YAAY,GAChB,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,SAAS,IAAI,UAAU;QAC9E,CAAC,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI;QAC7B,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;IAC7B,MAAM,gBAAgB,GACpB,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,aAAa,IAAI,UAAU;QAClF,CAAC,CAAC,UAAU,CAAC,WAAW;QACxB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;IACjC,MAAM,aAAa,GACjB,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,SAAS,IAAI,UAAU;QAC9E,CAAC,CAAC,UAAU,CAAC,OAAO;QACpB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;IAE7B,MAAM,eAAe,GACnB,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,mBAAmB,IAAI,UAAU;QACxF,CAAC,CAAC,UAAU,CAAC,iBAAiB;QAC9B,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,gBAAgB,GACpB,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,YAAY,IAAI,UAAU;QACjF,CAAC,CAAC,UAAU,CAAC,UAAU;QACvB,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,WAAW,GAAG,YAAY;QAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,OAAO,GAAG,YAAY;QAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC,CAAC;IACN,4EAA4E;IAC5E,sEAAsE;IACtE,MAAM,iBAAiB,GACrB,YAAY,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,GAAG,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC;QAC/B,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,UAAU,GACd,YAAY,IAAI,iBAAiB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,GAAG,CAAC;QAC/F,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACjD,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,aAAa,GACjB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,eAAe,IAAI,KAAK;QACrE,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,aAAa,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,KAAK,EAAE;YACL,OAAO,EAAE,YAAY;YACrB,WAAW;YACX,OAAO;YACP,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC;QACD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC,CAAC;AAxEW,QAAA,oCAAoC,wCAwE/C;AAEK,MAAM,oCAAoC,GAAG,GAAgC,EAAE,CACpF,WAAW,CAAC,6CAAqC,CAAC,CAAC;AADxC,QAAA,oCAAoC,wCACI;AAE9C,MAAM,uCAAuC,GAAG,CACrD,IAAmC,EACN,EAAE,CAAC,WAAW,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC;AAF5E,QAAA,uCAAuC,2CAEqC;AAElF,MAAM,8BAA8B,GAAG,CAC5C,IAA+B,EACF,EAAE,CAC/B,IAAA,4CAAoC,EAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAChC,IAAA,4CAAoC,GAAE,CACvC,CAAC;AANS,QAAA,8BAA8B,kCAMvC;AAEG,MAAM,0BAA0B,GAAG,CACxC,MAAmC,EAC3B,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAFnE,QAAA,0BAA0B,8BAEyC;AAEzE,MAAM,2BAA2B,GAAG,CACzC,IAA+B,EACrB,EAAE;IACZ,MAAM,MAAM,GAAG,IAAA,sCAA8B,EAAC,IAAI,CAAC,CAAC;IACpD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,UAAU,IAAA,kCAA0B,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,IAAI,IAAA,2CAAmC,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AArBW,QAAA,2BAA2B,+BAqBtC;AAEK,MAAM,gCAAgC,GAAG,CAiB9C,IAAW,EACX,eAA4C,EACrC,EAAE,CAAC,CAAC;IACX,GAAG,IAAI;IACP,IAAI,EAAE;QACJ,GAAG,IAAI,CAAC,IAAI;QACZ,MAAM,EAAE;YACN,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;YACnB,eAAe,EAAE,IAAA,4CAAoC,EAAC,eAAe,CAAC;SACvE;KACF;CACF,CAAC,CAAC;AA5BU,QAAA,gCAAgC,oCA4B1C"}
@@ -9,6 +9,7 @@ const graphTraversal_js_1 = require("./graphTraversal.js");
9
9
  const websocket_js_1 = require("./websocket.js");
10
10
  const executionPolicyRunner_js_1 = require("./executionPolicyRunner.js");
11
11
  const boundSnapshot_js_1 = require("./boundSnapshot.js");
12
+ const kafkaEvent_js_1 = require("./kafkaEvent.js");
12
13
  const nodePolicy_js_1 = require("./nodePolicy.js");
13
14
  const templateResolver_js_1 = require("./templateResolver.js");
14
15
  const waitNodeExecutor_js_1 = require("./waitNodeExecutor.js");
@@ -25,6 +26,11 @@ class ScenarioNodeFailureError extends Error {
25
26
  this.name = "ScenarioNodeFailureError";
26
27
  }
27
28
  }
29
+ // An attempt that succeeded although the node's policy expects a failure.
30
+ // Kept apart from ordinary failures so it is never mistaken for the
31
+ // expected one.
32
+ class ScenarioExpectedFailureNotMetError extends ScenarioNodeFailureError {
33
+ }
28
34
  const DEFAULT_MIN_NODE_VISUAL_STATE_MS = 180;
29
35
  const createId = (prefix) => {
30
36
  const randomUuid = globalThis.crypto?.randomUUID?.();
@@ -125,24 +131,6 @@ const createContextSnapshot = (context, mode = "full") => {
125
131
  redisResult: bound(context.redisResult),
126
132
  };
127
133
  };
128
- const buildKafkaEventValue = (message) => {
129
- const fallbackValue = {
130
- value: message.valueJson ?? message.valueText,
131
- text: message.valueText,
132
- key: message.key,
133
- partition: message.partition,
134
- offset: message.offset,
135
- timestamp: message.timestamp,
136
- headers: Object.fromEntries(message.headers.map((header) => [header.key, header.value])),
137
- };
138
- if (isRecord(message.valueJson)) {
139
- return {
140
- ...message.valueJson,
141
- meta: fallbackValue,
142
- };
143
- }
144
- return fallbackValue;
145
- };
146
134
  const buildKafkaFailureMessage = (result, usedMatch) => {
147
135
  if (result.errorMessage?.trim()) {
148
136
  return result.errorMessage;
@@ -334,6 +322,7 @@ const createStepExecutionRecord = ({ stepId, stepType, title, }) => ({
334
322
  conditionDebug: null,
335
323
  activeBranch: null,
336
324
  ai: null,
325
+ temporal: null,
337
326
  inputData: null,
338
327
  resolvedInput: null,
339
328
  outputData: null,
@@ -514,6 +503,7 @@ const updateRecordFromEvent = (records, event) => {
514
503
  conditionDebug: event.conditionDebug ?? current.conditionDebug,
515
504
  activeBranch: event.activeBranch ?? current.activeBranch,
516
505
  ai: event.ai ?? current.ai,
506
+ temporal: event.temporal ?? current.temporal,
517
507
  inputData: event.inputData ?? current.inputData,
518
508
  resolvedInput: event.resolvedInput ?? current.resolvedInput ?? null,
519
509
  outputData: event.outputData ?? current.outputData,
@@ -867,6 +857,16 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
867
857
  retry: { enabled: false, maxAttempts: 0, delayMs: 0 },
868
858
  };
869
859
  }
860
+ // Negative test: this node must fail. On a db node a non-empty
861
+ // expectError is the more precise expectation and wins.
862
+ const dbExpectsError = node.type === "db" &&
863
+ Boolean(node.data.config.expectError?.sqlState?.trim() ||
864
+ node.data.config.expectError?.messagePattern?.trim());
865
+ const expectedFailure = executionPolicy.expectFailure &&
866
+ (0, nodePolicy_js_1.supportsScenarioNodeExpectedFailure)(node.type) &&
867
+ !dbExpectsError
868
+ ? executionPolicy.expectFailure
869
+ : undefined;
870
870
  const executionStartedAtMs = Date.now();
871
871
  let inputData = createInputSnapshot(runtimeContext);
872
872
  // The node's OWN resolved input (query + params, topic + payload, the
@@ -900,6 +900,7 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
900
900
  let shouldMarkPartialSuccess = false;
901
901
  let workflowOutput = undefined;
902
902
  let aiDetails = null;
903
+ let temporalDetails = null;
903
904
  const resetAttemptArtifacts = () => {
904
905
  statusCode = null;
905
906
  response = null;
@@ -927,6 +928,7 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
927
928
  shouldMarkPartialSuccess = false;
928
929
  workflowOutput = undefined;
929
930
  aiDetails = null;
931
+ temporalDetails = null;
930
932
  };
931
933
  const executeNodeAttempt = async (attempt, maxAttempts) => {
932
934
  throwIfStopped(signal);
@@ -1143,6 +1145,10 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
1143
1145
  : null;
1144
1146
  // Thinned emission keeps stored events bounded (~100 tick events).
1145
1147
  const pollEmitStride = Math.max(1, Math.ceil(pollMaxAttempts / 100));
1148
+ // Temporal ticks have no runtime-context slot (unlike response /
1149
+ // db / redis), so the last tick's output rides along on the poll
1150
+ // output as `<Label>.temporal`.
1151
+ let lastTemporalTickOutput = null;
1146
1152
  resolvedInput = {
1147
1153
  actionType: pollConfig.actionType,
1148
1154
  intervalMs: pollBaseIntervalMs,
@@ -1248,6 +1254,39 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
1248
1254
  runtimeContext.redisResult = tickResult.redisResult;
1249
1255
  return tickResult.failureMessage ?? null;
1250
1256
  }
1257
+ if (pollConfig.actionType === "temporal") {
1258
+ if (!pollConfig.temporal) {
1259
+ throw new ScenarioNodeFailureError("Poll node has no Temporal configuration.");
1260
+ }
1261
+ if (!runtimeAdapters.temporalExecutor) {
1262
+ throw new ScenarioNodeFailureError("This host does not support Temporal nodes yet.");
1263
+ }
1264
+ const tickResult = await runtimeAdapters.temporalExecutor({
1265
+ runId,
1266
+ stepId,
1267
+ node: {
1268
+ id: node.id,
1269
+ type: "temporal",
1270
+ position: node.position,
1271
+ data: { label: node.data.label, config: pollConfig.temporal },
1272
+ },
1273
+ context: snapshotContext(),
1274
+ signal,
1275
+ });
1276
+ temporalDetails = tickResult.details;
1277
+ assertionResults = tickResult.assertionResults;
1278
+ assertionSummary = tickResult.assertionSummary;
1279
+ lastTemporalTickOutput = tickResult.outputData;
1280
+ // Publish the tick's output under the label so the success
1281
+ // condition reads `<Label>.status` / `<Label>.result.x` exactly
1282
+ // like it would after a standalone temporal node.
1283
+ if (tickResult.outputData &&
1284
+ nodeLabel &&
1285
+ !RESERVED_WORKFLOW_ROOT_LABELS.has(nodeLabel)) {
1286
+ runtimeContext.workflowContext[nodeLabel] = tickResult.outputData;
1287
+ }
1288
+ return tickResult.failureMessage ?? null;
1289
+ }
1251
1290
  if (!pollConfig.script) {
1252
1291
  throw new ScenarioNodeFailureError("Poll node has no script configuration.");
1253
1292
  }
@@ -1344,6 +1383,9 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
1344
1383
  timedOut: !pollPassed,
1345
1384
  conditionResult: pollPassed,
1346
1385
  ...(lastTickError ? { lastTickError } : {}),
1386
+ ...(pollConfig.actionType === "temporal" && lastTemporalTickOutput
1387
+ ? { temporal: lastTemporalTickOutput }
1388
+ : {}),
1347
1389
  };
1348
1390
  if (!pollPassed) {
1349
1391
  if ((pollConfig.onTimeout ?? "fail") === "continue") {
@@ -1515,7 +1557,7 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
1515
1557
  if (resolvedMatchMode === "rules" && rules.length > 0) {
1516
1558
  matchedMessage =
1517
1559
  captureResult.messages.find((message) => {
1518
- const kafkaEventValue = buildKafkaEventValue(message);
1560
+ const kafkaEventValue = (0, kafkaEvent_js_1.buildScenarioKafkaEventValue)(message, captureResult.topic);
1519
1561
  const scopedValues = (0, templateResolver_js_1.buildScenarioTemplateValues)({
1520
1562
  environment: runtimeContext.environment,
1521
1563
  globals: runtimeContext.globals,
@@ -1534,7 +1576,7 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
1534
1576
  throw new ScenarioNodeFailureError(buildKafkaFailureMessage(captureResult, Boolean(rules.length)));
1535
1577
  }
1536
1578
  runtimeContext.kafkaCapture = captureResult;
1537
- runtimeContext.kafkaEvent = buildKafkaEventValue(matchedMessage);
1579
+ runtimeContext.kafkaEvent = (0, kafkaEvent_js_1.buildScenarioKafkaEventValue)(matchedMessage, captureResult.topic);
1538
1580
  outputData = runtimeContext.kafkaEvent;
1539
1581
  }
1540
1582
  }
@@ -1730,6 +1772,35 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
1730
1772
  throw new ScenarioNodeFailureError(aiResult.failureMessage);
1731
1773
  }
1732
1774
  }
1775
+ if (node.type === "temporal") {
1776
+ // Thin dispatch (ai pattern): the adapter resolves templates,
1777
+ // validates the operation, calls the host driver and evaluates the
1778
+ // node's own `expect` rules. A FAILED workflow is data (status +
1779
+ // failure in the output); only infrastructure errors and failed
1780
+ // expectations fail the node.
1781
+ if (!runtimeAdapters.temporalExecutor) {
1782
+ throw new ScenarioNodeFailureError("This host does not support Temporal nodes yet.");
1783
+ }
1784
+ const temporalResult = await runtimeAdapters.temporalExecutor({
1785
+ runId,
1786
+ stepId,
1787
+ node,
1788
+ context: snapshotContext(),
1789
+ signal,
1790
+ });
1791
+ throwIfStopped(signal);
1792
+ temporalDetails = temporalResult.details;
1793
+ outputData = temporalResult.outputData;
1794
+ resolvedInput = temporalResult.resolvedInput;
1795
+ assertionResults = temporalResult.assertionResults;
1796
+ assertionSummary = temporalResult.assertionSummary;
1797
+ if (temporalResult.degraded) {
1798
+ shouldMarkPartialSuccess = true;
1799
+ }
1800
+ if (temporalResult.failureMessage) {
1801
+ throw new ScenarioNodeFailureError(temporalResult.failureMessage);
1802
+ }
1803
+ }
1733
1804
  if (node.type === "condition") {
1734
1805
  const conditionIssues = (0, condition_js_1.validateConditionConfig)(node.data.config);
1735
1806
  const blockingConditionIssue = conditionIssues.find((issue) => issue.severity === "error");
@@ -2228,15 +2299,34 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
2228
2299
  runtimeContext.workflowContext[nodeLabel] = workflowOutput;
2229
2300
  }
2230
2301
  await ensureMinimumVisualDuration(attemptStartedAtMs);
2302
+ if (expectedFailure) {
2303
+ throw new ScenarioExpectedFailureNotMetError(`Expected this node to fail${expectedFailure.messagePattern
2304
+ ? ` with an error matching /${expectedFailure.messagePattern}/`
2305
+ : ""}, but it succeeded.`);
2306
+ }
2231
2307
  }
2232
2308
  catch (error) {
2233
2309
  if (error instanceof ScenarioStopError) {
2234
2310
  throw error;
2235
2311
  }
2236
2312
  await ensureMinimumVisualDuration(attemptStartedAtMs);
2237
- throw error instanceof ScenarioNodeFailureError
2313
+ const failure = error instanceof ScenarioNodeFailureError
2238
2314
  ? error
2239
2315
  : new ScenarioNodeFailureError(error instanceof Error ? error.message : "Scenario node failed");
2316
+ if (expectedFailure && !(failure instanceof ScenarioExpectedFailureNotMetError)) {
2317
+ const match = (0, nodePolicy_js_1.matchScenarioExpectedFailure)(expectedFailure, failure.message);
2318
+ if (!match.matched) {
2319
+ throw new ScenarioNodeFailureError(`The node failed, but not as expected (${match.mismatchReason}): ${failure.message}`);
2320
+ }
2321
+ // The failure IS the result: the node succeeds and exposes it.
2322
+ outputData = { expectedFailure: { message: failure.message } };
2323
+ workflowOutput = outputData;
2324
+ if (nodeLabel && !RESERVED_WORKFLOW_ROOT_LABELS.has(nodeLabel)) {
2325
+ runtimeContext.workflowContext[nodeLabel] = workflowOutput;
2326
+ }
2327
+ return;
2328
+ }
2329
+ throw failure;
2240
2330
  }
2241
2331
  };
2242
2332
  try {
@@ -2351,6 +2441,7 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
2351
2441
  conditionDebug,
2352
2442
  activeBranch,
2353
2443
  ai: aiDetails,
2444
+ temporal: temporalDetails,
2354
2445
  inputData,
2355
2446
  resolvedInput: resolvedInputForEvent(),
2356
2447
  outputData,
@@ -2435,6 +2526,7 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
2435
2526
  conditionDebug,
2436
2527
  activeBranch,
2437
2528
  ai: aiDetails,
2529
+ temporal: temporalDetails,
2438
2530
  inputData,
2439
2531
  resolvedInput: resolvedInputForEvent(),
2440
2532
  outputData,
@@ -2514,6 +2606,7 @@ const runScenario = async ({ scenario, environment = {}, globals = {}, runtimeAd
2514
2606
  conditionDebug,
2515
2607
  activeBranch,
2516
2608
  ai: aiDetails,
2609
+ temporal: temporalDetails,
2517
2610
  inputData,
2518
2611
  resolvedInput: resolvedInputForEvent(),
2519
2612
  outputData,