zidane-ui 9.1.6 → 9.1.9

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 (224) hide show
  1. package/dist/adapters/run-host.js +17 -20
  2. package/dist/adapters/server-files-host.js +3 -1
  3. package/dist/adapters/server-host.js +18 -11
  4. package/dist/adapters/server-machines-host.js +3 -1
  5. package/dist/adapters/server-session-host.js +2 -1
  6. package/dist/adapters/server-settings-accounts.js +2 -1
  7. package/dist/adapters/server-settings-host.js +3 -3
  8. package/dist/adapters/sse-host.js +9 -7
  9. package/dist/chat/SessionGroupHeader.js +2 -2
  10. package/dist/chat/SessionHostHeader.js +1 -1
  11. package/dist/chat/StatusDot.js +24 -20
  12. package/dist/chat/composer/Composer.d.ts +13 -8
  13. package/dist/chat/composer/Composer.js +14 -10
  14. package/dist/chat/composer/ComposerEditor.js +1 -1
  15. package/dist/chat/composer/HostComposer.d.ts +1 -1
  16. package/dist/chat/composer/HostComposer.js +7 -10
  17. package/dist/chat/composer/RunStatusChip.js +13 -1
  18. package/dist/chat/composer/attachment-ingest.d.ts +4 -1
  19. package/dist/chat/composer/attachment-ingest.js +27 -10
  20. package/dist/chat/composer/composer-bus.d.ts +9 -1
  21. package/dist/chat/composer/composer-bus.js +49 -6
  22. package/dist/chat/composer/index.d.ts +2 -2
  23. package/dist/chat/composer/index.js +2 -2
  24. package/dist/chat/composer/use-draft-target.d.ts +4 -0
  25. package/dist/chat/composer/use-draft-target.js +15 -4
  26. package/dist/chat/composer/use-send-prompt.d.ts +5 -1
  27. package/dist/chat/composer/use-send-prompt.js +2 -12
  28. package/dist/chat/headless/chip-labels.d.ts +2 -0
  29. package/dist/chat/headless/chip-labels.js +3 -1
  30. package/dist/chat/headless/composer/labels-editor.d.ts +2 -0
  31. package/dist/chat/headless/composer/labels-editor.js +2 -0
  32. package/dist/chat/headless/file-chip.d.ts +12 -13
  33. package/dist/chat/headless/file-chip.js +40 -2
  34. package/dist/chat/headless/fixture-host.js +14 -17
  35. package/dist/chat/headless/host.d.ts +24 -6
  36. package/dist/chat/headless/index.d.ts +4 -4
  37. package/dist/chat/headless/index.js +4 -4
  38. package/dist/chat/headless/labels.d.ts +16 -0
  39. package/dist/chat/headless/labels.js +15 -2
  40. package/dist/chat/headless/send-flow.d.ts +21 -4
  41. package/dist/chat/headless/send-flow.js +25 -6
  42. package/dist/chat/headless/session-list.d.ts +11 -0
  43. package/dist/chat/headless/sidebar/index.js +1 -1
  44. package/dist/chat/headless/sidebar/labels.d.ts +12 -1
  45. package/dist/chat/headless/transcript-host.d.ts +8 -1
  46. package/dist/chat/headless/transcript-labels.d.ts +2 -0
  47. package/dist/chat/index.d.ts +3 -3
  48. package/dist/chat/index.js +2 -2
  49. package/dist/chat/interactions/InboxPanel.js +2 -2
  50. package/dist/chat/interactions/QuestionField.js +2 -2
  51. package/dist/chat/rich-composer/RichComposer.d.ts +9 -2
  52. package/dist/chat/rich-composer/RichComposer.js +28 -7
  53. package/dist/chat/rich-composer/composer-extensions.d.ts +2 -0
  54. package/dist/chat/rich-composer/composer-extensions.js +2 -2
  55. package/dist/chat/rich-composer/composer-keys.js +1 -1
  56. package/dist/chat/rich-composer/use-composer-bus.js +2 -1
  57. package/dist/chat/rich-composer/use-composer-editor.d.ts +4 -1
  58. package/dist/chat/rich-composer/use-composer-editor.js +2 -1
  59. package/dist/chat/sidebar/SessionSidebar.js +1 -2
  60. package/dist/chat/sidebar/SidebarSearchRow.js +1 -1
  61. package/dist/chat/sidebar/useSidebarKeyboardNav.d.ts +0 -2
  62. package/dist/chat/sidebar/useSidebarKeyboardNav.js +7 -13
  63. package/dist/chat/testing/contract.d.ts +1 -1
  64. package/dist/chat/testing/contract.js +8 -7
  65. package/dist/chat/transcript/BadgeMenu.d.ts +12 -3
  66. package/dist/chat/transcript/BadgeMenu.js +20 -3
  67. package/dist/chat/transcript/CodemodeScript.js +147 -44
  68. package/dist/chat/transcript/EditDiffBlock.js +1 -4
  69. package/dist/chat/transcript/FileChip.js +60 -14
  70. package/dist/chat/transcript/LiveOutput.js +7 -3
  71. package/dist/chat/transcript/badges.js +2 -2
  72. package/dist/chat/transcript/index.d.ts +2 -2
  73. package/dist/chat/transcript/markdown-context.d.ts +4 -1
  74. package/dist/chat/transcript/rolling.d.ts +12 -0
  75. package/dist/chat/transcript/rolling.js +22 -0
  76. package/dist/chat/transcript/script-input.d.ts +1 -1
  77. package/dist/chat/transcript/shell-block.js +70 -60
  78. package/dist/chat/transcript/tool-row.js +21 -5
  79. package/dist/code/editor/FileTree.d.ts +3 -1
  80. package/dist/code/editor/FileTree.js +29 -1
  81. package/dist/components/Restricted.d.ts +25 -0
  82. package/dist/components/Restricted.js +32 -0
  83. package/dist/components/StepFrame.d.ts +1 -1
  84. package/dist/components/ZidaneMark.d.ts +28 -0
  85. package/dist/components/ZidaneMark.js +114 -0
  86. package/dist/components/palette/PalettePanel.d.ts +7 -1
  87. package/dist/components/palette/PalettePanel.js +37 -11
  88. package/dist/components/zidane-mark.d.ts +52 -0
  89. package/dist/components/zidane-mark.js +94 -0
  90. package/dist/core.css +59 -6
  91. package/dist/dist/{index-DqCio7Nd.d.ts → index-Bq87OcGy.d.ts} +19 -12
  92. package/dist/dist/index.d.ts +1 -1
  93. package/dist/extensions/ExtensionSettingsSection.d.ts +18 -0
  94. package/dist/extensions/ExtensionSettingsSection.js +227 -0
  95. package/dist/extensions/headless/host.d.ts +1 -1
  96. package/dist/extensions/headless/labels.d.ts +41 -1
  97. package/dist/extensions/headless/labels.js +57 -0
  98. package/dist/extensions/headless/select.js +1 -2
  99. package/dist/extensions/index.d.ts +2 -1
  100. package/dist/extensions/index.js +2 -1
  101. package/dist/files/FilesTab.js +2 -0
  102. package/dist/files/TreeColumn.d.ts +5 -1
  103. package/dist/files/TreeColumn.js +6 -0
  104. package/dist/files/headless/fixture-host.js +5 -3
  105. package/dist/files/headless/host.d.ts +24 -6
  106. package/dist/files/headless/index.d.ts +2 -2
  107. package/dist/files/headless/labels.d.ts +1 -0
  108. package/dist/files/headless/labels.js +1 -0
  109. package/dist/files/testing/contract.js +9 -2
  110. package/dist/files/useWorkspace.d.ts +14 -2
  111. package/dist/files/useWorkspace.js +87 -9
  112. package/dist/git/BranchMenu.js +1 -1
  113. package/dist/git/MoveSessionDialog.js +1 -1
  114. package/dist/git/RemoteFolderPicker.js +1 -1
  115. package/dist/git/WherePicker.js +1 -1
  116. package/dist/git/headless/index.js +1 -1
  117. package/dist/git/useEnvironmentChoices.js +1 -1
  118. package/dist/index.d.ts +4 -2
  119. package/dist/index.js +4 -2
  120. package/dist/keybindings/headless/catalog.js +1 -1
  121. package/dist/labels.d.ts +1 -0
  122. package/dist/labels.js +1 -0
  123. package/dist/machines/DaemonMenu.js +1 -1
  124. package/dist/machines/HostCapabilities.d.ts +23 -1
  125. package/dist/machines/HostCapabilities.js +149 -65
  126. package/dist/machines/HostSyncPanel.js +129 -123
  127. package/dist/machines/HostsSection.js +5 -1
  128. package/dist/machines/ServerCard.d.ts +4 -2
  129. package/dist/machines/ServerCard.js +222 -99
  130. package/dist/machines/ServerMachinesPanel.js +16 -13
  131. package/dist/machines/ServerUpdatePanel.js +31 -21
  132. package/dist/machines/TokensPanel.js +75 -53
  133. package/dist/machines/headless/fixture-host.d.ts +5 -0
  134. package/dist/machines/headless/fixture-host.js +13 -4
  135. package/dist/machines/headless/fixtures.js +1 -1
  136. package/dist/machines/headless/host.d.ts +22 -2
  137. package/dist/machines/headless/index.d.ts +2 -2
  138. package/dist/machines/headless/labels.d.ts +22 -1
  139. package/dist/machines/headless/labels.js +22 -2
  140. package/dist/machines/testing/contract.d.ts +3 -1
  141. package/dist/machines/testing/contract.js +9 -0
  142. package/dist/motion/size.d.ts +22 -1
  143. package/dist/motion/size.js +82 -4
  144. package/dist/onboarding/demos/delivery.d.ts +16 -0
  145. package/dist/onboarding/demos/delivery.js +132 -0
  146. package/dist/onboarding/demos/index.d.ts +2 -1
  147. package/dist/onboarding/demos/index.js +2 -1
  148. package/dist/onboarding/headless/labels.d.ts +8 -0
  149. package/dist/onboarding/headless/labels.js +7 -0
  150. package/dist/onboarding/index.d.ts +2 -1
  151. package/dist/onboarding/index.js +2 -1
  152. package/dist/onboarding/steps/ConversationStep.js +46 -4
  153. package/dist/palette/CommandPalette.js +3 -0
  154. package/dist/palette/PaletteDialog.js +7 -3
  155. package/dist/palette/usePaletteController.d.ts +10 -0
  156. package/dist/palette/usePaletteController.js +25 -3
  157. package/dist/server/sse-handler.js +6 -1
  158. package/dist/session/ArtifactsPanel.js +1 -1
  159. package/dist/session/SideChat.js +1 -2
  160. package/dist/session/UsagePanel.js +1 -1
  161. package/dist/session/headless/host.d.ts +3 -1
  162. package/dist/session/headless/index.js +2 -2
  163. package/dist/settings/SettingsRestricted.d.ts +25 -0
  164. package/dist/settings/SettingsRestricted.js +44 -0
  165. package/dist/settings/SettingsRowsPage.js +31 -37
  166. package/dist/settings/headless/catalog.js +7 -6
  167. package/dist/settings/headless/labels.d.ts +4 -2
  168. package/dist/settings/headless/labels.js +4 -2
  169. package/dist/settings/headless/layout.js +1 -1
  170. package/dist/settings/headless/providers.d.ts +2 -0
  171. package/dist/settings/headless/search.d.ts +1 -1
  172. package/dist/settings/index.d.ts +2 -2
  173. package/dist/settings/index.js +2 -2
  174. package/dist/settings/rows.d.ts +51 -8
  175. package/dist/settings/rows.js +81 -26
  176. package/dist/settings/sections/enabled-list/EnabledListSection.js +3 -2
  177. package/dist/settings/sections/environments/EnvironmentsSection.js +4 -3
  178. package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +2 -2
  179. package/dist/settings/sections/extensions/ExtensionConfigRows.js +22 -25
  180. package/dist/settings/sections/extensions/ExtensionOptionsSection.js +3 -2
  181. package/dist/settings/sections/extensions/options-labels.d.ts +2 -2
  182. package/dist/settings/sections/extensions/options-labels.js +2 -2
  183. package/dist/settings/sections/host-catalog/HostCatalogSection.d.ts +5 -3
  184. package/dist/settings/sections/host-catalog/HostCatalogSection.js +7 -4
  185. package/dist/settings/sections/instructions/InstructionsSection.js +24 -17
  186. package/dist/settings/sections/logs/LogsSection.d.ts +2 -1
  187. package/dist/settings/sections/logs/LogsSection.js +64 -56
  188. package/dist/settings/sections/mcp/McpSection.d.ts +1 -1
  189. package/dist/settings/sections/mcp/McpSection.js +18 -17
  190. package/dist/settings/sections/models/ModelRows.d.ts +3 -3
  191. package/dist/settings/sections/models/ModelRows.js +8 -7
  192. package/dist/settings/sections/performance/PerformanceSection.js +13 -4
  193. package/dist/settings/sections/performance/labels.d.ts +0 -1
  194. package/dist/settings/sections/performance/labels.js +0 -1
  195. package/dist/settings/sections/providers/CredentialSources.js +18 -8
  196. package/dist/settings/sections/providers/ProvidersSection.d.ts +2 -2
  197. package/dist/settings/sections/providers/ProvidersSection.js +20 -17
  198. package/dist/settings/sections/providers/ServerProvidersSection.d.ts +1 -1
  199. package/dist/settings/sections/providers/ServerProvidersSection.js +10 -14
  200. package/dist/settings/sections/shared/catalog.js +3 -2
  201. package/dist/settings/sections/skills/SkillList.js +3 -2
  202. package/dist/settings/testing/accounts-demo.js +1 -0
  203. package/dist/settings/testing/accounts.contract.js +2 -0
  204. package/dist/styles.css +160 -24
  205. package/dist/terminal/HostTerminalSurface.js +1 -1
  206. package/dist/terminal/headless/links.d.ts +19 -1
  207. package/dist/terminal/headless/links.js +26 -2
  208. package/dist/theme/css-vars.js +1 -0
  209. package/dist/theme/derive.d.ts +4 -0
  210. package/dist/theme/derive.js +2 -0
  211. package/dist/workspace/PanelContentView.js +1 -1
  212. package/dist/workspace/PanelHome.d.ts +3 -1
  213. package/dist/workspace/PanelHome.js +4 -3
  214. package/dist/workspace/SidePanel.d.ts +3 -1
  215. package/dist/workspace/SidePanel.js +3 -2
  216. package/dist/workspace/headless/open-target.d.ts +1 -1
  217. package/dist/workspace/headless/open-target.js +2 -2
  218. package/package.json +2 -2
  219. package/src/styles/chat.css +10 -10
  220. package/src/styles/motion.css +37 -0
  221. package/src/styles/primitives.css +11 -3
  222. package/src/styles/sidebar.css +12 -0
  223. package/src/styles/tokens.css +6 -0
  224. package/src/styles/transcript.css +69 -5
@@ -1,9 +1,11 @@
1
1
  import { Tooltip } from "../../components/Tooltip.js";
2
2
  import { CodeFrame } from "../../components/CodeFrame.js";
3
+ import { SmoothHeight } from "../../motion/size.js";
3
4
  import { useNearViewport } from "../../hooks/useNearViewport.js";
4
5
  import { useHighlightedHtml } from "../../code/use-highlighted-html.js";
5
6
  import { useChatLabels } from "../useChatLabels.js";
6
7
  import { FailedMark } from "./frame.js";
8
+ import { Rolling } from "./rolling.js";
7
9
  import { highlightedLines } from "../../code/highlight-lines.js";
8
10
  import { LiveOutput } from "./LiveOutput.js";
9
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -44,69 +46,101 @@ const CodemodeScript = memo(function CodemodeScript({ code, progress, finished =
44
46
  const near = useNearViewport(frameRef);
45
47
  const html = useHighlightedHtml(source, "javascript", near);
46
48
  const tokens = useMemo(() => html ? highlightedLines(html, view.lines.length) : null, [html, view.lines.length]);
47
- const follow = view.tracked && !finished && view.lines.length > SCRIPT_FOLLOW_LINES;
49
+ const capped = view.tracked && view.lines.length > SCRIPT_FOLLOW_LINES;
50
+ const follow = capped && !finished;
48
51
  const listRef = useRef(null);
49
52
  const [userScrolled, setUserScrolled] = useState(false);
50
53
  const stopFollowing = () => setUserScrolled(true);
51
54
  useEffect(() => {
52
55
  const list = listRef.current;
53
56
  if (!follow || userScrolled || !list || view.active === void 0) return;
57
+ const scroller = list.closest(".zg-code-scroll");
54
58
  const line = list.querySelector(`[data-line="${view.active}"]`);
55
- if (line) list.scrollTop = line.offsetTop - list.clientHeight / 2 + line.offsetHeight / 2;
59
+ if (!scroller || !line) return;
60
+ const box = scroller.getBoundingClientRect();
61
+ const at = line.getBoundingClientRect();
62
+ scroller.scrollTop += at.top - box.top - scroller.clientHeight / 2 + at.height / 2;
56
63
  }, [
57
64
  follow,
58
65
  userScrolled,
59
66
  view.active
60
67
  ]);
61
68
  const digits = String(view.lines.at(-1)?.label ?? 1).length;
69
+ const loops = useMemo(() => loopLines(view.loops), [view.loops]);
62
70
  const showLive = view.tracked && !finished && view.output.length > 0;
63
71
  const showEnd = view.tracked && finished && output != null;
64
72
  return /* @__PURE__ */ jsxs("div", {
65
73
  className: ["my-2", className].filter(Boolean).join(" "),
66
74
  style,
67
75
  "data-testid": "codemode-script",
68
- children: [/* @__PURE__ */ jsx(CodeFrame, {
69
- ref: frameRef,
70
- code: source,
71
- className: "zg-shiki zg-script-frame text-xs",
72
- ...view.options ? { actions: (buttonClass) => /* @__PURE__ */ jsx(ScriptOptionsButton, {
73
- options: view.options,
74
- buttonClass
75
- }) } : {},
76
- children: /* @__PURE__ */ jsx("div", {
77
- ref: listRef,
78
- className: "zg-script-lines",
79
- "data-follow": follow ? "" : void 0,
80
- style: { "--zg-script-digits": `${digits}ch` },
81
- ...follow ? {
82
- onWheel: stopFollowing,
83
- onTouchMove: stopFollowing
84
- } : {},
85
- children: view.lines.map((line, i) => /* @__PURE__ */ jsx(ScriptLine, {
86
- number: line.number,
87
- label: line.label,
88
- text: line.text,
89
- tokens: tokens?.[i],
90
- state: line.state,
91
- tracked: view.tracked,
92
- error: view.error?.line === line.number ? view.error.message : void 0
93
- }, line.number))
76
+ children: [/* @__PURE__ */ jsx(SmoothHeight, {
77
+ swapKey: capped ? "window" : "all",
78
+ children: /* @__PURE__ */ jsx(CodeFrame, {
79
+ ref: frameRef,
80
+ code: source,
81
+ className: "zg-shiki zg-script-frame text-xs",
82
+ ...view.options ? { actions: (buttonClass) => /* @__PURE__ */ jsx(ScriptOptionsButton, {
83
+ options: view.options,
84
+ buttonClass
85
+ }) } : {},
86
+ children: /* @__PURE__ */ jsx("div", {
87
+ ref: listRef,
88
+ className: "zg-script-lines",
89
+ "data-window": capped ? "" : void 0,
90
+ style: { "--zg-script-digits": `${digits}ch` },
91
+ ...follow ? {
92
+ onWheel: stopFollowing,
93
+ onTouchMove: stopFollowing
94
+ } : {},
95
+ children: view.lines.map((line, i) => /* @__PURE__ */ jsx(ScriptLine, {
96
+ number: line.number,
97
+ label: line.label,
98
+ text: line.text,
99
+ tokens: tokens?.[i],
100
+ state: line.state,
101
+ tracked: view.tracked,
102
+ error: view.error?.line === line.number ? view.error.message : void 0,
103
+ loop: loops.starts.get(line.number),
104
+ inLoop: loops.active.has(line.number),
105
+ calls: line.calls,
106
+ until: line.until
107
+ }, line.number))
108
+ })
94
109
  })
95
110
  }), view.tracked && /* @__PURE__ */ jsx("div", {
96
111
  className: "zg-collapsible",
97
112
  "data-open": showLive || showEnd,
98
113
  children: /* @__PURE__ */ jsx("div", {
99
114
  className: "zg-collapsible-inner",
100
- children: showEnd ? output : /* @__PURE__ */ jsx(LiveOutput, {
101
- lines: view.output,
102
- window: SCRIPT_OUTPUT_TAIL_LINES,
103
- label: labels.scriptLiveOutput
115
+ children: /* @__PURE__ */ jsx(SmoothHeight, {
116
+ swapKey: showEnd ? "result" : "live",
117
+ children: showEnd ? output : /* @__PURE__ */ jsx(LiveOutput, {
118
+ lines: view.output,
119
+ window: SCRIPT_OUTPUT_TAIL_LINES,
120
+ label: labels.scriptLiveOutput
121
+ })
104
122
  })
105
123
  })
106
124
  })]
107
125
  });
108
126
  });
109
- const ScriptLine = memo(function ScriptLine({ number, label, text, tokens, state, tracked, error }) {
127
+ /**
128
+ * The loop each line starts (its round shows after the code, its mark in the gutter), and the lines of the loops
129
+ * the script is in now (their numbers take the running color).
130
+ */
131
+ function loopLines(loops) {
132
+ const starts = /* @__PURE__ */ new Map();
133
+ const active = /* @__PURE__ */ new Set();
134
+ for (const loop of loops) {
135
+ if (!starts.has(loop.start)) starts.set(loop.start, loop);
136
+ if (loop.active) for (let line = loop.start; line <= loop.end; line++) active.add(line);
137
+ }
138
+ return {
139
+ starts,
140
+ active
141
+ };
142
+ }
143
+ const ScriptLine = memo(function ScriptLine({ number, label, text, tokens, state, tracked, error, loop, inLoop, calls, until }) {
110
144
  const labels = useChatLabels();
111
145
  const previous = useRef(state);
112
146
  const [settling, setSettling] = useState(false);
@@ -118,25 +152,38 @@ const ScriptLine = memo(function ScriptLine({ number, label, text, tokens, state
118
152
  className: "zg-script-line",
119
153
  "data-line": number,
120
154
  "data-state": tracked ? state : void 0,
155
+ "data-in-loop": tracked && inLoop ? "" : void 0,
121
156
  "data-settling": settling ? "" : void 0,
122
157
  onAnimationEnd: settling ? () => setSettling(false) : void 0,
123
158
  children: [/* @__PURE__ */ jsxs("span", {
124
159
  className: "zg-script-gutter",
125
- children: [tracked && /* @__PURE__ */ jsx(LineMark, { state }), /* @__PURE__ */ jsx("span", {
160
+ children: [tracked && /* @__PURE__ */ jsx(LineMark, {
161
+ state,
162
+ calls,
163
+ loop
164
+ }), /* @__PURE__ */ jsx("span", {
126
165
  className: "zg-script-number",
127
166
  "aria-hidden": true,
128
167
  children: label
129
168
  })]
130
169
  }), /* @__PURE__ */ jsxs("span", {
131
170
  className: "zg-script-code",
132
- children: [tokens ? tokens.map((token, k) => /* @__PURE__ */ jsx("span", {
133
- style: {
134
- color: token.color,
135
- fontStyle: token.fontStyle,
136
- fontWeight: token.fontWeight
137
- },
138
- children: token.text
139
- }, k)) : text, text === "" && "\n"]
171
+ children: [
172
+ tokens ? tokens.map((token, k) => /* @__PURE__ */ jsx("span", {
173
+ style: {
174
+ color: token.color,
175
+ fontStyle: token.fontStyle,
176
+ fontWeight: token.fontWeight
177
+ },
178
+ children: token.text
179
+ }, k)) : text,
180
+ text === "" && "\n",
181
+ tracked && /* @__PURE__ */ jsx(LineNote, {
182
+ loop,
183
+ calls,
184
+ until: state === "waiting" ? until : void 0
185
+ })
186
+ ]
140
187
  })]
141
188
  }), error !== void 0 && /* @__PURE__ */ jsxs("div", {
142
189
  className: "zg-script-line zg-script-error",
@@ -190,23 +237,79 @@ function ScriptOptionsButton({ options, buttonClass }) {
190
237
  })
191
238
  });
192
239
  }
193
- function LineMark({ state }) {
240
+ function LineMark({ state, calls, loop }) {
194
241
  const labels = useChatLabels();
195
242
  if (state === "running") return /* @__PURE__ */ jsx("span", {
196
243
  role: "img",
197
244
  "aria-label": labels.stepRunning,
198
245
  className: "zg-script-mark i-ph-circle-notch animate-spin"
199
246
  });
200
- if (state === "done") return /* @__PURE__ */ jsx("span", {
247
+ if (state === "waiting") return /* @__PURE__ */ jsx("span", {
248
+ role: "img",
249
+ "aria-label": labels.stepWaiting,
250
+ className: "zg-script-mark i-ph-hourglass-medium"
251
+ });
252
+ if (state === "done" || state === "previous" && calls > 0) return /* @__PURE__ */ jsx("span", {
201
253
  role: "img",
202
254
  "aria-label": labels.stepDone,
203
255
  className: "zg-script-mark i-ph-check"
204
256
  });
205
257
  if (state === "failed") return /* @__PURE__ */ jsx(FailedMark, { className: "zg-script-mark" });
258
+ if (loop) return /* @__PURE__ */ jsx("span", {
259
+ role: "img",
260
+ "aria-label": labels.scriptLoop,
261
+ className: "zg-script-mark zg-script-loop i-ph-arrows-clockwise",
262
+ "data-active": loop.active ? "" : void 0
263
+ });
206
264
  return /* @__PURE__ */ jsx("span", {
207
265
  className: "zg-script-mark",
208
266
  "aria-hidden": true
209
267
  });
210
268
  }
269
+ /** After a line's code: the round of the loop it starts, how many calls it made, or how long it still waits. */
270
+ function LineNote({ loop, calls, until }) {
271
+ const labels = useChatLabels();
272
+ if (until !== void 0) return /* @__PURE__ */ jsx(WaitLeft, { until });
273
+ if (loop && loop.rounds > 0) {
274
+ const text = loop.kind === "callback" ? labels.scriptLoopRuns(loop.rounds) : loop.active ? labels.scriptLoopRound(loop.rounds) : labels.scriptLoopRounds(loop.rounds);
275
+ return /* @__PURE__ */ jsxs("span", {
276
+ className: "zg-script-note",
277
+ "data-active": loop.active ? "" : void 0,
278
+ children: [/* @__PURE__ */ jsx("span", {
279
+ className: "i-ph-arrows-clockwise",
280
+ "aria-hidden": true
281
+ }), /* @__PURE__ */ jsx(Rolling, {
282
+ text,
283
+ value: loop.rounds
284
+ })]
285
+ });
286
+ }
287
+ if (calls > 1) return /* @__PURE__ */ jsx("span", {
288
+ className: "zg-script-note",
289
+ children: /* @__PURE__ */ jsx(Rolling, {
290
+ text: labels.scriptLineCalls(calls),
291
+ value: calls
292
+ })
293
+ });
294
+ return null;
295
+ }
296
+ /** How long a `sleep` still waits, counted down each second. */
297
+ function WaitLeft({ until }) {
298
+ const labels = useChatLabels();
299
+ const [now, setNow] = useState(Date.now);
300
+ useEffect(() => {
301
+ const timer = setInterval(() => setNow(Date.now()), 1e3);
302
+ return () => clearInterval(timer);
303
+ }, [until]);
304
+ const seconds = Math.max(0, Math.ceil((until - now) / 1e3));
305
+ return /* @__PURE__ */ jsx("span", {
306
+ className: "zg-script-note",
307
+ "data-active": "",
308
+ children: /* @__PURE__ */ jsx(Rolling, {
309
+ text: labels.scriptWaitLeft(seconds),
310
+ value: seconds
311
+ })
312
+ });
313
+ }
211
314
  //#endregion
212
315
  export { CodemodeScript };
@@ -103,10 +103,7 @@ function OutcomeBadge({ outcome }) {
103
103
  children: [/* @__PURE__ */ jsx("span", {
104
104
  "aria-hidden": true,
105
105
  children: OUTCOME_GLYPH[kind]
106
- }), /* @__PURE__ */ jsx("span", {
107
- className: "uppercase",
108
- children: kind
109
- })]
106
+ }), /* @__PURE__ */ jsx("span", { children: kind })]
110
107
  });
111
108
  }
112
109
  function OutcomeSummary({ counts }) {
@@ -1,3 +1,4 @@
1
+ import { RowActionsMenu } from "../../components/RowActionsMenu.js";
1
2
  import { useLinkRouter } from "../../extensions/links.js";
2
3
  import { classifyInlineCode, resolveChipPath } from "../headless/file-chip.js";
3
4
  import { useChatLabels } from "../useChatLabels.js";
@@ -10,7 +11,7 @@ import { useChipResolution, useResolveChipNow } from "./chip-resolve.js";
10
11
  import { ReferenceChip } from "./ReferenceText.js";
11
12
  import { classifyInlineRef, refHref } from "./remark-refs.js";
12
13
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
- import { useContext, useState } from "react";
14
+ import { useContext, useRef, useState } from "react";
14
15
  import { GITHUB_ISSUE_PROVIDER_ID, GITHUB_PULL_PROVIDER_ID, githubRefKey } from "zidane/chat/pure";
15
16
  //#region src/chat/transcript/FileChip.tsx
16
17
  /**
@@ -21,7 +22,9 @@ import { GITHUB_ISSUE_PROVIDER_ID, GITHUB_PULL_PROVIDER_ID, githubRefKey } from
21
22
  * name or partial path opens the file it names, wherever it sits in the
22
23
  * repo, and text that names nothing (a branch, a deleted file) reads as
23
24
  * plain code. Until the answer lands the chip opens the path as written.
24
- * Clicking opens it through the container's opener (`MarkdownContext.open`).
25
+ * Clicking opens it through the container's opener (`MarkdownContext.open`),
26
+ * at the line the text gave (`schema.ts:258`). A bare name that matches
27
+ * several files asks which one first, in a menu under the chip.
25
28
  *
26
29
  * Reference (`#123`, commit SHA): links to the repo's web UI.
27
30
  */
@@ -221,7 +224,7 @@ function BranchChip({ branch, text }) {
221
224
  }
222
225
  function LocalChip({ text, chip }) {
223
226
  const { cwd } = useContext(MarkdownContext);
224
- const resolution = useChipResolution(cwd, text);
227
+ const resolution = useChipResolution(cwd, chip?.path ?? text);
225
228
  if (resolution?.kind === "branch") return /* @__PURE__ */ jsx(BranchChip, {
226
229
  branch: resolution,
227
230
  text
@@ -239,6 +242,8 @@ function LocalFileChip({ chip, resolution }) {
239
242
  const labels = useChatLabels();
240
243
  const { cwd, open: openPath } = useContext(MarkdownContext);
241
244
  const [failed, setFailed] = useState(false);
245
+ const [choices, setChoices] = useState(null);
246
+ const anchorRef = useRef(null);
242
247
  const resolveChipNow = useResolveChipNow();
243
248
  const links = useLinkRouter();
244
249
  const target = resolution ? resolution.path : resolveChipPath(chip, cwd);
@@ -255,22 +260,38 @@ function LocalFileChip({ chip, resolution }) {
255
260
  text: fileBadgeName(shown),
256
261
  ...target ? { href: target } : {}
257
262
  });
258
- const open = async (event) => {
259
- const fresh = cwd ? await resolveChipNow(cwd, chip.path) : null;
260
- if (fresh && fresh.kind !== "file" && fresh.kind !== "dir") return;
261
- const path = fresh ? fresh.path : target;
262
- if (!path) return;
263
- const kind = (fresh ?? resolution ?? chip).kind === "dir" ? "dir" : "file";
263
+ const openOne = async (path, kind, event) => {
264
264
  await links.open(path, {
265
265
  source: "chip",
266
266
  ...event ? { event } : {}
267
267
  }, () => {
268
268
  if (!openPath) return;
269
- openPath(path, kind, event).then((ok) => {
269
+ openPath(path, kind, event, kind === "file" ? chip.at : void 0).then((ok) => {
270
270
  if (ok !== void 0) setFailed(!ok);
271
271
  });
272
272
  });
273
273
  };
274
+ const open = async (event) => {
275
+ const keys = event ? {
276
+ metaKey: event.metaKey,
277
+ ctrlKey: event.ctrlKey,
278
+ altKey: event.altKey
279
+ } : void 0;
280
+ const fresh = cwd ? await resolveChipNow(cwd, chip.path) : null;
281
+ if (fresh && fresh.kind !== "file" && fresh.kind !== "dir") return;
282
+ const candidates = (fresh ?? resolution)?.candidates;
283
+ if (candidates && candidates.length > 1) {
284
+ setChoices({
285
+ candidates,
286
+ ...keys ? { event: keys } : {}
287
+ });
288
+ return;
289
+ }
290
+ const path = fresh ? fresh.path : target;
291
+ if (!path) return;
292
+ const kind = (fresh ?? resolution ?? chip).kind === "dir" ? "dir" : "file";
293
+ await openOne(path, kind, keys);
294
+ };
274
295
  const inner = /* @__PURE__ */ jsx(ChipFace, { chip: shown });
275
296
  if (!target) return /* @__PURE__ */ jsx("span", {
276
297
  className: CHIP_CLASS,
@@ -278,20 +299,45 @@ function LocalFileChip({ chip, resolution }) {
278
299
  onContextMenu,
279
300
  children: inner
280
301
  });
302
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ChipButton, {
303
+ anchorRef,
304
+ title: failed ? labels.chipNotFound(title) : title,
305
+ failed,
306
+ onOpen: (e) => void open(e),
307
+ onContextMenu,
308
+ expanded: choices !== null,
309
+ children: inner
310
+ }), /* @__PURE__ */ jsx(RowActionsMenu, {
311
+ open: choices !== null,
312
+ anchorRef,
313
+ onClose: () => setChoices(null),
314
+ items: (choices?.candidates ?? []).map((c) => ({
315
+ id: c.path,
316
+ label: displayPath(c.path, cwd),
317
+ icon: c.kind === "dir" ? DIR_ICON : "i-ph-file",
318
+ onSelect: () => void openOne(c.path, c.kind, choices?.event)
319
+ }))
320
+ })] });
321
+ }
322
+ /** A chip that opens on click, Enter or Space. */
323
+ function ChipButton({ anchorRef, title, failed, expanded, onOpen, onContextMenu, children }) {
281
324
  return /* @__PURE__ */ jsx("span", {
325
+ ref: anchorRef,
282
326
  role: "button",
283
327
  tabIndex: 0,
284
- onClick: (e) => void open(e),
328
+ "aria-haspopup": expanded ? "menu" : void 0,
329
+ "aria-expanded": expanded || void 0,
330
+ onClick: (e) => onOpen(e),
285
331
  onContextMenu,
286
332
  onKeyDown: (e) => {
287
333
  if (e.key === "Enter" || e.key === " ") {
288
334
  e.preventDefault();
289
- open(e);
335
+ onOpen(e);
290
336
  }
291
337
  },
292
- title: failed ? labels.chipNotFound(title) : title,
338
+ title,
293
339
  className: `${CHIP_CLASS} ${failed ? "opacity-60" : ""}`,
294
- children: inner
340
+ children
295
341
  });
296
342
  }
297
343
  //#endregion
@@ -8,8 +8,8 @@ import { useState } from "react";
8
8
  * shell calls, a reply's block run here. Each line keeps its id while it
9
9
  * shows (`createOutputTail`), so a new one grows in and the oldest shrinks
10
10
  * out (`Grow`): the box eases to its new height instead of jumping. Once the
11
- * window is full it keeps the height of a full window while lines slide
12
- * through it. Lines already there when it mounts (a reload, a reopened row)
11
+ * window is full and lines start to leave it, it keeps the height of a full
12
+ * window while they slide through it. Lines already there when it mounts (a reload, a reopened row)
13
13
  * show at once. Colored lines draw in the theme's terminal colors.
14
14
  */
15
15
  /**
@@ -19,12 +19,16 @@ import { useState } from "react";
19
19
  */
20
20
  function LiveOutput({ lines, window, label, className }) {
21
21
  const [firstIds] = useState(() => new Set(lines.map((line) => line.id)));
22
+ const [mountedFull] = useState(() => lines.length >= window);
23
+ const [filledAt, setFilledAt] = useState(null);
24
+ if (filledAt === null && lines.length >= window) setFilledAt(lines[0].id);
25
+ const full = mountedFull || filledAt !== null && lines.length > 0 && lines[0].id !== filledAt;
22
26
  return /* @__PURE__ */ jsx("div", {
23
27
  className: ["zg-code-panel zg-output zg-live-output zg-ansi", className].filter(Boolean).join(" "),
24
28
  role: "log",
25
29
  "aria-live": "polite",
26
30
  "aria-label": label,
27
- "data-full": lines.length >= window ? "" : void 0,
31
+ "data-full": full ? "" : void 0,
28
32
  style: { "--zg-live-tail": window },
29
33
  children: /* @__PURE__ */ jsx(GrowPresence, {
30
34
  initial: false,
@@ -1,6 +1,6 @@
1
1
  import { useLinkRouter } from "../../extensions/links.js";
2
2
  import { shortUrl } from "../headless/badge-refs.js";
3
- import { chipForPath } from "../headless/file-chip.js";
3
+ import { chipForPath, positionSuffix } from "../headless/file-chip.js";
4
4
  import { useBadgeMenu } from "./BadgeMenu.js";
5
5
  import { useSiteIcon } from "./site-icons.js";
6
6
  import { jsx } from "react/jsx-runtime";
@@ -35,7 +35,7 @@ function siteIconValue(icon) {
35
35
  * @param chip - The file.
36
36
  */
37
37
  function fileBadgeName(chip) {
38
- return chip.name.length > 32 ? `${chip.name.slice(0, 31)}…` : chip.name;
38
+ return `${chip.name.length > 32 ? `${chip.name.slice(0, 31)}…` : chip.name}${positionSuffix(chip.at)}`;
39
39
  }
40
40
  /**
41
41
  * A file badge as an editor node renders it (the composer has no React inside its nodes).
@@ -23,7 +23,7 @@ import { ParsedReferenceUrl, parseReferenceUrl, referenceUrl, remarkReferences }
23
23
  import { useReferenceMatches, useReferenceProviders, useReferenceView } from "./references.js";
24
24
  import { useChipResolution, useResolveChipNow } from "./chip-resolve.js";
25
25
  import { useCommand, useCommitInfo, useReferencedSession, useSkill } from "./chip-details.js";
26
- import { BadgeEffectContext, BadgeMenuComposer, BadgeMenuProvider, BadgeMenuProviderProps, BadgeMenuSystem, OpenBadgeMenu, useBadgeMenu } from "./BadgeMenu.js";
26
+ import { BadgeEffectContext, BadgeMenuBrowser, BadgeMenuComposer, BadgeMenuProvider, BadgeMenuProviderProps, BadgeMenuSystem, OpenBadgeMenu, useBadgeMenu } from "./BadgeMenu.js";
27
27
  import { useSiteIcon } from "./site-icons.js";
28
28
  import { ChipOpener, CommandScope, CommandScopeContext, INLINE_CODE_CLASS, MarkdownContext, MarkdownContextValue, OpenSessionContext } from "./markdown-context.js";
29
29
  import { BADGE_GLYPH, FileBadgeIcon, FileBadgeIconProps, LinkBadge, LinkBadgeProps, LinkIcon, LinkIconProps, fileBadgeName, fileBadgeSpec, linkGlyph, siteIconValue } from "./badges.js";
@@ -67,4 +67,4 @@ import { TranscriptRows, TranscriptRowsInput, useSelectStops, useTranscriptRows
67
67
  import { UserBashRow, UserBashRowProps } from "./user-bash.js";
68
68
  import { RowPlace, ScrollPosition, StickToBottomOptions, useStickToBottom } from "./useStickToBottom.js";
69
69
  import { useTranscriptSelectionCopy } from "./useTranscriptSelectionCopy.js";
70
- export { AUTO_FILL_PAGES, AnsiSpans, type AnsiSpansProps, AnsiText, type AnsiTextProps, AttachmentIcon, AttachmentIconProps, AttachmentLabelParts, AuthFailureCard, AuthFailureCardProps, BADGE_GLYPH, BadgeEffectContext, BadgeMenuComposer, BadgeMenuProvider, BadgeMenuProviderProps, BadgeMenuSystem, CHIP_CARD_WIDTH, CODE_PANEL, COMMAND_DETAIL_LINE, CardMarkdown, CardMarkdownProps, Caret, CaretProps, ChipCard, ChipCardProps, ChipHover, ChipHoverProps, ChipOpener, CodeBlockSlotProps, CodemodeScript, type CodemodeScriptProps, CommandCard, CommandCardProps, CommandDetailRow, CommandDetailRowProps, CommandNoteRow, CommandNoteRowProps, CommandScope, CommandScopeContext, CommitCard, CommitCardProps, CompactSummaryRow, CompactSummaryRowProps, ComposerSearch, CvRow, CvRowProps, DEFAULT_TRANSCRIPT_RENDERERS, DefaultInlineText, DefaultInlineTextProps, DefaultMarkdown, DefaultMarkdownProps, DefaultPrompt, DefaultPromptProps, DefaultSessionTitle, DefaultSessionTitleProps, DiffLines, DiffLinesProps, Dot, DotProps, EditDiffBlock, EditDiffBlockProps, ErrorRow, ErrorRowProps, ExchangeFoldRow, ExchangeFoldRowProps, FILL_MIN_PROMPTS, FailedMark, FailedMarkProps, FailureRow, FailureRowProps, FileBadgeIcon, FileBadgeIconProps, FoldHeader, FoldHeaderProps, GUTTER_STEP_PX, INLINE_CODE_CLASS, ImageGenerationBlock, ImageGenerationBlockProps, InfoRow, InfoRowProps, InlineChipText, InlineChipTextProps, InlineCode, InlineCodeProps, InlineTextSlotProps, InteractionTool, InteractionToolBody, InteractionToolBodyProps, LazyRow, LazyRowProps, LineState, LinkBadge, LinkBadgeProps, LinkIcon, LinkIconProps, LiveOutput, type LiveOutputProps, LoadEarlierRow, LoadEarlierRowProps, LoadFullOutputButton, LoadFullOutputButtonProps, MAX_MATCHES, Markdown, MarkdownContext, MarkdownContextValue, MarkdownDiagrams, MarkdownDiagramsProps, MarkdownLinkProps, MarkdownProps, MarkdownSlotProps, MermaidDiagram, type MermaidDiagramProps, MessageGroupRow, MessageGroupRowProps, ModelVerdict, ModelVerdictProps, NestedToolCalls, NestedToolCallsProps, NoticeRow, NoticeRowProps, OpenBadgeMenu, OpenSessionContext, ParsedRef, ParsedReferenceUrl, PromptEcho, PromptEchoProps, PromptLines, PromptLinesProps, PromptSlotProps, ProseMarkdown, ProseMarkdownProps, ReadFileBlock, ReadFileBlockProps, RefChip, RefChipProps, RefMatch, ReferenceChip, ReferenceChipProps, ReferenceText, ReferenceTextProps, RowContext, RowFrame, RowFrameProps, RowIconsContext, RowPlace, RunReceiptInline, RunReceiptInlineProps, RunSummaryRow, RunSummaryRowProps, RunnableCodeBlock, type RunnableCodeBlockProps, ScrollPosition, SearchHighlightStyle, SelectCursor, SelectCursorProps, SelectTurnCommands, SelectTurnExit, SelectTurnHintKeys, SelectTurnHintKeysProps, SelectTurnKeysOptions, SelectTurnProvider, SelectTurnProviderProps, SelectTurnState, SelectTurnValue, SessionCard, SessionCardProps, SessionEventRow, SessionEventRowProps, SessionTitleSlotProps, ShellBlockProvider, type ShellBlockProviderProps, type ShellBlockScope, SkillCard, SkillCardProps, SlotEntry, SpawnEndRow, SpawnEndRowProps, SpawnStartRow, SpawnStartRowProps, StickToBottomOptions, SubagentBlock, SubagentBlockProps, TextPreviewSlotProps, TextRow, TextRowProps, ThinkingBatchRow, ThinkingBatchRowProps, ThinkingRow, ThinkingRowProps, ToolBatchRow, ToolBatchRowProps, ToolBodySlotProps, ToolDetails, ToolDetailsProps, ToolGlyph, ToolGlyphProps, ToolInput, ToolInputProps, ToolMedia, type ToolMediaItem, ToolMediaProps, ToolRow, ToolRowProps, ToolTiming, ToolTimingProps, TranscriptAccounts, TranscriptActions, TranscriptActionsProvider, TranscriptActionsProviderProps, TranscriptFind, TranscriptFindKeyOptions, TranscriptFindOptions, TranscriptFindTarget, TranscriptRenderers, TranscriptRenderersProvider, type TranscriptRenderersProviderProps, TranscriptRow, TranscriptRowProps, TranscriptRowSlot, TranscriptRowSlotProps, TranscriptRows, TranscriptRowsInput, TranscriptScrollInputs, TranscriptSearch, TranscriptSearchOptions, TranscriptSearchProps, TranscriptSearchState, TranscriptSettling, TranscriptTurnMenu, TurnCommands, TurnCommandsOptions, TurnMenuActions, TurnMenuTarget, UserBashRow, UserBashRowProps, UserPromptAttachments, UserPromptAttachmentsProps, UserPromptRow, UserPromptRowProps, WorkerDetails, WorkerDetailsProps, classifyInlineRef, copyPromptLines, createTurnCommands, defaultAttachmentLabel, drawsImageGeneration, fileBadgeName, fileBadgeSpec, findRefs, hasInteractionBody, holdForceMountRows, imageRequestsOf, isHiddenRow, lineStateOf, linkGlyph, mountRowNow, numberRef, parseRefUrl, parseReferenceUrl, parseToolMedia, refHref, referenceUrl, remarkReferences, remarkRefs, savedPaths, siteIconValue, useBackgroundMount, useBadgeMenu, useChipResolution, useCommand, useCommitInfo, useComposerSearch, useFillViewportScrollback, useForceMountRows, useFullOutput, useModelName, useReferenceMatches, useReferenceProviders, useReferenceView, useReferencedSession, useResolveChipNow, useRowIcons, useSelectStops, useSelectTurn, useSelectTurnKeys, useSettledReveal, useShellBlockScope, useSiteIcon, useSkill, useStickToBottom, useToolMedia, useTranscriptActions, useTranscriptFind, useTranscriptFindKey, useTranscriptRenderers, useTranscriptRows, useTranscriptScroll, useTranscriptSearch, useTranscriptSelectionCopy, useTurnCommands, useTurnMenu, useWheelHoverPause };
70
+ export { AUTO_FILL_PAGES, AnsiSpans, type AnsiSpansProps, AnsiText, type AnsiTextProps, AttachmentIcon, AttachmentIconProps, AttachmentLabelParts, AuthFailureCard, AuthFailureCardProps, BADGE_GLYPH, BadgeEffectContext, BadgeMenuBrowser, BadgeMenuComposer, BadgeMenuProvider, BadgeMenuProviderProps, BadgeMenuSystem, CHIP_CARD_WIDTH, CODE_PANEL, COMMAND_DETAIL_LINE, CardMarkdown, CardMarkdownProps, Caret, CaretProps, ChipCard, ChipCardProps, ChipHover, ChipHoverProps, ChipOpener, CodeBlockSlotProps, CodemodeScript, type CodemodeScriptProps, CommandCard, CommandCardProps, CommandDetailRow, CommandDetailRowProps, CommandNoteRow, CommandNoteRowProps, CommandScope, CommandScopeContext, CommitCard, CommitCardProps, CompactSummaryRow, CompactSummaryRowProps, ComposerSearch, CvRow, CvRowProps, DEFAULT_TRANSCRIPT_RENDERERS, DefaultInlineText, DefaultInlineTextProps, DefaultMarkdown, DefaultMarkdownProps, DefaultPrompt, DefaultPromptProps, DefaultSessionTitle, DefaultSessionTitleProps, DiffLines, DiffLinesProps, Dot, DotProps, EditDiffBlock, EditDiffBlockProps, ErrorRow, ErrorRowProps, ExchangeFoldRow, ExchangeFoldRowProps, FILL_MIN_PROMPTS, FailedMark, FailedMarkProps, FailureRow, FailureRowProps, FileBadgeIcon, FileBadgeIconProps, FoldHeader, FoldHeaderProps, GUTTER_STEP_PX, INLINE_CODE_CLASS, ImageGenerationBlock, ImageGenerationBlockProps, InfoRow, InfoRowProps, InlineChipText, InlineChipTextProps, InlineCode, InlineCodeProps, InlineTextSlotProps, InteractionTool, InteractionToolBody, InteractionToolBodyProps, LazyRow, LazyRowProps, LineState, LinkBadge, LinkBadgeProps, LinkIcon, LinkIconProps, LiveOutput, type LiveOutputProps, LoadEarlierRow, LoadEarlierRowProps, LoadFullOutputButton, LoadFullOutputButtonProps, MAX_MATCHES, Markdown, MarkdownContext, MarkdownContextValue, MarkdownDiagrams, MarkdownDiagramsProps, MarkdownLinkProps, MarkdownProps, MarkdownSlotProps, MermaidDiagram, type MermaidDiagramProps, MessageGroupRow, MessageGroupRowProps, ModelVerdict, ModelVerdictProps, NestedToolCalls, NestedToolCallsProps, NoticeRow, NoticeRowProps, OpenBadgeMenu, OpenSessionContext, ParsedRef, ParsedReferenceUrl, PromptEcho, PromptEchoProps, PromptLines, PromptLinesProps, PromptSlotProps, ProseMarkdown, ProseMarkdownProps, ReadFileBlock, ReadFileBlockProps, RefChip, RefChipProps, RefMatch, ReferenceChip, ReferenceChipProps, ReferenceText, ReferenceTextProps, RowContext, RowFrame, RowFrameProps, RowIconsContext, RowPlace, RunReceiptInline, RunReceiptInlineProps, RunSummaryRow, RunSummaryRowProps, RunnableCodeBlock, type RunnableCodeBlockProps, ScrollPosition, SearchHighlightStyle, SelectCursor, SelectCursorProps, SelectTurnCommands, SelectTurnExit, SelectTurnHintKeys, SelectTurnHintKeysProps, SelectTurnKeysOptions, SelectTurnProvider, SelectTurnProviderProps, SelectTurnState, SelectTurnValue, SessionCard, SessionCardProps, SessionEventRow, SessionEventRowProps, SessionTitleSlotProps, ShellBlockProvider, type ShellBlockProviderProps, type ShellBlockScope, SkillCard, SkillCardProps, SlotEntry, SpawnEndRow, SpawnEndRowProps, SpawnStartRow, SpawnStartRowProps, StickToBottomOptions, SubagentBlock, SubagentBlockProps, TextPreviewSlotProps, TextRow, TextRowProps, ThinkingBatchRow, ThinkingBatchRowProps, ThinkingRow, ThinkingRowProps, ToolBatchRow, ToolBatchRowProps, ToolBodySlotProps, ToolDetails, ToolDetailsProps, ToolGlyph, ToolGlyphProps, ToolInput, ToolInputProps, ToolMedia, type ToolMediaItem, ToolMediaProps, ToolRow, ToolRowProps, ToolTiming, ToolTimingProps, TranscriptAccounts, TranscriptActions, TranscriptActionsProvider, TranscriptActionsProviderProps, TranscriptFind, TranscriptFindKeyOptions, TranscriptFindOptions, TranscriptFindTarget, TranscriptRenderers, TranscriptRenderersProvider, type TranscriptRenderersProviderProps, TranscriptRow, TranscriptRowProps, TranscriptRowSlot, TranscriptRowSlotProps, TranscriptRows, TranscriptRowsInput, TranscriptScrollInputs, TranscriptSearch, TranscriptSearchOptions, TranscriptSearchProps, TranscriptSearchState, TranscriptSettling, TranscriptTurnMenu, TurnCommands, TurnCommandsOptions, TurnMenuActions, TurnMenuTarget, UserBashRow, UserBashRowProps, UserPromptAttachments, UserPromptAttachmentsProps, UserPromptRow, UserPromptRowProps, WorkerDetails, WorkerDetailsProps, classifyInlineRef, copyPromptLines, createTurnCommands, defaultAttachmentLabel, drawsImageGeneration, fileBadgeName, fileBadgeSpec, findRefs, hasInteractionBody, holdForceMountRows, imageRequestsOf, isHiddenRow, lineStateOf, linkGlyph, mountRowNow, numberRef, parseRefUrl, parseReferenceUrl, parseToolMedia, refHref, referenceUrl, remarkReferences, remarkRefs, savedPaths, siteIconValue, useBackgroundMount, useBadgeMenu, useChipResolution, useCommand, useCommitInfo, useComposerSearch, useFillViewportScrollback, useForceMountRows, useFullOutput, useModelName, useReferenceMatches, useReferenceProviders, useReferenceView, useReferencedSession, useResolveChipNow, useRowIcons, useSelectStops, useSelectTurn, useSelectTurnKeys, useSettledReveal, useShellBlockScope, useSiteIcon, useSkill, useStickToBottom, useToolMedia, useTranscriptActions, useTranscriptFind, useTranscriptFindKey, useTranscriptRenderers, useTranscriptRows, useTranscriptScroll, useTranscriptSearch, useTranscriptSelectionCopy, useTurnCommands, useTurnMenu, useWheelHoverPause };
@@ -1,8 +1,11 @@
1
1
  //#region src/chat/transcript/markdown-context.d.ts
2
- /** How a file chip opens what it names. */
2
+ /** How a file chip opens what it names: a file at `at` (1-based) when the text gave a line (`schema.ts:258`). */
3
3
  type ChipOpener = (path: string, kind: 'file' | 'dir', event?: {
4
4
  metaKey?: boolean;
5
5
  ctrlKey?: boolean;
6
+ }, at?: {
7
+ line: number;
8
+ column?: number;
6
9
  }) => Promise<boolean | void>;
7
10
  /**
8
11
  * Session-scoped facts prose chips need. `cwd` and `repoWebBase` are `null`
@@ -0,0 +1,12 @@
1
+ //#region src/chat/transcript/rolling.d.ts
2
+ /**
3
+ * `text`, rolling as it changes.
4
+ *
5
+ * @param props - `text`: what to show; `value`: the number behind it, so the roll goes down when it falls.
6
+ */
7
+ declare function Rolling({ text, value }: {
8
+ text: string;
9
+ value: number;
10
+ }): import("react").JSX.Element;
11
+ //#endregion
12
+ export { Rolling };
@@ -0,0 +1,22 @@
1
+ import { RollingText } from "../../motion/roll.js";
2
+ import { SmoothWidth } from "../../motion/size.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/chat/transcript/rolling.tsx
5
+ /**
6
+ * A count that changes as a run goes (a script's `3 of 4`, a loop's round, a wait's seconds): its changed
7
+ * digits roll like the app's other live counters (`RollingText`), and its width eases when its length
8
+ * changes (`SmoothWidth`). Internal to the transcript.
9
+ */
10
+ /**
11
+ * `text`, rolling as it changes.
12
+ *
13
+ * @param props - `text`: what to show; `value`: the number behind it, so the roll goes down when it falls.
14
+ */
15
+ function Rolling({ text, value }) {
16
+ return /* @__PURE__ */ jsx(SmoothWidth, { children: /* @__PURE__ */ jsx(RollingText, {
17
+ text,
18
+ value
19
+ }) });
20
+ }
21
+ //#endregion
22
+ export { Rolling };
@@ -1,6 +1,6 @@
1
1
  import { ToolRowModel } from "../headless/transcript/rows.js";
2
2
  import "../headless/transcript/index.js";
3
- import { Gw as ScriptProgress } from "../../dist/index-DqCio7Nd.js";
3
+ import { Yw as ScriptProgress } from "../../dist/index-Bq87OcGy.js";
4
4
  //#region src/chat/transcript/script-input.d.ts
5
5
  /**
6
6
  * A tool row's progress and how it ended, as `ToolInput` takes them for a Codemode script.