@projectcor/maia-components 2.11.100-6 → 2.11.100-7

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 (37) hide show
  1. package/lib/App.js +2 -4
  2. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +14 -212
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +9 -99
  4. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +4 -91
  5. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +61 -264
  6. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +4 -1
  7. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +5 -34
  8. package/lib/hooks/useAgentModel/useCreateAgent.js +14 -40
  9. package/lib/hooks/useAgentModel/useUpdateAgent.js +11 -37
  10. package/lib/hooks/useChatManager/useChatManager.js +66 -167
  11. package/lib/hooks/useEvent.js +1 -2
  12. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +23 -183
  13. package/lib/lang/br/index.js +2 -14
  14. package/lib/lang/en/index.js +2 -14
  15. package/lib/lang/es/index.js +2 -14
  16. package/lib/lang/fr/index.js +2 -14
  17. package/lib/services/maia/Agents/getAgents.js +54 -30
  18. package/lib/services/maia/bootstrap/agentsPrefetchSession.js +124 -0
  19. package/lib/services/maia/bootstrap/fetchAgentsList.js +267 -0
  20. package/lib/services/maia/bootstrap/prefetchMaiaAgents.js +110 -0
  21. package/lib/types/agentModal.js +1 -1
  22. package/lib/types/streamActivity.js +1 -1
  23. package/lib/utils/normalizeAgentConnectors.js +3 -28
  24. package/package.json +1 -1
  25. package/lib/components/molecules/StreamAssistantTurnTimeline/StreamAssistantTurnTimeline.js +0 -91
  26. package/lib/components/molecules/StreamAssistantTurnTimeline/StreamAssistantTurnTimeline.styles.js +0 -19
  27. package/lib/components/molecules/StreamAssistantTurnTimeline/index.js +0 -2
  28. package/lib/dev/DevStreamTimelineDemo.js +0 -614
  29. package/lib/dev/mockStreamTimelineDemo.js +0 -417
  30. package/lib/dev/mockStreamTimelineRunner.js +0 -298
  31. package/lib/hooks/useStreamTimeline/index.js +0 -7
  32. package/lib/hooks/useStreamTimeline/streamTimelineStore.js +0 -37
  33. package/lib/services/maia/Agents/connectors.js +0 -124
  34. package/lib/types/streamTimeline.js +0 -2
  35. package/lib/utils/streamDebugLog.js +0 -170
  36. package/lib/utils/streamExecutionSteps.js +0 -136
  37. package/lib/utils/streamTimeline.js +0 -177
@@ -1,170 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
- /* eslint-disable no-console */
5
-
6
- var LOG_PREFIX = '[maia-stream]';
7
- var isStreamDebugEnabled = function isStreamDebugEnabled() {
8
- if (typeof window === 'undefined') return true;
9
- return window.__MAIA_STREAM_DEBUG__ !== false;
10
- };
11
- var safeString = function safeString(value) {
12
- var maxLen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 160;
13
- if (value == null) return '';
14
- var text = typeof value === 'string' ? value : JSON.stringify(value);
15
- if (text.length <= maxLen) return text;
16
- return "".concat(text.slice(0, maxLen), "\u2026");
17
- };
18
- export var summarizeTimelineSnapshot = function summarizeTimelineSnapshot(snapshot) {
19
- return {
20
- turnId: snapshot.turnId,
21
- contentFrozenLength: snapshot.contentFrozenLength,
22
- segmentCount: snapshot.segments.length,
23
- segments: snapshot.segments.map(function (segment) {
24
- if (segment.type === 'execution') {
25
- return {
26
- type: segment.type,
27
- id: segment.id,
28
- steps: segment.steps.map(function (step) {
29
- return {
30
- id: step.id,
31
- node: step.node,
32
- toolName: step.toolName,
33
- status: step.status,
34
- message: safeString(step.message, 80)
35
- };
36
- })
37
- };
38
- }
39
- return {
40
- type: segment.type,
41
- id: segment.id,
42
- textLength: segment.text.length,
43
- textPreview: safeString(segment.text, 80)
44
- };
45
- })
46
- };
47
- };
48
- export var summarizeHitlContext = function summarizeHitlContext(context) {
49
- var _context$pendingActio, _context$approval, _context$approval2;
50
- if (!context) return null;
51
- return {
52
- messageId: context.messageId,
53
- threadIds: context.threadIds,
54
- pendingTools: (_context$pendingActio = context.pendingActions) === null || _context$pendingActio === void 0 ? void 0 : _context$pendingActio.map(function (action) {
55
- return action.tool_name;
56
- }),
57
- approvalStatus: (_context$approval = context.approval) !== null && _context$approval !== void 0 && _context$approval.manual_approval_detected ? 'manual_detected' : 'button',
58
- originalThreadId: (_context$approval2 = context.approval) === null || _context$approval2 === void 0 ? void 0 : _context$approval2.original_thread_id
59
- };
60
- };
61
- export var summarizeApprovalPayload = function summarizeApprovalPayload(approval) {
62
- var _payload$pending_acti;
63
- var payload = approval;
64
- return {
65
- originalThreadId: payload.original_thread_id,
66
- sessionId: payload.session_id,
67
- manualApprovalDetected: payload.manual_approval_detected === true,
68
- warningMessage: payload.warning_message ? safeString(payload.warning_message, 80) : undefined,
69
- totalActions: payload.total_actions,
70
- pendingActions: (_payload$pending_acti = payload.pending_actions) === null || _payload$pending_acti === void 0 ? void 0 : _payload$pending_acti.map(function (action) {
71
- return {
72
- tool_name: action.tool_name,
73
- thread_id: action.thread_id,
74
- tool_call_id: action.tool_call_id
75
- };
76
- })
77
- };
78
- };
79
- export var summarizeStreamActivity = function summarizeStreamActivity(activity) {
80
- var _activity$executionSt, _activity$executionSt2, _activity$executionSt3;
81
- if (!activity) return null;
82
- return {
83
- phase: activity.phase,
84
- message: safeString(activity.message, 80),
85
- executionStepCount: (_activity$executionSt = (_activity$executionSt2 = activity.executionSteps) === null || _activity$executionSt2 === void 0 ? void 0 : _activity$executionSt2.length) !== null && _activity$executionSt !== void 0 ? _activity$executionSt : 0,
86
- executionSteps: (_activity$executionSt3 = activity.executionSteps) === null || _activity$executionSt3 === void 0 ? void 0 : _activity$executionSt3.map(function (step) {
87
- return {
88
- node: step.node,
89
- toolName: step.toolName,
90
- status: step.status,
91
- message: safeString(step.message, 80)
92
- };
93
- })
94
- };
95
- };
96
- export var streamDebugLog = function streamDebugLog(scope, event, payload) {
97
- if (!isStreamDebugEnabled()) return;
98
- if (payload) {
99
- console.info(LOG_PREFIX, scope, event, payload);
100
- return;
101
- }
102
- console.info(LOG_PREFIX, scope, event);
103
- };
104
- export var streamDebugWarn = function streamDebugWarn(scope, event, payload) {
105
- if (!isStreamDebugEnabled()) return;
106
- if (payload) {
107
- console.warn(LOG_PREFIX, scope, event, payload);
108
- return;
109
- }
110
- console.warn(LOG_PREFIX, scope, event);
111
- };
112
- export var streamDebugTimeline = function streamDebugTimeline(scope, event, snapshot) {
113
- streamDebugLog(scope, event, summarizeTimelineSnapshot(snapshot));
114
- };
115
- export var streamDebugSse = function streamDebugSse(channel, eventType, payload) {
116
- streamDebugLog("sse:".concat(channel), eventType, payload);
117
- };
118
- export var streamDebugHitlContext = function streamDebugHitlContext(scope, event, context) {
119
- streamDebugLog(scope, event, {
120
- hitlContext: summarizeHitlContext(context)
121
- });
122
- };
123
- export var streamDebugApproval = function streamDebugApproval(scope, event, approval, extra) {
124
- streamDebugLog(scope, event, _objectSpread({
125
- approval: summarizeApprovalPayload(approval)
126
- }, extra));
127
- };
128
- export var streamDebugActivity = function streamDebugActivity(scope, event, activity, extra) {
129
- streamDebugLog(scope, event, _objectSpread({
130
- activity: summarizeStreamActivity(activity)
131
- }, extra));
132
- };
133
- export var streamDebugNode = function streamDebugNode(scope, payload, extra) {
134
- streamDebugLog(scope, 'node', _objectSpread({
135
- node: payload.node,
136
- tool_name: payload.tool_name,
137
- thread_id: payload.thread_id,
138
- backendMessage: safeString(payload.message, 120),
139
- resolvedMessage: extra !== null && extra !== void 0 && extra.resolvedMessage ? safeString(extra.resolvedMessage, 120) : undefined,
140
- resolvedPhase: extra === null || extra === void 0 ? void 0 : extra.resolvedPhase
141
- }, extra));
142
- };
143
-
144
- /** Alerta cuando el node HITL coincide con tools del approval pendiente (posible UI duplicada). */
145
- export var streamDebugLogHitlUiOverlap = function streamDebugLogHitlUiOverlap(params) {
146
- var _params$hitlContext$p, _params$hitlContext, _params$nodePayload$t, _params$nodePayload, _params$nodePayload2, _params$activityMessa, _params$activityMessa2, _params$nodePayload$m, _params$nodePayload3, _params$uiSurfaces$le, _params$uiSurfaces, _params$nodePayload4;
147
- var pendingTools = (_params$hitlContext$p = (_params$hitlContext = params.hitlContext) === null || _params$hitlContext === void 0 || (_params$hitlContext = _params$hitlContext.pendingActions) === null || _params$hitlContext === void 0 ? void 0 : _params$hitlContext.map(function (action) {
148
- return action.tool_name;
149
- })) !== null && _params$hitlContext$p !== void 0 ? _params$hitlContext$p : [];
150
- var nodeTool = (_params$nodePayload$t = (_params$nodePayload = params.nodePayload) === null || _params$nodePayload === void 0 ? void 0 : _params$nodePayload.tool_name) !== null && _params$nodePayload$t !== void 0 ? _params$nodePayload$t : (_params$nodePayload2 = params.nodePayload) === null || _params$nodePayload2 === void 0 ? void 0 : _params$nodePayload2.node;
151
- var activityMsg = (_params$activityMessa = (_params$activityMessa2 = params.activityMessage) === null || _params$activityMessa2 === void 0 ? void 0 : _params$activityMessa2.trim().toLowerCase()) !== null && _params$activityMessa !== void 0 ? _params$activityMessa : '';
152
- var backendMsg = (_params$nodePayload$m = (_params$nodePayload3 = params.nodePayload) === null || _params$nodePayload3 === void 0 || (_params$nodePayload3 = _params$nodePayload3.message) === null || _params$nodePayload3 === void 0 ? void 0 : _params$nodePayload3.trim().toLowerCase()) !== null && _params$nodePayload$m !== void 0 ? _params$nodePayload$m : '';
153
- var toolOverlap = nodeTool && nodeTool !== 'resuming' && pendingTools.some(function (tool) {
154
- return tool === nodeTool;
155
- });
156
- var hasMultipleSurfaces = ((_params$uiSurfaces$le = (_params$uiSurfaces = params.uiSurfaces) === null || _params$uiSurfaces === void 0 ? void 0 : _params$uiSurfaces.length) !== null && _params$uiSurfaces$le !== void 0 ? _params$uiSurfaces$le : 0) >= 2;
157
- var messagesMatch = activityMsg.length > 0 && backendMsg.length > 0 && activityMsg === backendMsg;
158
- if (!toolOverlap && !(hasMultipleSurfaces && messagesMatch)) return;
159
- streamDebugWarn(params.scope, 'hitl-ui-overlap-suspect', {
160
- source: params.source,
161
- uiSurfaces: params.uiSurfaces,
162
- pendingTools: pendingTools,
163
- nodeTool: nodeTool,
164
- backendMessage: safeString((_params$nodePayload4 = params.nodePayload) === null || _params$nodePayload4 === void 0 ? void 0 : _params$nodePayload4.message, 120),
165
- activityMessage: safeString(params.activityMessage, 120),
166
- messagesMatch: messagesMatch,
167
- hitlContext: summarizeHitlContext(params.hitlContext)
168
- });
169
- };
170
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dfUFJFRklYIiwiaXNTdHJlYW1EZWJ1Z0VuYWJsZWQiLCJ3aW5kb3ciLCJfX01BSUFfU1RSRUFNX0RFQlVHX18iLCJzYWZlU3RyaW5nIiwidmFsdWUiLCJtYXhMZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0ZXh0IiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbmNhdCIsInNsaWNlIiwic3VtbWFyaXplVGltZWxpbmVTbmFwc2hvdCIsInNuYXBzaG90IiwidHVybklkIiwiY29udGVudEZyb3plbkxlbmd0aCIsInNlZ21lbnRDb3VudCIsInNlZ21lbnRzIiwibWFwIiwic2VnbWVudCIsInR5cGUiLCJpZCIsInN0ZXBzIiwic3RlcCIsIm5vZGUiLCJ0b29sTmFtZSIsInN0YXR1cyIsIm1lc3NhZ2UiLCJ0ZXh0TGVuZ3RoIiwidGV4dFByZXZpZXciLCJzdW1tYXJpemVIaXRsQ29udGV4dCIsImNvbnRleHQiLCJfY29udGV4dCRwZW5kaW5nQWN0aW8iLCJfY29udGV4dCRhcHByb3ZhbCIsIl9jb250ZXh0JGFwcHJvdmFsMiIsIm1lc3NhZ2VJZCIsInRocmVhZElkcyIsInBlbmRpbmdUb29scyIsInBlbmRpbmdBY3Rpb25zIiwiYWN0aW9uIiwidG9vbF9uYW1lIiwiYXBwcm92YWxTdGF0dXMiLCJhcHByb3ZhbCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsIm9yaWdpbmFsVGhyZWFkSWQiLCJvcmlnaW5hbF90aHJlYWRfaWQiLCJzdW1tYXJpemVBcHByb3ZhbFBheWxvYWQiLCJfcGF5bG9hZCRwZW5kaW5nX2FjdGkiLCJwYXlsb2FkIiwic2Vzc2lvbklkIiwic2Vzc2lvbl9pZCIsIm1hbnVhbEFwcHJvdmFsRGV0ZWN0ZWQiLCJ3YXJuaW5nTWVzc2FnZSIsIndhcm5pbmdfbWVzc2FnZSIsInRvdGFsQWN0aW9ucyIsInRvdGFsX2FjdGlvbnMiLCJwZW5kaW5nX2FjdGlvbnMiLCJ0aHJlYWRfaWQiLCJ0b29sX2NhbGxfaWQiLCJzdW1tYXJpemVTdHJlYW1BY3Rpdml0eSIsImFjdGl2aXR5IiwiX2FjdGl2aXR5JGV4ZWN1dGlvblN0IiwiX2FjdGl2aXR5JGV4ZWN1dGlvblN0MiIsIl9hY3Rpdml0eSRleGVjdXRpb25TdDMiLCJwaGFzZSIsImV4ZWN1dGlvblN0ZXBDb3VudCIsImV4ZWN1dGlvblN0ZXBzIiwic3RyZWFtRGVidWdMb2ciLCJzY29wZSIsImV2ZW50IiwiY29uc29sZSIsImluZm8iLCJzdHJlYW1EZWJ1Z1dhcm4iLCJ3YXJuIiwic3RyZWFtRGVidWdUaW1lbGluZSIsInN0cmVhbURlYnVnU3NlIiwiY2hhbm5lbCIsImV2ZW50VHlwZSIsInN0cmVhbURlYnVnSGl0bENvbnRleHQiLCJoaXRsQ29udGV4dCIsInN0cmVhbURlYnVnQXBwcm92YWwiLCJleHRyYSIsIl9vYmplY3RTcHJlYWQiLCJzdHJlYW1EZWJ1Z0FjdGl2aXR5Iiwic3RyZWFtRGVidWdOb2RlIiwiYmFja2VuZE1lc3NhZ2UiLCJyZXNvbHZlZE1lc3NhZ2UiLCJyZXNvbHZlZFBoYXNlIiwic3RyZWFtRGVidWdMb2dIaXRsVWlPdmVybGFwIiwicGFyYW1zIiwiX3BhcmFtcyRoaXRsQ29udGV4dCRwIiwiX3BhcmFtcyRoaXRsQ29udGV4dCIsIl9wYXJhbXMkbm9kZVBheWxvYWQkdCIsIl9wYXJhbXMkbm9kZVBheWxvYWQiLCJfcGFyYW1zJG5vZGVQYXlsb2FkMiIsIl9wYXJhbXMkYWN0aXZpdHlNZXNzYSIsIl9wYXJhbXMkYWN0aXZpdHlNZXNzYTIiLCJfcGFyYW1zJG5vZGVQYXlsb2FkJG0iLCJfcGFyYW1zJG5vZGVQYXlsb2FkMyIsIl9wYXJhbXMkdWlTdXJmYWNlcyRsZSIsIl9wYXJhbXMkdWlTdXJmYWNlcyIsIl9wYXJhbXMkbm9kZVBheWxvYWQ0Iiwibm9kZVRvb2wiLCJub2RlUGF5bG9hZCIsImFjdGl2aXR5TXNnIiwiYWN0aXZpdHlNZXNzYWdlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwiYmFja2VuZE1zZyIsInRvb2xPdmVybGFwIiwic29tZSIsInRvb2wiLCJoYXNNdWx0aXBsZVN1cmZhY2VzIiwidWlTdXJmYWNlcyIsIm1lc3NhZ2VzTWF0Y2giLCJzb3VyY2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc3RyZWFtRGVidWdMb2cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHR5cGUgeyBBcHByb3ZhbFJlcXVlc3QgfSBmcm9tICcuLi90eXBlcy9DaGF0J1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1BY3Rpdml0eSwgU3RyZWFtTm9kZUV2ZW50UGF5bG9hZCB9IGZyb20gJy4uL3R5cGVzL3N0cmVhbUFjdGl2aXR5J1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1UaW1lbGluZVNuYXBzaG90IH0gZnJvbSAnLi4vdHlwZXMvc3RyZWFtVGltZWxpbmUnXG5pbXBvcnQgdHlwZSB7IEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuXG5jb25zdCBMT0dfUFJFRklYID0gJ1ttYWlhLXN0cmVhbV0nXG5cbnR5cGUgU3RyZWFtRGVidWdQYXlsb2FkID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAvKiogRGVzYWN0aXZhciBsb2dzOiBgd2luZG93Ll9fTUFJQV9TVFJFQU1fREVCVUdfXyA9IGZhbHNlYCAqL1xuICAgIF9fTUFJQV9TVFJFQU1fREVCVUdfXz86IGJvb2xlYW5cbiAgfVxufVxuXG5jb25zdCBpc1N0cmVhbURlYnVnRW5hYmxlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gd2luZG93Ll9fTUFJQV9TVFJFQU1fREVCVUdfXyAhPT0gZmFsc2Vcbn1cblxuY29uc3Qgc2FmZVN0cmluZyA9ICh2YWx1ZTogdW5rbm93biwgbWF4TGVuID0gMTYwKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiAnJ1xuICBjb25zdCB0ZXh0ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhMZW4pIHJldHVybiB0ZXh0XG4gIHJldHVybiBgJHt0ZXh0LnNsaWNlKDAsIG1heExlbil94oCmYFxufVxuXG5leHBvcnQgY29uc3Qgc3VtbWFyaXplVGltZWxpbmVTbmFwc2hvdCA9IChzbmFwc2hvdDogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCkgPT4gKHtcbiAgdHVybklkOiBzbmFwc2hvdC50dXJuSWQsXG4gIGNvbnRlbnRGcm96ZW5MZW5ndGg6IHNuYXBzaG90LmNvbnRlbnRGcm96ZW5MZW5ndGgsXG4gIHNlZ21lbnRDb3VudDogc25hcHNob3Quc2VnbWVudHMubGVuZ3RoLFxuICBzZWdtZW50czogc25hcHNob3Quc2VnbWVudHMubWFwKHNlZ21lbnQgPT4ge1xuICAgIGlmIChzZWdtZW50LnR5cGUgPT09ICdleGVjdXRpb24nKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzZWdtZW50LnR5cGUsXG4gICAgICAgIGlkOiBzZWdtZW50LmlkLFxuICAgICAgICBzdGVwczogc2VnbWVudC5zdGVwcy5tYXAoc3RlcCA9PiAoe1xuICAgICAgICAgIGlkOiBzdGVwLmlkLFxuICAgICAgICAgIG5vZGU6IHN0ZXAubm9kZSxcbiAgICAgICAgICB0b29sTmFtZTogc3RlcC50b29sTmFtZSxcbiAgICAgICAgICBzdGF0dXM6IHN0ZXAuc3RhdHVzLFxuICAgICAgICAgIG1lc3NhZ2U6IHNhZmVTdHJpbmcoc3RlcC5tZXNzYWdlLCA4MCksXG4gICAgICAgIH0pKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHNlZ21lbnQudHlwZSxcbiAgICAgIGlkOiBzZWdtZW50LmlkLFxuICAgICAgdGV4dExlbmd0aDogc2VnbWVudC50ZXh0Lmxlbmd0aCxcbiAgICAgIHRleHRQcmV2aWV3OiBzYWZlU3RyaW5nKHNlZ21lbnQudGV4dCwgODApLFxuICAgIH1cbiAgfSksXG59KVxuXG5leHBvcnQgY29uc3Qgc3VtbWFyaXplSGl0bENvbnRleHQgPSAoY29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghY29udGV4dCkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlSWQ6IGNvbnRleHQubWVzc2FnZUlkLFxuICAgIHRocmVhZElkczogY29udGV4dC50aHJlYWRJZHMsXG4gICAgcGVuZGluZ1Rvb2xzOiBjb250ZXh0LnBlbmRpbmdBY3Rpb25zPy5tYXAoYWN0aW9uID0+IGFjdGlvbi50b29sX25hbWUpLFxuICAgIGFwcHJvdmFsU3RhdHVzOiBjb250ZXh0LmFwcHJvdmFsPy5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgPyAnbWFudWFsX2RldGVjdGVkJyA6ICdidXR0b24nLFxuICAgIG9yaWdpbmFsVGhyZWFkSWQ6IGNvbnRleHQuYXBwcm92YWw/Lm9yaWdpbmFsX3RocmVhZF9pZCxcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3VtbWFyaXplQXBwcm92YWxQYXlsb2FkID0gKGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3QgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICBjb25zdCBwYXlsb2FkID0gYXBwcm92YWwgYXMgQXBwcm92YWxSZXF1ZXN0XG4gIHJldHVybiB7XG4gICAgb3JpZ2luYWxUaHJlYWRJZDogcGF5bG9hZC5vcmlnaW5hbF90aHJlYWRfaWQsXG4gICAgc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25faWQsXG4gICAgbWFudWFsQXBwcm92YWxEZXRlY3RlZDogcGF5bG9hZC5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgPT09IHRydWUsXG4gICAgd2FybmluZ01lc3NhZ2U6IHBheWxvYWQud2FybmluZ19tZXNzYWdlID8gc2FmZVN0cmluZyhwYXlsb2FkLndhcm5pbmdfbWVzc2FnZSwgODApIDogdW5kZWZpbmVkLFxuICAgIHRvdGFsQWN0aW9uczogcGF5bG9hZC50b3RhbF9hY3Rpb25zLFxuICAgIHBlbmRpbmdBY3Rpb25zOiBwYXlsb2FkLnBlbmRpbmdfYWN0aW9ucz8ubWFwKGFjdGlvbiA9PiAoe1xuICAgICAgdG9vbF9uYW1lOiBhY3Rpb24udG9vbF9uYW1lLFxuICAgICAgdGhyZWFkX2lkOiBhY3Rpb24udGhyZWFkX2lkLFxuICAgICAgdG9vbF9jYWxsX2lkOiBhY3Rpb24udG9vbF9jYWxsX2lkLFxuICAgIH0pKSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3VtbWFyaXplU3RyZWFtQWN0aXZpdHkgPSAoYWN0aXZpdHk6IFN0cmVhbUFjdGl2aXR5IHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAoIWFjdGl2aXR5KSByZXR1cm4gbnVsbFxuICByZXR1cm4ge1xuICAgIHBoYXNlOiBhY3Rpdml0eS5waGFzZSxcbiAgICBtZXNzYWdlOiBzYWZlU3RyaW5nKGFjdGl2aXR5Lm1lc3NhZ2UsIDgwKSxcbiAgICBleGVjdXRpb25TdGVwQ291bnQ6IGFjdGl2aXR5LmV4ZWN1dGlvblN0ZXBzPy5sZW5ndGggPz8gMCxcbiAgICBleGVjdXRpb25TdGVwczogYWN0aXZpdHkuZXhlY3V0aW9uU3RlcHM/Lm1hcChzdGVwID0+ICh7XG4gICAgICBub2RlOiBzdGVwLm5vZGUsXG4gICAgICB0b29sTmFtZTogc3RlcC50b29sTmFtZSxcbiAgICAgIHN0YXR1czogc3RlcC5zdGF0dXMsXG4gICAgICBtZXNzYWdlOiBzYWZlU3RyaW5nKHN0ZXAubWVzc2FnZSwgODApLFxuICAgIH0pKSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtRGVidWdMb2cgPSAoc2NvcGU6IHN0cmluZywgZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IFN0cmVhbURlYnVnUGF5bG9hZCk6IHZvaWQgPT4ge1xuICBpZiAoIWlzU3RyZWFtRGVidWdFbmFibGVkKCkpIHJldHVyblxuICBpZiAocGF5bG9hZCkge1xuICAgIGNvbnNvbGUuaW5mbyhMT0dfUFJFRklYLCBzY29wZSwgZXZlbnQsIHBheWxvYWQpXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc29sZS5pbmZvKExPR19QUkVGSVgsIHNjb3BlLCBldmVudClcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmVhbURlYnVnV2FybiA9IChzY29wZTogc3RyaW5nLCBldmVudDogc3RyaW5nLCBwYXlsb2FkPzogU3RyZWFtRGVidWdQYXlsb2FkKTogdm9pZCA9PiB7XG4gIGlmICghaXNTdHJlYW1EZWJ1Z0VuYWJsZWQoKSkgcmV0dXJuXG4gIGlmIChwYXlsb2FkKSB7XG4gICAgY29uc29sZS53YXJuKExPR19QUkVGSVgsIHNjb3BlLCBldmVudCwgcGF5bG9hZClcbiAgICByZXR1cm5cbiAgfVxuICBjb25zb2xlLndhcm4oTE9HX1BSRUZJWCwgc2NvcGUsIGV2ZW50KVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtRGVidWdUaW1lbGluZSA9IChzY29wZTogc3RyaW5nLCBldmVudDogc3RyaW5nLCBzbmFwc2hvdDogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCk6IHZvaWQgPT4ge1xuICBzdHJlYW1EZWJ1Z0xvZyhzY29wZSwgZXZlbnQsIHN1bW1hcml6ZVRpbWVsaW5lU25hcHNob3Qoc25hcHNob3QpKVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtRGVidWdTc2UgPSAoXG4gIGNoYW5uZWw6ICdhc2tNYWlhJyB8ICdjb250aW51ZVRocmVhZCcgfCAncHJvY2Vzc1NTRVN0cmVhbScsXG4gIGV2ZW50VHlwZTogc3RyaW5nLFxuICBwYXlsb2FkPzogU3RyZWFtRGVidWdQYXlsb2FkXG4pOiB2b2lkID0+IHtcbiAgc3RyZWFtRGVidWdMb2coYHNzZToke2NoYW5uZWx9YCwgZXZlbnRUeXBlLCBwYXlsb2FkKVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtRGVidWdIaXRsQ29udGV4dCA9IChcbiAgc2NvcGU6IHN0cmluZyxcbiAgZXZlbnQ6IHN0cmluZyxcbiAgY29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiB2b2lkID0+IHtcbiAgc3RyZWFtRGVidWdMb2coc2NvcGUsIGV2ZW50LCB7IGhpdGxDb250ZXh0OiBzdW1tYXJpemVIaXRsQ29udGV4dChjb250ZXh0KSB9KVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtRGVidWdBcHByb3ZhbCA9IChcbiAgc2NvcGU6IHN0cmluZyxcbiAgZXZlbnQ6IHN0cmluZyxcbiAgYXBwcm92YWw6IEFwcHJvdmFsUmVxdWVzdCB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBleHRyYT86IFN0cmVhbURlYnVnUGF5bG9hZFxuKTogdm9pZCA9PiB7XG4gIHN0cmVhbURlYnVnTG9nKHNjb3BlLCBldmVudCwge1xuICAgIGFwcHJvdmFsOiBzdW1tYXJpemVBcHByb3ZhbFBheWxvYWQoYXBwcm92YWwpLFxuICAgIC4uLmV4dHJhLFxuICB9KVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtRGVidWdBY3Rpdml0eSA9IChcbiAgc2NvcGU6IHN0cmluZyxcbiAgZXZlbnQ6IHN0cmluZyxcbiAgYWN0aXZpdHk6IFN0cmVhbUFjdGl2aXR5IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZXh0cmE/OiBTdHJlYW1EZWJ1Z1BheWxvYWRcbik6IHZvaWQgPT4ge1xuICBzdHJlYW1EZWJ1Z0xvZyhzY29wZSwgZXZlbnQsIHtcbiAgICBhY3Rpdml0eTogc3VtbWFyaXplU3RyZWFtQWN0aXZpdHkoYWN0aXZpdHkpLFxuICAgIC4uLmV4dHJhLFxuICB9KVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtRGVidWdOb2RlID0gKFxuICBzY29wZTogc3RyaW5nLFxuICBwYXlsb2FkOiBTdHJlYW1Ob2RlRXZlbnRQYXlsb2FkLFxuICBleHRyYT86IFN0cmVhbURlYnVnUGF5bG9hZCAmIHsgcmVzb2x2ZWRNZXNzYWdlPzogc3RyaW5nOyByZXNvbHZlZFBoYXNlPzogc3RyaW5nIH1cbik6IHZvaWQgPT4ge1xuICBzdHJlYW1EZWJ1Z0xvZyhzY29wZSwgJ25vZGUnLCB7XG4gICAgbm9kZTogcGF5bG9hZC5ub2RlLFxuICAgIHRvb2xfbmFtZTogcGF5bG9hZC50b29sX25hbWUsXG4gICAgdGhyZWFkX2lkOiBwYXlsb2FkLnRocmVhZF9pZCxcbiAgICBiYWNrZW5kTWVzc2FnZTogc2FmZVN0cmluZyhwYXlsb2FkLm1lc3NhZ2UsIDEyMCksXG4gICAgcmVzb2x2ZWRNZXNzYWdlOiBleHRyYT8ucmVzb2x2ZWRNZXNzYWdlID8gc2FmZVN0cmluZyhleHRyYS5yZXNvbHZlZE1lc3NhZ2UsIDEyMCkgOiB1bmRlZmluZWQsXG4gICAgcmVzb2x2ZWRQaGFzZTogZXh0cmE/LnJlc29sdmVkUGhhc2UsXG4gICAgLi4uZXh0cmEsXG4gIH0pXG59XG5cbi8qKiBBbGVydGEgY3VhbmRvIGVsIG5vZGUgSElUTCBjb2luY2lkZSBjb24gdG9vbHMgZGVsIGFwcHJvdmFsIHBlbmRpZW50ZSAocG9zaWJsZSBVSSBkdXBsaWNhZGEpLiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbURlYnVnTG9nSGl0bFVpT3ZlcmxhcCA9IChwYXJhbXM6IHtcbiAgc2NvcGU6IHN0cmluZ1xuICBzb3VyY2U6ICdub2RlJyB8ICdpbml0aWFsQWN0aXZpdHknIHwgJ2FwcHJvdmFsQm94JyB8ICd0aW1lbGluZVNlZ21lbnQnXG4gIG5vZGVQYXlsb2FkPzogU3RyZWFtTm9kZUV2ZW50UGF5bG9hZFxuICBhY3Rpdml0eU1lc3NhZ2U/OiBzdHJpbmdcbiAgaGl0bENvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGxcbiAgdWlTdXJmYWNlcz86IHN0cmluZ1tdXG59KTogdm9pZCA9PiB7XG4gIGNvbnN0IHBlbmRpbmdUb29scyA9IHBhcmFtcy5oaXRsQ29udGV4dD8ucGVuZGluZ0FjdGlvbnM/Lm1hcChhY3Rpb24gPT4gYWN0aW9uLnRvb2xfbmFtZSkgPz8gW11cbiAgY29uc3Qgbm9kZVRvb2wgPSBwYXJhbXMubm9kZVBheWxvYWQ/LnRvb2xfbmFtZSA/PyBwYXJhbXMubm9kZVBheWxvYWQ/Lm5vZGVcbiAgY29uc3QgYWN0aXZpdHlNc2cgPSBwYXJhbXMuYWN0aXZpdHlNZXNzYWdlPy50cmltKCkudG9Mb3dlckNhc2UoKSA/PyAnJ1xuICBjb25zdCBiYWNrZW5kTXNnID0gcGFyYW1zLm5vZGVQYXlsb2FkPy5tZXNzYWdlPy50cmltKCkudG9Mb3dlckNhc2UoKSA/PyAnJ1xuXG4gIGNvbnN0IHRvb2xPdmVybGFwID0gbm9kZVRvb2wgJiYgbm9kZVRvb2wgIT09ICdyZXN1bWluZycgJiYgcGVuZGluZ1Rvb2xzLnNvbWUodG9vbCA9PiB0b29sID09PSBub2RlVG9vbClcbiAgY29uc3QgaGFzTXVsdGlwbGVTdXJmYWNlcyA9IChwYXJhbXMudWlTdXJmYWNlcz8ubGVuZ3RoID8/IDApID49IDJcbiAgY29uc3QgbWVzc2FnZXNNYXRjaCA9IGFjdGl2aXR5TXNnLmxlbmd0aCA+IDAgJiYgYmFja2VuZE1zZy5sZW5ndGggPiAwICYmIGFjdGl2aXR5TXNnID09PSBiYWNrZW5kTXNnXG5cbiAgaWYgKCF0b29sT3ZlcmxhcCAmJiAhKGhhc011bHRpcGxlU3VyZmFjZXMgJiYgbWVzc2FnZXNNYXRjaCkpIHJldHVyblxuXG4gIHN0cmVhbURlYnVnV2FybihwYXJhbXMuc2NvcGUsICdoaXRsLXVpLW92ZXJsYXAtc3VzcGVjdCcsIHtcbiAgICBzb3VyY2U6IHBhcmFtcy5zb3VyY2UsXG4gICAgdWlTdXJmYWNlczogcGFyYW1zLnVpU3VyZmFjZXMsXG4gICAgcGVuZGluZ1Rvb2xzLFxuICAgIG5vZGVUb29sLFxuICAgIGJhY2tlbmRNZXNzYWdlOiBzYWZlU3RyaW5nKHBhcmFtcy5ub2RlUGF5bG9hZD8ubWVzc2FnZSwgMTIwKSxcbiAgICBhY3Rpdml0eU1lc3NhZ2U6IHNhZmVTdHJpbmcocGFyYW1zLmFjdGl2aXR5TWVzc2FnZSwgMTIwKSxcbiAgICBtZXNzYWdlc01hdGNoLFxuICAgIGhpdGxDb250ZXh0OiBzdW1tYXJpemVIaXRsQ29udGV4dChwYXJh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WCxxQkFBQSxJQUFBQyxvQkFBQSxHQUFHVCxNQUFNLENBQUNjLFdBQVcsY0FBQUwsb0JBQUEsZ0JBQUFBLG9CQUFBLEdBQWxCQSxvQkFBQSxDQUFvQnZFLE9BQU8sY0FBQXVFLG9CQUFBLHVCQUEzQkEsb0JBQUEsQ0FBNkJRLElBQUksQ0FBQyxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDLGNBQUFWLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksRUFBRTtFQUUxRSxJQUFNWSxXQUFXLEdBQUdQLFFBQVEsSUFBSUEsUUFBUSxLQUFLLFVBQVUsSUFBSWpFLFlBQVksQ0FBQ3lFLElBQUksQ0FBQyxVQUFBQyxJQUFJO0lBQUEsT0FBSUEsSUFBSSxLQUFLVCxRQUFRO0VBQUEsRUFBQztFQUN2RyxJQUFNVSxtQkFBbUIsR0FBRyxFQUFBYixxQkFBQSxJQUFBQyxrQkFBQSxHQUFDWCxNQUFNLENBQUN3QixVQUFVLGNBQUFiLGtCQUFBLHVCQUFqQkEsa0JBQUEsQ0FBbUIvRixNQUFNLGNBQUE4RixxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLENBQUMsS0FBSyxDQUFDO0VBQ2pFLElBQU1lLGFBQWEsR0FBR1YsV0FBVyxDQUFDbkcsTUFBTSxHQUFHLENBQUMsSUFBSXVHLFVBQVUsQ0FBQ3ZHLE1BQU0sR0FBRyxDQUFDLElBQUltRyxXQUFXLEtBQUtJLFVBQVU7RUFFbkcsSUFBSSxDQUFDQyxXQUFXLElBQUksRUFBRUcsbUJBQW1CLElBQUlFLGFBQWEsQ0FBQyxFQUFFO0VBRTdEMUMsZUFBZSxDQUFDaUIsTUFBTSxDQUFDckIsS0FBSyxFQUFFLHlCQUF5QixFQUFFO0lBQ3ZEK0MsTUFBTSxFQUFFMUIsTUFBTSxDQUFDMEIsTUFBTTtJQUNyQkYsVUFBVSxFQUFFeEIsTUFBTSxDQUFDd0IsVUFBVTtJQUM3QjVFLFlBQVksRUFBWkEsWUFBWTtJQUNaaUUsUUFBUSxFQUFSQSxRQUFRO0lBQ1JqQixjQUFjLEVBQUVwRixVQUFVLEVBQUFvRyxvQkFBQSxHQUFDWixNQUFNLENBQUNjLFdBQVcsY0FBQUYsb0JBQUEsdUJBQWxCQSxvQkFBQSxDQUFvQjFFLE9BQU8sRUFBRSxHQUFHLENBQUM7SUFDNUQ4RSxlQUFlLEVBQUV4RyxVQUFVLENBQUN3RixNQUFNLENBQUNnQixlQUFlLEVBQUUsR0FBRyxDQUFDO0lBQ3hEUyxhQUFhLEVBQWJBLGFBQWE7SUFDYm5DLFdBQVcsRUFBRWpELG9CQUFvQixDQUFDMkQsTUFBTSxDQUFDVixXQUFXO0VBQ3RELENBQUMsQ0FBQztBQUNKLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -1,136 +0,0 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
- import { resolveHitlNodeStreamActivity } from './streamActivityMessages';
6
- import { streamDebugLog } from './streamDebugLog';
7
- var executionStepCounter = 0;
8
- var nextStepId = function nextStepId() {
9
- executionStepCounter += 1;
10
- return "exec-step-".concat(executionStepCounter);
11
- };
12
- export var resetExecutionStepCounter = function resetExecutionStepCounter() {
13
- executionStepCounter = 0;
14
- };
15
- var completeRunningSteps = function completeRunningSteps(steps) {
16
- return steps.map(function (step) {
17
- return step.status === 'running' ? _objectSpread(_objectSpread({}, step), {}, {
18
- status: 'completed'
19
- }) : step;
20
- });
21
- };
22
- export var completeRunningStepsInSteps = completeRunningSteps;
23
- export var completeAllExecutionSteps = function completeAllExecutionSteps(steps) {
24
- return steps.map(function (step) {
25
- return _objectSpread(_objectSpread({}, step), {}, {
26
- status: 'completed'
27
- });
28
- });
29
- };
30
- export var getRunningExecutionSteps = function getRunningExecutionSteps(steps) {
31
- return steps.filter(function (step) {
32
- return step.status === 'running';
33
- });
34
- };
35
- export var shouldShowExecutionTrace = function shouldShowExecutionTrace(steps) {
36
- if (!(steps !== null && steps !== void 0 && steps.length)) return false;
37
- var running = getRunningExecutionSteps(steps);
38
- if (running.length === steps.length) return running.length >= 1;
39
- if (steps.length >= 2) return true;
40
- return steps.some(function (step) {
41
- return step.status === 'completed';
42
- });
43
- };
44
- export var resolveStepMessageFromNode = function resolveStepMessageFromNode(payload, t, context, threadId) {
45
- var activity = resolveHitlNodeStreamActivity(payload.message, t, context, threadId !== null && threadId !== void 0 ? threadId : payload.thread_id);
46
- return activity.message;
47
- };
48
- export var pushExecutionStepFromNode = function pushExecutionStepFromNode(currentSteps, payload, t, context, threadId) {
49
- var _context$pendingActio, _payload$tool_name;
50
- var message = resolveStepMessageFromNode(payload, t, context, threadId);
51
- var completedPrevious = completeRunningSteps(currentSteps);
52
-
53
- // continue-thread: el backend envía `resuming` y enseguida el node de la tool
54
- // con el mismo mensaje legible. Omitimos `resuming` para no duplicar el indicador.
55
- if (payload.node === 'resuming' && context !== null && context !== void 0 && (_context$pendingActio = context.pendingActions) !== null && _context$pendingActio !== void 0 && _context$pendingActio.length) {
56
- streamDebugLog('executionSteps', 'skip:resuming-with-hitl-context', {
57
- message: message,
58
- pendingTools: context.pendingActions.map(function (action) {
59
- return action.tool_name;
60
- })
61
- });
62
- return completedPrevious;
63
- }
64
- if (payload.node !== 'resuming') {
65
- var _lastStep = completedPrevious[completedPrevious.length - 1];
66
- if ((_lastStep === null || _lastStep === void 0 ? void 0 : _lastStep.node) === 'resuming' && _lastStep.message.trim().toLowerCase() === message.trim().toLowerCase()) {
67
- streamDebugLog('executionSteps', 'replace:redundant-resuming', {
68
- resumingMessage: _lastStep.message,
69
- toolNode: payload.node,
70
- toolName: payload.tool_name
71
- });
72
- completedPrevious = completedPrevious.slice(0, -1);
73
- }
74
- }
75
- var toolName = (_payload$tool_name = payload.tool_name) !== null && _payload$tool_name !== void 0 ? _payload$tool_name : payload.node !== 'resuming' ? payload.node : undefined;
76
- var lastStep = completedPrevious[completedPrevious.length - 1];
77
- if ((lastStep === null || lastStep === void 0 ? void 0 : lastStep.status) === 'running' && lastStep.toolName === toolName && lastStep.message.trim().toLowerCase() === message.trim().toLowerCase()) {
78
- streamDebugLog('executionSteps', 'skip:duplicate-running', {
79
- node: payload.node,
80
- toolName: toolName,
81
- message: message
82
- });
83
- return completedPrevious;
84
- }
85
- var newStep = {
86
- id: nextStepId(),
87
- message: message,
88
- node: payload.node,
89
- toolName: toolName,
90
- status: 'running'
91
- };
92
- var nextSteps = [].concat(_toConsumableArray(completedPrevious), [newStep]);
93
- streamDebugLog('executionSteps', 'push', {
94
- node: payload.node,
95
- toolName: newStep.toolName,
96
- message: newStep.message,
97
- stepCount: nextSteps.length,
98
- hasHitlContext: Boolean(context)
99
- });
100
- return nextSteps;
101
- };
102
-
103
- /** Al iniciar token/content: marca tools como completadas y agrega/actualiza el paso de escritura. */
104
- export var finalizeExecutionStepsForWriting = function finalizeExecutionStepsForWriting(currentSteps, writingMessage) {
105
- var completed = completeRunningSteps(currentSteps);
106
- var writingIndex = completed.findIndex(function (step) {
107
- return step.node === '__writing__';
108
- });
109
- if (writingIndex >= 0) {
110
- return completed.map(function (step, index) {
111
- return index === writingIndex ? _objectSpread(_objectSpread({}, step), {}, {
112
- message: writingMessage,
113
- status: 'running'
114
- }) : step;
115
- });
116
- }
117
- return [].concat(_toConsumableArray(completed), [{
118
- id: nextStepId(),
119
- message: writingMessage,
120
- node: '__writing__',
121
- status: 'running'
122
- }]);
123
- };
124
- export var mergeActivityWithExecutionSteps = function mergeActivityWithExecutionSteps(activity, steps) {
125
- return _objectSpread(_objectSpread({}, activity), {}, {
126
- executionSteps: steps.length > 0 ? steps : undefined
127
- });
128
- };
129
- export var getActiveExecutionStep = function getActiveExecutionStep(steps) {
130
- if (!steps.length) return null;
131
- var running = _toConsumableArray(steps).reverse().find(function (step) {
132
- return step.status === 'running';
133
- });
134
- return running !== null && running !== void 0 ? running : steps[steps.length - 1];
135
- };
136
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSIsInN0cmVhbURlYnVnTG9nIiwiZXhlY3V0aW9uU3RlcENvdW50ZXIiLCJuZXh0U3RlcElkIiwiY29uY2F0IiwicmVzZXRFeGVjdXRpb25TdGVwQ291bnRlciIsImNvbXBsZXRlUnVubmluZ1N0ZXBzIiwic3RlcHMiLCJtYXAiLCJzdGVwIiwic3RhdHVzIiwiX29iamVjdFNwcmVhZCIsImNvbXBsZXRlUnVubmluZ1N0ZXBzSW5TdGVwcyIsImNvbXBsZXRlQWxsRXhlY3V0aW9uU3RlcHMiLCJnZXRSdW5uaW5nRXhlY3V0aW9uU3RlcHMiLCJmaWx0ZXIiLCJzaG91bGRTaG93RXhlY3V0aW9uVHJhY2UiLCJsZW5ndGgiLCJydW5uaW5nIiwic29tZSIsInJlc29sdmVTdGVwTWVzc2FnZUZyb21Ob2RlIiwicGF5bG9hZCIsInQiLCJjb250ZXh0IiwidGhyZWFkSWQiLCJhY3Rpdml0eSIsIm1lc3NhZ2UiLCJ0aHJlYWRfaWQiLCJwdXNoRXhlY3V0aW9uU3RlcEZyb21Ob2RlIiwiY3VycmVudFN0ZXBzIiwiX2NvbnRleHQkcGVuZGluZ0FjdGlvIiwiX3BheWxvYWQkdG9vbF9uYW1lIiwiY29tcGxldGVkUHJldmlvdXMiLCJub2RlIiwicGVuZGluZ0FjdGlvbnMiLCJwZW5kaW5nVG9vbHMiLCJhY3Rpb24iLCJ0b29sX25hbWUiLCJsYXN0U3RlcCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInJlc3VtaW5nTWVzc2FnZSIsInRvb2xOb2RlIiwidG9vbE5hbWUiLCJzbGljZSIsInVuZGVmaW5lZCIsIm5ld1N0ZXAiLCJpZCIsIm5leHRTdGVwcyIsIl90b0NvbnN1bWFibGVBcnJheSIsInN0ZXBDb3VudCIsImhhc0hpdGxDb250ZXh0IiwiQm9vbGVhbiIsImZpbmFsaXplRXhlY3V0aW9uU3RlcHNGb3JXcml0aW5nIiwid3JpdGluZ01lc3NhZ2UiLCJjb21wbGV0ZWQiLCJ3cml0aW5nSW5kZXgiLCJmaW5kSW5kZXgiLCJpbmRleCIsIm1lcmdlQWN0aXZpdHlXaXRoRXhlY3V0aW9uU3RlcHMiLCJleGVjdXRpb25TdGVwcyIsImdldEFjdGl2ZUV4ZWN1dGlvblN0ZXAiLCJyZXZlcnNlIiwiZmluZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zdHJlYW1FeGVjdXRpb25TdGVwcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cmVhbUV4ZWN1dGlvblN0ZXAsIFN0cmVhbU5vZGVFdmVudFBheWxvYWQsIFN0cmVhbUFjdGl2aXR5IH0gZnJvbSAnLi4vdHlwZXMvc3RyZWFtQWN0aXZpdHknXG5pbXBvcnQgdHlwZSB7IEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkgfSBmcm9tICcuL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBzdHJlYW1EZWJ1Z0xvZyB9IGZyb20gJy4vc3RyZWFtRGVidWdMb2cnXG5cbnR5cGUgVHJhbnNsYXRlRm4gPSAoa2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuXG5sZXQgZXhlY3V0aW9uU3RlcENvdW50ZXIgPSAwXG5cbmNvbnN0IG5leHRTdGVwSWQgPSAoKTogc3RyaW5nID0+IHtcbiAgZXhlY3V0aW9uU3RlcENvdW50ZXIgKz0gMVxuICByZXR1cm4gYGV4ZWMtc3RlcC0ke2V4ZWN1dGlvblN0ZXBDb3VudGVyfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2V0RXhlY3V0aW9uU3RlcENvdW50ZXIgPSAoKTogdm9pZCA9PiB7XG4gIGV4ZWN1dGlvblN0ZXBDb3VudGVyID0gMFxufVxuXG5jb25zdCBjb21wbGV0ZVJ1bm5pbmdTdGVwcyA9IChzdGVwczogU3RyZWFtRXhlY3V0aW9uU3RlcFtdKTogU3RyZWFtRXhlY3V0aW9uU3RlcFtdID0+XG4gIHN0ZXBzLm1hcChzdGVwID0+IChzdGVwLnN0YXR1cyA9PT0gJ3J1bm5pbmcnID8geyAuLi5zdGVwLCBzdGF0dXM6ICdjb21wbGV0ZWQnIGFzIGNvbnN0IH0gOiBzdGVwKSlcblxuZXhwb3J0IGNvbnN0IGNvbXBsZXRlUnVubmluZ1N0ZXBzSW5TdGVwcyA9IGNvbXBsZXRlUnVubmluZ1N0ZXBzXG5cbmV4cG9ydCBjb25zdCBjb21wbGV0ZUFsbEV4ZWN1dGlvblN0ZXBzID0gKHN0ZXBzOiBTdHJlYW1FeGVjdXRpb25TdGVwW10pOiBTdHJlYW1FeGVjdXRpb25TdGVwW10gPT5cbiAgc3RlcHMubWFwKHN0ZXAgPT4gKHsgLi4uc3RlcCwgc3RhdHVzOiAnY29tcGxldGVkJyBhcyBjb25zdCB9KSlcblxuZXhwb3J0IGNvbnN0IGdldFJ1bm5pbmdFeGVjdXRpb25TdGVwcyA9IChzdGVwczogU3RyZWFtRXhlY3V0aW9uU3RlcFtdKTogU3RyZWFtRXhlY3V0aW9uU3RlcFtdID0+XG4gIHN0ZXBzLmZpbHRlcihzdGVwID0+IHN0ZXAuc3RhdHVzID09PSAncnVubmluZycpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTaG93RXhlY3V0aW9uVHJhY2UgPSAoc3RlcHM6IFN0cmVhbUV4ZWN1dGlvblN0ZXBbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIXN0ZXBzPy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBjb25zdCBydW5uaW5nID0gZ2V0UnVubmluZ0V4ZWN1dGlvblN0ZXBzKHN0ZXBzKVxuICBpZiAocnVubmluZy5sZW5ndGggPT09IHN0ZXBzLmxlbmd0aCkgcmV0dXJuIHJ1bm5pbmcubGVuZ3RoID49IDFcbiAgaWYgKHN0ZXBzLmxlbmd0aCA+PSAyKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gc3RlcHMuc29tZShzdGVwID0+IHN0ZXAuc3RhdHVzID09PSAnY29tcGxldGVkJylcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdGVwTWVzc2FnZUZyb21Ob2RlID0gKFxuICBwYXlsb2FkOiBTdHJlYW1Ob2RlRXZlbnRQYXlsb2FkLFxuICB0OiBUcmFuc2xhdGVGbixcbiAgY29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbCxcbiAgdGhyZWFkSWQ/OiBzdHJpbmdcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGFjdGl2aXR5ID0gcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkocGF5bG9hZC5tZXNzYWdlLCB0LCBjb250ZXh0LCB0aHJlYWRJZCA/PyBwYXlsb2FkLnRocmVhZF9pZClcbiAgcmV0dXJuIGFjdGl2aXR5Lm1lc3NhZ2Vcbn1cblxuZXhwb3J0IGNvbnN0IHB1c2hFeGVjdXRpb25TdGVwRnJvbU5vZGUgPSAoXG4gIGN1cnJlbnRTdGVwczogU3RyZWFtRXhlY3V0aW9uU3RlcFtdLFxuICBwYXlsb2FkOiBTdHJlYW1Ob2RlRXZlbnRQYXlsb2FkLFxuICB0OiBUcmFuc2xhdGVGbixcbiAgY29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbCxcbiAgdGhyZWFkSWQ/OiBzdHJpbmdcbik6IFN0cmVhbUV4ZWN1dGlvblN0ZXBbXSA9PiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSByZXNvbHZlU3RlcE1lc3NhZ2VGcm9tTm9kZShwYXlsb2FkLCB0LCBjb250ZXh0LCB0aHJlYWRJZClcbiAgbGV0IGNvbXBsZXRlZFByZXZpb3VzID0gY29tcGxldGVSdW5uaW5nU3RlcHMoY3VycmVudFN0ZXBzKVxuXG4gIC8vIGNvbnRpbnVlLXRocmVhZDogZWwgYmFja2VuZCBlbnbDrWEgYHJlc3VtaW5nYCB5IGVuc2VndWlkYSBlbCBub2RlIGRlIGxhIHRvb2xcbiAgLy8gY29uIGVsIG1pc21vIG1lbnNhamUgbGVnaWJsZS4gT21pdGltb3MgYHJlc3VtaW5nYCBwYXJhIG5vIGR1cGxpY2FyIGVsIGluZGljYWRvci5cbiAgaWYgKHBheWxvYWQubm9kZSA9PT0gJ3Jlc3VtaW5nJyAmJiBjb250ZXh0Py5wZW5kaW5nQWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgc3RyZWFtRGVidWdMb2coJ2V4ZWN1dGlvblN0ZXBzJywgJ3NraXA6cmVzdW1pbmctd2l0aC1oaXRsLWNvbnRleHQnLCB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgcGVuZGluZ1Rvb2xzOiBjb250ZXh0LnBlbmRpbmdBY3Rpb25zLm1hcChhY3Rpb24gPT4gYWN0aW9uLnRvb2xfbmFtZSksXG4gICAgfSlcbiAgICByZXR1cm4gY29tcGxldGVkUHJldmlvdXNcbiAgfVxuXG4gIGlmIChwYXlsb2FkLm5vZGUgIT09ICdyZXN1bWluZycpIHtcbiAgICBjb25zdCBsYXN0U3RlcCA9IGNvbXBsZXRlZFByZXZpb3VzW2NvbXBsZXRlZFByZXZpb3VzLmxlbmd0aCAtIDFdXG4gICAgaWYgKGxhc3RTdGVwPy5ub2RlID09PSAncmVzdW1pbmcnICYmIGxhc3RTdGVwLm1lc3NhZ2UudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IG1lc3NhZ2UudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHN0cmVhbURlYnVnTG9nKCdleGVjdXRpb25TdGVwcycsICdyZXBsYWNlOnJlZHVuZGFudC1yZXN1bWluZycsIHtcbiAgICAgICAgcmVzdW1pbmdNZXNzYWdlOiBsYXN0U3RlcC5tZXNzYWdlLFxuICAgICAgICB0b29sTm9kZTogcGF5bG9hZC5ub2RlLFxuICAgICAgICB0b29sTmFtZTogcGF5bG9hZC50b29sX25hbWUsXG4gICAgICB9KVxuICAgICAgY29tcGxldGVkUHJldmlvdXMgPSBjb21wbGV0ZWRQcmV2aW91cy5zbGljZSgwLCAtMSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB0b29sTmFtZSA9IHBheWxvYWQudG9vbF9uYW1lID8/IChwYXlsb2FkLm5vZGUgIT09ICdyZXN1bWluZycgPyBwYXlsb2FkLm5vZGUgOiB1bmRlZmluZWQpXG4gIGNvbnN0IGxhc3RTdGVwID0gY29tcGxldGVkUHJldmlvdXNbY29tcGxldGVkUHJldmlvdXMubGVuZ3RoIC0gMV1cbiAgaWYgKFxuICAgIGxhc3RTdGVwPy5zdGF0dXMgPT09ICdydW5uaW5nJyAmJlxuICAgIGxhc3RTdGVwLnRvb2xOYW1lID09PSB0b29sTmFtZSAmJlxuICAgIGxhc3RTdGVwLm1lc3NhZ2UudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IG1lc3NhZ2UudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgKSB7XG4gICAgc3RyZWFtRGVidWdMb2coJ2V4ZWN1dGlvblN0ZXBzJywgJ3NraXA6ZHVwbGljYXRlLXJ1bm5pbmcnLCB7XG4gICAgICBub2RlOiBwYXlsb2FkLm5vZGUsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgfSlcbiAgICByZXR1cm4gY29tcGxldGVkUHJldmlvdXNcbiAgfVxuXG4gIGNvbnN0IG5ld1N0ZXA6IFN0cmVhbUV4ZWN1dGlvblN0ZXAgPSB7XG4gICAgaWQ6IG5leHRTdGVwSWQoKSxcbiAgICBtZXNzYWdlLFxuICAgIG5vZGU6IHBheWxvYWQubm9kZSxcbiAgICB0b29sTmFtZSxcbiAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgfVxuICBjb25zdCBuZXh0U3RlcHMgPSBbLi4uY29tcGxldGVkUHJldmlvdXMsIG5ld1N0ZXBdXG4gIHN0cmVhbURlYnVnTG9nKCdleGVjdXRpb25TdGVwcycsICdwdXNoJywge1xuICAgIG5vZGU6IHBheWxvYWQubm9kZSxcbiAgICB0b29sTmFtZTogbmV3U3RlcC50b29sTmFtZSxcbiAgICBtZXNzYWdlOiBuZXdTdGVwLm1lc3NhZ2UsXG4gICAgc3RlcENvdW50OiBuZXh0U3RlcHMubGVuZ3RoLFxuICAgIGhhc0hpdGxDb250ZXh0OiBCb29sZWFuKGNvbnRleHQpLFxuICB9KVxuICByZXR1cm4gbmV4dFN0ZXBzXG59XG5cbi8qKiBBbCBpbmljaWFyIHRva2VuL2NvbnRlbnQ6IG1hcmNhIHRvb2xzIGNvbW8gY29tcGxldGFkYXMgeSBhZ3JlZ2EvYWN0dWFsaXphIGVsIHBhc28gZGUgZXNjcml0dXJhLiAqL1xuZXhwb3J0IGNvbnN0IGZpbmFsaXplRXhlY3V0aW9uU3RlcHNGb3JXcml0aW5nID0gKFxuICBjdXJyZW50U3RlcHM6IFN0cmVhbUV4ZWN1dGlvblN0ZXBbXSxcbiAgd3JpdGluZ01lc3NhZ2U6IHN0cmluZ1xuKTogU3RyZWFtRXhlY3V0aW9uU3RlcFtdID0+IHtcbiAgY29uc3QgY29tcGxldGVkID0gY29tcGxldGVSdW5uaW5nU3RlcHMoY3VycmVudFN0ZXBzKVxuICBjb25zdCB3cml0aW5nSW5kZXggPSBjb21wbGV0ZWQuZmluZEluZGV4KHN0ZXAgPT4gc3RlcC5ub2RlID09PSAnX193cml0aW5nX18nKVxuXG4gIGlmICh3cml0aW5nSW5kZXggPj0gMCkge1xuICAgIHJldHVybiBjb21wbGV0ZWQubWFwKChzdGVwLCBpbmRleCkgPT5cbiAgICAgIGluZGV4ID09PSB3cml0aW5nSW5kZXggPyB7IC4uLnN0ZXAsIG1lc3NhZ2U6IHdyaXRpbmdNZXNzYWdlLCBzdGF0dXM6ICdydW5uaW5nJyBhcyBjb25zdCB9IDogc3RlcFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgLi4uY29tcGxldGVkLFxuICAgIHtcbiAgICAgIGlkOiBuZXh0U3RlcElkKCksXG4gICAgICBtZXNzYWdlOiB3cml0aW5nTWVzc2FnZSxcbiAgICAgIG5vZGU6ICdfX3dyaXRpbmdfXycsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyBhcyBjb25zdCxcbiAgICB9LFxuICBdXG59XG5cbmV4cG9ydCBjb25zdCBtZXJnZUFjdGl2aXR5V2l0aEV4ZWN1dGlvblN0ZXBzID0gKFxuICBhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHksXG4gIHN0ZXBzOiBTdHJlYW1FeGVjdXRpb25TdGVwW11cbik6IFN0cmVhbUFjdGl2aXR5ID0+ICh7XG4gIC4uLmFjdGl2aXR5LFxuICBleGVjdXRpb25TdGVwczogc3RlcHMubGVuZ3RoID4gMCA/IHN0ZXBzIDogdW5kZWZpbmVkLFxufSlcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZUV4ZWN1dGlvblN0ZXAgPSAoc3RlcHM6IFN0cmVhbUV4ZWN1dGlvblN0ZXBbXSk6IFN0cmVhbUV4ZWN1dGlvblN0ZXAgfCBudWxsID0+IHtcbiAgaWYgKCFzdGVwcy5sZW5ndGgpIHJldHVybiBudWxsXG4gIGNvbnN0IHJ1bm5pbmcgPSBbLi4uc3RlcHNdLnJldmVyc2UoKS5maW5kKHN0ZXAgPT4gc3RlcC5zdGF0dXMgPT09ICdydW5uaW5nJylcbiAgcmV0dXJuIHJ1bm5pbmcgPz8gc3RlcHNbc3RlcHMubGVuZ3RoIC0gMV1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLFNBQVNBLDZCQUE2QixRQUFRLDBCQUEwQjtBQUN4RSxTQUFTQyxjQUFjLFFBQVEsa0JBQWtCO0FBSWpELElBQUlDLG9CQUFvQixHQUFHLENBQUM7QUFFNUIsSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUEsRUFBaUI7RUFDL0JELG9CQUFvQixJQUFJLENBQUM7RUFDekIsb0JBQUFFLE1BQUEsQ0FBb0JGLG9CQUFvQjtBQUMxQyxDQUFDO0FBRUQsT0FBTyxJQUFNRyx5QkFBeUIsR0FBRyxTQUE1QkEseUJBQXlCQSxDQUFBLEVBQWU7RUFDbkRILG9CQUFvQixHQUFHLENBQUM7QUFDMUIsQ0FBQztBQUVELElBQU1JLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUlDLEtBQTRCO0VBQUEsT0FDeERBLEtBQUssQ0FBQ0MsR0FBRyxDQUFDLFVBQUFDLElBQUk7SUFBQSxPQUFLQSxJQUFJLENBQUNDLE1BQU0sS0FBSyxTQUFTLEdBQUFDLGFBQUEsQ0FBQUEsYUFBQSxLQUFRRixJQUFJO01BQUVDLE1BQU0sRUFBRTtJQUFvQixLQUFLRCxJQUFJO0VBQUEsQ0FBQyxDQUFDO0FBQUE7QUFFbkcsT0FBTyxJQUFNRywyQkFBMkIsR0FBR04sb0JBQW9CO0FBRS9ELE9BQU8sSUFBTU8seUJBQXlCLEdBQUcsU0FBNUJBLHlCQUF5QkEsQ0FBSU4sS0FBNEI7RUFBQSxPQUNwRUEsS0FBSyxDQUFDQyxHQUFHLENBQUMsVUFBQUMsSUFBSTtJQUFBLE9BQUFFLGFBQUEsQ0FBQUEsYUFBQSxLQUFVRixJQUFJO01BQUVDLE1BQU0sRUFBRTtJQUFvQjtFQUFBLENBQUcsQ0FBQztBQUFBO0FBRWhFLE9BQU8sSUFBTUksd0JBQXdCLEdBQUcsU0FBM0JBLHdCQUF3QkEsQ0FB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
@@ -1,177 +0,0 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
- import { completeAllExecutionSteps, completeRunningStepsInSteps, pushExecutionStepFromNode } from './streamExecutionSteps';
6
- import { streamDebugLog, streamDebugTimeline } from './streamDebugLog';
7
- var timelineSegmentCounter = 0;
8
- var nextSegmentId = function nextSegmentId(prefix) {
9
- timelineSegmentCounter += 1;
10
- return "".concat(prefix, "-").concat(timelineSegmentCounter);
11
- };
12
- export var resetTimelineSegmentCounter = function resetTimelineSegmentCounter() {
13
- timelineSegmentCounter = 0;
14
- };
15
- export var createEmptyTimelineSnapshot = function createEmptyTimelineSnapshot() {
16
- return {
17
- turnId: null,
18
- segments: [],
19
- contentFrozenLength: 0
20
- };
21
- };
22
- var getLastSegment = function getLastSegment(segments) {
23
- return segments[segments.length - 1];
24
- };
25
- var sealExecutionSegment = function sealExecutionSegment(segment) {
26
- return _objectSpread(_objectSpread({}, segment), {}, {
27
- steps: completeAllExecutionSteps(segment.steps)
28
- });
29
- };
30
- var sealAllExecutionSegments = function sealAllExecutionSegments(segments) {
31
- return segments.map(function (segment) {
32
- return segment.type === 'execution' ? sealExecutionSegment(segment) : segment;
33
- });
34
- };
35
- export var startStreamTimelineTurn = function startStreamTimelineTurn(turnId) {
36
- resetTimelineSegmentCounter();
37
- var snapshot = {
38
- turnId: turnId,
39
- segments: [],
40
- contentFrozenLength: 0
41
- };
42
- streamDebugLog('timeline', 'turn:start', {
43
- turnId: turnId
44
- });
45
- return snapshot;
46
- };
47
- export var appendNodeToStreamTimeline = function appendNodeToStreamTimeline(snapshot, payload, accumulatedText, t, context, threadId) {
48
- var base = snapshot;
49
- var lastBefore = getLastSegment(base.segments);
50
- if ((lastBefore === null || lastBefore === void 0 ? void 0 : lastBefore.type) === 'content') {
51
- base = freezeTimelineContentBoundary(base, accumulatedText);
52
- }
53
- var last = getLastSegment(base.segments);
54
- var segments = base.segments;
55
- if ((last === null || last === void 0 ? void 0 : last.type) === 'content') {
56
- segments = _toConsumableArray(segments);
57
- segments.push({
58
- type: 'execution',
59
- id: nextSegmentId('exec'),
60
- steps: []
61
- });
62
- } else if (!last || last.type !== 'execution') {
63
- segments = [].concat(_toConsumableArray(segments), [{
64
- type: 'execution',
65
- id: nextSegmentId('exec'),
66
- steps: []
67
- }]);
68
- } else {
69
- segments = _toConsumableArray(segments);
70
- }
71
- var executionIndex = segments.length - 1;
72
- var executionSegment = segments[executionIndex];
73
- var steps = pushExecutionStepFromNode(executionSegment.steps, payload, t, context, threadId);
74
- if (steps.length === 0) {
75
- streamDebugLog('timeline', 'node:skip-empty', {
76
- node: payload.node,
77
- tool_name: payload.tool_name
78
- });
79
- return base;
80
- }
81
- segments[executionIndex] = _objectSpread(_objectSpread({}, executionSegment), {}, {
82
- steps: steps
83
- });
84
- var next = _objectSpread(_objectSpread({}, base), {}, {
85
- segments: segments
86
- });
87
- streamDebugTimeline('timeline', 'node:append', next);
88
- streamDebugLog('timeline', 'node:payload', {
89
- node: payload.node,
90
- tool_name: payload.tool_name,
91
- thread_id: threadId !== null && threadId !== void 0 ? threadId : payload.thread_id,
92
- backendMessage: payload.message,
93
- stepCount: steps.length,
94
- hasHitlContext: Boolean(context)
95
- });
96
- return next;
97
- };
98
- export var appendContentToStreamTimeline = function appendContentToStreamTimeline(snapshot, accumulatedText) {
99
- var sliceText = accumulatedText.slice(snapshot.contentFrozenLength);
100
- if (!sliceText && !getLastSegment(snapshot.segments)) {
101
- return snapshot;
102
- }
103
- var segments = snapshot.segments;
104
- var last = getLastSegment(segments);
105
- if ((last === null || last === void 0 ? void 0 : last.type) === 'execution') {
106
- var sealed = sealExecutionSegment(last);
107
- segments = [].concat(_toConsumableArray(segments.slice(0, -1)), [sealed]);
108
- segments.push({
109
- type: 'content',
110
- id: nextSegmentId('content'),
111
- text: sliceText
112
- });
113
- } else if ((last === null || last === void 0 ? void 0 : last.type) === 'content') {
114
- segments = [].concat(_toConsumableArray(segments.slice(0, -1)), [_objectSpread(_objectSpread({}, last), {}, {
115
- text: sliceText
116
- })]);
117
- } else {
118
- segments = [].concat(_toConsumableArray(segments), [{
119
- type: 'content',
120
- id: nextSegmentId('content'),
121
- text: sliceText
122
- }]);
123
- }
124
- var next = _objectSpread(_objectSpread({}, snapshot), {}, {
125
- segments: segments
126
- });
127
- streamDebugTimeline('timeline', 'content:append', next);
128
- return next;
129
- };
130
- export var freezeTimelineContentBoundary = function freezeTimelineContentBoundary(snapshot, accumulatedText) {
131
- return _objectSpread(_objectSpread({}, snapshot), {}, {
132
- contentFrozenLength: accumulatedText.length
133
- });
134
- };
135
- export var finalizeStreamTimeline = function finalizeStreamTimeline(snapshot) {
136
- var next = _objectSpread(_objectSpread({}, snapshot), {}, {
137
- segments: sealAllExecutionSegments(snapshot.segments)
138
- });
139
- streamDebugTimeline('timeline', 'finalize', next);
140
- return next;
141
- };
142
- export var buildActivityFromExecutionSegment = function buildActivityFromExecutionSegment(segment, t) {
143
- var _active$message;
144
- var runningSteps = segment.steps.filter(function (step) {
145
- return step.status === 'running';
146
- });
147
- var active = runningSteps[runningSteps.length - 1];
148
- var message = (_active$message = active === null || active === void 0 ? void 0 : active.message) !== null && _active$message !== void 0 ? _active$message : t('chat.executingAction');
149
- return {
150
- phase: 'action',
151
- message: message,
152
- executionSteps: runningSteps
153
- };
154
- };
155
- export var collectRunningStepsFromTimeline = function collectRunningStepsFromTimeline(segments) {
156
- return segments.filter(function (segment) {
157
- return segment.type === 'execution';
158
- }).flatMap(function (segment) {
159
- return segment.steps.filter(function (step) {
160
- return step.status === 'running';
161
- });
162
- });
163
- };
164
-
165
- /** Cierra steps en ejecución sin crear segmento de contenido (p. ej. al recibir otro node). */
166
- export var completeRunningStepsInTimeline = function completeRunningStepsInTimeline(snapshot) {
167
- var segments = snapshot.segments.map(function (segment) {
168
- if (segment.type !== 'execution') return segment;
169
- return _objectSpread(_objectSpread({}, segment), {}, {
170
- steps: completeRunningStepsInSteps(segment.steps)
171
- });
172
- });
173
- return _objectSpread(_objectSpread({}, snapshot), {}, {
174
- segments: segments
175
- });
176
- };
177
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21wbGV0ZUFsbEV4ZWN1dGlvblN0ZXBzIiwiY29tcGxldGVSdW5uaW5nU3RlcHNJblN0ZXBzIiwicHVzaEV4ZWN1dGlvblN0ZXBGcm9tTm9kZSIsInN0cmVhbURlYnVnTG9nIiwic3RyZWFtRGVidWdUaW1lbGluZSIsInRpbWVsaW5lU2VnbWVudENvdW50ZXIiLCJuZXh0U2VnbWVudElkIiwicHJlZml4IiwiY29uY2F0IiwicmVzZXRUaW1lbGluZVNlZ21lbnRDb3VudGVyIiwiY3JlYXRlRW1wdHlUaW1lbGluZVNuYXBzaG90IiwidHVybklkIiwic2VnbWVudHMiLCJjb250ZW50RnJvemVuTGVuZ3RoIiwiZ2V0TGFzdFNlZ21lbnQiLCJsZW5ndGgiLCJzZWFsRXhlY3V0aW9uU2VnbWVudCIsInNlZ21lbnQiLCJfb2JqZWN0U3ByZWFkIiwic3RlcHMiLCJzZWFsQWxsRXhlY3V0aW9uU2VnbWVudHMiLCJtYXAiLCJ0eXBlIiwic3RhcnRTdHJlYW1UaW1lbGluZVR1cm4iLCJzbmFwc2hvdCIsImFwcGVuZE5vZGVUb1N0cmVhbVRpbWVsaW5lIiwicGF5bG9hZCIsImFjY3VtdWxhdGVkVGV4dCIsInQiLCJjb250ZXh0IiwidGhyZWFkSWQiLCJiYXNlIiwibGFzdEJlZm9yZSIsImZyZWV6ZVRpbWVsaW5lQ29udGVudEJvdW5kYXJ5IiwibGFzdCIsIl90b0NvbnN1bWFibGVBcnJheSIsInB1c2giLCJpZCIsImV4ZWN1dGlvbkluZGV4IiwiZXhlY3V0aW9uU2VnbWVudCIsIm5vZGUiLCJ0b29sX25hbWUiLCJuZXh0IiwidGhyZWFkX2lkIiwiYmFja2VuZE1lc3NhZ2UiLCJtZXNzYWdlIiwic3RlcENvdW50IiwiaGFzSGl0bENvbnRleHQiLCJCb29sZWFuIiwiYXBwZW5kQ29udGVudFRvU3RyZWFtVGltZWxpbmUiLCJzbGljZVRleHQiLCJzbGljZSIsInNlYWxlZCIsInRleHQiLCJmaW5hbGl6ZVN0cmVhbVRpbWVsaW5lIiwiYnVpbGRBY3Rpdml0eUZyb21FeGVjdXRpb25TZWdtZW50IiwiX2FjdGl2ZSRtZXNzYWdlIiwicnVubmluZ1N0ZXBzIiwiZmlsdGVyIiwic3RlcCIsInN0YXR1cyIsImFjdGl2ZSIsInBoYXNlIiwiZXhlY3V0aW9uU3RlcHMiLCJjb2xsZWN0UnVubmluZ1N0ZXBzRnJvbVRpbWVsaW5lIiwiZmxhdE1hcCIsImNvbXBsZXRlUnVubmluZ1N0ZXBzSW5UaW1lbGluZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zdHJlYW1UaW1lbGluZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cmVhbUV4ZWN1dGlvblN0ZXAgfSBmcm9tICcuLi90eXBlcy9zdHJlYW1BY3Rpdml0eSdcbmltcG9ydCB0eXBlIHtcbiAgU3RyZWFtVGltZWxpbmVFeGVjdXRpb25TZWdtZW50LFxuICBTdHJlYW1UaW1lbGluZVNlZ21lbnQsXG4gIFN0cmVhbVRpbWVsaW5lU25hcHNob3QsXG59IGZyb20gJy4uL3R5cGVzL3N0cmVhbVRpbWVsaW5lJ1xuaW1wb3J0IHtcbiAgY29tcGxldGVBbGxFeGVjdXRpb25TdGVwcyxcbiAgY29tcGxldGVSdW5uaW5nU3RlcHNJblN0ZXBzLFxuICBwdXNoRXhlY3V0aW9uU3RlcEZyb21Ob2RlLFxufSBmcm9tICcuL3N0cmVhbUV4ZWN1dGlvblN0ZXBzJ1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1Ob2RlRXZlbnRQYXlsb2FkIH0gZnJvbSAnLi4vdHlwZXMvc3RyZWFtQWN0aXZpdHknXG5pbXBvcnQgdHlwZSB7IEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgc3RyZWFtRGVidWdMb2csIHN0cmVhbURlYnVnVGltZWxpbmUgfSBmcm9tICcuL3N0cmVhbURlYnVnTG9nJ1xuXG50eXBlIFRyYW5zbGF0ZUZuID0gKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcblxubGV0IHRpbWVsaW5lU2VnbWVudENvdW50ZXIgPSAwXG5cbmNvbnN0IG5leHRTZWdtZW50SWQgPSAocHJlZml4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0aW1lbGluZVNlZ21lbnRDb3VudGVyICs9IDFcbiAgcmV0dXJuIGAke3ByZWZpeH0tJHt0aW1lbGluZVNlZ21lbnRDb3VudGVyfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2V0VGltZWxpbmVTZWdtZW50Q291bnRlciA9ICgpOiB2b2lkID0+IHtcbiAgdGltZWxpbmVTZWdtZW50Q291bnRlciA9IDBcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUVtcHR5VGltZWxpbmVTbmFwc2hvdCA9ICgpOiBTdHJlYW1UaW1lbGluZVNuYXBzaG90ID0+ICh7XG4gIHR1cm5JZDogbnVsbCxcbiAgc2VnbWVudHM6IFtdLFxuICBjb250ZW50RnJvemVuTGVuZ3RoOiAwLFxufSlcblxuY29uc3QgZ2V0TGFzdFNlZ21lbnQgPSAoc2VnbWVudHM6IFN0cmVhbVRpbWVsaW5lU2VnbWVudFtdKTogU3RyZWFtVGltZWxpbmVTZWdtZW50IHwgdW5kZWZpbmVkID0+XG4gIHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdXG5cbmNvbnN0IHNlYWxFeGVjdXRpb25TZWdtZW50ID0gKHNlZ21lbnQ6IFN0cmVhbVRpbWVsaW5lRXhlY3V0aW9uU2VnbWVudCk6IFN0cmVhbVRpbWVsaW5lRXhlY3V0aW9uU2VnbWVudCA9PiAoe1xuICAuLi5zZWdtZW50LFxuICBzdGVwczogY29tcGxldGVBbGxFeGVjdXRpb25TdGVwcyhzZWdtZW50LnN0ZXBzKSxcbn0pXG5cbmNvbnN0IHNlYWxBbGxFeGVjdXRpb25TZWdtZW50cyA9IChzZWdtZW50czogU3RyZWFtVGltZWxpbmVTZWdtZW50W10pOiBTdHJlYW1UaW1lbGluZVNlZ21lbnRbXSA9PlxuICBzZWdtZW50cy5tYXAoc2VnbWVudCA9PiAoc2VnbWVudC50eXBlID09PSAnZXhlY3V0aW9uJyA/IHNlYWxFeGVjdXRpb25TZWdtZW50KHNlZ21lbnQpIDogc2VnbWVudCkpXG5cbmV4cG9ydCBjb25zdCBzdGFydFN0cmVhbVRpbWVsaW5lVHVybiA9ICh0dXJuSWQ6IHN0cmluZyk6IFN0cmVhbVRpbWVsaW5lU25hcHNob3QgPT4ge1xuICByZXNldFRpbWVsaW5lU2VnbWVudENvdW50ZXIoKVxuICBjb25zdCBzbmFwc2hvdCA9IHtcbiAgICB0dXJuSWQsXG4gICAgc2VnbWVudHM6IFtdLFxuICAgIGNvbnRlbnRGcm96ZW5MZW5ndGg6IDAsXG4gIH1cbiAgc3RyZWFtRGVidWdMb2coJ3RpbWVsaW5lJywgJ3R1cm46c3RhcnQnLCB7IHR1cm5JZCB9KVxuICByZXR1cm4gc25hcHNob3Rcbn1cblxuZXhwb3J0IGNvbnN0IGFwcGVuZE5vZGVUb1N0cmVhbVRpbWVsaW5lID0gKFxuICBzbmFwc2hvdDogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCxcbiAgcGF5bG9hZDogU3RyZWFtTm9kZUV2ZW50UGF5bG9hZCxcbiAgYWNjdW11bGF0ZWRUZXh0OiBzdHJpbmcsXG4gIHQ6IFRyYW5zbGF0ZUZuLFxuICBjb250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsLFxuICB0aHJlYWRJZD86IHN0cmluZ1xuKTogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCA9PiB7XG4gIGxldCBiYXNlID0gc25hcHNob3RcbiAgY29uc3QgbGFzdEJlZm9yZSA9IGdldExhc3RTZWdtZW50KGJhc2Uuc2VnbWVudHMpXG5cbiAgaWYgKGxhc3RCZWZvcmU/LnR5cGUgPT09ICdjb250ZW50Jykge1xuICAgIGJhc2UgPSBmcmVlemVUaW1lbGluZUNvbnRlbnRCb3VuZGFyeShiYXNlLCBhY2N1bXVsYXRlZFRleHQpXG4gIH1cblxuICBjb25zdCBsYXN0ID0gZ2V0TGFzdFNlZ21lbnQoYmFzZS5zZWdtZW50cylcbiAgbGV0IHNlZ21lbnRzID0gYmFzZS5zZWdtZW50c1xuXG4gIGlmIChsYXN0Py50eXBlID09PSAnY29udGVudCcpIHtcbiAgICBzZWdtZW50cyA9IFsuLi5zZWdtZW50c11cbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHR5cGU6ICdleGVjdXRpb24nLFxuICAgICAgaWQ6IG5leHRTZWdtZW50SWQoJ2V4ZWMnKSxcbiAgICAgIHN0ZXBzOiBbXSxcbiAgICB9KVxuICB9IGVsc2UgaWYgKCFsYXN0IHx8IGxhc3QudHlwZSAhPT0gJ2V4ZWN1dGlvbicpIHtcbiAgICBzZWdtZW50cyA9IFtcbiAgICAgIC4uLnNlZ21lbnRzLFxuICAgICAge1xuICAgICAgICB0eXBlOiAnZXhlY3V0aW9uJyxcbiAgICAgICAgaWQ6IG5leHRTZWdtZW50SWQoJ2V4ZWMnKSxcbiAgICAgICAgc3RlcHM6IFtdLFxuICAgICAgfSxcbiAgICBdXG4gIH0gZWxzZSB7XG4gICAgc2VnbWVudHMgPSBbLi4uc2VnbWVudHNdXG4gIH1cblxuICBjb25zdCBleGVjdXRpb25JbmRleCA9IHNlZ21lbnRzLmxlbmd0aCAtIDFcbiAgY29uc3QgZXhlY3V0aW9uU2VnbWVudCA9IHNlZ21lbnRzW2V4ZWN1dGlvbkluZGV4XSBhcyBTdHJlYW1UaW1lbGluZUV4ZWN1dGlvblNlZ21lbnRcbiAgY29uc3Qgc3RlcHMgPSBwdXNoRXhlY3V0aW9uU3RlcEZyb21Ob2RlKGV4ZWN1dGlvblNlZ21lbnQuc3RlcHMsIHBheWxvYWQsIHQsIGNvbnRleHQsIHRocmVhZElkKVxuXG4gIGlmIChzdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICBzdHJlYW1EZWJ1Z0xvZygndGltZWxpbmUnLCAnbm9kZTpza2lwLWVtcHR5Jywge1xuICAgICAgbm9kZTogcGF5bG9hZC5ub2RlLFxuICAgICAgdG9vbF9uYW1lOiBwYXlsb2FkLnRvb2xfbmFtZSxcbiAgICB9KVxuICAgIHJldHVybiBiYXNlXG4gIH1cblxuICBzZWdtZW50c1tleGVjdXRpb25JbmRleF0gPSB7XG4gICAgLi4uZXhlY3V0aW9uU2VnbWVudCxcbiAgICBzdGVwcyxcbiAgfVxuXG4gIGNvbnN0IG5leHQgPSB7XG4gICAgLi4uYmFzZSxcbiAgICBzZWdtZW50cyxcbiAgfVxuICBzdHJlYW1EZWJ1Z1RpbWVsaW5lKCd0aW1lbGluZScsICdub2RlOmFwcGVuZCcsIG5leHQpXG4gIHN0cmVhbURlYnVnTG9nKCd0aW1lbGluZScsICdub2RlOnBheWxvYWQnLCB7XG4gICAgbm9kZTogcGF5bG9hZC5ub2RlLFxuICAgIHRvb2xfbmFtZTogcGF5bG9hZC50b29sX25hbWUsXG4gICAgdGhyZWFkX2lkOiB0aHJlYWRJZCA/PyBwYXlsb2FkLnRocmVhZF9pZCxcbiAgICBiYWNrZW5kTWVzc2FnZTogcGF5bG9hZC5tZXNzYWdlLFxuICAgIHN0ZXBDb3VudDogc3RlcHMubGVuZ3RoLFxuICAgIGhhc0hpdGxDb250ZXh0OiBCb29sZWFuKGNvbnRleHQpLFxuICB9KVxuICByZXR1cm4gbmV4dFxufVxuXG5leHBvcnQgY29uc3QgYXBwZW5kQ29udGVudFRvU3RyZWFtVGltZWxpbmUgPSAoXG4gIHNuYXBzaG90OiBTdHJlYW1UaW1lbGluZVNuYXBzaG90LFxuICBhY2N1bXVsYXRlZFRleHQ6IHN0cmluZ1xuKTogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCA9PiB7XG4gIGNvbnN0IHNsaWNlVGV4dCA9IGFjY3VtdWxhdGVkVGV4dC5zbGljZShzbmFwc2hvdC5jb250ZW50RnJvemVuTGVuZ3RoKVxuICBpZiAoIXNsaWNlVGV4dCAmJiAhZ2V0TGFzdFNlZ21lbnQoc25hcHNob3Quc2VnbWVudHMpKSB7XG4gICAgcmV0dXJuIHNuYXBzaG90XG4gIH1cblxuICBsZXQgc2VnbWVudHMgPSBzbmFwc2hvdC5zZWdtZW50c1xuICBjb25zdCBsYXN0ID0gZ2V0TGFzdFNlZ21lbnQoc2VnbWVudHMpXG5cbiAgaWYgKGxhc3Q/LnR5cGUgPT09ICdleGVjdXRpb24nKSB7XG4gICAgY29uc3Qgc2VhbGVkID0gc2VhbEV4ZWN1dGlvblNlZ21lbnQobGFzdClcbiAgICBzZWdtZW50cyA9IFsuLi5zZWdtZW50cy5zbGljZSgwLCAtMSksIHNlYWxlZF1cbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHR5cGU6ICdjb250ZW50JyxcbiAgICAgIGlkOiBuZXh0U2VnbWVudElkKCdjb250ZW50JyksXG4gICAgICB0ZXh0OiBzbGljZVRleHQsXG4gICAgfSlcbiAgfSBlbHNlIGlmIChsYXN0Py50eXBlID09PSAnY29udGVudCcpIHtcbiAgICBzZWdtZW50cyA9IFsuLi5zZWdtZW50cy5zbGljZSgwLCAtMSksIHsgLi4ubGFzdCwgdGV4dDogc2xpY2VUZXh0IH1dXG4gIH0gZWxzZSB7XG4gICAgc2VnbWVudHMgPSBbXG4gICAgICAuLi5zZWdtZW50cyxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NvbnRlbnQnLFxuICAgICAgICBpZDogbmV4dFNlZ21lbnRJZCgnY29udGVudCcpLFxuICAgICAgICB0ZXh0OiBzbGljZVRleHQsXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IG5leHQgPSB7XG4gICAgLi4uc25hcHNob3QsXG4gICAgc2VnbWVudHMsXG4gIH1cbiAgc3RyZWFtRGVidWdUaW1lbGluZSgndGltZWxpbmUnLCAnY29udGVudDphcHBlbmQnLCBuZXh0KVxuICByZXR1cm4gbmV4dFxufVxuXG5leHBvcnQgY29uc3QgZnJlZXplVGltZWxpbmVDb250ZW50Qm91bmRhcnkgPSAoXG4gIHNuYXBzaG90OiBTdHJlYW1UaW1lbGluZVNuYXBzaG90LFxuICBhY2N1bXVsYXRlZFRleHQ6IHN0cmluZ1xuKTogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCA9PiAoe1xuICAuLi5zbmFwc2hvdCxcbiAgY29udGVudEZyb3plbkxlbmd0aDogYWNjdW11bGF0ZWRUZXh0Lmxlbmd0aCxcbn0pXG5cbmV4cG9ydCBjb25zdCBmaW5hbGl6ZVN0cmVhbVRpbWVsaW5lID0gKHNuYXBzaG90OiBTdHJlYW1UaW1lbGluZVNuYXBzaG90KTogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCA9PiB7XG4gIGNvbnN0IG5leHQgPSB7XG4gICAgLi4uc25hcHNob3QsXG4gICAgc2VnbWVudHM6IHNlYWxBbGxFeGVjdXRpb25TZWdtZW50cyhzbmFwc2hvdC5zZWdtZW50cyksXG4gIH1cbiAgc3RyZWFtRGVidWdUaW1lbGluZSgndGltZWxpbmUnLCAnZmluYWxpemUnLCBuZXh0KVxuICByZXR1cm4gbmV4dFxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRBY3Rpdml0eUZyb21FeGVjdXRpb25TZWdtZW50ID0gKFxuICBzZWdtZW50OiBTdHJlYW1UaW1lbGluZUV4ZWN1dGlvblNlZ21lbnQsXG4gIHQ6IFRyYW5zbGF0ZUZuXG4pOiB7IHBoYXNlOiAnYWN0aW9uJzsgbWVzc2FnZTogc3RyaW5nOyBleGVjdXRpb25TdGVwczogU3RyZWFtRXhlY3V0aW9uU3RlcFtdIH0gPT4ge1xuICBjb25zdCBydW5uaW5nU3RlcHMgPSBzZWdtZW50LnN0ZXBzLmZpbHRlcihzdGVwID0+IHN0ZXAuc3RhdHVzID09PSAncnVubmluZycpXG4gIGNvbnN0IGFjdGl2ZSA9IHJ1bm5pbmdTdGVwc1tydW5uaW5nU3RlcHMubGVuZ3RoIC0gMV1cbiAgY29uc3QgbWVzc2FnZSA9IGFjdGl2ZT8ubWVzc2FnZSA/PyB0KCdjaGF0LmV4ZWN1dGluZ0FjdGlvbicpXG5cbiAgcmV0dXJuIHtcbiAgICBwaGFzZTogJ2FjdGlvbicsXG4gICAgbWVzc2FnZSxcbiAgICBleGVjdXRpb25TdGVwczogcnVubmluZ1N0ZXBzLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb2xsZWN0UnVubmluZ1N0ZXBzRnJvbVRpbWVsaW5lID0gKHNlZ21lbnRzOiBTdHJlYW1UaW1lbGluZVNlZ21lbnRbXSk6IFN0cmVhbUV4ZWN1dGlvblN0ZXBbXSA9PlxuICBzZWdtZW50c1xuICAgIC5maWx0ZXIoKHNlZ21lbnQpOiBzZWdtZW50IGlzIFN0cmVhbVRpbWVsaW5lRXhlY3V0aW9uU2VnbWVudCA9PiBzZWdtZW50LnR5cGUgPT09ICdleGVjdXRpb24nKVxuICAgIC5mbGF0TWFwKHNlZ21lbnQgPT4gc2VnbWVudC5zdGVwcy5maWx0ZXIoc3RlcCA9PiBzdGVwLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSlcblxuLyoqIENpZXJyYSBzdGVwcyBlbiBlamVjdWNpw7NuIHNpbiBjcmVhciBzZWdtZW50byBkZSBjb250ZW5pZG8gKHAuIGVqLiBhbCByZWNpYmlyIG90cm8gbm9kZSkuICovXG5leHBvcnQgY29uc3QgY29tcGxldGVSdW5uaW5nU3RlcHNJblRpbWVsaW5lID0gKHNuYXBzaG90OiBTdHJlYW1UaW1lbGluZVNuYXBzaG90KTogU3RyZWFtVGltZWxpbmVTbmFwc2hvdCA9PiB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc25hcHNob3Quc2VnbWVudHMubWFwKHNlZ21lbnQgPT4ge1xuICAgIGlmIChzZWdtZW50LnR5cGUgIT09ICdleGVjdXRpb24nKSByZXR1cm4gc2VnbWVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5zZWdtZW50LFxuICAgICAgc3RlcHM6IGNvbXBsZXRlUnVubmluZ1N0ZXBzSW5TdGVwcyhzZWdtZW50LnN0ZXBzKSxcbiAgICB9XG4gIH0pXG4gIHJldHVybiB7IC4uLnNuYXBzaG90LCBzZWdtZW50cyB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFNQSxTQUNFQSx5QkFBeUIsRUFDekJDLDJCQUEyQixFQUMzQkMseUJBQXlCLFFBQ3BCLHdCQUF3QjtBQUcvQixTQUFTQyxjQUFjLEVBQUVDLG1CQUFtQixRQUFRLGtCQUFrQjtBQUl0RSxJQUFJQyxzQkFBc0IsR0FBRyxDQUFDO0FBRTlCLElBQU1DLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBSUMsTUFBYyxFQUFhO0VBQ2hERixzQkFBc0IsSUFBSSxDQUFDO0VBQzNCLFVBQUFHLE1BQUEsQ0FBVUQsTUFBTSxPQUFBQyxNQUFBLENBQUlILHNCQUFzQjtBQUM1QyxDQUFDO0FBRUQsT0FBTyxJQUFNSSwyQkFBMkIsR0FBRyxTQUE5QkEsMkJBQTJCQSxDQUFBLEVBQWU7RUFDckRKLHNCQUFzQixHQUFHLENBQUM7QUFDNUIsQ0FBQztBQUVELE9BQU8sSUFBTUssMkJBQTJCLEdBQUcsU0FBOUJBLDJCQUEyQkEsQ0FBQTtFQUFBLE9BQWtDO0lBQ3hFQyxNQUFNLEVBQUUsSUFBSTtJQUNaQyxRQUFRLEVBQUUsRUFBRTtJQUNaQyxtQkFBbUIsRUFBRTtF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