@prestyj/cli 5.30.0 → 5.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +54 -39
  2. package/assets/skills/bulletproof/SKILL.md +1 -1
  3. package/assets/skills/clarify/SKILL.md +1 -1
  4. package/assets/skills/code-review/SKILL.md +1 -1
  5. package/assets/skills/compliance-guard/SKILL.md +1 -1
  6. package/assets/skills/durable/SKILL.md +1 -1
  7. package/assets/skills/evidence-led-ui/SKILL.md +1 -1
  8. package/assets/skills/lean/SKILL.md +1 -1
  9. package/assets/skills/refactoring/SKILL.md +1 -1
  10. package/assets/skills/root-cause/SKILL.md +1 -1
  11. package/assets/skills/shared-language/SKILL.md +1 -1
  12. package/assets/skills/tdd/SKILL.md +1 -1
  13. package/dist/app-sidecar/app-settings.d.ts +63 -0
  14. package/dist/app-sidecar/app-settings.js +147 -0
  15. package/dist/app-sidecar/app-settings.js.map +1 -0
  16. package/dist/app-sidecar/attachments.d.ts +11 -0
  17. package/dist/app-sidecar/attachments.js +47 -0
  18. package/dist/app-sidecar/attachments.js.map +1 -0
  19. package/dist/app-sidecar/auth-routes.d.ts +3 -0
  20. package/dist/app-sidecar/auth-routes.js +293 -0
  21. package/dist/app-sidecar/auth-routes.js.map +1 -0
  22. package/dist/app-sidecar/autopilot-runner.d.ts +62 -0
  23. package/dist/app-sidecar/autopilot-runner.js +373 -0
  24. package/dist/app-sidecar/autopilot-runner.js.map +1 -0
  25. package/dist/app-sidecar/file-search.d.ts +15 -0
  26. package/dist/app-sidecar/file-search.js +103 -0
  27. package/dist/app-sidecar/file-search.js.map +1 -0
  28. package/dist/app-sidecar/hf-pull-manager.d.ts +20 -0
  29. package/dist/app-sidecar/hf-pull-manager.js +224 -0
  30. package/dist/app-sidecar/hf-pull-manager.js.map +1 -0
  31. package/dist/app-sidecar/history-routes.d.ts +3 -0
  32. package/dist/app-sidecar/history-routes.js +375 -0
  33. package/dist/app-sidecar/history-routes.js.map +1 -0
  34. package/dist/app-sidecar/history.d.ts +67 -0
  35. package/dist/app-sidecar/history.js +23 -0
  36. package/dist/app-sidecar/history.js.map +1 -0
  37. package/dist/app-sidecar/http.d.ts +5 -0
  38. package/dist/app-sidecar/http.js +27 -0
  39. package/dist/app-sidecar/http.js.map +1 -0
  40. package/dist/app-sidecar/integration-routes.d.ts +3 -0
  41. package/dist/app-sidecar/integration-routes.js +286 -0
  42. package/dist/app-sidecar/integration-routes.js.map +1 -0
  43. package/dist/app-sidecar/json-mode.d.ts +10 -0
  44. package/dist/app-sidecar/json-mode.js +73 -0
  45. package/dist/app-sidecar/json-mode.js.map +1 -0
  46. package/dist/app-sidecar/keep-awake.d.ts +4 -0
  47. package/dist/app-sidecar/keep-awake.js +5 -0
  48. package/dist/app-sidecar/keep-awake.js.map +1 -0
  49. package/dist/app-sidecar/mcp-routes.d.ts +3 -0
  50. package/dist/app-sidecar/mcp-routes.js +185 -0
  51. package/dist/app-sidecar/mcp-routes.js.map +1 -0
  52. package/dist/app-sidecar/mcp-rows.d.ts +31 -0
  53. package/dist/app-sidecar/mcp-rows.js +77 -0
  54. package/dist/app-sidecar/mcp-rows.js.map +1 -0
  55. package/dist/app-sidecar/nolan-context.d.ts +20 -0
  56. package/dist/app-sidecar/nolan-context.js +55 -0
  57. package/dist/app-sidecar/nolan-context.js.map +1 -0
  58. package/dist/app-sidecar/progress-manager.d.ts +10 -0
  59. package/dist/app-sidecar/progress-manager.js +116 -0
  60. package/dist/app-sidecar/progress-manager.js.map +1 -0
  61. package/dist/app-sidecar/prompt-routes.d.ts +3 -0
  62. package/dist/app-sidecar/prompt-routes.js +355 -0
  63. package/dist/app-sidecar/prompt-routes.js.map +1 -0
  64. package/dist/app-sidecar/repo-polls.d.ts +18 -0
  65. package/dist/app-sidecar/repo-polls.js +45 -0
  66. package/dist/app-sidecar/repo-polls.js.map +1 -0
  67. package/dist/app-sidecar/route-context.d.ts +147 -0
  68. package/dist/app-sidecar/route-context.js +2 -0
  69. package/dist/app-sidecar/route-context.js.map +1 -0
  70. package/dist/app-sidecar/run-control-routes.d.ts +3 -0
  71. package/dist/app-sidecar/run-control-routes.js +437 -0
  72. package/dist/app-sidecar/run-control-routes.js.map +1 -0
  73. package/dist/app-sidecar/session-routes.d.ts +3 -0
  74. package/dist/app-sidecar/session-routes.js +115 -0
  75. package/dist/app-sidecar/session-routes.js.map +1 -0
  76. package/dist/app-sidecar/session-types.d.ts +39 -0
  77. package/dist/app-sidecar/session-types.js +5 -0
  78. package/dist/app-sidecar/session-types.js.map +1 -0
  79. package/dist/app-sidecar/task-routes.d.ts +3 -0
  80. package/dist/app-sidecar/task-routes.js +232 -0
  81. package/dist/app-sidecar/task-routes.js.map +1 -0
  82. package/dist/app-sidecar/usage.d.ts +19 -0
  83. package/dist/app-sidecar/usage.js +153 -0
  84. package/dist/app-sidecar/usage.js.map +1 -0
  85. package/dist/app-sidecar/workspace-routes.d.ts +3 -0
  86. package/dist/app-sidecar/workspace-routes.js +374 -0
  87. package/dist/app-sidecar/workspace-routes.js.map +1 -0
  88. package/dist/app-sidecar.js +541 -3971
  89. package/dist/app-sidecar.js.map +1 -1
  90. package/dist/chat-agents/jiwa.js +2 -0
  91. package/dist/chat-agents/jiwa.js.map +1 -1
  92. package/dist/chat-agents/memory.js +2 -0
  93. package/dist/chat-agents/memory.js.map +1 -1
  94. package/dist/cli/auth.js +13 -9
  95. package/dist/cli/auth.js.map +1 -1
  96. package/dist/cli.js +10 -11
  97. package/dist/cli.js.map +1 -1
  98. package/dist/config.js +1 -1
  99. package/dist/core/acceptance-checks.js +3 -9
  100. package/dist/core/acceptance-checks.js.map +1 -1
  101. package/dist/core/agent-session/helpers.d.ts +26 -0
  102. package/dist/core/agent-session/helpers.js +47 -0
  103. package/dist/core/agent-session/helpers.js.map +1 -0
  104. package/dist/core/agent-session/mcp-tools.d.ts +68 -0
  105. package/dist/core/agent-session/mcp-tools.js +195 -0
  106. package/dist/core/agent-session/mcp-tools.js.map +1 -0
  107. package/dist/core/agent-session/run-loop-monitor.d.ts +63 -0
  108. package/dist/core/agent-session/run-loop-monitor.js +164 -0
  109. package/dist/core/agent-session/run-loop-monitor.js.map +1 -0
  110. package/dist/core/agent-session/transcript-markers.d.ts +57 -0
  111. package/dist/core/agent-session/transcript-markers.js +166 -0
  112. package/dist/core/agent-session/transcript-markers.js.map +1 -0
  113. package/dist/core/agent-session/verification-tracker.d.ts +50 -0
  114. package/dist/core/agent-session/verification-tracker.js +269 -0
  115. package/dist/core/agent-session/verification-tracker.js.map +1 -0
  116. package/dist/core/agent-session.d.ts +27 -87
  117. package/dist/core/agent-session.js +166 -713
  118. package/dist/core/agent-session.js.map +1 -1
  119. package/dist/core/auth-providers.js +3 -3
  120. package/dist/core/auth-providers.js.map +1 -1
  121. package/dist/core/autopilot-cycle.d.ts +8 -2
  122. package/dist/core/autopilot-cycle.js +22 -3
  123. package/dist/core/autopilot-cycle.js.map +1 -1
  124. package/dist/core/bundled-agents.js +6 -6
  125. package/dist/core/bundled-agents.js.map +1 -1
  126. package/dist/core/checklist-git.d.ts +19 -0
  127. package/dist/core/checklist-git.js +54 -0
  128. package/dist/core/checklist-git.js.map +1 -0
  129. package/dist/core/checklist-items.d.ts +10 -1
  130. package/dist/core/checklist-items.js +22 -0
  131. package/dist/core/checklist-items.js.map +1 -1
  132. package/dist/core/checklist-prompt.d.ts +14 -3
  133. package/dist/core/checklist-prompt.js +38 -8
  134. package/dist/core/checklist-prompt.js.map +1 -1
  135. package/dist/core/checklist-snapshot.d.ts +5 -1
  136. package/dist/core/checklist-snapshot.js +20 -3
  137. package/dist/core/checklist-snapshot.js.map +1 -1
  138. package/dist/core/checklist-store.d.ts +5 -1
  139. package/dist/core/checklist-store.js +35 -4
  140. package/dist/core/checklist-store.js.map +1 -1
  141. package/dist/core/context-limits.js +1 -1
  142. package/dist/core/context-limits.js.map +1 -1
  143. package/dist/core/event-bus.d.ts +1 -1
  144. package/dist/core/event-bus.js +39 -13
  145. package/dist/core/event-bus.js.map +1 -1
  146. package/dist/core/extensions/plugin-bundles.js +4 -2
  147. package/dist/core/extensions/plugin-bundles.js.map +1 -1
  148. package/dist/core/hashline.d.ts +10 -8
  149. package/dist/core/hashline.js.map +1 -1
  150. package/dist/core/mcp/client.js +2 -0
  151. package/dist/core/mcp/client.js.map +1 -1
  152. package/dist/core/mcp/loopback.d.ts +2 -2
  153. package/dist/core/mcp/loopback.js +2 -2
  154. package/dist/core/mcp/shared-pool.js +4 -3
  155. package/dist/core/mcp/shared-pool.js.map +1 -1
  156. package/dist/core/persistent-shell.js +2 -1
  157. package/dist/core/persistent-shell.js.map +1 -1
  158. package/dist/core/plan-handoff.d.ts +30 -0
  159. package/dist/core/plan-handoff.js +10 -0
  160. package/dist/core/plan-handoff.js.map +1 -0
  161. package/dist/core/plan-submission-gate.d.ts +28 -0
  162. package/dist/core/plan-submission-gate.js +27 -0
  163. package/dist/core/plan-submission-gate.js.map +1 -0
  164. package/dist/core/process-manager.js +9 -1
  165. package/dist/core/process-manager.js.map +1 -1
  166. package/dist/core/project-health-scan.d.ts +109 -0
  167. package/dist/core/project-health-scan.js +673 -0
  168. package/dist/core/project-health-scan.js.map +1 -0
  169. package/dist/core/project-health-score.d.ts +41 -0
  170. package/dist/core/project-health-score.js +257 -0
  171. package/dist/core/project-health-score.js.map +1 -0
  172. package/dist/core/prompt-commands.js +44 -6
  173. package/dist/core/prompt-commands.js.map +1 -1
  174. package/dist/core/session-manager.js.map +1 -1
  175. package/dist/core/session-storage.d.ts +1 -0
  176. package/dist/core/session-storage.js +1 -1
  177. package/dist/core/session-storage.js.map +1 -1
  178. package/dist/core/skills.js +6 -9
  179. package/dist/core/skills.js.map +1 -1
  180. package/dist/core/style-packs/index.js +2 -11
  181. package/dist/core/style-packs/index.js.map +1 -1
  182. package/dist/core/style-packs/packs.d.ts +3 -12
  183. package/dist/core/style-packs/packs.js +132 -173
  184. package/dist/core/style-packs/packs.js.map +1 -1
  185. package/dist/core/subagent-manager.js +11 -6
  186. package/dist/core/subagent-manager.js.map +1 -1
  187. package/dist/core/subagent-receipt.js +3 -4
  188. package/dist/core/subagent-receipt.js.map +1 -1
  189. package/dist/core/ui-adoption.js +2 -0
  190. package/dist/core/ui-adoption.js.map +1 -1
  191. package/dist/core/ui-registry.js +5 -4
  192. package/dist/core/ui-registry.js.map +1 -1
  193. package/dist/core/verification-evidence.d.ts +21 -2
  194. package/dist/core/verification-evidence.js +283 -8
  195. package/dist/core/verification-evidence.js.map +1 -1
  196. package/dist/core/verification-gate.js +4 -2
  197. package/dist/core/verification-gate.js.map +1 -1
  198. package/dist/core/verify-commands.js +2 -3
  199. package/dist/core/verify-commands.js.map +1 -1
  200. package/dist/modes/agent-home-mode.js +1 -4
  201. package/dist/modes/agent-home-mode.js.map +1 -1
  202. package/dist/modes/subagent-worker-mode.js +13 -8
  203. package/dist/modes/subagent-worker-mode.js.map +1 -1
  204. package/dist/system-prompt.js +70 -87
  205. package/dist/system-prompt.js.map +1 -1
  206. package/dist/tools/ask-user.js +13 -74
  207. package/dist/tools/ask-user.js.map +1 -1
  208. package/dist/tools/bash.d.ts +3 -1
  209. package/dist/tools/bash.js +28 -84
  210. package/dist/tools/bash.js.map +1 -1
  211. package/dist/tools/checklist.d.ts +7 -14
  212. package/dist/tools/checklist.js +22 -41
  213. package/dist/tools/checklist.js.map +1 -1
  214. package/dist/tools/code-nav.js +7 -29
  215. package/dist/tools/code-nav.js.map +1 -1
  216. package/dist/tools/edit.d.ts +4 -9
  217. package/dist/tools/edit.js +175 -65
  218. package/dist/tools/edit.js.map +1 -1
  219. package/dist/tools/enter-plan.js +2 -7
  220. package/dist/tools/enter-plan.js.map +1 -1
  221. package/dist/tools/exit-plan.js +2 -3
  222. package/dist/tools/exit-plan.js.map +1 -1
  223. package/dist/tools/find.js +3 -4
  224. package/dist/tools/find.js.map +1 -1
  225. package/dist/tools/grep.js +9 -20
  226. package/dist/tools/grep.js.map +1 -1
  227. package/dist/tools/index.js +10 -7
  228. package/dist/tools/index.js.map +1 -1
  229. package/dist/tools/ls.js +3 -3
  230. package/dist/tools/ls.js.map +1 -1
  231. package/dist/tools/prompt-hints.js +34 -47
  232. package/dist/tools/prompt-hints.js.map +1 -1
  233. package/dist/tools/read-only-bash.js +3 -0
  234. package/dist/tools/read-only-bash.js.map +1 -1
  235. package/dist/tools/read.js +8 -20
  236. package/dist/tools/read.js.map +1 -1
  237. package/dist/tools/search-code.js +4 -12
  238. package/dist/tools/search-code.js.map +1 -1
  239. package/dist/tools/skill.js +13 -7
  240. package/dist/tools/skill.js.map +1 -1
  241. package/dist/tools/subagent-control.js +7 -22
  242. package/dist/tools/subagent-control.js.map +1 -1
  243. package/dist/tools/subagent.js +1 -1
  244. package/dist/tools/subagent.js.map +1 -1
  245. package/dist/tools/task-output.js +4 -15
  246. package/dist/tools/task-output.js.map +1 -1
  247. package/dist/tools/task-send.js +5 -17
  248. package/dist/tools/task-send.js.map +1 -1
  249. package/dist/tools/task-stop.js +2 -2
  250. package/dist/tools/task-stop.js.map +1 -1
  251. package/dist/tools/tool-search.js +2 -7
  252. package/dist/tools/tool-search.js.map +1 -1
  253. package/dist/tools/tool-tiers.d.ts +21 -4
  254. package/dist/tools/tool-tiers.js +44 -17
  255. package/dist/tools/tool-tiers.js.map +1 -1
  256. package/dist/tools/web-fetch.js +7 -33
  257. package/dist/tools/web-fetch.js.map +1 -1
  258. package/dist/tools/write.js +3 -4
  259. package/dist/tools/write.js.map +1 -1
  260. package/dist/ui/App.js +20 -26
  261. package/dist/ui/App.js.map +1 -1
  262. package/dist/ui/components/Footer.js +1 -2
  263. package/dist/ui/components/Footer.js.map +1 -1
  264. package/dist/ui/components/InputArea.js +0 -2
  265. package/dist/ui/components/InputArea.js.map +1 -1
  266. package/dist/ui/components/ToolExecution.js +4 -3
  267. package/dist/ui/components/ToolExecution.js.map +1 -1
  268. package/dist/ui/hooks/useAgentLoop.js +7 -6
  269. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  270. package/dist/ui/sessions.js +1 -5
  271. package/dist/ui/sessions.js.map +1 -1
  272. package/dist/ui/utils/highlight.d.ts +0 -5
  273. package/dist/ui/utils/highlight.js +3 -49
  274. package/dist/ui/utils/highlight.js.map +1 -1
  275. package/dist/ui/utils/markdown-renderer.d.ts +6 -0
  276. package/dist/ui/utils/markdown-renderer.js +21 -5
  277. package/dist/ui/utils/markdown-renderer.js.map +1 -1
  278. package/dist/utils/process.js +3 -3
  279. package/dist/utils/process.js.map +1 -1
  280. package/dist/utils/shared-poll.d.ts +37 -0
  281. package/dist/utils/shared-poll.js +104 -0
  282. package/dist/utils/shared-poll.js.map +1 -0
  283. package/package.json +8 -8
  284. package/dist/core/api-benchmark.d.ts +0 -63
  285. package/dist/core/api-benchmark.js +0 -381
  286. package/dist/core/api-benchmark.js.map +0 -1
  287. package/dist/core/bash-spawn-benchmark.d.ts +0 -1
  288. package/dist/core/bash-spawn-benchmark.js +0 -139
  289. package/dist/core/bash-spawn-benchmark.js.map +0 -1
  290. package/dist/core/cache-warm-benchmark.d.ts +0 -21
  291. package/dist/core/cache-warm-benchmark.js +0 -170
  292. package/dist/core/cache-warm-benchmark.js.map +0 -1
  293. package/dist/core/fast-apply-benchmark.d.ts +0 -25
  294. package/dist/core/fast-apply-benchmark.js +0 -284
  295. package/dist/core/fast-apply-benchmark.js.map +0 -1
  296. package/dist/core/hashline-edit-benchmark.d.ts +0 -88
  297. package/dist/core/hashline-edit-benchmark.js +0 -518
  298. package/dist/core/hashline-edit-benchmark.js.map +0 -1
  299. package/dist/core/semantic-search-benchmark.d.ts +0 -36
  300. package/dist/core/semantic-search-benchmark.js +0 -211
  301. package/dist/core/semantic-search-benchmark.js.map +0 -1
  302. package/dist/core/speed-benchmark.d.ts +0 -132
  303. package/dist/core/speed-benchmark.js +0 -410
  304. package/dist/core/speed-benchmark.js.map +0 -1
  305. package/dist/ui/activity-phrases.d.ts +0 -10
  306. package/dist/ui/activity-phrases.js +0 -184
  307. package/dist/ui/activity-phrases.js.map +0 -1
  308. package/dist/ui/components/PlanApproval.d.ts +0 -7
  309. package/dist/ui/components/PlanApproval.js +0 -60
  310. package/dist/ui/components/PlanApproval.js.map +0 -1
  311. package/dist/ui/components/PlanBanner.d.ts +0 -5
  312. package/dist/ui/components/PlanBanner.js +0 -31
  313. package/dist/ui/components/PlanBanner.js.map +0 -1
  314. package/dist/ui/components/PlanProgress.d.ts +0 -6
  315. package/dist/ui/components/PlanProgress.js +0 -30
  316. package/dist/ui/components/PlanProgress.js.map +0 -1
  317. package/dist/ui/hooks/useMinDisplayTime.d.ts +0 -10
  318. package/dist/ui/hooks/useMinDisplayTime.js +0 -34
  319. package/dist/ui/hooks/useMinDisplayTime.js.map +0 -1
  320. package/dist/ui/hooks/useSessionManager.d.ts +0 -12
  321. package/dist/ui/hooks/useSessionManager.js +0 -43
  322. package/dist/ui/hooks/useSessionManager.js.map +0 -1
  323. package/dist/ui/hooks/useSlashCommands.d.ts +0 -6
  324. package/dist/ui/hooks/useSlashCommands.js +0 -11
  325. package/dist/ui/hooks/useSlashCommands.js.map +0 -1
  326. package/dist/ui/terminal-history-spacing.d.ts +0 -1
  327. package/dist/ui/terminal-history-spacing.js +0 -2
  328. package/dist/ui/terminal-history-spacing.js.map +0 -1
  329. package/dist/ui/utils/markdown-cache.d.ts +0 -10
  330. package/dist/ui/utils/markdown-cache.js +0 -58
  331. package/dist/ui/utils/markdown-cache.js.map +0 -1
  332. package/dist/ui/utils/token-to-ansi.d.ts +0 -8
  333. package/dist/ui/utils/token-to-ansi.js +0 -323
  334. package/dist/ui/utils/token-to-ansi.js.map +0 -1
@@ -0,0 +1,355 @@
1
+ import { isWorkflowCommandText, countAssistantMessages, shouldStartAutopilotCycle, extractTurnToolCalls, isMechanicalOnlyTurn, } from "../core/autopilot-gate.js";
2
+ import { PROMPT_COMMANDS } from "../core/prompt-commands.js";
3
+ import { loadCustomCommands } from "../core/custom-commands.js";
4
+ import { log } from "../core/logger.js";
5
+ import { readBody, json } from "./http.js";
6
+ import { prepareAttachments } from "./attachments.js";
7
+ import { saveAutopilot } from "./app-settings.js";
8
+ import { lastAssistantText, buildNolanContext } from "./nolan-context.js";
9
+ import { keepAwake } from "./keep-awake.js";
10
+ export function handlePromptRoutes(ctx, req, res, url, method) {
11
+ if (method === "GET" && url === "/commands") {
12
+ if (ctx.mode !== "code") {
13
+ json(res, 200, { commands: [] });
14
+ return true;
15
+ }
16
+ // Workflow commands with agent functionality: built-in prompt templates +
17
+ // the user's own `.ezcoder/commands/*.md`. UI commands (model/quit/etc.) are
18
+ // handled webview-side and intentionally excluded.
19
+ void (async () => {
20
+ const builtins = PROMPT_COMMANDS.map((c) => ({
21
+ name: c.name,
22
+ aliases: c.aliases,
23
+ description: c.description,
24
+ source: "built-in",
25
+ }));
26
+ // Desktop-safe registry actions belong in the same picker as workflows.
27
+ // Most registry commands have dedicated app controls or TUI-only flows;
28
+ // multi-root management has no other affordance, so expose only these.
29
+ const workspaceActions = [
30
+ {
31
+ name: "add-dir",
32
+ aliases: ["adddir"],
33
+ description: "Add another project folder to this workspace",
34
+ source: "built-in",
35
+ },
36
+ {
37
+ name: "remove-dir",
38
+ aliases: ["removedir"],
39
+ description: "Remove an added project folder from this workspace",
40
+ source: "built-in",
41
+ },
42
+ ];
43
+ const custom = (await loadCustomCommands(ctx.cwd))
44
+ // A custom command can't shadow a built-in name or app action.
45
+ .filter((c) => !PROMPT_COMMANDS.some((b) => b.name === c.name) &&
46
+ !workspaceActions.some((action) => action.name === c.name))
47
+ .map((c) => ({
48
+ name: c.name,
49
+ aliases: [],
50
+ description: c.description,
51
+ source: "custom",
52
+ }));
53
+ json(res, 200, { commands: [...workspaceActions, ...builtins, ...custom] });
54
+ })();
55
+ return true;
56
+ }
57
+ if (method === "POST" && url === "/prompt") {
58
+ // Per-request: only the prompt that actually claimed the start may release
59
+ // it. A bare release would let an early-returning request (bad JSON, or a
60
+ // prompt that queued) clear a claim another request is still holding.
61
+ let claimedStart = false;
62
+ void readBody(req, res)
63
+ .then(async (raw) => {
64
+ if (raw === null)
65
+ return;
66
+ let text;
67
+ let attachments;
68
+ let meta;
69
+ try {
70
+ const body = JSON.parse(raw);
71
+ text = body.text ?? "";
72
+ attachments = Array.isArray(body.attachments) ? body.attachments : [];
73
+ meta = typeof body.meta === "object" && body.meta !== null ? body.meta : undefined;
74
+ }
75
+ catch {
76
+ json(res, 400, { error: "invalid JSON body" });
77
+ return;
78
+ }
79
+ if (!text.trim() && attachments.length === 0) {
80
+ json(res, 400, { error: "empty prompt" });
81
+ return;
82
+ }
83
+ // A typed prompt supersedes any question parked on the user: they
84
+ // answered with a message of their own. Release the blocked tool call
85
+ // NOW — otherwise it waits out its ten-minute timeout while this very
86
+ // message sits behind it as steering that only drains once the tool
87
+ // returns, so the turn looks frozen. The webview closes the band on
88
+ // send; a racing /ask POST just 409s.
89
+ ctx.asks.cancelAll({ action: "cancel", superseded: true });
90
+ if (ctx.runLifecycle.running &&
91
+ ctx.runLifecycle.isCancellationRequested(ctx.runLifecycle.generation)) {
92
+ json(res, 409, {
93
+ error: ctx.runLifecycle.state === "cancelling" ? "run_cancelling" : "cancel_failed",
94
+ runState: ctx.runLifecycle.state,
95
+ });
96
+ return;
97
+ }
98
+ // `runClaim` covers the gap before `runAgent` flips `running`: a
99
+ // prompt arriving in that window must queue, not start a second run.
100
+ if (ctx.running || ctx.runClaim.active || ctx.autopilotActive) {
101
+ // Queue prompts as mid-run steering (mirrors the CLI). Also queue while
102
+ // an autopilot cycle is active but between injected runs (build idle,
103
+ // Nolan reviewing) so the message never starts a run that collides with
104
+ // an injected one on the same session. Attachments are persisted to
105
+ // .ezcoder/uploads first so the queued media rides the same native-block
106
+ // path as a non-queued attachment prompt when it drains.
107
+ const prepared = attachments.length > 0 ? await prepareAttachments(ctx.cwd, attachments) : [];
108
+ const count = ctx.session.queueMessage(text, prepared);
109
+ ctx.broadcast("queued", { count, messages: ctx.session.listQueuedMessages() });
110
+ json(res, 202, { queued: true, count });
111
+ return;
112
+ }
113
+ // Claim the run NOW, synchronously. Everything below this line may
114
+ // yield, and `running` does not flip until runAgent begins.
115
+ claimedStart = ctx.runClaim.claim();
116
+ // A scheduled prompt has nobody watching: short ask deadline.
117
+ ctx.scheduledRunActive = meta?.scheduled === true;
118
+ json(res, 202, { accepted: true });
119
+ // Gate inputs captured around the run: whether this turn is a workflow
120
+ // slash command (attachment prompts skip slash expansion entirely), and
121
+ // how many assistant messages the run actually adds. Computed even when
122
+ // autopilot is currently off — the toggle can flip ON mid-run, and the
123
+ // gate reads the post-run value.
124
+ const workflowCommand = attachments.length === 0 &&
125
+ isWorkflowCommandText(text, await ctx.loadWorkflowCommandSpecs());
126
+ // Does this input actually expand into a persisted user message? Asked
127
+ // of the session itself, because only it knows whether the command
128
+ // resolves here (name/alias casing, custom `.ezcoder/commands`, non-coder
129
+ // agents that don't expand at all). A looser guess would anchor the
130
+ // hint at +1 with no message to land on — decorating an unrelated
131
+ // later bubble with the wrong `/name`.
132
+ const expandsToTemplate = attachments.length === 0 && (await ctx.session.willExpandPromptTemplate(text));
133
+ // Webview display hint for this prompt's user bubble (nolanSent shimmer
134
+ // label / enhancer highlight segments / the `/name` a command was typed
135
+ // as). Anchored +1 so it attaches to the user message the prompt below
136
+ // is about to push. Queued prompts skip this (their position in the run
137
+ // is unpredictable).
138
+ //
139
+ // Recording the invocation matters because the agent persists the
140
+ // EXPANDED template as the user message. Resume used to recover
141
+ // `/name` by matching that body against the current templates, which
142
+ // silently fails the moment a template is edited or reworded — the
143
+ // reopened session then rendered the raw multi-KB prompt instead of
144
+ // the command chip.
145
+ if (expandsToTemplate ||
146
+ (meta && (meta.nolanSent === true || Array.isArray(meta.enhancements)))) {
147
+ void ctx.session
148
+ .persistAppMarker("user_hint", {
149
+ ...(expandsToTemplate ? { command: text.trim() } : {}),
150
+ ...(meta?.nolanSent === true ? { nolanSent: true } : {}),
151
+ ...(Array.isArray(meta?.enhancements) ? { enhancements: meta.enhancements } : {}),
152
+ }, 1)
153
+ .catch(() => { });
154
+ }
155
+ // Fresh user turn: clear any cancel flag left from a prior cycle so this
156
+ // turn's autopilot review can run.
157
+ ctx.autopilotCancelled = false;
158
+ // A typed message while a plan modal/review is pending (reject,
159
+ // feedback, anything) supersedes the pending plan — the bump also
160
+ // invalidates any in-flight Nolan plan review.
161
+ ctx.clearPendingPlan();
162
+ const assistantsBefore = countAssistantMessages(ctx.session.getMessages());
163
+ const messagesBefore = ctx.session.getMessages().length;
164
+ await ctx.runAgent(text, async () => {
165
+ // The review box's Feedback: revise read-only, like Nolan's feedback.
166
+ if (meta?.planRevision === true)
167
+ await ctx.reenterPlanModeForRevision();
168
+ if (attachments.length > 0) {
169
+ // Persist each attachment under .ezcoder/uploads so files are inspectable
170
+ // by the agent's tools, then prompt with the media as native blocks.
171
+ const prepared = await prepareAttachments(ctx.cwd, attachments);
172
+ await ctx.session.promptWithAttachments(text, prepared);
173
+ }
174
+ else {
175
+ // Pass the raw text straight through. AgentSession.prompt() is the
176
+ // single source of truth for slash-command expansion (built-in +
177
+ // `.ezcoder/commands/*.md` custom), so the agent gets the right body
178
+ // while the webview keeps showing the short `/name`.
179
+ await ctx.session.prompt(text);
180
+ }
181
+ }, () => ctx.autopilot);
182
+ // After the user's run settles, kick off Nolan's auto-review loop — but
183
+ // only when the turn is actually reviewable (shouldStartAutopilotCycle):
184
+ // workflow commands (/compare, /expand, …) end with reports or
185
+ // A/B/C choices reserved for the USER; registry commands (/help) and
186
+ // failed runs add no assistant work to judge; a turn that ended in plan
187
+ // mode has a pending Accept/Reject modal Nolan must not preempt. This is
188
+ // the ONLY entry point into the cycle besides the stranded-queue drain —
189
+ // it drives any follow-up EZ Coder runs itself, so the shared runAgent
190
+ // finally never recurses.
191
+ const decision = shouldStartAutopilotCycle({
192
+ enabled: ctx.autopilot,
193
+ cancelled: ctx.autopilotCancelled,
194
+ planMode: ctx.session.getPlanMode(),
195
+ // A submitted plan (exit_plan fired) routes into the PLAN review
196
+ // branch — the cycle reviews the plan itself instead of skipping.
197
+ planPending: ctx.pendingPlanPath !== null,
198
+ workflowCommand,
199
+ assistantMessagesAdded: countAssistantMessages(ctx.session.getMessages()) - assistantsBefore,
200
+ // Skip the review API call outright for turns that only started a
201
+ // background process (dev server/watcher), ran a read-only lookup, or
202
+ // committed/pushed — Nolan's autopilot contract already IGNOREs these,
203
+ // so there's no reason to pay for that verdict.
204
+ mechanicalOnly: isMechanicalOnlyTurn(extractTurnToolCalls(ctx.session.getMessages(), messagesBefore)),
205
+ });
206
+ if (decision.start) {
207
+ log("INFO", "app-sidecar", "autopilot cycle starting", { kind: decision.kind });
208
+ await ctx.runAutopilotCycle(text);
209
+ }
210
+ else {
211
+ ctx.broadcast("autopilot_ignored", { reason: decision.reason });
212
+ log("INFO", "app-sidecar", "autopilot skipped", { reason: decision.reason });
213
+ }
214
+ // A prompt sent while Nolan was reviewing (build idle) queued but had no
215
+ // run to steer into — run it now as a fresh turn so it never strands.
216
+ await ctx.runStrandedQueue();
217
+ })
218
+ .finally(() => {
219
+ if (claimedStart) {
220
+ ctx.scheduledRunActive = false;
221
+ ctx.runClaim.release();
222
+ // The claim held the plan back until the turn fully settled.
223
+ ctx.offerPendingPlan();
224
+ }
225
+ });
226
+ return true;
227
+ }
228
+ // Nolan Grout (mentor): an independent read-only advisory run on the nolanSession.
229
+ // Runs concurrently with a build run — its events are nolan_-prefixed so the
230
+ // webview keeps the bubbles separate. The context digest is assembled fresh
231
+ // from the BUILD session's transcript each turn (one-way mirror).
232
+ if (method === "POST" && url === "/nolan/prompt") {
233
+ if (ctx.mode !== "code") {
234
+ json(res, 404, {
235
+ error: `Nolan is not available in EZ ${ctx.mode === "chat" ? "Chat" : "Motion"}.`,
236
+ });
237
+ return true;
238
+ }
239
+ void readBody(req, res).then(async (raw) => {
240
+ if (raw === null)
241
+ return;
242
+ let text;
243
+ try {
244
+ text = JSON.parse(raw).text ?? "";
245
+ }
246
+ catch {
247
+ json(res, 400, { error: "invalid JSON body" });
248
+ return;
249
+ }
250
+ if (!text.trim()) {
251
+ json(res, 400, { error: "empty prompt" });
252
+ return;
253
+ }
254
+ if (ctx.nolanRunning) {
255
+ json(res, 409, { error: "Nolan is already thinking — wait for his reply." });
256
+ return;
257
+ }
258
+ json(res, 202, { accepted: true });
259
+ ctx.nolanRunning = true;
260
+ const releaseNolanAwake = keepAwake.acquire("nolan");
261
+ ctx.broadcast("nolan_run_start", { text });
262
+ try {
263
+ const nolanAgent = await ctx.ensureNolanSession();
264
+ const digest = await buildNolanContext(ctx.session, ctx.cwd, ctx.gitBranch, text, await ctx.loadWorkflowCommandSpecs(), ctx.injectedAutopilotPrompts);
265
+ await nolanAgent.prompt(digest);
266
+ // Record the turn against the BUILD session so it persists + survives
267
+ // resume (advisory custom entry, never an LLM message). Reply is Nolan's
268
+ // last assistant message; skip persistence if he produced nothing.
269
+ const reply = lastAssistantText(nolanAgent.getMessages());
270
+ if (reply.trim())
271
+ await ctx.session.persistNolanTurn(text, reply);
272
+ }
273
+ catch (err) {
274
+ ctx.broadcastError("nolan_error", "nolan run failed", err);
275
+ }
276
+ finally {
277
+ releaseNolanAwake();
278
+ ctx.nolanRunning = false;
279
+ ctx.broadcast("nolan_run_end", {});
280
+ const pending = ctx.pendingNolanModel;
281
+ ctx.pendingNolanModel = null;
282
+ if (pending)
283
+ await ctx.syncNolanModel(pending.provider, pending.model);
284
+ }
285
+ });
286
+ return true;
287
+ }
288
+ if (method === "POST" && url === "/nolan/cancel") {
289
+ ctx.nolanAbort.abort();
290
+ ctx.nolanAbort = new AbortController();
291
+ ctx.nolanSession?.setSignal(ctx.nolanAbort.signal);
292
+ ctx.nolanRunning = false;
293
+ ctx.broadcast("nolan_run_end", { cancelled: true });
294
+ json(res, 200, { cancelled: true });
295
+ return true;
296
+ }
297
+ if (method === "POST" && url === "/autopilot") {
298
+ if (ctx.mode !== "code") {
299
+ json(res, 404, {
300
+ error: `Autopilot is not available in EZ ${ctx.mode === "chat" ? "Chat" : "Motion"}.`,
301
+ });
302
+ return true;
303
+ }
304
+ void readBody(req, res).then(async (raw) => {
305
+ if (raw === null)
306
+ return;
307
+ let enabled;
308
+ try {
309
+ enabled = Boolean(JSON.parse(raw).enabled);
310
+ }
311
+ catch {
312
+ json(res, 400, { error: "invalid JSON body" });
313
+ return;
314
+ }
315
+ ctx.autopilot = enabled;
316
+ await saveAutopilot(ctx.cwd, enabled);
317
+ log("INFO", "app-sidecar", "autopilot toggled", { enabled: String(enabled) });
318
+ ctx.broadcast("autopilot", { autopilot: enabled });
319
+ json(res, 200, { autopilot: enabled });
320
+ });
321
+ return true;
322
+ }
323
+ if (method === "POST" && url === "/enhance") {
324
+ void readBody(req, res).then(async (raw) => {
325
+ if (raw === null)
326
+ return;
327
+ let text;
328
+ try {
329
+ text = JSON.parse(raw).text ?? "";
330
+ }
331
+ catch {
332
+ json(res, 400, { error: "invalid JSON body" });
333
+ return;
334
+ }
335
+ if (!text.trim()) {
336
+ json(res, 400, { error: "empty prompt" });
337
+ return;
338
+ }
339
+ // An independent read-only LLM call — touches no session state, so it's
340
+ // allowed even while a run is in flight.
341
+ try {
342
+ const result = await ctx.session.enhancePrompt(text);
343
+ json(res, 200, result);
344
+ }
345
+ catch (err) {
346
+ const message = err instanceof Error ? err.message : String(err);
347
+ log("ERROR", "app-sidecar", "enhance failed", { message });
348
+ json(res, 500, { error: message });
349
+ }
350
+ });
351
+ return true;
352
+ }
353
+ return false;
354
+ }
355
+ //# sourceMappingURL=prompt-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/prompt-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ProjectHealthScan } from "../core/project-health-scan.js";
2
+ import { type GitHubOpenCounts } from "../utils/github.js";
3
+ import { type GitHubCI } from "../utils/github-ci.js";
4
+ import { type SharedPolls } from "../utils/shared-poll.js";
5
+ /**
6
+ * Daemon-wide repo pollers, shared by every window on the same repo so
7
+ * opening a project twice doesn't double the git/`gh` processes.
8
+ * Keys: `dirtyFiles`, `gitHubCI` and `projectHealth` by resolved cwd (a
9
+ * worktree has its own files and HEAD); `gitHubCounts` by `owner/repo`
10
+ * (counts are repo-wide).
11
+ */
12
+ export interface RepoPolls {
13
+ readonly dirtyFiles: SharedPolls<number>;
14
+ readonly gitHubCounts: SharedPolls<GitHubOpenCounts>;
15
+ readonly gitHubCI: SharedPolls<GitHubCI | null>;
16
+ readonly projectHealth: SharedPolls<ProjectHealthScan>;
17
+ }
18
+ export declare function createRepoPolls(): RepoPolls;
@@ -0,0 +1,45 @@
1
+ import { createProjectHealthScanner } from "../core/project-health-scan.js";
2
+ import { getGitDirtyFileCount } from "../utils/git.js";
3
+ import { getGitHubOpenCounts } from "../utils/github.js";
4
+ import { startGitHubCIPoll } from "../utils/github-ci.js";
5
+ import { createSharedPolls, startIntervalPoll } from "../utils/shared-poll.js";
6
+ export function createRepoPolls() {
7
+ return {
8
+ // Files change outside the agent (editor saves, terminal commits).
9
+ dirtyFiles: createSharedPolls((cwd, publish) => startIntervalPoll({
10
+ fetch: () => getGitDirtyFileCount(cwd),
11
+ publish,
12
+ firstDelayMs: 5000,
13
+ intervalMs: 5000,
14
+ })),
15
+ // Issues/PRs change outside the app; network-bound, so a slow cadence well
16
+ // under the search API's rate budget (2 calls per tick).
17
+ gitHubCounts: createSharedPolls((slug, publish) => startIntervalPoll({
18
+ fetch: () => getGitHubOpenCounts(slug),
19
+ publish,
20
+ firstDelayMs: 2000,
21
+ intervalMs: 60_000,
22
+ })),
23
+ gitHubCI: createSharedPolls((cwd, publish) => startGitHubCIPoll(cwd, publish)),
24
+ // Reads every source file on the first pass; later passes only stat
25
+ // unchanged files (the scanner caches by mtime + size). Runs also refresh it.
26
+ projectHealth: createSharedPolls((cwd, publish) => {
27
+ const scanner = createProjectHealthScanner();
28
+ const controller = new AbortController();
29
+ const poller = startIntervalPoll({
30
+ fetch: () => scanner.scan(cwd, new Date(), controller.signal),
31
+ publish,
32
+ firstDelayMs: 3000,
33
+ intervalMs: 120_000,
34
+ });
35
+ return {
36
+ refresh: poller.refresh,
37
+ stop() {
38
+ controller.abort();
39
+ poller.stop();
40
+ },
41
+ };
42
+ }),
43
+ };
44
+ }
45
+ //# sourceMappingURL=repo-polls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-polls.js","sourceRoot":"","sources":["../../src/app-sidecar/repo-polls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAA0B,MAAM,gCAAgC,CAAC;AACpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAyB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAgBjG,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,mEAAmE;QACnE,UAAU,EAAE,iBAAiB,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAC7C,iBAAiB,CAAC;YAChB,KAAK,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC;YACtC,OAAO;YACP,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI;SACjB,CAAC,CACH;QACD,2EAA2E;QAC3E,yDAAyD;QACzD,YAAY,EAAE,iBAAiB,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAChD,iBAAiB,CAAC;YAChB,KAAK,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACtC,OAAO;YACP,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,MAAM;SACnB,CAAC,CACH;QACD,QAAQ,EAAE,iBAAiB,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9E,oEAAoE;QACpE,8EAA8E;QAC9E,aAAa,EAAE,iBAAiB,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YAChD,MAAM,OAAO,GAAG,0BAA0B,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC;gBAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;gBAC7D,OAAO;gBACP,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI;oBACF,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,147 @@
1
+ import type { JiwaStore } from "../chat-agents/jiwa.js";
2
+ import type { MemoryStore } from "../chat-agents/memory.js";
3
+ import type { AgentSession } from "../core/agent-session.js";
4
+ import type { AskUserBridge } from "../core/ask-user.js";
5
+ import type { AuthMethod, AuthMethodMeta, AuthProviderMeta } from "../core/auth-providers.js";
6
+ import type { WorkflowCommandSpec } from "../core/autopilot-gate.js";
7
+ import type { EffectiveNolanModel, NolanModelPref } from "../core/nolan-model.js";
8
+ import type { ElicitationBridge } from "../core/mcp/elicitation-bridge.js";
9
+ import type { BackgroundProcess } from "../core/process-manager.js";
10
+ import type { RunClaim } from "../core/run-claim.js";
11
+ import type { RunLifecycle } from "../core/run-lifecycle.js";
12
+ import type { HfSearchRow } from "../hf-pull.js";
13
+ import type { ServeController } from "../modes/serve-mode.js";
14
+ import type { GitHubCI } from "../utils/github-ci.js";
15
+ import type { ProjectHealth } from "../core/project-health-score.js";
16
+ import type { ProgressManager } from "./progress-manager.js";
17
+ import type { HfPullState, SseClient, WorkspaceMode } from "./session-types.js";
18
+ import type { Provider } from "@prestyj/ai";
19
+ import type { AppPaths, AuthStorage, LocalEndpointKind, LocalEndpointProbe, OAuthLoginCallbacks } from "@prestyj/core";
20
+ /** Closure state of one `createSession` context that the per-session route
21
+ * handlers read and write. Built in `createSession`; `let` bindings are
22
+ * exposed as getter/setter pairs so writes land on the closure variable. */
23
+ export interface SessionRouteContext {
24
+ session: AgentSession;
25
+ readonly mode: WorkspaceMode;
26
+ chatAgent: "general" | "therapist" | "research";
27
+ running: boolean;
28
+ readonly runLifecycle: RunLifecycle;
29
+ autopilot: boolean;
30
+ readonly nolanStatePayload: () => EffectiveNolanModel;
31
+ readonly footerExtras: () => {
32
+ contextWindow: number;
33
+ gitBranch: string | null;
34
+ isGitRepo: boolean;
35
+ gitDirtyFileCount: number;
36
+ gitHubIssues: number | null;
37
+ gitHubPRs: number | null;
38
+ gitHubRepoUrl: string | null;
39
+ gitHubCI: GitHubCI | null;
40
+ projectHealth: ProjectHealth | null;
41
+ tasks: BackgroundProcess[];
42
+ additionalRoots: string[];
43
+ };
44
+ readonly progress: ProgressManager;
45
+ readonly memoryStore: MemoryStore;
46
+ readonly jiwaStore: JiwaStore;
47
+ clientSeq: number;
48
+ readonly clients: Set<SseClient>;
49
+ autopilotActive: boolean;
50
+ readonly pendingPlanForHuman: (offeredGeneration: number) => {
51
+ planPath: string;
52
+ content: string;
53
+ } | null;
54
+ readonly paths: AppPaths;
55
+ readonly host: string;
56
+ readonly cwd: string;
57
+ readonly asks: AskUserBridge;
58
+ readonly runClaim: RunClaim;
59
+ readonly broadcast: (type: string, data: unknown) => void;
60
+ scheduledRunActive: boolean;
61
+ readonly loadWorkflowCommandSpecs: () => Promise<WorkflowCommandSpec[]>;
62
+ autopilotCancelled: boolean;
63
+ readonly clearPendingPlan: () => void;
64
+ readonly runAgent: (label: string, run: () => Promise<void>, reviewPending?: () => boolean) => Promise<void>;
65
+ readonly reenterPlanModeForRevision: () => Promise<void>;
66
+ pendingPlanPath: string | null;
67
+ readonly runAutopilotCycle: (originalRequest: string) => Promise<void>;
68
+ readonly runStrandedQueue: () => Promise<void>;
69
+ readonly offerPendingPlan: () => void;
70
+ nolanRunning: boolean;
71
+ readonly ensureNolanSession: () => Promise<AgentSession>;
72
+ gitBranch: string | null;
73
+ injectedAutopilotPrompts: string[];
74
+ readonly broadcastError: (type: "error" | "nolan_error" | "autopilot_error", logLabel: string, err: unknown) => void;
75
+ pendingNolanModel: {
76
+ provider: Provider;
77
+ model: string;
78
+ } | null;
79
+ readonly syncNolanModel: (provider: Provider, model: string) => Promise<void>;
80
+ nolanAbort: AbortController;
81
+ nolanSession: AgentSession | null;
82
+ readonly runTasks: (startId: string | null, all: boolean) => Promise<void>;
83
+ readonly auth: AuthStorage;
84
+ localProbes: LocalEndpointProbe[];
85
+ readonly localModelBlocker: (modelId: string) => Promise<string | undefined>;
86
+ nolanModelOverride: NolanModelPref | null;
87
+ readonly syncNolanAutoModel: (provider: Provider, model: string) => Promise<void>;
88
+ autopilotReviewing: boolean;
89
+ taskRunAll: boolean;
90
+ nolanAutoAbort: AbortController;
91
+ nolanAutoSession: AgentSession | null;
92
+ pendingCancelDrain: {
93
+ generation: number;
94
+ text: string;
95
+ } | null;
96
+ readonly CANCEL_TIMEOUT_MS: number;
97
+ readonly deactivateApprovedPlan: () => void;
98
+ readonly activateApprovedPlan: (planPath: string | undefined) => Promise<number>;
99
+ readonly planProgressPayload: () => {
100
+ total: number;
101
+ completed: number[];
102
+ };
103
+ readonly authStatusPayload: () => Promise<{
104
+ providers: (AuthProviderMeta & {
105
+ connected: boolean;
106
+ connectedMethods: AuthMethod[];
107
+ activeMethod?: AuthMethod | undefined;
108
+ oauthExhaustedUntil?: number | undefined;
109
+ priorityNote?: string | undefined;
110
+ methodGuidance: AuthMethodMeta[];
111
+ })[];
112
+ }>;
113
+ readonly broadcastAll: (type: string, data: unknown) => void;
114
+ oauthInFlight: boolean;
115
+ readonly oauthInFlightProviders: Set<string>;
116
+ readonly authCallbacks: () => OAuthLoginCallbacks;
117
+ pendingCode: ((code: string) => void) | null;
118
+ readonly elicitations: ElicitationBridge;
119
+ readonly localStatePayload: () => {
120
+ endpoints: {
121
+ id: string;
122
+ label: string;
123
+ baseUrl: string;
124
+ kind: LocalEndpointKind;
125
+ custom: boolean;
126
+ reachable: boolean;
127
+ reason?: string | undefined;
128
+ models: {
129
+ id: string;
130
+ rawId: string;
131
+ contextWindow: number;
132
+ contextWindowKnown: boolean;
133
+ supportsTools: boolean;
134
+ supportsImages: boolean;
135
+ supportsThinking: boolean;
136
+ loaded?: boolean | undefined;
137
+ }[];
138
+ }[];
139
+ };
140
+ readonly scanLocalModels: (force: boolean) => Promise<LocalEndpointProbe[]>;
141
+ hfPull: HfPullState | null;
142
+ readonly hfPullPayload: (s: HfPullState) => Record<string, unknown>;
143
+ readonly hfSearch: (query: string) => Promise<HfSearchRow[]>;
144
+ readonly startHfPull: (repo: string) => Promise<Record<string, unknown>>;
145
+ readonly cancelHfPull: () => boolean;
146
+ serveController: ServeController | null;
147
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=route-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-context.js","sourceRoot":"","sources":["../../src/app-sidecar/route-context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type http from "node:http";
2
+ import type { SessionRouteContext } from "./route-context.js";
3
+ export declare function handleRunControlRoutes(ctx: SessionRouteContext, req: http.IncomingMessage, res: http.ServerResponse, url: string, method: string): boolean;