@ashx-j/lunr 0.2.12 → 0.2.14

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 (225) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/README.md +6 -3
  3. package/dist/builtin-extensions/ashxj-tui.d.ts +16 -1
  4. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-tui.js +44 -20
  6. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  7. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +2 -0
  8. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  9. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +27 -22
  10. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  11. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  12. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +5 -2
  13. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  14. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +12 -1
  16. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts +1 -0
  18. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js +3 -2
  20. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js +1 -0
  23. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  25. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +3 -0
  26. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  27. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js +3 -3
  29. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +2 -2
  32. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +3 -0
  35. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  37. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +7 -1
  38. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  40. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +2 -0
  41. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  42. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +1 -0
  43. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  44. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +19 -3
  45. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  46. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +10 -1
  47. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +19 -0
  49. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
  51. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  53. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +2 -1
  54. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +17 -0
  56. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +3 -1
  58. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +14 -3
  60. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
  61. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +14 -0
  62. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  63. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
  65. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +2 -2
  66. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  68. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +12 -10
  69. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  70. package/dist/catalog/models.json +1 -1
  71. package/dist/catalog/providers/amazon-bedrock.json +1 -1
  72. package/dist/catalog/providers/anthropic.json +1 -1
  73. package/dist/catalog/providers/azure-openai-responses.json +1 -1
  74. package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
  75. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  76. package/dist/catalog/providers/fireworks.json +1 -1
  77. package/dist/catalog/providers/github-copilot.json +1 -1
  78. package/dist/catalog/providers/google-vertex.json +1 -1
  79. package/dist/catalog/providers/google.json +1 -1
  80. package/dist/catalog/providers/groq.json +1 -1
  81. package/dist/catalog/providers/huggingface.json +1 -1
  82. package/dist/catalog/providers/nvidia.json +1 -1
  83. package/dist/catalog/providers/openai-codex.json +1 -1
  84. package/dist/catalog/providers/openai.json +1 -1
  85. package/dist/catalog/providers/opencode-go.json +1 -1
  86. package/dist/catalog/providers/opencode.json +1 -1
  87. package/dist/catalog/providers/openrouter.json +1 -1
  88. package/dist/catalog/providers/together.json +1 -1
  89. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  90. package/dist/catalog/publication.json +131 -3
  91. package/dist/cli/list-models.d.ts.map +1 -1
  92. package/dist/cli/list-models.js +1 -0
  93. package/dist/cli/list-models.js.map +1 -1
  94. package/dist/cli.d.ts.map +1 -1
  95. package/dist/cli.js +52 -27
  96. package/dist/cli.js.map +1 -1
  97. package/dist/core/catalog-cache-scope.d.ts +3 -0
  98. package/dist/core/catalog-cache-scope.d.ts.map +1 -0
  99. package/dist/core/catalog-cache-scope.js +12 -0
  100. package/dist/core/catalog-cache-scope.js.map +1 -0
  101. package/dist/core/catalog-merge.d.ts +2 -0
  102. package/dist/core/catalog-merge.d.ts.map +1 -1
  103. package/dist/core/catalog-merge.js +29 -2
  104. package/dist/core/catalog-merge.js.map +1 -1
  105. package/dist/core/catalog-refresh-polling.d.ts +8 -0
  106. package/dist/core/catalog-refresh-polling.d.ts.map +1 -0
  107. package/dist/core/catalog-refresh-polling.js +30 -0
  108. package/dist/core/catalog-refresh-polling.js.map +1 -0
  109. package/dist/core/codex-catalog.d.ts +3 -0
  110. package/dist/core/codex-catalog.d.ts.map +1 -0
  111. package/dist/core/codex-catalog.js +15 -0
  112. package/dist/core/codex-catalog.js.map +1 -0
  113. package/dist/core/context-breakdown.d.ts +3 -1
  114. package/dist/core/context-breakdown.d.ts.map +1 -1
  115. package/dist/core/context-breakdown.js +5 -2
  116. package/dist/core/context-breakdown.js.map +1 -1
  117. package/dist/core/customize.d.ts +2 -4
  118. package/dist/core/customize.d.ts.map +1 -1
  119. package/dist/core/customize.js +2 -8
  120. package/dist/core/customize.js.map +1 -1
  121. package/dist/core/footer-data-provider.d.ts +3 -4
  122. package/dist/core/footer-data-provider.d.ts.map +1 -1
  123. package/dist/core/footer-data-provider.js +54 -82
  124. package/dist/core/footer-data-provider.js.map +1 -1
  125. package/dist/core/live-catalog.d.ts +5 -2
  126. package/dist/core/live-catalog.d.ts.map +1 -1
  127. package/dist/core/live-catalog.js +108 -27
  128. package/dist/core/live-catalog.js.map +1 -1
  129. package/dist/core/model-runtime.d.ts +8 -0
  130. package/dist/core/model-runtime.d.ts.map +1 -1
  131. package/dist/core/model-runtime.js +64 -12
  132. package/dist/core/model-runtime.js.map +1 -1
  133. package/dist/core/official-catalog.d.ts +4 -0
  134. package/dist/core/official-catalog.d.ts.map +1 -1
  135. package/dist/core/official-catalog.js +86 -21
  136. package/dist/core/official-catalog.js.map +1 -1
  137. package/dist/core/settings-manager.d.ts +7 -6
  138. package/dist/core/settings-manager.d.ts.map +1 -1
  139. package/dist/core/settings-manager.js +13 -17
  140. package/dist/core/settings-manager.js.map +1 -1
  141. package/dist/core/slash-commands.d.ts.map +1 -1
  142. package/dist/core/slash-commands.js +1 -0
  143. package/dist/core/slash-commands.js.map +1 -1
  144. package/dist/index.d.ts +1 -1
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js.map +1 -1
  147. package/dist/main.d.ts +2 -0
  148. package/dist/main.d.ts.map +1 -1
  149. package/dist/main.js +106 -50
  150. package/dist/main.js.map +1 -1
  151. package/dist/migrations.d.ts +2 -0
  152. package/dist/migrations.d.ts.map +1 -1
  153. package/dist/migrations.js +14 -4
  154. package/dist/migrations.js.map +1 -1
  155. package/dist/modes/interactive/components/assistant-message.d.ts +1 -3
  156. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  157. package/dist/modes/interactive/components/assistant-message.js +4 -32
  158. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  159. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  160. package/dist/modes/interactive/components/custom-editor.js +2 -1
  161. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  162. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  163. package/dist/modes/interactive/components/model-selector.js +4 -1
  164. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  165. package/dist/modes/interactive/components/plan-message.d.ts +1 -3
  166. package/dist/modes/interactive/components/plan-message.d.ts.map +1 -1
  167. package/dist/modes/interactive/components/plan-message.js +1 -16
  168. package/dist/modes/interactive/components/plan-message.js.map +1 -1
  169. package/dist/modes/interactive/components/settings-selector.d.ts +3 -5
  170. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  171. package/dist/modes/interactive/components/settings-selector.js +113 -117
  172. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  173. package/dist/modes/interactive/components/user-message.d.ts +1 -3
  174. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/user-message.js +2 -19
  176. package/dist/modes/interactive/components/user-message.js.map +1 -1
  177. package/dist/modes/interactive/interactive-mode.d.ts +12 -1
  178. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  179. package/dist/modes/interactive/interactive-mode.js +153 -130
  180. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  181. package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
  182. package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
  183. package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
  184. package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
  185. package/dist/modes/interactive/theme/moon.json +0 -1
  186. package/dist/modes/interactive/theme/theme-schema.json +3 -3
  187. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  188. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  189. package/dist/modes/interactive/theme/theme.js +95 -90
  190. package/dist/modes/interactive/theme/theme.js.map +1 -1
  191. package/dist/startup/interactive-view.d.ts +55 -0
  192. package/dist/startup/interactive-view.d.ts.map +1 -0
  193. package/dist/startup/interactive-view.js +332 -0
  194. package/dist/startup/interactive-view.js.map +1 -0
  195. package/dist/startup/launch-routing.d.ts +8 -0
  196. package/dist/startup/launch-routing.d.ts.map +1 -0
  197. package/dist/startup/launch-routing.js +29 -0
  198. package/dist/startup/launch-routing.js.map +1 -0
  199. package/dist/startup/startup-milestones.d.ts +4 -0
  200. package/dist/startup/startup-milestones.d.ts.map +1 -0
  201. package/dist/startup/startup-milestones.js +14 -0
  202. package/dist/startup/startup-milestones.js.map +1 -0
  203. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  204. package/dist/utils/syntax-highlight.js +10 -4
  205. package/dist/utils/syntax-highlight.js.map +1 -1
  206. package/docs/features.md +2 -2
  207. package/docs/interactive-startup.md +58 -0
  208. package/docs/keybindings.md +1 -1
  209. package/docs/model-catalog.md +29 -0
  210. package/docs/quickstart.md +1 -1
  211. package/docs/settings.md +2 -3
  212. package/docs/skills.md +10 -0
  213. package/docs/terminal-setup.md +2 -2
  214. package/docs/usage.md +2 -1
  215. package/docs/windows.md +1 -1
  216. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  217. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  218. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  219. package/examples/extensions/gondolin/package-lock.json +2 -2
  220. package/examples/extensions/gondolin/package.json +1 -1
  221. package/examples/extensions/sandbox/package-lock.json +2 -2
  222. package/examples/extensions/sandbox/package.json +1 -1
  223. package/examples/extensions/with-deps/package-lock.json +2 -2
  224. package/examples/extensions/with-deps/package.json +1 -1
  225. package/package.json +16 -16
@@ -2,6 +2,7 @@ import { Container, getCapabilities, getKeybindings, Input, SelectList, Settings
2
2
  import { getCustomizeBridge } from "../../../core/customize.js";
3
3
  import { formatHttpIdleTimeoutMs, HTTP_IDLE_TIMEOUT_CHOICES } from "../../../core/http-dispatcher.js";
4
4
  import { MEMORY_CHAR_CAP_DEFAULT, MEMORY_CHAR_CAP_MAX, MEMORY_CHAR_CAP_MIN } from "../../../core/memory-cap.js";
5
+ import { SKILL_TAG_CHARACTERS, } from "../../../core/settings-manager.js";
5
6
  import { getSelectListTheme, getSettingsListTheme, parseAutoThemeSetting, theme, } from "../theme/theme.js";
6
7
  import { DynamicBorder } from "./dynamic-border.js";
7
8
  import { keyDisplayText } from "./keybinding-hints.js";
@@ -28,17 +29,17 @@ const MODEL_TIER_ROWS = [
28
29
  {
29
30
  tier: "light",
30
31
  label: "Light tier model",
31
- description: "Cheap/fast model for simple subagent tasks (lookups, formatting)",
32
+ description: "Fast, low-cost model for simple subagent tasks",
32
33
  },
33
34
  {
34
35
  tier: "standard",
35
36
  label: "Standard tier model",
36
- description: "Mid-tier model for typical coding subagent tasks",
37
+ description: "Balanced model for everyday coding tasks",
37
38
  },
38
39
  {
39
40
  tier: "heavy",
40
41
  label: "Heavy tier model",
41
- description: "Strongest model for deep reasoning and complex debugging subagents",
42
+ description: "Strong model for complex reasoning and debugging",
42
43
  },
43
44
  ];
44
45
  /**
@@ -64,7 +65,7 @@ class ModelTiersSubmenu extends Container {
64
65
  {
65
66
  id: "enabled",
66
67
  label: "Enable model tiers",
67
- description: "Route subagents to per-tier models. An explicit model choice overrides the tier; tiers without a model inherit the parent model.",
68
+ description: "Route subagent work by model tier",
68
69
  currentValue: this.state.enabled ? "on" : "off",
69
70
  values: ["on", "off"],
70
71
  },
@@ -83,11 +84,15 @@ class ModelTiersSubmenu extends Container {
83
84
  {
84
85
  id: `${tier}-thinking`,
85
86
  label: `${row.label.replace(" model", "")} thinking`,
86
- description: "Reasoning depth for this tier. Inherit uses the parent session level.",
87
+ description: "Reasoning level for this tier",
87
88
  currentValue: this.state[tKey] ?? "inherit",
88
89
  disabled: () => !this.state.enabled,
89
- submenu: (_currentValue, done) => new SelectSubmenu(`${row.label} thinking`, "Unset inherits the parent session thinking level.", [
90
- { value: "inherit", label: "inherit", description: "Use the parent session thinking level" },
90
+ submenu: (_currentValue, done) => new SelectSubmenu(`${row.label} thinking`, "Inherit uses the parent session's reasoning level", [
91
+ {
92
+ value: "inherit",
93
+ label: "inherit",
94
+ description: "Use the parent session's reasoning level",
95
+ },
91
96
  ...callbacks.getTierThinkingLevels(tier).map((level) => ({
92
97
  value: level,
93
98
  label: level,
@@ -134,7 +139,7 @@ class MemoryCharCapSubmenu extends Container {
134
139
  super();
135
140
  this.addChild(new Text(theme.bold(theme.fg("accent", "Memory Character Cap")), 0, 0));
136
141
  this.addChild(new Spacer(1));
137
- this.addChild(new Text(theme.fg("muted", `Max characters in the memory file (${MEMORY_CHAR_CAP_MIN}-${MEMORY_CHAR_CAP_MAX}, default ${MEMORY_CHAR_CAP_DEFAULT}).`), 0, 0));
142
+ this.addChild(new Text(theme.fg("muted", `Maximum agent memory size (${MEMORY_CHAR_CAP_MIN} to ${MEMORY_CHAR_CAP_MAX} characters, default ${MEMORY_CHAR_CAP_DEFAULT})`), 0, 0));
138
143
  this.addChild(new Spacer(1));
139
144
  this.input = new Input();
140
145
  this.input.setValue(currentValue);
@@ -166,99 +171,79 @@ class CustomizeSubmenu extends Container {
166
171
  // one /settings session reflects toggles made earlier in that session.
167
172
  const bridge = getCustomizeBridge();
168
173
  const items = [
169
- {
170
- id: "gutter-rail",
171
- label: "Gutter rail",
172
- description: "Render a thin left │ rail spanning each turn, closing with ╰.",
173
- currentValue: (bridge?.getGutterRail() ?? true) ? "on" : "off",
174
- values: ["on", "off"],
175
- },
176
- {
177
- id: "prompt-symbol",
178
- label: "Prompt symbol",
179
- description: "Show the ☾ › prompt glyph on the editor's first line.",
180
- currentValue: (bridge?.getPromptSymbol() ?? true) ? "on" : "off",
181
- values: ["on", "off"],
182
- },
183
174
  {
184
175
  id: "footer-mcp",
185
- label: "Footer: MCP status",
186
- description: "Show the MCP server status segment in the footer stats line.",
176
+ label: "MCP status",
177
+ description: "MCP server status",
187
178
  currentValue: (bridge?.getFooterMcp() ?? true) ? "on" : "off",
188
179
  values: ["on", "off"],
189
180
  },
190
181
  {
191
182
  id: "footer-lsp",
192
- label: "Footer: LSP status",
193
- description: "Show the LSP status segment in the footer stats line.",
183
+ label: "LSP status",
184
+ description: "Language server status",
194
185
  currentValue: (bridge?.getFooterLsp() ?? false) ? "on" : "off",
195
186
  values: ["on", "off"],
196
187
  },
197
188
  {
198
189
  id: "footer-context",
199
- label: "Footer: context meter",
200
- description: "Show the context-usage pct/window segment in the footer stats line.",
190
+ label: "Context meter",
191
+ description: "Context usage",
201
192
  currentValue: (bridge?.getFooterContext() ?? true) ? "on" : "off",
202
193
  values: ["on", "off"],
203
194
  },
204
195
  {
205
196
  id: "footer-tokens",
206
- label: "Footer: token counter",
207
- description: "Show the ↑in ↓out token totals segment in the footer stats line.",
197
+ label: "Token counter",
198
+ description: "Input and output token counts",
208
199
  currentValue: (bridge?.getFooterTokens() ?? true) ? "on" : "off",
209
200
  values: ["on", "off"],
210
201
  },
211
202
  {
212
203
  id: "footer-cache-hit-rate",
213
- label: "Footer: cache hit rate",
214
- description: "Show the latest prompt cache-hit rate when cache usage is reported.",
204
+ label: "Cache hit rate",
205
+ description: "Latest prompt cache hit rate",
215
206
  currentValue: (bridge?.getFooterCacheHitRate() ?? true) ? "on" : "off",
216
207
  values: ["on", "off"],
217
208
  },
218
209
  {
219
210
  id: "footer-tps",
220
- label: "Footer: TPS counter",
221
- description: "Show the ✓ 174.0 t/s · tokens-in-time segment in the footer stats line.",
211
+ label: "TPS counter",
212
+ description: "Token generation speed",
222
213
  currentValue: (bridge?.getFooterTps() ?? true) ? "on" : "off",
223
214
  values: ["on", "off"],
224
215
  },
225
216
  {
226
217
  id: "footer-statuses",
227
- label: "Footer: feature statuses",
228
- description: "Show the plan/goal/swarm status segments in the footer stats line.",
218
+ label: "Feature statuses",
219
+ description: "Active plan, goal, and swarm status",
229
220
  currentValue: (bridge?.getFooterStatuses() ?? true) ? "on" : "off",
230
221
  values: ["on", "off"],
231
222
  },
232
223
  {
233
224
  id: "footer-git",
234
- label: "Footer: git branch",
235
- description: "Show the current git branch and added/removed line counts in the footer stats line.",
225
+ label: "Git branch",
226
+ description: "Git branch and line changes",
236
227
  currentValue: (bridge?.getFooterGit() ?? true) ? "on" : "off",
237
228
  values: ["on", "off"],
238
229
  },
239
230
  {
240
231
  id: "footer-plan",
241
- label: "Footer: plan usage",
242
- description: "Show the live subscription usage percent when the current model is on a plan.",
232
+ label: "Plan usage",
233
+ description: "Subscription usage percentage",
243
234
  currentValue: (bridge?.getFooterPlan() ?? true) ? "on" : "off",
244
235
  values: ["on", "off"],
245
236
  },
246
237
  {
247
238
  id: "footer-plan-bar",
248
- label: "Footer: plan bar",
249
- description: "Show the filled █░ bar next to the plan percent. Off keeps the percent only.",
239
+ label: "Plan bar",
240
+ description: "Bar beside the subscription usage percentage",
250
241
  currentValue: (bridge?.getFooterPlanBar() ?? true) ? "on" : "off",
251
242
  values: ["on", "off"],
252
243
  },
253
244
  ];
254
245
  this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
255
246
  switch (id) {
256
- case "gutter-rail":
257
- callbacks.onGutterRailChange(newValue === "on");
258
- break;
259
- case "prompt-symbol":
260
- callbacks.onPromptSymbolChange(newValue === "on");
261
- break;
262
247
  case "footer-mcp":
263
248
  callbacks.onFooterMcpChange(newValue === "on");
264
249
  break;
@@ -308,8 +293,7 @@ class RollbackSubmenu extends Container {
308
293
  {
309
294
  id: "rollback-enabled",
310
295
  label: "Rollback enabled",
311
- description: "Copy files before edits so /rollback can restore them. Uses extra disk + processing." +
312
- (sessionForceEnabled ? " (forced on by auto mode)" : ""),
296
+ description: `Save file snapshots for /rollback${sessionForceEnabled ? ". Always on in Auto mode" : ""}`,
313
297
  currentValue: this.enabled ? "on" : "off",
314
298
  values: ["on", "off"],
315
299
  disabled: () => sessionForceEnabled,
@@ -317,7 +301,7 @@ class RollbackSubmenu extends Container {
317
301
  {
318
302
  id: "rollback-turns",
319
303
  label: "Rollback turns",
320
- description: `How many turns of snapshots to retain (1-20, default 2).`,
304
+ description: "Number of turns kept for rollback",
321
305
  currentValue: String(config.rollbackTurns),
322
306
  disabled: () => !this.enabled,
323
307
  submenu: (currentValue, submenuDone) => new RollbackTurnsSubmenu(currentValue, submenuDone),
@@ -325,24 +309,24 @@ class RollbackSubmenu extends Container {
325
309
  {
326
310
  id: "rollback-capture",
327
311
  label: "Capture mode",
328
- description: "How snapshots are taken: copies = restore edited files + delete tool-created files, hybrid = also delete files created outside tools (tree scope), shadow-git = hidden git repo (needs git).",
312
+ description: "How rollback snapshots are stored",
329
313
  currentValue: config.rollbackCapture,
330
314
  disabled: () => !this.enabled,
331
- submenu: (currentValue, submenuDone) => new SelectSubmenu("Rollback Capture Mode", "How file snapshots are captured before edits.", [
315
+ submenu: (currentValue, submenuDone) => new SelectSubmenu("Rollback Capture Mode", "Snapshot storage method", [
332
316
  {
333
317
  value: "copies",
334
318
  label: "copies",
335
- description: "fast; restores edits, deletes tool-created files",
319
+ description: "File copies for tool edits and created files",
336
320
  },
337
321
  {
338
322
  value: "hybrid",
339
323
  label: "hybrid",
340
- description: "also deletes files created outside tools (tree scope)",
324
+ description: "Track files created outside tools with tree scope",
341
325
  },
342
326
  {
343
327
  value: "shadow-git",
344
328
  label: "shadow-git",
345
- description: "needs git, hidden repo — deferred, falls back to copies",
329
+ description: "Reserved mode; currently falls back to copies",
346
330
  },
347
331
  ], currentValue, (value) => {
348
332
  callbacks.onRollbackCaptureChange(value);
@@ -352,15 +336,15 @@ class RollbackSubmenu extends Container {
352
336
  {
353
337
  id: "rollback-scope",
354
338
  label: "Rollback scope",
355
- description: "tools = only edit/write changes; tree = also catches bash side-effects via git status (slower on large repos).",
339
+ description: "Which file changes rollback tracks",
356
340
  currentValue: config.rollbackScope,
357
341
  disabled: () => !this.enabled,
358
- submenu: (currentValue, submenuDone) => new SelectSubmenu("Rollback Scope", "What file changes to snapshot.", [
359
- { value: "tools", label: "tools", description: "only edit/write tool changes" },
342
+ submenu: (currentValue, submenuDone) => new SelectSubmenu("Rollback Scope", "File changes included in snapshots", [
343
+ { value: "tools", label: "tools", description: "Changes made by edit and write tools" },
360
344
  {
361
345
  value: "tree",
362
346
  label: "tree",
363
- description: "also catches bash side-effects; slower on large repos",
347
+ description: "Tool and shell changes across the repository",
364
348
  },
365
349
  ], currentValue, (value) => {
366
350
  callbacks.onRollbackScopeChange(value);
@@ -392,7 +376,7 @@ class RollbackTurnsSubmenu extends Container {
392
376
  super();
393
377
  this.addChild(new Text(theme.bold(theme.fg("accent", "Rollback Turns")), 0, 0));
394
378
  this.addChild(new Spacer(1));
395
- this.addChild(new Text(theme.fg("muted", "How many turns of snapshots to retain (1-20, default 2)."), 0, 0));
379
+ this.addChild(new Text(theme.fg("muted", "Number of turns kept for rollback (1 to 20, default 2)"), 0, 0));
396
380
  this.addChild(new Spacer(1));
397
381
  this.input = new Input();
398
382
  this.input.setValue(currentValue);
@@ -463,8 +447,8 @@ class SubscriptionActionSubmenu extends Container {
463
447
  id: "set-active",
464
448
  label: "Set active",
465
449
  description: subs.autoManage()
466
- ? "Manual switching is disabled while Auto-manage subscriptions is on."
467
- : "Use this key for new requests.",
450
+ ? "Turn off automatic key rotation to switch keys"
451
+ : "Use this key for new requests",
468
452
  currentValue: row.active ? "already active" : "activate",
469
453
  values: ["activate"],
470
454
  disabled: () => subs.autoManage() || row.active,
@@ -472,7 +456,7 @@ class SubscriptionActionSubmenu extends Container {
472
456
  {
473
457
  id: "rename",
474
458
  label: "Rename",
475
- description: "Display name for this key.",
459
+ description: "Change the key's display name",
476
460
  currentValue: row.name,
477
461
  submenu: (currentValue, renameDone) => new SubscriptionRenameSubmenu(currentValue, (name) => {
478
462
  if (name === undefined) {
@@ -491,7 +475,7 @@ class SubscriptionActionSubmenu extends Container {
491
475
  label: "Clear exhausted flag",
492
476
  description: row.exhaustedUntil !== undefined
493
477
  ? `Marked exhausted until ${formatSubscriptionExhaustedUntil(row.exhaustedUntil)}.`
494
- : "Only available for keys marked exhausted.",
478
+ : "Unavailable until the key is marked exhausted",
495
479
  currentValue: "clear",
496
480
  values: ["clear"],
497
481
  disabled: () => row.exhaustedUntil === undefined,
@@ -499,9 +483,9 @@ class SubscriptionActionSubmenu extends Container {
499
483
  {
500
484
  id: "remove",
501
485
  label: "Remove",
502
- description: "Delete this key. Removing the provider's last key logs it out completely.",
486
+ description: "Delete this stored key",
503
487
  currentValue: "remove…",
504
- submenu: (_currentValue, confirmDone) => new SelectSubmenu("Remove Subscription", `Remove "${row.name}" (${row.providerName})? Removing the provider's last key logs it out.`, [
488
+ submenu: (_currentValue, confirmDone) => new SelectSubmenu("Remove Subscription", `Delete "${row.name}" from ${row.providerName}? The last key also logs out the provider.`, [
505
489
  { value: "cancel", label: "Cancel" },
506
490
  { value: "remove", label: "Remove key" },
507
491
  ], "cancel", (value) => {
@@ -651,7 +635,7 @@ function singleModeThemeItems(availableThemes) {
651
635
  {
652
636
  value: AUTOMATIC_THEME_VALUE,
653
637
  label: "Automatic",
654
- description: "Use separate themes for light and dark terminal appearance",
638
+ description: "Follow the terminal's light or dark appearance",
655
639
  },
656
640
  ...themeItems(availableThemes),
657
641
  ];
@@ -713,7 +697,7 @@ class ThemeSubmenu extends Container {
713
697
  }
714
698
  showSingleMenu() {
715
699
  this.mode = "single";
716
- const menu = new SelectSubmenu("Theme", "Select a theme, or choose Automatic to follow terminal appearance.", singleModeThemeItems(this.availableThemes), this.singleTheme, (value) => {
700
+ const menu = new SelectSubmenu("Theme", "Choose a theme or follow terminal appearance", singleModeThemeItems(this.availableThemes), this.singleTheme, (value) => {
717
701
  if (value === AUTOMATIC_THEME_VALUE) {
718
702
  this.mode = "automatic";
719
703
  this.callbacks.onThemePreview?.(this.getThemeSetting());
@@ -732,16 +716,16 @@ class ThemeSubmenu extends Container {
732
716
  const content = new Container();
733
717
  content.addChild(new Text(theme.bold(theme.fg("accent", "Automatic Theme")), 0, 0));
734
718
  content.addChild(new Spacer(1));
735
- content.addChild(new Text(theme.fg("muted", "Choose themes for terminal light and dark appearance."), 0, 0));
719
+ content.addChild(new Text(theme.fg("muted", "Use different themes for light and dark terminals."), 0, 0));
736
720
  content.addChild(new Text(theme.fg("muted", "Light/dark detection requires terminal support."), 0, 0));
737
721
  content.addChild(new Spacer(1));
738
722
  const items = [
739
723
  {
740
724
  id: "light-theme",
741
725
  label: "Light theme",
742
- description: "Theme to use in automatic mode when the terminal is light",
726
+ description: "Theme for light terminals",
743
727
  currentValue: this.lightTheme,
744
- submenu: (currentValue, done) => this.createThemeSelect("Light Theme", "Select the theme to use for light terminal appearance", currentValue, done, (value) => {
728
+ submenu: (currentValue, done) => this.createThemeSelect("Light Theme", "Theme for light terminals", currentValue, done, (value) => {
745
729
  this.lightTheme = value;
746
730
  this.callbacks.onThemePreview?.(this.getThemeSetting());
747
731
  done(value);
@@ -750,9 +734,9 @@ class ThemeSubmenu extends Container {
750
734
  {
751
735
  id: "dark-theme",
752
736
  label: "Dark theme",
753
- description: "Theme to use in automatic mode when the terminal is dark",
737
+ description: "Theme for dark terminals",
754
738
  currentValue: this.darkTheme,
755
- submenu: (currentValue, done) => this.createThemeSelect("Dark Theme", "Select the theme to use for dark terminal appearance", currentValue, done, (value) => {
739
+ submenu: (currentValue, done) => this.createThemeSelect("Dark Theme", "Theme for dark terminals", currentValue, done, (value) => {
756
740
  this.darkTheme = value;
757
741
  this.callbacks.onThemePreview?.(this.getThemeSetting());
758
742
  done(value);
@@ -761,14 +745,14 @@ class ThemeSubmenu extends Container {
761
745
  {
762
746
  id: "apply",
763
747
  label: "Apply",
764
- description: "Save and go back",
748
+ description: "Save theme settings",
765
749
  currentValue: "save and go back",
766
750
  values: ["save and go back"],
767
751
  },
768
752
  {
769
753
  id: "single-mode",
770
754
  label: "Change mode",
771
- description: "Switch to one theme for light and dark",
755
+ description: "Use one theme for all terminal appearances",
772
756
  currentValue: "switch to single theme",
773
757
  values: ["switch to single theme"],
774
758
  },
@@ -826,42 +810,42 @@ export class SettingsSelectorComponent extends Container {
826
810
  {
827
811
  id: "autocompact",
828
812
  label: "Auto-compact",
829
- description: "Automatically compact context when it gets too large",
813
+ description: "Compact context before it reaches the model limit",
830
814
  currentValue: config.autoCompact ? "true" : "false",
831
815
  values: ["true", "false"],
832
816
  },
833
817
  {
834
818
  id: "steering-mode",
835
819
  label: "Steering mode",
836
- description: "Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.",
820
+ description: "How new messages interrupt a streaming response",
837
821
  currentValue: config.steeringMode,
838
822
  values: ["one-at-a-time", "all"],
839
823
  },
840
824
  {
841
825
  id: "follow-up-mode",
842
826
  label: "Follow-up mode",
843
- description: `${followUpKey} queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.`,
827
+ description: `How ${followUpKey} messages run after the current response`,
844
828
  currentValue: config.followUpMode,
845
829
  values: ["one-at-a-time", "all"],
846
830
  },
847
831
  {
848
832
  id: "transport",
849
833
  label: "Transport",
850
- description: "Preferred transport for providers that support multiple transports",
834
+ description: "Connection method for supported providers",
851
835
  currentValue: config.transport,
852
836
  values: ["sse", "websocket", "websocket-cached", "auto"],
853
837
  },
854
838
  {
855
839
  id: "http-idle-timeout",
856
840
  label: "HTTP idle timeout",
857
- description: "Maximum idle gap while waiting for HTTP headers or body chunks. Disable for local models that pause longer than five minutes.",
841
+ description: "Time before an inactive HTTP request times out",
858
842
  currentValue: formatHttpIdleTimeoutMs(config.httpIdleTimeoutMs),
859
843
  values: HTTP_IDLE_TIMEOUT_CHOICES.map((choice) => choice.label),
860
844
  },
861
845
  {
862
846
  id: "hide-thinking",
863
847
  label: "Hide thinking",
864
- description: "Hide thinking blocks in assistant responses",
848
+ description: "Thinking block visibility",
865
849
  currentValue: config.hideThinkingBlock ? "true" : "false",
866
850
  values: ["true", "false"],
867
851
  },
@@ -870,7 +854,7 @@ export class SettingsSelectorComponent extends Container {
870
854
  // "✻ Thought for Xs" + first sentence. Disabled when thinking is hidden.
871
855
  id: "thinking-collapse",
872
856
  label: "Collapse thinking",
873
- description: "Collapse completed thinking blocks to a short summary",
857
+ description: "Short summaries for completed thinking",
874
858
  currentValue: config.thinkingCollapse ? "true" : "false",
875
859
  values: ["true", "false"],
876
860
  disabled: () => config.hideThinkingBlock,
@@ -878,7 +862,7 @@ export class SettingsSelectorComponent extends Container {
878
862
  {
879
863
  id: "cache-miss-notices",
880
864
  label: "Cache miss notices",
881
- description: "Show transcript notices for significant prompt-cache misses",
865
+ description: "Prompt cache miss notices in the transcript",
882
866
  currentValue: config.showCacheMissNotices ? "true" : "false",
883
867
  values: ["true", "false"],
884
868
  },
@@ -887,35 +871,35 @@ export class SettingsSelectorComponent extends Container {
887
871
  // applies; the row displays "short" as the implicit default.
888
872
  id: "cache-retention",
889
873
  label: "Cache retention",
890
- description: "Prompt-cache TTL: short (5 min), long (1h where supported), or none",
874
+ description: "Prompt cache lifetime",
891
875
  currentValue: config.cacheRetention,
892
876
  values: ["short", "long", "none"],
893
877
  },
894
878
  {
895
879
  id: "quiet-startup",
896
880
  label: "Quiet startup",
897
- description: "Disable verbose printing at startup",
881
+ description: "Startup log visibility",
898
882
  currentValue: config.quietStartup ? "true" : "false",
899
883
  values: ["true", "false"],
900
884
  },
901
885
  {
902
886
  id: "smooth-streaming",
903
887
  label: "Smooth streaming",
904
- description: "Reveal responses grapheme by grapheme (~30 FPS typewriter)",
888
+ description: "Typewriter-style response streaming",
905
889
  currentValue: config.smoothStreaming ? "true" : "false",
906
890
  values: ["true", "false"],
907
891
  },
908
892
  {
909
893
  id: "agent-memory",
910
894
  label: "Agent memory",
911
- description: "Inject durable facts and allow the model to add, inspect, and remove them.",
895
+ description: "Durable facts the agent can manage",
912
896
  currentValue: config.memoryEnabled ? "on" : "off",
913
897
  values: ["on", "off"],
914
898
  },
915
899
  {
916
900
  id: "memory-char-cap",
917
901
  label: "Memory character cap",
918
- description: `Max characters in the durable-facts memory file (${MEMORY_CHAR_CAP_MIN}-${MEMORY_CHAR_CAP_MAX}, default ${MEMORY_CHAR_CAP_DEFAULT}). Also settable via /memory-char-cap.`,
902
+ description: "Maximum agent memory size",
919
903
  currentValue: String(config.memoryCharCap),
920
904
  submenu: (currentValue, submenuDone) => new MemoryCharCapSubmenu(currentValue, submenuDone),
921
905
  },
@@ -923,52 +907,52 @@ export class SettingsSelectorComponent extends Container {
923
907
  id: "search-curator",
924
908
  label: "Search curator",
925
909
  description: curatorAvailable
926
- ? "pi-web-access search curator: off = raw results, on = browser curator with summary draft, auto-summary = summary without the curator. Also settable via /curator."
927
- : "pi-web-access is not loaded; the search curator is unavailable.",
910
+ ? "Web search review and summary mode"
911
+ : "Unavailable because web access is not loaded",
928
912
  currentValue: config.searchCurator ?? "unavailable",
929
913
  values: curatorAvailable ? SEARCH_CURATOR_VALUES : undefined,
930
914
  },
931
915
  {
932
916
  id: "session-retention-days",
933
917
  label: "Session retention",
934
- description: "Auto-delete session files older than N days at launch (0 = keep forever)",
918
+ description: "How long session files are kept",
935
919
  currentValue: String(config.sessionRetentionDays),
936
920
  values: ["0", "7", "14", "30", "60", "90", "365"],
937
921
  },
938
922
  {
939
923
  id: "default-project-trust",
940
924
  label: "Default project trust",
941
- description: "Fallback behavior when no extension or saved trust decision decides project trust",
925
+ description: "Trust choice when a project has no saved decision",
942
926
  currentValue: DEFAULT_PROJECT_TRUST_LABELS[config.defaultProjectTrust],
943
927
  values: Object.values(DEFAULT_PROJECT_TRUST_LABELS),
944
928
  },
945
929
  {
946
930
  id: "default-permission-mode",
947
931
  label: "Default permission mode",
948
- description: "Permission mode new sessions start with: manual = approve every action, yolo = auto-approve tools, plan = read-only, auto = fully autonomous. Change per-session with /mode or Shift+Tab.",
932
+ description: "Starting permission mode for new sessions",
949
933
  currentValue: config.defaultPermissionMode,
950
934
  values: ["manual", "yolo", "plan", "auto"],
951
935
  },
952
936
  {
953
937
  id: "double-escape-action",
954
938
  label: "Double-escape action",
955
- description: "Action when pressing Escape twice with empty editor",
939
+ description: "Action for double Escape in an empty editor",
956
940
  currentValue: config.doubleEscapeAction,
957
941
  values: ["tree", "fork", "none"],
958
942
  },
959
943
  {
960
944
  id: "tree-filter-mode",
961
945
  label: "Tree filter mode",
962
- description: "Default filter when opening /tree",
946
+ description: "Default /tree filter",
963
947
  currentValue: config.treeFilterMode,
964
948
  values: ["default", "no-tools", "user-only", "labeled-only", "all"],
965
949
  },
966
950
  {
967
951
  id: "thinking",
968
952
  label: "Thinking level",
969
- description: "Reasoning depth for thinking-capable models",
953
+ description: "Reasoning level for supported models",
970
954
  currentValue: config.thinkingLevel,
971
- submenu: (currentValue, done) => new SelectSubmenu("Thinking Level", "Select reasoning depth for thinking-capable models", config.availableThinkingLevels.map((level) => ({
955
+ submenu: (currentValue, done) => new SelectSubmenu("Thinking Level", "Reasoning level for supported models", config.availableThinkingLevels.map((level) => ({
972
956
  value: level,
973
957
  label: level,
974
958
  description: THINKING_DESCRIPTIONS[level],
@@ -980,21 +964,21 @@ export class SettingsSelectorComponent extends Container {
980
964
  {
981
965
  id: "theme",
982
966
  label: "Theme",
983
- description: "Color theme for the interface",
967
+ description: "Interface color theme",
984
968
  currentValue: config.currentTheme,
985
969
  submenu: (currentValue, done) => new ThemeSubmenu(currentValue, config.terminalTheme, config.availableThemes, callbacks, done),
986
970
  },
987
971
  {
988
972
  id: "model-tiers",
989
973
  label: "Model tiers",
990
- description: "Route subagents to light/standard/heavy tier models. An explicit model choice overrides the tier.",
974
+ description: "Subagent model routing",
991
975
  currentValue: config.modelTiers.enabled ? "on" : "off",
992
976
  submenu: (currentValue, done) => new ModelTiersSubmenu(currentValue, config.modelTiers, callbacks, done),
993
977
  },
994
978
  {
995
979
  id: "plan-usage-window",
996
980
  label: "Plan usage window",
997
- description: "Preferred subscription window for the footer bar. Missing 5h falls back to weekly.",
981
+ description: "Subscription usage period shown in the footer",
998
982
  currentValue: config.planUsageWindow,
999
983
  values: ["5h", "weekly"],
1000
984
  },
@@ -1002,7 +986,7 @@ export class SettingsSelectorComponent extends Container {
1002
986
  {
1003
987
  id: "customize",
1004
988
  label: "Customize",
1005
- description: "lunR TUI customizations: gutter rail, prompt symbol, footer segments",
989
+ description: "Interface and footer options",
1006
990
  currentValue: "configure",
1007
991
  submenu: (_currentValue, done) => new CustomizeSubmenu(config, callbacks, done),
1008
992
  },
@@ -1010,7 +994,7 @@ export class SettingsSelectorComponent extends Container {
1010
994
  {
1011
995
  id: "rollback",
1012
996
  label: "Rollback",
1013
- description: "Pre-edit file snapshots so /rollback can restore them. Capture mode, scope, retention.",
997
+ description: "Rollback behavior options",
1014
998
  currentValue: config.rollbackEnabled ? "on" : "off",
1015
999
  submenu: (currentValue, done) => new RollbackSubmenu(currentValue, config, callbacks, callbacks.isRollbackSessionForceEnabled(), done),
1016
1000
  },
@@ -1018,7 +1002,7 @@ export class SettingsSelectorComponent extends Container {
1018
1002
  {
1019
1003
  id: "auto-manage-subscriptions",
1020
1004
  label: "Auto-manage subscriptions",
1021
- description: "When on, lunr rotates API keys automatically on usage limits and the model selector won't offer manual subscription switching.",
1005
+ description: "Automatic API key rotation after usage limits",
1022
1006
  currentValue: config.autoManageSubscriptions ? "on" : "off",
1023
1007
  values: ["on", "off"],
1024
1008
  },
@@ -1029,7 +1013,7 @@ export class SettingsSelectorComponent extends Container {
1029
1013
  items.push({
1030
1014
  id: "subscriptions",
1031
1015
  label: "Subscriptions",
1032
- description: "Per-provider API key pools: set the active key, rename, clear exhaustion, remove.",
1016
+ description: "Saved API key management",
1033
1017
  currentValue: config.subscriptionCount === 0
1034
1018
  ? "none"
1035
1019
  : `${config.subscriptionCount} key${config.subscriptionCount === 1 ? "" : "s"}`,
@@ -1042,14 +1026,14 @@ export class SettingsSelectorComponent extends Container {
1042
1026
  items.splice(1, 0, {
1043
1027
  id: "show-images",
1044
1028
  label: "Show images",
1045
- description: "Render images inline in terminal",
1029
+ description: "Inline terminal image rendering",
1046
1030
  currentValue: config.showImages ? "true" : "false",
1047
1031
  values: ["true", "false"],
1048
1032
  });
1049
1033
  items.splice(2, 0, {
1050
1034
  id: "image-width-cells",
1051
1035
  label: "Image width",
1052
- description: "Preferred inline image width in terminal cells",
1036
+ description: "Inline image width in terminal cells",
1053
1037
  currentValue: String(config.imageWidthCells),
1054
1038
  values: ["60", "80", "120"],
1055
1039
  });
@@ -1058,7 +1042,7 @@ export class SettingsSelectorComponent extends Container {
1058
1042
  items.splice(supportsImages ? 3 : 1, 0, {
1059
1043
  id: "auto-resize-images",
1060
1044
  label: "Auto-resize images",
1061
- description: "Resize large images to 2000x2000 max for better model compatibility",
1045
+ description: "Limit images to 2000 x 2000 pixels",
1062
1046
  currentValue: config.autoResizeImages ? "true" : "false",
1063
1047
  values: ["true", "false"],
1064
1048
  });
@@ -1067,7 +1051,7 @@ export class SettingsSelectorComponent extends Container {
1067
1051
  items.splice(autoResizeIndex + 1, 0, {
1068
1052
  id: "block-images",
1069
1053
  label: "Block images",
1070
- description: "Prevent images from being sent to LLM providers",
1054
+ description: "Prevent images from reaching model providers",
1071
1055
  currentValue: config.blockImages ? "true" : "false",
1072
1056
  values: ["true", "false"],
1073
1057
  });
@@ -1076,16 +1060,25 @@ export class SettingsSelectorComponent extends Container {
1076
1060
  items.splice(blockImagesIndex + 1, 0, {
1077
1061
  id: "skill-commands",
1078
1062
  label: "Skill commands",
1079
- description: "Register skills as /skill:name commands",
1063
+ description: "Skills as /skill:name commands",
1080
1064
  currentValue: config.enableSkillCommands ? "true" : "false",
1081
1065
  values: ["true", "false"],
1082
1066
  });
1083
- // Hardware cursor toggle (insert after skill-commands)
1067
+ // Skill tag character (insert after skill-commands)
1084
1068
  const skillCommandsIndex = items.findIndex((item) => item.id === "skill-commands");
1085
1069
  items.splice(skillCommandsIndex + 1, 0, {
1070
+ id: "skill-tag-character",
1071
+ label: "Skill tag",
1072
+ description: "After a space, this character lists skills to tag in the message",
1073
+ currentValue: config.skillTagCharacter,
1074
+ values: [...SKILL_TAG_CHARACTERS],
1075
+ });
1076
+ // Hardware cursor toggle (insert after skill-tag-character)
1077
+ const skillTagIndex = items.findIndex((item) => item.id === "skill-tag-character");
1078
+ items.splice(skillTagIndex + 1, 0, {
1086
1079
  id: "show-hardware-cursor",
1087
1080
  label: "Show hardware cursor",
1088
- description: "Show the terminal cursor while still positioning it for IME support",
1081
+ description: "Terminal cursor for input method editors",
1089
1082
  currentValue: config.showHardwareCursor ? "true" : "false",
1090
1083
  values: ["true", "false"],
1091
1084
  });
@@ -1094,7 +1087,7 @@ export class SettingsSelectorComponent extends Container {
1094
1087
  items.splice(hardwareCursorIndex + 1, 0, {
1095
1088
  id: "editor-padding",
1096
1089
  label: "Editor padding",
1097
- description: "Horizontal padding for input editor (0-3)",
1090
+ description: "Horizontal editor padding",
1098
1091
  currentValue: String(config.editorPaddingX),
1099
1092
  values: ["0", "1", "2", "3"],
1100
1093
  });
@@ -1103,7 +1096,7 @@ export class SettingsSelectorComponent extends Container {
1103
1096
  items.splice(editorPaddingIndex + 1, 0, {
1104
1097
  id: "output-padding",
1105
1098
  label: "Output padding",
1106
- description: "Horizontal padding for user messages, assistant messages, and thinking",
1099
+ description: "Horizontal message padding",
1107
1100
  currentValue: String(config.outputPad),
1108
1101
  values: ["0", "1"],
1109
1102
  });
@@ -1112,7 +1105,7 @@ export class SettingsSelectorComponent extends Container {
1112
1105
  items.splice(outputPaddingIndex + 1, 0, {
1113
1106
  id: "autocomplete-max-visible",
1114
1107
  label: "Autocomplete max items",
1115
- description: "Max visible items in autocomplete dropdown (3-20)",
1108
+ description: "Visible autocomplete items",
1116
1109
  currentValue: String(config.autocompleteMaxVisible),
1117
1110
  values: ["3", "5", "7", "10", "15", "20"],
1118
1111
  });
@@ -1121,7 +1114,7 @@ export class SettingsSelectorComponent extends Container {
1121
1114
  items.splice(autocompleteIndex + 1, 0, {
1122
1115
  id: "clear-on-shrink",
1123
1116
  label: "Clear on shrink",
1124
- description: "Clear empty rows when content shrinks (may cause flicker)",
1117
+ description: "Clear leftover terminal rows when content shrinks",
1125
1118
  currentValue: config.clearOnShrink ? "true" : "false",
1126
1119
  values: ["true", "false"],
1127
1120
  });
@@ -1130,7 +1123,7 @@ export class SettingsSelectorComponent extends Container {
1130
1123
  items.splice(clearOnShrinkIndex + 1, 0, {
1131
1124
  id: "terminal-progress",
1132
1125
  label: "Terminal progress",
1133
- description: "Show OSC 9;4 progress indicators in the terminal tab bar",
1126
+ description: "Progress in supported terminal tabs",
1134
1127
  currentValue: config.showTerminalProgress ? "true" : "false",
1135
1128
  values: ["true", "false"],
1136
1129
  });
@@ -1156,6 +1149,9 @@ export class SettingsSelectorComponent extends Container {
1156
1149
  case "skill-commands":
1157
1150
  callbacks.onEnableSkillCommandsChange(newValue === "true");
1158
1151
  break;
1152
+ case "skill-tag-character":
1153
+ callbacks.onSkillTagCharacterChange(newValue);
1154
+ break;
1159
1155
  case "steering-mode":
1160
1156
  callbacks.onSteeringModeChange(newValue);
1161
1157
  break;