@dexto/core 1.5.1 → 1.5.3

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 (75) hide show
  1. package/dist/agent/DextoAgent.cjs +12 -1
  2. package/dist/agent/DextoAgent.d.ts.map +1 -1
  3. package/dist/agent/DextoAgent.js +12 -1
  4. package/dist/agent/schemas.d.ts +54 -12
  5. package/dist/agent/schemas.d.ts.map +1 -1
  6. package/dist/approval/manager.cjs +16 -0
  7. package/dist/approval/manager.d.ts +10 -0
  8. package/dist/approval/manager.d.ts.map +1 -1
  9. package/dist/approval/manager.js +16 -0
  10. package/dist/approval/types.d.ts +11 -0
  11. package/dist/approval/types.d.ts.map +1 -1
  12. package/dist/context/manager.cjs +4 -0
  13. package/dist/context/manager.d.ts.map +1 -1
  14. package/dist/context/manager.js +4 -0
  15. package/dist/context/types.d.ts +5 -0
  16. package/dist/context/types.d.ts.map +1 -1
  17. package/dist/events/index.cjs +3 -1
  18. package/dist/events/index.d.ts +19 -2
  19. package/dist/events/index.d.ts.map +1 -1
  20. package/dist/events/index.js +3 -1
  21. package/dist/filesystem/filesystem-service.cjs +18 -15
  22. package/dist/filesystem/filesystem-service.d.ts +3 -3
  23. package/dist/filesystem/filesystem-service.d.ts.map +1 -1
  24. package/dist/filesystem/filesystem-service.js +18 -15
  25. package/dist/filesystem/path-validator.cjs +16 -7
  26. package/dist/filesystem/path-validator.d.ts +10 -3
  27. package/dist/filesystem/path-validator.d.ts.map +1 -1
  28. package/dist/filesystem/path-validator.js +16 -7
  29. package/dist/filesystem/types.d.ts +4 -0
  30. package/dist/filesystem/types.d.ts.map +1 -1
  31. package/dist/llm/executor/turn-executor.cjs +2 -1
  32. package/dist/llm/executor/turn-executor.d.ts +1 -1
  33. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  34. package/dist/llm/executor/turn-executor.js +2 -1
  35. package/dist/llm/registry.cjs +1 -1
  36. package/dist/llm/registry.d.ts +1 -1
  37. package/dist/llm/registry.d.ts.map +1 -1
  38. package/dist/llm/registry.js +1 -1
  39. package/dist/llm/schemas.cjs +1 -1
  40. package/dist/llm/schemas.d.ts +11 -11
  41. package/dist/llm/schemas.js +1 -1
  42. package/dist/logger/v2/schemas.cjs +4 -0
  43. package/dist/logger/v2/schemas.d.ts +16 -0
  44. package/dist/logger/v2/schemas.d.ts.map +1 -1
  45. package/dist/logger/v2/schemas.js +4 -0
  46. package/dist/logger/v2/transport-factory.cjs +4 -1
  47. package/dist/logger/v2/transport-factory.d.ts.map +1 -1
  48. package/dist/logger/v2/transport-factory.js +4 -1
  49. package/dist/logger/v2/transports/silent-transport.cjs +33 -0
  50. package/dist/logger/v2/transports/silent-transport.d.ts +15 -0
  51. package/dist/logger/v2/transports/silent-transport.d.ts.map +1 -0
  52. package/dist/logger/v2/transports/silent-transport.js +10 -0
  53. package/dist/tools/error-codes.cjs +1 -0
  54. package/dist/tools/error-codes.d.ts +1 -0
  55. package/dist/tools/error-codes.d.ts.map +1 -1
  56. package/dist/tools/error-codes.js +1 -0
  57. package/dist/tools/errors.cjs +17 -0
  58. package/dist/tools/errors.d.ts +9 -0
  59. package/dist/tools/errors.d.ts.map +1 -1
  60. package/dist/tools/errors.js +17 -0
  61. package/dist/tools/internal-tools/provider.cjs +3 -2
  62. package/dist/tools/internal-tools/provider.d.ts +1 -1
  63. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  64. package/dist/tools/internal-tools/provider.js +3 -2
  65. package/dist/tools/tool-manager.cjs +78 -5
  66. package/dist/tools/tool-manager.d.ts +18 -0
  67. package/dist/tools/tool-manager.d.ts.map +1 -1
  68. package/dist/tools/tool-manager.js +79 -6
  69. package/dist/tools/types.d.ts +5 -3
  70. package/dist/tools/types.d.ts.map +1 -1
  71. package/dist/utils/safe-stringify.cjs +10 -6
  72. package/dist/utils/safe-stringify.d.ts +5 -2
  73. package/dist/utils/safe-stringify.d.ts.map +1 -1
  74. package/dist/utils/safe-stringify.js +10 -6
  75. package/package.json +1 -1
@@ -212,6 +212,75 @@ let _ToolManager = class _ToolManager {
212
212
  suggestedPatterns: (0, import_bash_pattern_utils.generateBashPatternSuggestions)(command)
213
213
  };
214
214
  }
215
+ /**
216
+ * Auto-approve pending tool confirmation requests for the same tool.
217
+ * Called after a user selects "remember choice" for a tool.
218
+ * This handles the case where parallel tool calls come in before the first one is approved.
219
+ *
220
+ * @param toolName The tool name that was just remembered
221
+ * @param sessionId The session ID for which the tool was allowed
222
+ */
223
+ autoApprovePendingToolRequests(toolName, sessionId) {
224
+ const count = this.approvalManager.autoApprovePendingRequests(
225
+ (request) => {
226
+ if (request.type !== import_types3.ApprovalType.TOOL_CONFIRMATION) {
227
+ return false;
228
+ }
229
+ if (request.sessionId !== sessionId) {
230
+ return false;
231
+ }
232
+ const metadata = request.metadata;
233
+ return metadata.toolName === toolName;
234
+ },
235
+ { rememberChoice: false }
236
+ // Don't propagate remember choice to auto-approved requests
237
+ );
238
+ if (count > 0) {
239
+ this.logger.info(
240
+ `Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember choice"`
241
+ );
242
+ }
243
+ }
244
+ /**
245
+ * Auto-approve pending bash command requests that match a pattern.
246
+ * Called after a user selects "remember pattern" for a bash command.
247
+ * This handles the case where parallel bash commands come in before the first one is approved.
248
+ *
249
+ * @param pattern The bash pattern that was just remembered
250
+ * @param sessionId The session ID for context
251
+ */
252
+ autoApprovePendingBashRequests(pattern, sessionId) {
253
+ const count = this.approvalManager.autoApprovePendingRequests(
254
+ (request) => {
255
+ if (request.type !== import_types3.ApprovalType.TOOL_CONFIRMATION) {
256
+ return false;
257
+ }
258
+ if (request.sessionId !== sessionId) {
259
+ return false;
260
+ }
261
+ const metadata = request.metadata;
262
+ if (!this.isBashTool(metadata.toolName)) {
263
+ return false;
264
+ }
265
+ const command = metadata.args?.command;
266
+ if (!command) {
267
+ return false;
268
+ }
269
+ const patternKey = (0, import_bash_pattern_utils.generateBashPatternKey)(command);
270
+ if (!patternKey) {
271
+ return false;
272
+ }
273
+ return this.approvalManager.matchesBashPattern(patternKey);
274
+ },
275
+ { rememberPattern: void 0 }
276
+ // Don't propagate pattern to auto-approved requests
277
+ );
278
+ if (count > 0) {
279
+ this.logger.info(
280
+ `Auto-approved ${count} parallel bash command(s) matching pattern '${pattern}'`
281
+ );
282
+ }
283
+ }
215
284
  getMcpManager() {
216
285
  return this.mcpManager;
217
286
  }
@@ -393,7 +462,8 @@ let _ToolManager = class _ToolManager {
393
462
  actualToolName,
394
463
  args,
395
464
  sessionId,
396
- abortSignal
465
+ abortSignal,
466
+ toolCallId
397
467
  );
398
468
  } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
399
469
  this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
@@ -409,7 +479,8 @@ let _ToolManager = class _ToolManager {
409
479
  actualToolName,
410
480
  args,
411
481
  sessionId,
412
- abortSignal
482
+ abortSignal,
483
+ toolCallId
413
484
  );
414
485
  } else {
415
486
  this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
@@ -627,7 +698,7 @@ let _ToolManager = class _ToolManager {
627
698
  if (!tool?.getApprovalOverride) {
628
699
  return { handled: false };
629
700
  }
630
- const approvalRequest = tool.getApprovalOverride(args);
701
+ const approvalRequest = await tool.getApprovalOverride(args);
631
702
  if (!approvalRequest) {
632
703
  return { handled: false };
633
704
  }
@@ -724,11 +795,11 @@ let _ToolManager = class _ToolManager {
724
795
  );
725
796
  try {
726
797
  let displayPreview;
727
- const actualToolName = toolName.replace(/^internal--/, "");
798
+ const actualToolName = toolName.replace(/^internal--/, "").replace(/^custom--/, "");
728
799
  const internalTool = this.internalToolsProvider?.getTool(actualToolName);
729
800
  if (internalTool?.generatePreview) {
730
801
  try {
731
- const context = { sessionId };
802
+ const context = { sessionId, toolCallId };
732
803
  const preview = await internalTool.generatePreview(args, context);
733
804
  displayPreview = preview ?? void 0;
734
805
  this.logger.debug(`Generated preview for ${toolName}`);
@@ -768,11 +839,13 @@ let _ToolManager = class _ToolManager {
768
839
  this.logger.info(
769
840
  `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
770
841
  );
842
+ this.autoApprovePendingToolRequests(toolName, allowSessionId);
771
843
  } else if (rememberPattern && typeof rememberPattern === "string" && this.isBashTool(toolName)) {
772
844
  this.approvalManager.addBashPattern(rememberPattern);
773
845
  this.logger.info(
774
846
  `Bash pattern '${rememberPattern}' added for session approval`
775
847
  );
848
+ this.autoApprovePendingBashRequests(rememberPattern, sessionId);
776
849
  }
777
850
  }
778
851
  const approved = response.status === import_types3.ApprovalStatus.APPROVED;
@@ -93,6 +93,24 @@ export declare class ToolManager {
93
93
  * Returns approval info if covered, or pattern suggestions if not.
94
94
  */
95
95
  private checkBashPatternApproval;
96
+ /**
97
+ * Auto-approve pending tool confirmation requests for the same tool.
98
+ * Called after a user selects "remember choice" for a tool.
99
+ * This handles the case where parallel tool calls come in before the first one is approved.
100
+ *
101
+ * @param toolName The tool name that was just remembered
102
+ * @param sessionId The session ID for which the tool was allowed
103
+ */
104
+ private autoApprovePendingToolRequests;
105
+ /**
106
+ * Auto-approve pending bash command requests that match a pattern.
107
+ * Called after a user selects "remember pattern" for a bash command.
108
+ * This handles the case where parallel bash commands come in before the first one is approved.
109
+ *
110
+ * @param pattern The bash pattern that was just remembered
111
+ * @param sessionId The session ID for context
112
+ */
113
+ private autoApprovePendingBashRequests;
96
114
  getMcpManager(): MCPManager;
97
115
  /**
98
116
  * Get all MCP tools (delegates to mcpManager.getAllTools())
@@ -1 +1 @@
1
- {"version":3,"file":"tool-manager.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-manager.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manager.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { ToolError } from "./errors.js";
9
9
  import { ToolErrorCode } from "./error-codes.js";
10
10
  import { DextoRuntimeError } from "../errors/index.js";
11
11
  import { DextoLogComponent } from "../logger/v2/types.js";
12
- import { ApprovalStatus } from "../approval/types.js";
12
+ import { ApprovalStatus, ApprovalType } from "../approval/types.js";
13
13
  import { InstrumentClass } from "../telemetry/decorators.js";
14
14
  import {
15
15
  generateBashPatternKey,
@@ -153,6 +153,75 @@ let _ToolManager = class _ToolManager {
153
153
  suggestedPatterns: generateBashPatternSuggestions(command)
154
154
  };
155
155
  }
156
+ /**
157
+ * Auto-approve pending tool confirmation requests for the same tool.
158
+ * Called after a user selects "remember choice" for a tool.
159
+ * This handles the case where parallel tool calls come in before the first one is approved.
160
+ *
161
+ * @param toolName The tool name that was just remembered
162
+ * @param sessionId The session ID for which the tool was allowed
163
+ */
164
+ autoApprovePendingToolRequests(toolName, sessionId) {
165
+ const count = this.approvalManager.autoApprovePendingRequests(
166
+ (request) => {
167
+ if (request.type !== ApprovalType.TOOL_CONFIRMATION) {
168
+ return false;
169
+ }
170
+ if (request.sessionId !== sessionId) {
171
+ return false;
172
+ }
173
+ const metadata = request.metadata;
174
+ return metadata.toolName === toolName;
175
+ },
176
+ { rememberChoice: false }
177
+ // Don't propagate remember choice to auto-approved requests
178
+ );
179
+ if (count > 0) {
180
+ this.logger.info(
181
+ `Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember choice"`
182
+ );
183
+ }
184
+ }
185
+ /**
186
+ * Auto-approve pending bash command requests that match a pattern.
187
+ * Called after a user selects "remember pattern" for a bash command.
188
+ * This handles the case where parallel bash commands come in before the first one is approved.
189
+ *
190
+ * @param pattern The bash pattern that was just remembered
191
+ * @param sessionId The session ID for context
192
+ */
193
+ autoApprovePendingBashRequests(pattern, sessionId) {
194
+ const count = this.approvalManager.autoApprovePendingRequests(
195
+ (request) => {
196
+ if (request.type !== ApprovalType.TOOL_CONFIRMATION) {
197
+ return false;
198
+ }
199
+ if (request.sessionId !== sessionId) {
200
+ return false;
201
+ }
202
+ const metadata = request.metadata;
203
+ if (!this.isBashTool(metadata.toolName)) {
204
+ return false;
205
+ }
206
+ const command = metadata.args?.command;
207
+ if (!command) {
208
+ return false;
209
+ }
210
+ const patternKey = generateBashPatternKey(command);
211
+ if (!patternKey) {
212
+ return false;
213
+ }
214
+ return this.approvalManager.matchesBashPattern(patternKey);
215
+ },
216
+ { rememberPattern: void 0 }
217
+ // Don't propagate pattern to auto-approved requests
218
+ );
219
+ if (count > 0) {
220
+ this.logger.info(
221
+ `Auto-approved ${count} parallel bash command(s) matching pattern '${pattern}'`
222
+ );
223
+ }
224
+ }
156
225
  getMcpManager() {
157
226
  return this.mcpManager;
158
227
  }
@@ -334,7 +403,8 @@ let _ToolManager = class _ToolManager {
334
403
  actualToolName,
335
404
  args,
336
405
  sessionId,
337
- abortSignal
406
+ abortSignal,
407
+ toolCallId
338
408
  );
339
409
  } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
340
410
  this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
@@ -350,7 +420,8 @@ let _ToolManager = class _ToolManager {
350
420
  actualToolName,
351
421
  args,
352
422
  sessionId,
353
- abortSignal
423
+ abortSignal,
424
+ toolCallId
354
425
  );
355
426
  } else {
356
427
  this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
@@ -568,7 +639,7 @@ let _ToolManager = class _ToolManager {
568
639
  if (!tool?.getApprovalOverride) {
569
640
  return { handled: false };
570
641
  }
571
- const approvalRequest = tool.getApprovalOverride(args);
642
+ const approvalRequest = await tool.getApprovalOverride(args);
572
643
  if (!approvalRequest) {
573
644
  return { handled: false };
574
645
  }
@@ -665,11 +736,11 @@ let _ToolManager = class _ToolManager {
665
736
  );
666
737
  try {
667
738
  let displayPreview;
668
- const actualToolName = toolName.replace(/^internal--/, "");
739
+ const actualToolName = toolName.replace(/^internal--/, "").replace(/^custom--/, "");
669
740
  const internalTool = this.internalToolsProvider?.getTool(actualToolName);
670
741
  if (internalTool?.generatePreview) {
671
742
  try {
672
- const context = { sessionId };
743
+ const context = { sessionId, toolCallId };
673
744
  const preview = await internalTool.generatePreview(args, context);
674
745
  displayPreview = preview ?? void 0;
675
746
  this.logger.debug(`Generated preview for ${toolName}`);
@@ -709,11 +780,13 @@ let _ToolManager = class _ToolManager {
709
780
  this.logger.info(
710
781
  `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
711
782
  );
783
+ this.autoApprovePendingToolRequests(toolName, allowSessionId);
712
784
  } else if (rememberPattern && typeof rememberPattern === "string" && this.isBashTool(toolName)) {
713
785
  this.approvalManager.addBashPattern(rememberPattern);
714
786
  this.logger.info(
715
787
  `Bash pattern '${rememberPattern}' added for session approval`
716
788
  );
789
+ this.autoApprovePendingBashRequests(rememberPattern, sessionId);
717
790
  }
718
791
  }
719
792
  const approved = response.status === ApprovalStatus.APPROVED;
@@ -10,6 +10,8 @@ export interface ToolExecutionContext {
10
10
  sessionId?: string | undefined;
11
11
  /** Abort signal for cancellation support */
12
12
  abortSignal?: AbortSignal | undefined;
13
+ /** Unique tool call ID for tracking parallel tool calls */
14
+ toolCallId?: string | undefined;
13
15
  }
14
16
  /**
15
17
  * Result of tool execution, including approval metadata
@@ -52,9 +54,9 @@ export interface InternalTool {
52
54
  * @example
53
55
  * ```typescript
54
56
  * // File tool requesting directory access approval for external paths
55
- * getApprovalOverride: (args) => {
57
+ * getApprovalOverride: async (args) => {
56
58
  * const filePath = (args as {file_path: string}).file_path;
57
- * if (!isPathWithinAllowed(filePath)) {
59
+ * if (!await isPathWithinAllowed(filePath)) {
58
60
  * return {
59
61
  * type: ApprovalType.DIRECTORY_ACCESS,
60
62
  * metadata: { path: filePath, operation: 'read', ... }
@@ -64,7 +66,7 @@ export interface InternalTool {
64
66
  * }
65
67
  * ```
66
68
  */
67
- getApprovalOverride?: (args: unknown) => ApprovalRequestDetails | null;
69
+ getApprovalOverride?: (args: unknown) => Promise<ApprovalRequestDetails | null> | ApprovalRequestDetails | null;
68
70
  /**
69
71
  * Optional callback invoked when custom approval is granted.
70
72
  * Allows tools to handle approval responses (e.g., remember approved directories).
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,iDAAiD;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oEAAoE;IACpE,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAC5C;AAMD;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IAEX,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,WAAW,EAAE,SAAS,CAAC;IAEvB,8FAA8F;IAC9F,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAExF;;;;OAIG;IACH,eAAe,CAAC,EAAE,CACd,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,oBAAoB,KAC7B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAErC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,GAAG,IAAI,CAAC;IAEvE;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,WAAW,CAAC;KAC3B,CAAC;CACL;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACtC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,iDAAiD;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oEAAoE;IACpE,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAC5C;AAMD;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IAEX,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,WAAW,EAAE,SAAS,CAAC;IAEvB,8FAA8F;IAC9F,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAExF;;;;OAIG;IACH,eAAe,CAAC,EAAE,CACd,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,oBAAoB,KAC7B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAErC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,mBAAmB,CAAC,EAAE,CAClB,IAAI,EAAE,OAAO,KACZ,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,sBAAsB,GAAG,IAAI,CAAC;IAE5E;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,WAAW,CAAC;KAC3B,CAAC;CACL;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/E"}
@@ -22,7 +22,7 @@ __export(safe_stringify_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(safe_stringify_exports);
24
24
  var import_redactor = require("./redactor.js");
25
- function safeStringify(value, maxLen = 1e3) {
25
+ function safeStringify(value, maxLen) {
26
26
  try {
27
27
  if (typeof value === "bigint") {
28
28
  return value.toString();
@@ -35,12 +35,16 @@ function safeStringify(value, maxLen = 1e3) {
35
35
  if (typeof v === "bigint") return v.toString();
36
36
  return v;
37
37
  });
38
- const indicator = "\u2026(truncated)";
39
- const limit = Number.isFinite(maxLen) && maxLen > 0 ? Math.floor(maxLen) : 1e3;
40
38
  if (typeof str === "string") {
41
- if (str.length <= limit) return str;
42
- const sliceLen = Math.max(0, limit - indicator.length);
43
- return `${str.slice(0, sliceLen)}${indicator}`;
39
+ if (maxLen !== void 0 && maxLen > 0 && str.length > maxLen) {
40
+ const indicator = "\u2026(truncated)";
41
+ if (maxLen <= indicator.length) {
42
+ return str.slice(0, maxLen);
43
+ }
44
+ const sliceLen = maxLen - indicator.length;
45
+ return `${str.slice(0, sliceLen)}${indicator}`;
46
+ }
47
+ return str;
44
48
  }
45
49
  return String(value);
46
50
  } catch {
@@ -1,6 +1,9 @@
1
1
  /**
2
- * Safe stringify that handles circular references, BigInt, and limits output size
3
- * Also redacts sensitive data to prevent PII leaks in error messages
2
+ * Safe stringify that handles circular references and BigInt.
3
+ * Also redacts sensitive data to prevent PII leaks.
4
+ *
5
+ * @param value - Value to stringify
6
+ * @param maxLen - Optional maximum length. If provided, truncates with '…(truncated)' suffix.
4
7
  */
5
8
  export declare function safeStringify(value: unknown, maxLen?: number): string;
6
9
  //# sourceMappingURL=safe-stringify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safe-stringify.d.ts","sourceRoot":"","sources":["../../src/utils/safe-stringify.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAO,GAAG,MAAM,CA8BnE"}
1
+ {"version":3,"file":"safe-stringify.d.ts","sourceRoot":"","sources":["../../src/utils/safe-stringify.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAmCrE"}
@@ -1,6 +1,6 @@
1
1
  import "../chunk-PTJYTZNU.js";
2
2
  import { redactSensitiveData } from "./redactor.js";
3
- function safeStringify(value, maxLen = 1e3) {
3
+ function safeStringify(value, maxLen) {
4
4
  try {
5
5
  if (typeof value === "bigint") {
6
6
  return value.toString();
@@ -13,12 +13,16 @@ function safeStringify(value, maxLen = 1e3) {
13
13
  if (typeof v === "bigint") return v.toString();
14
14
  return v;
15
15
  });
16
- const indicator = "\u2026(truncated)";
17
- const limit = Number.isFinite(maxLen) && maxLen > 0 ? Math.floor(maxLen) : 1e3;
18
16
  if (typeof str === "string") {
19
- if (str.length <= limit) return str;
20
- const sliceLen = Math.max(0, limit - indicator.length);
21
- return `${str.slice(0, sliceLen)}${indicator}`;
17
+ if (maxLen !== void 0 && maxLen > 0 && str.length > maxLen) {
18
+ const indicator = "\u2026(truncated)";
19
+ if (maxLen <= indicator.length) {
20
+ return str.slice(0, maxLen);
21
+ }
22
+ const sliceLen = maxLen - indicator.length;
23
+ return `${str.slice(0, sliceLen)}${indicator}`;
24
+ }
25
+ return str;
22
26
  }
23
27
  return String(value);
24
28
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dexto/core",
3
- "version": "1.5.1",
3
+ "version": "1.5.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",