@corenel/web-ui 0.13.3 → 0.14.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.
- package/dist/Composer.d.ts +30 -1
- package/dist/Composer.d.ts.map +1 -1
- package/dist/Composer.js +111 -19
- package/dist/Composer.js.map +1 -1
- package/dist/ContextBar.d.ts +9 -3
- package/dist/ContextBar.d.ts.map +1 -1
- package/dist/ContextBar.js +14 -7
- package/dist/ContextBar.js.map +1 -1
- package/dist/ContextManager.d.ts +10 -2
- package/dist/ContextManager.d.ts.map +1 -1
- package/dist/ContextManager.js +14 -10
- package/dist/ContextManager.js.map +1 -1
- package/dist/DictateButton.d.ts +21 -1
- package/dist/DictateButton.d.ts.map +1 -1
- package/dist/DictateButton.js +73 -10
- package/dist/DictateButton.js.map +1 -1
- package/dist/PickChips.d.ts +6 -0
- package/dist/PickChips.d.ts.map +1 -0
- package/dist/PickChips.js +55 -0
- package/dist/PickChips.js.map +1 -0
- package/dist/ProcessDock.d.ts +10 -0
- package/dist/ProcessDock.d.ts.map +1 -1
- package/dist/ProcessDock.js +24 -1
- package/dist/ProcessDock.js.map +1 -1
- package/dist/RichContent.d.ts.map +1 -1
- package/dist/RichContent.js +102 -24
- package/dist/RichContent.js.map +1 -1
- package/dist/SummaryTranscript.d.ts +5 -1
- package/dist/SummaryTranscript.d.ts.map +1 -1
- package/dist/SummaryTranscript.js +5 -3
- package/dist/SummaryTranscript.js.map +1 -1
- package/dist/TodoBar.d.ts +2 -0
- package/dist/TodoBar.d.ts.map +1 -1
- package/dist/TodoBar.js +8 -0
- package/dist/TodoBar.js.map +1 -1
- package/dist/TodoLine.d.ts +11 -0
- package/dist/TodoLine.d.ts.map +1 -0
- package/dist/TodoLine.js +55 -0
- package/dist/TodoLine.js.map +1 -0
- package/dist/ToolFold.js +1 -1
- package/dist/ToolFold.js.map +1 -1
- package/dist/Transcript.d.ts +19 -1
- package/dist/Transcript.d.ts.map +1 -1
- package/dist/Transcript.js +127 -58
- package/dist/Transcript.js.map +1 -1
- package/dist/agentChat/AgentChat.d.ts +42 -0
- package/dist/agentChat/AgentChat.d.ts.map +1 -1
- package/dist/agentChat/AgentChat.js +573 -100
- package/dist/agentChat/AgentChat.js.map +1 -1
- package/dist/agentChat/ChatSettingsSheet.d.ts +9 -0
- package/dist/agentChat/ChatSettingsSheet.d.ts.map +1 -0
- package/dist/agentChat/ChatSettingsSheet.js +103 -0
- package/dist/agentChat/ChatSettingsSheet.js.map +1 -0
- package/dist/agentChat/OptionsDrawer.d.ts +8 -0
- package/dist/agentChat/OptionsDrawer.d.ts.map +1 -1
- package/dist/agentChat/OptionsDrawer.js +24 -215
- package/dist/agentChat/OptionsDrawer.js.map +1 -1
- package/dist/agentChat/PlanReview.d.ts +1 -1
- package/dist/agentChat/PlanReview.d.ts.map +1 -1
- package/dist/agentChat/PlanReview.js +1 -1
- package/dist/agentChat/PlanReview.js.map +1 -1
- package/dist/agentChat/SourceGroups.d.ts +24 -0
- package/dist/agentChat/SourceGroups.d.ts.map +1 -0
- package/dist/agentChat/SourceGroups.js +117 -0
- package/dist/agentChat/SourceGroups.js.map +1 -0
- package/dist/agentChat/controller.d.ts +30 -1
- package/dist/agentChat/controller.d.ts.map +1 -1
- package/dist/agentChat/controller.js.map +1 -1
- package/dist/agentChat/pendingQueue.d.ts +4 -0
- package/dist/agentChat/pendingQueue.d.ts.map +1 -1
- package/dist/agentChat/pendingQueue.js +7 -0
- package/dist/agentChat/pendingQueue.js.map +1 -1
- package/dist/agentChat/planTool.d.ts +4 -0
- package/dist/agentChat/planTool.d.ts.map +1 -0
- package/dist/agentChat/planTool.js +4 -0
- package/dist/agentChat/planTool.js.map +1 -0
- package/dist/agentChat/testSheetHost.d.ts +3 -0
- package/dist/agentChat/testSheetHost.d.ts.map +1 -0
- package/dist/agentChat/testSheetHost.js +9 -0
- package/dist/agentChat/testSheetHost.js.map +1 -0
- package/dist/agentChat/useChatOptions.d.ts +63 -0
- package/dist/agentChat/useChatOptions.d.ts.map +1 -0
- package/dist/agentChat/useChatOptions.js +156 -0
- package/dist/agentChat/useChatOptions.js.map +1 -0
- package/dist/chatRefreshContext.d.ts +8 -0
- package/dist/chatRefreshContext.d.ts.map +1 -0
- package/dist/chatRefreshContext.js +14 -0
- package/dist/chatRefreshContext.js.map +1 -0
- package/dist/chatSkinContext.d.ts +13 -6
- package/dist/chatSkinContext.d.ts.map +1 -1
- package/dist/chatSkinContext.js +18 -4
- package/dist/chatSkinContext.js.map +1 -1
- package/dist/chatSkinCss.d.ts.map +1 -1
- package/dist/chatSkinCss.js +108 -22
- package/dist/chatSkinCss.js.map +1 -1
- package/dist/composerAction.d.ts +16 -0
- package/dist/composerAction.d.ts.map +1 -0
- package/dist/composerAction.js +20 -0
- package/dist/composerAction.js.map +1 -0
- package/dist/composerHistory.d.ts.map +1 -1
- package/dist/composerHistory.js +4 -1
- package/dist/composerHistory.js.map +1 -1
- package/dist/fx/LiveAnswer.d.ts.map +1 -1
- package/dist/fx/LiveAnswer.js +324 -59
- package/dist/fx/LiveAnswer.js.map +1 -1
- package/dist/fx/arrivalModes.d.ts +17 -2
- package/dist/fx/arrivalModes.d.ts.map +1 -1
- package/dist/fx/arrivalModes.js +46 -4
- package/dist/fx/arrivalModes.js.map +1 -1
- package/dist/fx/pacer.d.ts +41 -0
- package/dist/fx/pacer.d.ts.map +1 -0
- package/dist/fx/pacer.js +66 -0
- package/dist/fx/pacer.js.map +1 -0
- package/dist/fx/useReveal.d.ts +16 -1
- package/dist/fx/useReveal.d.ts.map +1 -1
- package/dist/fx/useReveal.js +101 -41
- package/dist/fx/useReveal.js.map +1 -1
- package/dist/localAddress.d.ts +2 -0
- package/dist/localAddress.d.ts.map +1 -0
- package/dist/localAddress.js +56 -0
- package/dist/localAddress.js.map +1 -0
- package/dist/steps/AfterReply.d.ts +67 -0
- package/dist/steps/AfterReply.d.ts.map +1 -0
- package/dist/steps/AfterReply.js +217 -0
- package/dist/steps/AfterReply.js.map +1 -0
- package/dist/steps/ChatApproval.d.ts +18 -0
- package/dist/steps/ChatApproval.d.ts.map +1 -0
- package/dist/steps/ChatApproval.js +35 -0
- package/dist/steps/ChatApproval.js.map +1 -0
- package/dist/steps/Delegation.d.ts +77 -0
- package/dist/steps/Delegation.d.ts.map +1 -0
- package/dist/steps/Delegation.js +188 -0
- package/dist/steps/Delegation.js.map +1 -0
- package/dist/steps/LiveRail.d.ts +14 -0
- package/dist/steps/LiveRail.d.ts.map +1 -0
- package/dist/steps/LiveRail.js +16 -0
- package/dist/steps/LiveRail.js.map +1 -0
- package/dist/steps/StepDetail.d.ts +23 -0
- package/dist/steps/StepDetail.d.ts.map +1 -0
- package/dist/steps/StepDetail.js +195 -0
- package/dist/steps/StepDetail.js.map +1 -0
- package/dist/steps/StepDetailHost.d.ts +54 -0
- package/dist/steps/StepDetailHost.d.ts.map +1 -0
- package/dist/steps/StepDetailHost.js +175 -0
- package/dist/steps/StepDetailHost.js.map +1 -0
- package/dist/steps/StepRail.d.ts +38 -0
- package/dist/steps/StepRail.d.ts.map +1 -0
- package/dist/steps/StepRail.js +238 -0
- package/dist/steps/StepRail.js.map +1 -0
- package/dist/steps/approval.d.ts +73 -0
- package/dist/steps/approval.d.ts.map +1 -0
- package/dist/steps/approval.js +81 -0
- package/dist/steps/approval.js.map +1 -0
- package/dist/steps/model.d.ts +140 -0
- package/dist/steps/model.d.ts.map +1 -0
- package/dist/steps/model.js +433 -0
- package/dist/steps/model.js.map +1 -0
- package/dist/steps/outcome.d.ts +5 -0
- package/dist/steps/outcome.d.ts.map +1 -0
- package/dist/steps/outcome.js +34 -0
- package/dist/steps/outcome.js.map +1 -0
- package/dist/steps/peek.d.ts +35 -0
- package/dist/steps/peek.d.ts.map +1 -0
- package/dist/steps/peek.js +219 -0
- package/dist/steps/peek.js.map +1 -0
- package/dist/steps/plan.d.ts +50 -0
- package/dist/steps/plan.d.ts.map +1 -0
- package/dist/steps/plan.js +242 -0
- package/dist/steps/plan.js.map +1 -0
- package/dist/steps/useRailDetail.d.ts +25 -0
- package/dist/steps/useRailDetail.d.ts.map +1 -0
- package/dist/steps/useRailDetail.js +108 -0
- package/dist/steps/useRailDetail.js.map +1 -0
- package/dist/steps/words.d.ts +40 -0
- package/dist/steps/words.d.ts.map +1 -0
- package/dist/steps/words.js +247 -0
- package/dist/steps/words.js.map +1 -0
- package/dist/toolRender.d.ts +27 -1
- package/dist/toolRender.d.ts.map +1 -1
- package/dist/toolRender.js +72 -4
- package/dist/toolRender.js.map +1 -1
- package/dist/transcriptSkin.d.ts.map +1 -1
- package/dist/transcriptSkin.js +66 -0
- package/dist/transcriptSkin.js.map +1 -1
- package/dist/transcriptSkinCss.d.ts +35 -0
- package/dist/transcriptSkinCss.d.ts.map +1 -1
- package/dist/transcriptSkinCss.js +360 -19
- package/dist/transcriptSkinCss.js.map +1 -1
- package/dist/useHoldPress.d.ts +24 -0
- package/dist/useHoldPress.d.ts.map +1 -0
- package/dist/useHoldPress.js +85 -0
- package/dist/useHoldPress.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/* Peeks: the few lines a step shows without opening it.
|
|
2
|
+
*
|
|
3
|
+
* Everything here is cheap on huge input. A command result is read from its end
|
|
4
|
+
* (never split whole), and a written file is never diffed: the peek is its line
|
|
5
|
+
* count and its first few lines. */
|
|
6
|
+
/** How many trailing characters a tail or a count scan will look at. */
|
|
7
|
+
export const TAIL_WINDOW = 8000;
|
|
8
|
+
/** The detail view renders at most this many lines; Copy output still copies all. */
|
|
9
|
+
export const DETAIL_LINE_CAP = 2000;
|
|
10
|
+
const BAD = /\b(error|errors|fail|failed|failure|fatal|exception|panic)\b|✕|✗|^\s*×/i;
|
|
11
|
+
const OK = /^\s*(✓|✔|ok\b|pass(ed)?\b)/i;
|
|
12
|
+
function asText(v) {
|
|
13
|
+
return typeof v === 'string' ? v : '';
|
|
14
|
+
}
|
|
15
|
+
/** Splits off the first line without splitting the rest. */
|
|
16
|
+
function splitFirst(text) {
|
|
17
|
+
const i = text.indexOf('\n');
|
|
18
|
+
if (i === -1)
|
|
19
|
+
return { first: text.slice(0, 400).trim(), rest: '' };
|
|
20
|
+
return { first: text.slice(0, Math.min(i, 400)).trim(), rest: text.slice(i + 1) };
|
|
21
|
+
}
|
|
22
|
+
/** Right-trims whitespace with a linear walk from the end (no $-anchored regex). */
|
|
23
|
+
function rtrim(text) {
|
|
24
|
+
let end = text.length;
|
|
25
|
+
while (end > 0 && /\s/.test(text[end - 1]))
|
|
26
|
+
end--;
|
|
27
|
+
return end === text.length ? text : text.slice(0, end);
|
|
28
|
+
}
|
|
29
|
+
/** Longest a peek line may be; a minified one-line file must not land whole. */
|
|
30
|
+
const LINE_CLIP = 300;
|
|
31
|
+
/** Removes the first whole `[output truncated]` line. indexOf only; no regex over the body. */
|
|
32
|
+
function dropTruncationMarker(text) {
|
|
33
|
+
const marker = '[output truncated]';
|
|
34
|
+
let from = 0;
|
|
35
|
+
for (;;) {
|
|
36
|
+
const at = text.indexOf(marker, from);
|
|
37
|
+
if (at === -1)
|
|
38
|
+
return text;
|
|
39
|
+
const before = at === 0 || text[at - 1] === '\n';
|
|
40
|
+
let after = at + marker.length;
|
|
41
|
+
while (after < text.length && (text[after] === ' ' || text[after] === '\t' || text[after] === '\r'))
|
|
42
|
+
after++;
|
|
43
|
+
if (before && (after === text.length || text[after] === '\n')) {
|
|
44
|
+
return text.slice(0, at) + text.slice(after < text.length ? after + 1 : after);
|
|
45
|
+
}
|
|
46
|
+
from = at + marker.length;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Removes `stdout:` / `stderr:` label lines by walking lines; only short lines are tested. */
|
|
50
|
+
function dropLabelLines(text) {
|
|
51
|
+
const kept = [];
|
|
52
|
+
let start = 0;
|
|
53
|
+
while (start <= text.length) {
|
|
54
|
+
let end = text.indexOf('\n', start);
|
|
55
|
+
if (end === -1)
|
|
56
|
+
end = text.length;
|
|
57
|
+
const line = text.slice(start, end);
|
|
58
|
+
if (!(line.length <= 16 && /^(stdout|stderr):\s*$/.test(line)))
|
|
59
|
+
kept.push(line);
|
|
60
|
+
start = end + 1;
|
|
61
|
+
}
|
|
62
|
+
return kept.join('\n');
|
|
63
|
+
}
|
|
64
|
+
function exitNumber(raw) {
|
|
65
|
+
if (raw === undefined)
|
|
66
|
+
return null;
|
|
67
|
+
const n = Number(raw);
|
|
68
|
+
return Number.isInteger(n) ? n : null;
|
|
69
|
+
}
|
|
70
|
+
export function parseCommandResult(name, args, result) {
|
|
71
|
+
const text = asText(result);
|
|
72
|
+
switch (name) {
|
|
73
|
+
case 'sidecar_shell_exec': {
|
|
74
|
+
const { first, rest } = splitFirst(text);
|
|
75
|
+
const timedOut = /^timed out\b/i.test(first);
|
|
76
|
+
const m = /^exit\s+(-?\d+|null)\b/i.exec(first);
|
|
77
|
+
const body = rtrim(dropTruncationMarker(rest));
|
|
78
|
+
return { exit: m ? exitNumber(m[1]) : null, timedOut, body };
|
|
79
|
+
}
|
|
80
|
+
case 'shell': {
|
|
81
|
+
const { first, rest } = splitFirst(text);
|
|
82
|
+
const timedOut = /^timed out\b/i.test(first);
|
|
83
|
+
const m = /^exit\s+(-?\d+|unknown)\b/i.exec(first);
|
|
84
|
+
const body = rtrim(dropLabelLines(rest));
|
|
85
|
+
return { exit: m ? exitNumber(m[1]) : null, timedOut, body };
|
|
86
|
+
}
|
|
87
|
+
case 'sidecar_run_check': {
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(text);
|
|
90
|
+
if (parsed && typeof parsed === 'object') {
|
|
91
|
+
const o = parsed;
|
|
92
|
+
if (o.ok === false)
|
|
93
|
+
return { exit: null, timedOut: false, body: asText(o.error) };
|
|
94
|
+
const out = {
|
|
95
|
+
exit: typeof o.exitCode === 'number' ? o.exitCode : null,
|
|
96
|
+
timedOut: o.timedOut === true,
|
|
97
|
+
body: asText(o.output),
|
|
98
|
+
};
|
|
99
|
+
if (typeof o.durationMs === 'number')
|
|
100
|
+
out.ms = o.durationMs;
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
/* not JSON: show it as it came */
|
|
106
|
+
}
|
|
107
|
+
return { exit: null, timedOut: false, body: text };
|
|
108
|
+
}
|
|
109
|
+
case 'proc_start': {
|
|
110
|
+
const exited = /ALREADY EXITED[^\n]*?exit code\s+(-?\d+)/.exec(text.slice(0, 2000));
|
|
111
|
+
const marker = 'Output so far:\n';
|
|
112
|
+
const at = text.indexOf(marker);
|
|
113
|
+
return {
|
|
114
|
+
exit: exited ? exitNumber(exited[1]) : null,
|
|
115
|
+
timedOut: false,
|
|
116
|
+
body: at === -1 ? '' : text.slice(at + marker.length),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
case 'console_command':
|
|
120
|
+
return { exit: args && args.ok === false ? 1 : 0, timedOut: false, body: text };
|
|
121
|
+
default:
|
|
122
|
+
return { exit: null, timedOut: false, body: text };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** A line's tone by the peek rules: error words red, pass marks green. */
|
|
126
|
+
export function lineTone(line) {
|
|
127
|
+
if (BAD.test(line))
|
|
128
|
+
return 'bad';
|
|
129
|
+
if (OK.test(line))
|
|
130
|
+
return 'ok';
|
|
131
|
+
return 'plain';
|
|
132
|
+
}
|
|
133
|
+
/** The last `count` non-empty lines. Reads at most the final TAIL_WINDOW characters. */
|
|
134
|
+
export function tailLines(body, count) {
|
|
135
|
+
const text = asText(body);
|
|
136
|
+
if (!text || count <= 0)
|
|
137
|
+
return [];
|
|
138
|
+
const cut = text.length > TAIL_WINDOW;
|
|
139
|
+
const window = cut ? text.slice(text.length - TAIL_WINDOW) : text;
|
|
140
|
+
const lines = window.split('\n');
|
|
141
|
+
// The window may start mid-line. Drop that fragment, unless it is all there is.
|
|
142
|
+
if (cut && lines.length > 1)
|
|
143
|
+
lines.shift();
|
|
144
|
+
const out = [];
|
|
145
|
+
for (let i = lines.length - 1; i >= 0 && out.length < count; i--) {
|
|
146
|
+
const t = lines[i].replace(/\r$/, '').trimEnd();
|
|
147
|
+
if (t.trim() === '')
|
|
148
|
+
continue;
|
|
149
|
+
out.push({ text: t, tone: lineTone(t) });
|
|
150
|
+
}
|
|
151
|
+
return out.reverse();
|
|
152
|
+
}
|
|
153
|
+
export function commandMeta(r) {
|
|
154
|
+
const body = asText(r.body);
|
|
155
|
+
const window = body.length > TAIL_WINDOW ? body.slice(body.length - TAIL_WINDOW) : body;
|
|
156
|
+
const failed = [...window.matchAll(/(\d+) failed/g)].pop();
|
|
157
|
+
if (failed)
|
|
158
|
+
return { text: `${failed[1]} failed`, tone: 'bad' };
|
|
159
|
+
const passed = [...window.matchAll(/(\d+) passed/g)].pop();
|
|
160
|
+
if (passed)
|
|
161
|
+
return { text: `${passed[1]} passed`, tone: 'ok' };
|
|
162
|
+
if (r.timedOut)
|
|
163
|
+
return { text: 'timed out', tone: 'bad' };
|
|
164
|
+
if (r.exit !== null && r.exit !== 0)
|
|
165
|
+
return { text: `exit ${r.exit}`, tone: 'bad' };
|
|
166
|
+
return { text: '', tone: 'plain' };
|
|
167
|
+
}
|
|
168
|
+
/** Number of lines in `text`, a trailing newline not counting as one. */
|
|
169
|
+
function countLines(text) {
|
|
170
|
+
if (!text)
|
|
171
|
+
return 0;
|
|
172
|
+
let n = 1;
|
|
173
|
+
let i = -1;
|
|
174
|
+
while ((i = text.indexOf('\n', i + 1)) !== -1)
|
|
175
|
+
n++;
|
|
176
|
+
return text.endsWith('\n') ? n - 1 : n;
|
|
177
|
+
}
|
|
178
|
+
/** Index of the newline ending the `lines`-th line (the text length when it has fewer). */
|
|
179
|
+
function endOfLines(text, lines) {
|
|
180
|
+
let at = -1;
|
|
181
|
+
for (let k = 0; k < lines; k++) {
|
|
182
|
+
const next = text.indexOf('\n', at + 1);
|
|
183
|
+
if (next === -1)
|
|
184
|
+
return text.length;
|
|
185
|
+
at = next;
|
|
186
|
+
}
|
|
187
|
+
return at;
|
|
188
|
+
}
|
|
189
|
+
/** The line count and first `count` lines of a write. Never diffs: there is no old text to compare with. */
|
|
190
|
+
export function writePeek(args, count) {
|
|
191
|
+
const content = args ? args.content : undefined;
|
|
192
|
+
if (typeof content !== 'string')
|
|
193
|
+
return null;
|
|
194
|
+
const added = countLines(content);
|
|
195
|
+
const lines = [];
|
|
196
|
+
let start = 0;
|
|
197
|
+
while (lines.length < count && lines.length < added) {
|
|
198
|
+
let end = content.indexOf('\n', start);
|
|
199
|
+
if (end === -1)
|
|
200
|
+
end = content.length;
|
|
201
|
+
let t = content.slice(start, Math.min(end, start + LINE_CLIP + 1));
|
|
202
|
+
if (t.endsWith('\r'))
|
|
203
|
+
t = t.slice(0, -1);
|
|
204
|
+
if (t.length > LINE_CLIP)
|
|
205
|
+
t = t.slice(0, LINE_CLIP);
|
|
206
|
+
lines.push({ text: t, tone: 'add', n: lines.length + 1 });
|
|
207
|
+
start = end + 1;
|
|
208
|
+
}
|
|
209
|
+
return { added, lines };
|
|
210
|
+
}
|
|
211
|
+
/** The first `cap` lines of `text`, and how many more there are. */
|
|
212
|
+
export function capLines(text, cap) {
|
|
213
|
+
const t = asText(text);
|
|
214
|
+
const total = countLines(t);
|
|
215
|
+
if (total <= cap)
|
|
216
|
+
return { shown: t.endsWith('\n') ? t.slice(0, -1) : t, more: 0 };
|
|
217
|
+
return { shown: t.slice(0, endOfLines(t, cap)), more: total - cap };
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=peek.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peek.js","sourceRoot":"","sources":["../../steps/peek.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { KitStatus } from '@corenel/ui-kit/kit';
|
|
2
|
+
import type { ConversationTurn } from '@corenel/harness/conversation';
|
|
3
|
+
import { type TodoEntry } from '@corenel/harness/todos';
|
|
4
|
+
import type { RailItem, Step } from './model';
|
|
5
|
+
export type { RailTask, TaskState } from './model';
|
|
6
|
+
export declare const TODO_WRITE = "todo_write";
|
|
7
|
+
/** The task list a todo_write call's arguments state, given the raw JSON string
|
|
8
|
+
* or the parsed object. Malformed arguments are no tasks. */
|
|
9
|
+
export declare function todosFromArgs(args: unknown): TodoEntry[];
|
|
10
|
+
/** The plan in force after `turns`: the newest todo_write's list, [] when there
|
|
11
|
+
* is none or when it had zero tasks (a zero-task write ends the plan). */
|
|
12
|
+
export declare function planAfter(turns: readonly ConversationTurn[]): TodoEntry[];
|
|
13
|
+
/** The plan in force when each turn began, walking forward from `start`: entry i is
|
|
14
|
+
* turn i's, and the extra last entry is the plan after the final turn. A turn with
|
|
15
|
+
* no todo_write carries the plan; a zero-task write ends it. */
|
|
16
|
+
export declare function planStarts(turns: readonly ConversationTurn[], start: TodoEntry[]): TodoEntry[][];
|
|
17
|
+
/** Whether a plan is in force anywhere in a turn: it began with one, or one of its
|
|
18
|
+
* writes has tasks. When not, todo_write calls are ordinary steps (C10). */
|
|
19
|
+
export declare function planInForce(start: readonly TodoEntry[], writes: readonly {
|
|
20
|
+
todos: readonly TodoEntry[];
|
|
21
|
+
}[]): boolean;
|
|
22
|
+
/** How a group of quiet steps reads. */
|
|
23
|
+
export declare function exploredStatus(steps: Step[]): KitStatus;
|
|
24
|
+
/** Every step in `items`, including those inside Explored groups and tasks; a custom card is one. */
|
|
25
|
+
export declare function countSteps(items: RailItem[]): number;
|
|
26
|
+
/** Nest one rail segment's items under the plan's tasks.
|
|
27
|
+
*
|
|
28
|
+
* `callIdsInOrder` is the whole turn's call ids in call order (todo_write calls
|
|
29
|
+
* included), and `writes` the turn's todo_write calls with their task lists, so a
|
|
30
|
+
* segment knows the plan as it stood at each of its calls and which tasks had
|
|
31
|
+
* steps anywhere in the turn. Call ids must be unique within the turn (turnBlocks
|
|
32
|
+
* suffixes reused ones). `start` is the plan in force when the turn began.
|
|
33
|
+
*
|
|
34
|
+
* - No plan in force anywhere in the turn: the items come back untouched (a
|
|
35
|
+
* zero-task write then stays an ordinary step).
|
|
36
|
+
* - Otherwise todo_write calls are headings, never steps. A step goes under the
|
|
37
|
+
* first in_progress task of the plan at its call; with none, or when that task
|
|
38
|
+
* is gone from the final plan, it stays at turn level in order.
|
|
39
|
+
* - A task's stepCount is the steps under it in THIS segment (a task heading two
|
|
40
|
+
* segments counts each separately).
|
|
41
|
+
* - Headings come from the final plan. A task sits at the position of its first
|
|
42
|
+
* step; a subtask sits inside its parent. With `showUpcoming`, tasks with no
|
|
43
|
+
* steps in the turn follow the last item, in plan order: those not yet done,
|
|
44
|
+
* and those done in this turn (one already done when the turn began is not
|
|
45
|
+
* repeated). */
|
|
46
|
+
export declare function nestPlan(items: RailItem[], callIdsInOrder: string[], writes: {
|
|
47
|
+
callId: string;
|
|
48
|
+
todos: TodoEntry[];
|
|
49
|
+
}[], start: TodoEntry[], showUpcoming: boolean): RailItem[];
|
|
50
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../steps/plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAkB,KAAK,SAAS,EAAmB,MAAM,wBAAwB,CAAC;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAY,IAAI,EAAa,MAAM,SAAS,CAAC;AAEnE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAYnD,eAAO,MAAM,UAAU,eAAe,CAAC;AASvC;6DAC6D;AAC7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,CAOxD;AAED;0EAC0E;AAC1E,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,EAAE,CAMzE;AAgBD;;gEAEgE;AAChE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,EAAE,CAQhG;AAED;4EAC4E;AAC5E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS;IAAE,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,EAAE,GAAG,OAAO,CAEpH;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAMvD;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAQpD;AA4DD;;;;;;;;;;;;;;;;;;;kBAmBkB;AAClB,wBAAgB,QAAQ,CACtB,KAAK,EAAE,QAAQ,EAAE,EACjB,cAAc,EAAE,MAAM,EAAE,EACxB,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,EAAE,EAChD,KAAK,EAAE,SAAS,EAAE,EAClB,YAAY,EAAE,OAAO,GACpB,QAAQ,EAAE,CA0DZ"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { parseTodoWrite } from '@corenel/harness/todos';
|
|
2
|
+
/* The plan is the rail: a turn's todo_write calls become task headings and its
|
|
3
|
+
* steps nest under them.
|
|
4
|
+
*
|
|
5
|
+
* Read from the transcript, not the todos store, so it works for reloaded chats,
|
|
6
|
+
* sidecar sessions and past the store's LRU cap. The bucketing rule is the
|
|
7
|
+
* store's (addActivity): a call made while a task is in_progress belongs to the
|
|
8
|
+
* first in_progress task of the plan as it stood when the call was made.
|
|
9
|
+
*
|
|
10
|
+
* Pure. This module imports only types from ./model; model imports it. */
|
|
11
|
+
export const TODO_WRITE = 'todo_write';
|
|
12
|
+
const STATE = {
|
|
13
|
+
completed: 'done',
|
|
14
|
+
in_progress: 'current',
|
|
15
|
+
pending: 'waiting',
|
|
16
|
+
blocked: 'blocked',
|
|
17
|
+
};
|
|
18
|
+
/** The task list a todo_write call's arguments state, given the raw JSON string
|
|
19
|
+
* or the parsed object. Malformed arguments are no tasks. */
|
|
20
|
+
export function todosFromArgs(args) {
|
|
21
|
+
if (typeof args !== 'string')
|
|
22
|
+
return parseTodoWrite(args);
|
|
23
|
+
try {
|
|
24
|
+
return parseTodoWrite(JSON.parse(args));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** The plan in force after `turns`: the newest todo_write's list, [] when there
|
|
31
|
+
* is none or when it had zero tasks (a zero-task write ends the plan). */
|
|
32
|
+
export function planAfter(turns) {
|
|
33
|
+
for (let t = turns.length - 1; t >= 0; t--) {
|
|
34
|
+
const w = lastWrite(turns[t]);
|
|
35
|
+
if (w)
|
|
36
|
+
return w;
|
|
37
|
+
}
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
/** The task list of a turn's last todo_write, or undefined when it made none. */
|
|
41
|
+
function lastWrite(turn) {
|
|
42
|
+
const messages = Array.isArray(turn?.messages) ? turn.messages : [];
|
|
43
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
44
|
+
const m = messages[i];
|
|
45
|
+
if (!m || typeof m !== 'object' || m.role !== 'assistant' || !Array.isArray(m.tool_calls))
|
|
46
|
+
continue;
|
|
47
|
+
for (let n = m.tool_calls.length - 1; n >= 0; n--) {
|
|
48
|
+
const fn = m.tool_calls[n]?.function;
|
|
49
|
+
if (fn?.name === TODO_WRITE)
|
|
50
|
+
return todosFromArgs(fn.arguments);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
/** The plan in force when each turn began, walking forward from `start`: entry i is
|
|
56
|
+
* turn i's, and the extra last entry is the plan after the final turn. A turn with
|
|
57
|
+
* no todo_write carries the plan; a zero-task write ends it. */
|
|
58
|
+
export function planStarts(turns, start) {
|
|
59
|
+
const out = [start];
|
|
60
|
+
let plan = start;
|
|
61
|
+
for (const turn of turns) {
|
|
62
|
+
plan = lastWrite(turn) ?? plan;
|
|
63
|
+
out.push(plan);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/** Whether a plan is in force anywhere in a turn: it began with one, or one of its
|
|
68
|
+
* writes has tasks. When not, todo_write calls are ordinary steps (C10). */
|
|
69
|
+
export function planInForce(start, writes) {
|
|
70
|
+
return start.length > 0 || writes.some((w) => w.todos.length > 0);
|
|
71
|
+
}
|
|
72
|
+
/** How a group of quiet steps reads. */
|
|
73
|
+
export function exploredStatus(steps) {
|
|
74
|
+
if (steps.some((s) => s.status === 'failed'))
|
|
75
|
+
return 'failed';
|
|
76
|
+
if (steps.some((s) => s.status === 'running'))
|
|
77
|
+
return 'running';
|
|
78
|
+
// A stopped member (no result) must not read green.
|
|
79
|
+
if (steps.some((s) => s.status === 'stopped'))
|
|
80
|
+
return 'stopped';
|
|
81
|
+
return 'done';
|
|
82
|
+
}
|
|
83
|
+
/** Every step in `items`, including those inside Explored groups and tasks; a custom card is one. */
|
|
84
|
+
export function countSteps(items) {
|
|
85
|
+
let n = 0;
|
|
86
|
+
for (const item of items) {
|
|
87
|
+
if (item.kind === 'step' || item.kind === 'custom')
|
|
88
|
+
n += 1;
|
|
89
|
+
else if (item.kind === 'explored')
|
|
90
|
+
n += item.steps.length;
|
|
91
|
+
else if (item.kind === 'task')
|
|
92
|
+
n += countSteps(item.items);
|
|
93
|
+
}
|
|
94
|
+
return n;
|
|
95
|
+
}
|
|
96
|
+
function atomsOf(items) {
|
|
97
|
+
const out = [];
|
|
98
|
+
for (const item of items) {
|
|
99
|
+
if (item.kind === 'step')
|
|
100
|
+
out.push({ item, id: item.step.id, group: null });
|
|
101
|
+
else if (item.kind === 'explored')
|
|
102
|
+
for (const step of item.steps)
|
|
103
|
+
out.push({ item: { kind: 'step', step, peek: false }, id: step.id, group: item });
|
|
104
|
+
else if (item.kind === 'custom')
|
|
105
|
+
out.push({ item, id: item.callId ?? null, group: null });
|
|
106
|
+
else
|
|
107
|
+
out.push({ item, id: null, group: null });
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
function stepIdOf(a) {
|
|
112
|
+
return a.item.kind === 'step' ? a.item.step.id : '';
|
|
113
|
+
}
|
|
114
|
+
/** Nodes back into rail items: consecutive members of one Explored group regroup
|
|
115
|
+
* (two or more), a lone member becomes a plain step. No new groups are made. */
|
|
116
|
+
function render(nodes, kids, byId) {
|
|
117
|
+
const out = [];
|
|
118
|
+
let run = [];
|
|
119
|
+
const flush = () => {
|
|
120
|
+
if (run.length >= 2 && run[0].group) {
|
|
121
|
+
const steps = run.flatMap((a) => (a.item.kind === 'step' ? [a.item.step] : []));
|
|
122
|
+
out.push({ kind: 'explored', key: `x:${stepIdOf(run[0])}`, steps, status: exploredStatus(steps), open: run[0].group.open });
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
for (const a of run)
|
|
126
|
+
out.push(a.item);
|
|
127
|
+
}
|
|
128
|
+
run = [];
|
|
129
|
+
};
|
|
130
|
+
for (const n of nodes) {
|
|
131
|
+
if (n.kind === 'task') {
|
|
132
|
+
flush();
|
|
133
|
+
const t = byId.get(n.id);
|
|
134
|
+
if (!t)
|
|
135
|
+
continue;
|
|
136
|
+
const items = render(kids.get(n.id) ?? [], kids, byId);
|
|
137
|
+
const task = { id: t.id, title: t.title, state: STATE[t.status] ?? 'waiting', stepCount: countSteps(items) };
|
|
138
|
+
if (t.parentId)
|
|
139
|
+
task.parentId = t.parentId;
|
|
140
|
+
out.push({ kind: 'task', key: `task:${t.id}`, task, items });
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const a = n.atom;
|
|
144
|
+
if (a.group && run.length && run[0].group === a.group) {
|
|
145
|
+
run.push(a);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
flush();
|
|
149
|
+
if (a.group)
|
|
150
|
+
run = [a];
|
|
151
|
+
else
|
|
152
|
+
out.push(a.item);
|
|
153
|
+
}
|
|
154
|
+
flush();
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
/** Nest one rail segment's items under the plan's tasks.
|
|
158
|
+
*
|
|
159
|
+
* `callIdsInOrder` is the whole turn's call ids in call order (todo_write calls
|
|
160
|
+
* included), and `writes` the turn's todo_write calls with their task lists, so a
|
|
161
|
+
* segment knows the plan as it stood at each of its calls and which tasks had
|
|
162
|
+
* steps anywhere in the turn. Call ids must be unique within the turn (turnBlocks
|
|
163
|
+
* suffixes reused ones). `start` is the plan in force when the turn began.
|
|
164
|
+
*
|
|
165
|
+
* - No plan in force anywhere in the turn: the items come back untouched (a
|
|
166
|
+
* zero-task write then stays an ordinary step).
|
|
167
|
+
* - Otherwise todo_write calls are headings, never steps. A step goes under the
|
|
168
|
+
* first in_progress task of the plan at its call; with none, or when that task
|
|
169
|
+
* is gone from the final plan, it stays at turn level in order.
|
|
170
|
+
* - A task's stepCount is the steps under it in THIS segment (a task heading two
|
|
171
|
+
* segments counts each separately).
|
|
172
|
+
* - Headings come from the final plan. A task sits at the position of its first
|
|
173
|
+
* step; a subtask sits inside its parent. With `showUpcoming`, tasks with no
|
|
174
|
+
* steps in the turn follow the last item, in plan order: those not yet done,
|
|
175
|
+
* and those done in this turn (one already done when the turn began is not
|
|
176
|
+
* repeated). */
|
|
177
|
+
export function nestPlan(items, callIdsInOrder, writes, start, showUpcoming) {
|
|
178
|
+
if (!planInForce(start, writes))
|
|
179
|
+
return items;
|
|
180
|
+
const writeAt = new Map();
|
|
181
|
+
for (const w of writes)
|
|
182
|
+
writeAt.set(w.callId, w.todos);
|
|
183
|
+
const final = writes.length ? writes[writes.length - 1].todos : start;
|
|
184
|
+
const byId = new Map();
|
|
185
|
+
for (const t of final)
|
|
186
|
+
if (!byId.has(t.id))
|
|
187
|
+
byId.set(t.id, t);
|
|
188
|
+
// The plan as it stood at each call.
|
|
189
|
+
const bucketOf = new Map();
|
|
190
|
+
const withSteps = new Set();
|
|
191
|
+
let plan = start;
|
|
192
|
+
for (const id of callIdsInOrder) {
|
|
193
|
+
const w = writeAt.get(id);
|
|
194
|
+
if (w) {
|
|
195
|
+
plan = w;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const active = plan.find((t) => t.status === 'in_progress')?.id;
|
|
199
|
+
const bucket = active !== undefined && byId.has(active) ? active : null;
|
|
200
|
+
bucketOf.set(id, bucket);
|
|
201
|
+
if (bucket !== null)
|
|
202
|
+
withSteps.add(bucket);
|
|
203
|
+
}
|
|
204
|
+
const top = [];
|
|
205
|
+
const kids = new Map();
|
|
206
|
+
/** The node list a task's items go in, placing the task (and its parent) on first use. */
|
|
207
|
+
const slot = (t, nest) => {
|
|
208
|
+
const have = kids.get(t.id);
|
|
209
|
+
if (have)
|
|
210
|
+
return have;
|
|
211
|
+
const list = [];
|
|
212
|
+
kids.set(t.id, list);
|
|
213
|
+
const parent = nest && t.parentId && t.parentId !== t.id ? byId.get(t.parentId) : undefined;
|
|
214
|
+
(parent ? slot(parent, false) : top).push({ kind: 'task', id: t.id });
|
|
215
|
+
return list;
|
|
216
|
+
};
|
|
217
|
+
let prev = null;
|
|
218
|
+
for (const atom of atomsOf(items)) {
|
|
219
|
+
if (atom.id !== null && writeAt.has(atom.id))
|
|
220
|
+
continue;
|
|
221
|
+
if (atom.item.kind === 'step' && atom.item.step.name === TODO_WRITE)
|
|
222
|
+
continue;
|
|
223
|
+
// An item with no call (an approval) stays beside the item before it.
|
|
224
|
+
const bucket = atom.id !== null ? bucketOf.get(atom.id) ?? null : prev;
|
|
225
|
+
prev = bucket;
|
|
226
|
+
const task = bucket !== null ? byId.get(bucket) : undefined;
|
|
227
|
+
(task ? slot(task, true) : top).push({ kind: 'atom', atom });
|
|
228
|
+
}
|
|
229
|
+
if (showUpcoming) {
|
|
230
|
+
// Not done yet, or done in this turn, so a list made and ticked off with no
|
|
231
|
+
// other calls still shows. A done parent still appears as the container of an
|
|
232
|
+
// upcoming subtask (slot places it).
|
|
233
|
+
const doneBefore = new Set(start.filter((t) => t.status === 'completed').map((t) => t.id));
|
|
234
|
+
for (const t of byId.values()) {
|
|
235
|
+
const shown = t.status !== 'completed' || !doneBefore.has(t.id);
|
|
236
|
+
if (shown && !withSteps.has(t.id) && !kids.has(t.id))
|
|
237
|
+
slot(t, true);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return render(top, kids, byId);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../steps/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { RailItem, Step, TurnBlock } from './model';
|
|
3
|
+
/** Where a command ran, when its arguments say: a host that cannot rerun it
|
|
4
|
+
* there hides Run again (canRerun false). */
|
|
5
|
+
export interface RerunWhere {
|
|
6
|
+
cwd?: string;
|
|
7
|
+
root?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Run again for a command step. `canRerun` false hides it for that tool.
|
|
10
|
+
* `where` is passed only when the step's arguments name a cwd or root. */
|
|
11
|
+
export interface RerunOpts {
|
|
12
|
+
onRerun?: (tool: string, command: string, where?: RerunWhere) => void;
|
|
13
|
+
canRerun?: (tool: string, command: string, where?: RerunWhere) => boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Every step in `items`, nested ones included, by Step.id. */
|
|
16
|
+
export declare function collectSteps(items: RailItem[], into: Map<string, Step>): void;
|
|
17
|
+
/** The detail body for `step`, with Run again when the command can be rerun. */
|
|
18
|
+
export declare function stepDetailBody(step: Step, rerun: RerunOpts): () => ReactNode;
|
|
19
|
+
/** `scope` prefixes every detail id this rail opens (providers reuse call ids
|
|
20
|
+
* across turns). Returns the selected step's id within the scope, and the opener. */
|
|
21
|
+
export declare function useRailDetail(scope: string, blocks: TurnBlock[], rerun: RerunOpts): {
|
|
22
|
+
selectedId: string | null;
|
|
23
|
+
openStep: (step: Step) => void;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=useRailDetail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRailDetail.d.ts","sourceRoot":"","sources":["../../steps/useRailDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtF,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMzD;6CAC6C;AAC7C,MAAM,WAAW,UAAU;IAAG,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAE3D;0EAC0E;AAC1E,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC;CAC3E;AAUD,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAM7E;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,SAAS,CAU5E;AAED;qFACqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAChC,CAsDA"}
|