@oh-my-pi/pi-coding-agent 17.2.10 → 17.2.12

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 (247) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/{CHANGELOG-rhwzpexa.md → CHANGELOG-k9ghy5sn.md} +53 -0
  3. package/dist/cli.js +10775 -10762
  4. package/dist/types/advisor/runtime.d.ts +1 -1
  5. package/dist/types/capability/mcp.d.ts +11 -0
  6. package/dist/types/capability/skill.d.ts +6 -0
  7. package/dist/types/cli/command-help.d.ts +3 -0
  8. package/dist/types/commands/share.d.ts +25 -0
  9. package/dist/types/commit/agentic/index.d.ts +3 -1
  10. package/dist/types/commit/execute.d.ts +32 -0
  11. package/dist/types/commit/index.d.ts +2 -1
  12. package/dist/types/commit/pipeline.d.ts +7 -1
  13. package/dist/types/config/custom-models.d.ts +31 -0
  14. package/dist/types/config/model-config-values.d.ts +19 -0
  15. package/dist/types/config/model-patch.d.ts +93 -0
  16. package/dist/types/config/model-provider-discovery.d.ts +51 -0
  17. package/dist/types/config/model-registry.d.ts +9 -52
  18. package/dist/types/config/settings-schema.d.ts +1 -34
  19. package/dist/types/config/settings.d.ts +5 -3
  20. package/dist/types/debug/raw-sse-buffer.d.ts +9 -0
  21. package/dist/types/discovery/agent-plugin-format.d.ts +136 -0
  22. package/dist/types/discovery/agent-plugins.d.ts +1 -0
  23. package/dist/types/discovery/contained-path.d.ts +33 -0
  24. package/dist/types/discovery/index.d.ts +1 -0
  25. package/dist/types/eval/executor-base.d.ts +8 -2
  26. package/dist/types/eval/kernel-session-registry.d.ts +60 -0
  27. package/dist/types/export/share.d.ts +1 -1
  28. package/dist/types/extensibility/custom-tools/types.d.ts +2 -2
  29. package/dist/types/extensibility/extensions/loader.d.ts +7 -0
  30. package/dist/types/extensibility/extensions/types.d.ts +11 -0
  31. package/dist/types/extensibility/shared-events.d.ts +3 -2
  32. package/dist/types/extensibility/skills.d.ts +5 -0
  33. package/dist/types/lsp/diagnostics.d.ts +96 -0
  34. package/dist/types/lsp/index.d.ts +7 -128
  35. package/dist/types/lsp/servers.d.ts +72 -0
  36. package/dist/types/lsp/tool.d.ts +42 -0
  37. package/dist/types/lsp/workspace-diagnostics.d.ts +12 -0
  38. package/dist/types/lsp/writethrough.d.ts +33 -0
  39. package/dist/types/mcp/transports/header-policy.d.ts +46 -0
  40. package/dist/types/mcp/types.d.ts +15 -0
  41. package/dist/types/modes/components/agent-hub-projection.d.ts +2 -7
  42. package/dist/types/modes/components/agent-hub-renderer.d.ts +0 -7
  43. package/dist/types/modes/components/agent-hub.d.ts +2 -0
  44. package/dist/types/modes/components/agent-transcript-viewer.d.ts +2 -0
  45. package/dist/types/modes/components/chat-transcript-builder.d.ts +2 -0
  46. package/dist/types/modes/components/custom-editor.d.ts +1 -2
  47. package/dist/types/modes/components/status-line/types.d.ts +2 -0
  48. package/dist/types/modes/components/tool-execution.d.ts +2 -0
  49. package/dist/types/modes/theme/color.d.ts +19 -0
  50. package/dist/types/modes/theme/loader.d.ts +19 -0
  51. package/dist/types/modes/theme/schema.d.ts +175 -0
  52. package/dist/types/modes/theme/symbols.d.ts +28 -0
  53. package/dist/types/modes/theme/theme-class.d.ts +244 -0
  54. package/dist/types/modes/theme/theme.d.ts +9 -280
  55. package/dist/types/modes/theme/tui-adapters.d.ts +13 -0
  56. package/dist/types/modes/utils/transcript-render-helpers.d.ts +3 -2
  57. package/dist/types/registry/agent-registry.d.ts +1 -3
  58. package/dist/types/secrets/index.d.ts +26 -2
  59. package/dist/types/secrets/message-transform.d.ts +40 -0
  60. package/dist/types/secrets/obfuscator.d.ts +0 -108
  61. package/dist/types/secrets/placeholder-scan.d.ts +95 -0
  62. package/dist/types/secrets/placeholder.d.ts +94 -0
  63. package/dist/types/secrets/replacement.d.ts +82 -0
  64. package/dist/types/session/agent-session-events.d.ts +2 -2
  65. package/dist/types/session/agent-session-types.d.ts +6 -0
  66. package/dist/types/session/agent-session.d.ts +2 -2
  67. package/dist/types/session/messages.d.ts +1 -0
  68. package/dist/types/session/prewalk.d.ts +3 -1
  69. package/dist/types/session/session-handoff.d.ts +3 -3
  70. package/dist/types/session/session-manager.d.ts +32 -0
  71. package/dist/types/session/session-provider-boundary.d.ts +1 -1
  72. package/dist/types/session/session-tools.d.ts +8 -0
  73. package/dist/types/session/turn-recovery.d.ts +9 -4
  74. package/dist/types/slash-commands/builtin-collaboration.d.ts +2 -0
  75. package/dist/types/slash-commands/builtin-completions.d.ts +36 -0
  76. package/dist/types/slash-commands/builtin-control.d.ts +2 -0
  77. package/dist/types/slash-commands/builtin-lifecycle.d.ts +3 -0
  78. package/dist/types/slash-commands/builtin-marketplace.d.ts +11 -0
  79. package/dist/types/slash-commands/builtin-modes.d.ts +5 -0
  80. package/dist/types/slash-commands/builtin-registry.d.ts +1 -1
  81. package/dist/types/slash-commands/builtin-session.d.ts +2 -0
  82. package/dist/types/task/index.d.ts +2 -0
  83. package/dist/types/tools/gh-common.d.ts +69 -0
  84. package/dist/types/tools/gh-pr-checkout.d.ts +84 -0
  85. package/dist/types/tools/gh-pr-diff.d.ts +102 -0
  86. package/dist/types/tools/gh-run-watch.d.ts +78 -0
  87. package/dist/types/tools/gh-search.d.ts +61 -0
  88. package/dist/types/tools/gh-types.d.ts +340 -0
  89. package/dist/types/tools/gh-view.d.ts +88 -0
  90. package/dist/types/tools/gh.d.ts +4 -201
  91. package/dist/types/tools/read-archive.d.ts +16 -0
  92. package/dist/types/tools/read-format.d.ts +104 -0
  93. package/dist/types/tools/read-path-resolution.d.ts +19 -0
  94. package/dist/types/tools/read-pdf-images.d.ts +12 -0
  95. package/dist/types/tools/read-renderer.d.ts +24 -0
  96. package/dist/types/tools/read-selector.d.ts +27 -0
  97. package/dist/types/tools/read-sqlite.d.ts +16 -0
  98. package/dist/types/tools/read-summary.d.ts +19 -0
  99. package/dist/types/tools/read.d.ts +1 -23
  100. package/dist/types/tools/shell-tokenize.d.ts +18 -1
  101. package/dist/types/utils/changelog.d.ts +0 -5
  102. package/package.json +13 -13
  103. package/scripts/legacy-pi-virtual-module.ts +4 -1
  104. package/src/advisor/runtime.ts +12 -7
  105. package/src/capability/mcp.ts +11 -0
  106. package/src/capability/skill.ts +6 -0
  107. package/src/cli/command-help.ts +4 -0
  108. package/src/cli/gallery-cli.ts +1 -1
  109. package/src/cli-commands.ts +5 -0
  110. package/src/commands/commit.ts +16 -3
  111. package/src/commands/share.ts +71 -0
  112. package/src/commit/agentic/index.ts +39 -21
  113. package/src/commit/execute.ts +56 -0
  114. package/src/commit/index.ts +2 -1
  115. package/src/commit/pipeline.ts +20 -7
  116. package/src/config/custom-models.ts +188 -0
  117. package/src/config/model-config-values.ts +128 -0
  118. package/src/config/model-discovery.ts +1 -1
  119. package/src/config/model-patch.ts +252 -0
  120. package/src/config/model-provider-discovery.ts +132 -0
  121. package/src/config/model-registry.ts +84 -704
  122. package/src/config/settings-schema.ts +2 -33
  123. package/src/config/settings.ts +53 -3
  124. package/src/debug/raw-sse-buffer.ts +20 -0
  125. package/src/discovery/agent-plugin-format.ts +551 -0
  126. package/src/discovery/agent-plugins.ts +341 -0
  127. package/src/discovery/claude-plugins.ts +21 -5
  128. package/src/discovery/contained-path.ts +75 -0
  129. package/src/discovery/helpers.ts +23 -9
  130. package/src/discovery/index.ts +1 -0
  131. package/src/discovery/omp-plugins.ts +20 -7
  132. package/src/edit/hashline/diff.ts +5 -1
  133. package/src/eval/executor-base.ts +39 -6
  134. package/src/eval/jl/executor.ts +82 -371
  135. package/src/eval/kernel-session-registry.ts +398 -0
  136. package/src/eval/py/executor.ts +53 -261
  137. package/src/eval/rb/executor.ts +36 -279
  138. package/src/exec/non-interactive-env.ts +1 -0
  139. package/src/export/share.ts +2 -1
  140. package/src/extensibility/custom-tools/types.ts +2 -2
  141. package/src/extensibility/extensions/loader.ts +78 -14
  142. package/src/extensibility/extensions/runner.ts +6 -0
  143. package/src/extensibility/extensions/types.ts +12 -0
  144. package/src/extensibility/plugins/marketplace/manager.ts +2 -1
  145. package/src/extensibility/shared-events.ts +3 -2
  146. package/src/extensibility/skills.ts +9 -0
  147. package/src/internal-urls/skill-protocol.ts +14 -0
  148. package/src/internal-urls/vault-protocol.ts +2 -2
  149. package/src/launch/client.ts +11 -1
  150. package/src/launch/protocol.ts +7 -2
  151. package/src/lsp/diagnostics.ts +516 -0
  152. package/src/lsp/index.ts +20 -2819
  153. package/src/lsp/servers.ts +296 -0
  154. package/src/lsp/tool.ts +1352 -0
  155. package/src/lsp/workspace-diagnostics.ts +170 -0
  156. package/src/lsp/writethrough.ts +561 -0
  157. package/src/main.ts +3 -2
  158. package/src/mcp/config.ts +3 -0
  159. package/src/mcp/manager.ts +12 -9
  160. package/src/mcp/transports/header-policy.ts +95 -0
  161. package/src/mcp/transports/http.ts +35 -52
  162. package/src/mcp/transports/sse.ts +20 -27
  163. package/src/mcp/types.ts +15 -0
  164. package/src/modes/acp/acp-agent.ts +15 -4
  165. package/src/modes/components/agent-dashboard.ts +2 -0
  166. package/src/modes/components/agent-hub-projection.ts +2 -2
  167. package/src/modes/components/agent-hub-renderer.ts +3 -7
  168. package/src/modes/components/agent-hub.ts +5 -0
  169. package/src/modes/components/agent-transcript-viewer.ts +3 -0
  170. package/src/modes/components/chat-transcript-builder.ts +3 -0
  171. package/src/modes/components/custom-editor.ts +0 -9
  172. package/src/modes/components/status-line/component.ts +1 -0
  173. package/src/modes/components/status-line/segments.ts +6 -4
  174. package/src/modes/components/status-line/types.ts +2 -0
  175. package/src/modes/components/tool-execution.ts +13 -16
  176. package/src/modes/components/tree-selector.ts +62 -3
  177. package/src/modes/controllers/command-controller.ts +8 -2
  178. package/src/modes/controllers/event-controller.ts +15 -15
  179. package/src/modes/controllers/input-controller.ts +20 -2
  180. package/src/modes/controllers/selector-controller.ts +1 -0
  181. package/src/modes/theme/color.ts +133 -0
  182. package/src/modes/theme/loader.ts +178 -0
  183. package/src/modes/theme/schema.ts +263 -0
  184. package/src/modes/theme/symbols.ts +1000 -0
  185. package/src/modes/theme/theme-class.ts +611 -0
  186. package/src/modes/theme/theme.ts +27 -2453
  187. package/src/modes/theme/tui-adapters.ts +279 -0
  188. package/src/modes/utils/transcript-render-helpers.ts +4 -2
  189. package/src/modes/utils/ui-helpers.ts +1 -0
  190. package/src/registry/agent-registry.ts +2 -2
  191. package/src/sdk.ts +6 -49
  192. package/src/secrets/index.ts +51 -6
  193. package/src/secrets/message-transform.ts +287 -0
  194. package/src/secrets/obfuscator.ts +39 -1303
  195. package/src/secrets/placeholder-scan.ts +506 -0
  196. package/src/secrets/placeholder.ts +309 -0
  197. package/src/secrets/replacement.ts +216 -0
  198. package/src/session/agent-session-events.ts +2 -2
  199. package/src/session/agent-session-types.ts +6 -0
  200. package/src/session/agent-session.ts +146 -21
  201. package/src/session/indexed-session-storage.ts +7 -2
  202. package/src/session/messages.ts +1 -0
  203. package/src/session/prewalk.ts +57 -17
  204. package/src/session/session-advisors.ts +32 -34
  205. package/src/session/session-context.ts +3 -5
  206. package/src/session/session-handoff.ts +39 -16
  207. package/src/session/session-manager.ts +67 -3
  208. package/src/session/session-provider-boundary.ts +3 -6
  209. package/src/session/session-tools.ts +37 -3
  210. package/src/session/todo-tracker.ts +11 -1
  211. package/src/session/turn-recovery.ts +115 -84
  212. package/src/slash-commands/builtin-collaboration.ts +504 -0
  213. package/src/slash-commands/builtin-completions.ts +291 -0
  214. package/src/slash-commands/builtin-control.ts +78 -0
  215. package/src/slash-commands/builtin-lifecycle.ts +506 -0
  216. package/src/slash-commands/builtin-marketplace.ts +567 -0
  217. package/src/slash-commands/builtin-modes.ts +518 -0
  218. package/src/slash-commands/builtin-registry.ts +21 -2996
  219. package/src/slash-commands/builtin-session.ts +592 -0
  220. package/src/task/executor.ts +17 -14
  221. package/src/task/index.ts +21 -6
  222. package/src/tools/bash-skill-urls.ts +15 -0
  223. package/src/tools/bash.ts +10 -11
  224. package/src/tools/debug.ts +1 -1
  225. package/src/tools/gh-common.ts +288 -0
  226. package/src/tools/gh-pr-checkout.ts +679 -0
  227. package/src/tools/gh-pr-diff.ts +473 -0
  228. package/src/tools/gh-run-watch.ts +1015 -0
  229. package/src/tools/gh-search.ts +500 -0
  230. package/src/tools/gh-types.ts +379 -0
  231. package/src/tools/gh-view.ts +612 -0
  232. package/src/tools/gh.ts +109 -3821
  233. package/src/tools/jtd-to-json-schema.ts +123 -21
  234. package/src/tools/read-archive.ts +209 -0
  235. package/src/tools/read-format.ts +593 -0
  236. package/src/tools/read-path-resolution.ts +36 -0
  237. package/src/tools/read-pdf-images.ts +250 -0
  238. package/src/tools/read-renderer.ts +289 -0
  239. package/src/tools/read-selector.ts +84 -0
  240. package/src/tools/read-sqlite.ts +215 -0
  241. package/src/tools/read-summary.ts +199 -0
  242. package/src/tools/read.ts +82 -1824
  243. package/src/tools/shell-tokenize.ts +99 -1
  244. package/src/utils/changelog.ts +1 -1
  245. package/src/utils/title-generator.ts +3 -1
  246. package/src/web/search/providers/exa.ts +1 -1
  247. package/src/web/search/providers/zai.ts +12 -3
@@ -0,0 +1,1000 @@
1
+ // ============================================================================
2
+ // Symbol Presets
3
+ // ============================================================================
4
+
5
+ export type SymbolPreset = "unicode" | "nerd" | "ascii";
6
+
7
+ /**
8
+ * All available symbol keys organized by category.
9
+ */
10
+ export type SymbolKey =
11
+ // Status Indicators
12
+ | "status.success"
13
+ | "status.error"
14
+ | "status.warning"
15
+ | "status.info"
16
+ | "status.pending"
17
+ | "status.disabled"
18
+ | "status.enabled"
19
+ | "status.running"
20
+ | "status.shadowed"
21
+ | "status.aborted"
22
+ | "status.done"
23
+ // Navigation
24
+ | "nav.cursor"
25
+ | "nav.selected"
26
+ | "nav.expand"
27
+ | "nav.collapse"
28
+ | "nav.back"
29
+ // Tree Connectors
30
+ | "tree.branch"
31
+ | "tree.last"
32
+ | "tree.vertical"
33
+ | "tree.horizontal"
34
+ | "tree.hook"
35
+ // Box Drawing - Rounded
36
+ | "boxRound.topLeft"
37
+ | "boxRound.topRight"
38
+ | "boxRound.bottomLeft"
39
+ | "boxRound.bottomRight"
40
+ | "boxRound.horizontal"
41
+ | "boxRound.vertical"
42
+ // Box Drawing - Sharp
43
+ | "boxSharp.topLeft"
44
+ | "boxSharp.topRight"
45
+ | "boxSharp.bottomLeft"
46
+ | "boxSharp.bottomRight"
47
+ | "boxSharp.horizontal"
48
+ | "boxSharp.vertical"
49
+ | "boxSharp.cross"
50
+ | "boxSharp.teeDown"
51
+ | "boxSharp.teeUp"
52
+ | "boxSharp.teeRight"
53
+ | "boxSharp.teeLeft"
54
+ // Separators
55
+ | "sep.powerline"
56
+ | "sep.powerlineThin"
57
+ | "sep.powerlineLeft"
58
+ | "sep.powerlineRight"
59
+ | "sep.powerlineThinLeft"
60
+ | "sep.powerlineThinRight"
61
+ | "sep.block"
62
+ | "sep.space"
63
+ | "sep.asciiLeft"
64
+ | "sep.asciiRight"
65
+ | "sep.dot"
66
+ | "sep.slash"
67
+ | "sep.pipe"
68
+ // Icons
69
+ | "icon.model"
70
+ | "icon.plan"
71
+ | "icon.prewalk"
72
+ | "icon.goal"
73
+ | "icon.pause"
74
+ | "icon.loop"
75
+ | "icon.folder"
76
+ | "icon.worktree"
77
+ | "icon.search"
78
+ | "icon.scratchFolder"
79
+ | "icon.file"
80
+ | "icon.git"
81
+ | "icon.branch"
82
+ | "icon.pr"
83
+ | "icon.tokens"
84
+ | "icon.context"
85
+ | "icon.cost"
86
+ | "icon.time"
87
+ | "icon.pi"
88
+ | "icon.ghost"
89
+ | "icon.agents"
90
+ | "icon.job"
91
+ | "icon.cache"
92
+ | "icon.cacheMiss"
93
+ | "icon.input"
94
+ | "icon.output"
95
+ | "icon.throughput"
96
+ | "icon.host"
97
+ | "icon.session"
98
+ | "icon.package"
99
+ | "icon.warning"
100
+ | "icon.rewind"
101
+ | "icon.auto"
102
+ | "icon.fast"
103
+ | "icon.extensionSkill"
104
+ | "icon.extensionTool"
105
+ | "icon.extensionSlashCommand"
106
+ | "icon.extensionMcp"
107
+ | "icon.extensionRule"
108
+ | "icon.extensionHook"
109
+ | "icon.extensionPrompt"
110
+ | "icon.extensionContextFile"
111
+ | "icon.extensionInstruction"
112
+ // STT
113
+ | "icon.mic"
114
+ // Compaction divider
115
+ | "icon.camera"
116
+ // Thinking Levels
117
+ | "thinking.minimal"
118
+ | "thinking.low"
119
+ | "thinking.medium"
120
+ | "thinking.high"
121
+ | "thinking.xhigh"
122
+ | "thinking.max"
123
+ | "thinking.autoPending"
124
+ // Checkboxes
125
+ | "checkbox.checked"
126
+ | "checkbox.unchecked"
127
+ // Radio (single-choice)
128
+ | "radio.selected"
129
+ | "radio.unselected"
130
+ // Text Formatting
131
+ | "format.bullet"
132
+ | "format.dash"
133
+ | "format.bracketLeft"
134
+ | "format.bracketRight"
135
+ // Markdown-specific
136
+ | "md.quoteBorder"
137
+ | "md.hrChar"
138
+ | "md.bullet"
139
+ | "md.colorSwatch"
140
+ // Advisor note rail
141
+ | "advisor.rail"
142
+ // Language/file type icons
143
+ | "lang.default"
144
+ | "lang.typescript"
145
+ | "lang.javascript"
146
+ | "lang.python"
147
+ | "lang.rust"
148
+ | "lang.go"
149
+ | "lang.java"
150
+ | "lang.c"
151
+ | "lang.cpp"
152
+ | "lang.csharp"
153
+ | "lang.ruby"
154
+ | "lang.julia"
155
+ | "lang.php"
156
+ | "lang.swift"
157
+ | "lang.kotlin"
158
+ | "lang.shell"
159
+ | "lang.html"
160
+ | "lang.css"
161
+ | "lang.json"
162
+ | "lang.yaml"
163
+ | "lang.markdown"
164
+ | "lang.sql"
165
+ | "lang.docker"
166
+ | "lang.lua"
167
+ | "lang.text"
168
+ | "lang.env"
169
+ | "lang.toml"
170
+ | "lang.xml"
171
+ | "lang.ini"
172
+ | "lang.conf"
173
+ | "lang.log"
174
+ | "lang.csv"
175
+ | "lang.tsv"
176
+ | "lang.image"
177
+ | "lang.pdf"
178
+ | "lang.archive"
179
+ | "lang.binary"
180
+ // Settings tab icons
181
+ | "tab.appearance"
182
+ | "tab.model"
183
+ | "tab.interaction"
184
+ | "tab.context"
185
+ | "tab.files"
186
+ | "tab.shell"
187
+ | "tab.tools"
188
+ | "tab.memory"
189
+ | "tab.tasks"
190
+ | "tab.providers"
191
+ // Tool identity icons
192
+ | "tool.write"
193
+ | "tool.edit"
194
+ | "tool.bash"
195
+ | "tool.ssh"
196
+ | "tool.lsp"
197
+ | "tool.gh"
198
+ | "tool.webSearch"
199
+ | "tool.exa"
200
+ | "tool.browser"
201
+ | "tool.eval"
202
+ | "tool.debug"
203
+ | "tool.mcp"
204
+ | "tool.job"
205
+ | "tool.launch"
206
+ | "tool.task"
207
+ | "tool.todo"
208
+ | "tool.memory"
209
+ | "tool.ask"
210
+ | "tool.resolve"
211
+ | "tool.review"
212
+ | "tool.inspectImage"
213
+ | "tool.goal"
214
+ | "tool.irc"
215
+ | "tool.delete"
216
+ | "tool.move";
217
+
218
+ export type SymbolMap = Record<SymbolKey, string>;
219
+
220
+ const UNICODE_SYMBOLS: SymbolMap = {
221
+ // Status
222
+ "status.success": "✔",
223
+ "status.error": "✘",
224
+ "status.warning": "⚠",
225
+ "status.info": "ⓘ",
226
+ "status.pending": "⏳",
227
+ "status.disabled": "⦸",
228
+ "status.enabled": "●",
229
+ "status.running": "⟳",
230
+ "status.shadowed": "○",
231
+ "status.aborted": "⏹",
232
+ "status.done": "•",
233
+ // Navigation
234
+ "nav.cursor": "❯",
235
+ "nav.selected": "➤",
236
+ "nav.expand": "▸",
237
+ "nav.collapse": "▾",
238
+ "nav.back": "⟵",
239
+ // Tree
240
+ "tree.branch": "├─",
241
+ "tree.last": "└─",
242
+ "tree.vertical": "│",
243
+ "tree.horizontal": "─",
244
+ "tree.hook": "└",
245
+ // Box (rounded)
246
+ "boxRound.topLeft": "╭",
247
+ "boxRound.topRight": "╮",
248
+ "boxRound.bottomLeft": "╰",
249
+ "boxRound.bottomRight": "╯",
250
+ "boxRound.horizontal": "─",
251
+ "boxRound.vertical": "│",
252
+ // Box (sharp)
253
+ "boxSharp.topLeft": "┌",
254
+ "boxSharp.topRight": "┐",
255
+ "boxSharp.bottomLeft": "└",
256
+ "boxSharp.bottomRight": "┘",
257
+ "boxSharp.horizontal": "─",
258
+ "boxSharp.vertical": "│",
259
+ "boxSharp.cross": "┼",
260
+ "boxSharp.teeDown": "┬",
261
+ "boxSharp.teeUp": "┴",
262
+ "boxSharp.teeRight": "├",
263
+ "boxSharp.teeLeft": "┤",
264
+ // Separators (powerline-ish, but pure Unicode)
265
+ "sep.powerline": "▕",
266
+ "sep.powerlineThin": "┆",
267
+ "sep.powerlineLeft": "▶",
268
+ "sep.powerlineRight": "◀",
269
+ "sep.powerlineThinLeft": ">",
270
+ "sep.powerlineThinRight": "<",
271
+ "sep.block": "▌",
272
+ "sep.space": " ",
273
+ "sep.asciiLeft": ">",
274
+ "sep.asciiRight": "<",
275
+ "sep.dot": " · ",
276
+ "sep.slash": " / ",
277
+ "sep.pipe": " │ ",
278
+ // Icons
279
+ "icon.model": "⬢",
280
+ "icon.plan": "🗺",
281
+ "icon.prewalk": "🏃",
282
+ "icon.goal": "🎯",
283
+ "icon.pause": "⏸",
284
+ "icon.loop": "↻",
285
+ "icon.folder": "📁",
286
+ "icon.worktree": "🌳",
287
+ "icon.search": "🔍",
288
+ "icon.scratchFolder": "🗑",
289
+ "icon.file": "📄",
290
+ "icon.git": "⎇",
291
+ "icon.branch": "⑂",
292
+ "icon.pr": "⤴",
293
+ "icon.tokens": "🪙",
294
+ "icon.context": "◫",
295
+ "icon.cost": "💲",
296
+ "icon.time": "⏱",
297
+ "icon.pi": "π",
298
+ "icon.ghost": "👻",
299
+ "icon.agents": "👥",
300
+ "icon.job": "⚙",
301
+ "icon.cache": "💾",
302
+ "icon.cacheMiss": "⊘",
303
+ "icon.input": "⤵",
304
+ "icon.output": "⤴",
305
+ "icon.throughput": "⚡",
306
+ "icon.host": "🖥",
307
+ "icon.session": "🆔",
308
+ "icon.package": "📦",
309
+ "icon.warning": "⚠",
310
+ "icon.rewind": "↶",
311
+ "icon.auto": "⟲",
312
+ "icon.fast": "⚡",
313
+ "icon.extensionSkill": "✦",
314
+ "icon.extensionTool": "🛠",
315
+ "icon.extensionSlashCommand": "⌘",
316
+ "icon.extensionMcp": "🔌",
317
+ "icon.extensionRule": "⚖",
318
+ "icon.extensionHook": "🪝",
319
+ "icon.extensionPrompt": "✎",
320
+ "icon.extensionContextFile": "📎",
321
+ "icon.extensionInstruction": "📘",
322
+ // STT
323
+ "icon.mic": "🎤",
324
+ // Compaction divider
325
+ "icon.camera": "📷",
326
+ // Thinking levels
327
+ "thinking.minimal": "○ min",
328
+ "thinking.low": "◔ low",
329
+ "thinking.medium": "◑ med",
330
+ "thinking.high": "◒ high",
331
+ "thinking.xhigh": "◕ xhigh",
332
+ "thinking.max": "◉ max",
333
+ "thinking.autoPending": "⟳",
334
+ // Checkboxes
335
+ "checkbox.checked": "☑",
336
+ "checkbox.unchecked": "☐",
337
+ // Radio (single-choice)
338
+ "radio.selected": "◉",
339
+ "radio.unselected": "○",
340
+ // Formatting
341
+ "format.bullet": "•",
342
+ "format.dash": "—",
343
+ "format.bracketLeft": "⟦",
344
+ "format.bracketRight": "⟧",
345
+ // Markdown
346
+ "md.quoteBorder": "▏",
347
+ "md.hrChar": "─",
348
+ "md.bullet": "•",
349
+ "md.colorSwatch": "■",
350
+ // Advisor note rail (heavier than md.quoteBorder so notes read as a distinct voice)
351
+ "advisor.rail": "▎",
352
+ // Language/file icons (emoji-centric, no Nerd Font required)
353
+ "lang.default": "⌘",
354
+ "lang.typescript": "🟦",
355
+ "lang.javascript": "🟨",
356
+ "lang.python": "🐍",
357
+ "lang.rust": "🦀",
358
+ "lang.go": "🐹",
359
+ "lang.java": "☕",
360
+ "lang.c": "Ⓒ",
361
+ "lang.cpp": "➕",
362
+ "lang.csharp": "♯",
363
+ "lang.ruby": "💎",
364
+ "lang.julia": "Ⓙ",
365
+ "lang.php": "🐘",
366
+ "lang.swift": "🕊",
367
+ "lang.kotlin": "🅺",
368
+ "lang.shell": "💻",
369
+ "lang.html": "🌐",
370
+ "lang.css": "🎨",
371
+ "lang.json": "🧾",
372
+ "lang.yaml": "📋",
373
+ "lang.markdown": "📝",
374
+ "lang.sql": "🗄",
375
+ "lang.docker": "🐳",
376
+ "lang.lua": "🌙",
377
+ "lang.text": "🗒",
378
+ "lang.env": "🔧",
379
+ "lang.toml": "🧾",
380
+ "lang.xml": "⟨⟩",
381
+ "lang.ini": "⚙",
382
+ "lang.conf": "⚙",
383
+ "lang.log": "📜",
384
+ "lang.csv": "📑",
385
+ "lang.tsv": "📑",
386
+ "lang.image": "🖼",
387
+ "lang.pdf": "📕",
388
+ "lang.archive": "🗜",
389
+ "lang.binary": "⚙",
390
+ // Settings tabs
391
+ "tab.appearance": "🎨",
392
+ "tab.model": "🤖",
393
+ "tab.interaction": "⌨",
394
+ "tab.context": "📋",
395
+ "tab.files": "📁",
396
+ "tab.shell": "💻",
397
+ "tab.tools": "🔧",
398
+ "tab.memory": "🧠",
399
+ "tab.tasks": "📦",
400
+ "tab.providers": "🌐",
401
+ // Tool identity icons (per-tool signature glyph on the success header)
402
+ "tool.write": "✎",
403
+ "tool.edit": "✎",
404
+ "tool.bash": "❯",
405
+ "tool.ssh": "⇄",
406
+ "tool.lsp": "💡",
407
+ "tool.gh": "⎇",
408
+ "tool.webSearch": "⌕",
409
+ "tool.exa": "🔭",
410
+ "tool.browser": "🌐",
411
+ "tool.eval": "▶",
412
+ "tool.debug": "🐞",
413
+ "tool.mcp": "🔌",
414
+ "tool.job": "⚙",
415
+ "tool.launch": "🚀",
416
+ "tool.task": "⇶",
417
+ "tool.todo": "☑",
418
+ "tool.memory": "🧠",
419
+ "tool.ask": "?",
420
+ "tool.resolve": "✓",
421
+ "tool.review": "◉",
422
+ "tool.inspectImage": "🖼",
423
+ "tool.goal": "◎",
424
+ "tool.irc": "✉",
425
+ "tool.delete": "🗑",
426
+ "tool.move": "➜",
427
+ };
428
+
429
+ const NERD_SYMBOLS: SymbolMap = {
430
+ // Status Indicators
431
+ // pick:  | alt:   
432
+ "status.success": "\uf00c",
433
+ // pick:  | alt:   
434
+ "status.error": "\uf00d",
435
+ // pick:  | alt:  
436
+ "status.warning": "\uf12a",
437
+ // pick:  | alt: 
438
+ "status.info": "\uf129",
439
+ // pick:  | alt:   
440
+ "status.pending": "\uf254",
441
+ // pick:  | alt:  
442
+ "status.disabled": "\uf05e",
443
+ // pick:  | alt:  
444
+ "status.enabled": "\uf111",
445
+ // pick:  | alt:   
446
+ "status.running": "\uf110",
447
+ // pick: (nf-fa-circle_o, pairs with status.enabled's nf-fa-circle) | alt: ◐ ◑
448
+ "status.shadowed": "\uf10c",
449
+ // pick:  | alt:  
450
+ "status.aborted": "\uf04d",
451
+ // pick: • | alt: ● ·
452
+ "status.done": "•",
453
+ // Navigation
454
+ // pick:  | alt:  
455
+ "nav.cursor": "\uf054",
456
+ // pick:  | alt:  
457
+ "nav.selected": "\uf178",
458
+ // pick:  | alt:  
459
+ "nav.expand": "\uf0da",
460
+ // pick:  | alt:  
461
+ "nav.collapse": "\uf0d7",
462
+ // pick:  | alt:  
463
+ "nav.back": "\uf060",
464
+ // Tree Connectors (same as unicode)
465
+ // pick: ├─ | alt: ├╴ ├╌ ╠═ ┣━
466
+ "tree.branch": "├─",
467
+ // pick: └─ | alt: └╴ └╌ ╚═ ┗━
468
+ "tree.last": "└─",
469
+ // pick: │ | alt: ┃ ║ ▏ ▕
470
+ "tree.vertical": "│",
471
+ // pick: ─ | alt: ━ ═ ╌ ┄
472
+ "tree.horizontal": "─",
473
+ // pick: └ | alt: ╰ ⎿ ↳
474
+ "tree.hook": "└",
475
+ // Box Drawing - Rounded (same as unicode)
476
+ // pick: ╭ | alt: ┌ ┏ ╔
477
+ "boxRound.topLeft": "╭",
478
+ // pick: ╮ | alt: ┐ ┓ ╗
479
+ "boxRound.topRight": "╮",
480
+ // pick: ╰ | alt: └ ┗ ╚
481
+ "boxRound.bottomLeft": "╰",
482
+ // pick: ╯ | alt: ┘ ┛ ╝
483
+ "boxRound.bottomRight": "╯",
484
+ // pick: ─ | alt: ━ ═ ╌
485
+ "boxRound.horizontal": "─",
486
+ // pick: │ | alt: ┃ ║ ▏
487
+ "boxRound.vertical": "│",
488
+ // Box Drawing - Sharp (same as unicode)
489
+ // pick: ┌ | alt: ┏ ╭ ╔
490
+ "boxSharp.topLeft": "┌",
491
+ // pick: ┐ | alt: ┓ ╮ ╗
492
+ "boxSharp.topRight": "┐",
493
+ // pick: └ | alt: ┗ ╰ ╚
494
+ "boxSharp.bottomLeft": "└",
495
+ // pick: ┘ | alt: ┛ ╯ ╝
496
+ "boxSharp.bottomRight": "┘",
497
+ // pick: ─ | alt: ━ ═ ╌
498
+ "boxSharp.horizontal": "─",
499
+ // pick: │ | alt: ┃ ║ ▏
500
+ "boxSharp.vertical": "│",
501
+ // pick: ┼ | alt: ╋ ╬ ┿
502
+ "boxSharp.cross": "┼",
503
+ // pick: ┬ | alt: ╦ ┯ ┳
504
+ "boxSharp.teeDown": "┬",
505
+ // pick: ┴ | alt: ╩ ┷ ┻
506
+ "boxSharp.teeUp": "┴",
507
+ // pick: ├ | alt: ╠ ┝ ┣
508
+ "boxSharp.teeRight": "├",
509
+ // pick: ┤ | alt: ╣ ┥ ┫
510
+ "boxSharp.teeLeft": "┤",
511
+ // Separators - Nerd Font specific
512
+ // pick:  | alt:   
513
+ "sep.powerline": "\ue0b0",
514
+ // pick:  | alt:  
515
+ "sep.powerlineThin": "\ue0b1",
516
+ // pick:  | alt:  
517
+ "sep.powerlineLeft": "\ue0b0",
518
+ // pick:  | alt:  
519
+ "sep.powerlineRight": "\ue0b2",
520
+ // pick:  | alt: 
521
+ "sep.powerlineThinLeft": "\ue0b1",
522
+ // pick:  | alt: 
523
+ "sep.powerlineThinRight": "\ue0b3",
524
+ // pick: █ | alt: ▓ ▒ ░ ▉ ▌
525
+ "sep.block": "█",
526
+ // pick: space | alt: ␠ ·
527
+ "sep.space": " ",
528
+ // pick: > | alt: › » ▸
529
+ "sep.asciiLeft": ">",
530
+ // pick: < | alt: ‹ « ◂
531
+ "sep.asciiRight": "<",
532
+ // pick: · | alt: • ⋅
533
+ "sep.dot": " · ",
534
+ // pick:  | alt: / ∕ ⁄
535
+ "sep.slash": "\ue0bb",
536
+ // pick:  | alt: │ ┃ |
537
+ "sep.pipe": "\ue0b3",
538
+ // Icons - Nerd Font specific
539
+ // pick:  | alt:   ◆
540
+ "icon.model": "\uec19",
541
+ // pick:  | alt:  
542
+ "icon.plan": "\uf2d2",
543
+ "icon.prewalk": "\uf29d",
544
+ // pick: (nf-fa-bullseye) | alt: (nf-md-target) ◎ ⌖
545
+ "icon.goal": "\uf140",
546
+ // pick: (nf-fa-pause) | alt: ⏸ ||
547
+ "icon.pause": "\uf04c",
548
+ // pick: ↻ | alt: ⟳
549
+ "icon.loop": "\uf021",
550
+ // pick:  | alt:  
551
+ "icon.folder": "\uf115",
552
+ "icon.search": "\uf002",
553
+ // pick: | alt:
554
+ "icon.scratchFolder": "\uf014",
555
+ // pick: nf-fa-sitemap | alt: nf-cod-list_tree
556
+ "icon.worktree": "\uf0e8",
557
+ // pick:  | alt:  
558
+ "icon.file": "\uf15b",
559
+ // pick:  | alt:  ⎇
560
+ "icon.git": "\uf1d3",
561
+ // pick:  | alt:  ⎇
562
+ "icon.branch": "\uf126",
563
+ // pick:  (nf-cod-git_pull_request) | alt: (nf-oct-git_pull_request)
564
+ "icon.pr": "\uea64",
565
+ // pick:  | alt: ⊛ ◍ 
566
+ "icon.tokens": "\ue26b",
567
+ // pick:  | alt: ◫ ▦
568
+ "icon.context": "\ue70f",
569
+ // pick:  | alt: $ ¢
570
+ "icon.cost": "\uf155",
571
+ // pick:  | alt: ◷ ◴
572
+ "icon.time": "\uf017",
573
+ // pick:  | alt: π ∏ ∑
574
+ "icon.pi": "\ue22c",
575
+ // pick: 󰊠 (nf-md-ghost) | alt: 👻
576
+ "icon.ghost": "\u{f02a0}",
577
+ // pick:  | alt: 
578
+ "icon.agents": "\uf0c0",
579
+ // pick: (nf-fa-gear) | alt: ⚙
580
+ "icon.job": "\uf013",
581
+ // pick:  | alt:  
582
+ "icon.cache": "\uf1c0",
583
+ // pick: (fa-ban) | alt: ⊘
584
+ "icon.cacheMiss": "\uf05e",
585
+ // pick:  | alt:  →
586
+ "icon.input": "\uf090",
587
+ // pick:  | alt:  →
588
+ "icon.output": "\uf08b",
589
+ // pick: (nf-fa-tachometer) | alt: ⚡ ↬
590
+ "icon.throughput": "\uf0e4",
591
+ // pick:  | alt:  
592
+ "icon.host": "\uf109",
593
+ // pick: 󰁑 (nf-md-arrow_left_bold_hexagon_outline) | alt:  
594
+ "icon.session": "\u{f0051}",
595
+ // pick:  | alt: 
596
+ "icon.package": "\uf487",
597
+ // pick:  | alt:  
598
+ "icon.warning": "\uf071",
599
+ // pick:  | alt:  ↺
600
+ "icon.rewind": "\uf0e2",
601
+ // pick: 󰁨 | alt:   
602
+ "icon.auto": "\u{f0068}",
603
+ "icon.fast": "\uf0e7",
604
+ "icon.extensionSkill": "\uf0eb",
605
+ // pick:  | alt:  
606
+ "icon.extensionTool": "\uf0ad",
607
+ // pick:  | alt: 
608
+ "icon.extensionSlashCommand": "\uf120",
609
+ // pick:  | alt:  
610
+ "icon.extensionMcp": "\uf1e6",
611
+ // pick:  | alt:  
612
+ "icon.extensionRule": "\uf0e3",
613
+ // pick:  | alt: 
614
+ "icon.extensionHook": "\uf0c1",
615
+ // pick:  | alt:  
616
+ "icon.extensionPrompt": "\uf075",
617
+ // pick:  | alt:  
618
+ "icon.extensionContextFile": "\uf0f6",
619
+ // pick:  | alt:  
620
+ "icon.extensionInstruction": "\uf02d",
621
+ // STT - fa-microphone
622
+ "icon.mic": "\uf130",
623
+ // Compaction divider - fa-camera-retro
624
+ "icon.camera": "\uf083",
625
+ // Thinking levels — increasing circle slices, with fire reserved for max.
626
+ "thinking.minimal": "\u{F0A9E} min",
627
+ "thinking.low": "\u{F0A9F} low",
628
+ "thinking.medium": "\u{F0AA1} med",
629
+ "thinking.high": "\u{F0AA3} high",
630
+ "thinking.xhigh": "\u{F0AA5} xhi",
631
+ "thinking.max": "\u{F06D} max",
632
+ // Auto mode uses shuffle until the model resolves its thinking level.
633
+ "thinking.autoPending": "\u{F074}",
634
+ // Checkboxes
635
+ // pick:  | alt:  
636
+ "checkbox.checked": "\uf14a",
637
+ // pick:  | alt: 
638
+ "checkbox.unchecked": "\uf096",
639
+ // Radio (single-choice)
640
+ // pick: (fa-dot-circle-o) | alt: ◉
641
+ "radio.selected": "\uf192",
642
+ // pick: (fa-circle-o) | alt: ○
643
+ "radio.unselected": "\uf10c",
644
+ // pick:  | alt:   •
645
+ "format.bullet": "\uf111",
646
+ // pick: – | alt: — ― -
647
+ "format.dash": "–",
648
+ // pick: ⟨ | alt: [ ⟦
649
+ "format.bracketLeft": "⟨",
650
+ // pick: ⟩ | alt: ] ⟧
651
+ "format.bracketRight": "⟩",
652
+ // Markdown-specific
653
+ // pick: │ | alt: ┃ ║
654
+ "md.quoteBorder": "│",
655
+ // pick: ─ | alt: ━ ═
656
+ "md.hrChar": "─",
657
+ // pick:  | alt:  •
658
+ "md.bullet": "\uf111",
659
+ // pick: ■ | alt: (U+F096)
660
+ "md.colorSwatch": "■",
661
+ // pick: ▎ | alt: ┃ │
662
+ "advisor.rail": "▎",
663
+ // Language icons (nerd font devicons)
664
+ "lang.default": "",
665
+ "lang.typescript": "\u{E628}",
666
+ "lang.javascript": "\u{E60C}",
667
+ "lang.python": "\u{E606}",
668
+ "lang.rust": "\u{E7A8}",
669
+ "lang.go": "\u{E627}",
670
+ "lang.java": "\u{E738}",
671
+ "lang.c": "\u{E61E}",
672
+ "lang.cpp": "\u{E61D}",
673
+ "lang.csharp": "\u{E7BC}",
674
+ "lang.ruby": "\u{E791}",
675
+ "lang.julia": "\u{E624}",
676
+ "lang.php": "\u{E608}",
677
+ "lang.swift": "\u{E755}",
678
+ "lang.kotlin": "\u{E634}",
679
+ "lang.shell": "\u{E795}",
680
+ "lang.html": "\u{E736}",
681
+ "lang.css": "\u{E749}",
682
+ "lang.json": "\u{E60B}",
683
+ "lang.yaml": "\u{E615}",
684
+ "lang.markdown": "\u{E609}",
685
+ "lang.sql": "\u{E706}",
686
+ "lang.docker": "\u{E7B0}",
687
+ "lang.lua": "\u{E620}",
688
+ "lang.text": "\u{E612}",
689
+ "lang.env": "\u{E615}",
690
+ "lang.toml": "\u{E615}",
691
+ "lang.xml": "\u{F05C0}",
692
+ "lang.ini": "\u{E615}",
693
+ "lang.conf": "\u{E615}",
694
+ "lang.log": "\u{F0331}",
695
+ "lang.csv": "\u{F021B}",
696
+ "lang.tsv": "\u{F021B}",
697
+ "lang.image": "\u{F021F}",
698
+ "lang.pdf": "\u{F0226}",
699
+ "lang.archive": "\u{F187}",
700
+ "lang.binary": "\u{F019A}",
701
+ // Settings tab icons
702
+ "tab.appearance": "󰃣",
703
+ "tab.model": "󰚩",
704
+ "tab.interaction": "󰌌",
705
+ "tab.context": "󰘸",
706
+ "tab.files": "󰈔",
707
+ "tab.shell": "󰆍",
708
+ "tab.tools": "󰠭",
709
+ "tab.memory": "󰧑",
710
+ "tab.tasks": "󰐱",
711
+ "tab.providers": "󰖟",
712
+ // Tool identity icons (per-tool signature glyph on the success header)
713
+ "tool.write": "\uEA7F",
714
+ "tool.edit": "\uEA73",
715
+ "tool.bash": "\uEBCA",
716
+ "tool.ssh": "\uEB3A",
717
+ "tool.lsp": "\uEA61",
718
+ "tool.gh": "\uEA84",
719
+ "tool.webSearch": "\uEB01",
720
+ "tool.exa": "\uEB68",
721
+ "tool.browser": "\uEAAE",
722
+ "tool.eval": "\uEBAF",
723
+ "tool.debug": "\uEAD8",
724
+ "tool.mcp": "\uEB2D",
725
+ "tool.job": "\uEBA2",
726
+ "tool.launch": "\uF135",
727
+ "tool.task": "\uf4a0",
728
+ "tool.todo": "\uEAB3",
729
+ "tool.memory": "\uEACE",
730
+ "tool.ask": "\uEAC7",
731
+ "tool.resolve": "\uEBB1",
732
+ "tool.review": "\uEA70",
733
+ "tool.inspectImage": "\uEAEA",
734
+ "tool.goal": "\uEBF8",
735
+ "tool.irc": "\uF086",
736
+ "tool.delete": "\uf12d",
737
+ "tool.move": "\uf061",
738
+ };
739
+
740
+ const ASCII_SYMBOLS: SymbolMap = {
741
+ // Status Indicators
742
+ "status.success": "[ok]",
743
+ "status.error": "[!!]",
744
+ "status.warning": "[!]",
745
+ "status.info": "[i]",
746
+ "status.pending": "[*]",
747
+ "status.disabled": "[ ]",
748
+ "status.enabled": "[x]",
749
+ "status.running": "[~]",
750
+ "status.shadowed": "[/]",
751
+ "status.aborted": "[-]",
752
+ "status.done": "*",
753
+ // Navigation
754
+ "nav.cursor": ">",
755
+ "nav.selected": "->",
756
+ "nav.expand": "+",
757
+ "nav.collapse": "-",
758
+ "nav.back": "<-",
759
+ // Tree Connectors
760
+ "tree.branch": "|--",
761
+ "tree.last": "'--",
762
+ "tree.vertical": "|",
763
+ "tree.horizontal": "-",
764
+ "tree.hook": "`-",
765
+ // Box Drawing - Rounded (ASCII fallback)
766
+ "boxRound.topLeft": "+",
767
+ "boxRound.topRight": "+",
768
+ "boxRound.bottomLeft": "+",
769
+ "boxRound.bottomRight": "+",
770
+ "boxRound.horizontal": "-",
771
+ "boxRound.vertical": "|",
772
+ // Box Drawing - Sharp (ASCII fallback)
773
+ "boxSharp.topLeft": "+",
774
+ "boxSharp.topRight": "+",
775
+ "boxSharp.bottomLeft": "+",
776
+ "boxSharp.bottomRight": "+",
777
+ "boxSharp.horizontal": "-",
778
+ "boxSharp.vertical": "|",
779
+ "boxSharp.cross": "+",
780
+ "boxSharp.teeDown": "+",
781
+ "boxSharp.teeUp": "+",
782
+ "boxSharp.teeRight": "+",
783
+ "boxSharp.teeLeft": "+",
784
+ // Separators
785
+ "sep.powerline": ">",
786
+ "sep.powerlineThin": ">",
787
+ "sep.powerlineLeft": ">",
788
+ "sep.powerlineRight": "<",
789
+ "sep.powerlineThinLeft": ">",
790
+ "sep.powerlineThinRight": "<",
791
+ "sep.block": "#",
792
+ "sep.space": " ",
793
+ "sep.asciiLeft": ">",
794
+ "sep.asciiRight": "<",
795
+ "sep.dot": " - ",
796
+ "sep.slash": " / ",
797
+ "sep.pipe": " | ",
798
+ // Icons
799
+ "icon.model": "[M]",
800
+ "icon.plan": "plan",
801
+ "icon.prewalk": "prewalk",
802
+ "icon.goal": "goal",
803
+ "icon.pause": "||",
804
+ "icon.loop": "loop",
805
+ "icon.folder": "[D]",
806
+ "icon.worktree": "[wt]",
807
+ "icon.search": "[/]",
808
+ "icon.scratchFolder": "[T]",
809
+ "icon.file": "[F]",
810
+ "icon.git": "git:",
811
+ "icon.branch": "@",
812
+ "icon.pr": "PR",
813
+ "icon.tokens": "tok:",
814
+ "icon.context": "ctx:",
815
+ "icon.cost": "$",
816
+ "icon.time": "t:",
817
+ "icon.pi": "pi",
818
+ "icon.ghost": "@",
819
+ "icon.agents": "AG",
820
+ "icon.job": "bg",
821
+ "icon.output": "out:",
822
+ "icon.throughput": "tok/s:",
823
+ "icon.cache": "cache",
824
+ "icon.cacheMiss": "!",
825
+ "icon.input": "in:",
826
+ "icon.host": "host",
827
+ "icon.session": "id",
828
+ "icon.package": "[P]",
829
+ "icon.warning": "[!]",
830
+ "icon.rewind": "<-",
831
+ "icon.auto": "[A]",
832
+ "icon.fast": ">>",
833
+ "icon.extensionSkill": "SK",
834
+ "icon.extensionTool": "TL",
835
+ "icon.extensionSlashCommand": "/",
836
+ "icon.extensionMcp": "MCP",
837
+ "icon.extensionRule": "RL",
838
+ "icon.extensionHook": "HK",
839
+ "icon.extensionPrompt": "PR",
840
+ "icon.extensionContextFile": "CF",
841
+ "icon.extensionInstruction": "IN",
842
+ // STT
843
+ "icon.mic": "MIC",
844
+ // Compaction divider
845
+ "icon.camera": "[o]",
846
+ // Thinking Levels
847
+ "thinking.minimal": "[min]",
848
+ "thinking.low": "[low]",
849
+ "thinking.medium": "[med]",
850
+ "thinking.high": "[high]",
851
+ "thinking.xhigh": "[xhi]",
852
+ "thinking.max": "[max]",
853
+ "thinking.autoPending": "[~]",
854
+ // Checkboxes
855
+ "checkbox.checked": "[x]",
856
+ "checkbox.unchecked": "[ ]",
857
+ "radio.selected": "(o)",
858
+ "radio.unselected": "( )",
859
+ "format.bullet": "*",
860
+ "format.dash": "-",
861
+ "format.bracketLeft": "[",
862
+ "format.bracketRight": "]",
863
+ // Markdown-specific
864
+ "md.quoteBorder": "|",
865
+ "md.hrChar": "-",
866
+ "md.bullet": "*",
867
+ "md.colorSwatch": "[]",
868
+ "advisor.rail": "|",
869
+ // Language icons (ASCII uses abbreviations)
870
+ "lang.default": "code",
871
+ "lang.typescript": "ts",
872
+ "lang.javascript": "js",
873
+ "lang.python": "py",
874
+ "lang.rust": "rs",
875
+ "lang.go": "go",
876
+ "lang.java": "java",
877
+ "lang.c": "c",
878
+ "lang.cpp": "cpp",
879
+ "lang.csharp": "cs",
880
+ "lang.ruby": "rb",
881
+ "lang.julia": "jl",
882
+ "lang.php": "php",
883
+ "lang.swift": "swift",
884
+ "lang.kotlin": "kt",
885
+ "lang.shell": "sh",
886
+ "lang.html": "html",
887
+ "lang.css": "css",
888
+ "lang.json": "json",
889
+ "lang.yaml": "yaml",
890
+ "lang.markdown": "md",
891
+ "lang.sql": "sql",
892
+ "lang.docker": "docker",
893
+ "lang.lua": "lua",
894
+ "lang.text": "txt",
895
+ "lang.env": "env",
896
+ "lang.toml": "toml",
897
+ "lang.xml": "xml",
898
+ "lang.ini": "ini",
899
+ "lang.conf": "conf",
900
+ "lang.log": "log",
901
+ "lang.csv": "csv",
902
+ "lang.tsv": "tsv",
903
+ "lang.image": "img",
904
+ "lang.pdf": "pdf",
905
+ "lang.archive": "zip",
906
+ "lang.binary": "bin",
907
+ // Settings tab icons
908
+ "tab.appearance": "[A]",
909
+ "tab.model": "[M]",
910
+ "tab.interaction": "[I]",
911
+ "tab.context": "[X]",
912
+ "tab.files": "[F]",
913
+ "tab.shell": "[S]",
914
+ "tab.tools": "[T]",
915
+ "tab.memory": "[Y]",
916
+ "tab.tasks": "[K]",
917
+ "tab.providers": "[P]",
918
+ // Tool identity icons (per-tool signature glyph on the success header)
919
+ "tool.write": "+f",
920
+ "tool.edit": "~",
921
+ "tool.bash": "$",
922
+ "tool.ssh": "ssh",
923
+ "tool.lsp": "lsp",
924
+ "tool.gh": "gh",
925
+ "tool.webSearch": "web",
926
+ "tool.exa": "exa",
927
+ "tool.browser": "[w]",
928
+ "tool.eval": ">_",
929
+ "tool.debug": "dbg",
930
+ "tool.mcp": "<>",
931
+ "tool.job": "job",
932
+ "tool.launch": "run",
933
+ "tool.task": ">>>",
934
+ "tool.todo": "[x]",
935
+ "tool.memory": "mem",
936
+ "tool.ask": "[?]",
937
+ "tool.resolve": "[v]",
938
+ "tool.review": "rev",
939
+ "tool.inspectImage": "[i]",
940
+ "tool.goal": "(o)",
941
+ "tool.irc": "irc",
942
+ "tool.delete": "rm",
943
+ "tool.move": "mv",
944
+ };
945
+
946
+ export const SYMBOL_PRESETS: Record<SymbolPreset, SymbolMap> = {
947
+ unicode: UNICODE_SYMBOLS,
948
+ nerd: NERD_SYMBOLS,
949
+ ascii: ASCII_SYMBOLS,
950
+ };
951
+
952
+ export type SpinnerType = "status" | "activity";
953
+
954
+ export const SPINNER_FRAMES: Record<SymbolPreset, Record<SpinnerType, string[]>> = {
955
+ unicode: {
956
+ status: ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"],
957
+ activity: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
958
+ },
959
+ nerd: {
960
+ status: ["󱑖", "󱑋", "󱑌", "󱑍", "󱑎", "󱑏", "󱑐", "󱑑", "󱑒", "󱑓", "󱑔", "󱑕"],
961
+ activity: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
962
+ },
963
+ ascii: {
964
+ status: ["|", "/", "-", "\\"],
965
+ activity: ["-", "\\", "|", "/"],
966
+ },
967
+ };
968
+
969
+ /**
970
+ * Shape accepted by `themeJson.symbols.spinnerFrames`. A flat array applies to
971
+ * both spinner types; an object lets a theme override `status` and/or
972
+ * `activity` independently. Anything not specified falls back to the symbol
973
+ * preset's default frames.
974
+ */
975
+ export type SpinnerFramesOverride = string[] | { status?: string[]; activity?: string[] };
976
+
977
+ export function normalizeSpinnerFramesOverride(
978
+ value: SpinnerFramesOverride | undefined,
979
+ ): Partial<Record<SpinnerType, string[]>> {
980
+ if (value === undefined) return {};
981
+ if (Array.isArray(value)) return { status: value, activity: value };
982
+ const result: Partial<Record<SpinnerType, string[]>> = {};
983
+ if (value.status) result.status = value.status;
984
+ if (value.activity) result.activity = value.activity;
985
+ return result;
986
+ }
987
+
988
+ /**
989
+ * Get available symbol presets.
990
+ */
991
+ export function getAvailableSymbolPresets(): SymbolPreset[] {
992
+ return ["unicode", "nerd", "ascii"];
993
+ }
994
+
995
+ /**
996
+ * Check if a string is a valid symbol preset.
997
+ */
998
+ export function isValidSymbolPreset(preset: string): preset is SymbolPreset {
999
+ return preset === "unicode" || preset === "nerd" || preset === "ascii";
1000
+ }