@strands-agents/sdk 0.4.0 → 0.5.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 (141) hide show
  1. package/dist/src/__fixtures__/agent-helpers.d.ts +10 -1
  2. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  3. package/dist/src/__fixtures__/agent-helpers.js +13 -2
  4. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  5. package/dist/src/__fixtures__/mock-span.d.ts +78 -0
  6. package/dist/src/__fixtures__/mock-span.d.ts.map +1 -0
  7. package/dist/src/__fixtures__/mock-span.js +93 -0
  8. package/dist/src/__fixtures__/mock-span.js.map +1 -0
  9. package/dist/src/__fixtures__/tool-helpers.d.ts +2 -2
  10. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  11. package/dist/src/__fixtures__/tool-helpers.js +4 -4
  12. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  13. package/dist/src/__tests__/app-state.test.d.ts +2 -0
  14. package/dist/src/__tests__/app-state.test.d.ts.map +1 -0
  15. package/dist/src/{agent/__tests__/state.test.js → __tests__/app-state.test.js} +46 -46
  16. package/dist/src/__tests__/app-state.test.js.map +1 -0
  17. package/dist/src/__tests__/mcp.test.js +96 -15
  18. package/dist/src/__tests__/mcp.test.js.map +1 -1
  19. package/dist/src/agent/__tests__/agent.test.js +110 -0
  20. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  21. package/dist/src/agent/__tests__/agent.tracer.test.d.ts +2 -0
  22. package/dist/src/agent/__tests__/agent.tracer.test.d.ts.map +1 -0
  23. package/dist/src/agent/__tests__/agent.tracer.test.js +470 -0
  24. package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -0
  25. package/dist/src/agent/agent.d.ts +59 -6
  26. package/dist/src/agent/agent.d.ts.map +1 -1
  27. package/dist/src/agent/agent.js +187 -60
  28. package/dist/src/agent/agent.js.map +1 -1
  29. package/dist/src/{agent/state.d.ts → app-state.d.ts} +7 -7
  30. package/dist/src/app-state.d.ts.map +1 -0
  31. package/dist/src/{agent/state.js → app-state.js} +6 -6
  32. package/dist/src/app-state.js.map +1 -0
  33. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +1 -1
  34. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +1 -1
  35. package/dist/src/index.d.ts +2 -1
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +4 -0
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/mcp.d.ts +3 -0
  40. package/dist/src/mcp.d.ts.map +1 -1
  41. package/dist/src/mcp.js +38 -1
  42. package/dist/src/mcp.js.map +1 -1
  43. package/dist/src/models/__tests__/model.test.js +7 -0
  44. package/dist/src/models/__tests__/model.test.js.map +1 -1
  45. package/dist/src/models/model.d.ts +4 -0
  46. package/dist/src/models/model.d.ts.map +1 -1
  47. package/dist/src/models/model.js +6 -0
  48. package/dist/src/models/model.js.map +1 -1
  49. package/dist/src/models/streaming.d.ts +1 -1
  50. package/dist/src/multiagent/__tests__/events.test.d.ts +2 -0
  51. package/dist/src/multiagent/__tests__/events.test.d.ts.map +1 -0
  52. package/dist/src/multiagent/__tests__/events.test.js +189 -0
  53. package/dist/src/multiagent/__tests__/events.test.js.map +1 -0
  54. package/dist/src/multiagent/__tests__/nodes.test.js +102 -6
  55. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  56. package/dist/src/multiagent/__tests__/queue.test.d.ts +2 -0
  57. package/dist/src/multiagent/__tests__/queue.test.d.ts.map +1 -0
  58. package/dist/src/multiagent/__tests__/queue.test.js +96 -0
  59. package/dist/src/multiagent/__tests__/queue.test.js.map +1 -0
  60. package/dist/src/multiagent/base.d.ts +25 -0
  61. package/dist/src/multiagent/base.d.ts.map +1 -0
  62. package/dist/src/multiagent/base.js +2 -0
  63. package/dist/src/multiagent/base.js.map +1 -0
  64. package/dist/src/multiagent/edge.d.ts +29 -0
  65. package/dist/src/multiagent/edge.d.ts.map +1 -0
  66. package/dist/src/multiagent/edge.js +15 -0
  67. package/dist/src/multiagent/edge.js.map +1 -0
  68. package/dist/src/multiagent/events.d.ts +115 -4
  69. package/dist/src/multiagent/events.d.ts.map +1 -1
  70. package/dist/src/multiagent/events.js +123 -2
  71. package/dist/src/multiagent/events.js.map +1 -1
  72. package/dist/src/multiagent/index.d.ts +8 -6
  73. package/dist/src/multiagent/index.d.ts.map +1 -1
  74. package/dist/src/multiagent/index.js +4 -3
  75. package/dist/src/multiagent/index.js.map +1 -1
  76. package/dist/src/multiagent/nodes.d.ts +62 -14
  77. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  78. package/dist/src/multiagent/nodes.js +67 -20
  79. package/dist/src/multiagent/nodes.js.map +1 -1
  80. package/dist/src/multiagent/queue.d.ts +67 -0
  81. package/dist/src/multiagent/queue.d.ts.map +1 -0
  82. package/dist/src/multiagent/queue.js +59 -0
  83. package/dist/src/multiagent/queue.js.map +1 -0
  84. package/dist/src/multiagent/state.d.ts +77 -10
  85. package/dist/src/multiagent/state.d.ts.map +1 -1
  86. package/dist/src/multiagent/state.js +98 -9
  87. package/dist/src/multiagent/state.js.map +1 -1
  88. package/dist/src/telemetry/__tests__/config.test.node.d.ts +2 -0
  89. package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +1 -0
  90. package/dist/src/telemetry/__tests__/config.test.node.js +129 -0
  91. package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -0
  92. package/dist/src/telemetry/__tests__/json.test.d.ts +2 -0
  93. package/dist/src/telemetry/__tests__/json.test.d.ts.map +1 -0
  94. package/dist/src/telemetry/__tests__/json.test.js +89 -0
  95. package/dist/src/telemetry/__tests__/json.test.js.map +1 -0
  96. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +2 -0
  97. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +1 -0
  98. package/dist/src/telemetry/__tests__/tracer.test.node.js +611 -0
  99. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -0
  100. package/dist/src/telemetry/config.d.ts +61 -0
  101. package/dist/src/telemetry/config.d.ts.map +1 -0
  102. package/dist/src/telemetry/config.js +101 -0
  103. package/dist/src/telemetry/config.js.map +1 -0
  104. package/dist/src/telemetry/index.d.ts +34 -0
  105. package/dist/src/telemetry/index.d.ts.map +1 -0
  106. package/dist/src/telemetry/index.js +33 -0
  107. package/dist/src/telemetry/index.js.map +1 -0
  108. package/dist/src/telemetry/json.d.ts +11 -0
  109. package/dist/src/telemetry/json.d.ts.map +1 -0
  110. package/dist/src/telemetry/json.js +25 -0
  111. package/dist/src/telemetry/json.js.map +1 -0
  112. package/dist/src/telemetry/tracer.d.ts +219 -0
  113. package/dist/src/telemetry/tracer.d.ts.map +1 -0
  114. package/dist/src/telemetry/tracer.js +610 -0
  115. package/dist/src/telemetry/tracer.js.map +1 -0
  116. package/dist/src/telemetry/types.d.ts +101 -0
  117. package/dist/src/telemetry/types.d.ts.map +1 -0
  118. package/dist/src/telemetry/types.js +5 -0
  119. package/dist/src/{multiagent → telemetry}/types.js.map +1 -1
  120. package/dist/src/tools/tool.d.ts +1 -1
  121. package/dist/src/tools/tool.js +1 -1
  122. package/dist/src/tsconfig.tsbuildinfo +1 -1
  123. package/dist/src/types/agent.d.ts +3 -3
  124. package/dist/src/types/agent.d.ts.map +1 -1
  125. package/dist/src/types/messages.d.ts +4 -4
  126. package/dist/src/types/messages.js +1 -1
  127. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +2 -2
  128. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  129. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js +4 -4
  130. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +1 -1
  131. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +2 -2
  132. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  133. package/package.json +11 -2
  134. package/dist/src/agent/__tests__/state.test.d.ts +0 -2
  135. package/dist/src/agent/__tests__/state.test.d.ts.map +0 -1
  136. package/dist/src/agent/__tests__/state.test.js.map +0 -1
  137. package/dist/src/agent/state.d.ts.map +0 -1
  138. package/dist/src/agent/state.js.map +0 -1
  139. package/dist/src/multiagent/types.d.ts +0 -5
  140. package/dist/src/multiagent/types.d.ts.map +0 -1
  141. package/dist/src/multiagent/types.js +0 -2
@@ -0,0 +1,67 @@
1
+ import type { Node } from './nodes.js';
2
+ import type { MultiAgentStreamEvent } from './events.js';
3
+ import type { NodeResult } from './state.js';
4
+ /**
5
+ * Data produced by a running node: a streaming event, a completion signal, or an error.
6
+ */
7
+ export type QueueData = {
8
+ type: 'event';
9
+ node: Node;
10
+ event: MultiAgentStreamEvent;
11
+ } | {
12
+ type: 'result';
13
+ node: Node;
14
+ result: NodeResult;
15
+ } | {
16
+ type: 'error';
17
+ node: Node;
18
+ error: Error;
19
+ };
20
+ /**
21
+ * Queue data paired with an acknowledgement callback.
22
+ * The consumer must call {@link ack} after fully processing the data
23
+ * to unblock any producer waiting via {@link Queue.send}.
24
+ */
25
+ export interface QueueEntry {
26
+ data: QueueData;
27
+ ack: () => void;
28
+ }
29
+ /**
30
+ * Async queue with promise-based notification and optional back-pressure.
31
+ *
32
+ * Producers use {@link push} for fire-and-forget or {@link send} to
33
+ * block until the consumer has fully processed the data. The consumer calls
34
+ * {@link shift} to dequeue, then {@link QueueEntry.ack} after
35
+ * processing to unblock the producer.
36
+ */
37
+ export declare class Queue {
38
+ private readonly _entries;
39
+ /** Resolve function for the pending wait() promise, if any. */
40
+ private _notify?;
41
+ /**
42
+ * Push data to the queue, waking any waiting consumer.
43
+ */
44
+ push(data: QueueData): void;
45
+ /**
46
+ * Push data and wait until the consumer has fully processed it.
47
+ * Provides back-pressure so the producer pauses until the event
48
+ * has been yielded and hook callbacks have been invoked.
49
+ *
50
+ * @param data - The queue data to push
51
+ * @returns Promise that resolves when the consumer calls {@link QueueEntry.ack}
52
+ */
53
+ send(data: QueueData): Promise<void>;
54
+ /**
55
+ * Wait until at least one entry is available.
56
+ */
57
+ wait(): Promise<void>;
58
+ /**
59
+ * Remove and return the next entry, or undefined if empty.
60
+ */
61
+ shift(): QueueEntry | undefined;
62
+ /**
63
+ * Number of entries in the queue.
64
+ */
65
+ get size(): number;
66
+ }
67
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/multiagent/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAA;AAE/C;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAA;IACf,GAAG,EAAE,MAAM,IAAI,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,+DAA+D;IAC/D,OAAO,CAAC,OAAO,CAAC,CAA0B;IAE1C;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAM3B;;;;;;;OAOG;IACH,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB;;OAEG;IACH,KAAK,IAAI,UAAU,GAAG,SAAS;IAI/B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Async queue with promise-based notification and optional back-pressure.
3
+ *
4
+ * Producers use {@link push} for fire-and-forget or {@link send} to
5
+ * block until the consumer has fully processed the data. The consumer calls
6
+ * {@link shift} to dequeue, then {@link QueueEntry.ack} after
7
+ * processing to unblock the producer.
8
+ */
9
+ export class Queue {
10
+ _entries = [];
11
+ /** Resolve function for the pending wait() promise, if any. */
12
+ _notify;
13
+ /**
14
+ * Push data to the queue, waking any waiting consumer.
15
+ */
16
+ push(data) {
17
+ this._entries.push({ data, ack: () => { } });
18
+ this._notify?.();
19
+ this._notify = undefined;
20
+ }
21
+ /**
22
+ * Push data and wait until the consumer has fully processed it.
23
+ * Provides back-pressure so the producer pauses until the event
24
+ * has been yielded and hook callbacks have been invoked.
25
+ *
26
+ * @param data - The queue data to push
27
+ * @returns Promise that resolves when the consumer calls {@link QueueEntry.ack}
28
+ */
29
+ send(data) {
30
+ return new Promise((resolve) => {
31
+ this._entries.push({ data, ack: resolve });
32
+ this._notify?.();
33
+ this._notify = undefined;
34
+ });
35
+ }
36
+ /**
37
+ * Wait until at least one entry is available.
38
+ */
39
+ wait() {
40
+ if (this._entries.length > 0)
41
+ return Promise.resolve();
42
+ return new Promise((resolve) => {
43
+ this._notify = resolve;
44
+ });
45
+ }
46
+ /**
47
+ * Remove and return the next entry, or undefined if empty.
48
+ */
49
+ shift() {
50
+ return this._entries.shift();
51
+ }
52
+ /**
53
+ * Number of entries in the queue.
54
+ */
55
+ get size() {
56
+ return this._entries.length;
57
+ }
58
+ }
59
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/multiagent/queue.ts"],"names":[],"mappings":"AAsBA;;;;;;;GAOG;AACH,MAAM,OAAO,KAAK;IACC,QAAQ,GAAiB,EAAE,CAAA;IAC5C,+DAA+D;IACvD,OAAO,CAA2B;IAE1C;;OAEG;IACH,IAAI,CAAC,IAAe;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,IAAe;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC1C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAA;YAChB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;IAC7B,CAAC;CACF"}
@@ -1,9 +1,6 @@
1
+ import { AppState } from '../app-state.js';
1
2
  import type { ContentBlock } from '../types/messages.js';
2
- /**
3
- * Base state class shared across multi-agent patterns.
4
- */
5
- export declare class MultiAgentState {
6
- }
3
+ import type { z } from 'zod';
7
4
  /**
8
5
  * Execution lifecycle status shared across all multi-agent patterns.
9
6
  */
@@ -23,25 +20,30 @@ export declare const Status: {
23
20
  * Union of all valid status values.
24
21
  */
25
22
  export type Status = (typeof Status)[keyof typeof Status];
23
+ /**
24
+ * Subset of {@link Status} representing terminal outcomes.
25
+ */
26
+ export type ResultStatus = typeof Status.COMPLETED | typeof Status.FAILED | typeof Status.CANCELLED;
26
27
  /**
27
28
  * Result of executing a single node.
28
29
  */
29
30
  export declare class NodeResult {
30
31
  readonly type: "nodeResult";
31
32
  readonly nodeId: string;
32
- readonly status: Status;
33
- /**
34
- * Execution time in milliseconds.
35
- */
33
+ readonly status: ResultStatus;
34
+ /** Execution time in milliseconds. */
36
35
  readonly duration: number;
37
36
  readonly content: ContentBlock[];
38
37
  readonly error?: Error;
38
+ /** Validated structured output, if a schema was provided. */
39
+ readonly structuredOutput?: z.output<z.ZodType>;
39
40
  constructor(data: {
40
41
  nodeId: string;
41
- status: Status;
42
+ status: ResultStatus;
42
43
  duration: number;
43
44
  content?: ContentBlock[];
44
45
  error?: Error;
46
+ structuredOutput?: z.output<z.ZodType>;
45
47
  });
46
48
  }
47
49
  /**
@@ -52,4 +54,69 @@ export declare class NodeResult {
52
54
  * produce the final {@link NodeResult}.
53
55
  */
54
56
  export type NodeResultUpdate = Partial<Omit<NodeResult, 'type'>>;
57
+ /**
58
+ * Execution state of a single node within a multi-agent orchestration.
59
+ */
60
+ export declare class NodeState {
61
+ readonly type: "nodeState";
62
+ status: Status;
63
+ /** Marks this node as the last one executed in an execution path. */
64
+ terminus: boolean;
65
+ readonly results: NodeResult[];
66
+ constructor();
67
+ /** Content from the most recent result, or empty array if none. */
68
+ get content(): readonly ContentBlock[];
69
+ }
70
+ /**
71
+ * Aggregate result from a multi-agent execution.
72
+ */
73
+ export declare class MultiAgentResult {
74
+ readonly type: "multiAgentResult";
75
+ readonly status: ResultStatus;
76
+ readonly results: NodeResult[];
77
+ /** Combined content from terminus nodes, in completion order. */
78
+ readonly content: ContentBlock[];
79
+ readonly duration: number;
80
+ readonly error?: Error;
81
+ constructor(data: {
82
+ status?: ResultStatus;
83
+ results: NodeResult[];
84
+ content?: ContentBlock[];
85
+ duration: number;
86
+ error?: Error;
87
+ });
88
+ /** Derives the aggregate status from individual node results. */
89
+ private _resolveStatus;
90
+ }
91
+ /**
92
+ * Shared state for multi-agent orchestration patterns.
93
+ */
94
+ export declare class MultiAgentState {
95
+ /** Execution start time in milliseconds since epoch. */
96
+ readonly startTime: number;
97
+ /** Number of node executions started so far. */
98
+ steps: number;
99
+ /** All node results in completion order. */
100
+ readonly results: NodeResult[];
101
+ /** App-level key-value state accessible from hooks, edge handlers, and custom nodes. */
102
+ readonly app: AppState;
103
+ /** Structured output schema to apply to node invocations. */
104
+ readonly structuredOutputSchema?: z.ZodSchema;
105
+ private readonly _nodes;
106
+ constructor(data?: {
107
+ nodeIds?: string[];
108
+ structuredOutputSchema?: z.ZodSchema;
109
+ });
110
+ /**
111
+ * Get the state of a specific node by ID.
112
+ *
113
+ * @param id - The node identifier
114
+ * @returns The node's state, or undefined if the node is not tracked
115
+ */
116
+ node(id: string): NodeState | undefined;
117
+ /**
118
+ * All tracked node states.
119
+ */
120
+ get nodes(): ReadonlyMap<string, NodeState>;
121
+ }
55
122
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/multiagent/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD;;GAEG;AACH,qBAAa,eAAe;CAAG;AAE/B;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB,qCAAqC;;IAErC,0CAA0C;;IAE1C,uCAAuC;;IAEvC,sCAAsC;;IAEtC,2DAA2D;;CAEnD,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAA;AAEzD;;GAEG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAS;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,CAAA;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;gBAEV,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAOhH;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/multiagent/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAE5B;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB,qCAAqC;;IAErC,0CAA0C;;IAE1C,uCAAuC;;IAEvC,sCAAsC;;IAEtC,2DAA2D;;CAEnD,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAA;AAEzD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,MAAM,CAAC,SAAS,GAAG,OAAO,MAAM,CAAC,MAAM,GAAG,OAAO,MAAM,CAAC,SAAS,CAAA;AAEnG;;GAEG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAS;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,CAAA;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;gBAEnC,IAAI,EAAE;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,YAAY,CAAA;QACpB,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;QACxB,KAAK,CAAC,EAAE,KAAK,CAAA;QACb,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;KACvC;CAQF;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;AAEhE;;GAEG;AACH,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAS;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAA;;IAQ9B,mEAAmE;IACnE,IAAI,OAAO,IAAI,SAAS,YAAY,EAAE,CAGrC;CACF;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAS;IAC3C,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAA;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;gBAEV,IAAI,EAAE;QAChB,MAAM,CAAC,EAAE,YAAY,CAAA;QACrB,OAAO,EAAE,UAAU,EAAE,CAAA;QACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;QACxB,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,CAAC,EAAE,KAAK,CAAA;KACd;IAQD,iEAAiE;IACjE,OAAO,CAAC,cAAc;CAKvB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAA;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAA;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;gBAEnC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAA;KAAE;IAY/E;;;;;OAKG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIvC;;OAEG;IACH,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAE1C;CACF"}
@@ -1,8 +1,4 @@
1
- /**
2
- * Base state class shared across multi-agent patterns.
3
- */
4
- export class MultiAgentState {
5
- }
1
+ import { AppState } from '../app-state.js';
6
2
  /**
7
3
  * Execution lifecycle status shared across all multi-agent patterns.
8
4
  */
@@ -25,19 +21,112 @@ export class NodeResult {
25
21
  type = 'nodeResult';
26
22
  nodeId;
27
23
  status;
28
- /**
29
- * Execution time in milliseconds.
30
- */
24
+ /** Execution time in milliseconds. */
31
25
  duration;
32
26
  content;
33
27
  error;
28
+ /** Validated structured output, if a schema was provided. */
29
+ structuredOutput;
34
30
  constructor(data) {
35
31
  this.nodeId = data.nodeId;
36
32
  this.status = data.status;
37
33
  this.duration = data.duration;
38
34
  this.content = data.content ?? [];
39
- if (data.error)
35
+ if ('error' in data)
40
36
  this.error = data.error;
37
+ if ('structuredOutput' in data)
38
+ this.structuredOutput = data.structuredOutput;
39
+ }
40
+ }
41
+ /**
42
+ * Execution state of a single node within a multi-agent orchestration.
43
+ */
44
+ export class NodeState {
45
+ type = 'nodeState';
46
+ status;
47
+ /** Marks this node as the last one executed in an execution path. */
48
+ terminus;
49
+ results;
50
+ constructor() {
51
+ this.status = Status.PENDING;
52
+ this.terminus = false;
53
+ this.results = [];
54
+ }
55
+ /** Content from the most recent result, or empty array if none. */
56
+ get content() {
57
+ const last = this.results[this.results.length - 1];
58
+ return last?.content ?? [];
59
+ }
60
+ }
61
+ /**
62
+ * Aggregate result from a multi-agent execution.
63
+ */
64
+ export class MultiAgentResult {
65
+ type = 'multiAgentResult';
66
+ status;
67
+ results;
68
+ /** Combined content from terminus nodes, in completion order. */
69
+ content;
70
+ duration;
71
+ error;
72
+ constructor(data) {
73
+ this.status = data.status ?? this._resolveStatus(data.results);
74
+ this.results = data.results;
75
+ this.content = data.content ?? [];
76
+ this.duration = data.duration;
77
+ if ('error' in data)
78
+ this.error = data.error;
79
+ }
80
+ /** Derives the aggregate status from individual node results. */
81
+ _resolveStatus(results) {
82
+ if (results.some((r) => r.status === Status.FAILED))
83
+ return Status.FAILED;
84
+ if (results.some((r) => r.status === Status.CANCELLED))
85
+ return Status.CANCELLED;
86
+ return Status.COMPLETED;
87
+ }
88
+ }
89
+ /**
90
+ * Shared state for multi-agent orchestration patterns.
91
+ */
92
+ export class MultiAgentState {
93
+ /** Execution start time in milliseconds since epoch. */
94
+ startTime;
95
+ /** Number of node executions started so far. */
96
+ steps;
97
+ /** All node results in completion order. */
98
+ results;
99
+ /** App-level key-value state accessible from hooks, edge handlers, and custom nodes. */
100
+ app;
101
+ /** Structured output schema to apply to node invocations. */
102
+ structuredOutputSchema;
103
+ _nodes;
104
+ constructor(data) {
105
+ this.startTime = Date.now();
106
+ this.steps = 0;
107
+ this.results = [];
108
+ this.app = new AppState();
109
+ if (data?.structuredOutputSchema)
110
+ this.structuredOutputSchema = data.structuredOutputSchema;
111
+ this._nodes = new Map();
112
+ for (const id of data?.nodeIds ?? []) {
113
+ this._nodes.set(id, new NodeState());
114
+ }
115
+ }
116
+ /**
117
+ * Get the state of a specific node by ID.
118
+ *
119
+ * @param id - The node identifier
120
+ * @returns The node's state, or undefined if the node is not tracked
121
+ */
122
+ node(id) {
123
+ return this._nodes.get(id);
124
+ }
125
+ /**
126
+ * All tracked node states.
127
+ */
128
+ get nodes() {
129
+ return this._nodes;
41
130
  }
42
131
  }
43
132
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/multiagent/state.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,eAAe;CAAG;AAE/B;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,qCAAqC;IACrC,OAAO,EAAE,SAAS;IAClB,0CAA0C;IAC1C,SAAS,EAAE,WAAW;IACtB,uCAAuC;IACvC,SAAS,EAAE,WAAW;IACtB,sCAAsC;IACtC,MAAM,EAAE,QAAQ;IAChB,2DAA2D;IAC3D,SAAS,EAAE,WAAW;CACd,CAAA;AAOV;;GAEG;AACH,MAAM,OAAO,UAAU;IACZ,IAAI,GAAG,YAAqB,CAAA;IAC5B,MAAM,CAAQ;IACd,MAAM,CAAQ;IACvB;;OAEG;IACM,QAAQ,CAAQ;IAChB,OAAO,CAAgB;IACvB,KAAK,CAAQ;IAEtB,YAAY,IAAmG;QAC7G,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;QACjC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACzC,CAAC;CACF"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/multiagent/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.node.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/__tests__/config.test.node.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { NodeTracerProvider, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-node';
3
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
4
+ // Mock the exporters
5
+ vi.mock('@opentelemetry/exporter-trace-otlp-http', () => ({
6
+ OTLPTraceExporter: vi.fn(),
7
+ }));
8
+ vi.mock('@opentelemetry/sdk-trace-node', async (importOriginal) => {
9
+ const actual = await importOriginal();
10
+ return {
11
+ ...actual,
12
+ ConsoleSpanExporter: vi.fn(),
13
+ };
14
+ });
15
+ describe('setupTracer', () => {
16
+ const originalEnv = { ...process.env };
17
+ beforeEach(() => {
18
+ vi.resetModules();
19
+ vi.clearAllMocks();
20
+ });
21
+ afterEach(() => {
22
+ process.env = { ...originalEnv };
23
+ });
24
+ describe('singleton behavior', () => {
25
+ it('should return the same provider instance when called twice', async () => {
26
+ const telemetry = await import('../index.js');
27
+ const provider1 = telemetry.setupTracer({ exporters: { console: true } });
28
+ const provider2 = telemetry.setupTracer({ exporters: { otlp: true } });
29
+ expect(provider1).toBe(provider2);
30
+ });
31
+ it('should log a warning when called twice', async () => {
32
+ // Must dynamically import logger to get the same instance used by the fresh telemetry module
33
+ const { logger } = await import('../../logging/index.js');
34
+ const warnSpy = vi.spyOn(logger, 'warn');
35
+ const telemetry = await import('../index.js');
36
+ telemetry.setupTracer();
37
+ telemetry.setupTracer();
38
+ expect(warnSpy).toHaveBeenCalledWith('tracer provider already initialized, returning existing provider');
39
+ });
40
+ });
41
+ describe('custom provider', () => {
42
+ it('should use custom provider instead of creating a new one', async () => {
43
+ const telemetry = await import('../index.js');
44
+ const customProvider = new NodeTracerProvider();
45
+ const provider = telemetry.setupTracer({ provider: customProvider });
46
+ expect(provider).toBe(customProvider);
47
+ });
48
+ });
49
+ describe('exporter configuration', () => {
50
+ it('should add OTLP exporter when exporters.otlp is true', async () => {
51
+ const telemetry = await import('../index.js');
52
+ telemetry.setupTracer({ exporters: { otlp: true } });
53
+ expect(OTLPTraceExporter).toHaveBeenCalled();
54
+ });
55
+ it('should add console exporter when exporters.console is true', async () => {
56
+ const telemetry = await import('../index.js');
57
+ telemetry.setupTracer({ exporters: { console: true } });
58
+ expect(ConsoleSpanExporter).toHaveBeenCalled();
59
+ });
60
+ it('should add both exporters when both are true', async () => {
61
+ const telemetry = await import('../index.js');
62
+ telemetry.setupTracer({ exporters: { otlp: true, console: true } });
63
+ expect(OTLPTraceExporter).toHaveBeenCalled();
64
+ expect(ConsoleSpanExporter).toHaveBeenCalled();
65
+ });
66
+ it('should add no exporters when both are false', async () => {
67
+ const telemetry = await import('../index.js');
68
+ telemetry.setupTracer({ exporters: { otlp: false, console: false } });
69
+ expect(OTLPTraceExporter).not.toHaveBeenCalled();
70
+ expect(ConsoleSpanExporter).not.toHaveBeenCalled();
71
+ });
72
+ it('should add no exporters when exporters config is empty', async () => {
73
+ const telemetry = await import('../index.js');
74
+ telemetry.setupTracer({});
75
+ expect(OTLPTraceExporter).not.toHaveBeenCalled();
76
+ expect(ConsoleSpanExporter).not.toHaveBeenCalled();
77
+ });
78
+ });
79
+ describe('resource attributes', () => {
80
+ it('should use strands-agents as default service name', async () => {
81
+ const telemetry = await import('../index.js');
82
+ const provider = telemetry.setupTracer();
83
+ expect(provider.resource.attributes['service.name']).toBe('strands-agents');
84
+ });
85
+ it('should use OTEL_SERVICE_NAME when set', async () => {
86
+ process.env.OTEL_SERVICE_NAME = 'my-custom-service';
87
+ const telemetry = await import('../index.js');
88
+ const provider = telemetry.setupTracer();
89
+ expect(provider.resource.attributes['service.name']).toBe('my-custom-service');
90
+ });
91
+ it('should use OTEL_SERVICE_NAMESPACE when set', async () => {
92
+ process.env.OTEL_SERVICE_NAMESPACE = 'my-namespace';
93
+ const telemetry = await import('../index.js');
94
+ const provider = telemetry.setupTracer();
95
+ expect(provider.resource.attributes['service.namespace']).toBe('my-namespace');
96
+ });
97
+ it('should use OTEL_DEPLOYMENT_ENVIRONMENT when set', async () => {
98
+ process.env.OTEL_DEPLOYMENT_ENVIRONMENT = 'production';
99
+ const telemetry = await import('../index.js');
100
+ const provider = telemetry.setupTracer();
101
+ expect(provider.resource.attributes['deployment.environment']).toBe('production');
102
+ });
103
+ it('should include default resource attributes', async () => {
104
+ const telemetry = await import('../index.js');
105
+ const provider = telemetry.setupTracer();
106
+ expect(provider.resource.attributes['service.name']).toBe('strands-agents');
107
+ expect(provider.resource.attributes['service.namespace']).toBe('strands');
108
+ expect(provider.resource.attributes['deployment.environment']).toBe('development');
109
+ expect(provider.resource.attributes['telemetry.sdk.name']).toBe('opentelemetry');
110
+ expect(provider.resource.attributes['telemetry.sdk.language']).toBe('typescript');
111
+ });
112
+ it('should merge OTEL_RESOURCE_ATTRIBUTES with defaults', async () => {
113
+ process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.version=1.0.0,custom.team=platform';
114
+ const telemetry = await import('../index.js');
115
+ const provider = telemetry.setupTracer();
116
+ expect(provider.resource.attributes['service.version']).toBe('1.0.0');
117
+ expect(provider.resource.attributes['custom.team']).toBe('platform');
118
+ expect(provider.resource.attributes['service.name']).toBe('strands-agents');
119
+ });
120
+ it('should allow OTEL_RESOURCE_ATTRIBUTES to override defaults', async () => {
121
+ process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=custom-service,deployment.environment=production';
122
+ const telemetry = await import('../index.js');
123
+ const provider = telemetry.setupTracer();
124
+ expect(provider.resource.attributes['service.name']).toBe('custom-service');
125
+ expect(provider.resource.attributes['deployment.environment']).toBe('production');
126
+ });
127
+ });
128
+ });
129
+ //# sourceMappingURL=config.test.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.node.js","sourceRoot":"","sources":["../../../../src/telemetry/__tests__/config.test.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/__tests__/json.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { jsonReplacer } from '../json.js';
3
+ describe('jsonReplacer', () => {
4
+ describe('primitive values', () => {
5
+ it('serializes strings', () => {
6
+ expect(JSON.stringify('hello', jsonReplacer)).toBe('"hello"');
7
+ });
8
+ it('serializes numbers', () => {
9
+ expect(JSON.stringify(42, jsonReplacer)).toBe('42');
10
+ });
11
+ it('serializes booleans', () => {
12
+ expect(JSON.stringify(true, jsonReplacer)).toBe('true');
13
+ });
14
+ it('serializes null', () => {
15
+ expect(JSON.stringify(null, jsonReplacer)).toBe('null');
16
+ });
17
+ });
18
+ describe('object values', () => {
19
+ it('serializes simple objects', () => {
20
+ const obj = { key: 'value', number: 42, bool: true };
21
+ expect(JSON.stringify(obj, jsonReplacer)).toBe(JSON.stringify(obj));
22
+ });
23
+ it('serializes arrays', () => {
24
+ const arr = [1, 2, 3, 'test'];
25
+ expect(JSON.stringify(arr, jsonReplacer)).toBe(JSON.stringify(arr));
26
+ });
27
+ });
28
+ describe('special types', () => {
29
+ it('handles Date objects', () => {
30
+ const date = new Date('2024-01-01T00:00:00.000Z');
31
+ expect(JSON.stringify(date, jsonReplacer)).toBe('"2024-01-01T00:00:00.000Z"');
32
+ });
33
+ it('handles Date objects nested in objects', () => {
34
+ const date = new Date('2024-01-01T00:00:00.000Z');
35
+ expect(JSON.stringify({ timestamp: date, name: 'test' }, jsonReplacer)).toBe('{"timestamp":"2024-01-01T00:00:00.000Z","name":"test"}');
36
+ });
37
+ it('replaces BigInt values', () => {
38
+ const bigint = BigInt(12345678901234567890n);
39
+ expect(JSON.stringify(bigint, jsonReplacer)).toBe('"<replaced>"');
40
+ });
41
+ it('replaces functions', () => {
42
+ const fn = () => 'test';
43
+ const result = JSON.parse(JSON.stringify({ callback: fn, name: 'test' }, jsonReplacer));
44
+ expect(result).toStrictEqual({ callback: '<replaced>', name: 'test' });
45
+ });
46
+ it('replaces symbols', () => {
47
+ const result = JSON.parse(JSON.stringify({ sym: Symbol('test'), name: 'test' }, jsonReplacer));
48
+ expect(result).toStrictEqual({ sym: '<replaced>', name: 'test' });
49
+ });
50
+ it('replaces ArrayBuffer values', () => {
51
+ const buffer = new ArrayBuffer(8);
52
+ const result = JSON.parse(JSON.stringify({ data: buffer, name: 'test' }, jsonReplacer));
53
+ expect(result).toStrictEqual({ data: '<replaced>', name: 'test' });
54
+ });
55
+ it('replaces Uint8Array values', () => {
56
+ const bytes = new Uint8Array([1, 2, 3]);
57
+ const result = JSON.parse(JSON.stringify({ data: bytes, name: 'test' }, jsonReplacer));
58
+ expect(result).toStrictEqual({ data: '<replaced>', name: 'test' });
59
+ });
60
+ it('handles mixed content in arrays', () => {
61
+ const fn = () => 'test';
62
+ const data = ['value', 42, fn, null, { key: true }];
63
+ const result = JSON.parse(JSON.stringify(data, jsonReplacer));
64
+ expect(result).toStrictEqual(['value', 42, '<replaced>', null, { key: true }]);
65
+ });
66
+ it('handles mixed content in nested objects', () => {
67
+ const fn = () => 'test';
68
+ const now = new Date('2025-01-01T12:00:00.000Z');
69
+ const data = {
70
+ metadata: { timestamp: now, version: '1.0', debug: { obj: fn } },
71
+ content: [
72
+ { type: 'text', value: 'Hello' },
73
+ { type: 'binary', value: fn },
74
+ ],
75
+ list: [fn, 1234, true, null, 'string'],
76
+ };
77
+ const result = JSON.parse(JSON.stringify(data, jsonReplacer));
78
+ expect(result).toStrictEqual({
79
+ metadata: { timestamp: '2025-01-01T12:00:00.000Z', version: '1.0', debug: { obj: '<replaced>' } },
80
+ content: [
81
+ { type: 'text', value: 'Hello' },
82
+ { type: 'binary', value: '<replaced>' },
83
+ ],
84
+ list: ['<replaced>', 1234, true, null, 'string'],
85
+ });
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=json.test.js.map