@prestyj/cli 5.9.0 → 5.10.0

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 (321) hide show
  1. package/README.md +1 -1
  2. package/assets/skills/evidence-led-ui/SKILL.md +1 -1
  3. package/dist/app-sidecar.js +374 -14
  4. package/dist/app-sidecar.js.map +1 -1
  5. package/dist/chat-agents/general.test.js +5 -3
  6. package/dist/chat-agents/general.test.js.map +1 -1
  7. package/dist/chat-agents/memory.d.ts.map +1 -1
  8. package/dist/chat-agents/memory.js +14 -5
  9. package/dist/chat-agents/memory.js.map +1 -1
  10. package/dist/chat-agents/memory.test.js +11 -1
  11. package/dist/chat-agents/memory.test.js.map +1 -1
  12. package/dist/chat-agents/shared.js +1 -1
  13. package/dist/chat-agents/shared.js.map +1 -1
  14. package/dist/chat-agents/specialists.test.js +3 -2
  15. package/dist/chat-agents/specialists.test.js.map +1 -1
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/cli.js +16 -4
  18. package/dist/cli.js.map +1 -1
  19. package/dist/config.d.ts +14 -0
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +41 -2
  22. package/dist/config.js.map +1 -1
  23. package/dist/config.test.js +61 -1
  24. package/dist/config.test.js.map +1 -1
  25. package/dist/core/agent-mcp-passthrough.test.d.ts +2 -0
  26. package/dist/core/agent-mcp-passthrough.test.d.ts.map +1 -0
  27. package/dist/core/agent-mcp-passthrough.test.js +61 -0
  28. package/dist/core/agent-mcp-passthrough.test.js.map +1 -0
  29. package/dist/core/agent-session-add-dir.test.d.ts +2 -0
  30. package/dist/core/agent-session-add-dir.test.d.ts.map +1 -0
  31. package/dist/core/agent-session-add-dir.test.js +110 -0
  32. package/dist/core/agent-session-add-dir.test.js.map +1 -0
  33. package/dist/core/agent-session-compaction.test.js +4 -7
  34. package/dist/core/agent-session-compaction.test.js.map +1 -1
  35. package/dist/core/agent-session-marker-anchors.test.d.ts +2 -0
  36. package/dist/core/agent-session-marker-anchors.test.d.ts.map +1 -0
  37. package/dist/core/agent-session-marker-anchors.test.js +147 -0
  38. package/dist/core/agent-session-marker-anchors.test.js.map +1 -0
  39. package/dist/core/agent-session-memory-tail.test.js +4 -7
  40. package/dist/core/agent-session-memory-tail.test.js.map +1 -1
  41. package/dist/core/agent-session-queue.test.js +4 -7
  42. package/dist/core/agent-session-queue.test.js.map +1 -1
  43. package/dist/core/agent-session-subagent-policy.test.js +7 -3
  44. package/dist/core/agent-session-subagent-policy.test.js.map +1 -1
  45. package/dist/core/agent-session.d.ts +42 -0
  46. package/dist/core/agent-session.d.ts.map +1 -1
  47. package/dist/core/agent-session.js +93 -7
  48. package/dist/core/agent-session.js.map +1 -1
  49. package/dist/core/agent-tools-allowlist.test.js +5 -3
  50. package/dist/core/agent-tools-allowlist.test.js.map +1 -1
  51. package/dist/core/agents.d.ts +11 -0
  52. package/dist/core/agents.d.ts.map +1 -1
  53. package/dist/core/agents.js +21 -0
  54. package/dist/core/agents.js.map +1 -1
  55. package/dist/core/agents.test.d.ts +2 -0
  56. package/dist/core/agents.test.d.ts.map +1 -0
  57. package/dist/core/agents.test.js +67 -0
  58. package/dist/core/agents.test.js.map +1 -0
  59. package/dist/core/auth-providers.js +1 -1
  60. package/dist/core/auth-providers.js.map +1 -1
  61. package/dist/core/compaction/compactor.test.js +1 -1
  62. package/dist/core/compaction/compactor.test.js.map +1 -1
  63. package/dist/core/compaction/token-estimator.test.js +1 -1
  64. package/dist/core/compaction/token-estimator.test.js.map +1 -1
  65. package/dist/core/encode-cwd.d.ts +17 -0
  66. package/dist/core/encode-cwd.d.ts.map +1 -1
  67. package/dist/core/encode-cwd.js +20 -7
  68. package/dist/core/encode-cwd.js.map +1 -1
  69. package/dist/core/encode-cwd.test.js +20 -1
  70. package/dist/core/encode-cwd.test.js.map +1 -1
  71. package/dist/core/ideal-review.d.ts.map +1 -1
  72. package/dist/core/ideal-review.js +6 -1
  73. package/dist/core/ideal-review.js.map +1 -1
  74. package/dist/core/ideal-review.test.js +7 -2
  75. package/dist/core/ideal-review.test.js.map +1 -1
  76. package/dist/core/local-endpoint-store.d.ts +50 -0
  77. package/dist/core/local-endpoint-store.d.ts.map +1 -0
  78. package/dist/core/local-endpoint-store.js +201 -0
  79. package/dist/core/local-endpoint-store.js.map +1 -0
  80. package/dist/core/local-endpoint-store.test.d.ts +2 -0
  81. package/dist/core/local-endpoint-store.test.d.ts.map +1 -0
  82. package/dist/core/local-endpoint-store.test.js +131 -0
  83. package/dist/core/local-endpoint-store.test.js.map +1 -0
  84. package/dist/core/lsp/client.d.ts +50 -0
  85. package/dist/core/lsp/client.d.ts.map +1 -1
  86. package/dist/core/lsp/client.js +158 -13
  87. package/dist/core/lsp/client.js.map +1 -1
  88. package/dist/core/lsp/jsonrpc.d.ts +38 -1
  89. package/dist/core/lsp/jsonrpc.d.ts.map +1 -1
  90. package/dist/core/lsp/jsonrpc.js +13 -1
  91. package/dist/core/lsp/jsonrpc.js.map +1 -1
  92. package/dist/core/lsp/manager.d.ts.map +1 -1
  93. package/dist/core/lsp/manager.js +23 -2
  94. package/dist/core/lsp/manager.js.map +1 -1
  95. package/dist/core/lsp/manager.test.js +32 -1
  96. package/dist/core/lsp/manager.test.js.map +1 -1
  97. package/dist/core/lsp/test-support.d.ts +18 -0
  98. package/dist/core/lsp/test-support.d.ts.map +1 -0
  99. package/dist/core/lsp/test-support.js +27 -0
  100. package/dist/core/lsp/test-support.js.map +1 -0
  101. package/dist/core/lsp/uri.test.d.ts +2 -0
  102. package/dist/core/lsp/uri.test.d.ts.map +1 -0
  103. package/dist/core/lsp/uri.test.js +56 -0
  104. package/dist/core/lsp/uri.test.js.map +1 -0
  105. package/dist/core/lsp/windows.test.d.ts +2 -0
  106. package/dist/core/lsp/windows.test.d.ts.map +1 -0
  107. package/dist/core/lsp/windows.test.js +251 -0
  108. package/dist/core/lsp/windows.test.js.map +1 -0
  109. package/dist/core/mcp/resolve-stdio.d.ts +35 -0
  110. package/dist/core/mcp/resolve-stdio.d.ts.map +1 -1
  111. package/dist/core/mcp/resolve-stdio.js +80 -1
  112. package/dist/core/mcp/resolve-stdio.js.map +1 -1
  113. package/dist/core/mcp/resolve-stdio.test.js +99 -4
  114. package/dist/core/mcp/resolve-stdio.test.js.map +1 -1
  115. package/dist/core/network-guard.d.ts +47 -0
  116. package/dist/core/network-guard.d.ts.map +1 -0
  117. package/dist/core/network-guard.js +208 -0
  118. package/dist/core/network-guard.js.map +1 -0
  119. package/dist/core/network-guard.test.d.ts +2 -0
  120. package/dist/core/network-guard.test.d.ts.map +1 -0
  121. package/dist/core/network-guard.test.js +72 -0
  122. package/dist/core/network-guard.test.js.map +1 -0
  123. package/dist/core/persistent-shell.d.ts +3 -1
  124. package/dist/core/persistent-shell.d.ts.map +1 -1
  125. package/dist/core/persistent-shell.js +13 -3
  126. package/dist/core/persistent-shell.js.map +1 -1
  127. package/dist/core/process-manager-dev-server-repro.test.js +34 -12
  128. package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
  129. package/dist/core/process-manager.d.ts +1 -1
  130. package/dist/core/process-manager.d.ts.map +1 -1
  131. package/dist/core/process-manager.js +23 -13
  132. package/dist/core/process-manager.js.map +1 -1
  133. package/dist/core/project-discovery.d.ts +7 -0
  134. package/dist/core/project-discovery.d.ts.map +1 -1
  135. package/dist/core/project-discovery.js +40 -9
  136. package/dist/core/project-discovery.js.map +1 -1
  137. package/dist/core/project-discovery.test.js +102 -1
  138. package/dist/core/project-discovery.test.js.map +1 -1
  139. package/dist/core/prompt-commands.d.ts.map +1 -1
  140. package/dist/core/prompt-commands.js +89 -156
  141. package/dist/core/prompt-commands.js.map +1 -1
  142. package/dist/core/prompt-commands.test.js +4 -10
  143. package/dist/core/prompt-commands.test.js.map +1 -1
  144. package/dist/core/radio.test.js +4 -1
  145. package/dist/core/radio.test.js.map +1 -1
  146. package/dist/core/runtime-mode.d.ts +2 -0
  147. package/dist/core/runtime-mode.d.ts.map +1 -1
  148. package/dist/core/runtime-mode.js +4 -0
  149. package/dist/core/runtime-mode.js.map +1 -1
  150. package/dist/core/session-export.d.ts +98 -0
  151. package/dist/core/session-export.d.ts.map +1 -0
  152. package/dist/core/session-export.js +356 -0
  153. package/dist/core/session-export.js.map +1 -0
  154. package/dist/core/session-export.test.d.ts +2 -0
  155. package/dist/core/session-export.test.d.ts.map +1 -0
  156. package/dist/core/session-export.test.js +353 -0
  157. package/dist/core/session-export.test.js.map +1 -0
  158. package/dist/core/session-storage.d.ts.map +1 -1
  159. package/dist/core/session-storage.js +25 -1
  160. package/dist/core/session-storage.js.map +1 -1
  161. package/dist/core/session-storage.test.js +4 -1
  162. package/dist/core/session-storage.test.js.map +1 -1
  163. package/dist/core/settings-manager.d.ts +5 -0
  164. package/dist/core/settings-manager.d.ts.map +1 -1
  165. package/dist/core/settings-manager.js +10 -0
  166. package/dist/core/settings-manager.js.map +1 -1
  167. package/dist/core/setup-history.d.ts +0 -6
  168. package/dist/core/setup-history.d.ts.map +1 -1
  169. package/dist/core/setup-history.js +2 -18
  170. package/dist/core/setup-history.js.map +1 -1
  171. package/dist/core/setup-history.test.js +11 -26
  172. package/dist/core/setup-history.test.js.map +1 -1
  173. package/dist/core/skills-routing.test.js +3 -1
  174. package/dist/core/skills-routing.test.js.map +1 -1
  175. package/dist/core/slash-commands.d.ts +18 -0
  176. package/dist/core/slash-commands.d.ts.map +1 -1
  177. package/dist/core/slash-commands.js +42 -10
  178. package/dist/core/slash-commands.js.map +1 -1
  179. package/dist/core/slash-commands.test.d.ts +2 -0
  180. package/dist/core/slash-commands.test.d.ts.map +1 -0
  181. package/dist/core/slash-commands.test.js +59 -0
  182. package/dist/core/slash-commands.test.js.map +1 -0
  183. package/dist/core/speed-benchmark.test.js +9 -3
  184. package/dist/core/speed-benchmark.test.js.map +1 -1
  185. package/dist/core/subagent-manager.d.ts +1 -1
  186. package/dist/core/subagent-manager.d.ts.map +1 -1
  187. package/dist/core/subagent-manager.js +9 -0
  188. package/dist/core/subagent-manager.js.map +1 -1
  189. package/dist/core/subagent-store.test.js +14 -2
  190. package/dist/core/subagent-store.test.js.map +1 -1
  191. package/dist/core/workspace-guard.d.ts +2 -0
  192. package/dist/core/workspace-guard.d.ts.map +1 -1
  193. package/dist/core/workspace-guard.js +4 -1
  194. package/dist/core/workspace-guard.js.map +1 -1
  195. package/dist/core/workspace-guard.test.js +21 -0
  196. package/dist/core/workspace-guard.test.js.map +1 -1
  197. package/dist/modes/json-mode.d.ts +7 -0
  198. package/dist/modes/json-mode.d.ts.map +1 -1
  199. package/dist/modes/json-mode.js +1 -0
  200. package/dist/modes/json-mode.js.map +1 -1
  201. package/dist/modes/subagent-worker-mode.d.ts +2 -0
  202. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  203. package/dist/modes/subagent-worker-mode.js.map +1 -1
  204. package/dist/system-prompt.d.ts +11 -1
  205. package/dist/system-prompt.d.ts.map +1 -1
  206. package/dist/system-prompt.js +39 -18
  207. package/dist/system-prompt.js.map +1 -1
  208. package/dist/system-prompt.test.js +33 -17
  209. package/dist/system-prompt.test.js.map +1 -1
  210. package/dist/test-support/fake-home.d.ts +20 -0
  211. package/dist/test-support/fake-home.d.ts.map +1 -0
  212. package/dist/test-support/fake-home.js +37 -0
  213. package/dist/test-support/fake-home.js.map +1 -0
  214. package/dist/tools/bash.d.ts +2 -1
  215. package/dist/tools/bash.d.ts.map +1 -1
  216. package/dist/tools/bash.js +22 -5
  217. package/dist/tools/bash.js.map +1 -1
  218. package/dist/tools/bash.test.js +122 -7
  219. package/dist/tools/bash.test.js.map +1 -1
  220. package/dist/tools/edit-robustness.test.js +3 -1
  221. package/dist/tools/edit-robustness.test.js.map +1 -1
  222. package/dist/tools/find.d.ts.map +1 -1
  223. package/dist/tools/find.js +4 -1
  224. package/dist/tools/find.js.map +1 -1
  225. package/dist/tools/grep.d.ts +3 -1
  226. package/dist/tools/grep.d.ts.map +1 -1
  227. package/dist/tools/grep.js +135 -11
  228. package/dist/tools/grep.js.map +1 -1
  229. package/dist/tools/grep.test.js +53 -0
  230. package/dist/tools/grep.test.js.map +1 -1
  231. package/dist/tools/index.d.ts +6 -0
  232. package/dist/tools/index.d.ts.map +1 -1
  233. package/dist/tools/index.js +3 -3
  234. package/dist/tools/index.js.map +1 -1
  235. package/dist/tools/overflow.test.js +4 -7
  236. package/dist/tools/overflow.test.js.map +1 -1
  237. package/dist/tools/path-utils.d.ts +15 -0
  238. package/dist/tools/path-utils.d.ts.map +1 -1
  239. package/dist/tools/path-utils.js +17 -0
  240. package/dist/tools/path-utils.js.map +1 -1
  241. package/dist/tools/path-utils.test.js +7 -2
  242. package/dist/tools/path-utils.test.js.map +1 -1
  243. package/dist/tools/prompt-hints.js +1 -1
  244. package/dist/tools/prompt-hints.js.map +1 -1
  245. package/dist/tools/search-code.d.ts.map +1 -1
  246. package/dist/tools/search-code.js +6 -4
  247. package/dist/tools/search-code.js.map +1 -1
  248. package/dist/tools/subagent.d.ts +1 -1
  249. package/dist/tools/subagent.d.ts.map +1 -1
  250. package/dist/tools/subagent.js +8 -0
  251. package/dist/tools/subagent.js.map +1 -1
  252. package/dist/tools/web-fetch.d.ts +2 -1
  253. package/dist/tools/web-fetch.d.ts.map +1 -1
  254. package/dist/tools/web-fetch.js +17 -6
  255. package/dist/tools/web-fetch.js.map +1 -1
  256. package/dist/tools/web-fetch.test.js +34 -0
  257. package/dist/tools/web-fetch.test.js.map +1 -1
  258. package/dist/tools/web-search.d.ts +2 -1
  259. package/dist/tools/web-search.d.ts.map +1 -1
  260. package/dist/tools/web-search.js +21 -5
  261. package/dist/tools/web-search.js.map +1 -1
  262. package/dist/ui/App.d.ts.map +1 -1
  263. package/dist/ui/App.js +5 -80
  264. package/dist/ui/App.js.map +1 -1
  265. package/dist/ui/app-items.d.ts +1 -12
  266. package/dist/ui/app-items.d.ts.map +1 -1
  267. package/dist/ui/app-items.js.map +1 -1
  268. package/dist/ui/components/Footer.d.ts +1 -1
  269. package/dist/ui/components/Footer.js +2 -2
  270. package/dist/ui/components/Footer.js.map +1 -1
  271. package/dist/ui/hooks/usePixelFixFlow.d.ts +1 -2
  272. package/dist/ui/hooks/usePixelFixFlow.d.ts.map +1 -1
  273. package/dist/ui/hooks/usePixelFixFlow.js +2 -5
  274. package/dist/ui/hooks/usePixelFixFlow.js.map +1 -1
  275. package/dist/ui/login.js +1 -1
  276. package/dist/ui/login.js.map +1 -1
  277. package/dist/ui/terminal-history-status-renderers.d.ts +1 -2
  278. package/dist/ui/terminal-history-status-renderers.d.ts.map +1 -1
  279. package/dist/ui/terminal-history-status-renderers.js +2 -15
  280. package/dist/ui/terminal-history-status-renderers.js.map +1 -1
  281. package/dist/ui/terminal-history.d.ts.map +1 -1
  282. package/dist/ui/terminal-history.js +2 -4
  283. package/dist/ui/terminal-history.js.map +1 -1
  284. package/dist/ui/thinking-level-cycle.test.js +8 -8
  285. package/dist/ui/thinking-level-cycle.test.js.map +1 -1
  286. package/dist/ui/transcript/MiscRows.d.ts +1 -4
  287. package/dist/ui/transcript/MiscRows.d.ts.map +1 -1
  288. package/dist/ui/transcript/MiscRows.js +2 -7
  289. package/dist/ui/transcript/MiscRows.js.map +1 -1
  290. package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
  291. package/dist/ui/transcript/TranscriptRenderer.js +1 -3
  292. package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
  293. package/dist/ui/transcript/presentation.d.ts +1 -9
  294. package/dist/ui/transcript/presentation.d.ts.map +1 -1
  295. package/dist/ui/transcript/presentation.js +0 -9
  296. package/dist/ui/transcript/presentation.js.map +1 -1
  297. package/dist/ui/transcript/spacing.d.ts +2 -2
  298. package/dist/ui/transcript/spacing.d.ts.map +1 -1
  299. package/dist/ui/transcript/spacing.js +0 -1
  300. package/dist/ui/transcript/spacing.js.map +1 -1
  301. package/dist/ui/transcript/spacing.test.js +1 -3
  302. package/dist/ui/transcript/spacing.test.js.map +1 -1
  303. package/dist/ui/tui-history-parity.test.js +2 -9
  304. package/dist/ui/tui-history-parity.test.js.map +1 -1
  305. package/dist/utils/github.d.ts +20 -0
  306. package/dist/utils/github.d.ts.map +1 -0
  307. package/dist/utils/github.js +65 -0
  308. package/dist/utils/github.js.map +1 -0
  309. package/dist/utils/github.test.d.ts +2 -0
  310. package/dist/utils/github.test.d.ts.map +1 -0
  311. package/dist/utils/github.test.js +23 -0
  312. package/dist/utils/github.test.js.map +1 -0
  313. package/dist/utils/process.d.ts +26 -3
  314. package/dist/utils/process.d.ts.map +1 -1
  315. package/dist/utils/process.js +68 -10
  316. package/dist/utils/process.js.map +1 -1
  317. package/dist/utils/process.test.d.ts +2 -0
  318. package/dist/utils/process.test.d.ts.map +1 -0
  319. package/dist/utils/process.test.js +42 -0
  320. package/dist/utils/process.test.js.map +1 -0
  321. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"ideal-review.js","sourceRoot":"","sources":["../../src/core/ideal-review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ideal-review.js","sourceRoot":"","sources":["../../src/core/ideal-review.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
+ import path from "node:path";
2
3
  import { buildIdealReviewMessage, buildReviewCoverageMessage, detectTestDrift, evaluateIdealReview, ReviewCoverageTracker, withReviewCoverageRequirements, } from "./ideal-review.js";
3
4
  describe("ReviewCoverageTracker", () => {
4
5
  it("counts only successful read callbacks after review starts", () => {
@@ -105,9 +106,13 @@ describe("buildIdealReviewMessage", () => {
105
106
  });
106
107
  describe("detectTestDrift", () => {
107
108
  const cwd = "/proj";
109
+ // Fixture paths are written POSIX-style for readability, but the code under
110
+ // test builds candidates with path.join/path.resolve — which on Windows
111
+ // yields `D:\proj\src\foo.test.ts`. Resolve BOTH sides so the lookup compares
112
+ // like with like instead of silently never matching.
108
113
  const exists = (files) => {
109
- const set = new Set(files);
110
- return (p) => set.has(p);
114
+ const set = new Set(files.map((f) => path.resolve(cwd, f)));
115
+ return (p) => set.has(path.resolve(cwd, p));
111
116
  };
112
117
  it("flags a changed source whose sibling test exists but was not touched", () => {
113
118
  const drift = detectTestDrift(["src/foo.ts"], cwd, exists(["/proj/src/foo.test.ts"]));
@@ -1 +1 @@
1
- {"version":3,"file":"ideal-review.test.js","sourceRoot":"","sources":["../../src/core/ideal-review.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ideal-review.test.js","sourceRoot":"","sources":["../../src/core/ideal-review.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC;YACjC,QAAQ,EAAE,CAAC,UAAU,CAAC;YACtB,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACzC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC;YACjC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;YAClC,OAAO,EAAE,CAAC,UAAU,CAAC;YACrB,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,0BAA0B,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,OAAO,GAAG,8BAA8B,CAAC,uBAAuB,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE;YAC7F,UAAU;YACV,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACnC,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACnC,YAAY,EAAE,GAAG;YACjB,SAAS,EAAE,CAAC;YACZ,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACnC,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE,CAAC;YACZ,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,OAAO,GAAG,uBAAuB,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAE/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,OAAO,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4DAA4D,CAAC,CAAC;QAChG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,OAAO,GAAG,uBAAuB,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC;IACpB,4EAA4E;IAC5E,wEAAwE;IACxE,8EAA8E;IAC9E,qDAAqD;IACrD,MAAM,MAAM,GAAG,CAAC,KAAe,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,KAAK,GAAG,eAAe,CAC3B,CAAC,YAAY,EAAE,iBAAiB,CAAC,EACjC,GAAG,EACH,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAClC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { AuthStorage, type LocalEndpoint } from "@prestyj/core";
2
+ /** What the caller supplies when adding an endpoint. */
3
+ export interface LocalEndpointInput {
4
+ label?: string;
5
+ baseUrl: string;
6
+ apiKey?: string;
7
+ }
8
+ export declare class LocalEndpointError extends Error {
9
+ }
10
+ /**
11
+ * Where this store reads and writes. Both default to the real user's files;
12
+ * tests inject a temp directory so they never touch `~/.ezcoder` — note that
13
+ * overriding `$HOME` is NOT a portable way to do that, since `os.homedir()`
14
+ * reads `USERPROFILE` on Windows.
15
+ */
16
+ export interface LocalEndpointStoreOptions {
17
+ /** Path to the ezcoder-app settings file (defaults to `~/.ezcoder/ezcoder-app.json`). */
18
+ settingsFile?: string;
19
+ /** Auth storage holding the `local:<id>` credentials. */
20
+ auth?: AuthStorage;
21
+ }
22
+ /**
23
+ * Normalize a user-typed URL into the OpenAI-compatible base we call.
24
+ * Accepts `host:port`, a bare root, or a full `/v1` URL, and tolerates a pasted
25
+ * `/v1/chat/completions` or `/v1/models` (people copy from docs).
26
+ */
27
+ export declare function normalizeLocalBaseUrl(input: string): string;
28
+ /** User-added endpoints, in insertion order. Never throws on a corrupt file. */
29
+ export declare function listCustomEndpoints(options?: LocalEndpointStoreOptions): Promise<LocalEndpoint[]>;
30
+ /** Well-known endpoints first, then the user's own — the probe/scan order. */
31
+ export declare function listAllEndpoints(options?: LocalEndpointStoreOptions): Promise<LocalEndpoint[]>;
32
+ /**
33
+ * Add a custom endpoint and write its `local:<id>` credential. Re-adding the
34
+ * same host updates it (that's how a user fixes a mistyped key) instead of
35
+ * creating a second row for the same server.
36
+ */
37
+ export declare function addCustomEndpoint(input: LocalEndpointInput, options?: LocalEndpointStoreOptions): Promise<LocalEndpoint>;
38
+ /**
39
+ * Remove a custom endpoint and its credential. Built-in endpoints can't be
40
+ * removed (they're discovered, not configured) — that's an error, not a no-op,
41
+ * so a UI bug doesn't silently do nothing.
42
+ */
43
+ export declare function removeCustomEndpoint(id: string, options?: LocalEndpointStoreOptions): Promise<void>;
44
+ /**
45
+ * Make sure every endpoint we're about to serve models from has a credential
46
+ * carrying its baseUrl — otherwise `stream()` has no endpoint to talk to.
47
+ * Called after each scan, so a fresh install works with zero setup.
48
+ */
49
+ export declare function syncEndpointCredentials(endpoints: readonly LocalEndpoint[], options?: LocalEndpointStoreOptions): Promise<void>;
50
+ //# sourceMappingURL=local-endpoint-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-endpoint-store.d.ts","sourceRoot":"","sources":["../../src/core/local-endpoint-store.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,WAAW,EAGX,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AASD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuB3D;AA0DD,gFAAgF;AAChF,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CAE1B;AAED,8EAA8E;AAC9E,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CAE1B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,aAAa,CAAC,CAuCxB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,SAAS,aAAa,EAAE,EACnC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Persistence for user-added local model endpoints.
3
+ *
4
+ * The four well-known servers (Ollama, LM Studio, llama.cpp, vLLM) are probed
5
+ * without configuration; this store holds only the extra endpoints a user typed
6
+ * in — a moved port, a remote self-hosted box, an OpenAI-compatible gateway.
7
+ *
8
+ * Endpoints live in `~/.ezcoder/ezcoder-app.json` under `localEndpoints`; each one's key
9
+ * (and, for keyed servers, its token) lives in `~/.ezcoder/auth.json` as a
10
+ * `local:<id>` credential, which is also what carries the baseUrl into the
11
+ * stream call. The two are kept in sync here so the UI never has to.
12
+ */
13
+ import fs from "node:fs/promises";
14
+ import os from "node:os";
15
+ import path from "node:path";
16
+ import { AuthStorage, DEFAULT_LOCAL_ENDPOINTS, clearLocalDiscoveryCache, } from "@prestyj/core";
17
+ export class LocalEndpointError extends Error {
18
+ }
19
+ const RESERVED_IDS = new Set(DEFAULT_LOCAL_ENDPOINTS.map((e) => e.id));
20
+ const MAX_CUSTOM_ENDPOINTS = 20;
21
+ function appSettingsFile(override) {
22
+ return override ?? path.join(os.homedir(), ".ezcoder", "ezcoder-app.json");
23
+ }
24
+ /**
25
+ * Normalize a user-typed URL into the OpenAI-compatible base we call.
26
+ * Accepts `host:port`, a bare root, or a full `/v1` URL, and tolerates a pasted
27
+ * `/v1/chat/completions` or `/v1/models` (people copy from docs).
28
+ */
29
+ export function normalizeLocalBaseUrl(input) {
30
+ const trimmed = input.trim();
31
+ if (!trimmed)
32
+ throw new LocalEndpointError("Endpoint URL is required.");
33
+ const scheme = /^([a-z][a-z0-9+.-]*):\/\//i.exec(trimmed)?.[1]?.toLowerCase();
34
+ if (scheme && scheme !== "http" && scheme !== "https") {
35
+ throw new LocalEndpointError("Endpoint URL must use http or https.");
36
+ }
37
+ // Bare `host:port` is the common case — assume plain http, like the servers do.
38
+ const withScheme = scheme ? trimmed : `http://${trimmed}`;
39
+ let url;
40
+ try {
41
+ url = new URL(withScheme);
42
+ }
43
+ catch {
44
+ throw new LocalEndpointError(`"${input}" is not a valid URL.`);
45
+ }
46
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
47
+ throw new LocalEndpointError("Endpoint URL must use http or https.");
48
+ }
49
+ if (!url.hostname)
50
+ throw new LocalEndpointError("Endpoint URL is missing a host.");
51
+ let pathname = url.pathname.replace(/\/+$/, "");
52
+ pathname = pathname.replace(/\/(?:chat\/completions|completions|models)$/, "");
53
+ if (!/\/v\d+$/.test(pathname))
54
+ pathname = `${pathname}/v1`;
55
+ return `${url.protocol}//${url.host}${pathname}`;
56
+ }
57
+ /** Slug derived from the URL, e.g. `custom-192-168-1-4-8000`. Stable per host:port. */
58
+ function endpointIdFor(baseUrl) {
59
+ const { host } = new URL(baseUrl);
60
+ const slug = host
61
+ .replace(/[^a-z0-9]+/gi, "-")
62
+ .replace(/^-|-$/g, "")
63
+ .toLowerCase();
64
+ return `custom-${slug || "endpoint"}`;
65
+ }
66
+ function labelFor(baseUrl, label) {
67
+ const trimmed = label?.trim();
68
+ if (trimmed)
69
+ return trimmed;
70
+ return new URL(baseUrl).host;
71
+ }
72
+ // ── settings file I/O ──────────────────────────────────────
73
+ /**
74
+ * Read/modify/write the whole settings object rather than a typed subset, so a
75
+ * key written by another part of the app (or a newer version) survives.
76
+ */
77
+ async function readSettings(file) {
78
+ try {
79
+ const raw = JSON.parse(await fs.readFile(appSettingsFile(file), "utf-8"));
80
+ return raw && typeof raw === "object" ? raw : {};
81
+ }
82
+ catch {
83
+ return {};
84
+ }
85
+ }
86
+ async function writeSettings(settings, file) {
87
+ const target = appSettingsFile(file);
88
+ await fs.mkdir(path.dirname(target), { recursive: true });
89
+ await fs.writeFile(target, JSON.stringify(settings, null, 2), "utf-8");
90
+ }
91
+ function parseStored(value) {
92
+ if (!Array.isArray(value))
93
+ return [];
94
+ const endpoints = [];
95
+ for (const entry of value) {
96
+ if (!entry || typeof entry !== "object")
97
+ continue;
98
+ const { id, label, baseUrl, apiKey } = entry;
99
+ if (typeof id !== "string" || typeof baseUrl !== "string")
100
+ continue;
101
+ endpoints.push({
102
+ id,
103
+ label: typeof label === "string" && label ? label : baseUrl,
104
+ baseUrl,
105
+ kind: "custom",
106
+ custom: true,
107
+ ...(typeof apiKey === "string" && apiKey ? { apiKey } : {}),
108
+ });
109
+ }
110
+ return endpoints;
111
+ }
112
+ /** User-added endpoints, in insertion order. Never throws on a corrupt file. */
113
+ export async function listCustomEndpoints(options = {}) {
114
+ return parseStored((await readSettings(options.settingsFile))["localEndpoints"]);
115
+ }
116
+ /** Well-known endpoints first, then the user's own — the probe/scan order. */
117
+ export async function listAllEndpoints(options = {}) {
118
+ return [...DEFAULT_LOCAL_ENDPOINTS, ...(await listCustomEndpoints(options))];
119
+ }
120
+ /**
121
+ * Add a custom endpoint and write its `local:<id>` credential. Re-adding the
122
+ * same host updates it (that's how a user fixes a mistyped key) instead of
123
+ * creating a second row for the same server.
124
+ */
125
+ export async function addCustomEndpoint(input, options = {}) {
126
+ const auth = options.auth ?? new AuthStorage();
127
+ const baseUrl = normalizeLocalBaseUrl(input.baseUrl);
128
+ const id = endpointIdFor(baseUrl);
129
+ if (RESERVED_IDS.has(id)) {
130
+ throw new LocalEndpointError(`"${id}" is a built-in endpoint id.`);
131
+ }
132
+ const existing = await listCustomEndpoints(options);
133
+ const builtIn = DEFAULT_LOCAL_ENDPOINTS.find((e) => e.baseUrl === baseUrl);
134
+ if (builtIn) {
135
+ throw new LocalEndpointError(`${baseUrl} is already probed automatically as ${builtIn.label}.`);
136
+ }
137
+ if (!existing.some((e) => e.id === id) && existing.length >= MAX_CUSTOM_ENDPOINTS) {
138
+ throw new LocalEndpointError(`At most ${MAX_CUSTOM_ENDPOINTS} custom endpoints.`);
139
+ }
140
+ const endpoint = {
141
+ id,
142
+ label: labelFor(baseUrl, input.label),
143
+ baseUrl,
144
+ kind: "custom",
145
+ custom: true,
146
+ ...(input.apiKey?.trim() ? { apiKey: input.apiKey.trim() } : {}),
147
+ };
148
+ const next = existing.some((e) => e.id === id)
149
+ ? existing.map((e) => (e.id === id ? endpoint : e))
150
+ : [...existing, endpoint];
151
+ const settings = await readSettings(options.settingsFile);
152
+ settings["localEndpoints"] = next.map(({ id: eid, label, baseUrl: url, apiKey }) => ({
153
+ id: eid,
154
+ label,
155
+ baseUrl: url,
156
+ ...(apiKey ? { apiKey } : {}),
157
+ }));
158
+ await writeSettings(settings, options.settingsFile);
159
+ await auth.setLocalEndpoint(id, baseUrl, endpoint.apiKey);
160
+ clearLocalDiscoveryCache();
161
+ return endpoint;
162
+ }
163
+ /**
164
+ * Remove a custom endpoint and its credential. Built-in endpoints can't be
165
+ * removed (they're discovered, not configured) — that's an error, not a no-op,
166
+ * so a UI bug doesn't silently do nothing.
167
+ */
168
+ export async function removeCustomEndpoint(id, options = {}) {
169
+ const auth = options.auth ?? new AuthStorage();
170
+ if (RESERVED_IDS.has(id)) {
171
+ throw new LocalEndpointError(`${id} is a built-in endpoint and can't be removed.`);
172
+ }
173
+ const existing = await listCustomEndpoints(options);
174
+ if (!existing.some((e) => e.id === id)) {
175
+ throw new LocalEndpointError(`Unknown local endpoint "${id}".`);
176
+ }
177
+ const settings = await readSettings(options.settingsFile);
178
+ settings["localEndpoints"] = existing
179
+ .filter((e) => e.id !== id)
180
+ .map(({ id: eid, label, baseUrl, apiKey }) => ({
181
+ id: eid,
182
+ label,
183
+ baseUrl,
184
+ ...(apiKey ? { apiKey } : {}),
185
+ }));
186
+ await writeSettings(settings, options.settingsFile);
187
+ await auth.removeLocalEndpoint(id);
188
+ clearLocalDiscoveryCache();
189
+ }
190
+ /**
191
+ * Make sure every endpoint we're about to serve models from has a credential
192
+ * carrying its baseUrl — otherwise `stream()` has no endpoint to talk to.
193
+ * Called after each scan, so a fresh install works with zero setup.
194
+ */
195
+ export async function syncEndpointCredentials(endpoints, options = {}) {
196
+ const auth = options.auth ?? new AuthStorage();
197
+ for (const endpoint of endpoints) {
198
+ await auth.setLocalEndpoint(endpoint.id, endpoint.baseUrl, endpoint.apiKey);
199
+ }
200
+ }
201
+ //# sourceMappingURL=local-endpoint-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-endpoint-store.js","sourceRoot":"","sources":["../../src/core/local-endpoint-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local-endpoint-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-endpoint-store.test.d.ts","sourceRoot":"","sources":["../../src/core/local-endpoint-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,131 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { AuthStorage } from "@prestyj/core";
6
+ import { LocalEndpointError, addCustomEndpoint, listAllEndpoints, listCustomEndpoints, normalizeLocalBaseUrl, removeCustomEndpoint, syncEndpointCredentials, } from "./local-endpoint-store.js";
7
+ let dir;
8
+ let opts;
9
+ let auth;
10
+ // Both file paths are injected rather than redirected via $HOME: os.homedir()
11
+ // reads USERPROFILE on Windows, so a HOME override silently writes to the real
12
+ // ~/.ezcoder there — which leaks state between tests and pollutes the user's files.
13
+ beforeEach(async () => {
14
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-local-endpoints-"));
15
+ auth = new AuthStorage(path.join(dir, "auth.json"));
16
+ opts = { settingsFile: path.join(dir, "ezcoder-app.json"), auth };
17
+ });
18
+ afterEach(async () => {
19
+ await fs.rm(dir, { recursive: true, force: true });
20
+ });
21
+ async function settings() {
22
+ return JSON.parse(await fs.readFile(opts.settingsFile, "utf-8"));
23
+ }
24
+ describe("normalizeLocalBaseUrl", () => {
25
+ it("accepts the shapes users actually paste", () => {
26
+ expect(normalizeLocalBaseUrl("127.0.0.1:1234")).toBe("http://127.0.0.1:1234/v1");
27
+ expect(normalizeLocalBaseUrl("http://localhost:8000")).toBe("http://localhost:8000/v1");
28
+ expect(normalizeLocalBaseUrl("http://localhost:8000/v1")).toBe("http://localhost:8000/v1");
29
+ expect(normalizeLocalBaseUrl(" http://localhost:8000/v1/ ")).toBe("http://localhost:8000/v1");
30
+ expect(normalizeLocalBaseUrl("http://box.lan:8080/v1/chat/completions")).toBe("http://box.lan:8080/v1");
31
+ expect(normalizeLocalBaseUrl("http://box.lan:8080/v1/models")).toBe("http://box.lan:8080/v1");
32
+ // A gateway on a sub-path keeps the path.
33
+ expect(normalizeLocalBaseUrl("https://gw.example.com/openai")).toBe("https://gw.example.com/openai/v1");
34
+ });
35
+ it("rejects empty, malformed, and non-http URLs", () => {
36
+ expect(() => normalizeLocalBaseUrl(" ")).toThrow(LocalEndpointError);
37
+ expect(() => normalizeLocalBaseUrl("http://")).toThrow(LocalEndpointError);
38
+ expect(() => normalizeLocalBaseUrl("ftp://host/v1")).toThrow(LocalEndpointError);
39
+ });
40
+ });
41
+ describe("custom endpoints", () => {
42
+ it("adds an endpoint, persists it, and writes its auth credential", async () => {
43
+ const endpoint = await addCustomEndpoint({ label: "Workstation", baseUrl: "192.168.1.4:8000", apiKey: "secret" }, opts);
44
+ expect(endpoint).toMatchObject({
45
+ id: "custom-192-168-1-4-8000",
46
+ label: "Workstation",
47
+ baseUrl: "http://192.168.1.4:8000/v1",
48
+ kind: "custom",
49
+ custom: true,
50
+ apiKey: "secret",
51
+ });
52
+ expect(await listCustomEndpoints(opts)).toEqual([endpoint]);
53
+ const creds = await auth.getCredentials("local:custom-192-168-1-4-8000");
54
+ expect(creds).toMatchObject({ accessToken: "secret", baseUrl: "http://192.168.1.4:8000/v1" });
55
+ expect(creds.expiresAt).toBeGreaterThan(Date.now());
56
+ expect(await auth.hasProviderAuth("local")).toBe(true);
57
+ });
58
+ it("defaults the label to the host and the key to a placeholder", async () => {
59
+ await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
60
+ const stored = (await listCustomEndpoints(opts))[0];
61
+ expect(stored.label).toBe("localhost:9999");
62
+ expect(stored.apiKey).toBeUndefined();
63
+ expect(await auth.getCredentials("local:custom-localhost-9999")).toMatchObject({
64
+ accessToken: "local",
65
+ });
66
+ });
67
+ it("updates in place when the same host is re-added", async () => {
68
+ await addCustomEndpoint({ baseUrl: "http://localhost:9999", apiKey: "wrong" }, opts);
69
+ await addCustomEndpoint({ label: "Fixed", baseUrl: "http://localhost:9999/v1", apiKey: "right" }, opts);
70
+ const stored = await listCustomEndpoints(opts);
71
+ expect(stored).toHaveLength(1);
72
+ expect(stored[0]).toMatchObject({ label: "Fixed", apiKey: "right" });
73
+ expect(await auth.getCredentials("local:custom-localhost-9999")).toMatchObject({
74
+ accessToken: "right",
75
+ });
76
+ });
77
+ it("refuses a URL already covered by a built-in endpoint", async () => {
78
+ await expect(addCustomEndpoint({ baseUrl: "http://127.0.0.1:11434/v1" }, opts)).rejects.toThrow(/already probed automatically as Ollama/);
79
+ });
80
+ it("removes an endpoint and its credential", async () => {
81
+ await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
82
+ await removeCustomEndpoint("custom-localhost-9999", opts);
83
+ expect(await listCustomEndpoints(opts)).toEqual([]);
84
+ expect(await auth.getCredentials("local:custom-localhost-9999")).toBeUndefined();
85
+ expect(await auth.hasProviderAuth("local")).toBe(false);
86
+ });
87
+ it("refuses to remove a built-in or unknown endpoint", async () => {
88
+ await expect(removeCustomEndpoint("ollama", opts)).rejects.toThrow(/built-in/);
89
+ await expect(removeCustomEndpoint("custom-nope", opts)).rejects.toThrow(/Unknown local/);
90
+ });
91
+ it("preserves unrelated ezcoder-app.json keys", async () => {
92
+ await fs.writeFile(opts.settingsFile, JSON.stringify({ projectsRoot: "/tmp/projects", autopilot: { "/a": true } }), "utf-8");
93
+ await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
94
+ expect(await settings()).toMatchObject({
95
+ projectsRoot: "/tmp/projects",
96
+ autopilot: { "/a": true },
97
+ });
98
+ await removeCustomEndpoint("custom-localhost-9999", opts);
99
+ expect(await settings()).toMatchObject({ projectsRoot: "/tmp/projects" });
100
+ });
101
+ it("ignores a corrupt settings file instead of throwing", async () => {
102
+ await fs.writeFile(opts.settingsFile, "{not json", "utf-8");
103
+ expect(await listCustomEndpoints(opts)).toEqual([]);
104
+ });
105
+ it("lists built-in endpoints before custom ones", async () => {
106
+ await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
107
+ expect((await listAllEndpoints(opts)).map((e) => e.id)).toEqual([
108
+ "ollama",
109
+ "lmstudio",
110
+ "llamacpp",
111
+ "vllm",
112
+ "custom-localhost-9999",
113
+ ]);
114
+ });
115
+ });
116
+ describe("syncEndpointCredentials", () => {
117
+ it("writes a baseUrl-carrying credential for every endpoint", async () => {
118
+ await syncEndpointCredentials(await listAllEndpoints(opts), opts);
119
+ expect((await auth.listLocalEndpointIds()).sort()).toEqual([
120
+ "llamacpp",
121
+ "lmstudio",
122
+ "ollama",
123
+ "vllm",
124
+ ]);
125
+ expect(await auth.getCredentials("local:ollama")).toMatchObject({
126
+ baseUrl: "http://127.0.0.1:11434/v1",
127
+ accessToken: "local",
128
+ });
129
+ });
130
+ });
131
+ //# sourceMappingURL=local-endpoint-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-endpoint-store.test.js","sourceRoot":"","sources":["../../src/core/local-endpoint-store.test.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,34 @@ export interface LspDiagnostic {
16
16
  source?: string;
17
17
  code?: string | number;
18
18
  }
19
+ /**
20
+ * Canonical cache key for a `file://` URI.
21
+ *
22
+ * Diagnostics live in a Map keyed by URI: we `set` what the server sends and
23
+ * `get` what we built from the edited path, so the two must be the SAME STRING.
24
+ * There is no single canonical spelling of a file URI, and on Windows we and
25
+ * tsserver disagreed in two independent ways at once. Measured on CI:
26
+ *
27
+ * we sent: file:///c:/Users/RUNNER%7E1/…/main.ts
28
+ * server sent: file:///c%3A/Users/RUNNER~1/…/main.ts
29
+ *
30
+ * `~` is an RFC 3986 unreserved character that `pathToFileURL` percent-encodes
31
+ * and tsserver leaves literal; the drive colon is the reverse. Every lookup
32
+ * missed, so the diagnostics arrived (the wire trace shows `diagnostics=1`)
33
+ * and were then dropped on the floor — reported to the user as a clean file,
34
+ * because LSP degrades silently by design. 8.3 short names like `RUNNER~1` are
35
+ * not exotic: that IS the Windows temp path on GitHub runners, and `PROGRA~1`
36
+ * and friends show up in real user paths.
37
+ *
38
+ * Fix: decode percent-escapes and lower-case the drive letter, so both
39
+ * spellings collapse to one key. Used ONLY as a Map key — the URI actually put
40
+ * on the wire is still the properly encoded one from `pathToFileURL`.
41
+ *
42
+ * Windows paths are also case-insensitive, but case is deliberately NOT folded:
43
+ * both sides derive from the same path string, and folding would break the
44
+ * genuinely case-sensitive POSIX servers that share this code.
45
+ */
46
+ export declare function normalizeUri(uri: string): string;
19
47
  /**
20
48
  * One language-server process bound to one project root. Owns document sync
21
49
  * (didOpen / didChange / didSave with per-uri version counters), the
@@ -34,10 +62,19 @@ export declare class LspClient {
34
62
  private readonly activeProgressTokens;
35
63
  private alive;
36
64
  private readonly initializationOptions;
65
+ private stderrBuffer;
37
66
  constructor(spec: LspServerSpec, rootPath: string, command: ResolvedCommand);
38
67
  get isAlive(): boolean;
39
68
  /** True while the server reports indexing/analysis through LSP work progress. */
40
69
  get hasActiveProgress(): boolean;
70
+ /**
71
+ * Drain the server's stderr into a bounded ring, and mirror it to the debug
72
+ * log so a misbehaving server is diagnosable from `~/.ezcoder/*.log` alone.
73
+ * Bounded because a looping server can emit stderr without limit.
74
+ */
75
+ private captureStderr;
76
+ /** Most recent server stderr, for failure diagnostics. */
77
+ stderrTail(): string;
41
78
  initialize(timeoutMs: number): Promise<void>;
42
79
  /**
43
80
  * Sync `content` into the server's overlay for `filePath` — didOpen the
@@ -59,6 +96,19 @@ export declare class LspClient {
59
96
  * servers that ignore them (and stdin EOF reaps them when we die first).
60
97
  */
61
98
  shutdown(): void;
99
+ /**
100
+ * Force-kill the server and everything it spawned, immediately.
101
+ *
102
+ * For a server that never completed the handshake, the polite
103
+ * `shutdown`/`exit` sequence is pointless — it has already proven it isn't
104
+ * answering — so skip straight to the kill.
105
+ *
106
+ * Uses `killProcessTree`, not `proc.kill()`: language servers spawn children
107
+ * (typescript-language-server runs tsserver), Windows has no process groups,
108
+ * and killing only the parent leaves those children alive holding file
109
+ * handles in the project directory.
110
+ */
111
+ terminate(): void;
62
112
  private markDead;
63
113
  private waitForPublish;
64
114
  private pullDiagnostics;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEnE,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,GAAG,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAiCD;;;;;GAKG;AACH,qBAAa,SAAS;IAalB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAb3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqB;IAC1D,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAG7B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,EACjC,OAAO,EAAE,eAAe;IAmC1B,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,iFAAiF;IACjF,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAEK,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBlD;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IA0BvD;;;;OAIG;IACG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC;IAuBzF;;;;;OAKG;IACH,QAAQ,IAAI,IAAI;IAUhB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,cAAc;YAqBR,eAAe;CAqB9B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEnE,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,GAAG,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAyED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBhD;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IAclB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAd3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqB;IAC1D,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,YAAY,CAAM;gBAGP,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,EACjC,OAAO,EAAE,eAAe;IAsD1B,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,iFAAiF;IACjF,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAWrB,0DAA0D;IAC1D,UAAU,IAAI,MAAM;IAId,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BlD;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IA+BvD;;;;OAIG;IACG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC;IAuBzF;;;;;OAKG;IACH,QAAQ,IAAI,IAAI;IAUhB;;;;;;;;;;;OAWG;IACH,SAAS,IAAI,IAAI;IAMjB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,cAAc;YAwBR,eAAe;CAqB9B"}