cli-jaw 1.5.0 → 1.6.2

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 (230) hide show
  1. package/README.ko.md +26 -19
  2. package/README.md +50 -22
  3. package/README.zh-CN.md +26 -19
  4. package/dist/bin/cli-jaw.js +5 -1
  5. package/dist/bin/cli-jaw.js.map +1 -1
  6. package/dist/bin/commands/dispatch.js +57 -0
  7. package/dist/bin/commands/dispatch.js.map +1 -0
  8. package/dist/lib/mcp-sync.js +1 -1
  9. package/dist/lib/mcp-sync.js.map +1 -1
  10. package/dist/lib/upload.js +14 -1
  11. package/dist/lib/upload.js.map +1 -1
  12. package/dist/server.js +57 -42
  13. package/dist/server.js.map +1 -1
  14. package/dist/src/agent/events.js +72 -13
  15. package/dist/src/agent/events.js.map +1 -1
  16. package/dist/src/agent/spawn.js +71 -29
  17. package/dist/src/agent/spawn.js.map +1 -1
  18. package/dist/src/cli/acp-client.js +4 -2
  19. package/dist/src/cli/acp-client.js.map +1 -1
  20. package/dist/src/cli/commands.js +6 -6
  21. package/dist/src/cli/commands.js.map +1 -1
  22. package/dist/src/cli/handlers.js +11 -9
  23. package/dist/src/cli/handlers.js.map +1 -1
  24. package/dist/src/cli/registry.js +7 -1
  25. package/dist/src/cli/registry.js.map +1 -1
  26. package/dist/src/core/config.js +15 -8
  27. package/dist/src/core/config.js.map +1 -1
  28. package/dist/src/core/db.js +18 -3
  29. package/dist/src/core/db.js.map +1 -1
  30. package/dist/src/core/employees.js +34 -0
  31. package/dist/src/core/employees.js.map +1 -0
  32. package/dist/src/discord/bot.js +72 -9
  33. package/dist/src/discord/bot.js.map +1 -1
  34. package/dist/src/discord/commands.js +12 -8
  35. package/dist/src/discord/commands.js.map +1 -1
  36. package/dist/src/orchestrator/distribute.js +57 -35
  37. package/dist/src/orchestrator/distribute.js.map +1 -1
  38. package/dist/src/orchestrator/gateway.js +3 -1
  39. package/dist/src/orchestrator/gateway.js.map +1 -1
  40. package/dist/src/orchestrator/pipeline.js +120 -27
  41. package/dist/src/orchestrator/pipeline.js.map +1 -1
  42. package/dist/src/orchestrator/research.js +5 -5
  43. package/dist/src/orchestrator/research.js.map +1 -1
  44. package/dist/src/orchestrator/scope.js +55 -0
  45. package/dist/src/orchestrator/scope.js.map +1 -0
  46. package/dist/src/orchestrator/state-machine.js +23 -21
  47. package/dist/src/orchestrator/state-machine.js.map +1 -1
  48. package/dist/src/orchestrator/worker-registry.js +9 -2
  49. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  50. package/dist/src/prompt/builder.js +76 -37
  51. package/dist/src/prompt/builder.js.map +1 -1
  52. package/dist/src/prompt/templates/a1-system.md +40 -0
  53. package/dist/src/prompt/templates/employee.md +12 -4
  54. package/dist/src/prompt/templates/orchestration.md +17 -1
  55. package/dist/src/telegram/bot.js +7 -1
  56. package/dist/src/telegram/bot.js.map +1 -1
  57. package/package.json +4 -2
  58. package/public/assets/fonts/GeistVF.woff2 +0 -0
  59. package/public/assets/fonts/JetBrainsMono-Variable.woff2 +0 -0
  60. package/public/assets/providers/claude-color.svg +1 -0
  61. package/public/assets/providers/claude.svg +1 -0
  62. package/public/assets/providers/copilot-color.svg +1 -0
  63. package/public/assets/providers/copilot.svg +1 -0
  64. package/public/assets/providers/discord.svg +1 -0
  65. package/public/assets/providers/gemini-color.svg +1 -0
  66. package/public/assets/providers/gemini.svg +1 -0
  67. package/public/assets/providers/openai.svg +1 -0
  68. package/public/assets/providers/opencode.svg +1 -0
  69. package/public/assets/providers/telegram.svg +1 -0
  70. package/public/css/chat.css +79 -51
  71. package/public/css/diagram.css +348 -0
  72. package/public/css/layout.css +38 -11
  73. package/public/css/markdown.css +64 -18
  74. package/public/css/modals.css +3 -3
  75. package/public/css/orc-state.css +9 -9
  76. package/public/css/sidebar.css +37 -3
  77. package/public/css/tool-ui.css +46 -11
  78. package/public/css/variables.css +63 -63
  79. package/public/dist/assets/api-Bbmmo0o1.js +1 -0
  80. package/public/dist/assets/architecture-YZFGNWBL-BxiHqtOH.js +1 -0
  81. package/public/dist/assets/architectureDiagram-Q4EWVU46-CJTGDw5p.js +1 -0
  82. package/public/dist/assets/blockDiagram-DXYQGD6D-Btl5Y-Er.js +1 -0
  83. package/public/dist/assets/c4Diagram-AHTNJAMY-sDfjW4ZF.js +1 -0
  84. package/public/dist/assets/classDiagram-6PBFFD2Q-ByCgggL2.js +1 -0
  85. package/public/dist/assets/classDiagram-v2-HSJHXN6E-t1amaXkU.js +1 -0
  86. package/public/dist/assets/constants-C8_0OtK2.js +1 -0
  87. package/public/dist/assets/cose-bilkent-S5V4N54A-eOSFGdaE.js +1 -0
  88. package/public/dist/assets/dagre-KV5264BT-OCB5j8Q6.js +1 -0
  89. package/public/dist/assets/diagram-5BDNPKRD-C-4fgK5P.js +1 -0
  90. package/public/dist/assets/diagram-G4DWMVQ6-C6vmHKDV.js +1 -0
  91. package/public/dist/assets/diagram-MMDJMWI5-BMCo_wmt.js +1 -0
  92. package/public/dist/assets/diagram-TYMM5635-DaCLdttJ.js +1 -0
  93. package/public/dist/assets/employees-D5n7mX5v.js +39 -0
  94. package/public/dist/assets/erDiagram-SMLLAGMA-BiTRdm5s.js +1 -0
  95. package/public/dist/assets/flowDiagram-DWJPFMVM-sv6jVi0d.js +1 -0
  96. package/public/dist/assets/ganttDiagram-T4ZO3ILL-jCP3OW23.js +1 -0
  97. package/public/dist/assets/gitGraph-7Q5UKJZL-BIeKLxpm.js +1 -0
  98. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-CokylnbW.js +1 -0
  99. package/public/dist/assets/index-CLd0BsAu.js +49 -0
  100. package/public/dist/assets/index-D6ci1wCN.css +1 -0
  101. package/public/dist/assets/info-OMHHGYJF-CIEl5dWF.js +1 -0
  102. package/public/dist/assets/infoDiagram-42DDH7IO-BBnK1Bh2.js +1 -0
  103. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-qXIz0VhS.js +1 -0
  104. package/public/dist/assets/journeyDiagram-VCZTEJTY-BdrOLof3.js +1 -0
  105. package/public/dist/assets/kanban-definition-6JOO6SKY-CcX7CE04.js +1 -0
  106. package/public/dist/assets/mermaid.core-BoxIvw7E.js +1 -0
  107. package/public/dist/assets/mindmap-definition-QFDTVHPH-CdXARskX.js +1 -0
  108. package/public/dist/assets/packet-4T2RLAQJ-Bz4ZwYZ3.js +1 -0
  109. package/public/dist/assets/pie-ZZUOXDRM-AtGL3wZ2.js +1 -0
  110. package/public/dist/assets/pieDiagram-DEJITSTG-B5SOq9Yr.js +1 -0
  111. package/public/dist/assets/quadrantDiagram-34T5L4WZ-D0uNWgpI.js +1 -0
  112. package/public/dist/assets/radar-PYXPWWZC-AbJSfeqB.js +1 -0
  113. package/public/dist/assets/render-C8N0rp4L.js +25 -0
  114. package/public/dist/assets/requirementDiagram-MS252O5E-62td6IQ-.js +1 -0
  115. package/public/dist/assets/sankeyDiagram-XADWPNL6-Crg_02iC.js +1 -0
  116. package/public/dist/assets/sequenceDiagram-FGHM5R23-fbCocZHj.js +1 -0
  117. package/public/dist/assets/settings-BJR-IGM5.js +41 -0
  118. package/public/dist/assets/settings-Dm6OnPmY.js +1 -0
  119. package/public/dist/assets/skills-D6jv9AIs.js +1 -0
  120. package/public/dist/assets/skills-uywskdFh.js +12 -0
  121. package/public/dist/assets/slash-commands-CCDonT40.js +1 -0
  122. package/public/dist/assets/{slash-commands-DMsE88bu.js → slash-commands-DWvL-VDU.js} +1 -1
  123. package/public/dist/assets/stateDiagram-FHFEXIEX-Gy3DhXxQ.js +1 -0
  124. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-DJc-FW9O.js +1 -0
  125. package/public/dist/assets/timeline-definition-GMOUNBTQ-B3cA9DgY.js +1 -0
  126. package/public/dist/assets/treeView-SZITEDCU-Cn58DIbB.js +1 -0
  127. package/public/dist/assets/treemap-W4RFUUIX-DPcYjDzH.js +1 -0
  128. package/public/dist/assets/ui-C1daR00l.js +1 -0
  129. package/public/dist/assets/ui-D-oFkXed.js +131 -0
  130. package/public/dist/assets/vendor-icons-1Ec7ZWcT.js +1 -0
  131. package/public/dist/assets/{vendor-mermaid-COidH9HB.js → vendor-mermaid-lvHqQdfg.js} +4 -4
  132. package/public/dist/assets/vennDiagram-DHZGUBPP-DkBfxilo.js +1 -0
  133. package/public/dist/assets/wardley-RL74JXVD-6Dg0PJ4H.js +1 -0
  134. package/public/dist/assets/wardleyDiagram-NUSXRM2D-Dsntl_vy.js +1 -0
  135. package/public/dist/assets/ws-Dnn8HG8B.js +2 -0
  136. package/public/dist/assets/xychartDiagram-5P7HB3ND-B_McB5GE.js +1 -0
  137. package/public/dist/index.html +63 -55
  138. package/public/index.html +62 -53
  139. package/public/js/constants.ts +8 -2
  140. package/public/js/diagram/iframe-renderer.ts +559 -0
  141. package/public/js/diagram/types.ts +129 -0
  142. package/public/js/diagram/widget-validator.ts +82 -0
  143. package/public/js/features/chat.ts +24 -12
  144. package/public/js/features/employees.ts +3 -2
  145. package/public/js/features/heartbeat.ts +4 -3
  146. package/public/js/features/memory.ts +4 -3
  147. package/public/js/features/process-block.ts +12 -11
  148. package/public/js/features/settings-cli-status.ts +10 -7
  149. package/public/js/features/settings-core.ts +13 -3
  150. package/public/js/features/settings-discord.ts +9 -0
  151. package/public/js/features/settings-mcp.ts +8 -7
  152. package/public/js/features/settings-stt.ts +4 -4
  153. package/public/js/features/settings-templates.ts +10 -8
  154. package/public/js/features/settings-types.ts +1 -1
  155. package/public/js/features/settings.ts +1 -1
  156. package/public/js/features/sidebar.ts +37 -7
  157. package/public/js/features/skills.ts +4 -3
  158. package/public/js/features/theme.ts +4 -0
  159. package/public/js/features/tool-ui.ts +6 -5
  160. package/public/js/features/voice-recorder.ts +2 -1
  161. package/public/js/icons.ts +257 -0
  162. package/public/js/main.ts +9 -3
  163. package/public/js/provider-icons.ts +88 -0
  164. package/public/js/render.ts +493 -30
  165. package/public/js/streaming-render.ts +3 -3
  166. package/public/js/ui.ts +38 -18
  167. package/public/js/ws.ts +17 -10
  168. package/public/locales/en.json +89 -88
  169. package/public/locales/ko.json +89 -88
  170. package/scripts/release-1.6.0.sh +69 -0
  171. package/scripts/release-preview.sh +1 -1
  172. package/dist/lib/token-keepalive.js +0 -34
  173. package/dist/lib/token-keepalive.js.map +0 -1
  174. package/public/dist/assets/api-BlPw3bUI.js +0 -1
  175. package/public/dist/assets/architecture-YZFGNWBL-BkS7SZQi.js +0 -1
  176. package/public/dist/assets/architectureDiagram-Q4EWVU46-Dl3iBKeR.js +0 -1
  177. package/public/dist/assets/blockDiagram-DXYQGD6D-DPr4D17p.js +0 -1
  178. package/public/dist/assets/c4Diagram-AHTNJAMY-CfoxJtDk.js +0 -1
  179. package/public/dist/assets/classDiagram-6PBFFD2Q-BOAdHnnB.js +0 -1
  180. package/public/dist/assets/classDiagram-v2-HSJHXN6E-B2QCJXWC.js +0 -1
  181. package/public/dist/assets/constants-DshMUJbo.js +0 -1
  182. package/public/dist/assets/cose-bilkent-S5V4N54A-CA14jk7w.js +0 -1
  183. package/public/dist/assets/dagre-KV5264BT-BVwNaSwC.js +0 -1
  184. package/public/dist/assets/diagram-5BDNPKRD-CHqIAvdc.js +0 -1
  185. package/public/dist/assets/diagram-G4DWMVQ6-DxvsCvTP.js +0 -1
  186. package/public/dist/assets/diagram-MMDJMWI5-DqOPO7dl.js +0 -1
  187. package/public/dist/assets/diagram-TYMM5635-C9xMWPQn.js +0 -1
  188. package/public/dist/assets/employees-CFRlsbHm.js +0 -39
  189. package/public/dist/assets/erDiagram-SMLLAGMA-BTmpfRkm.js +0 -1
  190. package/public/dist/assets/flowDiagram-DWJPFMVM-DZBSQAKA.js +0 -1
  191. package/public/dist/assets/ganttDiagram-T4ZO3ILL-TAEMCRbT.js +0 -1
  192. package/public/dist/assets/gitGraph-7Q5UKJZL-bbxndRNA.js +0 -1
  193. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-CBxtx0MB.js +0 -1
  194. package/public/dist/assets/index-1Gg-6jeC.css +0 -1
  195. package/public/dist/assets/index-CQHqXjrK.js +0 -49
  196. package/public/dist/assets/info-OMHHGYJF-DRXq_Ywr.js +0 -1
  197. package/public/dist/assets/infoDiagram-42DDH7IO-C7FFwX4m.js +0 -1
  198. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-DEZJE79j.js +0 -1
  199. package/public/dist/assets/journeyDiagram-VCZTEJTY-ZHLiY6GV.js +0 -1
  200. package/public/dist/assets/kanban-definition-6JOO6SKY-NP7pY7ML.js +0 -1
  201. package/public/dist/assets/mermaid.core-CHuluSlD.js +0 -1
  202. package/public/dist/assets/mindmap-definition-QFDTVHPH-Bd1OgfN_.js +0 -1
  203. package/public/dist/assets/packet-4T2RLAQJ-CGu8ST97.js +0 -1
  204. package/public/dist/assets/pie-ZZUOXDRM-CDG65mhS.js +0 -1
  205. package/public/dist/assets/pieDiagram-DEJITSTG-BbMBHLDM.js +0 -1
  206. package/public/dist/assets/quadrantDiagram-34T5L4WZ-CDCDgI1e.js +0 -1
  207. package/public/dist/assets/radar-PYXPWWZC-1gS-6ylu.js +0 -1
  208. package/public/dist/assets/render-YHvL5VM_.js +0 -6
  209. package/public/dist/assets/requirementDiagram-MS252O5E-DkmvOtYz.js +0 -1
  210. package/public/dist/assets/sankeyDiagram-XADWPNL6-GNcXIYsL.js +0 -1
  211. package/public/dist/assets/sequenceDiagram-FGHM5R23-BFrw2n6x.js +0 -1
  212. package/public/dist/assets/settings-BQF_u5px.js +0 -37
  213. package/public/dist/assets/settings-C5Q9IPjJ.js +0 -1
  214. package/public/dist/assets/skills-9Pd2rOw-.js +0 -1
  215. package/public/dist/assets/skills-BI7sQAdk.js +0 -12
  216. package/public/dist/assets/slash-commands-FMpJzlDB.js +0 -1
  217. package/public/dist/assets/stateDiagram-FHFEXIEX-BLgKnllT.js +0 -1
  218. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-CbzuWsSa.js +0 -1
  219. package/public/dist/assets/timeline-definition-GMOUNBTQ-CcZTJ3gL.js +0 -1
  220. package/public/dist/assets/treeView-SZITEDCU-BDqBsaH1.js +0 -1
  221. package/public/dist/assets/treemap-W4RFUUIX-BaWHA3Di.js +0 -1
  222. package/public/dist/assets/ui-BukgLHuh.js +0 -29
  223. package/public/dist/assets/ui-Bvz1JfTE.js +0 -1
  224. package/public/dist/assets/vennDiagram-DHZGUBPP-BWV_j1bh.js +0 -1
  225. package/public/dist/assets/wardley-RL74JXVD-C7gKA3d7.js +0 -1
  226. package/public/dist/assets/wardleyDiagram-NUSXRM2D-BUoq_wug.js +0 -1
  227. package/public/dist/assets/ws-S_AZgx7L.js +0 -2
  228. package/public/dist/assets/xychartDiagram-5P7HB3ND-PvT5Ec82.js +0 -1
  229. /package/public/dist/assets/{api-B8XKQ4OT.js → api-Ci-lgwRp.js} +0 -0
  230. /package/public/dist/assets/{locale-BjoAcbis.js → locale-DIXc-_34.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  /* ── Left Sidebar ── */
2
2
  .sidebar-left {
3
- background: linear-gradient(180deg, var(--surface) 0%, color-mix(in srgb, var(--surface) 95%, #000) 100%);
4
- border-right: 1px solid color-mix(in srgb, var(--border) 80%, var(--accent) 20%);
3
+ background: linear-gradient(180deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 95%, #000) 100%);
4
+ border-right: 1px solid color-mix(in oklch, var(--border) 80%, var(--accent) 20%);
5
5
  box-shadow: inset -1px 0 0 var(--border);
6
6
  padding: 48px 16px 16px;
7
7
  display: flex;
@@ -24,12 +24,12 @@
24
24
  0deg,
25
25
  transparent,
26
26
  transparent 2px,
27
- color-mix(in srgb, var(--accent) var(--scanline-pct), transparent) 2px,
28
- color-mix(in srgb, var(--accent) var(--scanline-pct), transparent) 4px
27
+ color-mix(in oklch, var(--accent) var(--scanline-pct), transparent) 2px,
28
+ color-mix(in oklch, var(--accent) var(--scanline-pct), transparent) 4px
29
29
  ),
30
30
  linear-gradient(
31
31
  180deg,
32
- color-mix(in srgb, var(--accent) var(--glow-strength), transparent) 0%,
32
+ color-mix(in oklch, var(--accent) var(--glow-strength), transparent) 0%,
33
33
  transparent 200px
34
34
  );
35
35
  }
@@ -40,7 +40,7 @@
40
40
  color: var(--accent);
41
41
  font-family: var(--font-display);
42
42
  letter-spacing: 1px;
43
- text-shadow: 0 0 20px color-mix(in srgb, var(--accent) 30%, transparent);
43
+ text-shadow: 0 0 20px color-mix(in oklch, var(--accent) 30%, transparent);
44
44
  }
45
45
 
46
46
  .section-title {
@@ -88,13 +88,13 @@
88
88
  .status-idle {
89
89
  background: var(--status-idle-bg);
90
90
  color: var(--green);
91
- box-shadow: 0 0 6px color-mix(in srgb, var(--success) 20%, transparent);
91
+ box-shadow: 0 0 6px color-mix(in oklch, var(--success) 20%, transparent);
92
92
  }
93
93
 
94
94
  .status-running {
95
95
  background: var(--status-running-bg);
96
96
  color: var(--status-running-color);
97
- box-shadow: 0 0 6px color-mix(in srgb, var(--warning) 30%, transparent);
97
+ box-shadow: 0 0 6px color-mix(in oklch, var(--warning) 30%, transparent);
98
98
  }
99
99
 
100
100
  .btn-clear {
@@ -122,8 +122,8 @@
122
122
 
123
123
  /* ── Right Sidebar ── */
124
124
  .sidebar-right {
125
- background: linear-gradient(180deg, var(--surface) 0%, color-mix(in srgb, var(--surface) 95%, #000) 100%);
126
- border-left: 1px solid color-mix(in srgb, var(--border) 80%, var(--accent) 20%);
125
+ background: linear-gradient(180deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 95%, #000) 100%);
126
+ border-left: 1px solid color-mix(in oklch, var(--border) 80%, var(--accent) 20%);
127
127
  box-shadow: inset 1px 0 0 var(--border);
128
128
  overflow-y: auto;
129
129
  display: flex;
@@ -205,6 +205,9 @@
205
205
  text-align: left;
206
206
  font-family: var(--font-display);
207
207
  transition: border-color 0.15s, box-shadow 0.15s;
208
+ display: inline-flex;
209
+ align-items: center;
210
+ gap: 4px;
208
211
  }
209
212
 
210
213
  .sidebar-hb-btn.w-auto {
@@ -352,6 +355,8 @@ body.right-collapsed .sidebar-right {
352
355
  min-width: unset !important;
353
356
  padding-top: calc(48px + env(safe-area-inset-top, 0px));
354
357
  padding-bottom: env(safe-area-inset-bottom, 0px);
358
+ visibility: hidden;
359
+ pointer-events: none;
355
360
  }
356
361
 
357
362
  .sidebar-right {
@@ -363,6 +368,8 @@ body.right-collapsed .sidebar-right {
363
368
  body.left-expanded .sidebar-left,
364
369
  body.right-expanded .sidebar-right {
365
370
  transform: translateX(0);
371
+ visibility: visible;
372
+ pointer-events: auto;
366
373
  }
367
374
 
368
375
  /* Backdrop overlay */
@@ -404,4 +411,24 @@ body.right-collapsed .sidebar-right {
404
411
 
405
412
  .mobile-nav {
406
413
  display: none;
407
- }
414
+ }
415
+
416
+ /* ── Lucide Icons ── */
417
+ .lucide,
418
+ [data-icon] svg,
419
+ .icon-hydrated svg,
420
+ .cli-provider-icon svg,
421
+ .skill-emoji svg {
422
+ display: inline-block;
423
+ width: 1em;
424
+ height: 1em;
425
+ vertical-align: -0.125em;
426
+ flex-shrink: 0;
427
+ }
428
+
429
+ [data-icon],
430
+ .icon-hydrated {
431
+ display: inline-flex;
432
+ align-items: center;
433
+ line-height: 1;
434
+ }
@@ -24,14 +24,14 @@
24
24
  }
25
25
 
26
26
  .table-wrapper th {
27
- background: color-mix(in srgb, var(--accent) 8%, var(--surface));
27
+ background: color-mix(in oklch, var(--accent) 8%, var(--surface));
28
28
  font-weight: 600;
29
29
  white-space: nowrap;
30
- border-bottom: 2px solid color-mix(in srgb, var(--accent) 25%, var(--border));
30
+ border-bottom: 2px solid color-mix(in oklch, var(--accent) 25%, var(--border));
31
31
  }
32
32
 
33
33
  .table-wrapper tr:nth-child(even) td {
34
- background: color-mix(in srgb, var(--text) 2%, transparent);
34
+ background: color-mix(in oklch, var(--text) 2%, transparent);
35
35
  }
36
36
 
37
37
  /* Legacy table styles (non-wrapped) */
@@ -51,14 +51,14 @@
51
51
  }
52
52
 
53
53
  .msg-content th {
54
- background: color-mix(in srgb, var(--accent) 8%, var(--surface));
54
+ background: color-mix(in oklch, var(--accent) 8%, var(--surface));
55
55
  font-weight: 600;
56
56
  white-space: nowrap;
57
57
  border-bottom: 2px solid var(--border);
58
58
  }
59
59
 
60
60
  .msg-content tr:nth-child(even) {
61
- background: color-mix(in srgb, var(--text) 2%, transparent);
61
+ background: color-mix(in oklch, var(--text) 2%, transparent);
62
62
  }
63
63
 
64
64
  /* Code blocks — new structure */
@@ -74,7 +74,7 @@
74
74
  justify-content: space-between;
75
75
  align-items: center;
76
76
  padding: var(--space-1) var(--space-3);
77
- background: color-mix(in srgb, var(--text) 8%, var(--surface));
77
+ background: color-mix(in oklch, var(--text) 8%, var(--surface));
78
78
  border-bottom: 1px solid var(--border);
79
79
  font-family: var(--font-mono);
80
80
  font-size: var(--text-xs);
@@ -102,7 +102,7 @@
102
102
 
103
103
  .code-copy-btn:hover {
104
104
  color: var(--text);
105
- background: color-mix(in srgb, var(--text) 8%, transparent);
105
+ background: color-mix(in oklch, var(--text) 8%, transparent);
106
106
  }
107
107
 
108
108
  .code-copy-btn.copied { color: var(--success); }
@@ -159,7 +159,7 @@
159
159
  .msg-content code:not(pre code) {
160
160
  font-family: var(--font-mono);
161
161
  font-size: 0.875em;
162
- background: color-mix(in srgb, var(--accent) 6%, var(--surface));
162
+ background: color-mix(in oklch, var(--accent) 6%, var(--surface));
163
163
  padding: 1px var(--space-1);
164
164
  border-radius: var(--radius-sm);
165
165
  border: 1px solid var(--border);
@@ -174,7 +174,7 @@
174
174
  margin: 8px 0;
175
175
  padding: 4px 12px;
176
176
  color: var(--text-dim);
177
- background: color-mix(in srgb, var(--text) 2%, transparent);
177
+ background: color-mix(in oklch, var(--text) 2%, transparent);
178
178
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
179
179
  }
180
180
 
@@ -242,9 +242,12 @@
242
242
 
243
243
  /* Paragraphs */
244
244
  .msg-content p {
245
- margin: 4px 0;
245
+ margin: 0.75em 0;
246
246
  }
247
247
 
248
+ .msg-content p:first-child { margin-top: 0; }
249
+ .msg-content p:last-child { margin-bottom: 0; }
250
+
248
251
  /* KaTeX */
249
252
  .msg-content .katex-display {
250
253
  overflow-x: auto;
@@ -266,7 +269,7 @@
266
269
  margin: 8px 0;
267
270
  text-align: center;
268
271
  position: relative;
269
- background: color-mix(in srgb, var(--surface) 60%, transparent);
272
+ background: color-mix(in oklch, var(--surface) 60%, transparent);
270
273
  border: 1px solid var(--border);
271
274
  border-radius: var(--radius-lg);
272
275
  padding: 16px 12px;
@@ -282,8 +285,8 @@
282
285
  position: absolute;
283
286
  top: 6px;
284
287
  right: 6px;
285
- background: color-mix(in srgb, var(--text) 10%, transparent);
286
- border: 1px solid color-mix(in srgb, var(--text) 15%, transparent);
288
+ background: color-mix(in oklch, var(--text) 10%, transparent);
289
+ border: 1px solid color-mix(in oklch, var(--text) 15%, transparent);
287
290
  color: var(--text-dim);
288
291
  width: 28px;
289
292
  height: 28px;
@@ -298,10 +301,53 @@
298
301
  }
299
302
 
300
303
  .mermaid-zoom-btn:hover {
301
- background: color-mix(in srgb, var(--text) 20%, transparent);
304
+ background: color-mix(in oklch, var(--text) 20%, transparent);
305
+ color: var(--text);
306
+ }
307
+
308
+ /* Mermaid action buttons (copy / save) */
309
+ .mermaid-copy-btn,
310
+ .mermaid-save-btn {
311
+ position: absolute;
312
+ top: 6px;
313
+ background: color-mix(in oklch, var(--text) 10%, transparent);
314
+ border: 1px solid color-mix(in oklch, var(--text) 15%, transparent);
315
+ color: var(--text-dim);
316
+ width: 28px;
317
+ height: 28px;
318
+ border-radius: var(--radius-md);
319
+ cursor: pointer;
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: center;
323
+ opacity: 0;
324
+ pointer-events: none;
325
+ transition: opacity var(--duration-fast), background var(--duration-fast), color var(--duration-fast);
326
+ z-index: 2;
327
+ }
328
+
329
+ /* zoom at right:6px (rightmost), copy next, save leftmost */
330
+ .mermaid-copy-btn { right: calc(6px + 32px); }
331
+ .mermaid-save-btn { right: calc(6px + 64px); }
332
+
333
+ .mermaid-container:hover .mermaid-zoom-btn,
334
+ .mermaid-container:hover .mermaid-copy-btn,
335
+ .mermaid-container:hover .mermaid-save-btn {
336
+ opacity: 1;
337
+ pointer-events: auto;
338
+ }
339
+
340
+ .mermaid-copy-btn:hover,
341
+ .mermaid-save-btn:hover {
342
+ background: color-mix(in oklch, var(--text) 20%, transparent);
302
343
  color: var(--text);
303
344
  }
304
345
 
346
+ .mermaid-copy-btn.copied,
347
+ .mermaid-save-btn.copied {
348
+ color: var(--success);
349
+ }
350
+
305
351
  /* Mermaid popup overlay */
306
352
  .mermaid-overlay {
307
353
  position: fixed;
@@ -348,7 +394,7 @@
348
394
  position: absolute;
349
395
  top: 8px;
350
396
  right: 8px;
351
- background: color-mix(in srgb, var(--text) 15%, transparent);
397
+ background: color-mix(in oklch, var(--text) 15%, transparent);
352
398
  border: none;
353
399
  color: var(--text);
354
400
  width: 36px;
@@ -365,7 +411,7 @@
365
411
  }
366
412
 
367
413
  .mermaid-overlay-close:hover {
368
- background: color-mix(in srgb, var(--text) 30%, transparent);
414
+ background: color-mix(in oklch, var(--text) 30%, transparent);
369
415
  color: var(--text);
370
416
  }
371
417
 
@@ -391,7 +437,7 @@
391
437
  padding: 2px 8px;
392
438
  font-size: var(--text-xs);
393
439
  color: var(--code-label-color);
394
- background: color-mix(in srgb, var(--text) 5%, transparent);
440
+ background: color-mix(in oklch, var(--text) 5%, transparent);
395
441
  border-radius: 0 var(--radius-md) 0 var(--radius-sm);
396
442
  font-family: var(--font-mono);
397
443
  cursor: pointer;
@@ -400,7 +446,7 @@
400
446
  }
401
447
 
402
448
  .msg-content .code-lang-label:hover {
403
- background: color-mix(in srgb, var(--text) 12%, transparent);
449
+ background: color-mix(in oklch, var(--text) 12%, transparent);
404
450
  transform: scale(1.05);
405
451
  }
406
452
 
@@ -22,15 +22,15 @@
22
22
  }
23
23
 
24
24
  .modal-box {
25
- background: color-mix(in srgb, var(--surface) 85%, transparent);
25
+ background: color-mix(in oklch, var(--surface) 85%, transparent);
26
26
  backdrop-filter: blur(24px) saturate(1.5);
27
27
  -webkit-backdrop-filter: blur(24px) saturate(1.5);
28
- border: 1px solid color-mix(in srgb, var(--accent) 10%, var(--border));
28
+ border: 1px solid color-mix(in oklch, var(--accent) 10%, var(--border));
29
29
  border-radius: var(--radius-xl);
30
30
  box-shadow:
31
31
  0 16px 48px rgba(0, 0, 0, 0.5),
32
32
  0 0 0 1px rgba(255, 255, 255, 0.04) inset,
33
- 0 0 60px -20px color-mix(in srgb, var(--accent) 6%, transparent);
33
+ 0 0 60px -20px color-mix(in oklch, var(--accent) 6%, transparent);
34
34
  width: 500px;
35
35
  max-width: 90vw;
36
36
  max-height: 80vh;
@@ -46,7 +46,7 @@ body[data-orc-state].orc-pulse #chatMessages {
46
46
  font-weight: 700;
47
47
  font-family: var(--font-mono);
48
48
  letter-spacing: 1px;
49
- background: color-mix(in srgb, var(--orc-glow) 20%, var(--surface));
49
+ background: color-mix(in oklch, var(--orc-glow) 20%, var(--surface));
50
50
  color: var(--orc-glow);
51
51
  border: 1px solid var(--orc-glow);
52
52
  text-transform: uppercase;
@@ -56,7 +56,7 @@ body[data-orc-state].orc-pulse #chatMessages {
56
56
  .pabc-roadmap {
57
57
  display: none;
58
58
  align-items: center;
59
- background: linear-gradient(135deg, var(--surface) 0%, color-mix(in srgb, var(--surface) 90%, #000) 100%);
59
+ background: linear-gradient(135deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 90%, #000) 100%);
60
60
  border: 1px solid var(--border);
61
61
  border-radius: 10px;
62
62
  padding: 12px 22px;
@@ -100,8 +100,8 @@ body[data-orc-state].orc-pulse #chatMessages {
100
100
  transform: scale(1.1);
101
101
  }
102
102
  .pabc-dot.done {
103
- color: color-mix(in srgb, var(--bg) 90%, transparent);
104
- border: 1px solid color-mix(in srgb, var(--text) 10%, transparent);
103
+ color: color-mix(in oklch, var(--bg) 90%, transparent);
104
+ border: 1px solid color-mix(in oklch, var(--text) 10%, transparent);
105
105
  opacity: 0.65;
106
106
  }
107
107
  .pabc-dot[data-phase="P"].active, .pabc-dot[data-phase="P"].done { background: var(--orc-glow-P); }
@@ -112,13 +112,13 @@ body[data-orc-state].orc-pulse #chatMessages {
112
112
  .pabc-connector {
113
113
  flex: 1;
114
114
  height: 2px;
115
- background: linear-gradient(90deg, var(--border) 0%, color-mix(in srgb, var(--border) 60%, var(--surface)) 50%, var(--border) 100%);
115
+ background: linear-gradient(90deg, var(--border) 0%, color-mix(in oklch, var(--border) 60%, var(--surface)) 50%, var(--border) 100%);
116
116
  min-width: 44px;
117
117
  transition: all 0.5s ease;
118
118
  border-radius: 1px;
119
119
  }
120
120
  .pabc-connector.done {
121
- background: linear-gradient(90deg, var(--text-dim) 0%, color-mix(in srgb, var(--text-dim) 70%, var(--surface)) 50%, var(--text-dim) 100%);
121
+ background: linear-gradient(90deg, var(--text-dim) 0%, color-mix(in oklch, var(--text-dim) 70%, var(--surface)) 50%, var(--text-dim) 100%);
122
122
  box-shadow: 0 0 6px -2px var(--text-dim);
123
123
  }
124
124
 
@@ -184,7 +184,7 @@ body[data-orc-state].orc-pulse #chatMessages {
184
184
 
185
185
  /* ─── Light Theme Overrides ─── */
186
186
  [data-theme="light"] .pabc-roadmap {
187
- background: linear-gradient(135deg, var(--surface) 0%, color-mix(in srgb, var(--surface) 90%, #000) 100%);
187
+ background: linear-gradient(135deg, var(--surface) 0%, color-mix(in oklch, var(--surface) 90%, #000) 100%);
188
188
  box-shadow: 0 2px 12px rgba(0,0,0,0.08), inset 0 1px 0 rgba(255,255,255,0.6);
189
189
  }
190
190
  [data-theme="light"] .pabc-dot.future {
@@ -199,10 +199,10 @@ body[data-orc-state].orc-pulse #chatMessages {
199
199
  border-color: rgba(0,0,0,0.06);
200
200
  }
201
201
  [data-theme="light"] .pabc-connector {
202
- background: linear-gradient(90deg, var(--border) 0%, color-mix(in srgb, var(--border) 60%, var(--surface)) 50%, var(--border) 100%);
202
+ background: linear-gradient(90deg, var(--border) 0%, color-mix(in oklch, var(--border) 60%, var(--surface)) 50%, var(--border) 100%);
203
203
  }
204
204
  [data-theme="light"] .pabc-connector.done {
205
- background: linear-gradient(90deg, var(--text-dim) 0%, color-mix(in srgb, var(--text-dim) 70%, var(--surface)) 50%, var(--text-dim) 100%);
205
+ background: linear-gradient(90deg, var(--text-dim) 0%, color-mix(in oklch, var(--text-dim) 70%, var(--surface)) 50%, var(--text-dim) 100%);
206
206
  box-shadow: none;
207
207
  }
208
208
  [data-theme="light"] .shark-runner {
@@ -39,6 +39,18 @@
39
39
  background: var(--error);
40
40
  }
41
41
 
42
+ .cli-provider-icon {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ flex-shrink: 0;
46
+ width: 16px;
47
+ height: 16px;
48
+ }
49
+ .cli-provider-icon svg {
50
+ width: 100%;
51
+ height: 100%;
52
+ }
53
+
42
54
  .cli-name {
43
55
  flex: 1;
44
56
  }
@@ -60,7 +72,7 @@
60
72
  }
61
73
 
62
74
  .settings-group:hover {
63
- border-color: color-mix(in srgb, var(--border) 60%, var(--accent));
75
+ border-color: color-mix(in oklch, var(--border) 60%, var(--accent));
64
76
  }
65
77
 
66
78
  .settings-group h4 {
@@ -69,6 +81,9 @@
69
81
  margin-bottom: 8px;
70
82
  font-family: var(--font-display);
71
83
  letter-spacing: 0.5px;
84
+ display: flex;
85
+ align-items: center;
86
+ gap: 4px;
72
87
  }
73
88
 
74
89
  .settings-row {
@@ -105,7 +120,7 @@
105
120
  .perm-btn.active {
106
121
  border-color: var(--accent);
107
122
  color: var(--accent);
108
- background: color-mix(in srgb, var(--accent) 10%, var(--bg));
123
+ background: color-mix(in oklch, var(--accent) 10%, var(--bg));
109
124
  }
110
125
 
111
126
  textarea.prompt-editor {
@@ -136,7 +151,7 @@ textarea.prompt-editor {
136
151
  .skill-filter.active {
137
152
  border-color: var(--accent);
138
153
  color: var(--accent);
139
- background: color-mix(in srgb, var(--accent) 10%, var(--bg));
154
+ background: color-mix(in oklch, var(--accent) 10%, var(--bg));
140
155
  }
141
156
 
142
157
  .skill-card {
@@ -167,6 +182,11 @@ textarea.prompt-editor {
167
182
 
168
183
  .skill-emoji {
169
184
  font-size: 16px;
185
+ display: inline-flex;
186
+ align-items: center;
187
+ width: 20px;
188
+ height: 20px;
189
+ flex-shrink: 0;
170
190
  }
171
191
 
172
192
  .skill-name {
@@ -253,4 +273,18 @@ textarea.prompt-editor {
253
273
  overflow: hidden;
254
274
  text-overflow: ellipsis;
255
275
  white-space: nowrap;
276
+ }
277
+
278
+ /* ── Settings fieldset grouping ── */
279
+ .settings-fieldset {
280
+ border: 1px solid var(--border);
281
+ border-radius: var(--radius-md);
282
+ padding: var(--space-3);
283
+ margin-bottom: var(--space-3);
284
+ }
285
+ .settings-fieldset legend {
286
+ font-weight: 600;
287
+ font-size: var(--text-sm);
288
+ padding: 0 var(--space-2);
289
+ color: var(--text);
256
290
  }
@@ -29,7 +29,7 @@
29
29
 
30
30
  .tool-group-summary:hover {
31
31
  color: var(--text);
32
- border-color: color-mix(in srgb, var(--accent) 40%, var(--border));
32
+ border-color: color-mix(in oklch, var(--accent) 40%, var(--border));
33
33
  }
34
34
 
35
35
  .tool-group-summary-text { flex: 1; }
@@ -110,7 +110,7 @@
110
110
  }
111
111
 
112
112
  .tool-item + .tool-item {
113
- border-top: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
113
+ border-top: 1px solid color-mix(in oklch, var(--border) 50%, transparent);
114
114
  }
115
115
 
116
116
  .tool-item-header {
@@ -185,8 +185,8 @@
185
185
  .tool-item-details {
186
186
  margin-left: 22px;
187
187
  padding: 8px 10px;
188
- border-left: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
189
- background: color-mix(in srgb, var(--surface) 70%, transparent);
188
+ border-left: 1px solid color-mix(in oklch, var(--border) 70%, transparent);
189
+ background: color-mix(in oklch, var(--surface) 70%, transparent);
190
190
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
191
191
  }
192
192
 
@@ -300,7 +300,7 @@
300
300
  align-items: center;
301
301
  gap: var(--space-2);
302
302
  width: 100%;
303
- background: color-mix(in srgb, var(--surface) 50%, transparent);
303
+ background: color-mix(in oklch, var(--surface) 50%, transparent);
304
304
  border: 1px solid var(--border);
305
305
  border-radius: var(--radius-md);
306
306
  color: var(--text-dim);
@@ -311,7 +311,7 @@
311
311
  }
312
312
 
313
313
  .process-summary:hover {
314
- border-color: color-mix(in srgb, var(--accent) 40%, var(--border));
314
+ border-color: color-mix(in oklch, var(--accent) 40%, var(--border));
315
315
  }
316
316
 
317
317
  .process-dot {
@@ -403,17 +403,17 @@
403
403
  }
404
404
 
405
405
  .process-step-badge.thinking {
406
- background: color-mix(in srgb, var(--accent) 15%, transparent);
406
+ background: color-mix(in oklch, var(--accent) 15%, transparent);
407
407
  color: var(--accent);
408
408
  }
409
409
 
410
410
  .process-step-badge.tool {
411
- background: color-mix(in srgb, var(--warning) 15%, transparent);
411
+ background: color-mix(in oklch, var(--warning) 15%, transparent);
412
412
  color: var(--warning);
413
413
  }
414
414
 
415
415
  .process-step-badge.search {
416
- background: color-mix(in srgb, var(--success) 15%, transparent);
416
+ background: color-mix(in oklch, var(--success) 15%, transparent);
417
417
  color: var(--success);
418
418
  }
419
419
 
@@ -449,8 +449,8 @@
449
449
  .process-step-details {
450
450
  margin-left: 22px;
451
451
  padding: 8px 10px;
452
- border-left: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
453
- background: color-mix(in srgb, var(--surface) 70%, transparent);
452
+ border-left: 1px solid color-mix(in oklch, var(--border) 70%, transparent);
453
+ background: color-mix(in oklch, var(--surface) 70%, transparent);
454
454
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
455
455
  }
456
456
 
@@ -481,3 +481,38 @@
481
481
  animation: none;
482
482
  }
483
483
  }
484
+
485
+ /* ── Native details/summary for tool blocks (future refactor) ── */
486
+ details.tool-block summary {
487
+ cursor: pointer;
488
+ list-style: none;
489
+ display: flex;
490
+ align-items: center;
491
+ gap: var(--space-2);
492
+ padding: var(--space-1) var(--space-2);
493
+ font-size: var(--text-sm);
494
+ color: var(--text-dim);
495
+ border-radius: var(--radius-sm);
496
+ transition: background var(--duration-fast);
497
+ }
498
+ details.tool-block summary:hover {
499
+ background: color-mix(in oklch, var(--accent) 8%, transparent);
500
+ }
501
+ details.tool-block summary::before {
502
+ content: '';
503
+ display: inline-block;
504
+ width: 0.5em;
505
+ height: 0.5em;
506
+ border-right: 2px solid currentColor;
507
+ border-bottom: 2px solid currentColor;
508
+ transform: rotate(-45deg);
509
+ transition: transform var(--duration-fast);
510
+ flex-shrink: 0;
511
+ }
512
+ details.tool-block[open] summary::before {
513
+ transform: rotate(45deg);
514
+ }
515
+ details.tool-block .tool-content {
516
+ content-visibility: auto;
517
+ contain-intrinsic-size: auto 200px;
518
+ }