reviewflow 3.30.0 → 3.32.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 (144) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/dashboard/index.html +35 -11
  3. package/dist/dashboard/styles.css +139 -5
  4. package/dist/frameworks/claude/claudeInvoker.d.ts +7 -0
  5. package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
  6. package/dist/frameworks/claude/claudeInvoker.js +1 -1
  7. package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
  8. package/dist/main/routes.d.ts.map +1 -1
  9. package/dist/main/routes.js +9 -16
  10. package/dist/main/routes.js.map +1 -1
  11. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts +1 -1
  12. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts.map +1 -1
  13. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.d.ts +1 -1
  14. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts +2 -0
  15. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts.map +1 -1
  16. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js +1 -1
  17. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js.map +1 -1
  18. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.d.ts +24 -0
  19. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.d.ts.map +1 -0
  20. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.js +2 -0
  21. package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.js.map +1 -0
  22. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.d.ts +8 -0
  23. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.d.ts.map +1 -0
  24. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.js +2 -0
  25. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.gateway.js.map +1 -0
  26. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.d.ts +8 -0
  27. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.d.ts.map +1 -0
  28. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.js +4 -0
  29. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.guard.js.map +1 -0
  30. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.d.ts +17 -0
  31. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.d.ts.map +1 -0
  32. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.js +11 -0
  33. package/dist/modules/ember-chat/entities/emberMemory/emberMemory.schema.js.map +1 -0
  34. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts +4 -3
  35. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts.map +1 -1
  36. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js +12 -4
  37. package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js.map +1 -1
  38. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.d.ts +46 -0
  39. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.d.ts.map +1 -0
  40. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.js +176 -0
  41. package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.js.map +1 -0
  42. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.d.ts +22 -0
  43. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.d.ts.map +1 -0
  44. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.js +55 -0
  45. package/dist/modules/ember-chat/interface-adapters/gateways/emberMemory.fileSystem.gateway.js.map +1 -0
  46. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.d.ts +2 -1
  47. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.d.ts.map +1 -1
  48. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.js +8 -2
  49. package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.js.map +1 -1
  50. package/dist/modules/ember-chat/interface-adapters/presenters/emberStatus.presenter.d.ts +1 -1
  51. package/dist/modules/ember-chat/interface-adapters/presenters/emberStatus.presenter.d.ts.map +1 -1
  52. package/dist/modules/ember-chat/services/emberSystemPrompt.d.ts +2 -0
  53. package/dist/modules/ember-chat/services/emberSystemPrompt.d.ts.map +1 -1
  54. package/dist/modules/ember-chat/services/emberSystemPrompt.js +87 -11
  55. package/dist/modules/ember-chat/services/emberSystemPrompt.js.map +1 -1
  56. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts +7 -4
  57. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts.map +1 -1
  58. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js +90 -8
  59. package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js.map +1 -1
  60. package/dist/modules/ember-chat/usecases/askEmber/emberStream.d.ts +8 -0
  61. package/dist/modules/ember-chat/usecases/askEmber/emberStream.d.ts.map +1 -0
  62. package/dist/modules/ember-chat/usecases/askEmber/emberStream.js +2 -0
  63. package/dist/modules/ember-chat/usecases/askEmber/emberStream.js.map +1 -0
  64. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.d.ts +7 -0
  65. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.d.ts.map +1 -0
  66. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.js +4 -0
  67. package/dist/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.js.map +1 -0
  68. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.d.ts +2 -0
  69. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.d.ts.map +1 -0
  70. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js +165 -0
  71. package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js.map +1 -0
  72. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.d.ts +2 -0
  73. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.d.ts.map +1 -0
  74. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.js +261 -0
  75. package/dist/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.js.map +1 -0
  76. package/dist/tests/factories/emberMemory.factory.d.ts +8 -0
  77. package/dist/tests/factories/emberMemory.factory.d.ts.map +1 -0
  78. package/dist/tests/factories/emberMemory.factory.js +19 -0
  79. package/dist/tests/factories/emberMemory.factory.js.map +1 -0
  80. package/dist/tests/stubs/emberAnswerTransport.stub.d.ts +21 -0
  81. package/dist/tests/stubs/emberAnswerTransport.stub.d.ts.map +1 -0
  82. package/dist/tests/stubs/emberAnswerTransport.stub.js +54 -0
  83. package/dist/tests/stubs/emberAnswerTransport.stub.js.map +1 -0
  84. package/dist/tests/stubs/emberMemory.stub.d.ts +25 -0
  85. package/dist/tests/stubs/emberMemory.stub.d.ts.map +1 -0
  86. package/dist/tests/stubs/emberMemory.stub.js +61 -0
  87. package/dist/tests/stubs/emberMemory.stub.js.map +1 -0
  88. package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js +35 -14
  89. package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js.map +1 -1
  90. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.d.ts +2 -0
  91. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.d.ts.map +1 -0
  92. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.js +51 -0
  93. package/dist/tests/units/modules/ember-chat/entities/emberMemory.guard.test.js.map +1 -0
  94. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.d.ts +2 -0
  95. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.d.ts.map +1 -0
  96. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.js +82 -0
  97. package/dist/tests/units/modules/ember-chat/gateways/emberMemory.fileSystem.gateway.test.js.map +1 -0
  98. package/dist/tests/units/modules/ember-chat/gateways/emberStreamJson.parser.test.js +13 -0
  99. package/dist/tests/units/modules/ember-chat/gateways/emberStreamJson.parser.test.js.map +1 -1
  100. package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js +93 -2
  101. package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js.map +1 -1
  102. package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js +108 -20
  103. package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js.map +1 -1
  104. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.d.ts +2 -0
  105. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.d.ts.map +1 -0
  106. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.js +14 -0
  107. package/dist/tests/units/modules/ember-chat/usecases/clearEmberMemory.usecase.test.js.map +1 -0
  108. package/package.json +1 -1
  109. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.d.ts +0 -7
  110. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.d.ts.map +0 -1
  111. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.js +0 -3
  112. package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.js.map +0 -1
  113. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.d.ts +0 -13
  114. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.d.ts.map +0 -1
  115. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.js +0 -35
  116. package/dist/modules/ember-chat/entities/emberSession/emberSessionState.js.map +0 -1
  117. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.d.ts +0 -26
  118. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.d.ts.map +0 -1
  119. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.js +0 -2
  120. package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.js.map +0 -1
  121. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.d.ts +0 -13
  122. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.d.ts.map +0 -1
  123. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.js +0 -130
  124. package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.js.map +0 -1
  125. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.d.ts +0 -36
  126. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.d.ts.map +0 -1
  127. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.js +0 -59
  128. package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.js.map +0 -1
  129. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.d.ts +0 -2
  130. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.d.ts.map +0 -1
  131. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.js +0 -124
  132. package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.js.map +0 -1
  133. package/dist/tests/stubs/emberSessionTransport.stub.d.ts +0 -18
  134. package/dist/tests/stubs/emberSessionTransport.stub.d.ts.map +0 -1
  135. package/dist/tests/stubs/emberSessionTransport.stub.js +0 -75
  136. package/dist/tests/stubs/emberSessionTransport.stub.js.map +0 -1
  137. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.d.ts +0 -2
  138. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.d.ts.map +0 -1
  139. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.js +0 -42
  140. package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.js.map +0 -1
  141. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.d.ts +0 -2
  142. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.d.ts.map +0 -1
  143. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.js +0 -88
  144. package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.js.map +0 -1
@@ -2,11 +2,13 @@ import type { ProjectStats } from '../../../modules/statistics-insights/entities
2
2
  import type { PersistedInsightsData } from '../../../modules/statistics-insights/entities/insight/persistedInsightsData.js';
3
3
  import type { MrTrackingData } from '../../../modules/tracking/entities/tracking/mrTrackingData.js';
4
4
  import type { WorktreeEntry } from '../../../modules/worktree-management/entities/worktree/worktree.schema.js';
5
+ import type { EmberMemory } from '../../../modules/ember-chat/entities/emberMemory/emberMemory.schema.js';
5
6
  export interface EmberGrounding {
6
7
  reviewScores: ProjectStats | null;
7
8
  insights: PersistedInsightsData | null;
8
9
  jobHistory: MrTrackingData | null;
9
10
  worktrees: WorktreeEntry[];
11
+ memory: EmberMemory | null;
10
12
  }
11
13
  export declare function buildEmberSystemPrompt(grounding: EmberGrounding): string;
12
14
  //# sourceMappingURL=emberSystemPrompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"emberSystemPrompt.d.ts","sourceRoot":"","sources":["../../../../src/modules/ember-chat/services/emberSystemPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yEAAyE,CAAC;AACrH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oEAAoE,CAAC;AAExG,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CA2BxE"}
1
+ {"version":3,"file":"emberSystemPrompt.d.ts","sourceRoot":"","sources":["../../../../src/modules/ember-chat/services/emberSystemPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yEAAyE,CAAC;AACrH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oEAAoE,CAAC;AACxG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iEAAiE,CAAC;AAEnG,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B;AA4ED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAqCxE"}
@@ -1,29 +1,105 @@
1
+ const MAX_RECENT_REVIEWS = 20;
2
+ const MAX_RECENT_MRS = 20;
3
+ const MAX_DEVELOPERS = 10;
4
+ const MAX_DEVELOPER_RECENT_REVIEWS = 5;
5
+ const MAX_WORKTREES = 20;
6
+ function boundReviewScores(stats) {
7
+ if (stats === null) {
8
+ return null;
9
+ }
10
+ return { ...stats, reviews: mostRecent(stats.reviews, MAX_RECENT_REVIEWS) };
11
+ }
12
+ function boundJobHistory(jobHistory) {
13
+ if (jobHistory === null) {
14
+ return null;
15
+ }
16
+ return { ...jobHistory, mrs: mostRecent(jobHistory.mrs, MAX_RECENT_MRS) };
17
+ }
18
+ function boundInsights(insights) {
19
+ if (insights === null) {
20
+ return null;
21
+ }
22
+ return {
23
+ ...insights,
24
+ developers: mostRecent(insights.developers, MAX_DEVELOPERS).map((developer) => ({
25
+ ...developer,
26
+ recentReviews: mostRecent(developer.recentReviews, MAX_DEVELOPER_RECENT_REVIEWS),
27
+ })),
28
+ processedReviewIds: mostRecent(insights.processedReviewIds, MAX_RECENT_REVIEWS),
29
+ };
30
+ }
31
+ function mostRecent(items, limit) {
32
+ return items.slice(Math.max(0, items.length - limit));
33
+ }
34
+ function conversationMemorySection(memory) {
35
+ if (memory === null || memory.turns.length === 0) {
36
+ return '';
37
+ }
38
+ const turns = memory.turns
39
+ .map((turn, index) => `${index + 1}. Question : ${turn.question}\n Réponse : ${turn.answer}`)
40
+ .join('\n');
41
+ return [
42
+ '',
43
+ 'MÉMOIRE — conversation précédente sur ce projet (tours antérieurs) :',
44
+ "Sers-t'en pour comprendre une question de suivi sans répéter le sujet.",
45
+ turns,
46
+ ].join('\n');
47
+ }
48
+ function recurringInsightsSection(memory) {
49
+ if (memory === null || memory.insights.length === 0) {
50
+ return '';
51
+ }
52
+ const insights = memory.insights.map((insight) => `- ${insight}`).join('\n');
53
+ return [
54
+ '',
55
+ 'CONSTATS RÉCURRENTS — déjà dérivés des données de review de ce projet :',
56
+ 'Réutilise-les tels quels plutôt que de les recalculer.',
57
+ insights,
58
+ ].join('\n');
59
+ }
60
+ function reviewCountSummary(stats) {
61
+ if (stats === null || stats.reviews.length <= MAX_RECENT_REVIEWS) {
62
+ return '';
63
+ }
64
+ const olderCount = stats.reviews.length - MAX_RECENT_REVIEWS;
65
+ return `… et ${olderCount} reviews plus anciennes que tu peux lire à la demande dans les données du projet.`;
66
+ }
1
67
  export function buildEmberSystemPrompt(grounding) {
68
+ const reviewScores = boundReviewScores(grounding.reviewScores);
69
+ const olderReviewsNote = reviewCountSummary(grounding.reviewScores);
2
70
  return [
3
71
  "Tu es Ember, l'assistant conversationnel du tableau de bord ReviewFlow.",
4
72
  '',
5
- 'TES SEULES SOURCES DE DONNÉES sont ces données de review du projet, fournies ci-dessous.',
6
- "Tu n'as aucun autre accès : ni système de fichiers, ni outil, ni réseau.",
73
+ 'Ces données de review du projet, fournies ci-dessous, sont ton point de départ :',
74
+ 'un instantané des éléments les plus récents, fourni pour te faire gagner du temps.',
75
+ "Ce n'est PAS une limite. Tu peux lire à la demande les données de review du projet",
76
+ 'sur disque pour répondre au sujet de n\'importe quel élément, récent ou ancien,',
77
+ 'même au-delà de cet instantané. Ne refuse jamais une question au seul motif',
78
+ "qu'un élément se trouve hors de cet instantané récent.",
7
79
  '',
8
- 'reviewScores (scores et statistiques de review) :',
9
- JSON.stringify(grounding.reviewScores),
80
+ 'reviewScores (scores et statistiques de review, instantané récent) :',
81
+ JSON.stringify(reviewScores),
82
+ olderReviewsNote,
10
83
  '',
11
84
  'insights (insights développeur et équipe) :',
12
- JSON.stringify(grounding.insights),
85
+ JSON.stringify(boundInsights(grounding.insights)),
13
86
  '',
14
87
  'jobHistory (historique des jobs de review) :',
15
- JSON.stringify(grounding.jobHistory),
88
+ JSON.stringify(boundJobHistory(grounding.jobHistory)),
16
89
  '',
17
90
  'worktrees (état des worktrees) :',
18
- JSON.stringify(grounding.worktrees),
91
+ JSON.stringify(mostRecent(grounding.worktrees, MAX_WORKTREES)),
92
+ recurringInsightsSection(grounding.memory),
93
+ conversationMemorySection(grounding.memory),
19
94
  '',
20
- 'GROUNDING : réponds uniquement à partir de ces données de review.',
21
- "Si la question sort de ces données, dis que tu ne sais répondre qu'à propos des reviews",
22
- "plutôt que d'inventer une réponse. N'invente jamais.",
95
+ 'GROUNDING : réponds uniquement à partir des données de review du projet,',
96
+ "qu'elles soient dans cet instantané ou lues à la demande sur disque.",
97
+ "Si la réponse ne se trouve dans aucune de ces données, dis que tu ne sais répondre",
98
+ "qu'à propos des reviews plutôt que d'inventer une réponse. N'invente jamais.",
23
99
  '',
24
100
  'LECTURE SEULE : tu ne modifies, ne crées et ne supprimes rien. Si on te demande',
25
101
  "d'écrire, de créer ou de modifier quelque chose (par exemple un quality gate),",
26
- "explique que cela arrivera en Phase B et n'effectue aucune écriture.",
102
+ "explique que tu restes en lecture seule et n'effectue aucune écriture.",
27
103
  ].join('\n');
28
104
  }
29
105
  //# sourceMappingURL=emberSystemPrompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emberSystemPrompt.js","sourceRoot":"","sources":["../../../../src/modules/ember-chat/services/emberSystemPrompt.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,sBAAsB,CAAC,SAAyB;IAC9D,OAAO;QACL,yEAAyE;QACzE,EAAE;QACF,0FAA0F;QAC1F,0EAA0E;QAC1E,EAAE;QACF,mDAAmD;QACnD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC;QACtC,EAAE;QACF,6CAA6C;QAC7C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC;QAClC,EAAE;QACF,8CAA8C;QAC9C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC;QACpC,EAAE;QACF,kCAAkC;QAClC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC;QACnC,EAAE;QACF,mEAAmE;QACnE,yFAAyF;QACzF,sDAAsD;QACtD,EAAE;QACF,iFAAiF;QACjF,gFAAgF;QAChF,sEAAsE;KACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"emberSystemPrompt.js","sourceRoot":"","sources":["../../../../src/modules/ember-chat/services/emberSystemPrompt.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,21 @@
1
1
  import type { EnvironmentGateway } from '../../../../modules/claude-invocation/entities/billingState/environment.gateway.js';
2
2
  import type { EmberMessage } from '../../../../modules/ember-chat/entities/emberMessage/emberMessage.schema.js';
3
3
  import type { EmberReadDataGateway } from '../../../../modules/ember-chat/entities/emberTool/emberTool.gateway.js';
4
- import type { EmberSessionRegistry, EmberStreamSubscriber } from '../../../../modules/ember-chat/usecases/emberSession/emberSessionRegistry.js';
5
- export type { EmberStreamSubscriber } from '../../../../modules/ember-chat/usecases/emberSession/emberSessionRegistry.js';
4
+ import type { EmberMemoryGateway } from '../../../../modules/ember-chat/entities/emberMemory/emberMemory.gateway.js';
5
+ import type { EmberAnswerTransportGateway } from '../../../../modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.js';
6
+ import type { EmberStreamSubscriber } from '../../../../modules/ember-chat/usecases/askEmber/emberStream.js';
7
+ export type { EmberStatus, EmberStreamSubscriber } from '../../../../modules/ember-chat/usecases/askEmber/emberStream.js';
6
8
  export interface AskEmberDependencies {
7
- registry: EmberSessionRegistry;
9
+ transport: EmberAnswerTransportGateway;
8
10
  environment: EnvironmentGateway;
9
11
  readData: EmberReadDataGateway;
12
+ memory: EmberMemoryGateway;
10
13
  projectPath: string;
11
- now: () => Date;
12
14
  }
13
15
  export type AskEmberResult = {
14
16
  status: 'streaming';
15
17
  subscribe: (subscriber: EmberStreamSubscriber) => void;
18
+ cancel: () => void;
16
19
  } | {
17
20
  status: 'unavailable';
18
21
  reason: string;
@@ -1 +1 @@
1
- {"version":3,"file":"askEmber.usecase.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/askEmber/askEmber.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0EAA0E,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mEAAmE,CAAC;AACtG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8DAA8D,CAAC;AACzG,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,oEAAoE,CAAC;AAG5E,YAAY,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAEhH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,CAAC,UAAU,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAAE,GAC/E;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,8BAA8B,CAAA;CAAE,CAAC;AAE/C,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC,CAwBzB"}
1
+ {"version":3,"file":"askEmber.usecase.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/askEmber/askEmber.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0EAA0E,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mEAAmE,CAAC;AACtG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8DAA8D,CAAC;AACzG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kEAAkE,CAAC;AAE3G,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,2EAA2E,CAAC;AACnF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAGnG,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAEhH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,2BAA2B,CAAC;IACvC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GACtB;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,CAAC,UAAU,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACvD,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,GACD;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,8BAA8B,CAAA;CAAE,CAAC;AA4F/C,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC,CA+BzB"}
@@ -1,23 +1,105 @@
1
1
  import { buildEmberSystemPrompt } from '../../../../modules/ember-chat/services/emberSystemPrompt.js';
2
+ class AnswerRelay {
3
+ onAnswered;
4
+ target = null;
5
+ bufferedChunks = [];
6
+ terminal = null;
7
+ answer = '';
8
+ constructor(onAnswered) {
9
+ this.onAnswered = onAnswered;
10
+ }
11
+ attach(subscriber) {
12
+ this.target = subscriber;
13
+ subscriber.onStatus('working');
14
+ for (const chunk of this.bufferedChunks) {
15
+ subscriber.onChunk(chunk);
16
+ }
17
+ this.bufferedChunks.length = 0;
18
+ if (this.terminal !== null) {
19
+ this.flushTerminal(this.terminal);
20
+ }
21
+ }
22
+ onChunk(text) {
23
+ this.answer += text;
24
+ if (this.target === null) {
25
+ this.bufferedChunks.push(text);
26
+ return;
27
+ }
28
+ this.target.onChunk(text);
29
+ }
30
+ onDone() {
31
+ this.onAnswered(this.answer);
32
+ const terminal = { kind: 'done' };
33
+ if (this.target === null) {
34
+ this.terminal = terminal;
35
+ return;
36
+ }
37
+ this.flushTerminal(terminal);
38
+ }
39
+ onError(message) {
40
+ const terminal = { kind: 'error', message };
41
+ if (this.target === null) {
42
+ this.terminal = terminal;
43
+ return;
44
+ }
45
+ this.flushTerminal(terminal);
46
+ }
47
+ flushTerminal(terminal) {
48
+ if (this.target === null) {
49
+ return;
50
+ }
51
+ if (terminal.kind === 'done') {
52
+ this.target.onStatus('idle');
53
+ this.target.onDone();
54
+ return;
55
+ }
56
+ this.target.onStatus('error');
57
+ this.target.onError(terminal.message);
58
+ }
59
+ }
60
+ async function loadMemorySafely(memory, projectPath) {
61
+ try {
62
+ return await memory.load(projectPath);
63
+ }
64
+ catch {
65
+ // A corrupted or unreadable memory must never block an answer.
66
+ return null;
67
+ }
68
+ }
69
+ async function rememberTurn(memory, projectPath, question, answer) {
70
+ if (answer.trim().length === 0) {
71
+ return;
72
+ }
73
+ try {
74
+ await memory.appendTurn(projectPath, { question, answer });
75
+ }
76
+ catch {
77
+ // Best-effort: a memory write failure must never break answering.
78
+ }
79
+ }
2
80
  export async function askEmber(message, dependencies) {
3
81
  if (dependencies.environment.hasAnthropicApiKey()) {
4
82
  return { status: 'billing-regression-prevented' };
5
83
  }
6
- const { readData, projectPath } = dependencies;
84
+ const { readData, memory, projectPath, transport } = dependencies;
7
85
  const systemPrompt = buildEmberSystemPrompt({
8
86
  reviewScores: await readData.reviewScores(projectPath),
9
87
  insights: await readData.insights(projectPath),
10
88
  jobHistory: await readData.jobHistory(projectPath),
11
89
  worktrees: await readData.worktrees(),
90
+ memory: await loadMemorySafely(memory, projectPath),
12
91
  });
13
- const result = dependencies.registry.ask({
14
- question: message.question,
15
- systemPrompt,
16
- projectPath,
92
+ const relay = new AnswerRelay((answer) => {
93
+ void rememberTurn(memory, projectPath, message.question, answer);
17
94
  });
18
- if (result.status === 'unavailable') {
19
- return { status: 'unavailable', reason: result.reason };
95
+ const started = transport.start({ question: message.question, systemPrompt, projectPath }, relay);
96
+ if (started.status === 'failed') {
97
+ return { status: 'unavailable', reason: started.reason };
20
98
  }
21
- return { status: 'streaming', subscribe: result.subscribe };
99
+ return {
100
+ status: 'streaming',
101
+ subscribe: (subscriber) => relay.attach(subscriber),
102
+ cancel: () => started.run.cancel(),
103
+ };
22
104
  }
23
105
  //# sourceMappingURL=askEmber.usecase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"askEmber.usecase.js","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/askEmber/askEmber.usecase.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAiB5F,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAqB,EACrB,YAAkC;IAElC,IAAI,YAAY,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAClD,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;IAC/C,MAAM,YAAY,GAAG,sBAAsB,CAAC;QAC1C,YAAY,EAAE,MAAM,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC;QACtD,QAAQ,EAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC9C,UAAU,EAAE,MAAM,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;QAClD,SAAS,EAAE,MAAM,QAAQ,CAAC,SAAS,EAAE;KACtC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"askEmber.usecase.js","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/askEmber/askEmber.usecase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type EmberStatus = 'working' | 'idle' | 'error';
2
+ export interface EmberStreamSubscriber {
3
+ onStatus: (status: EmberStatus) => void;
4
+ onChunk: (text: string) => void;
5
+ onDone: () => void;
6
+ onError: (message: string) => void;
7
+ }
8
+ //# sourceMappingURL=emberStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emberStream.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/askEmber/emberStream.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=emberStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emberStream.js","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/askEmber/emberStream.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { EmberMemoryGateway } from '../../../../modules/ember-chat/entities/emberMemory/emberMemory.gateway.js';
2
+ export interface ClearEmberMemoryDependencies {
3
+ memory: EmberMemoryGateway;
4
+ projectPath: string;
5
+ }
6
+ export declare function clearEmberMemory(dependencies: ClearEmberMemoryDependencies): Promise<void>;
7
+ //# sourceMappingURL=clearEmberMemory.usecase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearEmberMemory.usecase.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kEAAkE,CAAC;AAE3G,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,4BAA4B,GACzC,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,4 @@
1
+ export async function clearEmberMemory(dependencies) {
2
+ await dependencies.memory.clear(dependencies.projectPath);
3
+ }
4
+ //# sourceMappingURL=clearEmberMemory.usecase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearEmberMemory.usecase.js","sourceRoot":"","sources":["../../../../../src/modules/ember-chat/usecases/clearEmberMemory/clearEmberMemory.usecase.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAA0C;IAE1C,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=190-ember-live-answers-subscription.acceptance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"190-ember-live-answers-subscription.acceptance.test.d.ts","sourceRoot":"","sources":["../../../src/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,165 @@
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 } from '../../tests/stubs/emberMemory.stub.js';
7
+ import { askEmber } from '../../modules/ember-chat/usecases/askEmber/askEmber.usecase.js';
8
+ import { buildEmberSystemPrompt } from '../../modules/ember-chat/services/emberSystemPrompt.js';
9
+ const PROJECT_PATH = '/projects/alpha';
10
+ function reviewData() {
11
+ const project = ProjectStatsFactory.withReviews([
12
+ ReviewStatsFactory.create({ mrNumber: 42, score: 3, blocking: 4, warnings: 1 }),
13
+ ReviewStatsFactory.create({ mrNumber: 43, score: 4, blocking: 2, warnings: 0 }),
14
+ ]);
15
+ const readData = new StubEmberReadDataGateway();
16
+ readData.setReviewScores(PROJECT_PATH, project);
17
+ return readData;
18
+ }
19
+ function largeReviewData() {
20
+ const reviews = Array.from({ length: 500 }, (_, index) => ReviewStatsFactory.create({ mrNumber: index, score: index % 10, blocking: index % 3 }));
21
+ const readData = new StubEmberReadDataGateway();
22
+ readData.setReviewScores(PROJECT_PATH, ProjectStatsFactory.withReviews(reviews));
23
+ return readData;
24
+ }
25
+ function environment(hasApiKey) {
26
+ const stub = new StubEnvironmentGateway();
27
+ stub.setHasAnthropicApiKey(hasApiKey);
28
+ return stub;
29
+ }
30
+ function collectStream(subscribe) {
31
+ return new Promise((resolve) => {
32
+ let answer = '';
33
+ const statuses = [];
34
+ subscribe({
35
+ onStatus: (state) => {
36
+ statuses.push(state);
37
+ },
38
+ onChunk: (text) => {
39
+ answer += text;
40
+ },
41
+ onDone: () => resolve({ answer, statuses }),
42
+ onError: () => resolve({ answer, statuses }),
43
+ });
44
+ });
45
+ }
46
+ describe('Answer Ember questions live via the Claude subscription (acceptance, SPEC-190)', () => {
47
+ describe('each answer is grounded on the current project review data and streams progressively', () => {
48
+ it('nominal: streams a grounded answer ending with an idle status', async () => {
49
+ const transport = new StubEmberAnswerTransportGateway();
50
+ transport.answerFromSystemPrompt();
51
+ const result = await askEmber({ question: 'Quelles reviews sont en cours ?' }, {
52
+ transport,
53
+ environment: environment(false),
54
+ readData: reviewData(),
55
+ memory: new StubEmberMemoryGateway(),
56
+ projectPath: PROJECT_PATH,
57
+ });
58
+ expect(result.status).toBe('streaming');
59
+ if (result.status !== 'streaming') {
60
+ return;
61
+ }
62
+ const { answer, statuses } = await collectStream(result.subscribe);
63
+ expect(answer).toContain('42');
64
+ expect(statuses[0]).toBe('working');
65
+ expect(statuses.at(-1)).toBe('idle');
66
+ expect(transport.startCount).toBe(1);
67
+ });
68
+ });
69
+ describe('grounding must succeed regardless of project size', () => {
70
+ it('large grounding: bounds the prompt and never fails on a huge history', async () => {
71
+ const transport = new StubEmberAnswerTransportGateway();
72
+ transport.answerFromSystemPrompt();
73
+ const result = await askEmber({ question: 'Résume mon historique' }, {
74
+ transport,
75
+ environment: environment(false),
76
+ readData: largeReviewData(),
77
+ memory: new StubEmberMemoryGateway(),
78
+ projectPath: PROJECT_PATH,
79
+ });
80
+ expect(result.status).toBe('streaming');
81
+ if (result.status !== 'streaming') {
82
+ return;
83
+ }
84
+ const { answer, statuses } = await collectStream(result.subscribe);
85
+ expect(statuses.at(-1)).toBe('idle');
86
+ expect(answer.length).toBeLessThan(60_000);
87
+ });
88
+ });
89
+ describe('the subscription is the only allowed billing path', () => {
90
+ it('api key present: refuses to answer when an Anthropic API key is set', async () => {
91
+ const transport = new StubEmberAnswerTransportGateway();
92
+ transport.answerFromSystemPrompt();
93
+ const result = await askEmber({ question: 'Statut ?' }, {
94
+ transport,
95
+ environment: environment(true),
96
+ readData: reviewData(),
97
+ memory: new StubEmberMemoryGateway(),
98
+ projectPath: PROJECT_PATH,
99
+ });
100
+ expect(result.status).toBe('billing-regression-prevented');
101
+ expect(transport.startCount).toBe(0);
102
+ });
103
+ });
104
+ describe('when the subscription is unavailable, Ember reports unavailability', () => {
105
+ it('not logged in: returns unavailable when the dispatch cannot start', async () => {
106
+ const transport = new StubEmberAnswerTransportGateway();
107
+ transport.failStart();
108
+ const result = await askEmber({ question: 'Statut ?' }, {
109
+ transport,
110
+ environment: environment(false),
111
+ readData: reviewData(),
112
+ memory: new StubEmberMemoryGateway(),
113
+ projectPath: PROJECT_PATH,
114
+ });
115
+ expect(result.status).toBe('unavailable');
116
+ });
117
+ });
118
+ describe('when answering fails part-way through, the user can retry', () => {
119
+ it('mid-stream failure: surfaces an error after partial chunks', async () => {
120
+ const transport = new StubEmberAnswerTransportGateway();
121
+ transport.failMidStream();
122
+ const result = await askEmber({ question: 'Statut ?' }, {
123
+ transport,
124
+ environment: environment(false),
125
+ readData: reviewData(),
126
+ memory: new StubEmberMemoryGateway(),
127
+ projectPath: PROJECT_PATH,
128
+ });
129
+ expect(result.status).toBe('streaming');
130
+ if (result.status !== 'streaming') {
131
+ return;
132
+ }
133
+ const statuses = [];
134
+ let errored = false;
135
+ await new Promise((resolve) => {
136
+ result.subscribe({
137
+ onStatus: (state) => statuses.push(state),
138
+ onChunk: () => undefined,
139
+ onDone: () => resolve(),
140
+ onError: () => {
141
+ errored = true;
142
+ resolve();
143
+ },
144
+ });
145
+ });
146
+ expect(errored).toBe(true);
147
+ expect(statuses).toContain('error');
148
+ });
149
+ });
150
+ describe('grounding is bounded by buildEmberSystemPrompt as a pure function', () => {
151
+ it('keeps aggregates and recent reviews while capping a huge history', () => {
152
+ const reviews = Array.from({ length: 500 }, (_, index) => ReviewStatsFactory.create({ mrNumber: index, score: index % 10 }));
153
+ const prompt = buildEmberSystemPrompt({
154
+ reviewScores: ProjectStatsFactory.withReviews(reviews),
155
+ insights: null,
156
+ jobHistory: null,
157
+ worktrees: [],
158
+ memory: null,
159
+ });
160
+ expect(prompt.length).toBeLessThan(60_000);
161
+ expect(prompt).toContain('totalReviews');
162
+ });
163
+ });
164
+ });
165
+ //# sourceMappingURL=190-ember-live-answers-subscription.acceptance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"190-ember-live-answers-subscription.acceptance.test.js","sourceRoot":"","sources":["../../../src/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=192-ember-ondemand-grounding-and-memory.acceptance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"192-ember-ondemand-grounding-and-memory.acceptance.test.d.ts","sourceRoot":"","sources":["../../../src/tests/acceptance/192-ember-ondemand-grounding-and-memory.acceptance.test.ts"],"names":[],"mappings":""}