@ashx-j/lunr 0.2.8 → 0.2.10

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 (182) hide show
  1. package/dist/builtin-extensions/ashxj-spinners.d.ts +4 -0
  2. package/dist/builtin-extensions/ashxj-spinners.d.ts.map +1 -1
  3. package/dist/builtin-extensions/ashxj-spinners.js +14 -3
  4. package/dist/builtin-extensions/ashxj-spinners.js.map +1 -1
  5. package/dist/builtin-extensions/ashxj-tui.d.ts +4 -0
  6. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.js +49 -4
  8. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  9. package/dist/builtin-extensions/lunr-behavior.d.ts +2 -1
  10. package/dist/builtin-extensions/lunr-behavior.d.ts.map +1 -1
  11. package/dist/builtin-extensions/lunr-behavior.js +26 -14
  12. package/dist/builtin-extensions/lunr-behavior.js.map +1 -1
  13. package/dist/builtin-extensions/lunr-todos.d.ts +4 -7
  14. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  15. package/dist/builtin-extensions/lunr-todos.js +18 -10
  16. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +3 -3
  19. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +1 -1
  20. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +4 -4
  22. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  23. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +2 -2
  24. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  25. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +4 -5
  26. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  27. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +5 -1
  29. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +6 -18
  32. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +13 -5
  35. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +2 -2
  37. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +2 -2
  39. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  40. package/dist/builtin-extensions/pi-subagents/src/shared/lunr-child-context.d.ts +21 -0
  41. package/dist/builtin-extensions/pi-subagents/src/shared/lunr-child-context.d.ts.map +1 -0
  42. package/dist/builtin-extensions/pi-subagents/src/shared/lunr-child-context.js +22 -0
  43. package/dist/builtin-extensions/pi-subagents/src/shared/lunr-child-context.js.map +1 -0
  44. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +2 -2
  45. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-subagents/src/shared/types.js +2 -2
  47. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +2 -1
  50. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  51. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +10 -18
  53. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +4 -6
  55. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +26 -18
  57. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  58. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-web-access/index.js +3 -1
  60. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  61. package/dist/builtin-extensions/pi-web-access/render-search-error.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-web-access/render-search-error.js +1 -1
  63. package/dist/builtin-extensions/pi-web-access/render-search-error.js.map +1 -1
  64. package/dist/catalog/models.json +1 -1
  65. package/dist/catalog/providers/nvidia.json +1 -1
  66. package/dist/catalog/providers/opencode-go.json +1 -1
  67. package/dist/catalog/providers/opencode.json +1 -1
  68. package/dist/catalog/providers/openrouter.json +1 -1
  69. package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
  70. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  71. package/dist/catalog/providers/xai.json +1 -1
  72. package/dist/catalog/publication.json +2 -2
  73. package/dist/cli/update-cli.d.ts +16 -0
  74. package/dist/cli/update-cli.d.ts.map +1 -0
  75. package/dist/cli/update-cli.js +83 -0
  76. package/dist/cli/update-cli.js.map +1 -0
  77. package/dist/cli.d.ts.map +1 -1
  78. package/dist/cli.js +6 -0
  79. package/dist/cli.js.map +1 -1
  80. package/dist/core/agent-session.d.ts +2 -0
  81. package/dist/core/agent-session.d.ts.map +1 -1
  82. package/dist/core/agent-session.js +9 -1
  83. package/dist/core/agent-session.js.map +1 -1
  84. package/dist/core/behavior-preset.d.ts +60 -0
  85. package/dist/core/behavior-preset.d.ts.map +1 -0
  86. package/dist/core/behavior-preset.js +257 -0
  87. package/dist/core/behavior-preset.js.map +1 -0
  88. package/dist/core/customize.d.ts +4 -0
  89. package/dist/core/customize.d.ts.map +1 -1
  90. package/dist/core/customize.js +12 -0
  91. package/dist/core/customize.js.map +1 -1
  92. package/dist/core/footer-data-provider.d.ts +12 -1
  93. package/dist/core/footer-data-provider.d.ts.map +1 -1
  94. package/dist/core/footer-data-provider.js +70 -5
  95. package/dist/core/footer-data-provider.js.map +1 -1
  96. package/dist/core/keybindings.d.ts +2 -2
  97. package/dist/core/keybindings.d.ts.map +1 -1
  98. package/dist/core/keybindings.js +1 -1
  99. package/dist/core/keybindings.js.map +1 -1
  100. package/dist/core/model-tiers.d.ts +9 -0
  101. package/dist/core/model-tiers.d.ts.map +1 -1
  102. package/dist/core/model-tiers.js +16 -0
  103. package/dist/core/model-tiers.js.map +1 -1
  104. package/dist/core/settings-manager.d.ts +26 -0
  105. package/dist/core/settings-manager.d.ts.map +1 -1
  106. package/dist/core/settings-manager.js +74 -0
  107. package/dist/core/settings-manager.js.map +1 -1
  108. package/dist/core/tools/bash.d.ts.map +1 -1
  109. package/dist/core/tools/bash.js +3 -4
  110. package/dist/core/tools/bash.js.map +1 -1
  111. package/dist/core/tools/edit.d.ts.map +1 -1
  112. package/dist/core/tools/edit.js +9 -6
  113. package/dist/core/tools/edit.js.map +1 -1
  114. package/dist/core/tools/find.d.ts.map +1 -1
  115. package/dist/core/tools/find.js +2 -1
  116. package/dist/core/tools/find.js.map +1 -1
  117. package/dist/core/tools/grep.d.ts.map +1 -1
  118. package/dist/core/tools/grep.js +2 -1
  119. package/dist/core/tools/grep.js.map +1 -1
  120. package/dist/core/tools/ls.d.ts.map +1 -1
  121. package/dist/core/tools/ls.js +2 -1
  122. package/dist/core/tools/ls.js.map +1 -1
  123. package/dist/core/tools/read.d.ts.map +1 -1
  124. package/dist/core/tools/read.js +2 -1
  125. package/dist/core/tools/read.js.map +1 -1
  126. package/dist/core/tools/render-utils.d.ts +13 -3
  127. package/dist/core/tools/render-utils.d.ts.map +1 -1
  128. package/dist/core/tools/render-utils.js +10 -2
  129. package/dist/core/tools/render-utils.js.map +1 -1
  130. package/dist/core/tools/write.d.ts.map +1 -1
  131. package/dist/core/tools/write.js +5 -3
  132. package/dist/core/tools/write.js.map +1 -1
  133. package/dist/core/update-check.d.ts +32 -0
  134. package/dist/core/update-check.d.ts.map +1 -0
  135. package/dist/core/update-check.js +112 -0
  136. package/dist/core/update-check.js.map +1 -0
  137. package/dist/core/usage-service.d.ts +24 -1
  138. package/dist/core/usage-service.d.ts.map +1 -1
  139. package/dist/core/usage-service.js +91 -14
  140. package/dist/core/usage-service.js.map +1 -1
  141. package/dist/gateway/agent-bridge.d.ts +1 -0
  142. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  143. package/dist/gateway/agent-bridge.js +5 -1
  144. package/dist/gateway/agent-bridge.js.map +1 -1
  145. package/dist/gateway/cron.d.ts.map +1 -1
  146. package/dist/gateway/cron.js +5 -1
  147. package/dist/gateway/cron.js.map +1 -1
  148. package/dist/main.d.ts.map +1 -1
  149. package/dist/main.js +13 -1
  150. package/dist/main.js.map +1 -1
  151. package/dist/modes/interactive/components/assistant-message.d.ts +4 -0
  152. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  153. package/dist/modes/interactive/components/assistant-message.js +68 -10
  154. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  155. package/dist/modes/interactive/components/settings-selector.d.ts +15 -0
  156. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  157. package/dist/modes/interactive/components/settings-selector.js +168 -11
  158. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  159. package/dist/modes/interactive/components/thinking-tail.d.ts +1 -0
  160. package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
  161. package/dist/modes/interactive/components/thinking-tail.js +2 -6
  162. package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
  163. package/dist/modes/interactive/components/tool-execution.d.ts +7 -0
  164. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  165. package/dist/modes/interactive/components/tool-execution.js +84 -16
  166. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  167. package/dist/modes/interactive/interactive-mode.d.ts +19 -2
  168. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  169. package/dist/modes/interactive/interactive-mode.js +221 -37
  170. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  171. package/docs/keybindings.md +1 -1
  172. package/docs/terminal-setup.md +2 -2
  173. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  174. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  175. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  176. package/examples/extensions/gondolin/package-lock.json +2 -2
  177. package/examples/extensions/gondolin/package.json +1 -1
  178. package/examples/extensions/sandbox/package-lock.json +2 -2
  179. package/examples/extensions/sandbox/package.json +1 -1
  180. package/examples/extensions/with-deps/package-lock.json +2 -2
  181. package/examples/extensions/with-deps/package.json +1 -1
  182. package/package.json +4 -4
@@ -1,4 +1,5 @@
1
1
  import { Container, getCapabilities, getKeybindings, Input, SelectList, SettingsList, Spacer, Text, } from "@ashx-j/lunr-tui";
2
+ import { detectBehaviorPreset, readBehaviorFile } from "../../../core/behavior-preset.js";
2
3
  import { getCustomizeBridge } from "../../../core/customize.js";
3
4
  import { formatHttpIdleTimeoutMs, HTTP_IDLE_TIMEOUT_CHOICES } from "../../../core/http-dispatcher.js";
4
5
  import { MEMORY_CHAR_CAP_DEFAULT, MEMORY_CHAR_CAP_MAX, MEMORY_CHAR_CAP_MIN } from "../../../core/memory-cap.js";
@@ -55,7 +56,11 @@ class ModelTiersSubmenu extends Container {
55
56
  light: modelTiers.light,
56
57
  standard: modelTiers.standard,
57
58
  heavy: modelTiers.heavy,
59
+ lightThinking: modelTiers.lightThinking,
60
+ standardThinking: modelTiers.standardThinking,
61
+ heavyThinking: modelTiers.heavyThinking,
58
62
  };
63
+ const thinkingKey = (tier) => tier === "light" ? "lightThinking" : tier === "standard" ? "standardThinking" : "heavyThinking";
59
64
  const items = [
60
65
  {
61
66
  id: "enabled",
@@ -64,16 +69,37 @@ class ModelTiersSubmenu extends Container {
64
69
  currentValue: this.state.enabled ? "on" : "off",
65
70
  values: ["on", "off"],
66
71
  },
67
- ...MODEL_TIER_ROWS.map((row) => {
72
+ ...MODEL_TIER_ROWS.flatMap((row) => {
68
73
  const tier = row.tier;
69
- return {
70
- id: tier,
71
- label: row.label,
72
- description: row.description,
73
- currentValue: this.state[tier] ?? "not set",
74
- disabled: () => !this.state.enabled,
75
- submenu: (_currentValue, done) => callbacks.createModelTierPicker(tier, this.state[tier], done),
76
- };
74
+ const tKey = thinkingKey(tier);
75
+ return [
76
+ {
77
+ id: tier,
78
+ label: row.label,
79
+ description: row.description,
80
+ currentValue: this.state[tier] ?? "not set",
81
+ disabled: () => !this.state.enabled,
82
+ submenu: (_currentValue, done) => callbacks.createModelTierPicker(tier, this.state[tier], done),
83
+ },
84
+ {
85
+ id: `${tier}-thinking`,
86
+ label: `${row.label.replace(" model", "")} thinking`,
87
+ description: "Reasoning depth for this tier. Inherit uses the parent session level.",
88
+ currentValue: this.state[tKey] ?? "inherit",
89
+ disabled: () => !this.state.enabled,
90
+ submenu: (_currentValue, done) => new SelectSubmenu(`${row.label} thinking`, "Unset inherits the parent session thinking level.", [
91
+ { value: "inherit", label: "inherit", description: "Use the parent session thinking level" },
92
+ ...callbacks.getTierThinkingLevels(tier).map((level) => ({
93
+ value: level,
94
+ label: level,
95
+ description: THINKING_DESCRIPTIONS[level],
96
+ })),
97
+ ], this.state[tKey] ?? "inherit", (value) => {
98
+ callbacks.onModelTierThinkingChange(tier, value === "inherit" ? undefined : value);
99
+ done(value);
100
+ }, () => done()),
101
+ },
102
+ ];
77
103
  }),
78
104
  ];
79
105
  this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
@@ -82,6 +108,12 @@ class ModelTiersSubmenu extends Container {
82
108
  callbacks.onModelTiersEnabledChange(this.state.enabled);
83
109
  return;
84
110
  }
111
+ if (id.endsWith("-thinking")) {
112
+ const tier = id.slice(0, -"-thinking".length);
113
+ const tKey = thinkingKey(tier);
114
+ this.state[tKey] = newValue === "inherit" ? undefined : newValue;
115
+ return;
116
+ }
85
117
  const tier = id;
86
118
  this.state[tier] = newValue;
87
119
  callbacks.onModelTierModelChange(tier, newValue);
@@ -126,6 +158,71 @@ class MemoryCharCapSubmenu extends Container {
126
158
  }
127
159
  }
128
160
  const SEARCH_CURATOR_VALUES = ["off", "on", "auto-summary"];
161
+ const BEHAVIOR_PRESET_ITEMS = [
162
+ {
163
+ value: "default",
164
+ label: "default",
165
+ description: "Empty built-in. Selecting this writes a blank behavior.md.",
166
+ },
167
+ {
168
+ value: "humanizer",
169
+ label: "humanizer",
170
+ description: "Write like a person. Strip AI tells. Skips the character cap.",
171
+ },
172
+ {
173
+ value: "concise",
174
+ label: "concise",
175
+ description: "Fragments, tables, numbered next steps last. Skips the character cap.",
176
+ },
177
+ {
178
+ value: "custom",
179
+ label: "custom",
180
+ description: "Keep the current behavior.md. Edit the file or use the behavior tools.",
181
+ },
182
+ ];
183
+ /**
184
+ * Built-in vs custom behavior.md picker.
185
+ * Selecting a built-in while the file no longer matches a template asks before overwrite.
186
+ * Custom never writes. No in-app editor; the file is the source of truth.
187
+ */
188
+ class BehaviorPresetSubmenu extends Container {
189
+ inner;
190
+ constructor(currentValue, done) {
191
+ super();
192
+ this.inner = this.buildList(currentValue, done);
193
+ this.addChild(this.inner);
194
+ }
195
+ buildList(currentValue, done) {
196
+ return new SelectSubmenu("Behavior preset", "Built-in options replace ~/.lunr/agent/behavior.md. Custom keeps the file. Cap skipped for built-ins.", BEHAVIOR_PRESET_ITEMS, currentValue, (value) => {
197
+ if (value === currentValue) {
198
+ done();
199
+ return;
200
+ }
201
+ if (value !== "custom" && detectBehaviorPreset(readBehaviorFile()) === "custom") {
202
+ this.showOverwriteConfirm(value, done);
203
+ return;
204
+ }
205
+ done(value);
206
+ }, () => done());
207
+ }
208
+ showOverwriteConfirm(preset, done) {
209
+ this.clear();
210
+ this.inner = new SelectSubmenu("Overwrite behavior.md", `Replace the custom behavior file with the ${preset} preset? This cannot be undone from settings.`, [
211
+ { value: "cancel", label: "Cancel" },
212
+ { value: "overwrite", label: `Overwrite with ${preset}` },
213
+ ], "cancel", (value) => {
214
+ if (value === "overwrite") {
215
+ done(preset);
216
+ return;
217
+ }
218
+ done();
219
+ }, () => done());
220
+ this.addChild(this.inner);
221
+ }
222
+ handleInput(data) {
223
+ this.inner.handleInput?.(data);
224
+ }
225
+ }
129
226
  // lunr: Customize submenu — toggles for the lunR TUI customize settings.
130
227
  class CustomizeSubmenu extends Container {
131
228
  settingsList;
@@ -177,13 +274,41 @@ class CustomizeSubmenu extends Container {
177
274
  currentValue: (bridge?.getFooterTokens() ?? true) ? "on" : "off",
178
275
  values: ["on", "off"],
179
276
  },
277
+ {
278
+ id: "footer-tps",
279
+ label: "Footer: TPS counter",
280
+ description: "Show the ✓ 174.0 t/s · tokens-in-time segment in the footer stats line.",
281
+ currentValue: (bridge?.getFooterTps() ?? true) ? "on" : "off",
282
+ values: ["on", "off"],
283
+ },
180
284
  {
181
285
  id: "footer-statuses",
182
286
  label: "Footer: feature statuses",
183
- description: "Show the plan/goal/swarm/research/tps status segments in the footer stats line.",
287
+ description: "Show the plan/goal/swarm/research status segments in the footer stats line.",
184
288
  currentValue: (bridge?.getFooterStatuses() ?? true) ? "on" : "off",
185
289
  values: ["on", "off"],
186
290
  },
291
+ {
292
+ id: "footer-git",
293
+ label: "Footer: git branch",
294
+ description: "Show the current git branch and added/removed line counts in the footer stats line.",
295
+ currentValue: (bridge?.getFooterGit() ?? true) ? "on" : "off",
296
+ values: ["on", "off"],
297
+ },
298
+ {
299
+ id: "footer-plan",
300
+ label: "Footer: plan usage",
301
+ description: "Show the live subscription usage percent when the current model is on a plan.",
302
+ currentValue: (bridge?.getFooterPlan() ?? true) ? "on" : "off",
303
+ values: ["on", "off"],
304
+ },
305
+ {
306
+ id: "footer-plan-bar",
307
+ label: "Footer: plan bar",
308
+ description: "Show the filled █░ bar next to the plan percent. Off keeps the percent only.",
309
+ currentValue: (bridge?.getFooterPlanBar() ?? true) ? "on" : "off",
310
+ values: ["on", "off"],
311
+ },
187
312
  ];
188
313
  this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
189
314
  switch (id) {
@@ -205,9 +330,21 @@ class CustomizeSubmenu extends Container {
205
330
  case "footer-tokens":
206
331
  callbacks.onFooterTokensChange(newValue === "on");
207
332
  break;
333
+ case "footer-tps":
334
+ callbacks.onFooterTpsChange(newValue === "on");
335
+ break;
208
336
  case "footer-statuses":
209
337
  callbacks.onFooterStatusesChange(newValue === "on");
210
338
  break;
339
+ case "footer-git":
340
+ callbacks.onFooterGitChange(newValue === "on");
341
+ break;
342
+ case "footer-plan":
343
+ callbacks.onFooterPlanChange(newValue === "on");
344
+ break;
345
+ case "footer-plan-bar":
346
+ callbacks.onFooterPlanBarChange(newValue === "on");
347
+ break;
211
348
  }
212
349
  }, () => done());
213
350
  this.addChild(this.settingsList);
@@ -827,10 +964,17 @@ export class SettingsSelectorComponent extends Container {
827
964
  {
828
965
  id: "memory-char-cap",
829
966
  label: "Memory character cap",
830
- description: `Max characters in the simple-pi-memory memory file AND the behavior file (${MEMORY_CHAR_CAP_MIN}-${MEMORY_CHAR_CAP_MAX}, default ${MEMORY_CHAR_CAP_DEFAULT}). Also settable via /memory-char-cap.`,
967
+ description: `Max characters in the simple-pi-memory memory file AND a custom behavior file (${MEMORY_CHAR_CAP_MIN}-${MEMORY_CHAR_CAP_MAX}, default ${MEMORY_CHAR_CAP_DEFAULT}). Built-in behavior presets skip the cap. Also settable via /memory-char-cap.`,
831
968
  currentValue: String(config.memoryCharCap),
832
969
  submenu: (currentValue, submenuDone) => new MemoryCharCapSubmenu(currentValue, submenuDone),
833
970
  },
971
+ {
972
+ id: "behavior-preset",
973
+ label: "Behavior preset",
974
+ description: "Built-in options replace ~/.lunr/agent/behavior.md (default / humanizer / concise). Custom keeps the file. Built-ins skip the character cap.",
975
+ currentValue: config.behaviorPreset,
976
+ submenu: (currentValue, submenuDone) => new BehaviorPresetSubmenu(currentValue, submenuDone),
977
+ },
834
978
  {
835
979
  id: "search-curator",
836
980
  label: "Search curator",
@@ -903,6 +1047,13 @@ export class SettingsSelectorComponent extends Container {
903
1047
  currentValue: config.modelTiers.enabled ? "on" : "off",
904
1048
  submenu: (currentValue, done) => new ModelTiersSubmenu(currentValue, config.modelTiers, callbacks, done),
905
1049
  },
1050
+ {
1051
+ id: "plan-usage-window",
1052
+ label: "Plan usage window",
1053
+ description: "Preferred subscription window for the footer bar. Missing 5h falls back to weekly.",
1054
+ currentValue: config.planUsageWindow,
1055
+ values: ["5h", "weekly"],
1056
+ },
906
1057
  // lunr: Customize submenu — lunR TUI toggles (rail, prompt symbol, footer segments)
907
1058
  {
908
1059
  id: "customize",
@@ -1095,9 +1246,15 @@ export class SettingsSelectorComponent extends Container {
1095
1246
  case "smooth-streaming":
1096
1247
  callbacks.onSmoothStreamingChange(newValue === "true");
1097
1248
  break;
1249
+ case "plan-usage-window":
1250
+ callbacks.onPlanUsageWindowChange(newValue === "5h" ? "5h" : "weekly");
1251
+ break;
1098
1252
  case "memory-char-cap":
1099
1253
  callbacks.onMemoryCharCapChange(parseInt(newValue, 10));
1100
1254
  break;
1255
+ case "behavior-preset":
1256
+ callbacks.onBehaviorPresetChange(newValue);
1257
+ break;
1101
1258
  case "search-curator":
1102
1259
  callbacks.onSearchCuratorChange(newValue);
1103
1260
  break;