@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.
Files changed (193) hide show
  1. package/dist/Composer.d.ts +30 -1
  2. package/dist/Composer.d.ts.map +1 -1
  3. package/dist/Composer.js +111 -19
  4. package/dist/Composer.js.map +1 -1
  5. package/dist/ContextBar.d.ts +9 -3
  6. package/dist/ContextBar.d.ts.map +1 -1
  7. package/dist/ContextBar.js +14 -7
  8. package/dist/ContextBar.js.map +1 -1
  9. package/dist/ContextManager.d.ts +10 -2
  10. package/dist/ContextManager.d.ts.map +1 -1
  11. package/dist/ContextManager.js +14 -10
  12. package/dist/ContextManager.js.map +1 -1
  13. package/dist/DictateButton.d.ts +21 -1
  14. package/dist/DictateButton.d.ts.map +1 -1
  15. package/dist/DictateButton.js +73 -10
  16. package/dist/DictateButton.js.map +1 -1
  17. package/dist/PickChips.d.ts +6 -0
  18. package/dist/PickChips.d.ts.map +1 -0
  19. package/dist/PickChips.js +55 -0
  20. package/dist/PickChips.js.map +1 -0
  21. package/dist/ProcessDock.d.ts +10 -0
  22. package/dist/ProcessDock.d.ts.map +1 -1
  23. package/dist/ProcessDock.js +24 -1
  24. package/dist/ProcessDock.js.map +1 -1
  25. package/dist/RichContent.d.ts.map +1 -1
  26. package/dist/RichContent.js +102 -24
  27. package/dist/RichContent.js.map +1 -1
  28. package/dist/SummaryTranscript.d.ts +5 -1
  29. package/dist/SummaryTranscript.d.ts.map +1 -1
  30. package/dist/SummaryTranscript.js +5 -3
  31. package/dist/SummaryTranscript.js.map +1 -1
  32. package/dist/TodoBar.d.ts +2 -0
  33. package/dist/TodoBar.d.ts.map +1 -1
  34. package/dist/TodoBar.js +8 -0
  35. package/dist/TodoBar.js.map +1 -1
  36. package/dist/TodoLine.d.ts +11 -0
  37. package/dist/TodoLine.d.ts.map +1 -0
  38. package/dist/TodoLine.js +55 -0
  39. package/dist/TodoLine.js.map +1 -0
  40. package/dist/ToolFold.js +1 -1
  41. package/dist/ToolFold.js.map +1 -1
  42. package/dist/Transcript.d.ts +19 -1
  43. package/dist/Transcript.d.ts.map +1 -1
  44. package/dist/Transcript.js +127 -58
  45. package/dist/Transcript.js.map +1 -1
  46. package/dist/agentChat/AgentChat.d.ts +42 -0
  47. package/dist/agentChat/AgentChat.d.ts.map +1 -1
  48. package/dist/agentChat/AgentChat.js +573 -100
  49. package/dist/agentChat/AgentChat.js.map +1 -1
  50. package/dist/agentChat/ChatSettingsSheet.d.ts +9 -0
  51. package/dist/agentChat/ChatSettingsSheet.d.ts.map +1 -0
  52. package/dist/agentChat/ChatSettingsSheet.js +103 -0
  53. package/dist/agentChat/ChatSettingsSheet.js.map +1 -0
  54. package/dist/agentChat/OptionsDrawer.d.ts +8 -0
  55. package/dist/agentChat/OptionsDrawer.d.ts.map +1 -1
  56. package/dist/agentChat/OptionsDrawer.js +24 -215
  57. package/dist/agentChat/OptionsDrawer.js.map +1 -1
  58. package/dist/agentChat/PlanReview.d.ts +1 -1
  59. package/dist/agentChat/PlanReview.d.ts.map +1 -1
  60. package/dist/agentChat/PlanReview.js +1 -1
  61. package/dist/agentChat/PlanReview.js.map +1 -1
  62. package/dist/agentChat/SourceGroups.d.ts +24 -0
  63. package/dist/agentChat/SourceGroups.d.ts.map +1 -0
  64. package/dist/agentChat/SourceGroups.js +117 -0
  65. package/dist/agentChat/SourceGroups.js.map +1 -0
  66. package/dist/agentChat/controller.d.ts +30 -1
  67. package/dist/agentChat/controller.d.ts.map +1 -1
  68. package/dist/agentChat/controller.js.map +1 -1
  69. package/dist/agentChat/pendingQueue.d.ts +4 -0
  70. package/dist/agentChat/pendingQueue.d.ts.map +1 -1
  71. package/dist/agentChat/pendingQueue.js +7 -0
  72. package/dist/agentChat/pendingQueue.js.map +1 -1
  73. package/dist/agentChat/planTool.d.ts +4 -0
  74. package/dist/agentChat/planTool.d.ts.map +1 -0
  75. package/dist/agentChat/planTool.js +4 -0
  76. package/dist/agentChat/planTool.js.map +1 -0
  77. package/dist/agentChat/testSheetHost.d.ts +3 -0
  78. package/dist/agentChat/testSheetHost.d.ts.map +1 -0
  79. package/dist/agentChat/testSheetHost.js +9 -0
  80. package/dist/agentChat/testSheetHost.js.map +1 -0
  81. package/dist/agentChat/useChatOptions.d.ts +63 -0
  82. package/dist/agentChat/useChatOptions.d.ts.map +1 -0
  83. package/dist/agentChat/useChatOptions.js +156 -0
  84. package/dist/agentChat/useChatOptions.js.map +1 -0
  85. package/dist/chatRefreshContext.d.ts +8 -0
  86. package/dist/chatRefreshContext.d.ts.map +1 -0
  87. package/dist/chatRefreshContext.js +14 -0
  88. package/dist/chatRefreshContext.js.map +1 -0
  89. package/dist/chatSkinContext.d.ts +13 -6
  90. package/dist/chatSkinContext.d.ts.map +1 -1
  91. package/dist/chatSkinContext.js +18 -4
  92. package/dist/chatSkinContext.js.map +1 -1
  93. package/dist/chatSkinCss.d.ts.map +1 -1
  94. package/dist/chatSkinCss.js +108 -22
  95. package/dist/chatSkinCss.js.map +1 -1
  96. package/dist/composerAction.d.ts +16 -0
  97. package/dist/composerAction.d.ts.map +1 -0
  98. package/dist/composerAction.js +20 -0
  99. package/dist/composerAction.js.map +1 -0
  100. package/dist/composerHistory.d.ts.map +1 -1
  101. package/dist/composerHistory.js +4 -1
  102. package/dist/composerHistory.js.map +1 -1
  103. package/dist/fx/LiveAnswer.d.ts.map +1 -1
  104. package/dist/fx/LiveAnswer.js +324 -59
  105. package/dist/fx/LiveAnswer.js.map +1 -1
  106. package/dist/fx/arrivalModes.d.ts +17 -2
  107. package/dist/fx/arrivalModes.d.ts.map +1 -1
  108. package/dist/fx/arrivalModes.js +46 -4
  109. package/dist/fx/arrivalModes.js.map +1 -1
  110. package/dist/fx/pacer.d.ts +41 -0
  111. package/dist/fx/pacer.d.ts.map +1 -0
  112. package/dist/fx/pacer.js +66 -0
  113. package/dist/fx/pacer.js.map +1 -0
  114. package/dist/fx/useReveal.d.ts +16 -1
  115. package/dist/fx/useReveal.d.ts.map +1 -1
  116. package/dist/fx/useReveal.js +101 -41
  117. package/dist/fx/useReveal.js.map +1 -1
  118. package/dist/localAddress.d.ts +2 -0
  119. package/dist/localAddress.d.ts.map +1 -0
  120. package/dist/localAddress.js +56 -0
  121. package/dist/localAddress.js.map +1 -0
  122. package/dist/steps/AfterReply.d.ts +67 -0
  123. package/dist/steps/AfterReply.d.ts.map +1 -0
  124. package/dist/steps/AfterReply.js +217 -0
  125. package/dist/steps/AfterReply.js.map +1 -0
  126. package/dist/steps/ChatApproval.d.ts +18 -0
  127. package/dist/steps/ChatApproval.d.ts.map +1 -0
  128. package/dist/steps/ChatApproval.js +35 -0
  129. package/dist/steps/ChatApproval.js.map +1 -0
  130. package/dist/steps/Delegation.d.ts +77 -0
  131. package/dist/steps/Delegation.d.ts.map +1 -0
  132. package/dist/steps/Delegation.js +188 -0
  133. package/dist/steps/Delegation.js.map +1 -0
  134. package/dist/steps/LiveRail.d.ts +14 -0
  135. package/dist/steps/LiveRail.d.ts.map +1 -0
  136. package/dist/steps/LiveRail.js +16 -0
  137. package/dist/steps/LiveRail.js.map +1 -0
  138. package/dist/steps/StepDetail.d.ts +23 -0
  139. package/dist/steps/StepDetail.d.ts.map +1 -0
  140. package/dist/steps/StepDetail.js +195 -0
  141. package/dist/steps/StepDetail.js.map +1 -0
  142. package/dist/steps/StepDetailHost.d.ts +54 -0
  143. package/dist/steps/StepDetailHost.d.ts.map +1 -0
  144. package/dist/steps/StepDetailHost.js +175 -0
  145. package/dist/steps/StepDetailHost.js.map +1 -0
  146. package/dist/steps/StepRail.d.ts +38 -0
  147. package/dist/steps/StepRail.d.ts.map +1 -0
  148. package/dist/steps/StepRail.js +238 -0
  149. package/dist/steps/StepRail.js.map +1 -0
  150. package/dist/steps/approval.d.ts +73 -0
  151. package/dist/steps/approval.d.ts.map +1 -0
  152. package/dist/steps/approval.js +81 -0
  153. package/dist/steps/approval.js.map +1 -0
  154. package/dist/steps/model.d.ts +140 -0
  155. package/dist/steps/model.d.ts.map +1 -0
  156. package/dist/steps/model.js +433 -0
  157. package/dist/steps/model.js.map +1 -0
  158. package/dist/steps/outcome.d.ts +5 -0
  159. package/dist/steps/outcome.d.ts.map +1 -0
  160. package/dist/steps/outcome.js +34 -0
  161. package/dist/steps/outcome.js.map +1 -0
  162. package/dist/steps/peek.d.ts +35 -0
  163. package/dist/steps/peek.d.ts.map +1 -0
  164. package/dist/steps/peek.js +219 -0
  165. package/dist/steps/peek.js.map +1 -0
  166. package/dist/steps/plan.d.ts +50 -0
  167. package/dist/steps/plan.d.ts.map +1 -0
  168. package/dist/steps/plan.js +242 -0
  169. package/dist/steps/plan.js.map +1 -0
  170. package/dist/steps/useRailDetail.d.ts +25 -0
  171. package/dist/steps/useRailDetail.d.ts.map +1 -0
  172. package/dist/steps/useRailDetail.js +108 -0
  173. package/dist/steps/useRailDetail.js.map +1 -0
  174. package/dist/steps/words.d.ts +40 -0
  175. package/dist/steps/words.d.ts.map +1 -0
  176. package/dist/steps/words.js +247 -0
  177. package/dist/steps/words.js.map +1 -0
  178. package/dist/toolRender.d.ts +27 -1
  179. package/dist/toolRender.d.ts.map +1 -1
  180. package/dist/toolRender.js +72 -4
  181. package/dist/toolRender.js.map +1 -1
  182. package/dist/transcriptSkin.d.ts.map +1 -1
  183. package/dist/transcriptSkin.js +66 -0
  184. package/dist/transcriptSkin.js.map +1 -1
  185. package/dist/transcriptSkinCss.d.ts +35 -0
  186. package/dist/transcriptSkinCss.d.ts.map +1 -1
  187. package/dist/transcriptSkinCss.js +360 -19
  188. package/dist/transcriptSkinCss.js.map +1 -1
  189. package/dist/useHoldPress.d.ts +24 -0
  190. package/dist/useHoldPress.d.ts.map +1 -0
  191. package/dist/useHoldPress.js +85 -0
  192. package/dist/useHoldPress.js.map +1 -0
  193. package/package.json +5 -5
@@ -0,0 +1,238 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { createContext, memo, useContext, useLayoutEffect, useRef, useState } from 'react';
3
+ import { StatusDot, statusWord } from '@corenel/ui-kit/kit';
4
+ import { IcChevron, IcSearch } from '@corenel/ui-kit/icons';
5
+ import { FxText } from '../fx/FxText';
6
+ import { exploredLabel } from './model';
7
+ import { firstLine } from './outcome';
8
+ import { commandMeta, parseCommandResult, tailLines, writePeek } from './peek';
9
+ import './rail.css';
10
+ /* The transcript's step rail: presentational only. The settled Transcript and the
11
+ * live turn both draw their rail blocks with it.
12
+ *
13
+ * Every element carries `data-tx-part` and a `tx-<part>` class; skins key on the
14
+ * data attribute (transcriptSkinCss.ts), and every style lives in rail.css. No
15
+ * inline style here: an inline rule would beat the skin's. */
16
+ const PEEK_COUNT = 3;
17
+ const META_MAX = 60;
18
+ /** Under 10s one decimal ("1.2s"), under 60s whole seconds ("14s"), then "1m 4s". */
19
+ export function durationText(ms) {
20
+ if (!Number.isFinite(ms) || ms < 0)
21
+ return '';
22
+ if (ms < 10000)
23
+ return `${(ms / 1000).toFixed(1)}s`;
24
+ const secs = Math.floor(ms / 1000);
25
+ if (secs < 60)
26
+ return `${secs}s`;
27
+ return `${Math.floor(secs / 60)}m ${secs % 60}s`;
28
+ }
29
+ function clip(text, max) {
30
+ return text.length > max ? `${text.slice(0, max - 1)}…` : text;
31
+ }
32
+ function joined(...parts) {
33
+ return parts.filter(Boolean).join(' · ');
34
+ }
35
+ function refused(step) {
36
+ return step.status === 'failed' && step.outcome === 'refused';
37
+ }
38
+ /** The status as words: a refusal is not a fault, so it says "refused". */
39
+ function statusText(step) {
40
+ return refused(step) ? 'refused' : statusWord(step.status);
41
+ }
42
+ /** The words on the right of a step line, and their tone. */
43
+ function stepMeta(step) {
44
+ const ms = typeof step.ms === 'number' ? durationText(step.ms) : '';
45
+ if (step.status === 'stopped')
46
+ return { text: 'no result', tone: 'plain' };
47
+ if (step.status === 'running')
48
+ return { text: ms, tone: 'plain' };
49
+ if (step.status === 'needs-you')
50
+ return { text: statusWord('needs-you'), tone: 'plain' };
51
+ if (refused(step))
52
+ return { text: 'refused', tone: 'bad' };
53
+ const kind = step.words.kind;
54
+ if (kind === 'run') {
55
+ const m = commandMeta(parseCommandResult(step.name, step.args, step.result));
56
+ if (step.status === 'failed' && !m.text)
57
+ return { text: joined(clip(firstLine(step.result), META_MAX), ms), tone: 'bad' };
58
+ return { text: joined(m.text, ms), tone: step.status === 'failed' ? 'bad' : m.tone };
59
+ }
60
+ if (step.status === 'failed')
61
+ return { text: clip(firstLine(step.result), META_MAX), tone: 'bad' };
62
+ if (kind === 'write' || kind === 'edit') {
63
+ const w = writePeek(step.args, 0);
64
+ if (w)
65
+ return { text: `+${w.added}`, tone: 'ok' };
66
+ }
67
+ return { text: ms, tone: 'plain' };
68
+ }
69
+ /** What shows under the line, or null for nothing. */
70
+ function stepPeek(step, peek) {
71
+ if (step.status === 'running') {
72
+ if (!step.partial)
73
+ return null;
74
+ const lines = tailLines(step.partial, PEEK_COUNT);
75
+ return lines.length ? { kind: 'output', lines, bad: false } : null;
76
+ }
77
+ if (!peek || step.status === 'stopped' || refused(step))
78
+ return null;
79
+ const kind = step.words.kind;
80
+ if (kind === 'run') {
81
+ const lines = tailLines(parseCommandResult(step.name, step.args, step.result).body, PEEK_COUNT);
82
+ return lines.length ? { kind: 'output', lines, bad: step.status === 'failed' } : null;
83
+ }
84
+ if (kind === 'write' || kind === 'edit') {
85
+ // A failed write wrote nothing: its meta says why, and no green lines suggest otherwise.
86
+ if (step.status === 'failed')
87
+ return null;
88
+ const w = writePeek(step.args, PEEK_COUNT);
89
+ return w && w.lines.length ? { kind: 'lines', lines: w.lines, bad: false } : null;
90
+ }
91
+ return null;
92
+ }
93
+ /** Set by a custom item for the card inside it. A card that draws its own status
94
+ * dot (useOwnRailDot) claims it, and the rail then draws none beside it, so the
95
+ * card's dot can follow the card's own words rather than its call's result. */
96
+ const OwnDotContext = createContext(null);
97
+ /** Inside a rail's custom item: claim the item's dot slot. True when the caller
98
+ * is on a rail and should draw its own dot; false anywhere else. */
99
+ export function useOwnRailDot() {
100
+ const claim = useContext(OwnDotContext);
101
+ // Before paint, so the rail's dot never shows beside the card's.
102
+ useLayoutEffect(() => {
103
+ if (!claim)
104
+ return undefined;
105
+ claim(true);
106
+ return () => claim(false);
107
+ }, [claim]);
108
+ return claim !== null;
109
+ }
110
+ function CustomItem({ status, node }) {
111
+ const [own, setOwn] = useState(false);
112
+ return (_jsxs("div", { className: "tx-custom", "data-tx-part": "custom", "data-tx-status": status, "data-tx-own-dot": own ? '' : undefined, children: [own ? null : _jsx(Dot, { status: status }), _jsx(OwnDotContext.Provider, { value: setOwn, children: node })] }));
113
+ }
114
+ function Dot({ status }) {
115
+ return (_jsx("span", { className: "tx-step-dot", "data-tx-part": "step-dot", children: _jsx(StatusDot, { status: status, pulse: status === 'running' }) }));
116
+ }
117
+ function Peek({ kind, lines, bad }) {
118
+ return (_jsx("div", { className: "tx-step-peek", "data-tx-part": "step-peek", "data-tx-peek": kind, "data-tx-tone": bad ? 'bad' : undefined, children: lines.map((l, i) => (_jsxs("div", { className: "tx-peek-line", "data-tx-part": "peek-line", "data-tx-tone": l.tone, children: [typeof l.n === 'number' ? _jsx("span", { className: "tx-peek-num", "data-tx-part": "peek-num", children: l.n }) : null, l.text] }, i))) }));
119
+ }
120
+ /** The longest step words (verb or object) that play the arrival effect. Longer
121
+ * text is plain: FxText locks a character every 45ms and split-flap keeps every
122
+ * tile until the last one lands, so a 200-character command would flip for about
123
+ * nine seconds, mostly past the ellipsis. 32 is about what fits on the phone line. */
124
+ export const STEP_FX_MAX_CHARS = 32;
125
+ /** A step's words with `nameFx`: they animate once, on the text they first
126
+ * showed, and only when the step was running at mount (a rail that remounts
127
+ * mid-run does not replay done steps) and the text is at most
128
+ * STEP_FX_MAX_CHARS long. A later text (Running becomes Ran) is plain. Skin
129
+ * marks sit on the part's own ::before, outside FxText's spans. */
130
+ function FirstFx({ text, fx, running }) {
131
+ const first = useRef({ text, running });
132
+ const play = !!fx && fx !== 'none' && first.current.running && text === first.current.text
133
+ && [...text].length <= STEP_FX_MAX_CHARS;
134
+ return _jsx(_Fragment, { children: play && fx ? _jsx(FxText, { text: text, effect: fx }) : text });
135
+ }
136
+ /** The verb; with `nameFx` it animates once, on the words it first showed. */
137
+ function Verb({ text, fx, running }) {
138
+ return _jsx("span", { className: "tx-step-verb", "data-tx-part": "step-verb", children: _jsx(FirstFx, { text: text, fx: fx, running: running }) });
139
+ }
140
+ function StepLineImpl(p) {
141
+ const { step } = p;
142
+ const { verb, object } = step.words;
143
+ const Icon = step.words.icon;
144
+ const meta = stepMeta(step);
145
+ const status = statusText(step);
146
+ const label = [[verb, object].filter(Boolean).join(' '), status, meta.text && meta.text !== status ? meta.text : '']
147
+ .filter(Boolean).join(', ');
148
+ const peek = stepPeek(step, p.peek);
149
+ return (_jsxs("div", { className: "tx-step", "data-tx-part": "step", "data-tx-status": step.status, "data-tx-kind": step.words.kind, "data-tx-outcome": refused(step) ? 'refused' : undefined, "data-tx-selected": p.selected ? '' : undefined, "data-fx-id": step.id, children: [_jsx(Dot, { status: step.status }), _jsxs("button", { type: "button", className: "tx-step-line", "data-tx-part": "step-line", "aria-label": label, onClick: () => p.onOpen(step), children: [_jsx("span", { className: "tx-step-icon", "data-tx-part": "step-icon", "aria-hidden": "true", children: _jsx(Icon, { size: 14 }) }), _jsx(Verb, { text: verb, fx: p.nameFx, running: step.status === 'running' }), object ? _jsx("span", { className: "tx-step-object", "data-tx-part": "step-object", children: _jsx(FirstFx, { text: object, fx: p.nameFx, running: step.status === 'running' }) }) : null, meta.text ? _jsx("span", { className: "tx-step-meta", "data-tx-part": "step-meta", "data-tx-tone": meta.tone, children: meta.text }) : null] }), peek ? _jsx(Peek, { ...peek }) : null] }));
150
+ }
151
+ export const StepLine = memo(StepLineImpl);
152
+ /** A group's meta: its duration, led by words for what went wrong in it, so a red
153
+ * or grey dot never stands alone ("1 failed · 0.0s", "1 refused", "no result"). */
154
+ function exploredMeta(steps, status, ms) {
155
+ if (status === 'done' || status === 'running')
156
+ return { text: ms, tone: 'plain' };
157
+ const failed = steps.filter((s) => s.status === 'failed' && !refused(s)).length;
158
+ const refusals = steps.filter(refused).length;
159
+ const stopped = steps.some((s) => s.status === 'stopped');
160
+ const words = [failed ? `${failed} failed` : '', refusals ? `${refusals} refused` : '', stopped ? 'no result' : ''];
161
+ return { text: joined(...words, ms), tone: failed || refusals ? 'bad' : 'plain' };
162
+ }
163
+ function Explored(p) {
164
+ const { item } = p;
165
+ const [open, setOpen] = useState(item.open);
166
+ const running = item.status === 'running';
167
+ const verb = running ? 'Exploring' : 'Explored';
168
+ const object = exploredLabel(item.steps);
169
+ const total = item.steps.reduce((n, s) => n + (typeof s.ms === 'number' ? s.ms : 0), 0);
170
+ const ms = total > 0 ? durationText(total) : '';
171
+ const meta = exploredMeta(item.steps, item.status, ms);
172
+ const label = [object ? `${verb} · ${object}` : verb, statusWord(item.status), meta.text].filter(Boolean).join(', ');
173
+ return (_jsxs("div", { className: "tx-explored", "data-tx-part": "explored", "data-tx-status": item.status, children: [_jsx(Dot, { status: item.status }), _jsxs("button", { type: "button", className: "tx-step-line", "data-tx-part": "step-line", "aria-label": label, "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [_jsx("span", { className: "tx-step-icon", "data-tx-part": "step-icon", "aria-hidden": "true", children: _jsx(IcSearch, { size: 14 }) }), _jsx("span", { className: "tx-step-verb", "data-tx-part": "step-verb", children: verb }), object ? _jsx("span", { className: "tx-step-object", "data-tx-part": "step-object", children: object }) : null, meta.text ? _jsx("span", { className: "tx-step-meta", "data-tx-part": "step-meta", "data-tx-tone": meta.tone, children: meta.text }) : null, _jsx("span", { className: "tx-step-chev", "data-tx-part": "step-chev", "aria-hidden": "true", children: _jsx(IcChevron, { size: 14 }) })] }), open ? (_jsx("div", { className: "tx-explored-list", "data-tx-part": "explored-list", children: item.steps.map((s) => (_jsx(StepLine, { step: s, peek: false, onOpen: p.onOpenStep, selected: p.selectedId === s.id }, s.id))) })) : null] }));
174
+ }
175
+ const TASK_WORDS = {
176
+ // On screen: current says "now" and blocked says "blocked"; a waiting task is the
177
+ // plain heading the brief asks for, its word kept for screen readers only.
178
+ done: 'Done', current: 'now', waiting: 'Not started', blocked: 'blocked',
179
+ };
180
+ function stepsText(n) {
181
+ return `${n} ${n === 1 ? 'step' : 'steps'}`;
182
+ }
183
+ function holdsApproval(items) {
184
+ return items.some((i) => i.kind === 'approval' || (i.kind === 'task' && holdsApproval(i.items)));
185
+ }
186
+ /** An earlier turn's in-progress task: it was current when that turn ended, but a
187
+ * later turn has the run's current task, so this one is a plain heading. */
188
+ const EARLIER_WORD = 'In progress then';
189
+ function Task(p) {
190
+ const { task, items } = p.item;
191
+ const earlier = !!p.earlier && task.state === 'current';
192
+ const [open, setOpen] = useState(false);
193
+ const marker = _jsx("span", { className: "tx-task-marker", "data-tx-part": "task-marker", "aria-hidden": "true" });
194
+ const title = _jsx("span", { className: "tx-task-title", "data-tx-part": "task-title", children: task.title });
195
+ let head;
196
+ let shown;
197
+ // A done task with nothing under it (a list made and ticked off with no other
198
+ // calls) has nothing to unfold: it is a plain line, like a waiting one.
199
+ if (task.state === 'done' && items.length > 0) {
200
+ const count = stepsText(task.stepCount);
201
+ // An approval is never hidden in a folded task: it is what the run waits
202
+ // on. While it holds one the task stays open and the head does not fold it.
203
+ const held = holdsApproval(items);
204
+ shown = open || held;
205
+ head = (_jsxs("button", { type: "button", className: "tx-task-head", "data-tx-part": "task-head", "aria-expanded": shown, "aria-label": `${task.title}, ${TASK_WORDS.done}, ${count}`, onClick: () => { if (!held)
206
+ setOpen((o) => !o); }, children: [marker, title, _jsx("span", { className: "tx-task-count", "data-tx-part": "task-count", children: count }), _jsx("span", { className: "tx-step-chev", "data-tx-part": "step-chev", "aria-hidden": "true", children: _jsx(IcChevron, { size: 14 }) })] }));
207
+ }
208
+ else {
209
+ head = (_jsxs("div", { className: "tx-task-head", "data-tx-part": "task-head", children: [marker, title, task.state === 'waiting' || earlier
210
+ ? _jsx("span", { className: "tx-task-state", "data-tx-part": "task-state", "data-tx-sr": "", children: earlier ? EARLIER_WORD : TASK_WORDS.waiting })
211
+ : _jsx("span", { className: "tx-task-state", "data-tx-part": "task-state", children: TASK_WORDS[task.state] })] }));
212
+ // The current task is open; a waiting or blocked one shows any steps it has.
213
+ shown = items.length > 0;
214
+ }
215
+ return (_jsxs("section", { className: "tx-task", "data-tx-part": "task", "data-tx-task-state": earlier ? 'earlier' : task.state, "data-tx-task": task.state === 'current' && !earlier ? 'current' : undefined, children: [head, shown ? (_jsx("div", { className: "tx-task-items", "data-tx-part": "task-items", children: _jsx(Items, { items: items, onOpenStep: p.onOpenStep, selectedId: p.selectedId, nameFx: p.nameFx, earlier: p.earlier }) })) : null] }));
216
+ }
217
+ function Items(p) {
218
+ return (_jsx(_Fragment, { children: p.items.map((item) => {
219
+ switch (item.kind) {
220
+ case 'step':
221
+ return (_jsx(StepLine, { step: item.step, peek: item.peek, onOpen: p.onOpenStep, selected: p.selectedId === item.step.id, nameFx: p.nameFx }, item.step.id));
222
+ case 'explored':
223
+ return _jsx(Explored, { item: item, onOpenStep: p.onOpenStep, selectedId: p.selectedId }, item.key);
224
+ case 'task':
225
+ return _jsx(Task, { item: item, onOpenStep: p.onOpenStep, selectedId: p.selectedId, nameFx: p.nameFx, earlier: p.earlier }, item.key);
226
+ case 'custom':
227
+ return _jsx(CustomItem, { status: item.status, node: item.node }, item.key);
228
+ case 'approval':
229
+ return (_jsxs("div", { className: "tx-approval", "data-tx-part": "approval", "data-tx-status": "needs-you", children: [_jsx(Dot, { status: "needs-you" }), item.node] }, item.key));
230
+ default:
231
+ return null;
232
+ }
233
+ }) }));
234
+ }
235
+ export function StepRail(p) {
236
+ return (_jsx("div", { className: "tx-rail", "data-tx-part": "rail", children: _jsx(Items, { items: p.items, onOpenStep: p.onOpenStep, selectedId: p.selectedId, nameFx: p.nameFx, earlier: p.earlier }) }));
237
+ }
238
+ //# sourceMappingURL=StepRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepRail.js","sourceRoot":"","sources":["../../steps/StepRail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { ApprovalRequest } from '@corenel/ui-kit/kit';
3
+ import type { ControllerLiveTool } from '../agentChat/controller';
4
+ /** The runtime's "continue past the budget?" pseudo-permission. */
5
+ export declare const BUDGET_TOOL = "budget";
6
+ /** The id of the "Allow for this session" choice. */
7
+ export declare const SESSION_CHOICE_ID = "session";
8
+ /** A tap this soon after the card appears is ignored, so the second tap of a
9
+ * double tap (or a tap meant for what the card just covered) answers nothing. */
10
+ export declare const APPROVAL_ARM_MS = 600;
11
+ /** What an ask is about, already clipped at the source (tools-web permDetail). */
12
+ export type PermInput = {
13
+ command?: string;
14
+ path?: string;
15
+ cwd?: string;
16
+ root?: string;
17
+ };
18
+ export interface ChatPerm {
19
+ /** The runtime's id for THIS request; absent on controllers that have none. */
20
+ id?: number;
21
+ tool: string;
22
+ summary: string;
23
+ requester?: 'agent' | 'you';
24
+ agent?: string;
25
+ caller?: string;
26
+ input?: PermInput;
27
+ askedAt?: number;
28
+ }
29
+ /** A skin's words for the card. Each is optional: plain words fill the rest. */
30
+ export interface ApprovalLabels {
31
+ allow?: string;
32
+ deny?: string;
33
+ session?: string;
34
+ budgetTitle?: string;
35
+ budgetContinue?: string;
36
+ budgetStop?: string;
37
+ }
38
+ /** What the ask is about, and where it runs. The summary comes first: it is
39
+ * the whole action in words (the full command line, every argument, a LOCAL
40
+ * DISK warning, "This step will be refused"), while `input` is clipped for UI
41
+ * state and would let a long command's tail go unseen. The command or path is
42
+ * the fallback for a controller that sends no summary. */
43
+ export declare function approvalDetail(perm: {
44
+ summary: string;
45
+ input?: PermInput;
46
+ }): {
47
+ detail?: string;
48
+ folder?: string;
49
+ };
50
+ export declare function chatApproval(sessionId: string, perm: ChatPerm, now: number, labels?: ApprovalLabels): ApprovalRequest;
51
+ export declare function answerToPerm(choiceId: string): {
52
+ allow: boolean;
53
+ always: boolean;
54
+ };
55
+ /** The ask comes from the agent this running call_agent called. */
56
+ export declare function approvalBelongsToCall(perm: {
57
+ agent?: string;
58
+ }, tool: ControllerLiveTool): boolean;
59
+ /** The approval of a delegated callee, for the row of the call that asked
60
+ * (`callId`, the running call_agent). `claim` tells the chat a row shows it,
61
+ * so the rail does not show it too; it returns the release. */
62
+ export interface ApprovalSlot {
63
+ callId: string;
64
+ node: ReactNode;
65
+ claim: () => () => void;
66
+ }
67
+ export declare const ApprovalSlotContext: import("react").Context<ApprovalSlot | null>;
68
+ /** The approval node for the call `callId`, or null. Keyed by the call, not
69
+ * the agent's name, so of two calls to one agent only the one that asked shows
70
+ * it. A row that renders it calls this: until some row does, the chat keeps the
71
+ * card on the rail, so an ask is never left without a card. */
72
+ export declare function useApprovalSlot(callId: string | undefined): ReactNode;
73
+ //# sourceMappingURL=approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../steps/approval.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACnF,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,mEAAmE;AACnE,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C;iFACiF;AACjF,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF,MAAM,WAAW,QAAQ;IACvB,+EAA+E;IAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;0DAI0D;AAC1D,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAKjH;AAgBD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,cAAmB,GAAG,eAAe,CAYzH;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAIlF;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAEjG;AAED;;+DAE+D;AAC/D,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,MAAM,IAAI,CAAA;CAAE;AAE1F,eAAO,MAAM,mBAAmB,8CAA2C,CAAC;AAE5E;;;+DAG+D;AAC/D,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAMrE"}
@@ -0,0 +1,81 @@
1
+ /* A chat's pending permission as the kit's ApprovalCard request, and where it
2
+ * sits: on the live rail at the step that asked, or under the sub-agent row of
3
+ * the call that asked (ApprovalSlotContext). The status sheet maps browser asks
4
+ * through approvalDetail too, so both say the same thing about one request. */
5
+ import { createContext, useContext, useLayoutEffect } from 'react';
6
+ import { isCheckpointTool } from '@corenel/protocol';
7
+ import { approvalTitle } from './words';
8
+ import { skinName } from '../chatSkinContext';
9
+ /** The runtime's "continue past the budget?" pseudo-permission. */
10
+ export const BUDGET_TOOL = 'budget';
11
+ /** The id of the "Allow for this session" choice. */
12
+ export const SESSION_CHOICE_ID = 'session';
13
+ /** A tap this soon after the card appears is ignored, so the second tap of a
14
+ * double tap (or a tap meant for what the card just covered) answers nothing. */
15
+ export const APPROVAL_ARM_MS = 600;
16
+ function text(v) {
17
+ return typeof v === 'string' ? v.trim() : '';
18
+ }
19
+ /** What the ask is about, and where it runs. The summary comes first: it is
20
+ * the whole action in words (the full command line, every argument, a LOCAL
21
+ * DISK warning, "This step will be refused"), while `input` is clipped for UI
22
+ * state and would let a long command's tail go unseen. The command or path is
23
+ * the fallback for a controller that sends no summary. */
24
+ export function approvalDetail(perm) {
25
+ const input = perm.input ?? {};
26
+ const detail = text(perm.summary) || text(input.command) || text(input.path);
27
+ const folder = text(input.cwd) || text(input.root);
28
+ return { ...(detail ? { detail } : {}), ...(folder ? { folder } : {}) };
29
+ }
30
+ function whoOf(perm) {
31
+ if (perm.agent)
32
+ return `${perm.agent} · called by ${perm.caller ?? 'this agent'}`;
33
+ if (perm.requester === 'you')
34
+ return 'Your command';
35
+ return 'This chat';
36
+ }
37
+ /** A choice showing the skin's word when there is one, named by that word and
38
+ * then the plain word (skinName). */
39
+ function choice(id, skinWord, plain) {
40
+ if (!skinWord)
41
+ return { id, label: plain };
42
+ const name = skinName(skinWord, plain);
43
+ return name ? { id, label: skinWord, ariaLabel: name } : { id, label: skinWord };
44
+ }
45
+ export function chatApproval(sessionId, perm, now, labels = {}) {
46
+ const budget = perm.tool === BUDGET_TOOL;
47
+ return {
48
+ key: typeof perm.id === 'number' ? `chat:${sessionId}:${perm.id}` : `chat:${sessionId}`,
49
+ who: whoOf(perm),
50
+ title: budget ? labels.budgetTitle ?? 'Keep going past the budget' : approvalTitle(perm.tool),
51
+ ...approvalDetail(perm),
52
+ askedAt: perm.askedAt ?? now,
53
+ allow: choice('once', budget ? labels.budgetContinue : labels.allow, budget ? 'Continue' : 'Allow'),
54
+ deny: choice('deny', budget ? labels.budgetStop : labels.deny, budget ? 'Stop' : 'Deny'),
55
+ more: budget || isCheckpointTool(perm.tool) ? [] : [choice(SESSION_CHOICE_ID, labels.session, 'Allow for this session')],
56
+ };
57
+ }
58
+ export function answerToPerm(choiceId) {
59
+ if (choiceId === 'once')
60
+ return { allow: true, always: false };
61
+ if (choiceId === SESSION_CHOICE_ID)
62
+ return { allow: true, always: true };
63
+ return { allow: false, always: false };
64
+ }
65
+ /** The ask comes from the agent this running call_agent called. */
66
+ export function approvalBelongsToCall(perm, tool) {
67
+ return !!perm.agent && tool.name === 'call_agent' && !tool.done && tool.args?.agent === perm.agent;
68
+ }
69
+ export const ApprovalSlotContext = createContext(null);
70
+ /** The approval node for the call `callId`, or null. Keyed by the call, not
71
+ * the agent's name, so of two calls to one agent only the one that asked shows
72
+ * it. A row that renders it calls this: until some row does, the chat keeps the
73
+ * card on the rail, so an ask is never left without a card. */
74
+ export function useApprovalSlot(callId) {
75
+ const slot = useContext(ApprovalSlotContext);
76
+ const claim = slot && callId && slot.callId === callId ? slot.claim : null;
77
+ // Before paint, so the rail's copy never shows beside this one.
78
+ useLayoutEffect(() => (claim ? claim() : undefined), [claim]);
79
+ return claim && slot ? slot.node : null;
80
+ }
81
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../steps/approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import type React from 'react';
2
+ import type { ChatCompletionMessageToolCall } from 'openai/resources/chat/completions';
3
+ import type { KitStatus } from '@corenel/ui-kit/kit';
4
+ import type { ConversationTurn } from '@corenel/harness/conversation';
5
+ import type { ToolCheckMark, ToolHooksMark } from '@corenel/protocol';
6
+ import type { ControllerLiveTool } from '../agentChat/controller';
7
+ import { type StepWords } from './words';
8
+ import { type StepOutcome } from './outcome';
9
+ import type { TodoEntry } from '@corenel/harness/todos';
10
+ export interface Step {
11
+ id: string;
12
+ name: string;
13
+ args: Record<string, unknown>;
14
+ result: string;
15
+ ms?: number;
16
+ status: KitStatus;
17
+ /** Meaningful when status is done or failed. */
18
+ outcome: StepOutcome;
19
+ words: StepWords;
20
+ /** Live output tail (Task 9). */
21
+ partial?: string;
22
+ /** Shadow injection check on a settled result; absent when none came back. */
23
+ check?: ToolCheckMark;
24
+ /** What the System One hooks did for this call (`_hooks`); absent when none ran. */
25
+ hooks?: ToolHooksMark;
26
+ /** The provider's raw call id (Step.id may be made unique), for a blocked
27
+ * result the page still holds. */
28
+ callId?: string;
29
+ }
30
+ export type TaskState = 'done' | 'current' | 'waiting' | 'blocked';
31
+ /** `stepCount` is the steps under this heading in its own segment: a task that
32
+ * heads two segments of a turn counts each separately. */
33
+ export interface RailTask {
34
+ id: string;
35
+ title: string;
36
+ state: TaskState;
37
+ stepCount: number;
38
+ parentId?: string;
39
+ }
40
+ export type RailItem = {
41
+ kind: 'step';
42
+ step: Step;
43
+ peek: boolean;
44
+ } | {
45
+ kind: 'explored';
46
+ key: string;
47
+ steps: Step[];
48
+ status: KitStatus;
49
+ open: boolean;
50
+ }
51
+ /** `callId` is the card's call (its Step.id), which nestPlan buckets it by. */
52
+ | {
53
+ kind: 'custom';
54
+ key: string;
55
+ status: KitStatus;
56
+ node: React.ReactNode;
57
+ callId?: string;
58
+ } | {
59
+ kind: 'task';
60
+ key: string;
61
+ task: RailTask;
62
+ items: RailItem[];
63
+ } | {
64
+ kind: 'approval';
65
+ key: string;
66
+ node: React.ReactNode;
67
+ };
68
+ export type TurnBlock = {
69
+ kind: 'text';
70
+ key: string;
71
+ text: string;
72
+ last: boolean;
73
+ } | {
74
+ kind: 'rail';
75
+ key: string;
76
+ items: RailItem[];
77
+ }
78
+ /** A user message, by its index in turn.messages, kept in message order so a
79
+ * message injected mid-turn sits between the steps around it (C11). */
80
+ | {
81
+ kind: 'user';
82
+ key: string;
83
+ index: number;
84
+ };
85
+ export type CardResult = {
86
+ text: string;
87
+ isError: boolean;
88
+ };
89
+ export interface BuildOpts {
90
+ /** The in-progress turn. */
91
+ live: boolean;
92
+ view: 'normal' | 'expanded';
93
+ hideTools?: readonly string[];
94
+ /** A host card for a call. Keyed by the provider's raw call id, not Step.id:
95
+ * two calls in one turn that share a raw id share one card. */
96
+ custom?: (callId: string, name: string, args: string, result?: CardResult) => React.ReactNode | null;
97
+ /** propose_edit verdicts, keyed by the provider's raw call id like `custom`:
98
+ * two calls sharing a raw id share one verdict. */
99
+ decided?: (callId: string) => 'applied' | 'partial' | 'rejected' | undefined;
100
+ /** The plan in force when this turn began (planAfter of the turns before it). */
101
+ planStart?: TodoEntry[];
102
+ /** Show the plan's tasks not yet done that have no steps in this turn, after the last item.
103
+ * Only the newest turn (the live turn while one runs) passes it. */
104
+ showUpcoming?: boolean;
105
+ /** Live turn only: the pending approval card, placed after the step that asked
106
+ * (inside its task when a plan is in force). */
107
+ approval?: React.ReactNode;
108
+ }
109
+ /** The tool message answering `toolCallId`, or undefined while none exists. */
110
+ export declare function findToolMsg(turn: ConversationTurn, toolCallId: string): Record<string, unknown> | undefined;
111
+ /** Tool-call duration (ms), stitched onto the tool message by the panel from the
112
+ * run's tool-result event (`_ms`); undefined for older turns without timing. */
113
+ export declare function findMs(turn: ConversationTurn, toolCallId: string): number | undefined;
114
+ export declare function checkOf(raw: unknown): ToolCheckMark | undefined;
115
+ /** What the System One hooks did for a call, stitched onto the tool message by
116
+ * the engine (`_hooks`); undefined when none ran. Malformed marks are dropped. */
117
+ export declare function hooksOf(raw: unknown): ToolHooksMark | undefined;
118
+ export declare function findHooks(turn: ConversationTurn, toolCallId: string): ToolHooksMark | undefined;
119
+ export declare function findCheck(turn: ConversationTurn, toolCallId: string): ToolCheckMark | undefined;
120
+ /** Tool-call arguments as an object. Empty is {}; anything that is not a JSON
121
+ * object (malformed, an array, a number, null) is kept whole as `{ _raw }`. */
122
+ export declare function safeArgs(raw: unknown): Record<string, unknown>;
123
+ export declare function stepFromCall(call: ChatCompletionMessageToolCall, toolMsg: {
124
+ content: string;
125
+ _ms?: number;
126
+ _check?: ToolCheckMark;
127
+ _hooks?: ToolHooksMark;
128
+ } | undefined, live: boolean): Step;
129
+ export declare function stepFromLive(t: ControllerLiveTool): Step;
130
+ export declare function turnBlocks(turn: ConversationTurn, opts: BuildOpts): TurnBlock[];
131
+ /** A live tool's arguments as the JSON string a card is handed. Cached per
132
+ * arguments object: the live fold keeps a tool's `args` by reference while its
133
+ * output streams, so a long write is not stringified again on every delta. */
134
+ export declare function argsJson(args: Record<string, unknown> | undefined): string;
135
+ export declare function liveBlocks(tools: ControllerLiveTool[], opts: BuildOpts): TurnBlock[];
136
+ /** "4 files, 2 searches, 1 folder" */
137
+ export declare function exploredLabel(steps: Step[]): string;
138
+ /** Every step, including those inside Explored groups and tasks; a custom card is one. */
139
+ export declare function stepCount(blocks: TurnBlock[]): number;
140
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../steps/model.ts"],"names":[],"mappings":"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"}