reviewflow 3.31.0 → 3.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 (377) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/main/routes.d.ts.map +1 -1
  3. package/dist/main/routes.js +55 -2
  4. package/dist/main/routes.js.map +1 -1
  5. package/dist/main/server.d.ts.map +1 -1
  6. package/dist/main/server.js +5 -1
  7. package/dist/main/server.js.map +1 -1
  8. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.d.ts +8 -0
  9. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.d.ts.map +1 -0
  10. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.js +2 -0
  11. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.js.map +1 -0
  12. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.d.ts +8 -0
  13. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.d.ts.map +1 -0
  14. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.js +4 -0
  15. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.js.map +1 -0
  16. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.d.ts +17 -0
  17. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.d.ts.map +1 -0
  18. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.js +11 -0
  19. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.js.map +1 -0
  20. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts +2 -0
  21. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts.map +1 -1
  22. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js +7 -1
  23. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js.map +1 -1
  24. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.d.ts +22 -0
  25. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.d.ts.map +1 -0
  26. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.js +55 -0
  27. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.js.map +1 -0
  28. package/dist/modules/ember-chat/services/emberSystemPrompt.d.ts +2 -0
  29. package/dist/modules/ember-chat/services/emberSystemPrompt.d.ts.map +1 -1
  30. package/dist/modules/ember-chat/services/emberSystemPrompt.js +41 -8
  31. package/dist/modules/ember-chat/services/emberSystemPrompt.js.map +1 -1
  32. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts +2 -0
  33. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts.map +1 -1
  34. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js +32 -2
  35. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js.map +1 -1
  36. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.d.ts +7 -0
  37. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.d.ts.map +1 -0
  38. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.js +4 -0
  39. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.js.map +1 -0
  40. package/dist/modules/platform-integration/entities/egressScan/egressScan.defaults.d.ts +3 -0
  41. package/dist/modules/platform-integration/entities/egressScan/egressScan.defaults.d.ts.map +1 -0
  42. package/dist/modules/platform-integration/entities/egressScan/egressScan.defaults.js +9 -0
  43. package/dist/modules/platform-integration/entities/egressScan/egressScan.defaults.js.map +1 -0
  44. package/dist/modules/platform-integration/entities/egressScan/egressScan.gateway.d.ts +28 -0
  45. package/dist/modules/platform-integration/entities/egressScan/egressScan.gateway.d.ts.map +1 -0
  46. package/dist/modules/platform-integration/entities/egressScan/egressScan.gateway.js +2 -0
  47. package/dist/modules/platform-integration/entities/egressScan/egressScan.gateway.js.map +1 -0
  48. package/dist/modules/platform-integration/entities/egressScan/egressScan.scanner.d.ts +11 -0
  49. package/dist/modules/platform-integration/entities/egressScan/egressScan.scanner.d.ts.map +1 -0
  50. package/dist/modules/platform-integration/entities/egressScan/egressScan.scanner.js +70 -0
  51. package/dist/modules/platform-integration/entities/egressScan/egressScan.scanner.js.map +1 -0
  52. package/dist/modules/platform-integration/entities/egressScan/egressTrace.gateway.d.ts +5 -0
  53. package/dist/modules/platform-integration/entities/egressScan/egressTrace.gateway.d.ts.map +1 -0
  54. package/dist/modules/platform-integration/entities/egressScan/egressTrace.gateway.js +2 -0
  55. package/dist/modules/platform-integration/entities/egressScan/egressTrace.gateway.js.map +1 -0
  56. package/dist/modules/platform-integration/entities/executorToken/executorCapability.d.ts +9 -0
  57. package/dist/modules/platform-integration/entities/executorToken/executorCapability.d.ts.map +1 -0
  58. package/dist/modules/platform-integration/entities/executorToken/executorCapability.js +10 -0
  59. package/dist/modules/platform-integration/entities/executorToken/executorCapability.js.map +1 -0
  60. package/dist/modules/platform-integration/entities/idempotency/idempotencyStore.gateway.d.ts +4 -0
  61. package/dist/modules/platform-integration/entities/idempotency/idempotencyStore.gateway.d.ts.map +1 -0
  62. package/dist/modules/platform-integration/entities/idempotency/idempotencyStore.gateway.js +2 -0
  63. package/dist/modules/platform-integration/entities/idempotency/idempotencyStore.gateway.js.map +1 -0
  64. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.d.ts +27 -0
  65. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.d.ts.map +1 -0
  66. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.gateway.d.ts +13 -0
  67. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.gateway.d.ts.map +1 -0
  68. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.gateway.js +2 -0
  69. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.gateway.js.map +1 -0
  70. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.js +21 -0
  71. package/dist/modules/platform-integration/entities/memberAccess/memberAccess.js.map +1 -0
  72. package/dist/modules/platform-integration/entities/transport/cidr.d.ts +2 -0
  73. package/dist/modules/platform-integration/entities/transport/cidr.d.ts.map +1 -0
  74. package/dist/modules/platform-integration/entities/transport/cidr.js +36 -0
  75. package/dist/modules/platform-integration/entities/transport/cidr.js.map +1 -0
  76. package/dist/modules/platform-integration/entities/transport/clientIpResolver.gateway.d.ts +8 -0
  77. package/dist/modules/platform-integration/entities/transport/clientIpResolver.gateway.d.ts.map +1 -0
  78. package/dist/modules/platform-integration/entities/transport/clientIpResolver.gateway.js +2 -0
  79. package/dist/modules/platform-integration/entities/transport/clientIpResolver.gateway.js.map +1 -0
  80. package/dist/modules/platform-integration/entities/transport/transportContext.d.ts +16 -0
  81. package/dist/modules/platform-integration/entities/transport/transportContext.d.ts.map +1 -0
  82. package/dist/modules/platform-integration/entities/transport/transportContext.js +2 -0
  83. package/dist/modules/platform-integration/entities/transport/transportContext.js.map +1 -0
  84. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
  85. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js +4 -4
  86. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
  87. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts +5 -1
  88. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
  89. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js +112 -18
  90. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
  91. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/transportGuard.middleware.d.ts +25 -0
  92. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/transportGuard.middleware.d.ts.map +1 -0
  93. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/transportGuard.middleware.js +26 -0
  94. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/transportGuard.middleware.js.map +1 -0
  95. package/dist/modules/platform-integration/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.d.ts +14 -0
  96. package/dist/modules/platform-integration/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.d.ts.map +1 -0
  97. package/dist/modules/platform-integration/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.js +34 -0
  98. package/dist/modules/platform-integration/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.js.map +1 -0
  99. package/dist/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.gateway.d.ts +14 -0
  100. package/dist/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.gateway.d.ts.map +1 -0
  101. package/dist/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.gateway.js +27 -0
  102. package/dist/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.gateway.js.map +1 -0
  103. package/dist/modules/platform-integration/interface-adapters/gateways/loggerEgressTrace.gateway.d.ts +9 -0
  104. package/dist/modules/platform-integration/interface-adapters/gateways/loggerEgressTrace.gateway.d.ts.map +1 -0
  105. package/dist/modules/platform-integration/interface-adapters/gateways/loggerEgressTrace.gateway.js +14 -0
  106. package/dist/modules/platform-integration/interface-adapters/gateways/loggerEgressTrace.gateway.js.map +1 -0
  107. package/dist/modules/platform-integration/interface-adapters/gateways/memberAccess.gitlab.cli.gateway.d.ts +31 -0
  108. package/dist/modules/platform-integration/interface-adapters/gateways/memberAccess.gitlab.cli.gateway.d.ts.map +1 -0
  109. package/dist/modules/platform-integration/interface-adapters/gateways/memberAccess.gitlab.cli.gateway.js +83 -0
  110. package/dist/modules/platform-integration/interface-adapters/gateways/memberAccess.gitlab.cli.gateway.js.map +1 -0
  111. package/dist/modules/platform-integration/interface-adapters/gateways/scopedGitLabExecutor.d.ts +17 -0
  112. package/dist/modules/platform-integration/interface-adapters/gateways/scopedGitLabExecutor.d.ts.map +1 -0
  113. package/dist/modules/platform-integration/interface-adapters/gateways/scopedGitLabExecutor.js +17 -0
  114. package/dist/modules/platform-integration/interface-adapters/gateways/scopedGitLabExecutor.js.map +1 -0
  115. package/dist/modules/platform-integration/interface-adapters/gateways/threadFetch.gitlab.gateway.d.ts +6 -0
  116. package/dist/modules/platform-integration/interface-adapters/gateways/threadFetch.gitlab.gateway.d.ts.map +1 -1
  117. package/dist/modules/platform-integration/interface-adapters/gateways/threadFetch.gitlab.gateway.js +28 -1
  118. package/dist/modules/platform-integration/interface-adapters/gateways/threadFetch.gitlab.gateway.js.map +1 -1
  119. package/dist/modules/platform-integration/interface-adapters/gateways/transport/clientIpResolver.forwardedFor.gateway.d.ts +5 -0
  120. package/dist/modules/platform-integration/interface-adapters/gateways/transport/clientIpResolver.forwardedFor.gateway.d.ts.map +1 -0
  121. package/dist/modules/platform-integration/interface-adapters/gateways/transport/clientIpResolver.forwardedFor.gateway.js +16 -0
  122. package/dist/modules/platform-integration/interface-adapters/gateways/transport/clientIpResolver.forwardedFor.gateway.js.map +1 -0
  123. package/dist/modules/platform-integration/services/autoExecutorActionFilter.d.ts +9 -0
  124. package/dist/modules/platform-integration/services/autoExecutorActionFilter.d.ts.map +1 -0
  125. package/dist/modules/platform-integration/services/autoExecutorActionFilter.js +33 -0
  126. package/dist/modules/platform-integration/services/autoExecutorActionFilter.js.map +1 -0
  127. package/dist/modules/platform-integration/services/pinnedThreadFetchTarget.d.ts +23 -0
  128. package/dist/modules/platform-integration/services/pinnedThreadFetchTarget.d.ts.map +1 -0
  129. package/dist/modules/platform-integration/services/pinnedThreadFetchTarget.js +21 -0
  130. package/dist/modules/platform-integration/services/pinnedThreadFetchTarget.js.map +1 -0
  131. package/dist/modules/platform-integration/services/scopedExecutorEnvironment.d.ts +21 -0
  132. package/dist/modules/platform-integration/services/scopedExecutorEnvironment.d.ts.map +1 -0
  133. package/dist/modules/platform-integration/services/scopedExecutorEnvironment.js +39 -0
  134. package/dist/modules/platform-integration/services/scopedExecutorEnvironment.js.map +1 -0
  135. package/dist/modules/platform-integration/usecases/isTrustedActor.usecase.d.ts +17 -0
  136. package/dist/modules/platform-integration/usecases/isTrustedActor.usecase.d.ts.map +1 -0
  137. package/dist/modules/platform-integration/usecases/isTrustedActor.usecase.js +23 -0
  138. package/dist/modules/platform-integration/usecases/isTrustedActor.usecase.js.map +1 -0
  139. package/dist/modules/platform-integration/usecases/transport/evaluateTransport.usecase.d.ts +3 -0
  140. package/dist/modules/platform-integration/usecases/transport/evaluateTransport.usecase.d.ts.map +1 -0
  141. package/dist/modules/platform-integration/usecases/transport/evaluateTransport.usecase.js +18 -0
  142. package/dist/modules/platform-integration/usecases/transport/evaluateTransport.usecase.js.map +1 -0
  143. package/dist/modules/review-execution/entities/actionProvenance/actionProvenance.d.ts +9 -0
  144. package/dist/modules/review-execution/entities/actionProvenance/actionProvenance.d.ts.map +1 -0
  145. package/dist/modules/review-execution/entities/actionProvenance/actionProvenance.js +11 -0
  146. package/dist/modules/review-execution/entities/actionProvenance/actionProvenance.js.map +1 -0
  147. package/dist/modules/review-execution/entities/threadInventory/threadInventory.gateway.d.ts +13 -0
  148. package/dist/modules/review-execution/entities/threadInventory/threadInventory.gateway.d.ts.map +1 -0
  149. package/dist/modules/review-execution/entities/threadInventory/threadInventory.gateway.js +2 -0
  150. package/dist/modules/review-execution/entities/threadInventory/threadInventory.gateway.js.map +1 -0
  151. package/dist/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.d.ts +14 -0
  152. package/dist/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.d.ts.map +1 -0
  153. package/dist/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.js +31 -0
  154. package/dist/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.js.map +1 -0
  155. package/dist/modules/review-execution/services/constrainActionSurface.d.ts +19 -0
  156. package/dist/modules/review-execution/services/constrainActionSurface.d.ts.map +1 -0
  157. package/dist/modules/review-execution/services/constrainActionSurface.js +49 -0
  158. package/dist/modules/review-execution/services/constrainActionSurface.js.map +1 -0
  159. package/dist/modules/review-execution/services/contextActionsExecutor.d.ts +2 -1
  160. package/dist/modules/review-execution/services/contextActionsExecutor.d.ts.map +1 -1
  161. package/dist/modules/review-execution/services/contextActionsExecutor.js +20 -2
  162. package/dist/modules/review-execution/services/contextActionsExecutor.js.map +1 -1
  163. package/dist/modules/review-execution/services/dispatchConstrainedActions.d.ts +30 -0
  164. package/dist/modules/review-execution/services/dispatchConstrainedActions.d.ts.map +1 -0
  165. package/dist/modules/review-execution/services/dispatchConstrainedActions.js +20 -0
  166. package/dist/modules/review-execution/services/dispatchConstrainedActions.js.map +1 -0
  167. package/dist/modules/review-execution/services/publicOutputExecutor.d.ts +10 -0
  168. package/dist/modules/review-execution/services/publicOutputExecutor.d.ts.map +1 -0
  169. package/dist/modules/review-execution/services/publicOutputExecutor.js +27 -0
  170. package/dist/modules/review-execution/services/publicOutputExecutor.js.map +1 -0
  171. package/dist/modules/review-execution/services/resolveThreadInventory.d.ts +19 -0
  172. package/dist/modules/review-execution/services/resolveThreadInventory.d.ts.map +1 -0
  173. package/dist/modules/review-execution/services/resolveThreadInventory.js +39 -0
  174. package/dist/modules/review-execution/services/resolveThreadInventory.js.map +1 -0
  175. package/dist/modules/review-execution/services/threadActionsExecutor.d.ts +11 -1
  176. package/dist/modules/review-execution/services/threadActionsExecutor.d.ts.map +1 -1
  177. package/dist/modules/review-execution/services/threadActionsExecutor.js +24 -2
  178. package/dist/modules/review-execution/services/threadActionsExecutor.js.map +1 -1
  179. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts +6 -0
  180. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts.map +1 -1
  181. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js +2 -1
  182. package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js.map +1 -1
  183. package/dist/security/gitlabWebhookTokenSource.d.ts +9 -0
  184. package/dist/security/gitlabWebhookTokenSource.d.ts.map +1 -0
  185. package/dist/security/gitlabWebhookTokenSource.js +15 -0
  186. package/dist/security/gitlabWebhookTokenSource.js.map +1 -0
  187. package/dist/security/transportGuardConfig.d.ts +16 -0
  188. package/dist/security/transportGuardConfig.d.ts.map +1 -0
  189. package/dist/security/transportGuardConfig.js +38 -0
  190. package/dist/security/transportGuardConfig.js.map +1 -0
  191. package/dist/security/verifier.d.ts +9 -2
  192. package/dist/security/verifier.d.ts.map +1 -1
  193. package/dist/security/verifier.js +27 -10
  194. package/dist/security/verifier.js.map +1 -1
  195. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js +7 -0
  196. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js.map +1 -1
  197. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.d.ts +2 -0
  198. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.d.ts.map +1 -0
  199. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.js +261 -0
  200. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.js.map +1 -0
  201. package/dist/tests/factories/emberMemory.factory.d.ts +8 -0
  202. package/dist/tests/factories/emberMemory.factory.d.ts.map +1 -0
  203. package/dist/tests/factories/emberMemory.factory.js +19 -0
  204. package/dist/tests/factories/emberMemory.factory.js.map +1 -0
  205. package/dist/tests/factories/transportContext.factory.d.ts +5 -0
  206. package/dist/tests/factories/transportContext.factory.d.ts.map +1 -0
  207. package/dist/tests/factories/transportContext.factory.js +14 -0
  208. package/dist/tests/factories/transportContext.factory.js.map +1 -0
  209. package/dist/tests/stubs/egressScan.stub.d.ts +16 -0
  210. package/dist/tests/stubs/egressScan.stub.d.ts.map +1 -0
  211. package/dist/tests/stubs/egressScan.stub.js +28 -0
  212. package/dist/tests/stubs/egressScan.stub.js.map +1 -0
  213. package/dist/tests/stubs/emberMemory.stub.d.ts +25 -0
  214. package/dist/tests/stubs/emberMemory.stub.d.ts.map +1 -0
  215. package/dist/tests/stubs/emberMemory.stub.js +61 -0
  216. package/dist/tests/stubs/emberMemory.stub.js.map +1 -0
  217. package/dist/tests/stubs/idempotencyStore.stub.d.ts +9 -0
  218. package/dist/tests/stubs/idempotencyStore.stub.d.ts.map +1 -0
  219. package/dist/tests/stubs/idempotencyStore.stub.js +19 -0
  220. package/dist/tests/stubs/idempotencyStore.stub.js.map +1 -0
  221. package/dist/tests/stubs/memberAccess.stub.d.ts +24 -0
  222. package/dist/tests/stubs/memberAccess.stub.d.ts.map +1 -0
  223. package/dist/tests/stubs/memberAccess.stub.js +28 -0
  224. package/dist/tests/stubs/memberAccess.stub.js.map +1 -0
  225. package/dist/tests/units/entities/egressScan/egressScan.scanner.test.d.ts +2 -0
  226. package/dist/tests/units/entities/egressScan/egressScan.scanner.test.d.ts.map +1 -0
  227. package/dist/tests/units/entities/egressScan/egressScan.scanner.test.js +136 -0
  228. package/dist/tests/units/entities/egressScan/egressScan.scanner.test.js.map +1 -0
  229. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +114 -0
  230. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
  231. package/dist/tests/units/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.test.d.ts +2 -0
  232. package/dist/tests/units/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.test.d.ts.map +1 -0
  233. package/dist/tests/units/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.test.js +116 -0
  234. package/dist/tests/units/interface-adapters/gateways/egressScanned.noteCommentPost.gateway.test.js.map +1 -0
  235. package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js +14 -0
  236. package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js.map +1 -1
  237. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.d.ts +2 -0
  238. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.d.ts.map +1 -0
  239. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.js +51 -0
  240. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.js.map +1 -0
  241. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.d.ts +2 -0
  242. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.d.ts.map +1 -0
  243. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.js +82 -0
  244. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.js.map +1 -0
  245. package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js +74 -2
  246. package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js.map +1 -1
  247. package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js +56 -1
  248. package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js.map +1 -1
  249. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.d.ts +2 -0
  250. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.d.ts.map +1 -0
  251. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.js +14 -0
  252. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.js.map +1 -0
  253. package/dist/tests/units/modules/platform-integration/controllers/gitlabProcessorProvenance.test.d.ts +2 -0
  254. package/dist/tests/units/modules/platform-integration/controllers/gitlabProcessorProvenance.test.d.ts.map +1 -0
  255. package/dist/tests/units/modules/platform-integration/controllers/gitlabProcessorProvenance.test.js +69 -0
  256. package/dist/tests/units/modules/platform-integration/controllers/gitlabProcessorProvenance.test.js.map +1 -0
  257. package/dist/tests/units/modules/platform-integration/entities/executorCapability.test.d.ts +2 -0
  258. package/dist/tests/units/modules/platform-integration/entities/executorCapability.test.d.ts.map +1 -0
  259. package/dist/tests/units/modules/platform-integration/entities/executorCapability.test.js +28 -0
  260. package/dist/tests/units/modules/platform-integration/entities/executorCapability.test.js.map +1 -0
  261. package/dist/tests/units/modules/platform-integration/entities/memberAccess/memberAccess.test.d.ts +2 -0
  262. package/dist/tests/units/modules/platform-integration/entities/memberAccess/memberAccess.test.d.ts.map +1 -0
  263. package/dist/tests/units/modules/platform-integration/entities/memberAccess/memberAccess.test.js +18 -0
  264. package/dist/tests/units/modules/platform-integration/entities/memberAccess/memberAccess.test.js.map +1 -0
  265. package/dist/tests/units/modules/platform-integration/gateways/defaultGitLabExecutor.test.d.ts +2 -0
  266. package/dist/tests/units/modules/platform-integration/gateways/defaultGitLabExecutor.test.d.ts.map +1 -0
  267. package/dist/tests/units/modules/platform-integration/gateways/defaultGitLabExecutor.test.js +13 -0
  268. package/dist/tests/units/modules/platform-integration/gateways/defaultGitLabExecutor.test.js.map +1 -0
  269. package/dist/tests/units/modules/platform-integration/gateways/memberAccess.gitlab.cli.gateway.test.d.ts +2 -0
  270. package/dist/tests/units/modules/platform-integration/gateways/memberAccess.gitlab.cli.gateway.test.d.ts.map +1 -0
  271. package/dist/tests/units/modules/platform-integration/gateways/memberAccess.gitlab.cli.gateway.test.js +105 -0
  272. package/dist/tests/units/modules/platform-integration/gateways/memberAccess.gitlab.cli.gateway.test.js.map +1 -0
  273. package/dist/tests/units/modules/platform-integration/gateways/scopedGitLabExecutor.test.d.ts +2 -0
  274. package/dist/tests/units/modules/platform-integration/gateways/scopedGitLabExecutor.test.d.ts.map +1 -0
  275. package/dist/tests/units/modules/platform-integration/gateways/scopedGitLabExecutor.test.js +85 -0
  276. package/dist/tests/units/modules/platform-integration/gateways/scopedGitLabExecutor.test.js.map +1 -0
  277. package/dist/tests/units/modules/platform-integration/interface-adapters/controllers/webhook/gitlabIdempotency.controller.test.d.ts +2 -0
  278. package/dist/tests/units/modules/platform-integration/interface-adapters/controllers/webhook/gitlabIdempotency.controller.test.d.ts.map +1 -0
  279. package/dist/tests/units/modules/platform-integration/interface-adapters/controllers/webhook/gitlabIdempotency.controller.test.js +216 -0
  280. package/dist/tests/units/modules/platform-integration/interface-adapters/controllers/webhook/gitlabIdempotency.controller.test.js.map +1 -0
  281. package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.test.d.ts +2 -0
  282. package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.test.d.ts.map +1 -0
  283. package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.test.js +48 -0
  284. package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/inMemoryIdempotencyStore.test.js.map +1 -0
  285. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/clientIpResolver.forwardedFor.gateway.test.d.ts +2 -0
  286. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/clientIpResolver.forwardedFor.gateway.test.d.ts.map +1 -0
  287. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/clientIpResolver.forwardedFor.gateway.test.js +29 -0
  288. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/clientIpResolver.forwardedFor.gateway.test.js.map +1 -0
  289. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/transportGuard.middleware.test.d.ts +2 -0
  290. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/transportGuard.middleware.test.d.ts.map +1 -0
  291. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/transportGuard.middleware.test.js +66 -0
  292. package/dist/tests/units/modules/platform-integration/interface-adapters/transport/transportGuard.middleware.test.js.map +1 -0
  293. package/dist/tests/units/modules/platform-integration/services/autoExecutorActionFilter.test.d.ts +2 -0
  294. package/dist/tests/units/modules/platform-integration/services/autoExecutorActionFilter.test.d.ts.map +1 -0
  295. package/dist/tests/units/modules/platform-integration/services/autoExecutorActionFilter.test.js +38 -0
  296. package/dist/tests/units/modules/platform-integration/services/autoExecutorActionFilter.test.js.map +1 -0
  297. package/dist/tests/units/modules/platform-integration/services/autoExecutorCapabilityGate.test.d.ts +2 -0
  298. package/dist/tests/units/modules/platform-integration/services/autoExecutorCapabilityGate.test.d.ts.map +1 -0
  299. package/dist/tests/units/modules/platform-integration/services/autoExecutorCapabilityGate.test.js +40 -0
  300. package/dist/tests/units/modules/platform-integration/services/autoExecutorCapabilityGate.test.js.map +1 -0
  301. package/dist/tests/units/modules/platform-integration/services/pinnedThreadFetchTarget.test.d.ts +2 -0
  302. package/dist/tests/units/modules/platform-integration/services/pinnedThreadFetchTarget.test.d.ts.map +1 -0
  303. package/dist/tests/units/modules/platform-integration/services/pinnedThreadFetchTarget.test.js +76 -0
  304. package/dist/tests/units/modules/platform-integration/services/pinnedThreadFetchTarget.test.js.map +1 -0
  305. package/dist/tests/units/modules/platform-integration/services/scopedExecutorEnvironment.test.d.ts +2 -0
  306. package/dist/tests/units/modules/platform-integration/services/scopedExecutorEnvironment.test.d.ts.map +1 -0
  307. package/dist/tests/units/modules/platform-integration/services/scopedExecutorEnvironment.test.js +120 -0
  308. package/dist/tests/units/modules/platform-integration/services/scopedExecutorEnvironment.test.js.map +1 -0
  309. package/dist/tests/units/modules/platform-integration/usecases/isTrustedActor.usecase.test.d.ts +2 -0
  310. package/dist/tests/units/modules/platform-integration/usecases/isTrustedActor.usecase.test.d.ts.map +1 -0
  311. package/dist/tests/units/modules/platform-integration/usecases/isTrustedActor.usecase.test.js +33 -0
  312. package/dist/tests/units/modules/platform-integration/usecases/isTrustedActor.usecase.test.js.map +1 -0
  313. package/dist/tests/units/modules/platform-integration/usecases/transport/evaluateTransport.usecase.test.d.ts +2 -0
  314. package/dist/tests/units/modules/platform-integration/usecases/transport/evaluateTransport.usecase.test.d.ts.map +1 -0
  315. package/dist/tests/units/modules/platform-integration/usecases/transport/evaluateTransport.usecase.test.js +69 -0
  316. package/dist/tests/units/modules/platform-integration/usecases/transport/evaluateTransport.usecase.test.js.map +1 -0
  317. package/dist/tests/units/modules/review-execution/entities/actionProvenance/actionProvenance.test.d.ts +2 -0
  318. package/dist/tests/units/modules/review-execution/entities/actionProvenance/actionProvenance.test.d.ts.map +1 -0
  319. package/dist/tests/units/modules/review-execution/entities/actionProvenance/actionProvenance.test.js +26 -0
  320. package/dist/tests/units/modules/review-execution/entities/actionProvenance/actionProvenance.test.js.map +1 -0
  321. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.test.d.ts +2 -0
  322. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.test.d.ts.map +1 -0
  323. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.test.js +44 -0
  324. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/threadInventory.gitlab.gateway.test.js.map +1 -0
  325. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.parity.test.d.ts +2 -0
  326. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.parity.test.d.ts.map +1 -0
  327. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.parity.test.js +29 -0
  328. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.parity.test.js.map +1 -0
  329. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.test.d.ts +2 -0
  330. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.test.d.ts.map +1 -0
  331. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.test.js +115 -0
  332. package/dist/tests/units/modules/review-execution/services/constrainActionSurface.test.js.map +1 -0
  333. package/dist/tests/units/modules/review-execution/services/contextActionsExecutor.autopath.test.d.ts +2 -0
  334. package/dist/tests/units/modules/review-execution/services/contextActionsExecutor.autopath.test.d.ts.map +1 -0
  335. package/dist/tests/units/modules/review-execution/services/contextActionsExecutor.autopath.test.js +52 -0
  336. package/dist/tests/units/modules/review-execution/services/contextActionsExecutor.autopath.test.js.map +1 -0
  337. package/dist/tests/units/modules/review-execution/services/dispatchConstrainedActions.test.d.ts +2 -0
  338. package/dist/tests/units/modules/review-execution/services/dispatchConstrainedActions.test.d.ts.map +1 -0
  339. package/dist/tests/units/modules/review-execution/services/dispatchConstrainedActions.test.js +124 -0
  340. package/dist/tests/units/modules/review-execution/services/dispatchConstrainedActions.test.js.map +1 -0
  341. package/dist/tests/units/modules/review-execution/services/resolveThreadInventory.test.d.ts +2 -0
  342. package/dist/tests/units/modules/review-execution/services/resolveThreadInventory.test.d.ts.map +1 -0
  343. package/dist/tests/units/modules/review-execution/services/resolveThreadInventory.test.js +67 -0
  344. package/dist/tests/units/modules/review-execution/services/resolveThreadInventory.test.js.map +1 -0
  345. package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js +42 -0
  346. package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js.map +1 -1
  347. package/dist/tests/units/security/gitlabTokenRotation.test.d.ts +2 -0
  348. package/dist/tests/units/security/gitlabTokenRotation.test.d.ts.map +1 -0
  349. package/dist/tests/units/security/gitlabTokenRotation.test.js +39 -0
  350. package/dist/tests/units/security/gitlabTokenRotation.test.js.map +1 -0
  351. package/dist/tests/units/security/noSpoofableTransportGuard.test.d.ts +2 -0
  352. package/dist/tests/units/security/noSpoofableTransportGuard.test.d.ts.map +1 -0
  353. package/dist/tests/units/security/noSpoofableTransportGuard.test.js +30 -0
  354. package/dist/tests/units/security/noSpoofableTransportGuard.test.js.map +1 -0
  355. package/dist/tests/units/security/transportGuardConfig.test.d.ts +2 -0
  356. package/dist/tests/units/security/transportGuardConfig.test.d.ts.map +1 -0
  357. package/dist/tests/units/security/transportGuardConfig.test.js +38 -0
  358. package/dist/tests/units/security/transportGuardConfig.test.js.map +1 -0
  359. package/dist/tests/units/security/verifier.test.js +33 -2
  360. package/dist/tests/units/security/verifier.test.js.map +1 -1
  361. package/dist/tests/units/services/contextActionsExecutor.egress.test.d.ts +2 -0
  362. package/dist/tests/units/services/contextActionsExecutor.egress.test.d.ts.map +1 -0
  363. package/dist/tests/units/services/contextActionsExecutor.egress.test.js +117 -0
  364. package/dist/tests/units/services/contextActionsExecutor.egress.test.js.map +1 -0
  365. package/dist/tests/units/services/contextActionsExecutor.test.js +24 -31
  366. package/dist/tests/units/services/contextActionsExecutor.test.js.map +1 -1
  367. package/dist/tests/units/services/publicOutputExecutor.test.d.ts +2 -0
  368. package/dist/tests/units/services/publicOutputExecutor.test.d.ts.map +1 -0
  369. package/dist/tests/units/services/publicOutputExecutor.test.js +72 -0
  370. package/dist/tests/units/services/publicOutputExecutor.test.js.map +1 -0
  371. package/dist/tests/units/services/threadActionsExecutor.egress.test.d.ts +2 -0
  372. package/dist/tests/units/services/threadActionsExecutor.egress.test.d.ts.map +1 -0
  373. package/dist/tests/units/services/threadActionsExecutor.egress.test.js +113 -0
  374. package/dist/tests/units/services/threadActionsExecutor.egress.test.js.map +1 -0
  375. package/dist/tests/units/services/threadActionsExecutor.test.js +32 -96
  376. package/dist/tests/units/services/threadActionsExecutor.test.js.map +1 -1
  377. package/package.json +1 -1
@@ -0,0 +1,261 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ProjectStatsFactory, ReviewStatsFactory } from '../../tests/factories/projectStats.factory.js';
3
+ import { StubEnvironmentGateway } from '../../tests/stubs/environment.stub.js';
4
+ import { StubEmberReadDataGateway } from '../../tests/stubs/emberReadData.stub.js';
5
+ import { StubEmberAnswerTransportGateway } from '../../tests/stubs/emberAnswerTransport.stub.js';
6
+ import { StubEmberMemoryGateway, StubEmberMemoryStore, } from '../../tests/stubs/emberMemory.stub.js';
7
+ import { askEmber } from '../../modules/ember-chat/usecases/askEmber/askEmber.usecase.js';
8
+ import { clearEmberMemory } from '../../modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.js';
9
+ const PROJECT_PATH = '/projects/alpha';
10
+ const OTHER_PROJECT_PATH = '/projects/beta';
11
+ function largeReviewData() {
12
+ const reviews = Array.from({ length: 500 }, (_, index) => ReviewStatsFactory.create({ mrNumber: index, score: index % 10, blocking: index % 3 }));
13
+ const readData = new StubEmberReadDataGateway();
14
+ readData.setReviewScores(PROJECT_PATH, ProjectStatsFactory.withReviews(reviews));
15
+ return readData;
16
+ }
17
+ function environment(hasApiKey) {
18
+ const stub = new StubEnvironmentGateway();
19
+ stub.setHasAnthropicApiKey(hasApiKey);
20
+ return stub;
21
+ }
22
+ function collectStream(subscribe) {
23
+ return new Promise((resolve) => {
24
+ let answer = '';
25
+ const statuses = [];
26
+ subscribe({
27
+ onStatus: (state) => {
28
+ statuses.push(state);
29
+ },
30
+ onChunk: (text) => {
31
+ answer += text;
32
+ },
33
+ onDone: () => resolve({ answer, statuses }),
34
+ onError: () => resolve({ answer, statuses }),
35
+ });
36
+ });
37
+ }
38
+ describe('Ground Ember on demand and remember per project (acceptance, SPEC-192)', () => {
39
+ describe('Ember can reach any review data on demand, not only the most recent items', () => {
40
+ it('old specific review on demand: MR-1 lies far outside the recent window yet is reachable', async () => {
41
+ const transport = new StubEmberAnswerTransportGateway();
42
+ transport.answerFromSystemPrompt();
43
+ const result = await askEmber({ question: 'Pourquoi MR-1 a-t-elle été bloquée il y a longtemps ?' }, {
44
+ transport,
45
+ environment: environment(false),
46
+ readData: largeReviewData(),
47
+ memory: new StubEmberMemoryGateway(),
48
+ projectPath: PROJECT_PATH,
49
+ });
50
+ expect(result.status).toBe('streaming');
51
+ if (result.status !== 'streaming') {
52
+ return;
53
+ }
54
+ const { answer, statuses } = await collectStream(result.subscribe);
55
+ expect(statuses.at(-1)).toBe('idle');
56
+ expect(answer.toLowerCase()).toContain('à la demande');
57
+ });
58
+ });
59
+ describe('a question is never refused merely because the data falls outside a recent window', () => {
60
+ it('no recent-window refusal: the framing carries no window-ceiling refusal text', async () => {
61
+ const transport = new StubEmberAnswerTransportGateway();
62
+ transport.answerFromSystemPrompt();
63
+ const result = await askEmber({ question: 'Liste toutes les reviews du début du projet.' }, {
64
+ transport,
65
+ environment: environment(false),
66
+ readData: largeReviewData(),
67
+ memory: new StubEmberMemoryGateway(),
68
+ projectPath: PROJECT_PATH,
69
+ });
70
+ expect(result.status).toBe('streaming');
71
+ if (result.status !== 'streaming') {
72
+ return;
73
+ }
74
+ const { answer } = await collectStream(result.subscribe);
75
+ expect(answer).not.toContain('résumé agrégé seulement');
76
+ expect(answer).not.toContain('aucun autre accès');
77
+ expect(answer).not.toContain('ni système de fichiers');
78
+ });
79
+ });
80
+ describe('read-only and subscription-only guarantees are preserved (Phase B regressions)', () => {
81
+ it('read-only preserved: the answer framing still states it performs no writes', async () => {
82
+ const transport = new StubEmberAnswerTransportGateway();
83
+ transport.answerFromSystemPrompt();
84
+ const result = await askEmber({ question: 'Crée un quality gate à 80 pour le projet.' }, {
85
+ transport,
86
+ environment: environment(false),
87
+ readData: largeReviewData(),
88
+ memory: new StubEmberMemoryGateway(),
89
+ projectPath: PROJECT_PATH,
90
+ });
91
+ expect(result.status).toBe('streaming');
92
+ if (result.status !== 'streaming') {
93
+ return;
94
+ }
95
+ const { answer } = await collectStream(result.subscribe);
96
+ expect(answer.toLowerCase()).toContain('lecture seule');
97
+ });
98
+ it('api key present: refuses to answer when an Anthropic API key is set', async () => {
99
+ const transport = new StubEmberAnswerTransportGateway();
100
+ transport.answerFromSystemPrompt();
101
+ const result = await askEmber({ question: 'Statut ?' }, {
102
+ transport,
103
+ environment: environment(true),
104
+ readData: largeReviewData(),
105
+ memory: new StubEmberMemoryGateway(),
106
+ projectPath: PROJECT_PATH,
107
+ });
108
+ expect(result.status).toBe('billing-regression-prevented');
109
+ expect(transport.startCount).toBe(0);
110
+ });
111
+ });
112
+ describe('Ember keeps a per-project conversation memory that survives a restart', () => {
113
+ it('follow-up across restart: a later instance recalls the earlier turn without repeating the subject', async () => {
114
+ const store = new StubEmberMemoryStore();
115
+ const firstTransport = new StubEmberAnswerTransportGateway();
116
+ firstTransport.respondWith(async () => 'Le projet alpha régresse chaque vendredi.');
117
+ const firstSession = await askEmber({ question: 'Quel est le constat récurrent du projet alpha ?' }, {
118
+ transport: firstTransport,
119
+ environment: environment(false),
120
+ readData: largeReviewData(),
121
+ memory: new StubEmberMemoryGateway(store),
122
+ projectPath: PROJECT_PATH,
123
+ });
124
+ expect(firstSession.status).toBe('streaming');
125
+ if (firstSession.status !== 'streaming') {
126
+ return;
127
+ }
128
+ await collectStream(firstSession.subscribe);
129
+ const restartedTransport = new StubEmberAnswerTransportGateway();
130
+ restartedTransport.answerFromSystemPrompt();
131
+ const followUp = await askEmber({ question: 'Et le mois dernier ?' }, {
132
+ transport: restartedTransport,
133
+ environment: environment(false),
134
+ readData: largeReviewData(),
135
+ memory: new StubEmberMemoryGateway(store),
136
+ projectPath: PROJECT_PATH,
137
+ });
138
+ expect(followUp.status).toBe('streaming');
139
+ if (followUp.status !== 'streaming') {
140
+ return;
141
+ }
142
+ const { answer, statuses } = await collectStream(followUp.subscribe);
143
+ expect(statuses.at(-1)).toBe('idle');
144
+ expect(answer).toContain('Le projet alpha régresse chaque vendredi.');
145
+ });
146
+ it("per-project isolation: project A's memory never reaches project B's answer", async () => {
147
+ const store = new StubEmberMemoryStore();
148
+ const seedTransport = new StubEmberAnswerTransportGateway();
149
+ seedTransport.respondWith(async () => 'Constat confidentiel sur le projet alpha.');
150
+ const seedSession = await askEmber({ question: 'Quel est le constat du projet alpha ?' }, {
151
+ transport: seedTransport,
152
+ environment: environment(false),
153
+ readData: largeReviewData(),
154
+ memory: new StubEmberMemoryGateway(store),
155
+ projectPath: PROJECT_PATH,
156
+ });
157
+ expect(seedSession.status).toBe('streaming');
158
+ if (seedSession.status !== 'streaming') {
159
+ return;
160
+ }
161
+ await collectStream(seedSession.subscribe);
162
+ const otherTransport = new StubEmberAnswerTransportGateway();
163
+ otherTransport.answerFromSystemPrompt();
164
+ const otherReadData = new StubEmberReadDataGateway();
165
+ otherReadData.setReviewScores(OTHER_PROJECT_PATH, ProjectStatsFactory.withReviews([ReviewStatsFactory.create({ mrNumber: 1 })]));
166
+ const otherSession = await askEmber({ question: 'Quoi de neuf sur le projet beta ?' }, {
167
+ transport: otherTransport,
168
+ environment: environment(false),
169
+ readData: otherReadData,
170
+ memory: new StubEmberMemoryGateway(store),
171
+ projectPath: OTHER_PROJECT_PATH,
172
+ });
173
+ expect(otherSession.status).toBe('streaming');
174
+ if (otherSession.status !== 'streaming') {
175
+ return;
176
+ }
177
+ const { answer } = await collectStream(otherSession.subscribe);
178
+ expect(answer).not.toContain('Constat confidentiel sur le projet alpha.');
179
+ });
180
+ it('corrupted memory: an answer is still produced when the memory is unreadable', async () => {
181
+ const transport = new StubEmberAnswerTransportGateway();
182
+ transport.answerFromSystemPrompt();
183
+ const memory = new StubEmberMemoryGateway();
184
+ memory.markCorrupted();
185
+ const result = await askEmber({ question: 'Statut ?' }, {
186
+ transport,
187
+ environment: environment(false),
188
+ readData: largeReviewData(),
189
+ memory,
190
+ projectPath: PROJECT_PATH,
191
+ });
192
+ expect(result.status).toBe('streaming');
193
+ if (result.status !== 'streaming') {
194
+ return;
195
+ }
196
+ const { statuses } = await collectStream(result.subscribe);
197
+ expect(statuses.at(-1)).toBe('idle');
198
+ });
199
+ });
200
+ describe('Ember reuses recorded recurring insights and the operator can clear the memory', () => {
201
+ it('reused insight: a recorded recurring finding is surfaced for reuse without recomputation', async () => {
202
+ const store = new StubEmberMemoryStore();
203
+ const recorder = new StubEmberMemoryGateway(store);
204
+ await recorder.appendInsight(PROJECT_PATH, 'Le projet X régresse chaque vendredi.');
205
+ const transport = new StubEmberAnswerTransportGateway();
206
+ transport.answerFromSystemPrompt();
207
+ const result = await askEmber({ question: 'Quoi de neuf sur X ?' }, {
208
+ transport,
209
+ environment: environment(false),
210
+ readData: largeReviewData(),
211
+ memory: new StubEmberMemoryGateway(store),
212
+ projectPath: PROJECT_PATH,
213
+ });
214
+ expect(result.status).toBe('streaming');
215
+ if (result.status !== 'streaming') {
216
+ return;
217
+ }
218
+ const { answer } = await collectStream(result.subscribe);
219
+ expect(answer.toLowerCase()).toContain('constats récurrents');
220
+ expect(answer).toContain('Le projet X régresse chaque vendredi.');
221
+ });
222
+ it('clear memory: after clearing, the next question starts with no prior context', async () => {
223
+ const store = new StubEmberMemoryStore();
224
+ const seedTransport = new StubEmberAnswerTransportGateway();
225
+ seedTransport.respondWith(async () => 'Constat antérieur sur le projet alpha.');
226
+ const seedSession = await askEmber({ question: 'Quel est le constat du projet alpha ?' }, {
227
+ transport: seedTransport,
228
+ environment: environment(false),
229
+ readData: largeReviewData(),
230
+ memory: new StubEmberMemoryGateway(store),
231
+ projectPath: PROJECT_PATH,
232
+ });
233
+ expect(seedSession.status).toBe('streaming');
234
+ if (seedSession.status !== 'streaming') {
235
+ return;
236
+ }
237
+ await collectStream(seedSession.subscribe);
238
+ await clearEmberMemory({
239
+ memory: new StubEmberMemoryGateway(store),
240
+ projectPath: PROJECT_PATH,
241
+ });
242
+ const nextTransport = new StubEmberAnswerTransportGateway();
243
+ nextTransport.answerFromSystemPrompt();
244
+ const nextSession = await askEmber({ question: 'Et maintenant ?' }, {
245
+ transport: nextTransport,
246
+ environment: environment(false),
247
+ readData: largeReviewData(),
248
+ memory: new StubEmberMemoryGateway(store),
249
+ projectPath: PROJECT_PATH,
250
+ });
251
+ expect(nextSession.status).toBe('streaming');
252
+ if (nextSession.status !== 'streaming') {
253
+ return;
254
+ }
255
+ const { answer } = await collectStream(nextSession.subscribe);
256
+ expect(answer).not.toContain('Constat antérieur sur le projet alpha.');
257
+ expect(answer.toLowerCase()).not.toContain('conversation précédente');
258
+ });
259
+ });
260
+ });
261
+ //# sourceMappingURL=192-ember-ondemand-grounding-and-memory.acceptance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"192-ember-ondemand-grounding-and-memory.acceptance.test.js","sourceRoot":"","sources":["../../../src/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AACpG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4EAA4E,CAAC;AAG9G,MAAM,YAAY,GAAG,iBAAiB,CAAC;AACvC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C,SAAS,eAAe;IACtB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CACvD,kBAAkB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CACvF,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAChD,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE,mBAAmB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,SAAkB;IACrC,MAAM,IAAI,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC1C,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,SAAsD;IAI3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,SAAS,CAAC;YACR,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChB,MAAM,IAAI,IAAI,CAAC;YACjB,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,wEAAwE,EAAE,GAAG,EAAE;IACtF,QAAQ,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACzF,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;YACvG,MAAM,SAAS,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACxD,SAAS,CAAC,sBAAsB,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,QAAQ,EAAE,uDAAuD,EAAE,EACrE;gBACE,SAAS;gBACT,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,EAAE;gBACpC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEnE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mFAAmF,EAAE,GAAG,EAAE;QACjG,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,SAAS,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACxD,SAAS,CAAC,sBAAsB,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,QAAQ,EAAE,8CAA8C,EAAE,EAC5D;gBACE,SAAS;gBACT,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,EAAE;gBACpC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEzD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gFAAgF,EAAE,GAAG,EAAE;QAC9F,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,SAAS,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACxD,SAAS,CAAC,sBAAsB,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,QAAQ,EAAE,2CAA2C,EAAE,EACzD;gBACE,SAAS;gBACT,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,EAAE;gBACpC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEzD,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,SAAS,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACxD,SAAS,CAAC,sBAAsB,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,QAAQ,EAAE,UAAU,EAAE,EACxB;gBACE,SAAS;gBACT,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC;gBAC9B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,EAAE;gBACpC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uEAAuE,EAAE,GAAG,EAAE;QACrF,EAAE,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;YACjH,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAEzC,MAAM,cAAc,GAAG,IAAI,+BAA+B,EAAE,CAAC;YAC7D,cAAc,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,2CAA2C,CAAC,CAAC;YACpF,MAAM,YAAY,GAAG,MAAM,QAAQ,CACjC,EAAE,QAAQ,EAAE,iDAAiD,EAAE,EAC/D;gBACE,SAAS,EAAE,cAAc;gBACzB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9C,IAAI,YAAY,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,MAAM,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAE5C,MAAM,kBAAkB,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACjE,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,EAAE,QAAQ,EAAE,sBAAsB,EAAE,EACpC;gBACE,SAAS,EAAE,kBAAkB;gBAC7B,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAErE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAEzC,MAAM,aAAa,GAAG,IAAI,+BAA+B,EAAE,CAAC;YAC5D,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,2CAA2C,CAAC,CAAC;YACnF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,EAAE,QAAQ,EAAE,uCAAuC,EAAE,EACrD;gBACE,SAAS,EAAE,aAAa;gBACxB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,MAAM,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAE3C,MAAM,cAAc,GAAG,IAAI,+BAA+B,EAAE,CAAC;YAC7D,cAAc,CAAC,sBAAsB,EAAE,CAAC;YACxC,MAAM,aAAa,GAAG,IAAI,wBAAwB,EAAE,CAAC;YACrD,aAAa,CAAC,eAAe,CAC3B,kBAAkB,EAClB,mBAAmB,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAC9E,CAAC;YACF,MAAM,YAAY,GAAG,MAAM,QAAQ,CACjC,EAAE,QAAQ,EAAE,mCAAmC,EAAE,EACjD;gBACE,SAAS,EAAE,cAAc;gBACzB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,kBAAkB;aAChC,CACF,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9C,IAAI,YAAY,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;YAC3F,MAAM,SAAS,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACxD,SAAS,CAAC,sBAAsB,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;YAC5C,MAAM,CAAC,aAAa,EAAE,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,QAAQ,EAAE,UAAU,EAAE,EACxB;gBACE,SAAS;gBACT,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM;gBACN,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE3D,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gFAAgF,EAAE,GAAG,EAAE;QAC9F,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;YACxG,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,QAAQ,CAAC,aAAa,CAAC,YAAY,EAAE,uCAAuC,CAAC,CAAC;YAEpF,MAAM,SAAS,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACxD,SAAS,CAAC,sBAAsB,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,QAAQ,EAAE,sBAAsB,EAAE,EACpC;gBACE,SAAS;gBACT,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEzD,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAEzC,MAAM,aAAa,GAAG,IAAI,+BAA+B,EAAE,CAAC;YAC5D,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,wCAAwC,CAAC,CAAC;YAChF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,EAAE,QAAQ,EAAE,uCAAuC,EAAE,EACrD;gBACE,SAAS,EAAE,aAAa;gBACxB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,MAAM,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAE3C,MAAM,gBAAgB,CAAC;gBACrB,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,YAAY;aAC1B,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,IAAI,+BAA+B,EAAE,CAAC;YAC5D,aAAa,CAAC,sBAAsB,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAC/B;gBACE,SAAS,EAAE,aAAa;gBACxB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;gBAC/B,QAAQ,EAAE,eAAe,EAAE;gBAC3B,MAAM,EAAE,IAAI,sBAAsB,CAAC,KAAK,CAAC;gBACzC,WAAW,EAAE,YAAY;aAC1B,CACF,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { EmberMemory, EmberMemoryTurn } from '../../modules/ember-chat/entities/emberMemory/emberMemory.schema.js';
2
+ export declare class EmberMemoryTurnFactory {
3
+ static create(overrides?: Partial<EmberMemoryTurn>): EmberMemoryTurn;
4
+ }
5
+ export declare class EmberMemoryFactory {
6
+ static create(overrides?: Partial<EmberMemory>): EmberMemory;
7
+ }
8
+ //# sourceMappingURL=emberMemory.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emberMemory.factory.d.ts","sourceRoot":"","sources":["../../../src/tests/factories/emberMemory.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,MAAM,iEAAiE,CAAC;AAEzE,qBAAa,sBAAsB;IACjC,MAAM,CAAC,MAAM,CAAC,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,eAAe;CAOzE;AAED,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW;CAOjE"}
@@ -0,0 +1,19 @@
1
+ export class EmberMemoryTurnFactory {
2
+ static create(overrides = {}) {
3
+ return {
4
+ question: 'Quel projet régresse le vendredi ?',
5
+ answer: 'Le projet X régresse chaque vendredi.',
6
+ ...overrides,
7
+ };
8
+ }
9
+ }
10
+ export class EmberMemoryFactory {
11
+ static create(overrides = {}) {
12
+ return {
13
+ turns: [EmberMemoryTurnFactory.create()],
14
+ insights: [],
15
+ ...overrides,
16
+ };
17
+ }
18
+ }
19
+ //# sourceMappingURL=emberMemory.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emberMemory.factory.js","sourceRoot":"","sources":["../../../src/tests/factories/emberMemory.factory.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,sBAAsB;IACjC,MAAM,CAAC,MAAM,CAAC,YAAsC,EAAE;QACpD,OAAO;YACL,QAAQ,EAAE,oCAAoC;YAC9C,MAAM,EAAE,uCAAuC;YAC/C,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAC7B,MAAM,CAAC,MAAM,CAAC,YAAkC,EAAE;QAChD,OAAO;YACL,KAAK,EAAE,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;YACxC,QAAQ,EAAE,EAAE;YACZ,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { TransportContext } from '../../modules/platform-integration/entities/transport/transportContext.js';
2
+ export declare class TransportContextFactory {
3
+ static valid(overrides?: Partial<TransportContext>): TransportContext;
4
+ }
5
+ //# sourceMappingURL=transportContext.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportContext.factory.d.ts","sourceRoot":"","sources":["../../../src/tests/factories/transportContext.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uEAAuE,CAAC;AAI9G,qBAAa,uBAAuB;IAClC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,gBAAgB;CAU1E"}
@@ -0,0 +1,14 @@
1
+ const TRUSTED_HOP = '127.0.0.1';
2
+ export class TransportContextFactory {
3
+ static valid(overrides = {}) {
4
+ return {
5
+ directSocketAddress: TRUSTED_HOP,
6
+ trustedHopAddress: TRUSTED_HOP,
7
+ forwardedProto: 'https',
8
+ resolvedClientIp: '10.20.30.40',
9
+ allowedCidrRanges: ['10.20.30.0/24'],
10
+ ...overrides,
11
+ };
12
+ }
13
+ }
14
+ //# sourceMappingURL=transportContext.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportContext.factory.js","sourceRoot":"","sources":["../../../src/tests/factories/transportContext.factory.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,MAAM,OAAO,uBAAuB;IAClC,MAAM,CAAC,KAAK,CAAC,YAAuC,EAAE;QACpD,OAAO;YACL,mBAAmB,EAAE,WAAW;YAChC,iBAAiB,EAAE,WAAW;YAC9B,cAAc,EAAE,OAAO;YACvB,gBAAgB,EAAE,aAAa;YAC/B,iBAAiB,EAAE,CAAC,eAAe,CAAC;YACpC,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { EgressScanGateway, EgressScanInput, EgressScanResult } from '../../modules/platform-integration/entities/egressScan/egressScan.gateway.js';
2
+ import type { EgressTraceGateway } from '../../modules/platform-integration/entities/egressScan/egressTrace.gateway.js';
3
+ import type { EgressScanTrace } from '../../modules/platform-integration/entities/egressScan/egressScan.gateway.js';
4
+ export declare class StubEgressScanGateway implements EgressScanGateway {
5
+ readonly calls: EgressScanInput[];
6
+ private result;
7
+ private shouldFail;
8
+ setResult(result: EgressScanResult): void;
9
+ setShouldFail(shouldFail: boolean): void;
10
+ scan(input: EgressScanInput): EgressScanResult;
11
+ }
12
+ export declare class StubEgressTraceGateway implements EgressTraceGateway {
13
+ readonly traces: EgressScanTrace[];
14
+ record(trace: EgressScanTrace): void;
15
+ }
16
+ //# sourceMappingURL=egressScan.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"egressScan.stub.d.ts","sourceRoot":"","sources":["../../../src/tests/stubs/egressScan.stub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EACjB,MAAM,0EAA0E,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAC;AACpH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0EAA0E,CAAC;AAEhH,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,CAAM;IACvC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAS;IAE3B,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIzC,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAIxC,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB;CAU/C;AAED,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,CAAM;IAExC,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;CAGrC"}
@@ -0,0 +1,28 @@
1
+ export class StubEgressScanGateway {
2
+ calls = [];
3
+ result = null;
4
+ shouldFail = false;
5
+ setResult(result) {
6
+ this.result = result;
7
+ }
8
+ setShouldFail(shouldFail) {
9
+ this.shouldFail = shouldFail;
10
+ }
11
+ scan(input) {
12
+ this.calls.push(input);
13
+ if (this.shouldFail) {
14
+ throw new Error('scanner failure');
15
+ }
16
+ if (this.result === null) {
17
+ return { decision: 'pass', body: input.body };
18
+ }
19
+ return this.result;
20
+ }
21
+ }
22
+ export class StubEgressTraceGateway {
23
+ traces = [];
24
+ record(trace) {
25
+ this.traces.push(trace);
26
+ }
27
+ }
28
+ //# sourceMappingURL=egressScan.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"egressScan.stub.js","sourceRoot":"","sources":["../../../src/tests/stubs/egressScan.stub.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,qBAAqB;IACvB,KAAK,GAAsB,EAAE,CAAC;IAC/B,MAAM,GAA4B,IAAI,CAAC;IACvC,UAAU,GAAG,KAAK,CAAC;IAE3B,SAAS,CAAC,MAAwB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,aAAa,CAAC,UAAmB;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,KAAsB;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IACxB,MAAM,GAAsB,EAAE,CAAC;IAExC,MAAM,CAAC,KAAsB;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { EmberMemoryGateway } from '../../modules/ember-chat/entities/emberMemory/emberMemory.gateway.js';
2
+ import type { EmberMemory, EmberMemoryTurn, EmberRecurringInsight } from '../../modules/ember-chat/entities/emberMemory/emberMemory.schema.js';
3
+ /**
4
+ * Backing store shared across gateway instances so a "restart" (a new gateway
5
+ * over the same store) reloads what a previous instance persisted — mirroring
6
+ * the durable filesystem gateway without touching disk.
7
+ */
8
+ export declare class StubEmberMemoryStore {
9
+ private readonly memoryByProject;
10
+ read(projectPath: string): EmberMemory | null;
11
+ appendTurn(projectPath: string, turn: EmberMemoryTurn): void;
12
+ appendInsight(projectPath: string, insight: EmberRecurringInsight): void;
13
+ remove(projectPath: string): void;
14
+ }
15
+ export declare class StubEmberMemoryGateway implements EmberMemoryGateway {
16
+ private readonly store;
17
+ private corrupted;
18
+ constructor(store?: StubEmberMemoryStore);
19
+ markCorrupted(): void;
20
+ load(projectPath: string): Promise<EmberMemory | null>;
21
+ appendTurn(projectPath: string, turn: EmberMemoryTurn): Promise<void>;
22
+ appendInsight(projectPath: string, insight: EmberRecurringInsight): Promise<void>;
23
+ clear(projectPath: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=emberMemory.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emberMemory.stub.d.ts","sourceRoot":"","sources":["../../../src/tests/stubs/emberMemory.stub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kEAAkE,CAAC;AAC3G,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,qBAAqB,EACtB,MAAM,iEAAiE,CAAC;AAEzE;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAElE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAW7C,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAQ5D,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAQxE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAGlC;AAED,qBAAa,sBAAuB,YAAW,kBAAkB;IAGnD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,SAAS,CAAS;gBAEG,KAAK,GAAE,oBAAiD;IAErF,aAAa,IAAI,IAAI;IAIf,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOtD,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjF,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhD"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Backing store shared across gateway instances so a "restart" (a new gateway
3
+ * over the same store) reloads what a previous instance persisted — mirroring
4
+ * the durable filesystem gateway without touching disk.
5
+ */
6
+ export class StubEmberMemoryStore {
7
+ memoryByProject = new Map();
8
+ read(projectPath) {
9
+ const memory = this.memoryByProject.get(projectPath);
10
+ if (memory === undefined) {
11
+ return null;
12
+ }
13
+ return {
14
+ turns: memory.turns.map((turn) => ({ ...turn })),
15
+ insights: [...memory.insights],
16
+ };
17
+ }
18
+ appendTurn(projectPath, turn) {
19
+ const current = this.memoryByProject.get(projectPath) ?? { turns: [], insights: [] };
20
+ this.memoryByProject.set(projectPath, {
21
+ turns: [...current.turns, turn],
22
+ insights: current.insights,
23
+ });
24
+ }
25
+ appendInsight(projectPath, insight) {
26
+ const current = this.memoryByProject.get(projectPath) ?? { turns: [], insights: [] };
27
+ this.memoryByProject.set(projectPath, {
28
+ turns: current.turns,
29
+ insights: [...current.insights, insight],
30
+ });
31
+ }
32
+ remove(projectPath) {
33
+ this.memoryByProject.delete(projectPath);
34
+ }
35
+ }
36
+ export class StubEmberMemoryGateway {
37
+ store;
38
+ corrupted = false;
39
+ constructor(store = new StubEmberMemoryStore()) {
40
+ this.store = store;
41
+ }
42
+ markCorrupted() {
43
+ this.corrupted = true;
44
+ }
45
+ async load(projectPath) {
46
+ if (this.corrupted) {
47
+ return null;
48
+ }
49
+ return this.store.read(projectPath);
50
+ }
51
+ async appendTurn(projectPath, turn) {
52
+ this.store.appendTurn(projectPath, turn);
53
+ }
54
+ async appendInsight(projectPath, insight) {
55
+ this.store.appendInsight(projectPath, insight);
56
+ }
57
+ async clear(projectPath) {
58
+ this.store.remove(projectPath);
59
+ }
60
+ }
61
+ //# sourceMappingURL=emberMemory.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emberMemory.stub.js","sourceRoot":"","sources":["../../../src/tests/stubs/emberMemory.stub.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACd,eAAe,GAAG,IAAI,GAAG,EAAuB,CAAC;IAElE,IAAI,CAAC,WAAmB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YAChD,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,WAAmB,EAAE,IAAqB;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE;YACpC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;YAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,WAAmB,EAAE,OAA8B;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAmB;QACxB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IAGJ;IAFrB,SAAS,GAAG,KAAK,CAAC;IAE1B,YAA6B,QAA8B,IAAI,oBAAoB,EAAE;QAAxD,UAAK,GAAL,KAAK,CAAmD;IAAG,CAAC;IAEzF,aAAa;QACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,IAAqB;QACzD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAmB,EAAE,OAA8B;QACrE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { IdempotencyStore } from '../../modules/platform-integration/entities/idempotency/idempotencyStore.gateway.js';
2
+ export declare class StubIdempotencyStore implements IdempotencyStore {
3
+ readonly recordedKeys: string[];
4
+ private readonly present;
5
+ recordIfAbsent(eventKey: string): Promise<boolean>;
6
+ get entryCount(): number;
7
+ has(eventKey: string): boolean;
8
+ }
9
+ //# sourceMappingURL=idempotencyStore.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotencyStore.stub.d.ts","sourceRoot":"","sources":["../../../src/tests/stubs/idempotencyStore.stub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iFAAiF,CAAC;AAExH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAM;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAEvC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAG/B"}
@@ -0,0 +1,19 @@
1
+ export class StubIdempotencyStore {
2
+ recordedKeys = [];
3
+ present = new Set();
4
+ async recordIfAbsent(eventKey) {
5
+ this.recordedKeys.push(eventKey);
6
+ if (this.present.has(eventKey)) {
7
+ return false;
8
+ }
9
+ this.present.add(eventKey);
10
+ return true;
11
+ }
12
+ get entryCount() {
13
+ return this.present.size;
14
+ }
15
+ has(eventKey) {
16
+ return this.present.has(eventKey);
17
+ }
18
+ }
19
+ //# sourceMappingURL=idempotencyStore.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotencyStore.stub.js","sourceRoot":"","sources":["../../../src/tests/stubs/idempotencyStore.stub.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IACtB,YAAY,GAAa,EAAE,CAAC;IACpB,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAE7C,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { MemberAccessGateway } from '../../modules/platform-integration/entities/memberAccess/memberAccess.gateway.js';
2
+ import type { ResolvedAccessLevel } from '../../modules/platform-integration/entities/memberAccess/memberAccess.js';
3
+ export interface MemberAccessResolveCall {
4
+ projectPath: string;
5
+ username: string;
6
+ }
7
+ /**
8
+ * Recording stub for MemberAccessGateway (Detroit style — no vi.fn).
9
+ *
10
+ * Returns a fixed access level per username via `setAccess`. Unknown usernames
11
+ * resolve fail-closed to `null`. `setShouldFail(true)` makes every resolve throw,
12
+ * exercising the fail-closed boundary (SPEC-197 AC4). All calls are recorded so
13
+ * tests can assert call counts and args (AC6: gateway never called when the token
14
+ * verifier rejects).
15
+ */
16
+ export declare class StubMemberAccessGateway implements MemberAccessGateway {
17
+ readonly calls: MemberAccessResolveCall[];
18
+ private accessByUsername;
19
+ private shouldFail;
20
+ setAccess(username: string, accessLevel: ResolvedAccessLevel): void;
21
+ setShouldFail(shouldFail: boolean): void;
22
+ resolve(projectPath: string, username: string): Promise<ResolvedAccessLevel>;
23
+ }
24
+ //# sourceMappingURL=memberAccess.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memberAccess.stub.d.ts","sourceRoot":"","sources":["../../../src/tests/stubs/memberAccess.stub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8EAA8E,CAAC;AACxH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sEAAsE,CAAC;AAEhH,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,SAAgB,KAAK,EAAE,uBAAuB,EAAE,CAAM;IACtD,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,IAAI;IAInE,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAIlC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAOnF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Recording stub for MemberAccessGateway (Detroit style — no vi.fn).
3
+ *
4
+ * Returns a fixed access level per username via `setAccess`. Unknown usernames
5
+ * resolve fail-closed to `null`. `setShouldFail(true)` makes every resolve throw,
6
+ * exercising the fail-closed boundary (SPEC-197 AC4). All calls are recorded so
7
+ * tests can assert call counts and args (AC6: gateway never called when the token
8
+ * verifier rejects).
9
+ */
10
+ export class StubMemberAccessGateway {
11
+ calls = [];
12
+ accessByUsername = new Map();
13
+ shouldFail = false;
14
+ setAccess(username, accessLevel) {
15
+ this.accessByUsername.set(username, accessLevel);
16
+ }
17
+ setShouldFail(shouldFail) {
18
+ this.shouldFail = shouldFail;
19
+ }
20
+ async resolve(projectPath, username) {
21
+ this.calls.push({ projectPath, username });
22
+ if (this.shouldFail) {
23
+ throw new Error('Membership lookup failed (stub)');
24
+ }
25
+ return this.accessByUsername.get(username) ?? null;
26
+ }
27
+ }
28
+ //# sourceMappingURL=memberAccess.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memberAccess.stub.js","sourceRoot":"","sources":["../../../src/tests/stubs/memberAccess.stub.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,MAAM,OAAO,uBAAuB;IAClB,KAAK,GAA8B,EAAE,CAAC;IAC9C,gBAAgB,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC1D,UAAU,GAAG,KAAK,CAAC;IAE3B,SAAS,CAAC,QAAgB,EAAE,WAAgC;QAC1D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;IAED,aAAa,CAAC,UAAmB;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,QAAgB;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=egressScan.scanner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"egressScan.scanner.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/units/entities/egressScan/egressScan.scanner.test.ts"],"names":[],"mappings":""}