@flanksource/clicky-ui 0.3.22 → 0.3.24

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 (257) hide show
  1. package/dist/components/CountryFlag.cjs +55 -0
  2. package/dist/components/CountryFlag.cjs.map +1 -0
  3. package/dist/components/CountryFlag.d.ts +8 -0
  4. package/dist/components/CountryFlag.d.ts.map +1 -0
  5. package/dist/components/CountryFlag.js +38 -0
  6. package/dist/components/CountryFlag.js.map +1 -0
  7. package/dist/components/CountryPicker.cjs +35 -0
  8. package/dist/components/CountryPicker.cjs.map +1 -0
  9. package/dist/components/CountryPicker.d.ts +4 -0
  10. package/dist/components/CountryPicker.d.ts.map +1 -0
  11. package/dist/components/CountryPicker.js +35 -0
  12. package/dist/components/CountryPicker.js.map +1 -0
  13. package/dist/components/SplitButton.cjs +3 -2
  14. package/dist/components/SplitButton.cjs.map +1 -1
  15. package/dist/components/SplitButton.d.ts +6 -1
  16. package/dist/components/SplitButton.d.ts.map +1 -1
  17. package/dist/components/SplitButton.js +3 -2
  18. package/dist/components/SplitButton.js.map +1 -1
  19. package/dist/components/country-options.cjs +34 -0
  20. package/dist/components/country-options.cjs.map +1 -0
  21. package/dist/components/country-options.d.ts +8 -0
  22. package/dist/components/country-options.d.ts.map +1 -0
  23. package/dist/components/country-options.js +34 -0
  24. package/dist/components/country-options.js.map +1 -0
  25. package/dist/components.cjs +11 -0
  26. package/dist/components.cjs.map +1 -1
  27. package/dist/components.d.ts +4 -0
  28. package/dist/components.d.ts.map +1 -1
  29. package/dist/components.js +11 -0
  30. package/dist/components.js.map +1 -1
  31. package/dist/data/Clicky.cjs +4 -1
  32. package/dist/data/Clicky.cjs.map +1 -1
  33. package/dist/data/Clicky.d.ts.map +1 -1
  34. package/dist/data/Clicky.js +4 -1
  35. package/dist/data/Clicky.js.map +1 -1
  36. package/dist/data/CodeDiff.cjs +3 -18
  37. package/dist/data/CodeDiff.cjs.map +1 -1
  38. package/dist/data/CodeDiff.d.ts.map +1 -1
  39. package/dist/data/CodeDiff.js +3 -18
  40. package/dist/data/CodeDiff.js.map +1 -1
  41. package/dist/data/DataTable.cjs +182 -64
  42. package/dist/data/DataTable.cjs.map +1 -1
  43. package/dist/data/DataTable.d.ts +9 -1
  44. package/dist/data/DataTable.d.ts.map +1 -1
  45. package/dist/data/DataTable.grouping.cjs +26 -0
  46. package/dist/data/DataTable.grouping.cjs.map +1 -1
  47. package/dist/data/DataTable.grouping.d.ts +38 -0
  48. package/dist/data/DataTable.grouping.d.ts.map +1 -1
  49. package/dist/data/DataTable.grouping.js +26 -0
  50. package/dist/data/DataTable.grouping.js.map +1 -1
  51. package/dist/data/DataTable.js +183 -65
  52. package/dist/data/DataTable.js.map +1 -1
  53. package/dist/data/DataTableGroupingControls.cjs +84 -0
  54. package/dist/data/DataTableGroupingControls.cjs.map +1 -0
  55. package/dist/data/DataTableGroupingControls.d.ts +17 -0
  56. package/dist/data/DataTableGroupingControls.d.ts.map +1 -0
  57. package/dist/data/DataTableGroupingControls.js +84 -0
  58. package/dist/data/DataTableGroupingControls.js.map +1 -0
  59. package/dist/data/HighlightedTokens.cjs +21 -0
  60. package/dist/data/HighlightedTokens.cjs.map +1 -0
  61. package/dist/data/HighlightedTokens.d.ts +6 -0
  62. package/dist/data/HighlightedTokens.d.ts.map +1 -0
  63. package/dist/data/HighlightedTokens.js +21 -0
  64. package/dist/data/HighlightedTokens.js.map +1 -0
  65. package/dist/data/ai/AdvancedChatConfig.cjs +3 -0
  66. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  67. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -1
  68. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  69. package/dist/data/ai/AdvancedChatConfig.js +3 -0
  70. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  71. package/dist/data/ai/ChatWindow.cjs +77 -4
  72. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  73. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  74. package/dist/data/ai/ChatWindow.js +78 -5
  75. package/dist/data/ai/ChatWindow.js.map +1 -1
  76. package/dist/data/ai/ChatWindow.runtime.cjs +19 -4
  77. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  78. package/dist/data/ai/ChatWindow.runtime.d.ts +2 -0
  79. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  80. package/dist/data/ai/ChatWindow.runtime.js +19 -4
  81. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  82. package/dist/data/ai/ChatWindow.test-utils.d.ts +2 -1
  83. package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
  84. package/dist/data/ai/ToolPreferences.cjs +8 -1
  85. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  86. package/dist/data/ai/ToolPreferences.d.ts +2 -1
  87. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  88. package/dist/data/ai/ToolPreferences.js +8 -1
  89. package/dist/data/ai/ToolPreferences.js.map +1 -1
  90. package/dist/data/chat/Chat.cjs +26 -3
  91. package/dist/data/chat/Chat.cjs.map +1 -1
  92. package/dist/data/chat/Chat.d.ts +9 -1
  93. package/dist/data/chat/Chat.d.ts.map +1 -1
  94. package/dist/data/chat/Chat.js +26 -3
  95. package/dist/data/chat/Chat.js.map +1 -1
  96. package/dist/data/chat/ChatRuntimeToolbar.cjs +2 -0
  97. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  98. package/dist/data/chat/ChatRuntimeToolbar.d.ts +2 -1
  99. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  100. package/dist/data/chat/ChatRuntimeToolbar.js +2 -0
  101. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  102. package/dist/data/chat/Message.cjs +36 -1
  103. package/dist/data/chat/Message.cjs.map +1 -1
  104. package/dist/data/chat/Message.d.ts +1 -1
  105. package/dist/data/chat/Message.d.ts.map +1 -1
  106. package/dist/data/chat/Message.js +37 -2
  107. package/dist/data/chat/Message.js.map +1 -1
  108. package/dist/data/chat/approval.cjs +17 -0
  109. package/dist/data/chat/approval.cjs.map +1 -1
  110. package/dist/data/chat/approval.d.ts +5 -0
  111. package/dist/data/chat/approval.d.ts.map +1 -1
  112. package/dist/data/chat/approval.js +17 -0
  113. package/dist/data/chat/approval.js.map +1 -1
  114. package/dist/data/chat/fork-seed.cjs +22 -0
  115. package/dist/data/chat/fork-seed.cjs.map +1 -0
  116. package/dist/data/chat/fork-seed.d.ts +8 -0
  117. package/dist/data/chat/fork-seed.d.ts.map +1 -0
  118. package/dist/data/chat/fork-seed.js +22 -0
  119. package/dist/data/chat/fork-seed.js.map +1 -0
  120. package/dist/data/code-highlight.cjs +0 -6
  121. package/dist/data/code-highlight.cjs.map +1 -1
  122. package/dist/data/code-highlight.d.ts +4 -3
  123. package/dist/data/code-highlight.d.ts.map +1 -1
  124. package/dist/data/code-highlight.js +1 -7
  125. package/dist/data/code-highlight.js.map +1 -1
  126. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
  127. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  128. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
  129. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  130. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
  131. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  132. package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
  133. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  134. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  135. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  136. package/dist/data/diagnostics/ErrorDetails.js +29 -5
  137. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  138. package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
  139. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  140. package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
  141. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  142. package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
  143. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  144. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
  145. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
  146. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
  147. package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
  148. package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
  149. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  150. package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
  151. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  152. package/dist/data/diagnostics/JvmStackTrace.js +15 -31
  153. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  154. package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
  155. package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
  156. package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
  157. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
  158. package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
  159. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
  160. package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
  161. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
  162. package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
  163. package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
  164. package/dist/data/diagnostics/StackFrameRow.js +65 -0
  165. package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
  166. package/dist/data/diagnostics/ThreadCard.cjs +9 -2
  167. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  168. package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
  169. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  170. package/dist/data/diagnostics/ThreadCard.js +9 -2
  171. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  172. package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
  173. package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
  174. package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
  175. package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
  176. package/dist/data/diagnostics/frame-heuristics.js +26 -0
  177. package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
  178. package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
  179. package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
  180. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
  181. package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
  182. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
  183. package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
  184. package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
  185. package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
  186. package/dist/data/diagnostics/stacktrace-parse.js +4 -9
  187. package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
  188. package/dist/data/runtime/RuntimeBar.cjs +3 -0
  189. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  190. package/dist/data/runtime/RuntimeBar.d.ts +3 -1
  191. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  192. package/dist/data/runtime/RuntimeBar.js +3 -0
  193. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  194. package/dist/data/runtime/RuntimeBarCombo.cjs +15 -1
  195. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
  196. package/dist/data/runtime/RuntimeBarCombo.d.ts +2 -1
  197. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
  198. package/dist/data/runtime/RuntimeBarCombo.js +15 -1
  199. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
  200. package/dist/data/runtime/RuntimeBarSegments.cjs +7 -0
  201. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
  202. package/dist/data/runtime/RuntimeBarSegments.d.ts +2 -1
  203. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
  204. package/dist/data/runtime/RuntimeBarSegments.js +7 -0
  205. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
  206. package/dist/data/version-info.cjs +3 -3
  207. package/dist/data/version-info.js +3 -3
  208. package/dist/data.cjs +7 -1
  209. package/dist/data.cjs.map +1 -1
  210. package/dist/data.d.ts +4 -2
  211. package/dist/data.d.ts.map +1 -1
  212. package/dist/data.js +8 -2
  213. package/dist/data.js.map +1 -1
  214. package/dist/index.cjs +18 -1
  215. package/dist/index.cjs.map +1 -1
  216. package/dist/index.js +19 -2
  217. package/dist/index.js.map +1 -1
  218. package/dist/rpc/CommandForm.cjs +8 -18
  219. package/dist/rpc/CommandForm.cjs.map +1 -1
  220. package/dist/rpc/CommandForm.d.ts +8 -2
  221. package/dist/rpc/CommandForm.d.ts.map +1 -1
  222. package/dist/rpc/CommandForm.js +9 -19
  223. package/dist/rpc/CommandForm.js.map +1 -1
  224. package/dist/rpc/OperationActionDialog.cjs +3 -3
  225. package/dist/rpc/OperationActionDialog.cjs.map +1 -1
  226. package/dist/rpc/OperationActionDialog.js +3 -3
  227. package/dist/rpc/OperationActionDialog.js.map +1 -1
  228. package/dist/rpc/OperationCommandPage.cjs +7 -7
  229. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  230. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  231. package/dist/rpc/OperationCommandPage.js +7 -7
  232. package/dist/rpc/OperationCommandPage.js.map +1 -1
  233. package/dist/rpc/apiClient.cjs +17 -3
  234. package/dist/rpc/apiClient.cjs.map +1 -1
  235. package/dist/rpc/apiClient.d.ts +4 -4
  236. package/dist/rpc/apiClient.d.ts.map +1 -1
  237. package/dist/rpc/apiClient.js +17 -3
  238. package/dist/rpc/apiClient.js.map +1 -1
  239. package/dist/rpc/formMetadata.cjs +5 -9
  240. package/dist/rpc/formMetadata.cjs.map +1 -1
  241. package/dist/rpc/formMetadata.d.ts +3 -3
  242. package/dist/rpc/formMetadata.d.ts.map +1 -1
  243. package/dist/rpc/formMetadata.js +5 -9
  244. package/dist/rpc/formMetadata.js.map +1 -1
  245. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
  246. package/dist/rpc/types.cjs.map +1 -1
  247. package/dist/rpc/types.d.ts +1 -0
  248. package/dist/rpc/types.d.ts.map +1 -1
  249. package/dist/rpc/types.js.map +1 -1
  250. package/dist/rpc/useOperations.cjs.map +1 -1
  251. package/dist/rpc/useOperations.d.ts +4 -4
  252. package/dist/rpc/useOperations.d.ts.map +1 -1
  253. package/dist/rpc/useOperations.js.map +1 -1
  254. package/dist/rpc.d.ts +2 -2
  255. package/dist/rpc.d.ts.map +1 -1
  256. package/dist/styles.css +1 -1
  257. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"stacktrace-parse.cjs","sources":["../../../src/data/diagnostics/stacktrace-parse.ts"],"sourcesContent":["import type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\n// ParsedStackFrame is the React mirror of Go's clicky api.StackFrame. We reuse\n// ParsedThreadFrame so the existing JvmStackFrameRow renderer can display it.\nexport type ParsedStackFrame = ParsedThreadFrame;\n\nexport interface ParsedStackTrace {\n exceptionClass?: string;\n message?: string;\n causedBy: string[];\n frames: ParsedStackFrame[];\n language: \"java\";\n}\n\nconst frameRe = /^\\s*at\\s+([\\w$.]+)\\.([\\w$<>]+)\\(([^)]+)\\)/;\nconst continuationRe = /^\\.\\.\\.\\s+\\d+\\s+more$/;\n\nconst runtimePrefixes = [\"java.\", \"javax.\", \"sun.\", \"jdk.\", \"com.sun.\", \"or\" + \"acle.jrockit.\"];\n\n// parseJavaStackTrace decodes a free-form Java exception dump (the body that\n// printStackTrace() emits, optionally wrapped by EclipseLink \"Internal\n// Exception:\" / \"Caused by:\" markers) into a renderable shape. It is the\n// React-side counterpart to Go's api.ParseJavaStackTrace.\nexport function parseJavaStackTrace(input: string): ParsedStackTrace {\n const out: ParsedStackTrace = {\n causedBy: [],\n frames: [],\n language: \"java\",\n };\n if (!input || !input.trim()) return out;\n\n const headerLines: string[] = [];\n for (const raw of input.split(\"\\n\")) {\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (continuationRe.test(trimmed)) continue;\n\n const frameMatch = frameRe.exec(raw);\n if (frameMatch && frameMatch[1] && frameMatch[2] && frameMatch[3] !== undefined) {\n out.frames.push(buildFrame(frameMatch[1], frameMatch[2], frameMatch[3]));\n continue;\n }\n\n if (trimmed.startsWith(\"Caused by:\")) {\n out.causedBy.push(trimmed.slice(\"Caused by:\".length).trim());\n continue;\n }\n if (trimmed.startsWith(\"Internal Exception:\")) {\n out.causedBy.push(trimmed.slice(\"Internal Exception:\".length).trim());\n continue;\n }\n\n if (!out.exceptionClass) {\n const header = parseExceptionHeader(trimmed);\n if (header) {\n out.exceptionClass = header.exceptionClass;\n if (header.message) out.message = header.message;\n continue;\n }\n }\n\n headerLines.push(trimmed);\n }\n\n if (!out.message && headerLines.length > 0) {\n out.message = headerLines.join(\" \");\n }\n\n return out;\n}\n\nfunction parseExceptionHeader(\n value: string,\n): { exceptionClass: string; message?: string } | null {\n const separator = value.indexOf(\":\");\n const exceptionClass = separator === -1 ? value : value.slice(0, separator);\n if (\n !exceptionClass ||\n ![\"Exception\", \"Error\", \"Throwable\"].some((suffix) => exceptionClass.endsWith(suffix))\n ) {\n return null;\n }\n for (const character of exceptionClass) {\n const code = character.charCodeAt(0);\n const valid =\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n character === \"_\" ||\n character === \".\" ||\n character === \"$\";\n if (!valid) return null;\n }\n\n if (separator === -1) return { exceptionClass };\n const message = value.slice(separator + 1).trimStart();\n return message ? { exceptionClass, message } : { exceptionClass };\n}\n\nfunction buildFrame(cls: string, method: string, locRaw: string): ParsedStackFrame {\n const loc = locRaw.trim();\n let file: string | undefined;\n let line: number | undefined;\n let nativeMethod = false;\n if (loc === \"Native Method\") {\n nativeMethod = true;\n } else if (loc !== \"Unknown Source\") {\n const cleaned = (loc.split(\" ~[\")[0] ?? loc).trim();\n const i = cleaned.lastIndexOf(\":\");\n if (i >= 0) {\n file = cleaned.slice(0, i);\n const n = Number(cleaned.slice(i + 1));\n if (Number.isFinite(n)) line = n;\n } else {\n file = cleaned;\n }\n }\n const functionName = `${cls}.${method}`;\n const location = file\n ? line\n ? `${file}:${line}`\n : file\n : nativeMethod\n ? \"Native Method\"\n : undefined;\n const frame: ParsedStackFrame = {\n functionName,\n displayName: shortDisplay(cls, method),\n kind: \"frame\",\n runtime: runtimePrefixes.some((p) => cls.startsWith(p)),\n nativeMethod,\n class: cls,\n method,\n };\n if (file !== undefined) frame.file = file;\n if (line !== undefined) frame.line = line;\n if (location !== undefined) frame.location = location;\n return frame;\n}\n\nfunction shortDisplay(cls: string, method: string): string {\n const parts = cls.split(\".\");\n const last = parts[parts.length - 1] ?? cls;\n return `${last}.${method}`;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stacktrace-parse.cjs","sources":["../../../src/data/diagnostics/stacktrace-parse.ts"],"sourcesContent":["import type { ParsedThreadFrame } from \"./jvm-stacktrace\";\nimport { frameLocation, isRuntimeFrame, shortFrameName } from \"./frame-heuristics\";\n\n// ParsedStackFrame is the React mirror of Go's clicky api.StackFrame. We reuse\n// ParsedThreadFrame so the shared StackFrameRow renderer can display it.\nexport type ParsedStackFrame = ParsedThreadFrame;\n\nexport interface ParsedStackTrace {\n exceptionClass?: string;\n message?: string;\n causedBy: string[];\n frames: ParsedStackFrame[];\n language: \"java\";\n}\n\nconst frameRe = /^\\s*at\\s+([\\w$.]+)\\.([\\w$<>]+)\\(([^)]+)\\)/;\nconst continuationRe = /^\\.\\.\\.\\s+\\d+\\s+more$/;\n\n\n// parseJavaStackTrace decodes a free-form Java exception dump (the body that\n// printStackTrace() emits, optionally wrapped by EclipseLink \"Internal\n// Exception:\" / \"Caused by:\" markers) into a renderable shape. It is the\n// React-side counterpart to Go's api.ParseJavaStackTrace.\nexport function parseJavaStackTrace(input: string): ParsedStackTrace {\n const out: ParsedStackTrace = {\n causedBy: [],\n frames: [],\n language: \"java\",\n };\n if (!input || !input.trim()) return out;\n\n const headerLines: string[] = [];\n for (const raw of input.split(\"\\n\")) {\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (continuationRe.test(trimmed)) continue;\n\n const frameMatch = frameRe.exec(raw);\n if (frameMatch && frameMatch[1] && frameMatch[2] && frameMatch[3] !== undefined) {\n out.frames.push(buildFrame(frameMatch[1], frameMatch[2], frameMatch[3]));\n continue;\n }\n\n if (trimmed.startsWith(\"Caused by:\")) {\n out.causedBy.push(trimmed.slice(\"Caused by:\".length).trim());\n continue;\n }\n if (trimmed.startsWith(\"Internal Exception:\")) {\n out.causedBy.push(trimmed.slice(\"Internal Exception:\".length).trim());\n continue;\n }\n\n if (!out.exceptionClass) {\n const header = parseExceptionHeader(trimmed);\n if (header) {\n out.exceptionClass = header.exceptionClass;\n if (header.message) out.message = header.message;\n continue;\n }\n }\n\n headerLines.push(trimmed);\n }\n\n if (!out.message && headerLines.length > 0) {\n out.message = headerLines.join(\" \");\n }\n\n return out;\n}\n\nfunction parseExceptionHeader(\n value: string,\n): { exceptionClass: string; message?: string } | null {\n const separator = value.indexOf(\":\");\n const exceptionClass = separator === -1 ? value : value.slice(0, separator);\n if (\n !exceptionClass ||\n ![\"Exception\", \"Error\", \"Throwable\"].some((suffix) => exceptionClass.endsWith(suffix))\n ) {\n return null;\n }\n for (const character of exceptionClass) {\n const code = character.charCodeAt(0);\n const valid =\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n character === \"_\" ||\n character === \".\" ||\n character === \"$\";\n if (!valid) return null;\n }\n\n if (separator === -1) return { exceptionClass };\n const message = value.slice(separator + 1).trimStart();\n return message ? { exceptionClass, message } : { exceptionClass };\n}\n\nfunction buildFrame(cls: string, method: string, locRaw: string): ParsedStackFrame {\n const loc = locRaw.trim();\n let file: string | undefined;\n let line: number | undefined;\n let nativeMethod = false;\n if (loc === \"Native Method\") {\n nativeMethod = true;\n } else if (loc !== \"Unknown Source\") {\n const cleaned = (loc.split(\" ~[\")[0] ?? loc).trim();\n const i = cleaned.lastIndexOf(\":\");\n if (i >= 0) {\n file = cleaned.slice(0, i);\n const n = Number(cleaned.slice(i + 1));\n if (Number.isFinite(n)) line = n;\n } else {\n file = cleaned;\n }\n }\n const functionName = `${cls}.${method}`;\n const location = frameLocation(file, line) ?? (nativeMethod ? \"Native Method\" : undefined);\n const frame: ParsedStackFrame = {\n functionName,\n displayName: shortFrameName(cls, method),\n kind: \"frame\",\n runtime: isRuntimeFrame(cls),\n nativeMethod,\n class: cls,\n method,\n };\n if (file !== undefined) frame.file = file;\n if (line !== undefined) frame.line = line;\n if (location !== undefined) frame.location = location;\n return frame;\n}\n"],"names":["frameLocation","shortFrameName","isRuntimeFrame"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stacktrace-parse.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/stacktrace-parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1D,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAWD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CA8CnE"}
1
+ {"version":3,"file":"stacktrace-parse.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/stacktrace-parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAK1D,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CA8CnE"}
@@ -1,6 +1,6 @@
1
+ import { isRuntimeFrame, shortFrameName, frameLocation } from "./frame-heuristics.js";
1
2
  const frameRe = /^\s*at\s+([\w$.]+)\.([\w$<>]+)\(([^)]+)\)/;
2
3
  const continuationRe = /^\.\.\.\s+\d+\s+more$/;
3
- const runtimePrefixes = ["java.", "javax.", "sun.", "jdk.", "com.sun.", "oracle.jrockit."];
4
4
  function parseJavaStackTrace(input) {
5
5
  const out = {
6
6
  causedBy: [],
@@ -75,12 +75,12 @@ function buildFrame(cls, method, locRaw) {
75
75
  }
76
76
  }
77
77
  const functionName = `${cls}.${method}`;
78
- const location = file ? line ? `${file}:${line}` : file : nativeMethod ? "Native Method" : void 0;
78
+ const location = frameLocation(file, line) ?? (nativeMethod ? "Native Method" : void 0);
79
79
  const frame = {
80
80
  functionName,
81
- displayName: shortDisplay(cls, method),
81
+ displayName: shortFrameName(cls, method),
82
82
  kind: "frame",
83
- runtime: runtimePrefixes.some((p) => cls.startsWith(p)),
83
+ runtime: isRuntimeFrame(cls),
84
84
  nativeMethod,
85
85
  class: cls,
86
86
  method
@@ -90,11 +90,6 @@ function buildFrame(cls, method, locRaw) {
90
90
  if (location !== void 0) frame.location = location;
91
91
  return frame;
92
92
  }
93
- function shortDisplay(cls, method) {
94
- const parts = cls.split(".");
95
- const last = parts[parts.length - 1] ?? cls;
96
- return `${last}.${method}`;
97
- }
98
93
  export {
99
94
  parseJavaStackTrace
100
95
  };
@@ -1 +1 @@
1
- {"version":3,"file":"stacktrace-parse.js","sources":["../../../src/data/diagnostics/stacktrace-parse.ts"],"sourcesContent":["import type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\n// ParsedStackFrame is the React mirror of Go's clicky api.StackFrame. We reuse\n// ParsedThreadFrame so the existing JvmStackFrameRow renderer can display it.\nexport type ParsedStackFrame = ParsedThreadFrame;\n\nexport interface ParsedStackTrace {\n exceptionClass?: string;\n message?: string;\n causedBy: string[];\n frames: ParsedStackFrame[];\n language: \"java\";\n}\n\nconst frameRe = /^\\s*at\\s+([\\w$.]+)\\.([\\w$<>]+)\\(([^)]+)\\)/;\nconst continuationRe = /^\\.\\.\\.\\s+\\d+\\s+more$/;\n\nconst runtimePrefixes = [\"java.\", \"javax.\", \"sun.\", \"jdk.\", \"com.sun.\", \"or\" + \"acle.jrockit.\"];\n\n// parseJavaStackTrace decodes a free-form Java exception dump (the body that\n// printStackTrace() emits, optionally wrapped by EclipseLink \"Internal\n// Exception:\" / \"Caused by:\" markers) into a renderable shape. It is the\n// React-side counterpart to Go's api.ParseJavaStackTrace.\nexport function parseJavaStackTrace(input: string): ParsedStackTrace {\n const out: ParsedStackTrace = {\n causedBy: [],\n frames: [],\n language: \"java\",\n };\n if (!input || !input.trim()) return out;\n\n const headerLines: string[] = [];\n for (const raw of input.split(\"\\n\")) {\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (continuationRe.test(trimmed)) continue;\n\n const frameMatch = frameRe.exec(raw);\n if (frameMatch && frameMatch[1] && frameMatch[2] && frameMatch[3] !== undefined) {\n out.frames.push(buildFrame(frameMatch[1], frameMatch[2], frameMatch[3]));\n continue;\n }\n\n if (trimmed.startsWith(\"Caused by:\")) {\n out.causedBy.push(trimmed.slice(\"Caused by:\".length).trim());\n continue;\n }\n if (trimmed.startsWith(\"Internal Exception:\")) {\n out.causedBy.push(trimmed.slice(\"Internal Exception:\".length).trim());\n continue;\n }\n\n if (!out.exceptionClass) {\n const header = parseExceptionHeader(trimmed);\n if (header) {\n out.exceptionClass = header.exceptionClass;\n if (header.message) out.message = header.message;\n continue;\n }\n }\n\n headerLines.push(trimmed);\n }\n\n if (!out.message && headerLines.length > 0) {\n out.message = headerLines.join(\" \");\n }\n\n return out;\n}\n\nfunction parseExceptionHeader(\n value: string,\n): { exceptionClass: string; message?: string } | null {\n const separator = value.indexOf(\":\");\n const exceptionClass = separator === -1 ? value : value.slice(0, separator);\n if (\n !exceptionClass ||\n ![\"Exception\", \"Error\", \"Throwable\"].some((suffix) => exceptionClass.endsWith(suffix))\n ) {\n return null;\n }\n for (const character of exceptionClass) {\n const code = character.charCodeAt(0);\n const valid =\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n character === \"_\" ||\n character === \".\" ||\n character === \"$\";\n if (!valid) return null;\n }\n\n if (separator === -1) return { exceptionClass };\n const message = value.slice(separator + 1).trimStart();\n return message ? { exceptionClass, message } : { exceptionClass };\n}\n\nfunction buildFrame(cls: string, method: string, locRaw: string): ParsedStackFrame {\n const loc = locRaw.trim();\n let file: string | undefined;\n let line: number | undefined;\n let nativeMethod = false;\n if (loc === \"Native Method\") {\n nativeMethod = true;\n } else if (loc !== \"Unknown Source\") {\n const cleaned = (loc.split(\" ~[\")[0] ?? loc).trim();\n const i = cleaned.lastIndexOf(\":\");\n if (i >= 0) {\n file = cleaned.slice(0, i);\n const n = Number(cleaned.slice(i + 1));\n if (Number.isFinite(n)) line = n;\n } else {\n file = cleaned;\n }\n }\n const functionName = `${cls}.${method}`;\n const location = file\n ? line\n ? `${file}:${line}`\n : file\n : nativeMethod\n ? \"Native Method\"\n : undefined;\n const frame: ParsedStackFrame = {\n functionName,\n displayName: shortDisplay(cls, method),\n kind: \"frame\",\n runtime: runtimePrefixes.some((p) => cls.startsWith(p)),\n nativeMethod,\n class: cls,\n method,\n };\n if (file !== undefined) frame.file = file;\n if (line !== undefined) frame.line = line;\n if (location !== undefined) frame.location = location;\n return frame;\n}\n\nfunction shortDisplay(cls: string, method: string): string {\n const parts = cls.split(\".\");\n const last = parts[parts.length - 1] ?? cls;\n return `${last}.${method}`;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stacktrace-parse.js","sources":["../../../src/data/diagnostics/stacktrace-parse.ts"],"sourcesContent":["import type { ParsedThreadFrame } from \"./jvm-stacktrace\";\nimport { frameLocation, isRuntimeFrame, shortFrameName } from \"./frame-heuristics\";\n\n// ParsedStackFrame is the React mirror of Go's clicky api.StackFrame. We reuse\n// ParsedThreadFrame so the shared StackFrameRow renderer can display it.\nexport type ParsedStackFrame = ParsedThreadFrame;\n\nexport interface ParsedStackTrace {\n exceptionClass?: string;\n message?: string;\n causedBy: string[];\n frames: ParsedStackFrame[];\n language: \"java\";\n}\n\nconst frameRe = /^\\s*at\\s+([\\w$.]+)\\.([\\w$<>]+)\\(([^)]+)\\)/;\nconst continuationRe = /^\\.\\.\\.\\s+\\d+\\s+more$/;\n\n\n// parseJavaStackTrace decodes a free-form Java exception dump (the body that\n// printStackTrace() emits, optionally wrapped by EclipseLink \"Internal\n// Exception:\" / \"Caused by:\" markers) into a renderable shape. It is the\n// React-side counterpart to Go's api.ParseJavaStackTrace.\nexport function parseJavaStackTrace(input: string): ParsedStackTrace {\n const out: ParsedStackTrace = {\n causedBy: [],\n frames: [],\n language: \"java\",\n };\n if (!input || !input.trim()) return out;\n\n const headerLines: string[] = [];\n for (const raw of input.split(\"\\n\")) {\n const trimmed = raw.trim();\n if (!trimmed) continue;\n if (continuationRe.test(trimmed)) continue;\n\n const frameMatch = frameRe.exec(raw);\n if (frameMatch && frameMatch[1] && frameMatch[2] && frameMatch[3] !== undefined) {\n out.frames.push(buildFrame(frameMatch[1], frameMatch[2], frameMatch[3]));\n continue;\n }\n\n if (trimmed.startsWith(\"Caused by:\")) {\n out.causedBy.push(trimmed.slice(\"Caused by:\".length).trim());\n continue;\n }\n if (trimmed.startsWith(\"Internal Exception:\")) {\n out.causedBy.push(trimmed.slice(\"Internal Exception:\".length).trim());\n continue;\n }\n\n if (!out.exceptionClass) {\n const header = parseExceptionHeader(trimmed);\n if (header) {\n out.exceptionClass = header.exceptionClass;\n if (header.message) out.message = header.message;\n continue;\n }\n }\n\n headerLines.push(trimmed);\n }\n\n if (!out.message && headerLines.length > 0) {\n out.message = headerLines.join(\" \");\n }\n\n return out;\n}\n\nfunction parseExceptionHeader(\n value: string,\n): { exceptionClass: string; message?: string } | null {\n const separator = value.indexOf(\":\");\n const exceptionClass = separator === -1 ? value : value.slice(0, separator);\n if (\n !exceptionClass ||\n ![\"Exception\", \"Error\", \"Throwable\"].some((suffix) => exceptionClass.endsWith(suffix))\n ) {\n return null;\n }\n for (const character of exceptionClass) {\n const code = character.charCodeAt(0);\n const valid =\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n character === \"_\" ||\n character === \".\" ||\n character === \"$\";\n if (!valid) return null;\n }\n\n if (separator === -1) return { exceptionClass };\n const message = value.slice(separator + 1).trimStart();\n return message ? { exceptionClass, message } : { exceptionClass };\n}\n\nfunction buildFrame(cls: string, method: string, locRaw: string): ParsedStackFrame {\n const loc = locRaw.trim();\n let file: string | undefined;\n let line: number | undefined;\n let nativeMethod = false;\n if (loc === \"Native Method\") {\n nativeMethod = true;\n } else if (loc !== \"Unknown Source\") {\n const cleaned = (loc.split(\" ~[\")[0] ?? loc).trim();\n const i = cleaned.lastIndexOf(\":\");\n if (i >= 0) {\n file = cleaned.slice(0, i);\n const n = Number(cleaned.slice(i + 1));\n if (Number.isFinite(n)) line = n;\n } else {\n file = cleaned;\n }\n }\n const functionName = `${cls}.${method}`;\n const location = frameLocation(file, line) ?? (nativeMethod ? \"Native Method\" : undefined);\n const frame: ParsedStackFrame = {\n functionName,\n displayName: shortFrameName(cls, method),\n kind: \"frame\",\n runtime: isRuntimeFrame(cls),\n nativeMethod,\n class: cls,\n method,\n };\n if (file !== undefined) frame.file = file;\n if (line !== undefined) frame.line = line;\n if (location !== undefined) frame.location = location;\n return frame;\n}\n"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ function RuntimeBar({
15
15
  models = [],
16
16
  families = runtimeMode.SPEC_RUNTIME_FAMILIES,
17
17
  reasoningEfforts = effortIcons.DEFAULT_REASONING_EFFORTS,
18
+ locked = false,
18
19
  ariaLabel = "Runtime",
19
20
  className
20
21
  }) {
@@ -90,6 +91,7 @@ function RuntimeBar({
90
91
  selectedModel: resolvedModel,
91
92
  selectedModelUnavailable,
92
93
  supportedEfforts,
94
+ locked,
93
95
  ariaLabel,
94
96
  className,
95
97
  onFamilyChange: (familyId) => applyBackend(familyId, selection.mode),
@@ -114,6 +116,7 @@ function RuntimeBar({
114
116
  selectedMode: selection.mode,
115
117
  reasoningEfforts,
116
118
  supportedEfforts,
119
+ locked,
117
120
  ariaLabel,
118
121
  className,
119
122
  onBackendChange: applyBackend,
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.cjs","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { runtimeModelMatches } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n backendForFamilyMode,\n familyById,\n firstMode,\n modelBelongsToFamily,\n modelsForFamily,\n selectionForBackend,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const selection = selectionForBackend(families, value.backend);\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, value.backend);\n const selectedModel = models.find(\n (entry) =>\n isSelectableModel(entry) &&\n entry.runtime?.backend === value.backend &&\n runtimeModelMatches(entry, value)\n );\n const resolvedModel =\n selectedModel ??\n models.find(\n (entry) => isSelectableModel(entry) && runtimeModelMatches(entry, value)\n );\n const selectedModelUnavailable = Boolean(\n value.model &&\n models.some(\n (entry) =>\n !isSelectableModel(entry) && runtimeModelMatches(entry, value)\n )\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts\n );\n\n const applyBackend = (familyId: string, modeId: string) => {\n const backend = backendForFamilyMode(families, familyId, modeId);\n if (backend === (value.backend ?? \"\")) return;\n let next = withOptionalRuntimeValue(\n withRuntimeValue(value, { backend }),\n \"cliArgs\",\n undefined\n );\n if (\n !modelBelongsToFamily(\n value.model,\n models,\n familyById(families, familyId),\n backend\n )\n ) {\n next = withoutCatalogModel(next);\n }\n onChange(next);\n };\n\n const applyCustomModel = (model: string) =>\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model)\n );\n // A menu row carries the backend of the catalog it was listed under, and one\n // catalog serves several backends — claude-cli and claude-cmux models are\n // listed as claude-agent rows. Copying the row's runtime verbatim would let\n // picking a model silently move the user off the mode they chose, so a row\n // drawn from the selected mode's own catalog keeps that mode.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(value, model, reasoningEfforts);\n if (!mode.provider || model.provider !== mode.provider) {\n onChange(next);\n return;\n }\n onChange(\n withOptionalRuntimeValue(\n withOptionalRuntimeValue(next, \"backend\", mode.backend),\n \"mode\",\n mode.id\n )\n );\n };\n const clearModel = () => onChange(withoutCatalogModel(value));\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyBackend(familyId, selection.mode)}\n onModeChange={(modeId) => applyBackend(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n ariaLabel={ariaLabel}\n className={className}\n onBackendChange={applyBackend}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined\n );\n}\n\nfunction withRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n patch: Partial<RuntimeBarValue>\n): T {\n return { ...value, ...patch };\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","selectionForBackend","familyById","firstMode","modelsForFamily","isSelectableModel","runtimeModelMatches","effortOptionsForModel","backendForFamilyMode","modelBelongsToFamily","reconcileModelCapabilities","jsx","RuntimeBarCombo","RuntimeBarSegments"],"mappings":";;;;;;;;;;AAyCO,SAAS,WAAsC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,SAAS,CAAA;AAAA,EACT,WAAWA,YAAAA;AAAAA,EACX,mBAAmBC,YAAAA;AAAAA,EACnB,YAAY;AAAA,EACZ;AACF,GAAuB;AACrB,QAAM,YAAYC,YAAAA,oBAAoB,UAAU,MAAM,OAAO;AAC7D,QAAM,SAASC,YAAAA,WAAW,UAAU,UAAU,MAAM;AACpD,QAAM,OACJ,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,UAAU,IAAI,KACxDC,YAAAA,UAAU,MAAM;AAClB,QAAM,eAAeC,YAAAA,gBAAgB,QAAQ,QAAQ,MAAM,OAAO;AAClE,QAAM,gBAAgB,OAAO;AAAA,IAC3B,CAAC,UAAA;;AACCC,0BAAAA,kBAAkB,KAAK,OACvB,WAAM,YAAN,mBAAe,aAAY,MAAM,WACjCC,iBAAAA,oBAAoB,OAAO,KAAK;AAAA;AAAA,EAAA;AAEpC,QAAM,gBACJ,iBACA,OAAO;AAAA,IACL,CAAC,UAAUD,aAAAA,kBAAkB,KAAK,KAAKC,iBAAAA,oBAAoB,OAAO,KAAK;AAAA,EAAA;AAE3E,QAAM,2BAA2B;AAAA,IAC/B,MAAM,SACJ,OAAO;AAAA,MACL,CAAC,UACC,CAACD,aAAAA,kBAAkB,KAAK,KAAKC,iBAAAA,oBAAoB,OAAO,KAAK;AAAA,IAAA;AAAA,EACjE;AAEJ,QAAM,mBAAmBC,kBAAAA;AAAAA,IACvB;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,eAAe,CAAC,UAAkB,WAAmB;AACzD,UAAM,UAAUC,YAAAA,qBAAqB,UAAU,UAAU,MAAM;AAC/D,QAAI,aAAa,MAAM,WAAW,IAAK;AACvC,QAAI,OAAO;AAAA,MACT,iBAAiB,OAAO,EAAE,SAAS;AAAA,MACnC;AAAA,MACA;AAAA,IAAA;AAEF,QACE,CAACC,YAAAA;AAAAA,MACC,MAAM;AAAA,MACN;AAAA,MACAP,YAAAA,WAAW,UAAU,QAAQ;AAAA,MAC7B;AAAA,IAAA,GAEF;AACA,aAAO,oBAAoB,IAAI;AAAA,IACjC;AACA,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,mBAAmB,CAAC,UACxB;AAAA,IACE,yBAAyB,oBAAoB,KAAK,GAAG,SAAS,KAAK;AAAA,EAAA;AAOvE,QAAM,aAAa,CAAC,UAAqB;AACvC,UAAM,OAAOQ,kBAAAA,2BAA2B,OAAO,OAAO,gBAAgB;AACtE,QAAI,CAAC,KAAK,YAAY,MAAM,aAAa,KAAK,UAAU;AACtD,eAAS,IAAI;AACb;AAAA,IACF;AACA;AAAA,MACE;AAAA,QACE,yBAAyB,MAAM,WAAW,KAAK,OAAO;AAAA,QACtD;AAAA,QACA,KAAK;AAAA,MAAA;AAAA,IACP;AAAA,EAEJ;AACA,QAAM,aAAa,MAAM,SAAS,oBAAoB,KAAK,CAAC;AAC5D,QAAM,cAAc,CAAC,WACnB,SAAS,yBAAyB,OAAO,UAAU,MAAM,CAAC;AAE5D,MAAI,YAAY,SAAS;AACvB,WACEC,2BAAAA;AAAAA,MAACC,gBAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,UAAU;AAAA,QACxB,QAAQ;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,CAAC,aAAa,aAAa,UAAU,UAAU,IAAI;AAAA,QACnE,cAAc,CAAC,WAAW,aAAa,OAAO,IAAI,MAAM;AAAA,QACxD,eAAe;AAAA,QACf,cAAc;AAAA,QACd,gBAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AAEA,SACED,2BAAAA;AAAAA,IAACE,mBAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,cAAc;AAAA,MACd,gBAAgB;AAAA,IAAA;AAAA,EAAA;AAGtB;AAEA,SAAS,oBAA+C,OAAa;AACnE,SAAO;AAAA,IACL,yBAAyB,OAAO,SAAS,MAAS;AAAA,IAClD;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,SAAS,iBACP,OACA,OACG;AACH,SAAO,EAAE,GAAG,OAAO,GAAG,MAAA;AACxB;AAEA,SAAS,yBACP,OACA,KACA,MACG;AACH,QAAM,UAAU,EAAE,GAAG,MAAA;AACrB,MAAI,SAAS,UAAa,SAAS,IAAI;AACrC,WAAO,QAAQ,GAAG;AAAA,EACpB,OAAO;AACL,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO;AACT;;"}
1
+ {"version":3,"file":"RuntimeBar.cjs","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { runtimeModelMatches } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n backendForFamilyMode,\n familyById,\n firstMode,\n modelBelongsToFamily,\n modelsForFamily,\n selectionForBackend,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, backend, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const selection = selectionForBackend(families, value.backend);\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, value.backend);\n const selectedModel = models.find(\n (entry) =>\n isSelectableModel(entry) &&\n entry.runtime?.backend === value.backend &&\n runtimeModelMatches(entry, value),\n );\n const resolvedModel =\n selectedModel ??\n models.find(\n (entry) => isSelectableModel(entry) && runtimeModelMatches(entry, value),\n );\n const selectedModelUnavailable = Boolean(\n value.model &&\n models.some(\n (entry) => !isSelectableModel(entry) && runtimeModelMatches(entry, value),\n ),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyBackend = (familyId: string, modeId: string) => {\n const backend = backendForFamilyMode(families, familyId, modeId);\n if (backend === (value.backend ?? \"\")) return;\n let next = withOptionalRuntimeValue(\n withRuntimeValue(value, { backend }),\n \"cliArgs\",\n undefined,\n );\n if (\n !modelBelongsToFamily(\n value.model,\n models,\n familyById(families, familyId),\n backend,\n )\n ) {\n next = withoutCatalogModel(next);\n }\n onChange(next);\n };\n\n const applyCustomModel = (model: string) =>\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n // A menu row carries the backend of the catalog it was listed under, and one\n // catalog serves several backends — claude-cli and claude-cmux models are\n // listed as claude-agent rows. Copying the row's runtime verbatim would let\n // picking a model silently move the user off the mode they chose, so a row\n // drawn from the selected mode's own catalog keeps that mode.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(value, model, reasoningEfforts);\n if (!mode.provider || model.provider !== mode.provider) {\n onChange(next);\n return;\n }\n onChange(\n withOptionalRuntimeValue(\n withOptionalRuntimeValue(next, \"backend\", mode.backend),\n \"mode\",\n mode.id,\n ),\n );\n };\n const clearModel = () => onChange(withoutCatalogModel(value));\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyBackend(familyId, selection.mode)}\n onModeChange={(modeId) => applyBackend(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n ariaLabel={ariaLabel}\n className={className}\n onBackendChange={applyBackend}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n patch: Partial<RuntimeBarValue>,\n): T {\n return { ...value, ...patch };\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","selectionForBackend","familyById","firstMode","modelsForFamily","isSelectableModel","runtimeModelMatches","effortOptionsForModel","backendForFamilyMode","modelBelongsToFamily","reconcileModelCapabilities","jsx","RuntimeBarCombo","RuntimeBarSegments"],"mappings":"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"}
@@ -14,9 +14,11 @@ export type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {
14
14
  families?: SpecRuntimeFamily[] | undefined;
15
15
  /** Effort tiers offered when the catalog does not describe the model. */
16
16
  reasoningEfforts?: string[] | undefined;
17
+ /** Locks model identity (family, backend, and model) while leaving effort editable. */
18
+ locked?: boolean | undefined;
17
19
  ariaLabel?: string | undefined;
18
20
  className?: string | undefined;
19
21
  };
20
22
  /** Self-describing runtime controls with segmented and combo presentations. */
21
- export declare function RuntimeBar<T extends RuntimeBarValue>({ value, onChange, variant, models, families, reasoningEfforts, ariaLabel, className, }: RuntimeBarProps<T>): import("react/jsx-runtime").JSX.Element;
23
+ export declare function RuntimeBar<T extends RuntimeBarValue>({ value, onChange, variant, models, families, reasoningEfforts, locked, ariaLabel, className, }: RuntimeBarProps<T>): import("react/jsx-runtime").JSX.Element;
22
24
  //# sourceMappingURL=RuntimeBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAQL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,gBAA4C,EAC5C,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,2CA2HpB"}
1
+ {"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAQL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,gBAA4C,EAC5C,MAAc,EACd,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,2CA4HpB"}
@@ -13,6 +13,7 @@ function RuntimeBar({
13
13
  models = [],
14
14
  families = SPEC_RUNTIME_FAMILIES,
15
15
  reasoningEfforts = DEFAULT_REASONING_EFFORTS,
16
+ locked = false,
16
17
  ariaLabel = "Runtime",
17
18
  className
18
19
  }) {
@@ -88,6 +89,7 @@ function RuntimeBar({
88
89
  selectedModel: resolvedModel,
89
90
  selectedModelUnavailable,
90
91
  supportedEfforts,
92
+ locked,
91
93
  ariaLabel,
92
94
  className,
93
95
  onFamilyChange: (familyId) => applyBackend(familyId, selection.mode),
@@ -112,6 +114,7 @@ function RuntimeBar({
112
114
  selectedMode: selection.mode,
113
115
  reasoningEfforts,
114
116
  supportedEfforts,
117
+ locked,
115
118
  ariaLabel,
116
119
  className,
117
120
  onBackendChange: applyBackend,
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { runtimeModelMatches } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n backendForFamilyMode,\n familyById,\n firstMode,\n modelBelongsToFamily,\n modelsForFamily,\n selectionForBackend,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const selection = selectionForBackend(families, value.backend);\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, value.backend);\n const selectedModel = models.find(\n (entry) =>\n isSelectableModel(entry) &&\n entry.runtime?.backend === value.backend &&\n runtimeModelMatches(entry, value)\n );\n const resolvedModel =\n selectedModel ??\n models.find(\n (entry) => isSelectableModel(entry) && runtimeModelMatches(entry, value)\n );\n const selectedModelUnavailable = Boolean(\n value.model &&\n models.some(\n (entry) =>\n !isSelectableModel(entry) && runtimeModelMatches(entry, value)\n )\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts\n );\n\n const applyBackend = (familyId: string, modeId: string) => {\n const backend = backendForFamilyMode(families, familyId, modeId);\n if (backend === (value.backend ?? \"\")) return;\n let next = withOptionalRuntimeValue(\n withRuntimeValue(value, { backend }),\n \"cliArgs\",\n undefined\n );\n if (\n !modelBelongsToFamily(\n value.model,\n models,\n familyById(families, familyId),\n backend\n )\n ) {\n next = withoutCatalogModel(next);\n }\n onChange(next);\n };\n\n const applyCustomModel = (model: string) =>\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model)\n );\n // A menu row carries the backend of the catalog it was listed under, and one\n // catalog serves several backends — claude-cli and claude-cmux models are\n // listed as claude-agent rows. Copying the row's runtime verbatim would let\n // picking a model silently move the user off the mode they chose, so a row\n // drawn from the selected mode's own catalog keeps that mode.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(value, model, reasoningEfforts);\n if (!mode.provider || model.provider !== mode.provider) {\n onChange(next);\n return;\n }\n onChange(\n withOptionalRuntimeValue(\n withOptionalRuntimeValue(next, \"backend\", mode.backend),\n \"mode\",\n mode.id\n )\n );\n };\n const clearModel = () => onChange(withoutCatalogModel(value));\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyBackend(familyId, selection.mode)}\n onModeChange={(modeId) => applyBackend(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n ariaLabel={ariaLabel}\n className={className}\n onBackendChange={applyBackend}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined\n );\n}\n\nfunction withRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n patch: Partial<RuntimeBarValue>\n): T {\n return { ...value, ...patch };\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":[],"mappings":";;;;;;;;AAyCO,SAAS,WAAsC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,SAAS,CAAA;AAAA,EACT,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ;AACF,GAAuB;AACrB,QAAM,YAAY,oBAAoB,UAAU,MAAM,OAAO;AAC7D,QAAM,SAAS,WAAW,UAAU,UAAU,MAAM;AACpD,QAAM,OACJ,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,UAAU,IAAI,KACxD,UAAU,MAAM;AAClB,QAAM,eAAe,gBAAgB,QAAQ,QAAQ,MAAM,OAAO;AAClE,QAAM,gBAAgB,OAAO;AAAA,IAC3B,CAAC,UAAA;;AACC,+BAAkB,KAAK,OACvB,WAAM,YAAN,mBAAe,aAAY,MAAM,WACjC,oBAAoB,OAAO,KAAK;AAAA;AAAA,EAAA;AAEpC,QAAM,gBACJ,iBACA,OAAO;AAAA,IACL,CAAC,UAAU,kBAAkB,KAAK,KAAK,oBAAoB,OAAO,KAAK;AAAA,EAAA;AAE3E,QAAM,2BAA2B;AAAA,IAC/B,MAAM,SACJ,OAAO;AAAA,MACL,CAAC,UACC,CAAC,kBAAkB,KAAK,KAAK,oBAAoB,OAAO,KAAK;AAAA,IAAA;AAAA,EACjE;AAEJ,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,eAAe,CAAC,UAAkB,WAAmB;AACzD,UAAM,UAAU,qBAAqB,UAAU,UAAU,MAAM;AAC/D,QAAI,aAAa,MAAM,WAAW,IAAK;AACvC,QAAI,OAAO;AAAA,MACT,iBAAiB,OAAO,EAAE,SAAS;AAAA,MACnC;AAAA,MACA;AAAA,IAAA;AAEF,QACE,CAAC;AAAA,MACC,MAAM;AAAA,MACN;AAAA,MACA,WAAW,UAAU,QAAQ;AAAA,MAC7B;AAAA,IAAA,GAEF;AACA,aAAO,oBAAoB,IAAI;AAAA,IACjC;AACA,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,mBAAmB,CAAC,UACxB;AAAA,IACE,yBAAyB,oBAAoB,KAAK,GAAG,SAAS,KAAK;AAAA,EAAA;AAOvE,QAAM,aAAa,CAAC,UAAqB;AACvC,UAAM,OAAO,2BAA2B,OAAO,OAAO,gBAAgB;AACtE,QAAI,CAAC,KAAK,YAAY,MAAM,aAAa,KAAK,UAAU;AACtD,eAAS,IAAI;AACb;AAAA,IACF;AACA;AAAA,MACE;AAAA,QACE,yBAAyB,MAAM,WAAW,KAAK,OAAO;AAAA,QACtD;AAAA,QACA,KAAK;AAAA,MAAA;AAAA,IACP;AAAA,EAEJ;AACA,QAAM,aAAa,MAAM,SAAS,oBAAoB,KAAK,CAAC;AAC5D,QAAM,cAAc,CAAC,WACnB,SAAS,yBAAyB,OAAO,UAAU,MAAM,CAAC;AAE5D,MAAI,YAAY,SAAS;AACvB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,UAAU;AAAA,QACxB,QAAQ;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,CAAC,aAAa,aAAa,UAAU,UAAU,IAAI;AAAA,QACnE,cAAc,CAAC,WAAW,aAAa,OAAO,IAAI,MAAM;AAAA,QACxD,eAAe;AAAA,QACf,cAAc;AAAA,QACd,gBAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,cAAc;AAAA,MACd,gBAAgB;AAAA,IAAA;AAAA,EAAA;AAGtB;AAEA,SAAS,oBAA+C,OAAa;AACnE,SAAO;AAAA,IACL,yBAAyB,OAAO,SAAS,MAAS;AAAA,IAClD;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,SAAS,iBACP,OACA,OACG;AACH,SAAO,EAAE,GAAG,OAAO,GAAG,MAAA;AACxB;AAEA,SAAS,yBACP,OACA,KACA,MACG;AACH,QAAM,UAAU,EAAE,GAAG,MAAA;AACrB,MAAI,SAAS,UAAa,SAAS,IAAI;AACrC,WAAO,QAAQ,GAAG;AAAA,EACpB,OAAO;AACL,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { runtimeModelMatches } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n backendForFamilyMode,\n familyById,\n firstMode,\n modelBelongsToFamily,\n modelsForFamily,\n selectionForBackend,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, backend, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const selection = selectionForBackend(families, value.backend);\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, value.backend);\n const selectedModel = models.find(\n (entry) =>\n isSelectableModel(entry) &&\n entry.runtime?.backend === value.backend &&\n runtimeModelMatches(entry, value),\n );\n const resolvedModel =\n selectedModel ??\n models.find(\n (entry) => isSelectableModel(entry) && runtimeModelMatches(entry, value),\n );\n const selectedModelUnavailable = Boolean(\n value.model &&\n models.some(\n (entry) => !isSelectableModel(entry) && runtimeModelMatches(entry, value),\n ),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyBackend = (familyId: string, modeId: string) => {\n const backend = backendForFamilyMode(families, familyId, modeId);\n if (backend === (value.backend ?? \"\")) return;\n let next = withOptionalRuntimeValue(\n withRuntimeValue(value, { backend }),\n \"cliArgs\",\n undefined,\n );\n if (\n !modelBelongsToFamily(\n value.model,\n models,\n familyById(families, familyId),\n backend,\n )\n ) {\n next = withoutCatalogModel(next);\n }\n onChange(next);\n };\n\n const applyCustomModel = (model: string) =>\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n // A menu row carries the backend of the catalog it was listed under, and one\n // catalog serves several backends — claude-cli and claude-cmux models are\n // listed as claude-agent rows. Copying the row's runtime verbatim would let\n // picking a model silently move the user off the mode they chose, so a row\n // drawn from the selected mode's own catalog keeps that mode.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(value, model, reasoningEfforts);\n if (!mode.provider || model.provider !== mode.provider) {\n onChange(next);\n return;\n }\n onChange(\n withOptionalRuntimeValue(\n withOptionalRuntimeValue(next, \"backend\", mode.backend),\n \"mode\",\n mode.id,\n ),\n );\n };\n const clearModel = () => onChange(withoutCatalogModel(value));\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyBackend(familyId, selection.mode)}\n onModeChange={(modeId) => applyBackend(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n ariaLabel={ariaLabel}\n className={className}\n onBackendChange={applyBackend}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n patch: Partial<RuntimeBarValue>,\n): T {\n return { ...value, ...patch };\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ function RuntimeBarCombo({
22
22
  selectedModel,
23
23
  selectedModelUnavailable,
24
24
  supportedEfforts,
25
+ locked,
25
26
  ariaLabel,
26
27
  className,
27
28
  onFamilyChange,
@@ -34,7 +35,7 @@ function RuntimeBarCombo({
34
35
  const modelLabel = selectedModelUnavailable ? "Unavailable selection" : (selectedModel == null ? void 0 : selectedModel.label) ?? value.model ?? "Prompt default";
35
36
  const effortLabel = value.effort ? effortIcons.effortLevelLabel(value.effort) : "None";
36
37
  const effortIcon = value.effort ? effortIcons.effortLevelIcon(value.effort) : void 0;
37
- const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}`;
38
+ const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}${locked ? ". Model and backend are locked for this conversation; fork it to change them" : ""}`;
38
39
  return /* @__PURE__ */ jsxRuntime.jsx(
39
40
  DropdownMenu.DropdownMenu,
40
41
  {
@@ -89,11 +90,13 @@ function RuntimeBarCombo({
89
90
  ),
90
91
  children: () => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-1 text-xs", children: [
91
92
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 border-b border-border px-2 pb-3 pt-2", children: [
93
+ locked && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded bg-muted px-2 py-1.5 text-[11px] text-muted-foreground", children: "Model and backend are locked. Fork this conversation to change them." }),
92
94
  /* @__PURE__ */ jsxRuntime.jsx(
93
95
  FamilySegments,
94
96
  {
95
97
  families,
96
98
  value: family.id,
99
+ locked,
97
100
  onChange: onFamilyChange
98
101
  }
99
102
  ),
@@ -102,6 +105,7 @@ function RuntimeBarCombo({
102
105
  {
103
106
  family,
104
107
  value: selectedMode,
108
+ locked,
105
109
  onChange: onModeChange
106
110
  }
107
111
  ),
@@ -120,6 +124,7 @@ function RuntimeBarCombo({
120
124
  models,
121
125
  familyBrand: brand,
122
126
  selectedId: (selectedModel == null ? void 0 : selectedModel.id) ?? value.model,
127
+ locked,
123
128
  onSelect: onModelSelect,
124
129
  onClear: onModelClear
125
130
  }
@@ -131,6 +136,7 @@ function RuntimeBarCombo({
131
136
  function FamilySegments({
132
137
  families,
133
138
  value,
139
+ locked,
134
140
  onChange
135
141
  }) {
136
142
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -149,6 +155,7 @@ function FamilySegments({
149
155
  return {
150
156
  id: family.id,
151
157
  label: family.label,
158
+ disabled: locked,
152
159
  ...brand.icon ? { icon: brand.icon } : {}
153
160
  };
154
161
  })
@@ -158,6 +165,7 @@ function FamilySegments({
158
165
  function ModeSegments({
159
166
  family,
160
167
  value,
168
+ locked,
161
169
  onChange
162
170
  }) {
163
171
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -171,6 +179,7 @@ function ModeSegments({
171
179
  options: family.modes.filter((mode) => !availability.isUnavailable(mode.availability)).map((mode) => ({
172
180
  id: mode.id,
173
181
  label: mode.label,
182
+ disabled: locked,
174
183
  ...mode.title ? { title: mode.title } : {},
175
184
  ...mode.icon ? { icon: mode.icon } : {}
176
185
  }))
@@ -181,6 +190,7 @@ function ModelChoices({
181
190
  models,
182
191
  familyBrand,
183
192
  selectedId,
193
+ locked,
184
194
  onSelect,
185
195
  onClear
186
196
  }) {
@@ -190,6 +200,7 @@ function ModelChoices({
190
200
  {
191
201
  label: "Prompt default",
192
202
  selected: !selectedId,
203
+ disabled: locked,
193
204
  onClick: onClear
194
205
  }
195
206
  ),
@@ -201,6 +212,7 @@ function ModelChoices({
201
212
  label: model.label,
202
213
  title: model.id,
203
214
  selected: model.id === selectedId,
215
+ disabled: locked,
204
216
  ...icon ? {
205
217
  icon,
206
218
  iconColor: providerIcons.providerIconColor(model.provider) ?? familyBrand.color
@@ -217,6 +229,7 @@ function ModelChoice({
217
229
  title,
218
230
  detail,
219
231
  selected,
232
+ disabled,
220
233
  icon,
221
234
  iconColor,
222
235
  onClick
@@ -226,6 +239,7 @@ function ModelChoice({
226
239
  {
227
240
  variant: "ghost",
228
241
  type: "button",
242
+ disabled,
229
243
  onClick,
230
244
  "aria-label": detail ? `${label}. ${detail}` : label,
231
245
  ...title ? { title } : {},
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBarCombo.cjs","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport { isUnavailable } from \"./availability\";\nimport {\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarComboProps = {\n value: RuntimeBarValue;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n models: ChatModel[];\n selectedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n supportedEfforts: string[];\n ariaLabel: string;\n className?: string | undefined;\n onFamilyChange: (familyId: string) => void;\n onModeChange: (modeId: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarCombo({\n value,\n families,\n family,\n mode,\n selectedMode,\n models,\n selectedModel,\n selectedModelUnavailable,\n supportedEfforts,\n ariaLabel,\n className,\n onFamilyChange,\n onModeChange,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarComboProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : selectedModel?.label ?? value.model ?? \"Prompt default\";\n const effortLabel = value.effort ? effortLevelLabel(value.effort) : \"None\";\n const effortIcon = value.effort ? effortLevelIcon(value.effort) : undefined;\n const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}`;\n\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={`${ariaLabel} controls`}\n {...(className ? { className } : {})}\n menuClassName=\"max-h-[70vh] w-80 max-w-[calc(100vw-24px)] overflow-y-auto\"\n trigger={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={summary}\n aria-label={summary}\n className=\"max-w-full gap-1.5 px-density-2\"\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className=\"min-w-0 truncate text-xs font-semibold text-foreground\">\n {modelLabel}\n </span>\n {effortIcon && (\n <Icon\n icon={effortIcon}\n className={cn(\n \"size-4 shrink-0\",\n value.effort ? effortLevelColor(value.effort) : undefined\n )}\n />\n )}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </Button>\n }\n >\n {() => (\n <div className=\"p-1 text-xs\">\n <div className=\"space-y-2 border-b border-border px-2 pb-3 pt-2\">\n <FamilySegments\n families={families}\n value={family.id}\n onChange={onFamilyChange}\n />\n <ModeSegments\n family={family}\n value={selectedMode}\n onChange={onModeChange}\n />\n <EffortSlider\n value={value.effort}\n efforts={supportedEfforts}\n onChange={onEffortChange}\n />\n </div>\n <ModelChoices\n models={models}\n familyBrand={brand}\n selectedId={selectedModel?.id ?? value.model}\n onSelect={onModelSelect}\n onClear={onModelClear}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction FamilySegments({\n families,\n value,\n onChange,\n}: {\n families: SpecRuntimeFamily[];\n value: string;\n onChange: (familyId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Family\"\n size=\"sm\"\n wrap\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability))\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n return {\n id: family.id,\n label: family.label,\n ...(brand.icon ? { icon: brand.icon } : {}),\n };\n })}\n />\n );\n}\n\nfunction ModeSegments({\n family,\n value,\n onChange,\n}: {\n family: SpecRuntimeFamily;\n value: string;\n onChange: (modeId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Runtime mode\"\n size=\"sm\"\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n id: mode.id,\n label: mode.label,\n ...(mode.title ? { title: mode.title } : {}),\n ...(mode.icon ? { icon: mode.icon } : {}),\n }))}\n />\n );\n}\n\nfunction ModelChoices({\n models,\n familyBrand,\n selectedId,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n familyBrand: ReturnType<typeof runtimeFamilyBrand>;\n selectedId?: string | undefined;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}) {\n return (\n <div className=\"space-y-0.5 py-1\">\n <ModelChoice\n label=\"Prompt default\"\n selected={!selectedId}\n onClick={onClear}\n />\n {models.map((model) => {\n const icon = providerIcon(model.provider) ?? familyBrand.icon;\n return (\n <ModelChoice\n key={model.id}\n label={model.label}\n title={model.id}\n selected={model.id === selectedId}\n {...(icon\n ? {\n icon,\n iconColor:\n providerIconColor(model.provider) ?? familyBrand.color,\n }\n : {})}\n onClick={() => onSelect(model)}\n />\n );\n })}\n </div>\n );\n}\n\nfunction ModelChoice({\n label,\n title,\n detail,\n selected,\n icon,\n iconColor,\n onClick,\n}: {\n label: string;\n title?: string | undefined;\n detail?: string | undefined;\n selected: boolean;\n icon?: NonNullable<ReturnType<typeof providerIcon>>;\n iconColor?: string | undefined;\n onClick: () => void;\n}) {\n return (\n <Button\n variant=\"ghost\"\n type=\"button\"\n onClick={onClick}\n aria-label={detail ? `${label}. ${detail}` : label}\n {...(title ? { title } : {})}\n className=\"group flex min-h-8 w-full items-center justify-start gap-2 rounded-md px-2 py-1.5 text-left hover:bg-muted\"\n >\n {icon ? (\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted/70 ring-1 ring-border/60 group-hover:bg-background\">\n <Icon icon={icon} className={cn(\"size-3.5\", iconColor)} />\n </span>\n ) : (\n <span className=\"size-6 shrink-0\" />\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\"block truncate text-sm\", selected && \"font-semibold\")}\n >\n {label}\n </span>\n {detail && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {detail}\n </span>\n )}\n </span>\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\"\n )}\n />\n </Button>\n );\n}\n\nfunction EffortSlider({\n value,\n efforts,\n onChange,\n}: {\n value?: string | undefined;\n efforts: string[];\n onChange: (effort: string) => void;\n}) {\n const supported = [\n ...new Set(efforts.map((effort) => effort.trim()).filter(Boolean)),\n ];\n if (supported.length === 0) {\n return (\n <div className=\"flex h-8 items-center justify-center text-[11px] text-muted-foreground\">\n Fixed effort for this model\n </div>\n );\n }\n\n const options = [\"\", ...supported];\n const current = value?.trim() ?? \"\";\n const currentIndex = options.indexOf(current);\n const sliderIndex = currentIndex >= 0 ? currentIndex : 0;\n const label =\n currentIndex >= 0\n ? current\n ? effortLevelLabel(current)\n : \"None\"\n : `${effortLevelLabel(current)} unsupported`;\n const percent = (sliderIndex / (options.length - 1)) * 100;\n const firstIcon = effortLevelIcon(supported[0]!);\n const lastIcon = effortLevelIcon(supported[supported.length - 1]!);\n const selectedIcon = current ? effortLevelIcon(current) : undefined;\n\n return (\n <div\n className=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-1.5\"\n aria-label=\"Model effort\"\n >\n {firstIcon ? (\n <Icon\n icon={firstIcon}\n className={cn(\"mt-3 size-3.5\", effortLevelColor(supported[0]!))}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n <div className=\"relative h-11 pt-1\">\n <input\n type=\"range\"\n min={0}\n max={options.length - 1}\n step={1}\n value={sliderIndex}\n aria-label=\"Reasoning effort\"\n aria-valuetext={label}\n aria-invalid={currentIndex < 0}\n onChange={(event) => {\n const next = options[Number(event.target.value)];\n if (next === undefined) {\n throw new Error(\n `Invalid reasoning effort index: ${event.target.value}`\n );\n }\n onChange(next);\n }}\n className=\"h-1 w-full cursor-pointer appearance-none rounded-full bg-muted accent-foreground [&::-moz-range-thumb]:size-3 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background [&::-moz-range-thumb]:bg-foreground [&::-webkit-slider-thumb]:size-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background [&::-webkit-slider-thumb]:bg-foreground [&::-webkit-slider-thumb]:shadow-sm\"\n />\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-7 -translate-x-1/2\"\n style={{ left: `${percent}%` }}\n >\n <span\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-full border px-1.5 text-[10px] font-semibold leading-none\",\n currentIndex < 0\n ? \"border-destructive/25 bg-destructive/10 text-destructive\"\n : current\n ? cn(\"border-current/25 bg-muted\", effortLevelColor(current))\n : \"border-border bg-muted text-muted-foreground\"\n )}\n title={`Effort: ${label}`}\n >\n {selectedIcon && <Icon icon={selectedIcon} className=\"size-3\" />}\n {label}\n </span>\n </span>\n </div>\n {lastIcon ? (\n <Icon\n icon={lastIcon}\n className={cn(\n \"mt-3 size-3.5\",\n effortLevelColor(supported[supported.length - 1]!)\n )}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n </div>\n );\n}\n"],"names":["runtimeFamilyBrand","effortLevelLabel","effortLevelIcon","jsx","DropdownMenu","jsxs","Button","Icon","cn","effortLevelColor","UiChevronDown","SegmentedControl","isUnavailable","providerIcon","providerIconColor","UiCheck"],"mappings":"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"}
1
+ {"version":3,"file":"RuntimeBarCombo.cjs","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport { isUnavailable } from \"./availability\";\nimport {\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarComboProps = {\n value: RuntimeBarValue;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n models: ChatModel[];\n selectedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n supportedEfforts: string[];\n locked: boolean;\n ariaLabel: string;\n className?: string | undefined;\n onFamilyChange: (familyId: string) => void;\n onModeChange: (modeId: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarCombo({\n value,\n families,\n family,\n mode,\n selectedMode,\n models,\n selectedModel,\n selectedModelUnavailable,\n supportedEfforts,\n locked,\n ariaLabel,\n className,\n onFamilyChange,\n onModeChange,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarComboProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : (selectedModel?.label ?? value.model ?? \"Prompt default\");\n const effortLabel = value.effort ? effortLevelLabel(value.effort) : \"None\";\n const effortIcon = value.effort ? effortLevelIcon(value.effort) : undefined;\n const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}${locked ? \". Model and backend are locked for this conversation; fork it to change them\" : \"\"}`;\n\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={`${ariaLabel} controls`}\n {...(className ? { className } : {})}\n menuClassName=\"max-h-[70vh] w-80 max-w-[calc(100vw-24px)] overflow-y-auto\"\n trigger={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={summary}\n aria-label={summary}\n className=\"max-w-full gap-1.5 px-density-2\"\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className=\"min-w-0 truncate text-xs font-semibold text-foreground\">\n {modelLabel}\n </span>\n {effortIcon && (\n <Icon\n icon={effortIcon}\n className={cn(\n \"size-4 shrink-0\",\n value.effort ? effortLevelColor(value.effort) : undefined,\n )}\n />\n )}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </Button>\n }\n >\n {() => (\n <div className=\"p-1 text-xs\">\n <div className=\"space-y-2 border-b border-border px-2 pb-3 pt-2\">\n {locked && (\n <div className=\"rounded bg-muted px-2 py-1.5 text-[11px] text-muted-foreground\">\n Model and backend are locked. Fork this conversation to change\n them.\n </div>\n )}\n <FamilySegments\n families={families}\n value={family.id}\n locked={locked}\n onChange={onFamilyChange}\n />\n <ModeSegments\n family={family}\n value={selectedMode}\n locked={locked}\n onChange={onModeChange}\n />\n <EffortSlider\n value={value.effort}\n efforts={supportedEfforts}\n onChange={onEffortChange}\n />\n </div>\n <ModelChoices\n models={models}\n familyBrand={brand}\n selectedId={selectedModel?.id ?? value.model}\n locked={locked}\n onSelect={onModelSelect}\n onClear={onModelClear}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction FamilySegments({\n families,\n value,\n locked,\n onChange,\n}: {\n families: SpecRuntimeFamily[];\n value: string;\n locked: boolean;\n onChange: (familyId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Family\"\n size=\"sm\"\n wrap\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability)),\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n return {\n id: family.id,\n label: family.label,\n disabled: locked,\n ...(brand.icon ? { icon: brand.icon } : {}),\n };\n })}\n />\n );\n}\n\nfunction ModeSegments({\n family,\n value,\n locked,\n onChange,\n}: {\n family: SpecRuntimeFamily;\n value: string;\n locked: boolean;\n onChange: (modeId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Runtime mode\"\n size=\"sm\"\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n id: mode.id,\n label: mode.label,\n disabled: locked,\n ...(mode.title ? { title: mode.title } : {}),\n ...(mode.icon ? { icon: mode.icon } : {}),\n }))}\n />\n );\n}\n\nfunction ModelChoices({\n models,\n familyBrand,\n selectedId,\n locked,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n familyBrand: ReturnType<typeof runtimeFamilyBrand>;\n selectedId?: string | undefined;\n locked: boolean;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}) {\n return (\n <div className=\"space-y-0.5 py-1\">\n <ModelChoice\n label=\"Prompt default\"\n selected={!selectedId}\n disabled={locked}\n onClick={onClear}\n />\n {models.map((model) => {\n const icon = providerIcon(model.provider) ?? familyBrand.icon;\n return (\n <ModelChoice\n key={model.id}\n label={model.label}\n title={model.id}\n selected={model.id === selectedId}\n disabled={locked}\n {...(icon\n ? {\n icon,\n iconColor:\n providerIconColor(model.provider) ?? familyBrand.color,\n }\n : {})}\n onClick={() => onSelect(model)}\n />\n );\n })}\n </div>\n );\n}\n\nfunction ModelChoice({\n label,\n title,\n detail,\n selected,\n disabled,\n icon,\n iconColor,\n onClick,\n}: {\n label: string;\n title?: string | undefined;\n detail?: string | undefined;\n selected: boolean;\n disabled: boolean;\n icon?: NonNullable<ReturnType<typeof providerIcon>>;\n iconColor?: string | undefined;\n onClick: () => void;\n}) {\n return (\n <Button\n variant=\"ghost\"\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n aria-label={detail ? `${label}. ${detail}` : label}\n {...(title ? { title } : {})}\n className=\"group flex min-h-8 w-full items-center justify-start gap-2 rounded-md px-2 py-1.5 text-left hover:bg-muted\"\n >\n {icon ? (\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted/70 ring-1 ring-border/60 group-hover:bg-background\">\n <Icon icon={icon} className={cn(\"size-3.5\", iconColor)} />\n </span>\n ) : (\n <span className=\"size-6 shrink-0\" />\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\"block truncate text-sm\", selected && \"font-semibold\")}\n >\n {label}\n </span>\n {detail && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {detail}\n </span>\n )}\n </span>\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\",\n )}\n />\n </Button>\n );\n}\n\nfunction EffortSlider({\n value,\n efforts,\n onChange,\n}: {\n value?: string | undefined;\n efforts: string[];\n onChange: (effort: string) => void;\n}) {\n const supported = [\n ...new Set(efforts.map((effort) => effort.trim()).filter(Boolean)),\n ];\n if (supported.length === 0) {\n return (\n <div className=\"flex h-8 items-center justify-center text-[11px] text-muted-foreground\">\n Fixed effort for this model\n </div>\n );\n }\n\n const options = [\"\", ...supported];\n const current = value?.trim() ?? \"\";\n const currentIndex = options.indexOf(current);\n const sliderIndex = currentIndex >= 0 ? currentIndex : 0;\n const label =\n currentIndex >= 0\n ? current\n ? effortLevelLabel(current)\n : \"None\"\n : `${effortLevelLabel(current)} unsupported`;\n const percent = (sliderIndex / (options.length - 1)) * 100;\n const firstIcon = effortLevelIcon(supported[0]!);\n const lastIcon = effortLevelIcon(supported[supported.length - 1]!);\n const selectedIcon = current ? effortLevelIcon(current) : undefined;\n\n return (\n <div\n className=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-1.5\"\n aria-label=\"Model effort\"\n >\n {firstIcon ? (\n <Icon\n icon={firstIcon}\n className={cn(\"mt-3 size-3.5\", effortLevelColor(supported[0]!))}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n <div className=\"relative h-11 pt-1\">\n <input\n type=\"range\"\n min={0}\n max={options.length - 1}\n step={1}\n value={sliderIndex}\n aria-label=\"Reasoning effort\"\n aria-valuetext={label}\n aria-invalid={currentIndex < 0}\n onChange={(event) => {\n const next = options[Number(event.target.value)];\n if (next === undefined) {\n throw new Error(\n `Invalid reasoning effort index: ${event.target.value}`,\n );\n }\n onChange(next);\n }}\n className=\"h-1 w-full cursor-pointer appearance-none rounded-full bg-muted accent-foreground [&::-moz-range-thumb]:size-3 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background [&::-moz-range-thumb]:bg-foreground [&::-webkit-slider-thumb]:size-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background [&::-webkit-slider-thumb]:bg-foreground [&::-webkit-slider-thumb]:shadow-sm\"\n />\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-7 -translate-x-1/2\"\n style={{ left: `${percent}%` }}\n >\n <span\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-full border px-1.5 text-[10px] font-semibold leading-none\",\n currentIndex < 0\n ? \"border-destructive/25 bg-destructive/10 text-destructive\"\n : current\n ? cn(\"border-current/25 bg-muted\", effortLevelColor(current))\n : \"border-border bg-muted text-muted-foreground\",\n )}\n title={`Effort: ${label}`}\n >\n {selectedIcon && <Icon icon={selectedIcon} className=\"size-3\" />}\n {label}\n </span>\n </span>\n </div>\n {lastIcon ? (\n <Icon\n icon={lastIcon}\n className={cn(\n \"mt-3 size-3.5\",\n effortLevelColor(supported[supported.length - 1]!),\n )}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n </div>\n );\n}\n"],"names":["runtimeFamilyBrand","effortLevelLabel","effortLevelIcon","jsx","DropdownMenu","jsxs","Button","Icon","cn","effortLevelColor","UiChevronDown","SegmentedControl","isUnavailable","providerIcon","providerIconColor","UiCheck"],"mappings":"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"}
@@ -11,6 +11,7 @@ export type RuntimeBarComboProps = {
11
11
  selectedModel: ChatModel | undefined;
12
12
  selectedModelUnavailable: boolean;
13
13
  supportedEfforts: string[];
14
+ locked: boolean;
14
15
  ariaLabel: string;
15
16
  className?: string | undefined;
16
17
  onFamilyChange: (familyId: string) => void;
@@ -19,5 +20,5 @@ export type RuntimeBarComboProps = {
19
20
  onModelClear: () => void;
20
21
  onEffortChange: (effort: string) => void;
21
22
  };
22
- export declare function RuntimeBarCombo({ value, families, family, mode, selectedMode, models, selectedModel, selectedModelUnavailable, supportedEfforts, ariaLabel, className, onFamilyChange, onModeChange, onModelSelect, onModelClear, onEffortChange, }: RuntimeBarComboProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function RuntimeBarCombo({ value, families, family, mode, selectedMode, models, selectedModel, selectedModelUnavailable, supportedEfforts, locked, ariaLabel, className, onFamilyChange, onModeChange, onModelSelect, onModelClear, onEffortChange, }: RuntimeBarComboProps): import("react/jsx-runtime").JSX.Element;
23
24
  //# sourceMappingURL=RuntimeBarCombo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBarCombo.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,wBAAwB,EAAE,OAAO,CAAC;IAClC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,GACf,EAAE,oBAAoB,2CAqFtB"}
1
+ {"version":3,"file":"RuntimeBarCombo.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,wBAAwB,EAAE,OAAO,CAAC;IAClC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,GACf,EAAE,oBAAoB,2CA8FtB"}