@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
package/dist/main.js CHANGED
@@ -16,17 +16,16 @@ import { listModels } from "./cli/list-models.js";
16
16
  import { createProjectTrustContext } from "./cli/project-trust.js";
17
17
  import { selectSession } from "./cli/session-picker.js";
18
18
  import { shouldRunFirstTimeSetup, showFirstTimeSetup, showStartupSelector } from "./cli/startup-ui.js";
19
+ import { handleUpdateCli } from "./cli/update-cli.js";
19
20
  import { APP_NAME, appendDebugLog, ENV_SESSION_DIR, expandTildePath, getAgentDir, getSessionsDir, VERSION, } from "./config.js";
20
21
  import { createAgentSessionRuntime } from "./core/agent-session-runtime.js";
21
22
  import { createAgentSessionFromServices, createAgentSessionServices, } from "./core/agent-session-services.js";
22
23
  import { formatNoModelsAvailableMessage } from "./core/auth-guidance.js";
23
24
  import { registerCustomizeBridge } from "./core/customize.js";
24
- import { exportFromFile } from "./core/export-html/index.js";
25
25
  import { applyHttpProxySettings, configureHttpDispatcher } from "./core/http-dispatcher.js";
26
26
  import { registerMemoryCapBridge } from "./core/memory-cap.js";
27
27
  import { resolveCliModel, resolveModelScope } from "./core/model-resolver.js";
28
28
  import { getModelTiersBridge, registerModelTierBridge } from "./core/model-tiers.js";
29
- import { registerUsageServiceBridge } from "./core/usage-service.js";
30
29
  import { restoreStdout, takeOverStdout } from "./core/output-guard.js";
31
30
  import { resolveProjectTrusted } from "./core/project-trust.js";
32
31
  import { formatMissingSessionCwdPrompt, getMissingSessionCwdIssue, MissingSessionCwdError, } from "./core/session-cwd.js";
@@ -36,12 +35,11 @@ import { SettingsManager } from "./core/settings-manager.js";
36
35
  import { applyInheritedSubagentPermissions } from "./core/subagent-permission-inherit.js";
37
36
  import { printTimings, resetTimings, time } from "./core/timings.js";
38
37
  import { hasTrustRequiringProjectResources, ProjectTrustStore } from "./core/trust-manager.js";
39
- import { handleGatewayCommand } from "./gateway/command.js";
38
+ import { registerUsageServiceBridge } from "./core/usage-service.js";
40
39
  import { runMigrations, showDeprecationWarnings } from "./migrations.js";
41
- import { InteractiveMode } from "./modes/interactive/interactive-mode.js";
42
40
  import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme.js";
43
- import { handleUpdateCli } from "./cli/update-cli.js";
44
41
  import { handleConfigCommand, handlePackageCommand } from "./package-manager-cli.js";
42
+ import { markStartupMilestone } from "./startup/startup-milestones.js";
45
43
  import { isLocalPath, normalizePath, resolvePath } from "./utils/paths.js";
46
44
  const EXTENSION_LOAD_FAILURE_HINT = `Hint: Start without extensions using "${APP_NAME} -ne".`;
47
45
  /**
@@ -179,7 +177,10 @@ async function resolveSessionPath(sessionArg, cwd, sessionDir) {
179
177
  return { type: "not_found", arg: sessionArg };
180
178
  }
181
179
  /** Prompt user for yes/no confirmation */
182
- async function promptConfirm(message) {
180
+ async function promptConfirm(message, startupView) {
181
+ if (startupView) {
182
+ return startupView.confirm("Confirm", message);
183
+ }
183
184
  return new Promise((resolve) => {
184
185
  const rl = createInterface({
185
186
  input: process.stdin,
@@ -246,7 +247,7 @@ function forkSessionOrExit(sourcePath, cwd, sessionDir, sessionId) {
246
247
  process.exit(1);
247
248
  }
248
249
  }
249
- async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
250
+ async function createSessionManager(parsed, cwd, sessionDir, settingsManager, startupView) {
250
251
  if (parsed.noSession || parsed.help || parsed.listModels !== undefined) {
251
252
  return SessionManager.inMemory(cwd, parsed.sessionId !== undefined ? { id: parsed.sessionId } : undefined);
252
253
  }
@@ -277,7 +278,7 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
277
278
  return openSessionOrExit(resolved.path, sessionDir);
278
279
  case "global": {
279
280
  console.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));
280
- const shouldFork = await promptConfirm("Fork this session into current directory?");
281
+ const shouldFork = await promptConfirm("Fork this session into current directory?", startupView);
281
282
  if (!shouldFork) {
282
283
  console.log(chalk.dim("Aborted."));
283
284
  process.exit(0);
@@ -291,7 +292,11 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
291
292
  }
292
293
  if (parsed.resume) {
293
294
  try {
294
- const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), (onProgress) => SessionManager.listAll(sessionDir, onProgress), settingsManager);
295
+ const currentSessionsLoader = (onProgress) => SessionManager.list(cwd, sessionDir, onProgress);
296
+ const allSessionsLoader = (onProgress) => SessionManager.listAll(sessionDir, onProgress);
297
+ const selectedPath = startupView
298
+ ? await startupView.selectSession(currentSessionsLoader, allSessionsLoader)
299
+ : await selectSession(currentSessionsLoader, allSessionsLoader, settingsManager);
295
300
  if (!selectedPath) {
296
301
  console.log(chalk.dim("No session selected"));
297
302
  process.exit(0);
@@ -398,11 +403,27 @@ function buildSessionOptions(parsed, scopedModels, hasExistingSession, modelRunt
398
403
  function resolveCliPaths(cwd, paths) {
399
404
  return paths?.map((value) => (isLocalPath(value) ? resolvePath(value, cwd) : value));
400
405
  }
401
- async function promptForMissingSessionCwd(issue, settingsManager) {
402
- return showStartupSelector(settingsManager, formatMissingSessionCwdPrompt(issue), [
406
+ function createStartupViewTrustContext(cwd, startupView) {
407
+ return {
408
+ cwd,
409
+ mode: "tui",
410
+ hasUI: true,
411
+ ui: {
412
+ select: (title, options) => startupView.select(title, options.map((option) => ({ label: option, value: option }))),
413
+ confirm: (title, message) => startupView.confirm(title, message),
414
+ input: (title, placeholder) => startupView.input(title, placeholder),
415
+ notify: () => { },
416
+ },
417
+ };
418
+ }
419
+ async function promptForMissingSessionCwd(issue, settingsManager, startupView) {
420
+ const options = [
403
421
  { label: "Continue", value: issue.fallbackCwd },
404
422
  { label: "Cancel", value: undefined },
405
- ]);
423
+ ];
424
+ return startupView
425
+ ? startupView.select(formatMissingSessionCwdPrompt(issue), options)
426
+ : showStartupSelector(settingsManager, formatMissingSessionCwdPrompt(issue), options);
406
427
  }
407
428
  export async function main(args, options) {
408
429
  resetTimings();
@@ -429,11 +450,10 @@ export async function main(args, options) {
429
450
  if (await handleConfigCommand(args, { extensionFactories: options?.extensionFactories })) {
430
451
  return;
431
452
  }
432
- // lunr: `lunr gateway` daemon/subcommands — same interception seam as the
433
- // package/config commands above (before parseArgs, which knows nothing
434
- // about gateway args).
435
- if (await handleGatewayCommand(args)) {
436
- return;
453
+ if (args[0] === "gateway") {
454
+ const { handleGatewayCommand } = await import("./gateway/command.js");
455
+ if (await handleGatewayCommand(args))
456
+ return;
437
457
  }
438
458
  const parsed = parseArgs(args);
439
459
  if (parsed.diagnostics.length > 0) {
@@ -453,6 +473,7 @@ export async function main(args, options) {
453
473
  if (parsed.export) {
454
474
  let result;
455
475
  try {
476
+ const { exportFromFile } = await import("./core/export-html/index.js");
456
477
  const outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;
457
478
  result = await exportFromFile(parsed.export, outputPath);
458
479
  }
@@ -465,6 +486,10 @@ export async function main(args, options) {
465
486
  process.exit(0);
466
487
  }
467
488
  let appMode = resolveAppMode(parsed, process.stdin.isTTY, process.stdout.isTTY);
489
+ const interactiveModeImport = appMode === "interactive" ? import("./modes/interactive/interactive-mode.js") : undefined;
490
+ const startupView = appMode === "interactive" ? options?.startupView : undefined;
491
+ if (options?.startupView && !startupView)
492
+ options.startupView.stop();
468
493
  // lunr: parent-delegated children inherit plan or auto before any tool call.
469
494
  // Non-child print/json stays fail-closed (module default manual, no handler).
470
495
  applyInheritedSubagentPermissions();
@@ -496,7 +521,9 @@ export async function main(args, options) {
496
521
  // Experimental first-time setup: theme choice and analytics opt-in.
497
522
  // Runs before any runtime services are created so the chosen settings apply everywhere.
498
523
  if (appMode === "interactive" && !parsed.help && parsed.listModels === undefined && shouldRunFirstTimeSetup()) {
524
+ startupView?.pause();
499
525
  await showFirstTimeSetup(startupSettingsManager);
526
+ startupView?.resume();
500
527
  time("firstTimeSetup");
501
528
  }
502
529
  // Decide the final runtime cwd before creating cwd-bound runtime services.
@@ -508,11 +535,11 @@ export async function main(args, options) {
508
535
  const sessionDir = (parsed.sessionDir ? normalizePath(parsed.sessionDir) : undefined) ??
509
536
  (envSessionDir ? expandTildePath(envSessionDir) : undefined) ??
510
537
  startupSettingsManager.getSessionDir();
511
- let sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager);
538
+ let sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager, startupView);
512
539
  const missingSessionCwdIssue = getMissingSessionCwdIssue(sessionManager, cwd);
513
540
  if (missingSessionCwdIssue) {
514
541
  if (appMode === "interactive") {
515
- const selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);
542
+ const selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager, startupView);
516
543
  if (!selectedCwd) {
517
544
  process.exit(0);
518
545
  }
@@ -532,31 +559,27 @@ export async function main(args, options) {
532
559
  sessionManager.appendSessionInfo(name);
533
560
  }
534
561
  time("createSessionManager");
535
- // lunr: session retention delete session files older than sessionRetentionDays
536
- // (default 30; 0 = keep forever). Best-effort: per-file errors are swallowed,
537
- // deletions go to the debug log only, and the active session file is never deleted.
538
- try {
539
- const retentionDays = startupSettingsManager.getSessionRetentionDays();
540
- if (retentionDays > 0) {
562
+ const runSessionRetention = async () => {
563
+ try {
564
+ const retentionDays = startupSettingsManager.getSessionRetentionDays();
565
+ if (retentionDays <= 0)
566
+ return;
541
567
  const activeSessionFile = sessionManager.getSessionFile();
542
568
  const { deleted } = await pruneOldSessions(getSessionsDir(), retentionDays, {
543
569
  excludeFile: activeSessionFile,
544
570
  });
545
- // Also cover a custom session dir (--session-dir / settings), which is a flat
546
- // .jsonl directory outside the default sessions root.
547
571
  if (sessionDir) {
548
572
  const extra = await pruneOldSessions(sessionDir, retentionDays, { excludeFile: activeSessionFile });
549
573
  deleted.push(...extra.deleted);
550
574
  }
551
575
  if (deleted.length > 0) {
552
- appendDebugLog(`session-retention: deleted ${deleted.length} file(s):\n${deleted.map((p) => ` ${p}`).join("\n")}`);
576
+ appendDebugLog(`session-retention: deleted ${deleted.length} file(s):\n${deleted.map((path) => ` ${path}`).join("\n")}`);
553
577
  }
554
578
  }
555
- }
556
- catch (error) {
557
- appendDebugLog(`session-retention: prune failed: ${error instanceof Error ? error.message : String(error)}`);
558
- }
559
- time("pruneOldSessions");
579
+ catch (error) {
580
+ appendDebugLog(`session-retention: prune failed: ${error instanceof Error ? error.message : String(error)}`);
581
+ }
582
+ };
560
583
  const trustStore = new ProjectTrustStore(agentDir);
561
584
  const sessionCwd = sessionManager.getCwd();
562
585
  const autoTrustOnReloadCwd = parsed.projectTrustOverride === undefined && !hasTrustRequiringProjectResources(sessionCwd)
@@ -568,7 +591,7 @@ export async function main(args, options) {
568
591
  const resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);
569
592
  const resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);
570
593
  const resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);
571
- let builtinRoster = appMode === "interactive" ? [...lightBuiltinExtensions] : await loadAllBuiltinExtensions();
594
+ const builtinRoster = appMode === "interactive" ? [...lightBuiltinExtensions] : await loadAllBuiltinExtensions();
572
595
  const rememberAttachedFactories = (factories) => {
573
596
  const seen = new Set(builtinRoster.map((entry) => (typeof entry === "function" ? undefined : entry.name)).filter(Boolean));
574
597
  for (const factory of factories) {
@@ -609,12 +632,14 @@ export async function main(args, options) {
609
632
  defaultProjectTrust: startupSettingsManager.getDefaultProjectTrust(),
610
633
  extensionsResult,
611
634
  projectTrustContext: projectTrustContext ??
612
- createProjectTrustContext({
613
- cwd,
614
- mode: isInitialRuntime ? trustPromptMode : appMode,
615
- settingsManager: startupSettingsManager,
616
- hasUI: isInitialRuntime && trustPromptMode === "interactive",
617
- }),
635
+ (isInitialRuntime && startupView
636
+ ? createStartupViewTrustContext(cwd, startupView)
637
+ : createProjectTrustContext({
638
+ cwd,
639
+ mode: isInitialRuntime ? trustPromptMode : appMode,
640
+ settingsManager: startupSettingsManager,
641
+ hasUI: isInitialRuntime && trustPromptMode === "interactive",
642
+ })),
618
643
  onExtensionError: (message) => projectTrustDiagnostics.push({ type: "warning", message }),
619
644
  });
620
645
  projectTrustByCwd.set(cwd, trusted);
@@ -640,6 +665,15 @@ export async function main(args, options) {
640
665
  },
641
666
  });
642
667
  const { settingsManager, modelRuntime, resourceLoader } = services;
668
+ if (parsed.model &&
669
+ !resolveCliModel({
670
+ cliProvider: parsed.provider,
671
+ cliModel: parsed.model,
672
+ cliThinking: parsed.thinking,
673
+ modelRuntime,
674
+ }).model) {
675
+ await modelRuntime.refreshIfStale();
676
+ }
643
677
  const diagnostics = [
644
678
  ...projectTrustDiagnostics,
645
679
  ...services.diagnostics,
@@ -695,7 +729,14 @@ export async function main(args, options) {
695
729
  agentDir,
696
730
  sessionManager,
697
731
  });
732
+ if (startupView?.isExitRequested) {
733
+ await runtime.dispose();
734
+ return;
735
+ }
736
+ markStartupMilestone("runtime_hydrated");
698
737
  time("createAgentSessionRuntime");
738
+ if (appMode !== "interactive")
739
+ await runSessionRetention();
699
740
  const { services, session, modelFallbackMessage } = runtime;
700
741
  const { settingsManager, modelRuntime, resourceLoader } = services;
701
742
  applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);
@@ -734,16 +775,23 @@ export async function main(args, options) {
734
775
  time("prepareInitialMessage");
735
776
  initTheme(settingsManager.getTheme(), appMode === "interactive");
736
777
  time("initTheme");
737
- // Show deprecation warnings in interactive mode
738
- if (appMode === "interactive" && deprecationWarnings.length > 0) {
778
+ if (appMode === "interactive" && !startupView && deprecationWarnings.length > 0) {
739
779
  await showDeprecationWarnings(deprecationWarnings);
740
780
  }
741
781
  time("resolveModelScope");
742
- reportDiagnostics(runtime.diagnostics);
782
+ if (!(appMode === "interactive" && startupView))
783
+ reportDiagnostics(runtime.diagnostics);
743
784
  if (runtime.diagnostics.some((diagnostic) => diagnostic.type === "error")) {
744
- if (runtime.diagnostics.some((diagnostic) => diagnostic.message.includes("Failed to load extension"))) {
745
- console.error(chalk.yellow(EXTENSION_LOAD_FAILURE_HINT));
785
+ const extensionHint = runtime.diagnostics.some((diagnostic) => diagnostic.message.includes("Failed to load extension"))
786
+ ? `\n${EXTENSION_LOAD_FAILURE_HINT}`
787
+ : "";
788
+ if (startupView) {
789
+ process.exitCode = 1;
790
+ await startupView.fail(`${runtime.diagnostics.map((diagnostic) => diagnostic.message).join("\n")}${extensionHint}`);
791
+ return;
746
792
  }
793
+ if (extensionHint)
794
+ console.error(chalk.yellow(EXTENSION_LOAD_FAILURE_HINT));
747
795
  process.exit(1);
748
796
  }
749
797
  time("createAgentSession");
@@ -761,7 +809,10 @@ export async function main(args, options) {
761
809
  await runRpcMode(runtime);
762
810
  }
763
811
  else if (appMode === "interactive") {
764
- const { loadDeferredBuiltinExtensions } = await import("./builtin-extensions/index.js");
812
+ const [{ InteractiveMode }, { loadDeferredBuiltinExtensions }] = await Promise.all([
813
+ interactiveModeImport,
814
+ import("./builtin-extensions/index.js"),
815
+ ]);
765
816
  const interactiveMode = new InteractiveMode(runtime, {
766
817
  migratedProviders,
767
818
  modelFallbackMessage,
@@ -770,16 +821,21 @@ export async function main(args, options) {
770
821
  initialImages,
771
822
  initialMessages: parsed.messages,
772
823
  verbose: parsed.verbose,
824
+ deprecationWarnings: startupView ? deprecationWarnings : undefined,
825
+ startupDiagnostics: startupView
826
+ ? runtime.diagnostics.filter((diagnostic) => diagnostic.type !== "error")
827
+ : undefined,
828
+ startupView: startupView?.binding(),
829
+ deferredMaintenance: runSessionRetention,
773
830
  deferredBuiltinFactories: parsed.noExtensions ? undefined : loadDeferredBuiltinExtensions,
774
831
  onDeferredBuiltinsAttached: rememberAttachedFactories,
775
832
  });
776
833
  if (startupBenchmark) {
777
834
  await interactiveMode.init();
778
835
  time("interactiveMode.init");
779
- await interactiveMode.waitForDeferredBuiltins();
780
- time("attachDeferredBuiltins");
781
- // Give the TUI's stdin handler a brief chance to consume terminal query replies
782
- // (Kitty keyboard protocol, device attributes, cell size) before restoring the terminal.
836
+ await interactiveMode.waitForStartupReady();
837
+ time("promptBarrier");
838
+ // Consume terminal-query replies before returning control to the shell.
783
839
  await new Promise((resolve) => setTimeout(resolve, 150));
784
840
  interactiveMode.stop();
785
841
  stopThemeWatcher();