repoburg 1.3.170 → 1.3.172

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 (64) hide show
  1. package/backend/.env +1 -1
  2. package/backend/dist/src/core-entities/enums.d.ts +2 -1
  3. package/backend/dist/src/core-entities/enums.js +1 -0
  4. package/backend/dist/src/core-entities/enums.js.map +1 -1
  5. package/backend/dist/src/core-entities/session-input.entity.d.ts +2 -0
  6. package/backend/dist/src/core-entities/session-input.entity.js +17 -0
  7. package/backend/dist/src/core-entities/session-input.entity.js.map +1 -1
  8. package/backend/dist/src/core-entities/session.entity.d.ts +1 -0
  9. package/backend/dist/src/core-entities/session.entity.js +9 -0
  10. package/backend/dist/src/core-entities/session.entity.js.map +1 -1
  11. package/backend/dist/src/interactive-chat/chat.service.js +15 -1
  12. package/backend/dist/src/interactive-chat/chat.service.js.map +1 -1
  13. package/backend/dist/src/llm-orchestration/action-handlers/discard-messages.handler.js +1 -5
  14. package/backend/dist/src/llm-orchestration/action-handlers/discard-messages.handler.js.map +1 -1
  15. package/backend/dist/src/llm-orchestration/action-handlers/get-messages.handler.js +6 -5
  16. package/backend/dist/src/llm-orchestration/action-handlers/get-messages.handler.js.map +1 -1
  17. package/backend/dist/src/llm-orchestration/action-handlers/replace-message-groups.handler.d.ts +32 -0
  18. package/backend/dist/src/llm-orchestration/action-handlers/replace-message-groups.handler.js +394 -0
  19. package/backend/dist/src/llm-orchestration/action-handlers/replace-message-groups.handler.js.map +1 -0
  20. package/backend/dist/src/llm-orchestration/conversation-group-resolver.d.ts +11 -0
  21. package/backend/dist/src/llm-orchestration/conversation-group-resolver.js +73 -0
  22. package/backend/dist/src/llm-orchestration/conversation-group-resolver.js.map +1 -0
  23. package/backend/dist/src/llm-orchestration/history-compression.service.d.ts +7 -0
  24. package/backend/dist/src/llm-orchestration/history-compression.service.js +214 -6
  25. package/backend/dist/src/llm-orchestration/history-compression.service.js.map +1 -1
  26. package/backend/dist/src/llm-orchestration/llm-orchestration.module.js +5 -1
  27. package/backend/dist/src/llm-orchestration/llm-orchestration.module.js.map +1 -1
  28. package/backend/dist/src/llm-orchestration/llm-turn-processor.service.js +6 -2
  29. package/backend/dist/src/llm-orchestration/llm-turn-processor.service.js.map +1 -1
  30. package/backend/dist/src/llm-responses/llm-responses.service.js +10 -0
  31. package/backend/dist/src/llm-responses/llm-responses.service.js.map +1 -1
  32. package/backend/dist/src/seeding/data/context-snippets/compress-with-summary.d.ts +3 -0
  33. package/backend/dist/src/seeding/data/context-snippets/compress-with-summary.js +68 -0
  34. package/backend/dist/src/seeding/data/context-snippets/compress-with-summary.js.map +1 -0
  35. package/backend/dist/src/seeding/data/system-prompts/control-repoburg-agent.js +1 -0
  36. package/backend/dist/src/seeding/data/system-prompts/control-repoburg-agent.js.map +1 -1
  37. package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js +1 -0
  38. package/backend/dist/src/seeding/data/system-prompts/default_native_tool_agent.js.map +1 -1
  39. package/backend/dist/src/seeding/data/system-prompts/session-compressor-agent.d.ts +1 -1
  40. package/backend/dist/src/seeding/data/system-prompts/session-compressor-agent.js +2 -42
  41. package/backend/dist/src/seeding/data/system-prompts/session-compressor-agent.js.map +1 -1
  42. package/backend/dist/src/seeding/data/tool-hooks/session-compression-hook.d.ts +1 -1
  43. package/backend/dist/src/seeding/data/tool-hooks/session-compression-hook.js +3 -4
  44. package/backend/dist/src/seeding/data/tool-hooks/session-compression-hook.js.map +1 -1
  45. package/backend/dist/src/session-inputs/session-inputs.controller.d.ts +3 -0
  46. package/backend/dist/src/session-inputs/session-inputs.controller.js +32 -0
  47. package/backend/dist/src/session-inputs/session-inputs.controller.js.map +1 -1
  48. package/backend/dist/src/session-inputs/session-inputs.service.d.ts +4 -2
  49. package/backend/dist/src/session-inputs/session-inputs.service.js +73 -2
  50. package/backend/dist/src/session-inputs/session-inputs.service.js.map +1 -1
  51. package/backend/dist/src/session-transfer/session-transfer.service.d.ts +1 -0
  52. package/backend/dist/src/session-transfer/session-transfer.service.js +3 -1
  53. package/backend/dist/src/session-transfer/session-transfer.service.js.map +1 -1
  54. package/backend/dist/src/sessions/sessions.service.js +14 -0
  55. package/backend/dist/src/sessions/sessions.service.js.map +1 -1
  56. package/backend/dist/src/system-prompts/system-prompts.service.js +1 -0
  57. package/backend/dist/src/system-prompts/system-prompts.service.js.map +1 -1
  58. package/backend/dist/src/tool-hooks/hook-runtime.d.ts +3 -8
  59. package/backend/dist/src/tool-hooks/hook-runtime.js +8 -11
  60. package/backend/dist/src/tool-hooks/hook-runtime.js.map +1 -1
  61. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  62. package/backend/jest.low-memory.config.cjs +7 -0
  63. package/backend/package.json +1 -0
  64. package/package.json +1 -1
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var ReplaceMessageGroupsHandler_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.ReplaceMessageGroupsHandler = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const typeorm_1 = require("@nestjs/typeorm");
19
+ const typeorm_2 = require("typeorm");
20
+ const core_entities_1 = require("../../core-entities");
21
+ const history_compression_service_1 = require("../history-compression.service");
22
+ const get_messages_handler_1 = require("./get-messages.handler");
23
+ const utils_1 = require("../../utils");
24
+ const conversation_group_resolver_1 = require("../conversation-group-resolver");
25
+ function parseReplacements(raw) {
26
+ if (Array.isArray(raw))
27
+ return raw;
28
+ if (typeof raw === 'string') {
29
+ const trimmed = raw.trim();
30
+ if (trimmed === '')
31
+ return [];
32
+ try {
33
+ const parsed = JSON.parse(trimmed);
34
+ if (Array.isArray(parsed))
35
+ return parsed;
36
+ if (typeof parsed === 'string') {
37
+ const inner = JSON.parse(parsed);
38
+ if (Array.isArray(inner))
39
+ return inner;
40
+ }
41
+ }
42
+ catch {
43
+ }
44
+ }
45
+ return [];
46
+ }
47
+ let ReplaceMessageGroupsHandler = ReplaceMessageGroupsHandler_1 = class ReplaceMessageGroupsHandler {
48
+ constructor(sessionInputsRepository, dataSource, historyCompressionService) {
49
+ this.sessionInputsRepository = sessionInputsRepository;
50
+ this.dataSource = dataSource;
51
+ this.historyCompressionService = historyCompressionService;
52
+ this.toolName = 'replace_message_groups';
53
+ this.logger = new common_1.Logger(ReplaceMessageGroupsHandler_1.name);
54
+ }
55
+ getMetadata() {
56
+ return {
57
+ name: this.toolName,
58
+ description: 'Replace one or more completed conversation groups with concise, self-contained summary messages. Pass group_start_ids as the short_id of the first message in each group (from get_messages). Multiple groups can be replaced by one summary. Batch multiple independent replacements in one call. Do NOT call this in the same turn as final — a follow-up turn will start automatically so you can observe the compressed history.',
59
+ arguments: [
60
+ {
61
+ name: 'replacements',
62
+ type: 'string',
63
+ description: 'JSON array of replacement objects. Each object: {"group_start_ids":"a1b90,c2d31","summary":"Self-contained summary text...","reason":"Why this replacement is useful."}. group_start_ids is a comma-separated list of first-message short_ids. Multiple IDs mean those groups are replaced by the single summary.',
64
+ required: true,
65
+ },
66
+ ],
67
+ };
68
+ }
69
+ getDefinition() {
70
+ return `## replace_message_groups
71
+
72
+ Replace one or more completed conversation groups with concise, self-contained summary messages. This is a semantic, model-directed compression — the user's prompt defines the compression policy.
73
+
74
+ ### Workflow:
75
+ 1. Call \`get_messages\` first to see the active history with group short_ids.
76
+ 2. Identify completed groups whose first-message \`short_id\` you want to replace.
77
+ 3. Call \`replace_message_groups\` once with a batch of replacement objects.
78
+ 4. A follow-up turn starts automatically — observe the compressed history and decide whether to continue or call \`final\`.
79
+
80
+ ### Important Rules:
81
+ - **Do NOT call \`final\` in the same turn** as \`replace_message_groups\`. The follow-up turn lets you verify the compression.
82
+ - Each \`group_start_id\` is the \`short_id\` of the **first message** in a conversation group (the user message that starts the group).
83
+ - Multiple \`group_start_ids\` in one replacement mean those groups are combined into one summary.
84
+ - Groups combined into one summary **must be contiguous** in the active timeline.
85
+ - Summaries must be **self-contained** — they will replace the original messages in the LLM context.
86
+ - When including an older summary in a newer summary, the newer summary **must absorb all relevant facts** from the older one. The older summary will disappear from active context.
87
+ - Do not include the ongoing/current group or the most recent completed group if your policy says to preserve it.
88
+
89
+ ### Parameters:
90
+ - \`replacements\` (string, required): JSON array of replacement objects:
91
+ \`\`\`json
92
+ [
93
+ {"group_start_ids":"a1b90,c2d31","summary":"...","reason":"..."},
94
+ {"group_start_ids":"e3f42","summary":"...","reason":"..."}
95
+ ]
96
+ \`\`\`
97
+
98
+ ### Returns:
99
+ JSON object with:
100
+ - \`replacement_count\`: Number of replacement objects processed
101
+ - \`replaced_group_count\`: Total number of groups replaced
102
+ - \`replaced_message_count\`: Total number of source messages replaced
103
+ - \`created_summaries\`: Array of {summary_input_id, source_group_start_ids}
104
+ - \`old_est_tokens\`: Estimated tokens before replacement (informational)
105
+ - \`new_est_tokens\`: Estimated tokens after replacement (informational)
106
+
107
+ ### Example:
108
+ \`\`\`typescript
109
+ tool: replace_message_groups
110
+ args: {
111
+ replacements: '[{"group_start_ids":"a1b90,c2d31","summary":"Auth and session work completed. JWT middleware added to src/auth.ts. Session store uses redis. Tests pass.","reason":"These related completed groups can be represented by one durable summary."}]'
112
+ }
113
+ \`\`\``;
114
+ }
115
+ async execute(args, context) {
116
+ try {
117
+ const replacements = parseReplacements(args.replacements);
118
+ if (!Array.isArray(replacements) || replacements.length === 0) {
119
+ return fail('replacements must be a non-empty JSON array of replacement objects');
120
+ }
121
+ for (let i = 0; i < replacements.length; i++) {
122
+ const r = replacements[i];
123
+ if (!r.group_start_ids ||
124
+ typeof r.group_start_ids !== 'string' ||
125
+ r.group_start_ids.trim() === '') {
126
+ return fail(`Replacement ${i}: group_start_ids is required and must be a non-empty comma-separated string`);
127
+ }
128
+ if (!r.summary ||
129
+ typeof r.summary !== 'string' ||
130
+ r.summary.trim() === '') {
131
+ return fail(`Replacement ${i}: summary is required and must be non-empty`);
132
+ }
133
+ if (!r.reason ||
134
+ typeof r.reason !== 'string' ||
135
+ r.reason.trim() === '') {
136
+ return fail(`Replacement ${i}: reason is required and must be non-empty`);
137
+ }
138
+ }
139
+ const allInputs = await this.sessionInputsRepository.find({
140
+ where: { session: { id: context.session_id } },
141
+ relations: ['aiActions'],
142
+ order: { sequence_number: 'ASC' },
143
+ });
144
+ const shortToInputs = new Map();
145
+ for (const inp of allInputs) {
146
+ const sid = (0, utils_1.toShortId)(inp.id);
147
+ const existing = shortToInputs.get(sid) || [];
148
+ existing.push(inp);
149
+ shortToInputs.set(sid, existing);
150
+ }
151
+ const activeInputs = allInputs.filter((i) => !i.is_discarded);
152
+ const groups = (0, conversation_group_resolver_1.resolveConversationGroups)(activeInputs);
153
+ const groupByStartId = new Map();
154
+ for (const g of groups) {
155
+ groupByStartId.set(g.startShortId, g);
156
+ }
157
+ const allSelectedGroupStartIds = new Set();
158
+ const resolvedReplacements = [];
159
+ for (let i = 0; i < replacements.length; i++) {
160
+ const r = replacements[i];
161
+ const startIds = r.group_start_ids
162
+ .split(',')
163
+ .map((s) => s.trim())
164
+ .filter((s) => s.length > 0);
165
+ const resolvedGroups = [];
166
+ for (const sid of startIds) {
167
+ const candidates = shortToInputs.get(sid);
168
+ if (!candidates || candidates.length === 0) {
169
+ return fail(`Replacement ${i}: short_id "${sid}" does not resolve to any message in the current session`);
170
+ }
171
+ if (candidates.length > 1) {
172
+ return fail(`Replacement ${i}: short_id "${sid}" is ambiguous (matches ${candidates.length} messages)`);
173
+ }
174
+ const group = groupByStartId.get(sid);
175
+ if (!group) {
176
+ const input = candidates[0];
177
+ if (input.is_discarded) {
178
+ return fail(`Replacement ${i}: short_id "${sid}" refers to a discarded message — only active groups can be replaced`);
179
+ }
180
+ return fail(`Replacement ${i}: short_id "${sid}" is not the start of a completed conversation group (it may be part of an ongoing/incomplete group)`);
181
+ }
182
+ if (!group.isComplete) {
183
+ return fail(`Replacement ${i}: short_id "${sid}" belongs to an incomplete/ongoing group — only completed groups can be replaced`);
184
+ }
185
+ resolvedGroups.push(group);
186
+ }
187
+ for (const g of resolvedGroups) {
188
+ if (allSelectedGroupStartIds.has(g.startShortId)) {
189
+ return fail(`Replacement ${i}: group "${g.startShortId}" is already selected in another replacement — groups cannot overlap`);
190
+ }
191
+ allSelectedGroupStartIds.add(g.startShortId);
192
+ }
193
+ if (resolvedGroups.length > 1) {
194
+ const groupIndices = resolvedGroups.map((g) => groups.findIndex((gg) => gg.startShortId === g.startShortId));
195
+ const sorted = [...groupIndices].sort((a, b) => a - b);
196
+ for (let j = 1; j < sorted.length; j++) {
197
+ if (sorted[j] !== sorted[j - 1] + 1) {
198
+ return fail(`Replacement ${i}: groups combined into one summary must be contiguous in the active timeline (non-contiguous groups detected)`);
199
+ }
200
+ }
201
+ }
202
+ const allSourceInputIds = resolvedGroups.flatMap((g) => g.inputIds);
203
+ const maxSeqNumber = resolvedGroups.reduce((max, g) => Math.max(max, g.lastSequenceNumber), 0);
204
+ resolvedReplacements.push({
205
+ groups: resolvedGroups,
206
+ summary: r.summary.trim(),
207
+ reason: r.reason.trim(),
208
+ allSourceInputIds,
209
+ maxSeqNumber,
210
+ });
211
+ }
212
+ const preRatio = await this.computeRatio(activeInputs);
213
+ const oldEstTokens = await this.estimateTokensWithRatio(activeInputs, preRatio);
214
+ const queryRunner = this.dataSource.createQueryRunner();
215
+ await queryRunner.connect();
216
+ await queryRunner.startTransaction();
217
+ try {
218
+ const createdSummaries = [];
219
+ let replacedMessageCount = 0;
220
+ const defaultExecutionStrategy = resolvedReplacements[0]?.groups[0]
221
+ ?.startInputId
222
+ ? allInputs.find((i) => i.id === resolvedReplacements[0].groups[0].startInputId)?.execution_strategy || null
223
+ : null;
224
+ for (const rr of resolvedReplacements) {
225
+ const summaryInput = queryRunner.manager.create(core_entities_1.SessionInput, {
226
+ session_id: context.session_id,
227
+ role: 'user',
228
+ user_prompt: rr.summary,
229
+ generated_context_string: `<conversation_summary>\n${rr.summary}\n</conversation_summary>`,
230
+ execution_strategy: defaultExecutionStrategy,
231
+ is_summary: true,
232
+ is_discarded: false,
233
+ sequence_number: rr.maxSeqNumber,
234
+ });
235
+ const savedSummary = await queryRunner.manager.save(summaryInput);
236
+ createdSummaries.push({
237
+ summary_input_id: savedSummary.id,
238
+ source_group_start_ids: rr.groups.map((g) => g.startShortId),
239
+ });
240
+ for (const sourceId of rr.allSourceInputIds) {
241
+ await queryRunner.manager.update(core_entities_1.SessionInput, { id: sourceId }, {
242
+ is_discarded: true,
243
+ replaced_by_summary_input_id: savedSummary.id,
244
+ });
245
+ replacedMessageCount++;
246
+ }
247
+ }
248
+ const sourceIdSet = new Set();
249
+ for (const rr of resolvedReplacements) {
250
+ for (const id of rr.allSourceInputIds) {
251
+ sourceIdSet.add(id);
252
+ }
253
+ }
254
+ const getMessagesToDiscard = allInputs.filter((inp) => !inp.is_discarded &&
255
+ inp.role === 'model' &&
256
+ inp.aiActions &&
257
+ inp.aiActions.length > 0 &&
258
+ inp.aiActions.every((a) => a.action_type === 'get_messages') &&
259
+ !sourceIdSet.has(inp.id));
260
+ for (const inp of getMessagesToDiscard) {
261
+ await queryRunner.manager.update(core_entities_1.SessionInput, { id: inp.id }, { is_discarded: true });
262
+ }
263
+ await queryRunner.commitTransaction();
264
+ const newActiveInputs = await this.sessionInputsRepository.find({
265
+ where: { session: { id: context.session_id }, is_discarded: false },
266
+ relations: ['aiActions', 'aiActions.executionLogs'],
267
+ order: { sequence_number: 'ASC' },
268
+ });
269
+ const newEstTokens = await this.estimateTokensWithRatio(newActiveInputs, preRatio);
270
+ const result = {
271
+ replacement_count: resolvedReplacements.length,
272
+ replaced_group_count: allSelectedGroupStartIds.size,
273
+ replaced_message_count: replacedMessageCount,
274
+ created_summaries: createdSummaries,
275
+ old_est_tokens: oldEstTokens,
276
+ new_est_tokens: newEstTokens,
277
+ auto_discarded_get_messages: getMessagesToDiscard.length,
278
+ };
279
+ return {
280
+ status: 'SUCCESS',
281
+ summary: getMessagesToDiscard.length > 0
282
+ ? `Replaced ${allSelectedGroupStartIds.size} group(s) with ${resolvedReplacements.length} summary(ies). Auto-discarded ${getMessagesToDiscard.length} get_messages inspection turn(s). ~${oldEstTokens} → ~${newEstTokens} est tokens.`
283
+ : `Replaced ${allSelectedGroupStartIds.size} group(s) with ${resolvedReplacements.length} summary(ies). ~${oldEstTokens} → ~${newEstTokens} est tokens.`,
284
+ execution_log: {
285
+ output: JSON.stringify(result, null, 2),
286
+ },
287
+ persisted_args: {
288
+ arguments: JSON.stringify(resolvedReplacements.map((rr) => ({
289
+ group_start_ids: rr.groups.map((g) => g.startShortId).join(','),
290
+ summary: rr.summary,
291
+ reason: rr.reason,
292
+ }))),
293
+ },
294
+ };
295
+ }
296
+ catch (error) {
297
+ await queryRunner.rollbackTransaction();
298
+ this.logger.error(`Failed to persist message group replacements: ${error.message}`, error.stack);
299
+ return {
300
+ status: 'FAILURE',
301
+ summary: 'Failed to replace message groups',
302
+ error_message: `Transaction failed: ${error.message}. All replacements were rolled back.`,
303
+ execution_log: {
304
+ output: '',
305
+ error_message: error.message,
306
+ },
307
+ };
308
+ }
309
+ finally {
310
+ await queryRunner.release();
311
+ }
312
+ }
313
+ catch (error) {
314
+ return {
315
+ status: 'FAILURE',
316
+ summary: 'Failed to replace message groups',
317
+ error_message: error.message,
318
+ execution_log: {
319
+ output: '',
320
+ error_message: error.message,
321
+ },
322
+ };
323
+ }
324
+ }
325
+ async computeRatio(inputs) {
326
+ if (inputs.length === 0)
327
+ return get_messages_handler_1.DEFAULT_CHARS_PER_TOKEN;
328
+ const { history, turnToInputIndex } = (0, get_messages_handler_1.buildHistory)(inputs);
329
+ const compressedHistory = await this.historyCompressionService.compress(history);
330
+ const compressedCharSizes = new Array(inputs.length).fill(0);
331
+ for (let i = 0; i < compressedHistory.length; i++) {
332
+ const turnCharSize = (0, get_messages_handler_1.computeTurnCharSize)(compressedHistory[i]);
333
+ const inputIdx = turnToInputIndex[i];
334
+ if (inputIdx >= 0 && inputIdx < inputs.length) {
335
+ compressedCharSizes[inputIdx] += turnCharSize;
336
+ }
337
+ }
338
+ let ratio = get_messages_handler_1.DEFAULT_CHARS_PER_TOKEN;
339
+ let ratioInputIndex = -1;
340
+ for (let i = inputs.length - 1; i >= 0; i--) {
341
+ if (inputs[i].role === 'model' &&
342
+ inputs[i].input_token_count != null &&
343
+ inputs[i].input_token_count > 0) {
344
+ ratioInputIndex = i;
345
+ break;
346
+ }
347
+ }
348
+ if (ratioInputIndex >= 0) {
349
+ let cumulativeChars = 0;
350
+ for (let i = 0; i <= ratioInputIndex; i++) {
351
+ cumulativeChars += compressedCharSizes[i];
352
+ }
353
+ if (cumulativeChars > 0) {
354
+ ratio = cumulativeChars / inputs[ratioInputIndex].input_token_count;
355
+ }
356
+ }
357
+ return ratio;
358
+ }
359
+ async estimateTokensWithRatio(inputs, ratio) {
360
+ if (inputs.length === 0)
361
+ return 0;
362
+ const { history, turnToInputIndex } = (0, get_messages_handler_1.buildHistory)(inputs);
363
+ const compressedHistory = await this.historyCompressionService.compress(history);
364
+ const compressedCharSizes = new Array(inputs.length).fill(0);
365
+ for (let i = 0; i < compressedHistory.length; i++) {
366
+ const turnCharSize = (0, get_messages_handler_1.computeTurnCharSize)(compressedHistory[i]);
367
+ const inputIdx = turnToInputIndex[i];
368
+ if (inputIdx >= 0 && inputIdx < inputs.length) {
369
+ compressedCharSizes[inputIdx] += turnCharSize;
370
+ }
371
+ }
372
+ return compressedCharSizes.reduce((sum, cs) => sum + (cs > 0 ? Math.round(cs / ratio) : 0), 0);
373
+ }
374
+ };
375
+ exports.ReplaceMessageGroupsHandler = ReplaceMessageGroupsHandler;
376
+ exports.ReplaceMessageGroupsHandler = ReplaceMessageGroupsHandler = ReplaceMessageGroupsHandler_1 = __decorate([
377
+ (0, common_1.Injectable)(),
378
+ __param(0, (0, typeorm_1.InjectRepository)(core_entities_1.SessionInput)),
379
+ __metadata("design:paramtypes", [typeorm_2.Repository,
380
+ typeorm_2.DataSource,
381
+ history_compression_service_1.HistoryCompressionService])
382
+ ], ReplaceMessageGroupsHandler);
383
+ function fail(message) {
384
+ return {
385
+ status: 'FAILURE',
386
+ summary: 'Failed to replace message groups',
387
+ error_message: message,
388
+ execution_log: {
389
+ output: '',
390
+ error_message: message,
391
+ },
392
+ };
393
+ }
394
+ //# sourceMappingURL=replace-message-groups.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-message-groups.handler.js","sourceRoot":"","sources":["../../../../src/llm-orchestration/action-handlers/replace-message-groups.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { SessionInput } from '../core-entities';
2
+ export interface ResolvedConversationGroup {
3
+ startInputId: string;
4
+ startShortId: string;
5
+ inputIds: string[];
6
+ firstSequenceNumber: number;
7
+ lastSequenceNumber: number;
8
+ isSummary: boolean;
9
+ isComplete: boolean;
10
+ }
11
+ export declare function resolveConversationGroups(inputs: SessionInput[]): ResolvedConversationGroup[];
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveConversationGroups = resolveConversationGroups;
4
+ const utils_1 = require("../utils");
5
+ function resolveConversationGroups(inputs) {
6
+ const groups = [];
7
+ let current = null;
8
+ for (const input of inputs) {
9
+ if (input.is_summary) {
10
+ if (current) {
11
+ groups.push(finalizeGroup(current));
12
+ current = null;
13
+ }
14
+ groups.push({
15
+ startInputId: input.id,
16
+ startShortId: (0, utils_1.toShortId)(input.id),
17
+ inputIds: [input.id],
18
+ firstSequenceNumber: input.sequence_number ?? 0,
19
+ lastSequenceNumber: input.sequence_number ?? 0,
20
+ isSummary: true,
21
+ isComplete: true,
22
+ });
23
+ continue;
24
+ }
25
+ if (input.role === 'user') {
26
+ if (current) {
27
+ groups.push(finalizeGroup(current));
28
+ current = null;
29
+ }
30
+ current = {
31
+ startInputId: input.id,
32
+ inputIds: [input.id],
33
+ firstSequenceNumber: input.sequence_number ?? 0,
34
+ lastSequenceNumber: input.sequence_number ?? 0,
35
+ isSummary: false,
36
+ isComplete: false,
37
+ };
38
+ continue;
39
+ }
40
+ if (current) {
41
+ current.inputIds.push(input.id);
42
+ current.lastSequenceNumber =
43
+ input.sequence_number ?? current.lastSequenceNumber;
44
+ if (hasTerminalAction(input)) {
45
+ current.isComplete = true;
46
+ groups.push(finalizeGroup(current));
47
+ current = null;
48
+ }
49
+ }
50
+ }
51
+ if (current) {
52
+ groups.push(finalizeGroup(current));
53
+ }
54
+ return groups;
55
+ }
56
+ function finalizeGroup(current) {
57
+ return {
58
+ startInputId: current.startInputId,
59
+ startShortId: (0, utils_1.toShortId)(current.startInputId),
60
+ inputIds: current.inputIds,
61
+ firstSequenceNumber: current.firstSequenceNumber,
62
+ lastSequenceNumber: current.lastSequenceNumber,
63
+ isSummary: current.isSummary,
64
+ isComplete: current.isComplete,
65
+ };
66
+ }
67
+ function hasTerminalAction(input) {
68
+ if (!input.aiActions || input.aiActions.length === 0) {
69
+ return false;
70
+ }
71
+ return input.aiActions.some((a) => a.action_type === 'final' || a.action_type === 'html_final');
72
+ }
73
+ //# sourceMappingURL=conversation-group-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-group-resolver.js","sourceRoot":"","sources":["../../../src/llm-orchestration/conversation-group-resolver.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,13 @@ export declare class HistoryCompressionService {
8
8
  private readonly FILE_WRITE_TOOLS;
9
9
  constructor(applicationStateService: ApplicationStateService);
10
10
  compress(history: LlmContent[]): Promise<LlmContent[]>;
11
+ private readonly SUMMARY_TOOL;
12
+ private redactPersistedSummaryToolCalls;
13
+ private buildSummaryResultIndex;
14
+ private tryRedactSummaryToolCall;
15
+ private parseSummaryToolCallArguments;
16
+ private normalizeGroupKey;
17
+ private normalizeGroupKeyArray;
11
18
  private buildUnifiedFileIndex;
12
19
  private redactBasedOnIndex;
13
20
  private isFileContentTool;