@dexto/core 1.9.2 → 1.9.4

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 (36) hide show
  1. package/dist/context/error-codes.cjs +1 -0
  2. package/dist/context/error-codes.d.ts +1 -0
  3. package/dist/context/error-codes.d.ts.map +1 -1
  4. package/dist/context/error-codes.js +1 -0
  5. package/dist/context/errors.cjs +10 -0
  6. package/dist/context/errors.d.ts +1 -0
  7. package/dist/context/errors.d.ts.map +1 -1
  8. package/dist/context/errors.js +10 -0
  9. package/dist/context/manager.cjs +66 -24
  10. package/dist/context/manager.d.ts +27 -17
  11. package/dist/context/manager.d.ts.map +1 -1
  12. package/dist/context/manager.js +66 -24
  13. package/dist/llm/executor/model-request-diagnostics.cjs +286 -0
  14. package/dist/llm/executor/model-request-diagnostics.d.ts +63 -0
  15. package/dist/llm/executor/model-request-diagnostics.d.ts.map +1 -0
  16. package/dist/llm/executor/model-request-diagnostics.js +262 -0
  17. package/dist/llm/executor/stream-processor.cjs +8 -13
  18. package/dist/llm/executor/stream-processor.d.ts +0 -1
  19. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  20. package/dist/llm/executor/stream-processor.js +8 -13
  21. package/dist/llm/executor/turn-executor.cjs +48 -12
  22. package/dist/llm/executor/turn-executor.d.ts +1 -1
  23. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  24. package/dist/llm/executor/turn-executor.js +51 -12
  25. package/dist/storage/conversation/database.cjs +15 -0
  26. package/dist/storage/conversation/database.d.ts +4 -1
  27. package/dist/storage/conversation/database.d.ts.map +1 -1
  28. package/dist/storage/conversation/database.js +15 -0
  29. package/dist/storage/conversation/types.d.ts +12 -0
  30. package/dist/storage/conversation/types.d.ts.map +1 -1
  31. package/dist/storage/index.d.ts +1 -1
  32. package/dist/storage/index.d.ts.map +1 -1
  33. package/dist/storage/stores/in-memory.cjs +15 -0
  34. package/dist/storage/stores/in-memory.d.ts.map +1 -1
  35. package/dist/storage/stores/in-memory.js +15 -0
  36. package/package.json +2 -2
@@ -125,11 +125,13 @@ class StreamProcessor {
125
125
  setStreamAttribute("last_delta_received_ms", lastDeltaReceivedAtMs);
126
126
  setStreamAttribute("last_delta_kind", "text");
127
127
  if (!this.assistantMessageId) {
128
- this.assistantMessageId = await this.contextManager.addAssistantMessage("", [], {
129
- assistantOutput: { status: "draft" }
130
- }).then(() => {
131
- return this.getLastMessageId();
132
- });
128
+ this.assistantMessageId = await this.contextManager.addAssistantMessage(
129
+ "",
130
+ [],
131
+ {
132
+ assistantOutput: { status: "draft" }
133
+ }
134
+ );
133
135
  }
134
136
  await this.contextManager.appendAssistantText(
135
137
  this.assistantMessageId,
@@ -543,16 +545,9 @@ class StreamProcessor {
543
545
  this.reasoningMetadata = merged;
544
546
  }
545
547
  async createAssistantMessage() {
546
- await this.contextManager.addAssistantMessage("", [], {
548
+ return this.contextManager.addAssistantMessage("", [], {
547
549
  assistantOutput: { status: "draft" }
548
550
  });
549
- return this.getLastMessageId();
550
- }
551
- async getLastMessageId() {
552
- const history = await this.contextManager.getHistory();
553
- const last = history[history.length - 1];
554
- if (!last || !last.id) throw new Error("Failed to get last message ID");
555
- return last.id;
556
551
  }
557
552
  /**
558
553
  * Persist synthetic "cancelled" results for all pending tool calls.
@@ -47,6 +47,7 @@ var import_provider_error = require("./provider-error.js");
47
47
  var import_error_conversion = require("../../utils/error-conversion.js");
48
48
  var import_codex_base_url = require("../providers/codex-base-url.js");
49
49
  var import_tool_definitions = require("./tool-definitions.js");
50
+ var import_model_request_diagnostics = require("./model-request-diagnostics.js");
50
51
  var import_types3 = require("../../approval/types.js");
51
52
  var import_content_audit = require("../../context/content-audit.js");
52
53
  var import_content_clone = require("../../context/content-clone.js");
@@ -966,7 +967,7 @@ class TurnExecutor {
966
967
  () => this.contextManager.getSystemPrompt(input.contributorContext),
967
968
  this.logger
968
969
  );
969
- let { preparedHistory, formattedMessages } = await (0, import_operation_span.recordOperationSpan)(
970
+ let { preparedHistory, preparedHistoryStats, formattedMessages } = await (0, import_operation_span.recordOperationSpan)(
970
971
  {
971
972
  name: "context.build_messages",
972
973
  componentName: "TurnExecutor",
@@ -976,14 +977,19 @@ class TurnExecutor {
976
977
  }
977
978
  },
978
979
  async () => {
979
- const preparedHistory2 = (await this.contextManager.prepareHistory()).preparedHistory;
980
+ const preparedHistoryResult = await this.contextManager.prepareModelHistory();
981
+ const preparedHistory2 = preparedHistoryResult.preparedHistory;
980
982
  const formattedMessages2 = await this.contextManager.getFormattedMessages(
981
983
  input.contributorContext,
982
984
  this.llmContext,
983
985
  systemPrompt,
984
986
  preparedHistory2
985
987
  );
986
- return { preparedHistory: preparedHistory2, formattedMessages: formattedMessages2 };
988
+ return {
989
+ preparedHistory: preparedHistory2,
990
+ preparedHistoryStats: preparedHistoryResult.stats,
991
+ formattedMessages: formattedMessages2
992
+ };
987
993
  },
988
994
  this.logger
989
995
  );
@@ -1047,7 +1053,7 @@ class TurnExecutor {
1047
1053
  () => this.contextManager.getSystemPrompt(input.contributorContext),
1048
1054
  this.logger
1049
1055
  );
1050
- ({ preparedHistory, formattedMessages } = await (0, import_operation_span.recordOperationSpan)(
1056
+ ({ preparedHistory, preparedHistoryStats, formattedMessages } = await (0, import_operation_span.recordOperationSpan)(
1051
1057
  {
1052
1058
  name: "context.build_messages",
1053
1059
  componentName: "TurnExecutor",
@@ -1058,14 +1064,19 @@ class TurnExecutor {
1058
1064
  }
1059
1065
  },
1060
1066
  async () => {
1061
- const preparedHistory2 = (await this.contextManager.prepareHistory()).preparedHistory;
1067
+ const preparedHistoryResult = await this.contextManager.prepareModelHistory();
1068
+ const preparedHistory2 = preparedHistoryResult.preparedHistory;
1062
1069
  const formattedMessages2 = await this.contextManager.getFormattedMessages(
1063
1070
  input.contributorContext,
1064
1071
  this.llmContext,
1065
1072
  systemPrompt,
1066
1073
  preparedHistory2
1067
1074
  );
1068
- return { preparedHistory: preparedHistory2, formattedMessages: formattedMessages2 };
1075
+ return {
1076
+ preparedHistory: preparedHistory2,
1077
+ preparedHistoryStats: preparedHistoryResult.stats,
1078
+ formattedMessages: formattedMessages2
1079
+ };
1069
1080
  },
1070
1081
  this.logger
1071
1082
  ));
@@ -1124,6 +1135,30 @@ class TurnExecutor {
1124
1135
  ...reasoningVariant !== void 0 && { reasoningVariant },
1125
1136
  ...reasoningBudgetTokens !== void 0 && { reasoningBudgetTokens }
1126
1137
  } : void 0;
1138
+ const requestProviderOptions = providerOptions;
1139
+ const requestDiagnostics = (0, import_model_request_diagnostics.createModelRequestDiagnostics)({
1140
+ compacted,
1141
+ estimatedInputTokens,
1142
+ formattedMessages,
1143
+ model: this.llmContext.model,
1144
+ preparedHistoryCount: preparedHistory.length,
1145
+ preparedHistoryStats,
1146
+ provider: this.llmContext.provider,
1147
+ providerOptions: requestProviderOptions,
1148
+ reasoning,
1149
+ streaming: input.streaming,
1150
+ systemPrompt,
1151
+ toolDefinitions
1152
+ });
1153
+ await (0, import_operation_span.recordOperationSpan)(
1154
+ {
1155
+ name: "llm.request_diagnostics",
1156
+ componentName: "TurnExecutor",
1157
+ attributes: (0, import_model_request_diagnostics.modelRequestDiagnosticAttributes)(requestDiagnostics)
1158
+ },
1159
+ () => void 0,
1160
+ this.logger
1161
+ );
1127
1162
  this.logger.info("Model request context prepared", {
1128
1163
  sessionId: this.sessionId,
1129
1164
  provider: this.llmContext.provider,
@@ -1134,6 +1169,7 @@ class TurnExecutor {
1134
1169
  formattedMessageCount: formattedMessages.length,
1135
1170
  preparedHistoryCount: preparedHistory.length,
1136
1171
  compacted,
1172
+ requestDiagnostics,
1137
1173
  ...this.runContext?.hostRuntime?.ids !== void 0 && {
1138
1174
  hostRuntimeIds: this.runContext.hostRuntime.ids
1139
1175
  },
@@ -1145,7 +1181,7 @@ class TurnExecutor {
1145
1181
  toolDefinitions,
1146
1182
  estimatedInputTokens,
1147
1183
  reasoning,
1148
- providerOptions,
1184
+ providerOptions: requestProviderOptions,
1149
1185
  streaming: input.streaming
1150
1186
  };
1151
1187
  }
@@ -1218,11 +1254,11 @@ class TurnExecutor {
1218
1254
  }
1219
1255
  async runModelStepWithRetry(request) {
1220
1256
  for (let failedAttempts = 0; ; failedAttempts += 1) {
1221
- const historyLengthBefore = (await this.contextManager.getHistory()).length;
1257
+ const historyLengthBefore = (await this.contextManager.getModelHistory()).length;
1222
1258
  try {
1223
1259
  return await this.runModelStep(request);
1224
1260
  } catch (error) {
1225
- const historyLengthAfter = (await this.contextManager.getHistory()).length;
1261
+ const historyLengthAfter = (await this.contextManager.getModelHistory()).length;
1226
1262
  const historyLengthChanged = historyLengthAfter !== historyLengthBefore;
1227
1263
  if (!this.canRetryModelRequest(error, historyLengthChanged) || failedAttempts >= MODEL_REQUEST_MAX_RETRIES) {
1228
1264
  throw error;
@@ -1664,7 +1700,7 @@ class TurnExecutor {
1664
1700
  /**
1665
1701
  * Prunes old tool outputs by marking them with compactedAt timestamp.
1666
1702
  * Does NOT modify content - transformation happens at format time in
1667
- * ContextManager.prepareHistory().
1703
+ * ContextManager.prepareModelHistory().
1668
1704
  *
1669
1705
  * Algorithm:
1670
1706
  * 1. Go backwards through history (most recent first)
@@ -1674,7 +1710,7 @@ class TurnExecutor {
1674
1710
  * 5. Only prune if savings exceed PRUNE_MINIMUM
1675
1711
  */
1676
1712
  async pruneOldToolOutputs() {
1677
- const history = await this.contextManager.getHistory();
1713
+ const history = await this.contextManager.getModelHistory();
1678
1714
  let totalToolTokens = 0;
1679
1715
  let prunedTokens = 0;
1680
1716
  const toPrune = [];
@@ -1776,7 +1812,7 @@ class TurnExecutor {
1776
1812
  this.logger.info(
1777
1813
  `Context overflow detected (${originalTokens} tokens), checking if compression is possible`
1778
1814
  );
1779
- const history = await this.contextManager.getHistory();
1815
+ const history = await this.contextManager.getModelHistory();
1780
1816
  const { filterCompacted } = await import("../../context/utils.js");
1781
1817
  const originalFiltered = filterCompacted(history);
1782
1818
  const originalMessages = originalFiltered.length;
@@ -354,7 +354,7 @@ export declare class TurnExecutor {
354
354
  /**
355
355
  * Prunes old tool outputs by marking them with compactedAt timestamp.
356
356
  * Does NOT modify content - transformation happens at format time in
357
- * ContextManager.prepareHistory().
357
+ * ContextManager.prepareModelHistory().
358
358
  *
359
359
  * Algorithm:
360
360
  * 1. Go backwards through history (most recent first)
@@ -1 +1 @@
1
- {"version":3,"file":"turn-executor.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/turn-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turn-executor.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/turn-executor.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,10 @@ import {
21
21
  import { toError } from "../../utils/error-conversion.js";
22
22
  import { isCodexBaseURL } from "../providers/codex-base-url.js";
23
23
  import { createModelToolDefinitions } from "./tool-definitions.js";
24
+ import {
25
+ createModelRequestDiagnostics,
26
+ modelRequestDiagnosticAttributes
27
+ } from "./model-request-diagnostics.js";
24
28
  import { ApprovalStatus } from "../../approval/types.js";
25
29
  import {
26
30
  describeContentPartsForAudit,
@@ -943,7 +947,7 @@ class TurnExecutor {
943
947
  () => this.contextManager.getSystemPrompt(input.contributorContext),
944
948
  this.logger
945
949
  );
946
- let { preparedHistory, formattedMessages } = await recordOperationSpan(
950
+ let { preparedHistory, preparedHistoryStats, formattedMessages } = await recordOperationSpan(
947
951
  {
948
952
  name: "context.build_messages",
949
953
  componentName: "TurnExecutor",
@@ -953,14 +957,19 @@ class TurnExecutor {
953
957
  }
954
958
  },
955
959
  async () => {
956
- const preparedHistory2 = (await this.contextManager.prepareHistory()).preparedHistory;
960
+ const preparedHistoryResult = await this.contextManager.prepareModelHistory();
961
+ const preparedHistory2 = preparedHistoryResult.preparedHistory;
957
962
  const formattedMessages2 = await this.contextManager.getFormattedMessages(
958
963
  input.contributorContext,
959
964
  this.llmContext,
960
965
  systemPrompt,
961
966
  preparedHistory2
962
967
  );
963
- return { preparedHistory: preparedHistory2, formattedMessages: formattedMessages2 };
968
+ return {
969
+ preparedHistory: preparedHistory2,
970
+ preparedHistoryStats: preparedHistoryResult.stats,
971
+ formattedMessages: formattedMessages2
972
+ };
964
973
  },
965
974
  this.logger
966
975
  );
@@ -1024,7 +1033,7 @@ class TurnExecutor {
1024
1033
  () => this.contextManager.getSystemPrompt(input.contributorContext),
1025
1034
  this.logger
1026
1035
  );
1027
- ({ preparedHistory, formattedMessages } = await recordOperationSpan(
1036
+ ({ preparedHistory, preparedHistoryStats, formattedMessages } = await recordOperationSpan(
1028
1037
  {
1029
1038
  name: "context.build_messages",
1030
1039
  componentName: "TurnExecutor",
@@ -1035,14 +1044,19 @@ class TurnExecutor {
1035
1044
  }
1036
1045
  },
1037
1046
  async () => {
1038
- const preparedHistory2 = (await this.contextManager.prepareHistory()).preparedHistory;
1047
+ const preparedHistoryResult = await this.contextManager.prepareModelHistory();
1048
+ const preparedHistory2 = preparedHistoryResult.preparedHistory;
1039
1049
  const formattedMessages2 = await this.contextManager.getFormattedMessages(
1040
1050
  input.contributorContext,
1041
1051
  this.llmContext,
1042
1052
  systemPrompt,
1043
1053
  preparedHistory2
1044
1054
  );
1045
- return { preparedHistory: preparedHistory2, formattedMessages: formattedMessages2 };
1055
+ return {
1056
+ preparedHistory: preparedHistory2,
1057
+ preparedHistoryStats: preparedHistoryResult.stats,
1058
+ formattedMessages: formattedMessages2
1059
+ };
1046
1060
  },
1047
1061
  this.logger
1048
1062
  ));
@@ -1101,6 +1115,30 @@ class TurnExecutor {
1101
1115
  ...reasoningVariant !== void 0 && { reasoningVariant },
1102
1116
  ...reasoningBudgetTokens !== void 0 && { reasoningBudgetTokens }
1103
1117
  } : void 0;
1118
+ const requestProviderOptions = providerOptions;
1119
+ const requestDiagnostics = createModelRequestDiagnostics({
1120
+ compacted,
1121
+ estimatedInputTokens,
1122
+ formattedMessages,
1123
+ model: this.llmContext.model,
1124
+ preparedHistoryCount: preparedHistory.length,
1125
+ preparedHistoryStats,
1126
+ provider: this.llmContext.provider,
1127
+ providerOptions: requestProviderOptions,
1128
+ reasoning,
1129
+ streaming: input.streaming,
1130
+ systemPrompt,
1131
+ toolDefinitions
1132
+ });
1133
+ await recordOperationSpan(
1134
+ {
1135
+ name: "llm.request_diagnostics",
1136
+ componentName: "TurnExecutor",
1137
+ attributes: modelRequestDiagnosticAttributes(requestDiagnostics)
1138
+ },
1139
+ () => void 0,
1140
+ this.logger
1141
+ );
1104
1142
  this.logger.info("Model request context prepared", {
1105
1143
  sessionId: this.sessionId,
1106
1144
  provider: this.llmContext.provider,
@@ -1111,6 +1149,7 @@ class TurnExecutor {
1111
1149
  formattedMessageCount: formattedMessages.length,
1112
1150
  preparedHistoryCount: preparedHistory.length,
1113
1151
  compacted,
1152
+ requestDiagnostics,
1114
1153
  ...this.runContext?.hostRuntime?.ids !== void 0 && {
1115
1154
  hostRuntimeIds: this.runContext.hostRuntime.ids
1116
1155
  },
@@ -1122,7 +1161,7 @@ class TurnExecutor {
1122
1161
  toolDefinitions,
1123
1162
  estimatedInputTokens,
1124
1163
  reasoning,
1125
- providerOptions,
1164
+ providerOptions: requestProviderOptions,
1126
1165
  streaming: input.streaming
1127
1166
  };
1128
1167
  }
@@ -1195,11 +1234,11 @@ class TurnExecutor {
1195
1234
  }
1196
1235
  async runModelStepWithRetry(request) {
1197
1236
  for (let failedAttempts = 0; ; failedAttempts += 1) {
1198
- const historyLengthBefore = (await this.contextManager.getHistory()).length;
1237
+ const historyLengthBefore = (await this.contextManager.getModelHistory()).length;
1199
1238
  try {
1200
1239
  return await this.runModelStep(request);
1201
1240
  } catch (error) {
1202
- const historyLengthAfter = (await this.contextManager.getHistory()).length;
1241
+ const historyLengthAfter = (await this.contextManager.getModelHistory()).length;
1203
1242
  const historyLengthChanged = historyLengthAfter !== historyLengthBefore;
1204
1243
  if (!this.canRetryModelRequest(error, historyLengthChanged) || failedAttempts >= MODEL_REQUEST_MAX_RETRIES) {
1205
1244
  throw error;
@@ -1641,7 +1680,7 @@ class TurnExecutor {
1641
1680
  /**
1642
1681
  * Prunes old tool outputs by marking them with compactedAt timestamp.
1643
1682
  * Does NOT modify content - transformation happens at format time in
1644
- * ContextManager.prepareHistory().
1683
+ * ContextManager.prepareModelHistory().
1645
1684
  *
1646
1685
  * Algorithm:
1647
1686
  * 1. Go backwards through history (most recent first)
@@ -1651,7 +1690,7 @@ class TurnExecutor {
1651
1690
  * 5. Only prune if savings exceed PRUNE_MINIMUM
1652
1691
  */
1653
1692
  async pruneOldToolOutputs() {
1654
- const history = await this.contextManager.getHistory();
1693
+ const history = await this.contextManager.getModelHistory();
1655
1694
  let totalToolTokens = 0;
1656
1695
  let prunedTokens = 0;
1657
1696
  const toPrune = [];
@@ -1753,7 +1792,7 @@ class TurnExecutor {
1753
1792
  this.logger.info(
1754
1793
  `Context overflow detected (${originalTokens} tokens), checking if compression is possible`
1755
1794
  );
1756
- const history = await this.contextManager.getHistory();
1795
+ const history = await this.contextManager.getModelHistory();
1757
1796
  const { filterCompacted } = await import("../../context/utils.js");
1758
1797
  const originalFiltered = filterCompacted(history);
1759
1798
  const originalMessages = originalFiltered.length;
@@ -22,6 +22,7 @@ __export(database_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(database_exports);
24
24
  var import_content_clone = require("../../context/content-clone.js");
25
+ var import_utils = require("../../context/utils.js");
25
26
  var import_types = require("../../logger/v2/types.js");
26
27
  var import_errors = require("../errors.js");
27
28
  class DatabaseConversationStore {
@@ -37,6 +38,20 @@ class DatabaseConversationStore {
37
38
  const state = await this.loadState(input.sessionId);
38
39
  return (0, import_content_clone.cloneInternalMessages)(state.cache ?? []);
39
40
  }
41
+ async loadModelHistory(input) {
42
+ const fullHistory = await this.listMessages(input);
43
+ const messages = (0, import_utils.filterCompacted)(fullHistory);
44
+ const firstMessage = messages[0];
45
+ const summaryMessageId = firstMessage?.metadata?.isSummary === true || firstMessage?.metadata?.isSessionSummary === true ? firstMessage.id ?? null : null;
46
+ return {
47
+ messages,
48
+ stats: {
49
+ returnedMessages: messages.length,
50
+ skippedPreSummaryMessages: fullHistory.length - messages.length,
51
+ summaryMessageId
52
+ }
53
+ };
54
+ }
40
55
  async saveMessage(input) {
41
56
  const state = await this.loadState(input.sessionId);
42
57
  const cache = state.cache ?? [];
@@ -1,7 +1,7 @@
1
1
  import type { InternalMessage } from '../../context/types.js';
2
2
  import type { Logger } from '../../logger/v2/types.js';
3
3
  import type { Database } from '../database/types.js';
4
- import type { ConversationStore } from './types.js';
4
+ import type { ConversationStore, ModelHistoryLoad } from './types.js';
5
5
  export declare class DatabaseConversationStore implements ConversationStore {
6
6
  private readonly database;
7
7
  private readonly logger;
@@ -12,6 +12,9 @@ export declare class DatabaseConversationStore implements ConversationStore {
12
12
  listMessages(input: {
13
13
  sessionId: string;
14
14
  }): Promise<InternalMessage[]>;
15
+ loadModelHistory(input: {
16
+ sessionId: string;
17
+ }): Promise<ModelHistoryLoad>;
15
18
  saveMessage(input: {
16
19
  sessionId: string;
17
20
  message: InternalMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/storage/conversation/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD,qBAAa,yBAA0B,YAAW,iBAAiB;IAQ3D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;IAEtE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGtB,QAAQ,EAAE,QAAQ,EACnC,MAAM,EAAE,MAAM;IAKZ,YAAY,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAKtE,WAAW,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1D,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAoB1C,SAAS;IA4BvB,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,cAAc;YA6BR,UAAU;IAuBxB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;CAGvB"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/storage/conversation/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAStE,qBAAa,yBAA0B,YAAW,iBAAiB;IAQ3D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;IAEtE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGtB,QAAQ,EAAE,QAAQ,EACnC,MAAM,EAAE,MAAM;IAKZ,YAAY,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAKtE,gBAAgB,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmBzE,WAAW,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1D,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAoB1C,SAAS;IA4BvB,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,cAAc;YA6BR,UAAU;IAuBxB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;CAGvB"}
@@ -1,5 +1,6 @@
1
1
  import "../../chunk-C6A6W6XS.js";
2
2
  import { cloneInternalMessage, cloneInternalMessages } from "../../context/content-clone.js";
3
+ import { filterCompacted } from "../../context/utils.js";
3
4
  import { DextoLogComponent } from "../../logger/v2/types.js";
4
5
  import { StorageError } from "../errors.js";
5
6
  class DatabaseConversationStore {
@@ -15,6 +16,20 @@ class DatabaseConversationStore {
15
16
  const state = await this.loadState(input.sessionId);
16
17
  return cloneInternalMessages(state.cache ?? []);
17
18
  }
19
+ async loadModelHistory(input) {
20
+ const fullHistory = await this.listMessages(input);
21
+ const messages = filterCompacted(fullHistory);
22
+ const firstMessage = messages[0];
23
+ const summaryMessageId = firstMessage?.metadata?.isSummary === true || firstMessage?.metadata?.isSessionSummary === true ? firstMessage.id ?? null : null;
24
+ return {
25
+ messages,
26
+ stats: {
27
+ returnedMessages: messages.length,
28
+ skippedPreSummaryMessages: fullHistory.length - messages.length,
29
+ summaryMessageId
30
+ }
31
+ };
32
+ }
18
33
  async saveMessage(input) {
19
34
  const state = await this.loadState(input.sessionId);
20
35
  const cache = state.cache ?? [];
@@ -1,8 +1,20 @@
1
1
  import type { InternalMessage } from '../../context/types.js';
2
+ export type ModelHistoryLoadStats = {
3
+ returnedMessages: number;
4
+ skippedPreSummaryMessages: number;
5
+ summaryMessageId: string | null;
6
+ };
7
+ export type ModelHistoryLoad = {
8
+ messages: InternalMessage[];
9
+ stats: ModelHistoryLoadStats;
10
+ };
2
11
  export interface ConversationStore {
3
12
  listMessages(input: {
4
13
  sessionId: string;
5
14
  }): Promise<InternalMessage[]>;
15
+ loadModelHistory(input: {
16
+ sessionId: string;
17
+ }): Promise<ModelHistoryLoad>;
6
18
  saveMessage(input: {
7
19
  sessionId: string;
8
20
  message: InternalMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAC9B,YAAY,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACvE,WAAW,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,qBAAqB,GAAG;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,MAAM,CAAC;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,qBAAqB,CAAC;CAChC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAC9B,YAAY,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACvE,gBAAgB,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1E,WAAW,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD"}
@@ -14,7 +14,7 @@ export { BackendDextoStores, DatabaseBackedApprovalStore, DatabaseBackedArtifact
14
14
  export type { DextoStoresLifecycle } from './stores/backend.js';
15
15
  export type { DextoStoreMap, DextoStoreName, DextoStores } from './stores/types.js';
16
16
  export { DatabaseConversationStore } from './conversation/database.js';
17
- export type { ConversationStore } from './conversation/types.js';
17
+ export type { ConversationStore, ModelHistoryLoad, ModelHistoryLoadStats, } from './conversation/types.js';
18
18
  export type { SessionStore } from './sessions/types.js';
19
19
  export type { MemoryStore } from './memories/types.js';
20
20
  export type { WorkspaceStore } from './workspaces/types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACR,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,SAAS,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACH,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,EACzB,+BAA+B,EAC/B,sCAAsC,EACtC,0BAA0B,EAC1B,gCAAgC,EAChC,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,kCAAkC,EAClC,8BAA8B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvF,YAAY,EACR,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,GACrB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACR,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,SAAS,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACH,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,EACzB,+BAA+B,EAC/B,sCAAsC,EACtC,0BAA0B,EAC1B,gCAAgC,EAChC,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,kCAAkC,EAClC,8BAA8B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,YAAY,EACR,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvF,YAAY,EACR,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,GACrB,MAAM,4BAA4B,CAAC"}
@@ -23,6 +23,7 @@ __export(in_memory_exports, {
23
23
  module.exports = __toCommonJS(in_memory_exports);
24
24
  var import_crypto = require("crypto");
25
25
  var import_content_clone = require("../../context/content-clone.js");
26
+ var import_utils = require("../../context/utils.js");
26
27
  var import_queue_clone = require("../../session/queue-clone.js");
27
28
  var import_types = require("../tool-executions/types.js");
28
29
  var import_errors = require("../errors.js");
@@ -39,6 +40,20 @@ class InMemoryConversationStore {
39
40
  async listMessages(input) {
40
41
  return (0, import_content_clone.cloneInternalMessages)(this.messages.get(input.sessionId) ?? []);
41
42
  }
43
+ async loadModelHistory(input) {
44
+ const fullHistory = await this.listMessages(input);
45
+ const messages = (0, import_utils.filterCompacted)(fullHistory);
46
+ const firstMessage = messages[0];
47
+ const summaryMessageId = firstMessage?.metadata?.isSummary === true || firstMessage?.metadata?.isSessionSummary === true ? firstMessage.id ?? null : null;
48
+ return {
49
+ messages,
50
+ stats: {
51
+ returnedMessages: messages.length,
52
+ skippedPreSummaryMessages: fullHistory.length - messages.length,
53
+ summaryMessageId
54
+ }
55
+ };
56
+ }
42
57
  async saveMessage(input) {
43
58
  const messages = this.messages.get(input.sessionId) ?? [];
44
59
  if (input.message.id && messages.some((message) => message.id === input.message.id)) {
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../../src/storage/stores/in-memory.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2lB7E,qBAAa,mBAAoB,YAAW,WAAW;IACnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAcrB;IAEF,QAAQ,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAIvD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,MAAM;CAGzB"}
1
+ {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../../src/storage/stores/in-memory.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA8mB7E,qBAAa,mBAAoB,YAAW,WAAW;IACnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAcrB;IAEF,QAAQ,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAIvD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,MAAM;CAGzB"}
@@ -1,6 +1,7 @@
1
1
  import "../../chunk-C6A6W6XS.js";
2
2
  import { createHash, randomUUID } from "crypto";
3
3
  import { cloneInternalMessage, cloneInternalMessages } from "../../context/content-clone.js";
4
+ import { filterCompacted } from "../../context/utils.js";
4
5
  import { cloneQueuedMessage, cloneQueuedMessages } from "../../session/queue-clone.js";
5
6
  import { splitToolExecutionResult } from "../tool-executions/types.js";
6
7
  import { StorageError } from "../errors.js";
@@ -17,6 +18,20 @@ class InMemoryConversationStore {
17
18
  async listMessages(input) {
18
19
  return cloneInternalMessages(this.messages.get(input.sessionId) ?? []);
19
20
  }
21
+ async loadModelHistory(input) {
22
+ const fullHistory = await this.listMessages(input);
23
+ const messages = filterCompacted(fullHistory);
24
+ const firstMessage = messages[0];
25
+ const summaryMessageId = firstMessage?.metadata?.isSummary === true || firstMessage?.metadata?.isSessionSummary === true ? firstMessage.id ?? null : null;
26
+ return {
27
+ messages,
28
+ stats: {
29
+ returnedMessages: messages.length,
30
+ skippedPreSummaryMessages: fullHistory.length - messages.length,
31
+ summaryMessageId
32
+ }
33
+ };
34
+ }
20
35
  async saveMessage(input) {
21
36
  const messages = this.messages.get(input.sessionId) ?? [];
22
37
  if (input.message.id && messages.some((message) => message.id === input.message.id)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dexto/core",
3
- "version": "1.9.2",
3
+ "version": "1.9.4",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -162,7 +162,7 @@
162
162
  "nanoid": "^5.1.6",
163
163
  "winston": "^3.17.0",
164
164
  "yaml": "^2.8.3",
165
- "@dexto/llm": "1.9.2"
165
+ "@dexto/llm": "1.9.4"
166
166
  },
167
167
  "devDependencies": {
168
168
  "@opentelemetry/context-async-hooks": "^1.28.0",