@prestyj/cli 5.11.0 → 5.13.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 (466) hide show
  1. package/README.md +46 -36
  2. package/assets/skills/bulletproof/SKILL.md +158 -0
  3. package/assets/skills/bulletproof/references/agent-surface.md +82 -0
  4. package/assets/skills/bulletproof/references/audit-protocol.md +147 -0
  5. package/assets/skills/bulletproof/references/platform-playbooks.md +176 -0
  6. package/assets/skills/bulletproof/references/provenance.md +45 -0
  7. package/assets/skills/bulletproof/references/secure-defaults.md +108 -0
  8. package/assets/skills/bulletproof/references/supply-chain.md +76 -0
  9. package/assets/skills/bulletproof/references/threat-landscape.md +74 -0
  10. package/assets/skills/bulletproof/references/verification.md +65 -0
  11. package/assets/skills/compliance-guard/SKILL.md +251 -0
  12. package/assets/skills/compliance-guard/references/artifacts.md +186 -0
  13. package/assets/skills/compliance-guard/references/eu-uk.md +151 -0
  14. package/assets/skills/compliance-guard/references/exposure-triage.md +161 -0
  15. package/assets/skills/compliance-guard/references/lawsuit-vectors.md +141 -0
  16. package/assets/skills/compliance-guard/references/provenance.md +42 -0
  17. package/assets/skills/compliance-guard/references/sector-gates.md +173 -0
  18. package/assets/skills/compliance-guard/references/security-baseline.md +130 -0
  19. package/assets/skills/compliance-guard/references/trigger-map.md +163 -0
  20. package/assets/skills/compliance-guard/references/us.md +164 -0
  21. package/assets/skills/durable/SKILL.md +111 -0
  22. package/assets/skills/durable/references/backups-and-runtime.md +86 -0
  23. package/assets/skills/durable/references/migrations-and-schema.md +79 -0
  24. package/assets/skills/lean/SKILL.md +110 -0
  25. package/assets/skills/lean/references/memory-and-processes.md +98 -0
  26. package/assets/skills/lean/references/playbooks.md +107 -0
  27. package/dist/app-sidecar-auth-broadcast.test.js +111 -10
  28. package/dist/app-sidecar-auth-broadcast.test.js.map +1 -1
  29. package/dist/app-sidecar-sessions.test.js +1 -1
  30. package/dist/app-sidecar.js +210 -72
  31. package/dist/app-sidecar.js.map +1 -1
  32. package/dist/chat-agents/jiwa.test.js +1 -1
  33. package/dist/cli/auth.d.ts.map +1 -1
  34. package/dist/cli/auth.js +33 -36
  35. package/dist/cli/auth.js.map +1 -1
  36. package/dist/cli/mcp.js +30 -10
  37. package/dist/cli/mcp.js.map +1 -1
  38. package/dist/cli.d.ts.map +1 -1
  39. package/dist/cli.js +18 -5
  40. package/dist/cli.js.map +1 -1
  41. package/dist/config.d.ts +28 -5
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +50 -76
  44. package/dist/config.js.map +1 -1
  45. package/dist/config.test.js +56 -13
  46. package/dist/config.test.js.map +1 -1
  47. package/dist/core/agent-session-checkpoint-flush.test.js +2 -2
  48. package/dist/core/agent-session-compaction.test.js +60 -0
  49. package/dist/core/agent-session-compaction.test.js.map +1 -1
  50. package/dist/core/agent-session-crash-durability.test.js +3 -3
  51. package/dist/core/agent-session-model-switch.test.js +1 -1
  52. package/dist/core/agent-session-process-gate.test.js +7 -1
  53. package/dist/core/agent-session-process-gate.test.js.map +1 -1
  54. package/dist/core/agent-session-review-coverage.test.js +52 -1
  55. package/dist/core/agent-session-review-coverage.test.js.map +1 -1
  56. package/dist/core/agent-session-tool-tiers.test.d.ts +2 -0
  57. package/dist/core/agent-session-tool-tiers.test.d.ts.map +1 -0
  58. package/dist/core/agent-session-tool-tiers.test.js +138 -0
  59. package/dist/core/agent-session-tool-tiers.test.js.map +1 -0
  60. package/dist/core/agent-session-verification-gate.test.d.ts +2 -0
  61. package/dist/core/agent-session-verification-gate.test.d.ts.map +1 -0
  62. package/dist/core/agent-session-verification-gate.test.js +135 -0
  63. package/dist/core/agent-session-verification-gate.test.js.map +1 -0
  64. package/dist/core/agent-session.d.ts +77 -3
  65. package/dist/core/agent-session.d.ts.map +1 -1
  66. package/dist/core/agent-session.js +268 -33
  67. package/dist/core/agent-session.js.map +1 -1
  68. package/dist/core/agents.d.ts +29 -1
  69. package/dist/core/agents.d.ts.map +1 -1
  70. package/dist/core/agents.js +47 -97
  71. package/dist/core/agents.js.map +1 -1
  72. package/dist/core/agents.test.js +87 -7
  73. package/dist/core/agents.test.js.map +1 -1
  74. package/dist/core/api-benchmark.d.ts +3 -3
  75. package/dist/core/api-benchmark.js +7 -7
  76. package/dist/core/auth-providers.d.ts +37 -1
  77. package/dist/core/auth-providers.d.ts.map +1 -1
  78. package/dist/core/auth-providers.js +84 -4
  79. package/dist/core/auth-providers.js.map +1 -1
  80. package/dist/core/auto-update.test.js +1 -1
  81. package/dist/core/autopilot-gate.d.ts +2 -2
  82. package/dist/core/autopilot-gate.js +1 -1
  83. package/dist/core/autopilot-gate.test.js +7 -4
  84. package/dist/core/autopilot-gate.test.js.map +1 -1
  85. package/dist/core/bash-spawn-benchmark.js +6 -6
  86. package/dist/core/bundled-agents.d.ts +3 -0
  87. package/dist/core/bundled-agents.d.ts.map +1 -0
  88. package/dist/core/bundled-agents.js +255 -0
  89. package/dist/core/bundled-agents.js.map +1 -0
  90. package/dist/core/cache-warm-benchmark.d.ts +2 -2
  91. package/dist/core/cache-warm-benchmark.js +5 -5
  92. package/dist/core/code-retrieval-chunkers.d.ts +27 -0
  93. package/dist/core/code-retrieval-chunkers.d.ts.map +1 -0
  94. package/dist/core/code-retrieval-chunkers.js +264 -0
  95. package/dist/core/code-retrieval-chunkers.js.map +1 -0
  96. package/dist/core/code-retrieval-chunkers.test.d.ts +2 -0
  97. package/dist/core/code-retrieval-chunkers.test.d.ts.map +1 -0
  98. package/dist/core/code-retrieval-chunkers.test.js +203 -0
  99. package/dist/core/code-retrieval-chunkers.test.js.map +1 -0
  100. package/dist/core/code-retrieval.d.ts +6 -0
  101. package/dist/core/code-retrieval.d.ts.map +1 -1
  102. package/dist/core/code-retrieval.js +38 -1
  103. package/dist/core/code-retrieval.js.map +1 -1
  104. package/dist/core/compaction/token-estimator.test.js +1 -1
  105. package/dist/core/encode-cwd.test.js +1 -1
  106. package/dist/core/event-bus.d.ts +11 -1
  107. package/dist/core/event-bus.d.ts.map +1 -1
  108. package/dist/core/event-bus.js +1 -0
  109. package/dist/core/event-bus.js.map +1 -1
  110. package/dist/core/event-bus.test.d.ts +2 -0
  111. package/dist/core/event-bus.test.d.ts.map +1 -0
  112. package/dist/core/event-bus.test.js +33 -0
  113. package/dist/core/event-bus.test.js.map +1 -0
  114. package/dist/core/extensions/plugin-bundles.js +2 -2
  115. package/dist/core/extensions/plugin-bundles.js.map +1 -1
  116. package/dist/core/extensions/plugin-bundles.test.js +2 -2
  117. package/dist/core/extensions/plugin-bundles.test.js.map +1 -1
  118. package/dist/core/fast-apply-benchmark.d.ts +2 -2
  119. package/dist/core/fast-apply-benchmark.js +6 -6
  120. package/dist/core/foreign-session-import.test.js +1 -1
  121. package/dist/core/goal-lifecycle-smoke.test.js +2 -2
  122. package/dist/core/goal-store.js +1 -1
  123. package/dist/core/goal-store.test.js +2 -2
  124. package/dist/core/goal-verifier.test.js +2 -2
  125. package/dist/core/goal-worker-dev-server-lifecycle.test.js +1 -1
  126. package/dist/core/goal-worker.test.js +2 -2
  127. package/dist/core/hashline-edit-benchmark.d.ts +2 -2
  128. package/dist/core/hashline-edit-benchmark.js +7 -7
  129. package/dist/core/local-endpoint-store.test.js +1 -1
  130. package/dist/core/logger.d.ts +1 -1
  131. package/dist/core/logger.js +2 -2
  132. package/dist/core/logger.js.map +1 -1
  133. package/dist/core/lsp/client-navigation.test.d.ts +2 -0
  134. package/dist/core/lsp/client-navigation.test.d.ts.map +1 -0
  135. package/dist/core/lsp/client-navigation.test.js +135 -0
  136. package/dist/core/lsp/client-navigation.test.js.map +1 -0
  137. package/dist/core/lsp/client.d.ts +69 -0
  138. package/dist/core/lsp/client.d.ts.map +1 -1
  139. package/dist/core/lsp/client.js +151 -2
  140. package/dist/core/lsp/client.js.map +1 -1
  141. package/dist/core/lsp/integration.test.js +2 -2
  142. package/dist/core/lsp/manager-navigation.test.d.ts +2 -0
  143. package/dist/core/lsp/manager-navigation.test.d.ts.map +1 -0
  144. package/dist/core/lsp/manager-navigation.test.js +121 -0
  145. package/dist/core/lsp/manager-navigation.test.js.map +1 -0
  146. package/dist/core/lsp/manager.d.ts +35 -1
  147. package/dist/core/lsp/manager.d.ts.map +1 -1
  148. package/dist/core/lsp/manager.js +92 -0
  149. package/dist/core/lsp/manager.js.map +1 -1
  150. package/dist/core/lsp/servers.test.js +1 -1
  151. package/dist/core/lsp/windows.test.js +4 -4
  152. package/dist/core/mcp/catalog-cache.test.js +1 -1
  153. package/dist/core/mcp/client-session-recovery.test.js +1 -1
  154. package/dist/core/mcp/client.d.ts.map +1 -1
  155. package/dist/core/mcp/client.js +2 -10
  156. package/dist/core/mcp/client.js.map +1 -1
  157. package/dist/core/mcp/content.d.ts +19 -0
  158. package/dist/core/mcp/content.d.ts.map +1 -0
  159. package/dist/core/mcp/content.js +172 -0
  160. package/dist/core/mcp/content.js.map +1 -0
  161. package/dist/core/mcp/content.test.d.ts +2 -0
  162. package/dist/core/mcp/content.test.d.ts.map +1 -0
  163. package/dist/core/mcp/content.test.js +135 -0
  164. package/dist/core/mcp/content.test.js.map +1 -0
  165. package/dist/core/mcp/defaults.d.ts +3 -1
  166. package/dist/core/mcp/defaults.d.ts.map +1 -1
  167. package/dist/core/mcp/defaults.js +9 -2
  168. package/dist/core/mcp/defaults.js.map +1 -1
  169. package/dist/core/mcp/defaults.test.d.ts +2 -0
  170. package/dist/core/mcp/defaults.test.d.ts.map +1 -0
  171. package/dist/core/mcp/defaults.test.js +60 -0
  172. package/dist/core/mcp/defaults.test.js.map +1 -0
  173. package/dist/core/mcp/deferred-catalog.d.ts +1 -1
  174. package/dist/core/mcp/deferred-catalog.js +1 -1
  175. package/dist/core/mcp/elicitation.test.js +1 -1
  176. package/dist/core/mcp/legacy-negotiation.test.js +2 -2
  177. package/dist/core/mcp/oauth-store.test.js +2 -2
  178. package/dist/core/mcp/resolve-stdio.test.js +5 -5
  179. package/dist/core/mcp/shared-pool.test.js +5 -5
  180. package/dist/core/mcp/store.test.js +5 -5
  181. package/dist/core/mcp/when-connected.test.js +2 -2
  182. package/dist/core/nolan-model.test.js +1 -1
  183. package/dist/core/nolan-prompt.js +5 -5
  184. package/dist/core/oauth/xai.d.ts +2 -0
  185. package/dist/core/oauth/xai.d.ts.map +1 -0
  186. package/dist/core/oauth/xai.js +4 -0
  187. package/dist/core/oauth/xai.js.map +1 -0
  188. package/dist/core/persistent-shell.js +1 -1
  189. package/dist/core/persistent-shell.test.js +6 -6
  190. package/dist/core/process-manager-dev-server-repro.test.js +51 -12
  191. package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
  192. package/dist/core/process-manager-notifications.test.js +24 -14
  193. package/dist/core/process-manager-notifications.test.js.map +1 -1
  194. package/dist/core/process-manager-wake.test.d.ts +2 -0
  195. package/dist/core/process-manager-wake.test.d.ts.map +1 -0
  196. package/dist/core/process-manager-wake.test.js +96 -0
  197. package/dist/core/process-manager-wake.test.js.map +1 -0
  198. package/dist/core/process-manager.d.ts +61 -1
  199. package/dist/core/process-manager.d.ts.map +1 -1
  200. package/dist/core/process-manager.js +204 -4
  201. package/dist/core/process-manager.js.map +1 -1
  202. package/dist/core/progress/git-xp.test.js +2 -2
  203. package/dist/core/progress/ranks.d.ts +14 -3
  204. package/dist/core/progress/ranks.d.ts.map +1 -1
  205. package/dist/core/progress/ranks.js +181 -12
  206. package/dist/core/progress/ranks.js.map +1 -1
  207. package/dist/core/progress/ranks.test.js +48 -7
  208. package/dist/core/progress/ranks.test.js.map +1 -1
  209. package/dist/core/progress/rebuild.test.js +1 -1
  210. package/dist/core/progress/store.test.js +1 -1
  211. package/dist/core/progress/types.d.ts +2 -1
  212. package/dist/core/progress/types.d.ts.map +1 -1
  213. package/dist/core/project-discovery.d.ts.map +1 -1
  214. package/dist/core/project-discovery.js +62 -48
  215. package/dist/core/project-discovery.js.map +1 -1
  216. package/dist/core/project-discovery.test.js +10 -10
  217. package/dist/core/prompt-commands.d.ts.map +1 -1
  218. package/dist/core/prompt-commands.js +3 -3
  219. package/dist/core/prompt-commands.js.map +1 -1
  220. package/dist/core/provider-cache.e2e.test.d.ts +2 -0
  221. package/dist/core/provider-cache.e2e.test.d.ts.map +1 -0
  222. package/dist/core/provider-cache.e2e.test.js +125 -0
  223. package/dist/core/provider-cache.e2e.test.js.map +1 -0
  224. package/dist/core/radio.d.ts +1 -1
  225. package/dist/core/radio.d.ts.map +1 -1
  226. package/dist/core/radio.js +90 -6
  227. package/dist/core/radio.js.map +1 -1
  228. package/dist/core/radio.test.js +15 -2
  229. package/dist/core/radio.test.js.map +1 -1
  230. package/dist/core/run-journal.test.js +2 -2
  231. package/dist/core/sandbox.test.js +6 -6
  232. package/dist/core/semantic-search-benchmark.d.ts +2 -2
  233. package/dist/core/semantic-search-benchmark.js +5 -5
  234. package/dist/core/session-compaction.test.js +1 -1
  235. package/dist/core/session-injections.test.d.ts +2 -0
  236. package/dist/core/session-injections.test.d.ts.map +1 -0
  237. package/dist/core/session-injections.test.js +117 -0
  238. package/dist/core/session-injections.test.js.map +1 -0
  239. package/dist/core/session-manager.d.ts.map +1 -1
  240. package/dist/core/session-manager.js +83 -67
  241. package/dist/core/session-manager.js.map +1 -1
  242. package/dist/core/session-manager.test.js +7 -7
  243. package/dist/core/session-reconstructability.test.d.ts +2 -0
  244. package/dist/core/session-reconstructability.test.d.ts.map +1 -0
  245. package/dist/core/session-reconstructability.test.js +105 -0
  246. package/dist/core/session-reconstructability.test.js.map +1 -0
  247. package/dist/core/session-storage-fd-leak.test.d.ts +2 -0
  248. package/dist/core/session-storage-fd-leak.test.d.ts.map +1 -0
  249. package/dist/core/session-storage-fd-leak.test.js +116 -0
  250. package/dist/core/session-storage-fd-leak.test.js.map +1 -0
  251. package/dist/core/session-storage.d.ts +22 -2
  252. package/dist/core/session-storage.d.ts.map +1 -1
  253. package/dist/core/session-storage.js +33 -6
  254. package/dist/core/session-storage.js.map +1 -1
  255. package/dist/core/session-storage.test.js +2 -2
  256. package/dist/core/settings-manager.d.ts +12 -0
  257. package/dist/core/settings-manager.d.ts.map +1 -1
  258. package/dist/core/settings-manager.js +46 -1
  259. package/dist/core/settings-manager.js.map +1 -1
  260. package/dist/core/shell-path.js +1 -1
  261. package/dist/core/shell.d.ts +1 -1
  262. package/dist/core/shell.js +2 -2
  263. package/dist/core/shell.test.js +2 -2
  264. package/dist/core/shutdown.d.ts +71 -0
  265. package/dist/core/shutdown.d.ts.map +1 -0
  266. package/dist/core/shutdown.js +144 -0
  267. package/dist/core/shutdown.js.map +1 -0
  268. package/dist/core/shutdown.test.d.ts +2 -0
  269. package/dist/core/shutdown.test.d.ts.map +1 -0
  270. package/dist/core/shutdown.test.js +160 -0
  271. package/dist/core/shutdown.test.js.map +1 -0
  272. package/dist/core/sidecar-error-reporter.js +1 -1
  273. package/dist/core/sidecar-error-reporter.test.js +2 -2
  274. package/dist/core/skills-routing.test.js +142 -0
  275. package/dist/core/skills-routing.test.js.map +1 -1
  276. package/dist/core/skills.d.ts.map +1 -1
  277. package/dist/core/skills.js +4 -1
  278. package/dist/core/skills.js.map +1 -1
  279. package/dist/core/subagent-manager.d.ts +9 -0
  280. package/dist/core/subagent-manager.d.ts.map +1 -1
  281. package/dist/core/subagent-manager.js +45 -12
  282. package/dist/core/subagent-manager.js.map +1 -1
  283. package/dist/core/subagent-manager.test.js +14 -8
  284. package/dist/core/subagent-manager.test.js.map +1 -1
  285. package/dist/core/subagent-store.test.js +3 -3
  286. package/dist/core/task-store.js +1 -1
  287. package/dist/core/verification-gate.d.ts +55 -0
  288. package/dist/core/verification-gate.d.ts.map +1 -0
  289. package/dist/core/verification-gate.js +188 -0
  290. package/dist/core/verification-gate.js.map +1 -0
  291. package/dist/core/verification-gate.test.d.ts +2 -0
  292. package/dist/core/verification-gate.test.d.ts.map +1 -0
  293. package/dist/core/verification-gate.test.js +102 -0
  294. package/dist/core/verification-gate.test.js.map +1 -0
  295. package/dist/index.js +1 -1
  296. package/dist/index.js.map +1 -1
  297. package/dist/modes/acp-mode.js +2 -2
  298. package/dist/modes/acp-mode.test.js +10 -8
  299. package/dist/modes/acp-mode.test.js.map +1 -1
  300. package/dist/modes/agent-home-mode.d.ts.map +1 -1
  301. package/dist/modes/agent-home-mode.js +15 -11
  302. package/dist/modes/agent-home-mode.js.map +1 -1
  303. package/dist/modes/json-mode.d.ts +9 -1
  304. package/dist/modes/json-mode.d.ts.map +1 -1
  305. package/dist/modes/json-mode.js +3 -1
  306. package/dist/modes/json-mode.js.map +1 -1
  307. package/dist/modes/serve-mode.d.ts +1 -1
  308. package/dist/modes/serve-mode.d.ts.map +1 -1
  309. package/dist/modes/serve-mode.js +14 -9
  310. package/dist/modes/serve-mode.js.map +1 -1
  311. package/dist/modes/subagent-worker-mode.d.ts +5 -0
  312. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  313. package/dist/modes/subagent-worker-mode.js.map +1 -1
  314. package/dist/session.test.js +1 -1
  315. package/dist/system-prompt.d.ts +37 -1
  316. package/dist/system-prompt.d.ts.map +1 -1
  317. package/dist/system-prompt.js +170 -12
  318. package/dist/system-prompt.js.map +1 -1
  319. package/dist/system-prompt.test.js +170 -11
  320. package/dist/system-prompt.test.js.map +1 -1
  321. package/dist/system-prompt.tiering.test.d.ts +2 -0
  322. package/dist/system-prompt.tiering.test.d.ts.map +1 -0
  323. package/dist/system-prompt.tiering.test.js +108 -0
  324. package/dist/system-prompt.tiering.test.js.map +1 -0
  325. package/dist/tools/bash.d.ts +4 -0
  326. package/dist/tools/bash.d.ts.map +1 -1
  327. package/dist/tools/bash.js +57 -3
  328. package/dist/tools/bash.js.map +1 -1
  329. package/dist/tools/bash.test.js +37 -0
  330. package/dist/tools/bash.test.js.map +1 -1
  331. package/dist/tools/code-nav.d.ts +30 -0
  332. package/dist/tools/code-nav.d.ts.map +1 -0
  333. package/dist/tools/code-nav.js +320 -0
  334. package/dist/tools/code-nav.js.map +1 -0
  335. package/dist/tools/code-nav.test.d.ts +2 -0
  336. package/dist/tools/code-nav.test.d.ts.map +1 -0
  337. package/dist/tools/code-nav.test.js +136 -0
  338. package/dist/tools/code-nav.test.js.map +1 -0
  339. package/dist/tools/edit.d.ts.map +1 -1
  340. package/dist/tools/edit.js +37 -4
  341. package/dist/tools/edit.js.map +1 -1
  342. package/dist/tools/edit.test.js +45 -1
  343. package/dist/tools/edit.test.js.map +1 -1
  344. package/dist/tools/generate-image.d.ts +1 -1
  345. package/dist/tools/goals.d.ts +2 -2
  346. package/dist/tools/goals.test.js +2 -2
  347. package/dist/tools/grep-parity.test.d.ts +2 -0
  348. package/dist/tools/grep-parity.test.d.ts.map +1 -0
  349. package/dist/tools/grep-parity.test.js +92 -0
  350. package/dist/tools/grep-parity.test.js.map +1 -0
  351. package/dist/tools/grep-recall.test.d.ts +2 -0
  352. package/dist/tools/grep-recall.test.d.ts.map +1 -0
  353. package/dist/tools/grep-recall.test.js +114 -0
  354. package/dist/tools/grep-recall.test.js.map +1 -0
  355. package/dist/tools/grep-spawn.test.d.ts +2 -0
  356. package/dist/tools/grep-spawn.test.d.ts.map +1 -0
  357. package/dist/tools/grep-spawn.test.js +66 -0
  358. package/dist/tools/grep-spawn.test.js.map +1 -0
  359. package/dist/tools/grep.d.ts +13 -3
  360. package/dist/tools/grep.d.ts.map +1 -1
  361. package/dist/tools/grep.js +340 -40
  362. package/dist/tools/grep.js.map +1 -1
  363. package/dist/tools/grep.test.js +17 -14
  364. package/dist/tools/grep.test.js.map +1 -1
  365. package/dist/tools/index.d.ts +7 -0
  366. package/dist/tools/index.d.ts.map +1 -1
  367. package/dist/tools/index.js +8 -1
  368. package/dist/tools/index.js.map +1 -1
  369. package/dist/tools/plan-mode.test.js +1 -1
  370. package/dist/tools/prompt-hints.d.ts +9 -0
  371. package/dist/tools/prompt-hints.d.ts.map +1 -1
  372. package/dist/tools/prompt-hints.js +62 -8
  373. package/dist/tools/prompt-hints.js.map +1 -1
  374. package/dist/tools/read-only-bash.d.ts +6 -0
  375. package/dist/tools/read-only-bash.d.ts.map +1 -1
  376. package/dist/tools/read-only-bash.js +168 -9
  377. package/dist/tools/read-only-bash.js.map +1 -1
  378. package/dist/tools/read-only-bash.test.js +49 -0
  379. package/dist/tools/read-only-bash.test.js.map +1 -1
  380. package/dist/tools/safe-env.js +1 -1
  381. package/dist/tools/search-code.d.ts.map +1 -1
  382. package/dist/tools/search-code.js +7 -6
  383. package/dist/tools/search-code.js.map +1 -1
  384. package/dist/tools/search-code.test.js +8 -2
  385. package/dist/tools/search-code.test.js.map +1 -1
  386. package/dist/tools/skill.js +3 -1
  387. package/dist/tools/skill.js.map +1 -1
  388. package/dist/tools/subagent-control.d.ts.map +1 -1
  389. package/dist/tools/subagent-control.js +20 -5
  390. package/dist/tools/subagent-control.js.map +1 -1
  391. package/dist/tools/subagent-control.test.js +34 -1
  392. package/dist/tools/subagent-control.test.js.map +1 -1
  393. package/dist/tools/subagent-shared.d.ts +20 -1
  394. package/dist/tools/subagent-shared.d.ts.map +1 -1
  395. package/dist/tools/subagent-shared.js +34 -7
  396. package/dist/tools/subagent-shared.js.map +1 -1
  397. package/dist/tools/subagent-shared.test.js +43 -9
  398. package/dist/tools/subagent-shared.test.js.map +1 -1
  399. package/dist/tools/subagent.d.ts.map +1 -1
  400. package/dist/tools/subagent.js +11 -8
  401. package/dist/tools/subagent.js.map +1 -1
  402. package/dist/tools/subagent.test.js +3 -0
  403. package/dist/tools/subagent.test.js.map +1 -1
  404. package/dist/tools/task-send.test.js +19 -10
  405. package/dist/tools/task-send.test.js.map +1 -1
  406. package/dist/tools/tool-catalog.test.d.ts +2 -0
  407. package/dist/tools/tool-catalog.test.d.ts.map +1 -0
  408. package/dist/tools/tool-catalog.test.js +124 -0
  409. package/dist/tools/tool-catalog.test.js.map +1 -0
  410. package/dist/tools/tool-search.d.ts.map +1 -1
  411. package/dist/tools/tool-search.js +2 -1
  412. package/dist/tools/tool-search.js.map +1 -1
  413. package/dist/tools/tool-tiers.d.ts +42 -0
  414. package/dist/tools/tool-tiers.d.ts.map +1 -0
  415. package/dist/tools/tool-tiers.js +78 -0
  416. package/dist/tools/tool-tiers.js.map +1 -0
  417. package/dist/tools/tool-tiers.test.d.ts +2 -0
  418. package/dist/tools/tool-tiers.test.d.ts.map +1 -0
  419. package/dist/tools/tool-tiers.test.js +48 -0
  420. package/dist/tools/tool-tiers.test.js.map +1 -0
  421. package/dist/tools/write.test.js +1 -1
  422. package/dist/ui/App.d.ts +3 -0
  423. package/dist/ui/App.d.ts.map +1 -1
  424. package/dist/ui/App.js +39 -3
  425. package/dist/ui/App.js.map +1 -1
  426. package/dist/ui/app-items.d.ts +2 -0
  427. package/dist/ui/app-items.d.ts.map +1 -1
  428. package/dist/ui/app-items.js +2 -0
  429. package/dist/ui/app-items.js.map +1 -1
  430. package/dist/ui/components/Banner.d.ts.map +1 -1
  431. package/dist/ui/components/Banner.js +24 -16
  432. package/dist/ui/components/Banner.js.map +1 -1
  433. package/dist/ui/components/ToolExecution.js +42 -34
  434. package/dist/ui/components/ToolExecution.js.map +1 -1
  435. package/dist/ui/components/force-color.d.ts +2 -0
  436. package/dist/ui/components/force-color.d.ts.map +1 -0
  437. package/dist/ui/components/force-color.js +11 -0
  438. package/dist/ui/components/force-color.js.map +1 -0
  439. package/dist/ui/components/themed-output.test.d.ts +2 -0
  440. package/dist/ui/components/themed-output.test.d.ts.map +1 -0
  441. package/dist/ui/components/themed-output.test.js +111 -0
  442. package/dist/ui/components/themed-output.test.js.map +1 -0
  443. package/dist/ui/error-item.d.ts +1 -1
  444. package/dist/ui/error-item.js +3 -3
  445. package/dist/ui/error-item.js.map +1 -1
  446. package/dist/ui/hooks/useAgentLoop.d.ts +4 -1
  447. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  448. package/dist/ui/hooks/useAgentLoop.js +27 -2
  449. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  450. package/dist/ui/login.js +2 -2
  451. package/dist/ui/login.js.map +1 -1
  452. package/dist/ui/render.d.ts +1 -1
  453. package/dist/ui/render.js +6 -6
  454. package/dist/ui/theme/dark-ansi.json +6 -0
  455. package/dist/ui/theme/dark-daltonized.json +6 -0
  456. package/dist/ui/theme/dark.json +6 -0
  457. package/dist/ui/theme/light-ansi.json +6 -0
  458. package/dist/ui/theme/light-daltonized.json +6 -0
  459. package/dist/ui/theme/light.json +6 -0
  460. package/dist/ui/theme/theme.d.ts +6 -0
  461. package/dist/ui/theme/theme.d.ts.map +1 -1
  462. package/dist/ui/tui-terminal-recorder.test.js +1 -1
  463. package/dist/utils/git.test.js +3 -3
  464. package/dist/utils/image.d.ts.map +1 -1
  465. package/dist/utils/image.js.map +1 -1
  466. package/package.json +7 -7
@@ -0,0 +1,135 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import sharp from "sharp";
3
+ import { toToolResult } from "./content.js";
4
+ import { boundedSize } from "../../utils/image.js";
5
+ /** Mirrors the private cap in utils/image.ts — kept local rather than widening that module's API. */
6
+ const MAX_IMAGE_BYTES = 5 * 1024 * 1024;
7
+ async function pngBase64(width, height) {
8
+ const buffer = await sharp({
9
+ create: { width, height, channels: 3, background: { r: 10, g: 120, b: 200 } },
10
+ })
11
+ .png()
12
+ .toBuffer();
13
+ return buffer.toString("base64");
14
+ }
15
+ describe("toToolResult", () => {
16
+ it("keeps a text-only response a plain string", async () => {
17
+ const result = await toToolResult([{ type: "text", text: "hello" }], "mcp__x__y");
18
+ expect(result).toBe("hello");
19
+ });
20
+ it("reports an empty response only when there is genuinely nothing", async () => {
21
+ expect(await toToolResult([], "mcp__x__y")).toBe("(empty response)");
22
+ });
23
+ // Every one of these used to return "(empty response)" — the same defect as the
24
+ // image case, one block type over.
25
+ describe("non-image blocks reach the model instead of vanishing", () => {
26
+ it("surfaces an embedded text resource in full", async () => {
27
+ const result = await toToolResult([
28
+ {
29
+ type: "resource",
30
+ resource: { uri: "file:///notes.md", mimeType: "text/markdown", text: "THE ANSWER" },
31
+ },
32
+ ], "mcp__s__t");
33
+ expect(result).toContain("THE ANSWER");
34
+ expect(result).toContain("file:///notes.md");
35
+ });
36
+ it("passes a resource link's address through", async () => {
37
+ const result = await toToolResult([{ type: "resource_link", uri: "https://example.com/a", name: "report" }], "mcp__s__t");
38
+ expect(result).toContain("https://example.com/a");
39
+ expect(result).toContain("report");
40
+ });
41
+ it("names audio rather than returning nothing", async () => {
42
+ const result = await toToolResult([{ type: "audio", data: "aGk=", mimeType: "audio/wav" }], "mcp__s__t");
43
+ expect(result).toContain("audio");
44
+ expect(result).not.toBe("(empty response)");
45
+ });
46
+ it("notes a non-image binary blob with its size", async () => {
47
+ const result = await toToolResult([
48
+ {
49
+ type: "resource",
50
+ resource: { uri: "file:///a.zip", mimeType: "application/zip", blob: "AAAA" },
51
+ },
52
+ ], "mcp__s__t");
53
+ expect(result).toContain("file:///a.zip");
54
+ expect(result).toContain("application/zip");
55
+ expect(result).toContain("3 bytes");
56
+ });
57
+ it("falls back to text on an unknown future block type", async () => {
58
+ const result = await toToolResult([{ type: "video", text: "a clip" }], "mcp__s__t");
59
+ expect(result).toBe("a clip");
60
+ });
61
+ });
62
+ // Servers use this shape when the image also has a URI; it is just as viewable.
63
+ it("forwards an image delivered as an embedded resource blob", async () => {
64
+ const data = await pngBase64(8, 8);
65
+ const result = await toToolResult([
66
+ {
67
+ type: "resource",
68
+ resource: { uri: "file:///shot.png", mimeType: "image/png", blob: data },
69
+ },
70
+ ], "mcp__s__t");
71
+ const parts = result.content;
72
+ expect(parts.some((p) => p.type === "image")).toBe(true);
73
+ });
74
+ it("forwards an image-only response instead of dropping it", async () => {
75
+ const data = await pngBase64(8, 8);
76
+ const result = await toToolResult([{ type: "image", data, mimeType: "image/png" }], "mcp__s__t");
77
+ expect(typeof result).not.toBe("string");
78
+ const parts = result.content;
79
+ expect(parts).toHaveLength(1);
80
+ expect(parts[0]).toMatchObject({ type: "image", mediaType: "image/png" });
81
+ });
82
+ it("puts text before images so it frames them", async () => {
83
+ const data = await pngBase64(8, 8);
84
+ const result = await toToolResult([
85
+ { type: "text", text: "here is the chart" },
86
+ { type: "image", data, mimeType: "image/png" },
87
+ ], "mcp__s__t");
88
+ const parts = result.content;
89
+ expect(parts.map((p) => p.type)).toEqual(["text", "image"]);
90
+ expect(parts[0]?.text).toBe("here is the chart");
91
+ });
92
+ // A third-party server can return a screenshot far larger than any provider
93
+ // accepts; forwarding it verbatim would fail the whole turn.
94
+ it("shrinks an oversized image to fit provider limits", async () => {
95
+ const huge = boundedSize(8000, 8000);
96
+ const data = await pngBase64(8000, 8000);
97
+ expect(Buffer.from(data, "base64").length).toBeGreaterThan(0);
98
+ const result = await toToolResult([{ type: "image", data, mimeType: "image/png" }], "mcp__s__t");
99
+ const parts = result.content;
100
+ const image = parts.find((p) => p.type === "image");
101
+ const bytes = Buffer.from(image?.data ?? "", "base64");
102
+ expect(bytes.length).toBeLessThanOrEqual(MAX_IMAGE_BYTES);
103
+ const meta = await sharp(bytes).metadata();
104
+ expect(meta.width).toBeLessThanOrEqual(huge.width);
105
+ });
106
+ // Providers reject a media type the bytes contradict.
107
+ it("corrects a media type the payload disagrees with", async () => {
108
+ const data = await pngBase64(8, 8);
109
+ const result = await toToolResult([{ type: "image", data, mimeType: "image/jpeg" }], "mcp__s__t");
110
+ const parts = result.content;
111
+ expect(parts.find((p) => p.type === "image")?.mediaType).toBe("image/png");
112
+ });
113
+ it("degrades an unreadable image to a note and keeps the text", async () => {
114
+ const result = await toToolResult([
115
+ { type: "text", text: "rendered" },
116
+ { type: "image", data: "bm90LWFuLWltYWdl", mimeType: "image/png" },
117
+ ], "mcp__s__t");
118
+ const parts = result.content;
119
+ expect(parts[0]?.text).toBe("rendered");
120
+ expect(parts[1]?.text).toContain("unreadable image");
121
+ });
122
+ it("caps how many images one call can forward", async () => {
123
+ const data = await pngBase64(8, 8);
124
+ const many = Array.from({ length: 7 }, () => ({
125
+ type: "image",
126
+ data,
127
+ mimeType: "image/png",
128
+ }));
129
+ const result = await toToolResult(many, "mcp__s__t");
130
+ const parts = result.content;
131
+ expect(parts.filter((p) => p.type === "image")).toHaveLength(4);
132
+ expect(parts[0]?.text).toContain("3 further images omitted");
133
+ });
134
+ });
135
+ //# sourceMappingURL=content.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.test.js","sourceRoot":"","sources":["../../../src/core/mcp/content.test.ts"],"names":[],"mappings":"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"}
@@ -12,5 +12,7 @@ export declare function getMCPServers(provider: Provider, apiKey?: string): MCPS
12
12
  * a user server can only ADD a new name, never override a default like
13
13
  * `kencode-search`.
14
14
  */
15
- export declare function getAllMcpServers(provider: Provider, apiKey: string | undefined, cwd: string): Promise<MCPServerConfig[]>;
15
+ export declare function getAllMcpServers(provider: Provider, apiKey: string | undefined, cwd: string, opts?: {
16
+ allowProjectScope?: boolean;
17
+ }): Promise<MCPServerConfig[]>;
16
18
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAOhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CA4CpF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,EAAE,CAAC,CAM5B"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAOhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CA4CpF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,eAAe,EAAE,CAAC,CAa5B"}
@@ -56,11 +56,18 @@ export function getMCPServers(provider, apiKey) {
56
56
  * a user server can only ADD a new name, never override a default like
57
57
  * `kencode-search`.
58
58
  */
59
- export async function getAllMcpServers(provider, apiKey, cwd) {
59
+ export async function getAllMcpServers(provider, apiKey, cwd, opts) {
60
60
  const defaults = getMCPServers(provider, apiKey);
61
61
  const defaultNames = new Set(defaults.map((s) => s.name));
62
62
  const scoped = await loadServers(cwd);
63
- const userServers = scoped.map((s) => s.config).filter((c) => !defaultNames.has(c.name));
63
+ // Project scope (<repo>/.ezcoder/mcp.json) is repo-controlled: a malicious repo
64
+ // can declare a stdio `command` that would execute the moment the project
65
+ // opens. Only include those when explicitly trusted (trustProjectMcpServers);
66
+ // global ~/.ezcoder/mcp.json is the user's own file and always connects.
67
+ const userServers = scoped
68
+ .filter((s) => opts?.allowProjectScope === true || s.scope !== "project")
69
+ .map((s) => s.config)
70
+ .filter((c) => !defaultNames.has(c.name));
64
71
  return [...defaults, ...userServers];
65
72
  }
66
73
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/core/mcp/defaults.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,4EAA4E;IAC5E,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,6DAA6D;IAC7D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC,EAAE;CACtF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,MAAe;IAC/D,MAAM,OAAO,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;IAEzC,IAAI,QAAQ,KAAK,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;QAEtD,8CAA8C;QAC9C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC;YAChC,GAAG,EAAE;gBACH,YAAY,EAAE,MAAM;gBACpB,SAAS,EAAE,KAAK;aACjB;YACD,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,aAAa;QACb,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,+CAA+C;YACpD,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,4CAA4C;QAC5C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,yCAAyC;YAC9C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,gCAAgC;QAChC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,oCAAoC;YACzC,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkB,EAClB,MAA0B,EAC1B,GAAW;IAEX,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/core/mcp/defaults.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,4EAA4E;IAC5E,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,6DAA6D;IAC7D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC,EAAE;CACtF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,MAAe;IAC/D,MAAM,OAAO,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;IAEzC,IAAI,QAAQ,KAAK,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;QAEtD,8CAA8C;QAC9C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC;YAChC,GAAG,EAAE;gBACH,YAAY,EAAE,MAAM;gBACpB,SAAS,EAAE,KAAK;aACjB;YACD,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,aAAa;QACb,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,+CAA+C;YACpD,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,4CAA4C;QAC5C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,yCAAyC;YAC9C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,gCAAgC;QAChC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,oCAAoC;YACzC,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkB,EAClB,MAA0B,EAC1B,GAAW,EACX,IAAsC;IAEtC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,gFAAgF;IAChF,0EAA0E;IAC1E,8EAA8E;IAC9E,yEAAyE;IACzE,MAAM,WAAW,GAAG,MAAM;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=defaults.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.test.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/defaults.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import { describe, expect, it, beforeEach, afterEach, vi } from "vitest";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import fs from "node:fs/promises";
5
+ // Point the global mcp file at a temp home so tests don't touch the real ~/.ezcoder.
6
+ let tmpHome;
7
+ let tmpProject;
8
+ vi.mock("../../config.js", async () => {
9
+ const actual = await vi.importActual("../../config.js");
10
+ return {
11
+ ...actual,
12
+ getAppPaths: () => ({
13
+ ...actual.getAppPaths(),
14
+ mcpFile: path.join(process.env.EZ_TEST_HOME, ".ezcoder", "mcp.json"),
15
+ }),
16
+ };
17
+ });
18
+ import { getAllMcpServers, DEFAULT_MCP_SERVERS } from "./defaults.js";
19
+ import { addServer } from "./store.js";
20
+ beforeEach(async () => {
21
+ tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcpdef-home-"));
22
+ tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcpdef-proj-"));
23
+ process.env.EZ_TEST_HOME = tmpHome;
24
+ await fs.mkdir(path.join(tmpHome, ".ezcoder"), { recursive: true });
25
+ });
26
+ afterEach(async () => {
27
+ await fs.rm(tmpHome, { recursive: true, force: true });
28
+ await fs.rm(tmpProject, { recursive: true, force: true });
29
+ delete process.env.EZ_TEST_HOME;
30
+ });
31
+ describe("getAllMcpServers project-scope trust gate", () => {
32
+ it("excludes repo-declared (project-scope) servers by default", async () => {
33
+ // A malicious repo ships .ezcoder/mcp.json with a stdio command; opening the
34
+ // project must not connect it unless the user opted in.
35
+ await addServer({ name: "repo-server", command: "sh", args: ["-c", "echo pwned"] }, "project", tmpProject);
36
+ await addServer({ name: "user-server", url: "https://example.com/mcp" }, "global", tmpProject);
37
+ const servers = await getAllMcpServers("anthropic", undefined, tmpProject);
38
+ const names = servers.map((s) => s.name);
39
+ expect(names).not.toContain("repo-server");
40
+ expect(names).toContain("user-server");
41
+ expect(names).toContain(DEFAULT_MCP_SERVERS[0].name);
42
+ });
43
+ it("includes project-scope servers when allowProjectScope is set", async () => {
44
+ await addServer({ name: "repo-server", command: "sh", args: ["-c", "echo ok"] }, "project", tmpProject);
45
+ const servers = await getAllMcpServers("anthropic", undefined, tmpProject, {
46
+ allowProjectScope: true,
47
+ });
48
+ expect(servers.map((s) => s.name)).toContain("repo-server");
49
+ });
50
+ it("never lets a user server override a provider default", async () => {
51
+ await addServer({ name: DEFAULT_MCP_SERVERS[0].name, command: "evil" }, "global", tmpProject);
52
+ const servers = await getAllMcpServers("anthropic", undefined, tmpProject, {
53
+ allowProjectScope: true,
54
+ });
55
+ const kencode = servers.filter((s) => s.name === DEFAULT_MCP_SERVERS[0].name);
56
+ expect(kencode).toHaveLength(1);
57
+ expect(kencode[0].command).toBe(DEFAULT_MCP_SERVERS[0].command);
58
+ });
59
+ });
60
+ //# sourceMappingURL=defaults.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.test.js","sourceRoot":"","sources":["../../../src/core/mcp/defaults.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC,qFAAqF;AACrF,IAAI,OAAe,CAAC;AACpB,IAAI,UAAkB,CAAC;AAEvB,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;IACpC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAsB,iBAAiB,CAAC,CAAC;IAC7E,OAAO;QACL,GAAG,MAAM;QACT,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;YAClB,GAAG,MAAM,CAAC,WAAW,EAAE;YACvB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAa,EAAE,UAAU,EAAE,UAAU,CAAC;SACtE,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACtE,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,6EAA6E;QAC7E,wDAAwD;QACxD,MAAM,SAAS,CACb,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAClE,SAAS,EACT,UAAU,CACX,CAAC;QACF,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,yBAAyB,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE/F,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,SAAS,CACb,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAC/D,SAAS,EACT,UAAU,CACX,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;YACzE,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE/F,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;YACzE,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -3,7 +3,7 @@ import type { AgentTool } from "@prestyj/agent";
3
3
  * Holds MCP tools OUT of the per-turn request payload until the model asks
4
4
  * for them via `tool_search`.
5
5
  *
6
- * Benchmarked (bench/RESULTS.md, bench A): injecting every MCP tool schema
6
+ * Measured: injecting every MCP tool schema
7
7
  * eagerly cost ~33KB (~8.3k tokens) per cache-miss turn with just two MCP
8
8
  * servers connected — 56% of all billed input tokens in a 6-turn session.
9
9
  * Deferring keeps the tool prefix small and byte-stable; promotion is a
@@ -2,7 +2,7 @@
2
2
  * Holds MCP tools OUT of the per-turn request payload until the model asks
3
3
  * for them via `tool_search`.
4
4
  *
5
- * Benchmarked (bench/RESULTS.md, bench A): injecting every MCP tool schema
5
+ * Measured: injecting every MCP tool schema
6
6
  * eagerly cost ~33KB (~8.3k tokens) per cache-miss turn with just two MCP
7
7
  * servers connected — 56% of all billed input tokens in a 6-turn session.
8
8
  * Deferring keeps the tool prefix small and byte-stable; promotion is a
@@ -36,7 +36,7 @@ async function callTool(tools, suffix) {
36
36
  return typeof result === "string" ? result : JSON.stringify(result);
37
37
  }
38
38
  beforeEach(async () => {
39
- dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-elicit-"));
39
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-elicit-"));
40
40
  });
41
41
  afterEach(async () => {
42
42
  await Promise.all(managers.splice(0).map((instance) => instance.dispose()));
@@ -28,7 +28,7 @@ function legacyServer(overrides = {}) {
28
28
  };
29
29
  }
30
30
  beforeEach(async () => {
31
- dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-legacy-"));
31
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-legacy-"));
32
32
  cachePath = path.join(dir, "mcp-catalog.json");
33
33
  });
34
34
  afterEach(async () => {
@@ -55,7 +55,7 @@ describe("2025-only stdio server under version negotiation", () => {
55
55
  it("connects a server that stays silent on the discovery probe", async () => {
56
56
  const config = legacyServer({
57
57
  name: "silent-legacy-fixture",
58
- env: { GG_FIXTURE_SILENT_ON_UNKNOWN: "1" },
58
+ env: { EZ_FIXTURE_SILENT_ON_UNKNOWN: "1" },
59
59
  // Generous connect budget: the point is that the PROBE does not consume
60
60
  // it. Without a stdio-specific probe timeout the probe inherits this
61
61
  // value, so a silent server would burn the full 30s before falling back.
@@ -8,7 +8,7 @@ describe("McpOAuthStore", () => {
8
8
  let dir;
9
9
  let file;
10
10
  beforeEach(async () => {
11
- dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-auth-"));
11
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-auth-"));
12
12
  file = path.join(dir, "mcp-auth.json");
13
13
  });
14
14
  afterEach(async () => {
@@ -46,7 +46,7 @@ describe("McpOAuthProvider", () => {
46
46
  let dir;
47
47
  let store;
48
48
  beforeEach(async () => {
49
- dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-prov-"));
49
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-prov-"));
50
50
  store = new McpOAuthStore(path.join(dir, "mcp-auth.json"));
51
51
  });
52
52
  afterEach(async () => {
@@ -92,7 +92,7 @@ describe("resolveStdioCommand npx-cache fallback (covers user-added MCPs)", () =
92
92
  tmp = undefined;
93
93
  });
94
94
  it("rewrites a non-bundled but npx-cached server to `node <binScript>`", () => {
95
- tmp = fs.mkdtempSync(path.join(os.tmpdir(), "gg-npx-cache-"));
95
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "ez-npx-cache-"));
96
96
  seedNpxCache(tmp, "hash1", "@vendor/cool-mcp", "1.0.0");
97
97
  process.env.npm_config_cache = tmp;
98
98
  const out = resolveStdioCommand("npx", ["-y", "@vendor/cool-mcp"]);
@@ -100,7 +100,7 @@ describe("resolveStdioCommand npx-cache fallback (covers user-added MCPs)", () =
100
100
  expect(out.args[0]).toMatch(/cool-mcp[/\\]build[/\\]index\.js$/);
101
101
  });
102
102
  it("honours a version pin: a mismatched cached version falls through to npx", () => {
103
- tmp = fs.mkdtempSync(path.join(os.tmpdir(), "gg-npx-cache-"));
103
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "ez-npx-cache-"));
104
104
  seedNpxCache(tmp, "hash1", "@vendor/cool-mcp", "1.0.0");
105
105
  process.env.npm_config_cache = tmp;
106
106
  // Requested @2.0.0, only 1.0.0 cached → do NOT rewrite to the wrong version.
@@ -111,7 +111,7 @@ describe("resolveStdioCommand npx-cache fallback (covers user-added MCPs)", () =
111
111
  expect(out.command).toBe("npx");
112
112
  });
113
113
  it("uses a cached copy whose version matches the pin exactly", () => {
114
- tmp = fs.mkdtempSync(path.join(os.tmpdir(), "gg-npx-cache-"));
114
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "ez-npx-cache-"));
115
115
  seedNpxCache(tmp, "hash1", "@vendor/cool-mcp", "2.0.0");
116
116
  process.env.npm_config_cache = tmp;
117
117
  const out = resolveStdioCommand("npx", ["-y", "@vendor/cool-mcp@2.0.0"]);
@@ -119,7 +119,7 @@ describe("resolveStdioCommand npx-cache fallback (covers user-added MCPs)", () =
119
119
  expect(out.args[0]).toMatch(/cool-mcp[/\\]build[/\\]index\.js$/);
120
120
  });
121
121
  it("picks the highest cached version when the spec is unpinned", () => {
122
- tmp = fs.mkdtempSync(path.join(os.tmpdir(), "gg-npx-cache-"));
122
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "ez-npx-cache-"));
123
123
  seedNpxCache(tmp, "old", "@vendor/cool-mcp", "1.2.0", "build/old.js");
124
124
  seedNpxCache(tmp, "new", "@vendor/cool-mcp", "1.10.0", "build/new.js");
125
125
  process.env.npm_config_cache = tmp;
@@ -131,7 +131,7 @@ describe("resolveStdioCommand npx-cache fallback (covers user-added MCPs)", () =
131
131
  it("resolves a sole bin whose key differs from the package name (e.g. zai)", () => {
132
132
  // @z_ai/mcp-server exposes bin `zai-mcp-server`, NOT `mcp-server`. A sole
133
133
  // bin must be used regardless of its key, or the rewrite silently misses.
134
- tmp = fs.mkdtempSync(path.join(os.tmpdir(), "gg-npx-cache-"));
134
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "ez-npx-cache-"));
135
135
  const pkgDir = path.join(tmp, "_npx", "h", "node_modules", "@z_ai", "mcp-server");
136
136
  fs.mkdirSync(path.join(pkgDir, "build"), { recursive: true });
137
137
  fs.writeFileSync(path.join(pkgDir, "build", "index.js"), "#!/usr/bin/env node\n");
@@ -20,7 +20,7 @@ let cachePath;
20
20
  const managers = [];
21
21
  const pools = [];
22
22
  beforeEach(async () => {
23
- dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-shared-"));
23
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-shared-"));
24
24
  cachePath = path.join(dir, "mcp-catalog.json");
25
25
  });
26
26
  afterEach(async () => {
@@ -51,14 +51,14 @@ function sharedFixture(overrides = {}) {
51
51
  return {
52
52
  name: "shared-fixture",
53
53
  command: process.execPath,
54
- args: [FIXTURE, `--gg-marker=${crypto.randomUUID()}`],
54
+ args: [FIXTURE, `--ez-marker=${crypto.randomUUID()}`],
55
55
  timeout: 10_000,
56
56
  ...overrides,
57
57
  };
58
58
  }
59
59
  /** Live child processes carrying this config's marker argument. */
60
60
  function processCount(config) {
61
- const marker = config.args?.find((arg) => arg.startsWith("--gg-marker="));
61
+ const marker = config.args?.find((arg) => arg.startsWith("--ez-marker="));
62
62
  if (!marker)
63
63
  throw new Error("fixture config has no marker argument");
64
64
  const out = execFileSync("ps", ["-eo", "command"], { encoding: "utf8" });
@@ -351,7 +351,7 @@ describe.skipIf(process.platform === "win32")("shared servers across two session
351
351
  // Kill the child out from under the pool, exactly like a crash. Located
352
352
  // with `ps` rather than `pgrep`, whose BSD build reads this fixture's
353
353
  // leading `--` marker as an illegal option.
354
- const marker = config.args.find((arg) => arg.startsWith("--gg-marker="));
354
+ const marker = config.args.find((arg) => arg.startsWith("--ez-marker="));
355
355
  const row = execFileSync("ps", ["-eo", "pid,command"], { encoding: "utf8" })
356
356
  .split("\n")
357
357
  .find((line) => line.includes(marker));
@@ -381,7 +381,7 @@ describe.skipIf(process.platform === "win32")("shared servers across two session
381
381
  const config = {
382
382
  name: "elicit-fixture",
383
383
  command: process.execPath,
384
- args: [ELICIT_FIXTURE, `--gg-marker=${crypto.randomUUID()}`],
384
+ args: [ELICIT_FIXTURE, `--ez-marker=${crypto.randomUUID()}`],
385
385
  timeout: 10_000,
386
386
  };
387
387
  const pool = newPool();
@@ -11,20 +11,20 @@ vi.mock("../../config.js", async () => {
11
11
  ...actual,
12
12
  getAppPaths: () => ({
13
13
  ...actual.getAppPaths(),
14
- mcpFile: path.join(process.env.GG_TEST_HOME, ".ezcoder", "mcp.json"),
14
+ mcpFile: path.join(process.env.EZ_TEST_HOME, ".ezcoder", "mcp.json"),
15
15
  }),
16
16
  };
17
17
  });
18
18
  import { addServer, loadServers, removeServer, getServer, fromStoredEntry, globalMcpPath, projectMcpPath, } from "./store.js";
19
19
  beforeEach(async () => {
20
- tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-home-"));
21
- tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-proj-"));
22
- process.env.GG_TEST_HOME = tmpHome;
20
+ tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-home-"));
21
+ tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-proj-"));
22
+ process.env.EZ_TEST_HOME = tmpHome;
23
23
  });
24
24
  afterEach(async () => {
25
25
  await fs.rm(tmpHome, { recursive: true, force: true });
26
26
  await fs.rm(tmpProject, { recursive: true, force: true });
27
- delete process.env.GG_TEST_HOME;
27
+ delete process.env.EZ_TEST_HOME;
28
28
  });
29
29
  describe("mcp store", () => {
30
30
  it("round-trips an http server in global scope", async () => {
@@ -7,7 +7,7 @@ import { McpCatalogCache } from "./catalog-cache.js";
7
7
  let dir;
8
8
  let manager;
9
9
  beforeEach(async () => {
10
- dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-when-connected-"));
10
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "ez-mcp-when-connected-"));
11
11
  manager = new MCPClientManager({
12
12
  catalogCache: new McpCatalogCache(path.join(dir, "mcp-catalog.json")),
13
13
  });
@@ -19,7 +19,7 @@ afterEach(async () => {
19
19
  /** A stdio command that cannot possibly start, so the connect fails fast. */
20
20
  const BROKEN = {
21
21
  name: "broken",
22
- command: "gg-nonexistent-mcp-binary",
22
+ command: "ez-nonexistent-mcp-binary",
23
23
  args: [],
24
24
  timeout: 2_000,
25
25
  };
@@ -40,7 +40,7 @@ describe("effectiveNolanModel", () => {
40
40
  nolanModelOverride: true,
41
41
  });
42
42
  });
43
- it("pin identical to the build model still reports override=true (it survives GG switches)", () => {
43
+ it("pin identical to the build model still reports override=true (it survives EZ switches)", () => {
44
44
  expect(effectiveNolanModel({ provider: "anthropic", model: "claude-opus-5" }, build)).toEqual({
45
45
  nolanProvider: "anthropic",
46
46
  nolanModel: "claude-opus-5",
@@ -44,7 +44,7 @@ export async function buildNolanSystemPrompt(cwd) {
44
44
  return [
45
45
  renderIdentity(),
46
46
  renderEdge(),
47
- renderGGCoderCapabilities(),
47
+ renderEZCoderCapabilities(),
48
48
  renderSkeptical(),
49
49
  renderTaste(),
50
50
  renderMethod(),
@@ -73,7 +73,7 @@ export async function buildNolanSystemPrompt(cwd) {
73
73
  export async function buildNolanAutopilotSystemPrompt(cwd) {
74
74
  return [
75
75
  renderIdentity(),
76
- renderGGCoderCapabilities(),
76
+ renderEZCoderCapabilities(),
77
77
  renderSkeptical(),
78
78
  renderTaste(),
79
79
  renderMethod(),
@@ -123,7 +123,7 @@ function renderEdge() {
123
123
  `directly for the same result, you added nothing. Be the strategy, the ` +
124
124
  `skeptic, or the better-shaped ask.`);
125
125
  }
126
- function renderGGCoderCapabilities() {
126
+ function renderEZCoderCapabilities() {
127
127
  return (`## What EZ Coder can do\n\n` +
128
128
  `You direct EZ Coder, so you have to know its reach. It is a full coding agent ` +
129
129
  `with these tools, and your prompts should assume them instead of making the ` +
@@ -195,7 +195,7 @@ function renderTaste() {
195
195
  }
196
196
  function renderMethod() {
197
197
  return (`## Method\n\n` +
198
- `Modular and sequential. One thing at a time, each step small enough that GG ` +
198
+ `Modular and sequential. One thing at a time, each step small enough that EZ ` +
199
199
  `Coder can nail it and you can both confirm it works before the next.\n\n` +
200
200
  `Kill the "one prompt that does everything" mega-request on sight. For a whole ` +
201
201
  `feature, break it into a sequence and hand over the first step only, then the ` +
@@ -324,7 +324,7 @@ function renderContextNote() {
324
324
  return (`## Your context\n\n` +
325
325
  `Each turn you get a digest: what they're building, the story so far, and the ` +
326
326
  `recent EZ Coder and user activity. Read it, then answer the actual question. If ` +
327
- `the digest misses something, use your read-only tools to go look. You see GG ` +
327
+ `the digest misses something, use your read-only tools to go look. You see EZ ` +
328
328
  `Coder's conversation; it never sees yours. You steer, it builds.`);
329
329
  }
330
330
  //# sourceMappingURL=nolan-prompt.js.map
@@ -0,0 +1,2 @@
1
+ export { loginXai, refreshXaiToken, grokCliBaseUrl, grokCliHeaders, isGrokCliEndpoint, } from "@prestyj/core";
2
+ //# sourceMappingURL=xai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.d.ts","sourceRoot":"","sources":["../../../src/core/oauth/xai.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Lives in @prestyj/core — re-exported here so ezcoder call sites import
2
+ // Grok OAuth the same way they import the other providers.
3
+ export { loginXai, refreshXaiToken, grokCliBaseUrl, grokCliHeaders, isGrokCliEndpoint, } from "@prestyj/core";
4
+ //# sourceMappingURL=xai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/core/oauth/xai.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,2DAA2D;AAC3D,OAAO,EACL,QAAQ,EACR,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC"}
@@ -76,7 +76,7 @@ export class PersistentShell {
76
76
  }
77
77
  this.busy = true;
78
78
  const child = this.ensureChild();
79
- const sentinel = `__GG_PSH_${randomUUID()}__`;
79
+ const sentinel = `__EZ_PSH_${randomUUID()}__`;
80
80
  // `</dev/null` keeps stdin-reading commands (cat, read) from eating the
81
81
  // next sentinel line instead of hanging the session.
82
82
  const wrapped = `{ ${command}\n} </dev/null; echo "${sentinel}$?"\n`;
@@ -27,8 +27,8 @@ d("PersistentShell", () => {
27
27
  });
28
28
  it("persists cd and env vars across calls — the point of the feature", async () => {
29
29
  const sh = make();
30
- await sh.run("cd / && export GG_PSH_TEST=alive", 10_000, signal());
31
- const res = await sh.run('pwd; echo "$GG_PSH_TEST"', 10_000, signal());
30
+ await sh.run("cd / && export EZ_PSH_TEST=alive", 10_000, signal());
31
+ const res = await sh.run('pwd; echo "$EZ_PSH_TEST"', 10_000, signal());
32
32
  expect(res.output).toBe("/\nalive");
33
33
  });
34
34
  it("stdin-reading commands don't eat the sentinel or hang", async () => {
@@ -41,23 +41,23 @@ d("PersistentShell", () => {
41
41
  });
42
42
  it("timeout kills the session; the next call gets a fresh shell", async () => {
43
43
  const sh = make();
44
- await sh.run("export GG_PSH_STATE=set", 10_000, signal());
44
+ await sh.run("export EZ_PSH_STATE=set", 10_000, signal());
45
45
  const timedOut = await sh.run("sleep 30", 300, signal());
46
46
  expect(timedOut.exitCode).toBe("TIMEOUT");
47
47
  // Fresh shell: the exported var from before the timeout is gone.
48
- const res = await sh.run('echo "[$GG_PSH_STATE]"', 10_000, signal());
48
+ const res = await sh.run('echo "[$EZ_PSH_STATE]"', 10_000, signal());
49
49
  expect(res.output).toBe("[]");
50
50
  });
51
51
  it("over-cap output still finds the sentinel — no hang, session survives", async () => {
52
52
  shell = new PersistentShell(os.tmpdir(), { ...process.env, TERM: "dumb" }, 512);
53
53
  const sh = shell;
54
- await sh.run("export GG_PSH_CAP=kept", 10_000, signal());
54
+ await sh.run("export EZ_PSH_CAP=kept", 10_000, signal());
55
55
  // ~40KB of output, way past the 512-byte cap.
56
56
  const res = await sh.run('yes x | head -n 20000; echo "end"', 10_000, signal());
57
57
  expect(res.exitCode).toBe(0);
58
58
  expect(res.output).toContain("[Output capped at 512 bytes]");
59
59
  // Session state survived — the command completed instead of timing out.
60
- const after = await sh.run('echo "$GG_PSH_CAP"', 10_000, signal());
60
+ const after = await sh.run('echo "$EZ_PSH_CAP"', 10_000, signal());
61
61
  expect(after.output).toBe("kept");
62
62
  });
63
63
  it("does not leak error listeners across many runs", async () => {