gsd-pi 2.77.0-dev.538325aea → 2.77.0-dev.eaa4973bc

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 (874) hide show
  1. package/dist/cli-web-branch.d.ts +1 -0
  2. package/dist/cli-web-branch.js +3 -0
  3. package/dist/cli.js +59 -15
  4. package/dist/extension-discovery.d.ts +6 -0
  5. package/dist/extension-discovery.js +37 -0
  6. package/dist/extension-registry.d.ts +3 -0
  7. package/dist/extension-registry.js +1 -1
  8. package/dist/extension-sort.d.ts +18 -0
  9. package/dist/extension-sort.js +114 -0
  10. package/dist/extension-validator.d.ts +47 -0
  11. package/dist/extension-validator.js +127 -0
  12. package/dist/headless-ui.d.ts +1 -1
  13. package/dist/headless.js +4 -2
  14. package/dist/loader.js +36 -7
  15. package/dist/onboarding.js +5 -5
  16. package/dist/provider-migrations.d.ts +20 -2
  17. package/dist/provider-migrations.js +15 -2
  18. package/dist/remote-questions-config.js +1 -1
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -1
  20. package/dist/resources/extensions/aws-auth/index.js +1 -2
  21. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +9 -6
  22. package/dist/resources/extensions/bg-shell/process-manager.js +1 -2
  23. package/dist/resources/extensions/browser-tools/index.js +1 -0
  24. package/dist/resources/extensions/claude-code-cli/index.js +1 -1
  25. package/dist/resources/extensions/claude-code-cli/partial-builder.js +17 -106
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +71 -57
  27. package/dist/resources/extensions/cmux/index.js +20 -0
  28. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  29. package/dist/resources/extensions/google-search/index.js +2 -375
  30. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  31. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  32. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  33. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +24 -0
  35. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +31 -0
  37. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  38. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  39. package/dist/resources/extensions/gsd/auto-worktree.js +58 -8
  40. package/dist/resources/extensions/gsd/auto.js +31 -14
  41. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +4 -2
  42. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
  43. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
  44. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  45. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  46. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  47. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  48. package/dist/resources/extensions/gsd/git-service.js +1 -0
  49. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  50. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  51. package/dist/resources/extensions/gsd/guided-flow.js +1 -1
  52. package/dist/resources/extensions/gsd/journal.js +17 -2
  53. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  54. package/dist/resources/extensions/gsd/notifications.js +30 -16
  55. package/dist/resources/extensions/gsd/reports.js +5 -4
  56. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  57. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  58. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  59. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  60. package/dist/resources/extensions/gsd/worktree-manager.js +1 -0
  61. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  62. package/dist/resources/extensions/mcp-client/index.js +119 -10
  63. package/dist/resources/extensions/ollama/index.js +2 -1
  64. package/dist/resources/extensions/ollama/ollama-chat-provider.js +15 -5
  65. package/dist/resources/extensions/remote-questions/config.js +1 -12
  66. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  67. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  68. package/dist/resources/extensions/universal-config/index.js +1 -1
  69. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  70. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  71. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  72. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  73. package/dist/security-overrides.d.ts +1 -4
  74. package/dist/security-overrides.js +3 -16
  75. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  76. package/dist/web/standalone/.next/BUILD_ID +1 -1
  77. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  78. package/dist/web/standalone/.next/build-manifest.json +3 -3
  79. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  80. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  99. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  101. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  105. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  107. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  111. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  113. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  115. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  117. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  119. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  121. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  123. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  125. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  129. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  131. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/index.html +1 -1
  164. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  171. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  172. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  173. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  175. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  177. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  178. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  179. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  180. package/dist/web/standalone/.next/static/chunks/{webpack-1832629448831fdc.js → webpack-2e68521d7c82f7c2.js} +1 -1
  181. package/dist/web-mode.js +1 -1
  182. package/dist/welcome-screen.js +20 -19
  183. package/dist/wizard.js +5 -2
  184. package/package.json +16 -32
  185. package/packages/mcp-server/README.md +3 -3
  186. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  187. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  188. package/packages/mcp-server/dist/env-writer.js +74 -6
  189. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  190. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  191. package/packages/mcp-server/dist/server.js +36 -17
  192. package/packages/mcp-server/dist/server.js.map +1 -1
  193. package/packages/mcp-server/package.json +5 -0
  194. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  195. package/packages/mcp-server/src/env-writer.ts +76 -6
  196. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  197. package/packages/mcp-server/src/server.ts +45 -19
  198. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  199. package/packages/native/package.json +5 -0
  200. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  201. package/packages/native/tsconfig.json +1 -2
  202. package/packages/native/tsconfig.tsbuildinfo +1 -0
  203. package/packages/pi-agent-core/package.json +5 -0
  204. package/packages/pi-agent-core/src/agent-loop.test.ts +220 -15
  205. package/packages/pi-ai/package.json +5 -0
  206. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  207. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  208. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  210. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  212. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  214. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  216. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  217. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  218. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  219. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  220. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  222. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  224. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  226. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  228. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  230. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  231. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  232. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  233. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  234. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  235. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  236. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  237. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +3 -2
  238. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/extensions/loader.js +24 -8
  240. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
  242. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +11 -0
  245. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -2
  247. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  249. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  251. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  253. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  255. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/system-prompt.js +3 -3
  257. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  259. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -0
  270. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  271. package/packages/pi-coding-agent/package.json +5 -0
  272. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  273. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  274. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  275. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  276. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  277. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  278. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  279. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  280. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  281. package/packages/pi-coding-agent/src/core/extensions/loader.ts +24 -11
  282. package/packages/pi-coding-agent/src/core/extensions/types.ts +8 -0
  283. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +13 -0
  284. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -2
  285. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  286. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  287. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  288. package/packages/pi-coding-agent/src/core/system-prompt.ts +3 -3
  289. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  290. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  291. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  292. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  293. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +14 -0
  294. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  295. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +12 -5
  296. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  297. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +19 -0
  298. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  299. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  300. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  301. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  302. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  303. package/packages/pi-tui/package.json +5 -0
  304. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -5
  305. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +25 -0
  306. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  307. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  308. package/packages/rpc-client/package.json +5 -0
  309. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  310. package/pkg/dist/core/export-html/ansi-to-html.js +0 -1
  311. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  312. package/pkg/dist/core/export-html/index.d.ts +1 -1
  313. package/pkg/dist/core/export-html/index.d.ts.map +1 -1
  314. package/pkg/dist/core/export-html/index.js +5 -39
  315. package/pkg/dist/core/export-html/index.js.map +1 -1
  316. package/pkg/dist/core/export-html/tool-renderer.d.ts +2 -2
  317. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  318. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -1
  319. package/scripts/ensure-workspace-builds.cjs +0 -2
  320. package/scripts/lib/workspace-manifest.cjs +86 -0
  321. package/scripts/link-workspace-packages.cjs +5 -19
  322. package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -1
  323. package/src/resources/extensions/aws-auth/index.ts +1 -2
  324. package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +7 -4
  325. package/src/resources/extensions/bg-shell/index.ts +1 -2
  326. package/src/resources/extensions/bg-shell/process-manager.ts +1 -2
  327. package/src/resources/extensions/browser-tools/index.ts +1 -2
  328. package/src/resources/extensions/claude-code-cli/index.ts +1 -1
  329. package/src/resources/extensions/claude-code-cli/partial-builder.ts +23 -115
  330. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +81 -61
  331. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +91 -22
  332. package/src/resources/extensions/cmux/index.ts +35 -10
  333. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  334. package/src/resources/extensions/google-search/index.ts +8 -470
  335. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  336. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  337. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  338. package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
  339. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  340. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  341. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -0
  342. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  343. package/src/resources/extensions/gsd/auto-post-unit.ts +30 -0
  344. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  345. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  346. package/src/resources/extensions/gsd/auto-worktree.ts +60 -5
  347. package/src/resources/extensions/gsd/auto.ts +37 -18
  348. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -2
  349. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
  350. package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
  351. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  352. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  353. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  354. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  355. package/src/resources/extensions/gsd/git-service.ts +1 -0
  356. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  357. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  358. package/src/resources/extensions/gsd/guided-flow.ts +1 -1
  359. package/src/resources/extensions/gsd/journal.ts +27 -2
  360. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  361. package/src/resources/extensions/gsd/notifications.ts +27 -15
  362. package/src/resources/extensions/gsd/reports.ts +5 -4
  363. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +11 -2
  364. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  365. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  366. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  367. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +121 -0
  368. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  369. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  370. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +76 -0
  371. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  372. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  373. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  374. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +39 -25
  375. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +181 -0
  376. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  377. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  378. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  379. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  380. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  381. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  382. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  383. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  384. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  385. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  386. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  387. package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
  388. package/src/resources/extensions/gsd/worktree-manager.ts +1 -0
  389. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  390. package/src/resources/extensions/mcp-client/index.ts +130 -11
  391. package/src/resources/extensions/ollama/index.ts +3 -3
  392. package/src/resources/extensions/ollama/ollama-chat-provider.ts +18 -6
  393. package/src/resources/extensions/remote-questions/config.ts +4 -15
  394. package/src/resources/extensions/search-the-web/index.ts +1 -2
  395. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  396. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  397. package/src/resources/extensions/shared/tests/format-utils.test.ts +3 -5
  398. package/src/resources/extensions/universal-config/index.ts +1 -1
  399. package/src/resources/skills/create-skill/SKILL.md +2 -2
  400. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  401. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  402. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  403. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  404. package/dist/web/standalone/.next/static/chunks/2826.d445fb428ef41fa1.js +0 -9
  405. package/packages/gsd-agent-core/dist/agent-session.d.ts +0 -716
  406. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +0 -1
  407. package/packages/gsd-agent-core/dist/agent-session.js +0 -2595
  408. package/packages/gsd-agent-core/dist/agent-session.js.map +0 -1
  409. package/packages/gsd-agent-core/dist/artifact-manager.d.ts +0 -52
  410. package/packages/gsd-agent-core/dist/artifact-manager.d.ts.map +0 -1
  411. package/packages/gsd-agent-core/dist/artifact-manager.js +0 -118
  412. package/packages/gsd-agent-core/dist/artifact-manager.js.map +0 -1
  413. package/packages/gsd-agent-core/dist/bash-executor.d.ts +0 -57
  414. package/packages/gsd-agent-core/dist/bash-executor.d.ts.map +0 -1
  415. package/packages/gsd-agent-core/dist/bash-executor.js +0 -282
  416. package/packages/gsd-agent-core/dist/bash-executor.js.map +0 -1
  417. package/packages/gsd-agent-core/dist/blob-store.d.ts +0 -39
  418. package/packages/gsd-agent-core/dist/blob-store.d.ts.map +0 -1
  419. package/packages/gsd-agent-core/dist/blob-store.js +0 -151
  420. package/packages/gsd-agent-core/dist/blob-store.js.map +0 -1
  421. package/packages/gsd-agent-core/dist/compaction/branch-summarization.d.ts +0 -90
  422. package/packages/gsd-agent-core/dist/compaction/branch-summarization.d.ts.map +0 -1
  423. package/packages/gsd-agent-core/dist/compaction/branch-summarization.js +0 -207
  424. package/packages/gsd-agent-core/dist/compaction/branch-summarization.js.map +0 -1
  425. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +0 -137
  426. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +0 -1
  427. package/packages/gsd-agent-core/dist/compaction/compaction.js +0 -621
  428. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +0 -1
  429. package/packages/gsd-agent-core/dist/compaction/index.d.ts +0 -7
  430. package/packages/gsd-agent-core/dist/compaction/index.d.ts.map +0 -1
  431. package/packages/gsd-agent-core/dist/compaction/index.js +0 -7
  432. package/packages/gsd-agent-core/dist/compaction/index.js.map +0 -1
  433. package/packages/gsd-agent-core/dist/compaction/utils.d.ts +0 -78
  434. package/packages/gsd-agent-core/dist/compaction/utils.d.ts.map +0 -1
  435. package/packages/gsd-agent-core/dist/compaction/utils.js +0 -263
  436. package/packages/gsd-agent-core/dist/compaction/utils.js.map +0 -1
  437. package/packages/gsd-agent-core/dist/compaction-orchestrator.d.ts +0 -90
  438. package/packages/gsd-agent-core/dist/compaction-orchestrator.d.ts.map +0 -1
  439. package/packages/gsd-agent-core/dist/compaction-orchestrator.js +0 -338
  440. package/packages/gsd-agent-core/dist/compaction-orchestrator.js.map +0 -1
  441. package/packages/gsd-agent-core/dist/contextual-tips.d.ts +0 -43
  442. package/packages/gsd-agent-core/dist/contextual-tips.d.ts.map +0 -1
  443. package/packages/gsd-agent-core/dist/contextual-tips.js +0 -208
  444. package/packages/gsd-agent-core/dist/contextual-tips.js.map +0 -1
  445. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.d.ts +0 -18
  446. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.d.ts.map +0 -1
  447. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.js +0 -250
  448. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.js.map +0 -1
  449. package/packages/gsd-agent-core/dist/export-html/index.d.ts +0 -37
  450. package/packages/gsd-agent-core/dist/export-html/index.d.ts.map +0 -1
  451. package/packages/gsd-agent-core/dist/export-html/index.js +0 -257
  452. package/packages/gsd-agent-core/dist/export-html/index.js.map +0 -1
  453. package/packages/gsd-agent-core/dist/export-html/template.css +0 -971
  454. package/packages/gsd-agent-core/dist/export-html/template.html +0 -54
  455. package/packages/gsd-agent-core/dist/export-html/template.js +0 -1583
  456. package/packages/gsd-agent-core/dist/export-html/tool-renderer.d.ts +0 -38
  457. package/packages/gsd-agent-core/dist/export-html/tool-renderer.d.ts.map +0 -1
  458. package/packages/gsd-agent-core/dist/export-html/tool-renderer.js +0 -70
  459. package/packages/gsd-agent-core/dist/export-html/tool-renderer.js.map +0 -1
  460. package/packages/gsd-agent-core/dist/export-html/vendor/highlight.min.js +0 -1213
  461. package/packages/gsd-agent-core/dist/export-html/vendor/marked.min.js +0 -6
  462. package/packages/gsd-agent-core/dist/fallback-resolver.d.ts +0 -75
  463. package/packages/gsd-agent-core/dist/fallback-resolver.d.ts.map +0 -1
  464. package/packages/gsd-agent-core/dist/fallback-resolver.js +0 -118
  465. package/packages/gsd-agent-core/dist/fallback-resolver.js.map +0 -1
  466. package/packages/gsd-agent-core/dist/image-overflow-recovery.d.ts +0 -44
  467. package/packages/gsd-agent-core/dist/image-overflow-recovery.d.ts.map +0 -1
  468. package/packages/gsd-agent-core/dist/image-overflow-recovery.js +0 -99
  469. package/packages/gsd-agent-core/dist/image-overflow-recovery.js.map +0 -1
  470. package/packages/gsd-agent-core/dist/index.d.ts +0 -14
  471. package/packages/gsd-agent-core/dist/index.d.ts.map +0 -1
  472. package/packages/gsd-agent-core/dist/index.js +0 -19
  473. package/packages/gsd-agent-core/dist/index.js.map +0 -1
  474. package/packages/gsd-agent-core/dist/keybindings.d.ts +0 -47
  475. package/packages/gsd-agent-core/dist/keybindings.d.ts.map +0 -1
  476. package/packages/gsd-agent-core/dist/keybindings.js +0 -156
  477. package/packages/gsd-agent-core/dist/keybindings.js.map +0 -1
  478. package/packages/gsd-agent-core/dist/lifecycle-hooks.d.ts +0 -42
  479. package/packages/gsd-agent-core/dist/lifecycle-hooks.d.ts.map +0 -1
  480. package/packages/gsd-agent-core/dist/lifecycle-hooks.js +0 -204
  481. package/packages/gsd-agent-core/dist/lifecycle-hooks.js.map +0 -1
  482. package/packages/gsd-agent-core/dist/retry-handler.d.ts +0 -128
  483. package/packages/gsd-agent-core/dist/retry-handler.d.ts.map +0 -1
  484. package/packages/gsd-agent-core/dist/retry-handler.js +0 -518
  485. package/packages/gsd-agent-core/dist/retry-handler.js.map +0 -1
  486. package/packages/gsd-agent-core/dist/sdk.d.ts +0 -159
  487. package/packages/gsd-agent-core/dist/sdk.d.ts.map +0 -1
  488. package/packages/gsd-agent-core/dist/sdk.js +0 -375
  489. package/packages/gsd-agent-core/dist/sdk.js.map +0 -1
  490. package/packages/gsd-agent-core/dist/system-prompt.d.ts +0 -28
  491. package/packages/gsd-agent-core/dist/system-prompt.d.ts.map +0 -1
  492. package/packages/gsd-agent-core/dist/system-prompt.js +0 -201
  493. package/packages/gsd-agent-core/dist/system-prompt.js.map +0 -1
  494. package/packages/gsd-agent-core/package.json +0 -25
  495. package/packages/gsd-agent-core/scripts/copy-assets.cjs +0 -43
  496. package/packages/gsd-agent-core/src/agent-session.test.ts +0 -169
  497. package/packages/gsd-agent-core/src/agent-session.ts +0 -3358
  498. package/packages/gsd-agent-core/src/artifact-manager.ts +0 -126
  499. package/packages/gsd-agent-core/src/bash-executor.ts +0 -352
  500. package/packages/gsd-agent-core/src/blob-store.ts +0 -154
  501. package/packages/gsd-agent-core/src/compaction/branch-summarization.ts +0 -317
  502. package/packages/gsd-agent-core/src/compaction/compaction.ts +0 -855
  503. package/packages/gsd-agent-core/src/compaction/index.ts +0 -7
  504. package/packages/gsd-agent-core/src/compaction/utils.ts +0 -312
  505. package/packages/gsd-agent-core/src/compaction-orchestrator.ts +0 -449
  506. package/packages/gsd-agent-core/src/contextual-tips.ts +0 -232
  507. package/packages/gsd-agent-core/src/export-html/ansi-to-html.ts +0 -259
  508. package/packages/gsd-agent-core/src/export-html/index.ts +0 -345
  509. package/packages/gsd-agent-core/src/export-html/template.css +0 -971
  510. package/packages/gsd-agent-core/src/export-html/template.html +0 -54
  511. package/packages/gsd-agent-core/src/export-html/template.js +0 -1583
  512. package/packages/gsd-agent-core/src/export-html/tool-renderer.ts +0 -114
  513. package/packages/gsd-agent-core/src/export-html/vendor/highlight.min.js +0 -1213
  514. package/packages/gsd-agent-core/src/export-html/vendor/marked.min.js +0 -6
  515. package/packages/gsd-agent-core/src/fallback-resolver.ts +0 -193
  516. package/packages/gsd-agent-core/src/image-overflow-recovery.ts +0 -120
  517. package/packages/gsd-agent-core/src/index.ts +0 -68
  518. package/packages/gsd-agent-core/src/keybindings.ts +0 -220
  519. package/packages/gsd-agent-core/src/lifecycle-hooks.ts +0 -284
  520. package/packages/gsd-agent-core/src/retry-handler.ts +0 -620
  521. package/packages/gsd-agent-core/src/sdk.ts +0 -550
  522. package/packages/gsd-agent-core/src/system-prompt.ts +0 -270
  523. package/packages/gsd-agent-core/tsconfig.json +0 -28
  524. package/packages/gsd-agent-core/tsconfig.tsbuildinfo +0 -1
  525. package/packages/gsd-agent-modes/dist/cli/args.d.ts +0 -58
  526. package/packages/gsd-agent-modes/dist/cli/args.d.ts.map +0 -1
  527. package/packages/gsd-agent-modes/dist/cli/args.js +0 -324
  528. package/packages/gsd-agent-modes/dist/cli/args.js.map +0 -1
  529. package/packages/gsd-agent-modes/dist/cli/config-selector.d.ts +0 -13
  530. package/packages/gsd-agent-modes/dist/cli/config-selector.d.ts.map +0 -1
  531. package/packages/gsd-agent-modes/dist/cli/config-selector.js +0 -32
  532. package/packages/gsd-agent-modes/dist/cli/config-selector.js.map +0 -1
  533. package/packages/gsd-agent-modes/dist/cli/file-processor.d.ts +0 -15
  534. package/packages/gsd-agent-modes/dist/cli/file-processor.d.ts.map +0 -1
  535. package/packages/gsd-agent-modes/dist/cli/file-processor.js +0 -86
  536. package/packages/gsd-agent-modes/dist/cli/file-processor.js.map +0 -1
  537. package/packages/gsd-agent-modes/dist/cli/list-models.d.ts +0 -21
  538. package/packages/gsd-agent-modes/dist/cli/list-models.d.ts.map +0 -1
  539. package/packages/gsd-agent-modes/dist/cli/list-models.js +0 -114
  540. package/packages/gsd-agent-modes/dist/cli/list-models.js.map +0 -1
  541. package/packages/gsd-agent-modes/dist/cli/session-picker.d.ts +0 -10
  542. package/packages/gsd-agent-modes/dist/cli/session-picker.d.ts.map +0 -1
  543. package/packages/gsd-agent-modes/dist/cli/session-picker.js +0 -37
  544. package/packages/gsd-agent-modes/dist/cli/session-picker.js.map +0 -1
  545. package/packages/gsd-agent-modes/dist/index.d.ts +0 -7
  546. package/packages/gsd-agent-modes/dist/index.d.ts.map +0 -1
  547. package/packages/gsd-agent-modes/dist/index.js +0 -7
  548. package/packages/gsd-agent-modes/dist/index.js.map +0 -1
  549. package/packages/gsd-agent-modes/dist/main.d.ts +0 -8
  550. package/packages/gsd-agent-modes/dist/main.d.ts.map +0 -1
  551. package/packages/gsd-agent-modes/dist/main.js +0 -491
  552. package/packages/gsd-agent-modes/dist/main.js.map +0 -1
  553. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.d.ts +0 -34
  554. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.d.ts.map +0 -1
  555. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.js +0 -330
  556. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.js.map +0 -1
  557. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +0 -29
  558. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +0 -1
  559. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +0 -141
  560. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +0 -1
  561. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.d.ts +0 -36
  562. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.d.ts.map +0 -1
  563. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +0 -157
  564. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +0 -1
  565. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  566. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.d.ts.map +0 -1
  567. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.js +0 -48
  568. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.js.map +0 -1
  569. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  570. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +0 -1
  571. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +0 -43
  572. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +0 -1
  573. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.d.ts +0 -11
  574. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.d.ts.map +0 -1
  575. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.js +0 -47
  576. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.js.map +0 -1
  577. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  578. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
  579. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +0 -44
  580. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
  581. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.d.ts +0 -71
  582. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.d.ts.map +0 -1
  583. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.js +0 -474
  584. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.js.map +0 -1
  585. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.d.ts +0 -15
  586. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.d.ts.map +0 -1
  587. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.js +0 -32
  588. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.js.map +0 -1
  589. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +0 -22
  590. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +0 -1
  591. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +0 -70
  592. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +0 -1
  593. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.d.ts +0 -20
  594. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.d.ts.map +0 -1
  595. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.js +0 -75
  596. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.js.map +0 -1
  597. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  598. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  599. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.js +0 -140
  600. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.js.map +0 -1
  601. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.d.ts +0 -12
  602. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.d.ts.map +0 -1
  603. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.js +0 -133
  604. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.js.map +0 -1
  605. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.d.ts +0 -33
  606. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.d.ts.map +0 -1
  607. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.js +0 -82
  608. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.js.map +0 -1
  609. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +0 -20
  610. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +0 -1
  611. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +0 -111
  612. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +0 -1
  613. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +0 -24
  614. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +0 -1
  615. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +0 -63
  616. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +0 -1
  617. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +0 -33
  618. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +0 -1
  619. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +0 -118
  620. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +0 -1
  621. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +0 -32
  622. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +0 -1
  623. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +0 -230
  624. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +0 -1
  625. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +0 -34
  626. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +0 -1
  627. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +0 -36
  628. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +0 -1
  629. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.d.ts +0 -48
  630. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.d.ts.map +0 -1
  631. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.js +0 -72
  632. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.js.map +0 -1
  633. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +0 -63
  634. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +0 -1
  635. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +0 -213
  636. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +0 -1
  637. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.d.ts +0 -86
  638. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.d.ts.map +0 -1
  639. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.js +0 -536
  640. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.js.map +0 -1
  641. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +0 -19
  642. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +0 -1
  643. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +0 -93
  644. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +0 -1
  645. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.d.ts +0 -30
  646. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.d.ts.map +0 -1
  647. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.js +0 -169
  648. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.js.map +0 -1
  649. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -49
  650. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.d.ts.map +0 -1
  651. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.js +0 -267
  652. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.js.map +0 -1
  653. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.d.ts +0 -21
  654. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.d.ts.map +0 -1
  655. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.js +0 -155
  656. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.js.map +0 -1
  657. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.d.ts +0 -97
  658. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.d.ts.map +0 -1
  659. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.js +0 -810
  660. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.js.map +0 -1
  661. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +0 -71
  662. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +0 -1
  663. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +0 -320
  664. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +0 -1
  665. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  666. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.d.ts.map +0 -1
  667. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.js +0 -34
  668. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.js.map +0 -1
  669. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  670. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +0 -1
  671. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +0 -46
  672. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +0 -1
  673. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  674. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.d.ts.map +0 -1
  675. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.js +0 -45
  676. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.js.map +0 -1
  677. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  678. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +0 -1
  679. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +0 -46
  680. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +0 -1
  681. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.d.ts +0 -15
  682. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.d.ts.map +0 -1
  683. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.js +0 -40
  684. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.js.map +0 -1
  685. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +0 -111
  686. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
  687. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +0 -984
  688. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +0 -1
  689. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.d.ts +0 -44
  690. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.d.ts.map +0 -1
  691. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.js +0 -61
  692. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.js.map +0 -1
  693. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.d.ts +0 -109
  694. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.d.ts.map +0 -1
  695. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.js +0 -1035
  696. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.js.map +0 -1
  697. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  698. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.d.ts.map +0 -1
  699. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.js +0 -112
  700. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.js.map +0 -1
  701. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +0 -12
  702. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +0 -1
  703. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +0 -38
  704. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +0 -1
  705. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  706. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.d.ts.map +0 -1
  707. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.js +0 -33
  708. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.js.map +0 -1
  709. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +0 -27
  710. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +0 -1
  711. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +0 -793
  712. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +0 -1
  713. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts +0 -4
  714. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +0 -1
  715. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +0 -62
  716. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +0 -1
  717. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts +0 -22
  718. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +0 -1
  719. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +0 -118
  720. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +0 -1
  721. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.d.ts +0 -7
  722. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.d.ts.map +0 -1
  723. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.js +0 -68
  724. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.js.map +0 -1
  725. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +0 -50
  726. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +0 -1
  727. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +0 -2
  728. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +0 -1
  729. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +0 -358
  730. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +0 -1
  731. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +0 -3409
  732. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +0 -1
  733. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.d.ts +0 -77
  734. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.d.ts.map +0 -1
  735. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.js +0 -529
  736. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.js.map +0 -1
  737. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.d.ts +0 -6
  738. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.d.ts.map +0 -1
  739. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.js +0 -15
  740. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.js.map +0 -1
  741. package/packages/gsd-agent-modes/dist/modes/print-mode.d.ts +0 -28
  742. package/packages/gsd-agent-modes/dist/modes/print-mode.d.ts.map +0 -1
  743. package/packages/gsd-agent-modes/dist/modes/print-mode.js +0 -84
  744. package/packages/gsd-agent-modes/dist/modes/print-mode.js.map +0 -1
  745. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.d.ts +0 -17
  746. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.d.ts.map +0 -1
  747. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.js +0 -49
  748. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.js.map +0 -1
  749. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.d.ts +0 -37
  750. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.d.ts.map +0 -1
  751. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.js +0 -84
  752. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.js.map +0 -1
  753. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +0 -243
  754. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +0 -1
  755. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +0 -464
  756. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +0 -1
  757. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts +0 -25
  758. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +0 -1
  759. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +0 -750
  760. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +0 -1
  761. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.d.ts +0 -511
  762. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.d.ts.map +0 -1
  763. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.js +0 -8
  764. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.js.map +0 -1
  765. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.d.ts +0 -19
  766. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.d.ts.map +0 -1
  767. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.js +0 -45
  768. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.js.map +0 -1
  769. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.d.ts +0 -22
  770. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.d.ts.map +0 -1
  771. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.js +0 -21
  772. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.js.map +0 -1
  773. package/packages/gsd-agent-modes/dist/pi-tui-compat.d.ts +0 -4
  774. package/packages/gsd-agent-modes/dist/pi-tui-compat.d.ts.map +0 -1
  775. package/packages/gsd-agent-modes/dist/pi-tui-compat.js +0 -3
  776. package/packages/gsd-agent-modes/dist/pi-tui-compat.js.map +0 -1
  777. package/packages/gsd-agent-modes/dist/theme.d.ts +0 -15
  778. package/packages/gsd-agent-modes/dist/theme.d.ts.map +0 -1
  779. package/packages/gsd-agent-modes/dist/theme.js +0 -23
  780. package/packages/gsd-agent-modes/dist/theme.js.map +0 -1
  781. package/packages/gsd-agent-modes/dist/utils/theme.d.ts +0 -16
  782. package/packages/gsd-agent-modes/dist/utils/theme.d.ts.map +0 -1
  783. package/packages/gsd-agent-modes/dist/utils/theme.js +0 -11
  784. package/packages/gsd-agent-modes/dist/utils/theme.js.map +0 -1
  785. package/packages/gsd-agent-modes/package.json +0 -23
  786. package/packages/gsd-agent-modes/src/cli/args.ts +0 -350
  787. package/packages/gsd-agent-modes/src/cli/config-selector.ts +0 -54
  788. package/packages/gsd-agent-modes/src/cli/file-processor.ts +0 -107
  789. package/packages/gsd-agent-modes/src/cli/list-models.ts +0 -141
  790. package/packages/gsd-agent-modes/src/cli/session-picker.ts +0 -59
  791. package/packages/gsd-agent-modes/src/index.ts +0 -6
  792. package/packages/gsd-agent-modes/src/main.ts +0 -614
  793. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/login-dialog.test.ts +0 -24
  794. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/provider-display-name.test.ts +0 -18
  795. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/timestamp.test.ts +0 -38
  796. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/tool-execution.test.ts +0 -171
  797. package/packages/gsd-agent-modes/src/modes/interactive/components/armin.ts +0 -382
  798. package/packages/gsd-agent-modes/src/modes/interactive/components/assistant-message.ts +0 -178
  799. package/packages/gsd-agent-modes/src/modes/interactive/components/bash-execution.ts +0 -212
  800. package/packages/gsd-agent-modes/src/modes/interactive/components/bordered-loader.ts +0 -66
  801. package/packages/gsd-agent-modes/src/modes/interactive/components/branch-summary-message.ts +0 -59
  802. package/packages/gsd-agent-modes/src/modes/interactive/components/chat-frame.ts +0 -67
  803. package/packages/gsd-agent-modes/src/modes/interactive/components/compaction-summary-message.ts +0 -60
  804. package/packages/gsd-agent-modes/src/modes/interactive/components/config-selector.ts +0 -597
  805. package/packages/gsd-agent-modes/src/modes/interactive/components/countdown-timer.ts +0 -41
  806. package/packages/gsd-agent-modes/src/modes/interactive/components/custom-editor.ts +0 -88
  807. package/packages/gsd-agent-modes/src/modes/interactive/components/custom-message.ts +0 -100
  808. package/packages/gsd-agent-modes/src/modes/interactive/components/daxnuts.ts +0 -165
  809. package/packages/gsd-agent-modes/src/modes/interactive/components/diff.ts +0 -147
  810. package/packages/gsd-agent-modes/src/modes/interactive/components/dynamic-border.test.ts +0 -73
  811. package/packages/gsd-agent-modes/src/modes/interactive/components/dynamic-border.ts +0 -89
  812. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-editor.ts +0 -151
  813. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-input.ts +0 -100
  814. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-selector.ts +0 -156
  815. package/packages/gsd-agent-modes/src/modes/interactive/components/footer.ts +0 -257
  816. package/packages/gsd-agent-modes/src/modes/interactive/components/index.ts +0 -35
  817. package/packages/gsd-agent-modes/src/modes/interactive/components/keybinding-hints.ts +0 -84
  818. package/packages/gsd-agent-modes/src/modes/interactive/components/login-dialog.ts +0 -257
  819. package/packages/gsd-agent-modes/src/modes/interactive/components/model-selector.ts +0 -656
  820. package/packages/gsd-agent-modes/src/modes/interactive/components/oauth-selector.ts +0 -122
  821. package/packages/gsd-agent-modes/src/modes/interactive/components/provider-manager.ts +0 -210
  822. package/packages/gsd-agent-modes/src/modes/interactive/components/scoped-models-selector.ts +0 -342
  823. package/packages/gsd-agent-modes/src/modes/interactive/components/session-selector-search.ts +0 -194
  824. package/packages/gsd-agent-modes/src/modes/interactive/components/session-selector.ts +0 -1011
  825. package/packages/gsd-agent-modes/src/modes/interactive/components/settings-selector.ts +0 -452
  826. package/packages/gsd-agent-modes/src/modes/interactive/components/show-images-selector.ts +0 -45
  827. package/packages/gsd-agent-modes/src/modes/interactive/components/skill-invocation-message.ts +0 -56
  828. package/packages/gsd-agent-modes/src/modes/interactive/components/theme-selector.ts +0 -63
  829. package/packages/gsd-agent-modes/src/modes/interactive/components/thinking-selector.ts +0 -64
  830. package/packages/gsd-agent-modes/src/modes/interactive/components/timestamp.ts +0 -48
  831. package/packages/gsd-agent-modes/src/modes/interactive/components/tool-execution.ts +0 -1157
  832. package/packages/gsd-agent-modes/src/modes/interactive/components/tree-render-utils.ts +0 -81
  833. package/packages/gsd-agent-modes/src/modes/interactive/components/tree-selector.ts +0 -1208
  834. package/packages/gsd-agent-modes/src/modes/interactive/components/user-message-selector.ts +0 -145
  835. package/packages/gsd-agent-modes/src/modes/interactive/components/user-message.ts +0 -44
  836. package/packages/gsd-agent-modes/src/modes/interactive/components/visual-truncate.ts +0 -50
  837. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller-ordering.test.ts +0 -1430
  838. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller.test.ts +0 -71
  839. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller.ts +0 -957
  840. package/packages/gsd-agent-modes/src/modes/interactive/controllers/extension-ui-controller.ts +0 -63
  841. package/packages/gsd-agent-modes/src/modes/interactive/controllers/input-controller.test.ts +0 -183
  842. package/packages/gsd-agent-modes/src/modes/interactive/controllers/input-controller.ts +0 -140
  843. package/packages/gsd-agent-modes/src/modes/interactive/controllers/model-controller.ts +0 -77
  844. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode-ordering.test.ts +0 -44
  845. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode-state.ts +0 -49
  846. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode.ts +0 -4195
  847. package/packages/gsd-agent-modes/src/modes/interactive/slash-command-handlers.ts +0 -670
  848. package/packages/gsd-agent-modes/src/modes/interactive/utils/shorten-path.ts +0 -14
  849. package/packages/gsd-agent-modes/src/modes/print-mode.ts +0 -106
  850. package/packages/gsd-agent-modes/src/modes/rpc/jsonl.ts +0 -58
  851. package/packages/gsd-agent-modes/src/modes/rpc/remote-terminal.ts +0 -109
  852. package/packages/gsd-agent-modes/src/modes/rpc/rpc-client.ts +0 -572
  853. package/packages/gsd-agent-modes/src/modes/rpc/rpc-mode.ts +0 -902
  854. package/packages/gsd-agent-modes/src/modes/rpc/rpc-protocol-v2.test.ts +0 -971
  855. package/packages/gsd-agent-modes/src/modes/rpc/rpc-types.ts +0 -335
  856. package/packages/gsd-agent-modes/src/modes/shared/command-context-actions.ts +0 -53
  857. package/packages/gsd-agent-modes/src/pi-coding-agent-compat.ts +0 -42
  858. package/packages/gsd-agent-modes/src/pi-tui-compat.ts +0 -4
  859. package/packages/gsd-agent-modes/src/theme.ts +0 -25
  860. package/packages/gsd-agent-modes/src/utils/theme.ts +0 -24
  861. package/packages/gsd-agent-modes/tsconfig.json +0 -28
  862. package/packages/gsd-agent-modes/tsconfig.tsbuildinfo +0 -1
  863. package/packages/gsd-agent-types/dist/index.d.ts +0 -176
  864. package/packages/gsd-agent-types/dist/index.d.ts.map +0 -1
  865. package/packages/gsd-agent-types/dist/index.js +0 -24
  866. package/packages/gsd-agent-types/dist/index.js.map +0 -1
  867. package/packages/gsd-agent-types/package.json +0 -24
  868. package/packages/gsd-agent-types/src/index.ts +0 -206
  869. package/packages/gsd-agent-types/tsconfig.json +0 -25
  870. package/packages/gsd-agent-types/tsconfig.tsbuildinfo +0 -1
  871. package/packages/native/dist/tsconfig.tsbuildinfo +0 -1
  872. package/src/resources/extensions/claude-code-cli/tests/provider-registration.test.ts +0 -27
  873. /package/dist/web/standalone/.next/static/{gy6_foLMsEzdGBT19c3hr → 5wbu35_C2_MQ3Jj1lEVDx}/_buildManifest.js +0 -0
  874. /package/dist/web/standalone/.next/static/{gy6_foLMsEzdGBT19c3hr → 5wbu35_C2_MQ3Jj1lEVDx}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-integration.test.js","sourceRoot":"","sources":["../../../src/core/lsp/lsp-integration.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Integration test for the LSP tool port.\n *\n * Spins up typescript-language-server against a temp TypeScript project\n * and exercises: initialize, didOpen, hover, definition, references,\n * documentSymbol, diagnostics, and shutdown.\n *\n * Run: node --experimental-strip-types --test src/core/lsp/lsp-integration.test.ts\n * (from packages/pi-coding-agent/)\n */\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n// ---------------------------------------------------------------------------\n// Helpers — lightweight JSON-RPC over stdio (no dependency on our LSP code)\n// ---------------------------------------------------------------------------\n\ninterface JsonRpcRequest {\n\tjsonrpc: \"2.0\";\n\tid: number;\n\tmethod: string;\n\tparams: unknown;\n}\n\ninterface JsonRpcNotification {\n\tjsonrpc: \"2.0\";\n\tmethod: string;\n\tparams?: unknown;\n}\n\ninterface JsonRpcResponse {\n\tjsonrpc: \"2.0\";\n\tid?: number;\n\tresult?: unknown;\n\terror?: { code: number; message: string };\n}\n\nfunction encodeMessage(msg: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse): string {\n\tconst body = JSON.stringify(msg);\n\treturn `Content-Length: ${Buffer.byteLength(body, \"utf-8\")}\\r\\n\\r\\n${body}`;\n}\n\n/**\n * Minimal LSP harness: spawns a language server, sends requests, collects responses.\n */\nclass LspHarness {\n\tprivate proc;\n\tprivate nextId = 1;\n\tprivate buffer = Buffer.alloc(0);\n\tprivate pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n\tprivate notifications: Array<{ method: string; params: unknown }> = [];\n\n\tconstructor(command: string, args: string[], cwd: string) {\n\t\tthis.proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tthis.proc.stdout!.on(\"data\", (chunk: Buffer) => {\n\t\t\tthis.buffer = Buffer.concat([this.buffer, chunk]);\n\t\t\tthis.drain();\n\t\t});\n\n\t\tthis.proc.stderr!.on(\"data\", (chunk: Buffer) => {\n\t\t\t// Swallow stderr (server logs)\n\t\t});\n\t}\n\n\tprivate drain(): void {\n\t\twhile (true) {\n\t\t\tconst headerEnd = this.findHeaderEnd();\n\t\t\tif (headerEnd === -1) return;\n\n\t\t\tconst headerText = this.buffer.subarray(0, headerEnd).toString(\"utf-8\");\n\t\t\tconst match = headerText.match(/Content-Length:\\s*(\\d+)/i);\n\t\t\tif (!match) return;\n\n\t\t\tconst contentLength = parseInt(match[1], 10);\n\t\t\tconst messageStart = headerEnd + 4; // past \\r\\n\\r\\n\n\t\t\tconst messageEnd = messageStart + contentLength;\n\t\t\tif (this.buffer.length < messageEnd) return;\n\n\t\t\tconst body = this.buffer.subarray(messageStart, messageEnd).toString(\"utf-8\");\n\t\t\tthis.buffer = Buffer.from(this.buffer.subarray(messageEnd));\n\n\t\t\tconst msg = JSON.parse(body) as JsonRpcResponse & { method?: string; params?: unknown };\n\n\t\t\tif (msg.id !== undefined && this.pending.has(msg.id)) {\n\t\t\t\tconst p = this.pending.get(msg.id)!;\n\t\t\t\tthis.pending.delete(msg.id);\n\t\t\t\tif (msg.error) {\n\t\t\t\t\tp.reject(new Error(`LSP error ${msg.error.code}: ${msg.error.message}`));\n\t\t\t\t} else {\n\t\t\t\t\tp.resolve(msg.result);\n\t\t\t\t}\n\t\t\t} else if (msg.method) {\n\t\t\t\t// Server request or notification\n\t\t\t\tthis.notifications.push({ method: msg.method, params: msg.params });\n\t\t\t\t// Auto-respond to server requests that have an id\n\t\t\t\tif (msg.id !== undefined) {\n\t\t\t\t\tthis.respond(msg.id, null);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate findHeaderEnd(): number {\n\t\tfor (let i = 0; i < this.buffer.length - 3; i++) {\n\t\t\tif (\n\t\t\t\tthis.buffer[i] === 13 &&\n\t\t\t\tthis.buffer[i + 1] === 10 &&\n\t\t\t\tthis.buffer[i + 2] === 13 &&\n\t\t\t\tthis.buffer[i + 3] === 10\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate respond(id: number, result: unknown): void {\n\t\tconst msg: JsonRpcResponse = { jsonrpc: \"2.0\", id, result };\n\t\tthis.proc.stdin!.write(encodeMessage(msg));\n\t}\n\n\tasync request(method: string, params: unknown, timeoutMs = 15000): Promise<unknown> {\n\t\tconst id = this.nextId++;\n\t\tconst msg: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n\t\tthis.proc.stdin!.write(encodeMessage(msg));\n\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(`Request ${method} timed out after ${timeoutMs}ms`));\n\t\t\t}, timeoutMs);\n\n\t\t\tthis.pending.set(id, {\n\t\t\t\tresolve: (v) => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tresolve(v);\n\t\t\t\t},\n\t\t\t\treject: (e) => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\treject(e);\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t}\n\n\tnotify(method: string, params: unknown): void {\n\t\tconst msg: JsonRpcNotification = { jsonrpc: \"2.0\", method, params };\n\t\tthis.proc.stdin!.write(encodeMessage(msg));\n\t}\n\n\tgetNotifications(method?: string): Array<{ method: string; params: unknown }> {\n\t\tif (!method) return this.notifications;\n\t\treturn this.notifications.filter((n) => n.method === method);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.request(\"shutdown\", null, 5000);\n\t\t\tthis.notify(\"exit\", null);\n\t\t} catch {\n\t\t\t// Best effort\n\t\t}\n\t\tthis.proc.kill();\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Test fixtures\n// ---------------------------------------------------------------------------\n\nfunction createTempProject(): { dir: string; cleanup: () => void } {\n\tconst dir = fs.mkdtempSync(path.join(os.tmpdir(), \"lsp-test-\"));\n\n\t// tsconfig.json\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"tsconfig.json\"),\n\t\tJSON.stringify(\n\t\t\t{\n\t\t\t\tcompilerOptions: {\n\t\t\t\t\ttarget: \"ES2022\",\n\t\t\t\t\tmodule: \"commonjs\",\n\t\t\t\t\tstrict: true,\n\t\t\t\t\toutDir: \"./dist\",\n\t\t\t\t\trootDir: \"./src\",\n\t\t\t\t},\n\t\t\t\tinclude: [\"src/**/*.ts\"],\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t),\n\t);\n\n\t// package.json\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"package.json\"),\n\t\tJSON.stringify({ name: \"lsp-test-project\", version: \"1.0.0\" }, null, 2),\n\t);\n\n\tfs.mkdirSync(path.join(dir, \"src\"));\n\n\t// src/math.ts — module with exported functions\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"src\", \"math.ts\"),\n\t\t`export function add(a: number, b: number): number {\n return a + b;\n}\n\nexport function subtract(a: number, b: number): number {\n return a - b;\n}\n\nexport interface Calculator {\n add(a: number, b: number): number;\n subtract(a: number, b: number): number;\n}\n`,\n\t);\n\n\t// src/main.ts — imports from math, has a type error\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"src\", \"main.ts\"),\n\t\t`import { add, subtract, Calculator } from \"./math\";\n\nconst result: number = add(1, 2);\nconst diff: number = subtract(5, 3);\n\n// Intentional type error: string assigned to number\nconst bad: number = \"not a number\";\n\nexport function compute(calc: Calculator): number {\n return calc.add(1, 2) + calc.subtract(5, 3);\n}\n`,\n\t);\n\n\treturn {\n\t\tdir,\n\t\tcleanup: () => fs.rmSync(dir, { recursive: true, force: true }),\n\t};\n}\n\nfunction fileToUri(filePath: string): string {\n\treturn `file://${path.resolve(filePath)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ntest(\"LSP integration: typescript-language-server\", async (t) => {\n\tconst { dir, cleanup } = createTempProject();\n\tconst mainPath = path.join(dir, \"src\", \"main.ts\");\n\tconst mathPath = path.join(dir, \"src\", \"math.ts\");\n\tconst mainUri = fileToUri(mainPath);\n\tconst mathUri = fileToUri(mathPath);\n\n\tconst lsp = new LspHarness(\"typescript-language-server\", [\"--stdio\"], dir);\n\n\ttry {\n\t\t// ---- Initialize ----\n\t\tawait t.test(\"initialize handshake\", async () => {\n\t\t\tconst result = (await lsp.request(\"initialize\", {\n\t\t\t\tprocessId: process.pid,\n\t\t\t\trootUri: fileToUri(dir),\n\t\t\t\trootPath: dir,\n\t\t\t\tcapabilities: {\n\t\t\t\t\ttextDocument: {\n\t\t\t\t\t\thover: { contentFormat: [\"markdown\", \"plaintext\"] },\n\t\t\t\t\t\tdefinition: { linkSupport: true },\n\t\t\t\t\t\treferences: {},\n\t\t\t\t\t\tdocumentSymbol: { hierarchicalDocumentSymbolSupport: true },\n\t\t\t\t\t\tpublishDiagnostics: { relatedInformation: true },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tworkspaceFolders: [{ uri: fileToUri(dir), name: \"test\" }],\n\t\t\t})) as { capabilities?: Record<string, unknown> };\n\n\t\t\tassert.ok(result, \"initialize should return a result\");\n\t\t\tassert.ok(result.capabilities, \"result should have capabilities\");\n\t\t\tassert.ok(result.capabilities.hoverProvider !== undefined, \"should support hover\");\n\t\t\tassert.ok(result.capabilities.definitionProvider !== undefined, \"should support definition\");\n\t\t});\n\n\t\tlsp.notify(\"initialized\", {});\n\n\t\t// Open both files\n\t\tconst mainContent = fs.readFileSync(mainPath, \"utf-8\");\n\t\tconst mathContent = fs.readFileSync(mathPath, \"utf-8\");\n\n\t\tlsp.notify(\"textDocument/didOpen\", {\n\t\t\ttextDocument: { uri: mainUri, languageId: \"typescript\", version: 1, text: mainContent },\n\t\t});\n\t\tlsp.notify(\"textDocument/didOpen\", {\n\t\t\ttextDocument: { uri: mathUri, languageId: \"typescript\", version: 1, text: mathContent },\n\t\t});\n\n\t\t// Give the server time to index\n\t\tawait new Promise((r) => setTimeout(r, 3000));\n\n\t\t// ---- Hover ----\n\t\tawait t.test(\"hover on 'add' call\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/hover\", {\n\t\t\t\ttextDocument: { uri: mainUri },\n\t\t\t\tposition: { line: 2, character: 24 }, // on 'add' in \"add(1, 2)\"\n\t\t\t})) as { contents?: unknown } | null;\n\n\t\t\tassert.ok(result, \"hover should return a result\");\n\t\t\tassert.ok(result.contents, \"hover should have contents\");\n\t\t\tconst text = JSON.stringify(result.contents);\n\t\t\tassert.ok(\n\t\t\t\ttext.includes(\"add\") || text.includes(\"number\"),\n\t\t\t\t`hover text should mention 'add' or 'number', got: ${text.slice(0, 200)}`,\n\t\t\t);\n\t\t});\n\n\t\t// ---- Go to Definition ----\n\t\tawait t.test(\"go to definition of 'add'\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/definition\", {\n\t\t\t\ttextDocument: { uri: mainUri },\n\t\t\t\tposition: { line: 2, character: 24 }, // on 'add'\n\t\t\t})) as unknown;\n\n\t\t\tassert.ok(result, \"definition should return a result\");\n\t\t\tconst locations = Array.isArray(result) ? result : [result];\n\t\t\tassert.ok(locations.length > 0, \"should find at least one definition\");\n\t\t\t// Response can be Location (uri) or LocationLink (targetUri)\n\t\t\tconst loc = locations[0] as Record<string, unknown>;\n\t\t\tconst uri = (loc.uri ?? loc.targetUri) as string;\n\t\t\tassert.ok(uri, `definition should have uri or targetUri, got keys: ${Object.keys(loc).join(\", \")}`);\n\t\t\tassert.ok(\n\t\t\t\turi.includes(\"math.ts\"),\n\t\t\t\t`definition should point to math.ts, got: ${uri}`,\n\t\t\t);\n\t\t});\n\n\t\t// ---- References ----\n\t\tawait t.test(\"find references of 'add'\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/references\", {\n\t\t\t\ttextDocument: { uri: mathUri },\n\t\t\t\tposition: { line: 0, character: 16 }, // on 'add' definition\n\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t})) as Array<{ uri: string; range: unknown }> | null;\n\n\t\t\tassert.ok(result, \"references should return a result\");\n\t\t\tassert.ok(result.length >= 2, `should find at least 2 references (decl + usage), got ${result.length}`);\n\t\t});\n\n\t\t// ---- Document Symbols ----\n\t\tawait t.test(\"document symbols in math.ts\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/documentSymbol\", {\n\t\t\t\ttextDocument: { uri: mathUri },\n\t\t\t})) as Array<{ name: string; kind: number }> | null;\n\n\t\t\tassert.ok(result, \"documentSymbol should return a result\");\n\t\t\tassert.ok(result.length >= 2, `should find at least 2 symbols, got ${result.length}`);\n\t\t\tconst names = result.map((s) => s.name);\n\t\t\tassert.ok(names.includes(\"add\"), `symbols should include 'add', got: ${names.join(\", \")}`);\n\t\t\tassert.ok(names.includes(\"subtract\"), `symbols should include 'subtract', got: ${names.join(\", \")}`);\n\t\t});\n\n\t\t// ---- Diagnostics (published via notification) ----\n\t\tawait t.test(\"diagnostics for type error\", async () => {\n\t\t\t// Wait a bit more for diagnostics to arrive\n\t\t\tawait new Promise((r) => setTimeout(r, 2000));\n\n\t\t\tconst diagNotifications = lsp.getNotifications(\"textDocument/publishDiagnostics\");\n\t\t\tconst mainDiags = diagNotifications.filter(\n\t\t\t\t(n) => (n.params as { uri: string }).uri === mainUri,\n\t\t\t);\n\n\t\t\tassert.ok(mainDiags.length > 0, \"should receive diagnostics for main.ts\");\n\n\t\t\tconst lastDiag = mainDiags[mainDiags.length - 1];\n\t\t\tconst diagnostics = (lastDiag.params as { diagnostics: Array<{ message: string; range: unknown }> })\n\t\t\t\t.diagnostics;\n\n\t\t\t// Should catch the type error: string assigned to number\n\t\t\tconst typeError = diagnostics.find(\n\t\t\t\t(d) => d.message.includes(\"not assignable\") || d.message.includes(\"Type\"),\n\t\t\t);\n\t\t\tassert.ok(\n\t\t\t\ttypeError,\n\t\t\t\t`should find type error diagnostic, got: ${diagnostics.map((d) => d.message).join(\"; \")}`,\n\t\t\t);\n\t\t});\n\n\t\t// ---- Shutdown ----\n\t\tawait t.test(\"clean shutdown\", async () => {\n\t\t\t// Should not throw\n\t\t\tawait lsp.shutdown();\n\t\t});\n\t} catch (err) {\n\t\tawait lsp.shutdown().catch(() => {});\n\t\tcleanup();\n\t\tthrow err;\n\t}\n\n\tcleanup();\n});\n"]}
1
+ {"version":3,"file":"lsp-integration.test.js","sourceRoot":"","sources":["../../../src/core/lsp/lsp-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA0B/C,SAAS,aAAa,CAAC,GAA2D;IACjF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,mBAAmB,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU;IAOf,YAAY,OAAe,EAAE,IAAc,EAAE,GAAW;QALhD,WAAM,GAAG,CAAC,CAAC;QACX,WAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,YAAO,GAAG,IAAI,GAAG,EAAyE,CAAC;QAC3F,kBAAa,GAA+C,EAAE,CAAC;QAGtE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YAChC,GAAG;YACH,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC9C,+BAA+B;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK;QACZ,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,IAAI,SAAS,KAAK,CAAC,CAAC;gBAAE,OAAO;YAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC3D,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,gBAAgB;YACpD,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;YAChD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU;gBAAE,OAAO;YAE5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YAE5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4D,CAAC;YAExF,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBACf,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC1E,CAAC;qBAAM,CAAC;oBACP,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACF,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACvB,iCAAiC;gBACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpE,kDAAkD;gBAClD,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAEO,aAAa;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,IACC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE;gBACrB,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE;gBACzB,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE;gBACzB,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EACxB,CAAC;gBACF,OAAO,CAAC,CAAC;YACV,CAAC;QACF,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACX,CAAC;IAEO,OAAO,CAAC,EAAU,EAAE,MAAe;QAC1C,MAAM,GAAG,GAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,MAAe,EAAE,SAAS,GAAG,KAAK;QAC/D,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3C,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,MAAM,oBAAoB,SAAS,IAAI,CAAC,CAAC,CAAC;YACvE,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACpB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,CAAC,CAAC,CAAC,CAAC;gBACZ,CAAC;gBACD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;oBACb,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,MAAM,CAAC,CAAC,CAAC,CAAC;gBACX,CAAC;aACD,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,MAAe;QACrC,MAAM,GAAG,GAAwB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,gBAAgB,CAAC,MAAe;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QACvC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,cAAc;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC;CACD;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,SAAS,iBAAiB;IACzB,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAEhE,gBAAgB;IAChB,EAAE,CAAC,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC/B,IAAI,CAAC,SAAS,CACb;QACC,eAAe,EAAE;YAChB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,OAAO;SAChB;QACD,OAAO,EAAE,CAAC,aAAa,CAAC;KACxB,EACD,IAAI,EACJ,CAAC,CACD,CACD,CAAC;IAEF,eAAe;IACf,EAAE,CAAC,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACvE,CAAC;IAEF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpC,+CAA+C;IAC/C,EAAE,CAAC,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,EAChC;;;;;;;;;;;;CAYD,CACC,CAAC;IAEF,oDAAoD;IACpD,EAAE,CAAC,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,EAChC;;;;;;;;;;;CAWD,CACC,CAAC;IAEF,OAAO;QACN,GAAG;QACH,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KAC/D,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IAClC,OAAO,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,2BAA2B;IACnC,MAAM,KAAK,GAAG,SAAS,CAAC,4BAA4B,EAAE,CAAC,QAAQ,CAAC,EAAE;QACjE,KAAK,EAAE,QAAQ;KACf,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,IAAI,CAAC,6CAA6C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/D,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QACvE,OAAO;IACR,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,4BAA4B,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAE3E,IAAI,CAAC;QACJ,uBAAuB;QACvB,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE;gBAC/C,SAAS,EAAE,OAAO,CAAC,GAAG;gBACtB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC;gBACvB,QAAQ,EAAE,GAAG;gBACb,YAAY,EAAE;oBACb,YAAY,EAAE;wBACb,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE;wBACnD,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;wBACjC,UAAU,EAAE,EAAE;wBACd,cAAc,EAAE,EAAE,iCAAiC,EAAE,IAAI,EAAE;wBAC3D,kBAAkB,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE;qBAChD;iBACD;gBACD,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACzD,CAAC,CAA+C,CAAC;YAElD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;YACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,iCAAiC,CAAC,CAAC;YAClE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACnF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAkB,KAAK,SAAS,EAAE,2BAA2B,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAE9B,kBAAkB;QAClB,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEvD,GAAG,CAAC,MAAM,CAAC,sBAAsB,EAAE;YAClC,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;SACvF,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,sBAAsB,EAAE;YAClC,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;SACvF,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAE9C,kBAAkB;QAClB,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE;gBACvD,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;gBAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,0BAA0B;aAChE,CAAC,CAAkC,CAAC;YAErC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;YAClD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,EAAE,CACR,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC/C,qDAAqD,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACzE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,CAAC,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE;gBAC5D,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;gBAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,WAAW;aACjD,CAAC,CAAY,CAAC;YAEf,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,qCAAqC,CAAC,CAAC;YACvE,6DAA6D;YAC7D,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAA4B,CAAC;YACpD,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAW,CAAC;YACjD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,sDAAsD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpG,MAAM,CAAC,EAAE,CACR,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EACvB,4CAA4C,GAAG,EAAE,CACjD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,CAAC,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE;gBAC5D,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;gBAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,sBAAsB;gBAC5D,OAAO,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE;aACrC,CAAC,CAAkD,CAAC;YAErD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;YACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,yDAAyD,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,CAAC,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE;gBAChE,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;aAC9B,CAAC,CAAiD,CAAC;YAEpD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;YAC3D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,uCAAuC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,sCAAsC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3F,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,2CAA2C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,MAAM,CAAC,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YACrD,4CAA4C;YAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAE9C,MAAM,iBAAiB,GAAG,GAAG,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;YAClF,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,MAA0B,CAAC,GAAG,KAAK,OAAO,CACpD,CAAC;YAEF,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,wCAAwC,CAAC,CAAC;YAE1E,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,WAAW,GAAI,QAAQ,CAAC,MAAsE;iBAClG,WAAW,CAAC;YAEd,yDAAyD;YACzD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CACzE,CAAC;YACF,MAAM,CAAC,EAAE,CACR,SAAS,EACT,2CAA2C,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;YACzC,mBAAmB;YACnB,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,OAAO,EAAE,CAAC;QACV,MAAM,GAAG,CAAC;IACX,CAAC;IAED,OAAO,EAAE,CAAC;AACX,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Integration test for the LSP tool port.\n *\n * Spins up typescript-language-server against a temp TypeScript project\n * and exercises: initialize, didOpen, hover, definition, references,\n * documentSymbol, diagnostics, and shutdown.\n *\n * Run: node --experimental-strip-types --test src/core/lsp/lsp-integration.test.ts\n * (from packages/pi-coding-agent/)\n */\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { spawnSync } from \"node:child_process\";\n\n// ---------------------------------------------------------------------------\n// Helpers — lightweight JSON-RPC over stdio (no dependency on our LSP code)\n// ---------------------------------------------------------------------------\n\ninterface JsonRpcRequest {\n\tjsonrpc: \"2.0\";\n\tid: number;\n\tmethod: string;\n\tparams: unknown;\n}\n\ninterface JsonRpcNotification {\n\tjsonrpc: \"2.0\";\n\tmethod: string;\n\tparams?: unknown;\n}\n\ninterface JsonRpcResponse {\n\tjsonrpc: \"2.0\";\n\tid?: number;\n\tresult?: unknown;\n\terror?: { code: number; message: string };\n}\n\nfunction encodeMessage(msg: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse): string {\n\tconst body = JSON.stringify(msg);\n\treturn `Content-Length: ${Buffer.byteLength(body, \"utf-8\")}\\r\\n\\r\\n${body}`;\n}\n\n/**\n * Minimal LSP harness: spawns a language server, sends requests, collects responses.\n */\nclass LspHarness {\n\tprivate proc;\n\tprivate nextId = 1;\n\tprivate buffer = Buffer.alloc(0);\n\tprivate pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n\tprivate notifications: Array<{ method: string; params: unknown }> = [];\n\n\tconstructor(command: string, args: string[], cwd: string) {\n\t\tthis.proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tthis.proc.stdout!.on(\"data\", (chunk: Buffer) => {\n\t\t\tthis.buffer = Buffer.concat([this.buffer, chunk]);\n\t\t\tthis.drain();\n\t\t});\n\n\t\tthis.proc.stderr!.on(\"data\", (chunk: Buffer) => {\n\t\t\t// Swallow stderr (server logs)\n\t\t});\n\t}\n\n\tprivate drain(): void {\n\t\twhile (true) {\n\t\t\tconst headerEnd = this.findHeaderEnd();\n\t\t\tif (headerEnd === -1) return;\n\n\t\t\tconst headerText = this.buffer.subarray(0, headerEnd).toString(\"utf-8\");\n\t\t\tconst match = headerText.match(/Content-Length:\\s*(\\d+)/i);\n\t\t\tif (!match) return;\n\n\t\t\tconst contentLength = parseInt(match[1], 10);\n\t\t\tconst messageStart = headerEnd + 4; // past \\r\\n\\r\\n\n\t\t\tconst messageEnd = messageStart + contentLength;\n\t\t\tif (this.buffer.length < messageEnd) return;\n\n\t\t\tconst body = this.buffer.subarray(messageStart, messageEnd).toString(\"utf-8\");\n\t\t\tthis.buffer = Buffer.from(this.buffer.subarray(messageEnd));\n\n\t\t\tconst msg = JSON.parse(body) as JsonRpcResponse & { method?: string; params?: unknown };\n\n\t\t\tif (msg.id !== undefined && this.pending.has(msg.id)) {\n\t\t\t\tconst p = this.pending.get(msg.id)!;\n\t\t\t\tthis.pending.delete(msg.id);\n\t\t\t\tif (msg.error) {\n\t\t\t\t\tp.reject(new Error(`LSP error ${msg.error.code}: ${msg.error.message}`));\n\t\t\t\t} else {\n\t\t\t\t\tp.resolve(msg.result);\n\t\t\t\t}\n\t\t\t} else if (msg.method) {\n\t\t\t\t// Server request or notification\n\t\t\t\tthis.notifications.push({ method: msg.method, params: msg.params });\n\t\t\t\t// Auto-respond to server requests that have an id\n\t\t\t\tif (msg.id !== undefined) {\n\t\t\t\t\tthis.respond(msg.id, null);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate findHeaderEnd(): number {\n\t\tfor (let i = 0; i < this.buffer.length - 3; i++) {\n\t\t\tif (\n\t\t\t\tthis.buffer[i] === 13 &&\n\t\t\t\tthis.buffer[i + 1] === 10 &&\n\t\t\t\tthis.buffer[i + 2] === 13 &&\n\t\t\t\tthis.buffer[i + 3] === 10\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate respond(id: number, result: unknown): void {\n\t\tconst msg: JsonRpcResponse = { jsonrpc: \"2.0\", id, result };\n\t\tthis.proc.stdin!.write(encodeMessage(msg));\n\t}\n\n\tasync request(method: string, params: unknown, timeoutMs = 15000): Promise<unknown> {\n\t\tconst id = this.nextId++;\n\t\tconst msg: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n\t\tthis.proc.stdin!.write(encodeMessage(msg));\n\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(`Request ${method} timed out after ${timeoutMs}ms`));\n\t\t\t}, timeoutMs);\n\n\t\t\tthis.pending.set(id, {\n\t\t\t\tresolve: (v) => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tresolve(v);\n\t\t\t\t},\n\t\t\t\treject: (e) => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\treject(e);\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t}\n\n\tnotify(method: string, params: unknown): void {\n\t\tconst msg: JsonRpcNotification = { jsonrpc: \"2.0\", method, params };\n\t\tthis.proc.stdin!.write(encodeMessage(msg));\n\t}\n\n\tgetNotifications(method?: string): Array<{ method: string; params: unknown }> {\n\t\tif (!method) return this.notifications;\n\t\treturn this.notifications.filter((n) => n.method === method);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.request(\"shutdown\", null, 5000);\n\t\t\tthis.notify(\"exit\", null);\n\t\t} catch {\n\t\t\t// Best effort\n\t\t}\n\t\tthis.proc.kill();\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Test fixtures\n// ---------------------------------------------------------------------------\n\nfunction createTempProject(): { dir: string; cleanup: () => void } {\n\tconst dir = fs.mkdtempSync(path.join(os.tmpdir(), \"lsp-test-\"));\n\n\t// tsconfig.json\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"tsconfig.json\"),\n\t\tJSON.stringify(\n\t\t\t{\n\t\t\t\tcompilerOptions: {\n\t\t\t\t\ttarget: \"ES2022\",\n\t\t\t\t\tmodule: \"commonjs\",\n\t\t\t\t\tstrict: true,\n\t\t\t\t\toutDir: \"./dist\",\n\t\t\t\t\trootDir: \"./src\",\n\t\t\t\t},\n\t\t\t\tinclude: [\"src/**/*.ts\"],\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t),\n\t);\n\n\t// package.json\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"package.json\"),\n\t\tJSON.stringify({ name: \"lsp-test-project\", version: \"1.0.0\" }, null, 2),\n\t);\n\n\tfs.mkdirSync(path.join(dir, \"src\"));\n\n\t// src/math.ts — module with exported functions\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"src\", \"math.ts\"),\n\t\t`export function add(a: number, b: number): number {\n return a + b;\n}\n\nexport function subtract(a: number, b: number): number {\n return a - b;\n}\n\nexport interface Calculator {\n add(a: number, b: number): number;\n subtract(a: number, b: number): number;\n}\n`,\n\t);\n\n\t// src/main.ts — imports from math, has a type error\n\tfs.writeFileSync(\n\t\tpath.join(dir, \"src\", \"main.ts\"),\n\t\t`import { add, subtract, Calculator } from \"./math\";\n\nconst result: number = add(1, 2);\nconst diff: number = subtract(5, 3);\n\n// Intentional type error: string assigned to number\nconst bad: number = \"not a number\";\n\nexport function compute(calc: Calculator): number {\n return calc.add(1, 2) + calc.subtract(5, 3);\n}\n`,\n\t);\n\n\treturn {\n\t\tdir,\n\t\tcleanup: () => fs.rmSync(dir, { recursive: true, force: true }),\n\t};\n}\n\nfunction fileToUri(filePath: string): string {\n\treturn `file://${path.resolve(filePath)}`;\n}\n\nfunction hasTypescriptLanguageServer(): boolean {\n\tconst probe = spawnSync(\"typescript-language-server\", [\"--help\"], {\n\t\tstdio: \"ignore\",\n\t});\n\treturn probe.status === 0 || probe.status === 1;\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ntest(\"LSP integration: typescript-language-server\", async (t) => {\n\tif (!hasTypescriptLanguageServer()) {\n\t\tt.skip(\"typescript-language-server not installed in this environment\");\n\t\treturn;\n\t}\n\n\tconst { dir, cleanup } = createTempProject();\n\tconst mainPath = path.join(dir, \"src\", \"main.ts\");\n\tconst mathPath = path.join(dir, \"src\", \"math.ts\");\n\tconst mainUri = fileToUri(mainPath);\n\tconst mathUri = fileToUri(mathPath);\n\n\tconst lsp = new LspHarness(\"typescript-language-server\", [\"--stdio\"], dir);\n\n\ttry {\n\t\t// ---- Initialize ----\n\t\tawait t.test(\"initialize handshake\", async () => {\n\t\t\tconst result = (await lsp.request(\"initialize\", {\n\t\t\t\tprocessId: process.pid,\n\t\t\t\trootUri: fileToUri(dir),\n\t\t\t\trootPath: dir,\n\t\t\t\tcapabilities: {\n\t\t\t\t\ttextDocument: {\n\t\t\t\t\t\thover: { contentFormat: [\"markdown\", \"plaintext\"] },\n\t\t\t\t\t\tdefinition: { linkSupport: true },\n\t\t\t\t\t\treferences: {},\n\t\t\t\t\t\tdocumentSymbol: { hierarchicalDocumentSymbolSupport: true },\n\t\t\t\t\t\tpublishDiagnostics: { relatedInformation: true },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tworkspaceFolders: [{ uri: fileToUri(dir), name: \"test\" }],\n\t\t\t})) as { capabilities?: Record<string, unknown> };\n\n\t\t\tassert.ok(result, \"initialize should return a result\");\n\t\t\tassert.ok(result.capabilities, \"result should have capabilities\");\n\t\t\tassert.ok(result.capabilities.hoverProvider !== undefined, \"should support hover\");\n\t\t\tassert.ok(result.capabilities.definitionProvider !== undefined, \"should support definition\");\n\t\t});\n\n\t\tlsp.notify(\"initialized\", {});\n\n\t\t// Open both files\n\t\tconst mainContent = fs.readFileSync(mainPath, \"utf-8\");\n\t\tconst mathContent = fs.readFileSync(mathPath, \"utf-8\");\n\n\t\tlsp.notify(\"textDocument/didOpen\", {\n\t\t\ttextDocument: { uri: mainUri, languageId: \"typescript\", version: 1, text: mainContent },\n\t\t});\n\t\tlsp.notify(\"textDocument/didOpen\", {\n\t\t\ttextDocument: { uri: mathUri, languageId: \"typescript\", version: 1, text: mathContent },\n\t\t});\n\n\t\t// Give the server time to index\n\t\tawait new Promise((r) => setTimeout(r, 3000));\n\n\t\t// ---- Hover ----\n\t\tawait t.test(\"hover on 'add' call\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/hover\", {\n\t\t\t\ttextDocument: { uri: mainUri },\n\t\t\t\tposition: { line: 2, character: 24 }, // on 'add' in \"add(1, 2)\"\n\t\t\t})) as { contents?: unknown } | null;\n\n\t\t\tassert.ok(result, \"hover should return a result\");\n\t\t\tassert.ok(result.contents, \"hover should have contents\");\n\t\t\tconst text = JSON.stringify(result.contents);\n\t\t\tassert.ok(\n\t\t\t\ttext.includes(\"add\") || text.includes(\"number\"),\n\t\t\t\t`hover text should mention 'add' or 'number', got: ${text.slice(0, 200)}`,\n\t\t\t);\n\t\t});\n\n\t\t// ---- Go to Definition ----\n\t\tawait t.test(\"go to definition of 'add'\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/definition\", {\n\t\t\t\ttextDocument: { uri: mainUri },\n\t\t\t\tposition: { line: 2, character: 24 }, // on 'add'\n\t\t\t})) as unknown;\n\n\t\t\tassert.ok(result, \"definition should return a result\");\n\t\t\tconst locations = Array.isArray(result) ? result : [result];\n\t\t\tassert.ok(locations.length > 0, \"should find at least one definition\");\n\t\t\t// Response can be Location (uri) or LocationLink (targetUri)\n\t\t\tconst loc = locations[0] as Record<string, unknown>;\n\t\t\tconst uri = (loc.uri ?? loc.targetUri) as string;\n\t\t\tassert.ok(uri, `definition should have uri or targetUri, got keys: ${Object.keys(loc).join(\", \")}`);\n\t\t\tassert.ok(\n\t\t\t\turi.includes(\"math.ts\"),\n\t\t\t\t`definition should point to math.ts, got: ${uri}`,\n\t\t\t);\n\t\t});\n\n\t\t// ---- References ----\n\t\tawait t.test(\"find references of 'add'\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/references\", {\n\t\t\t\ttextDocument: { uri: mathUri },\n\t\t\t\tposition: { line: 0, character: 16 }, // on 'add' definition\n\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t})) as Array<{ uri: string; range: unknown }> | null;\n\n\t\t\tassert.ok(result, \"references should return a result\");\n\t\t\tassert.ok(result.length >= 2, `should find at least 2 references (decl + usage), got ${result.length}`);\n\t\t});\n\n\t\t// ---- Document Symbols ----\n\t\tawait t.test(\"document symbols in math.ts\", async () => {\n\t\t\tconst result = (await lsp.request(\"textDocument/documentSymbol\", {\n\t\t\t\ttextDocument: { uri: mathUri },\n\t\t\t})) as Array<{ name: string; kind: number }> | null;\n\n\t\t\tassert.ok(result, \"documentSymbol should return a result\");\n\t\t\tassert.ok(result.length >= 2, `should find at least 2 symbols, got ${result.length}`);\n\t\t\tconst names = result.map((s) => s.name);\n\t\t\tassert.ok(names.includes(\"add\"), `symbols should include 'add', got: ${names.join(\", \")}`);\n\t\t\tassert.ok(names.includes(\"subtract\"), `symbols should include 'subtract', got: ${names.join(\", \")}`);\n\t\t});\n\n\t\t// ---- Diagnostics (published via notification) ----\n\t\tawait t.test(\"diagnostics for type error\", async () => {\n\t\t\t// Wait a bit more for diagnostics to arrive\n\t\t\tawait new Promise((r) => setTimeout(r, 2000));\n\n\t\t\tconst diagNotifications = lsp.getNotifications(\"textDocument/publishDiagnostics\");\n\t\t\tconst mainDiags = diagNotifications.filter(\n\t\t\t\t(n) => (n.params as { uri: string }).uri === mainUri,\n\t\t\t);\n\n\t\t\tassert.ok(mainDiags.length > 0, \"should receive diagnostics for main.ts\");\n\n\t\t\tconst lastDiag = mainDiags[mainDiags.length - 1];\n\t\t\tconst diagnostics = (lastDiag.params as { diagnostics: Array<{ message: string; range: unknown }> })\n\t\t\t\t.diagnostics;\n\n\t\t\t// Should catch the type error: string assigned to number\n\t\t\tconst typeError = diagnostics.find(\n\t\t\t\t(d) => d.message.includes(\"not assignable\") || d.message.includes(\"Type\"),\n\t\t\t);\n\t\t\tassert.ok(\n\t\t\t\ttypeError,\n\t\t\t\t`should find type error diagnostic, got: ${diagnostics.map((d) => d.message).join(\"; \")}`,\n\t\t\t);\n\t\t});\n\n\t\t// ---- Shutdown ----\n\t\tawait t.test(\"clean shutdown\", async () => {\n\t\t\t// Should not throw\n\t\t\tawait lsp.shutdown();\n\t\t});\n\t} catch (err) {\n\t\tawait lsp.shutdown().catch(() => {});\n\t\tcleanup();\n\t\tthrow err;\n\t}\n\n\tcleanup();\n});\n"]}
@@ -12,10 +12,10 @@ function createRegistry(hasAuthFn) {
12
12
  hasAuth: hasAuthFn ?? (() => false),
13
13
  getApiKey: async () => undefined,
14
14
  };
15
- return new ModelRegistry(authStorage, undefined);
15
+ return new ModelRegistry(authStorage, "");
16
16
  }
17
17
  function createInMemoryRegistry(data = {}) {
18
- return new ModelRegistry(AuthStorage.inMemory(data), undefined);
18
+ return new ModelRegistry(AuthStorage.inMemory(data), "");
19
19
  }
20
20
  function createProviderModel(id, api) {
21
21
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"model-registry-auth-mode.test.js","sourceRoot":"","sources":["../../src/core/model-registry-auth-mode.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport type { Api, Model, SimpleStreamOptions, Context, AssistantMessageEventStream } from \"@gsd/pi-ai\";\nimport { getApiProvider } from \"@gsd/pi-ai\";\nimport { AuthStorage, type AuthStorageData } from \"./auth-storage.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\n\nfunction createRegistry(hasAuthFn?: (provider: string) => boolean): ModelRegistry {\n\tconst authStorage = {\n\t\tsetFallbackResolver: () => {},\n\t\tonCredentialChange: () => {},\n\t\tgetOAuthProviders: () => [],\n\t\tget: () => undefined,\n\t\thasAuth: hasAuthFn ?? (() => false),\n\t\tgetApiKey: async () => undefined,\n\t} as unknown as AuthStorage;\n\n\treturn new ModelRegistry(authStorage, undefined);\n}\n\nfunction createInMemoryRegistry(data: AuthStorageData = {}): ModelRegistry {\n\treturn new ModelRegistry(AuthStorage.inMemory(data), undefined);\n}\n\nfunction createProviderModel(id: string, api?: string): NonNullable<Parameters<ModelRegistry[\"registerProvider\"]>[1][\"models\"]>[number] {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: (api ?? \"openai-completions\") as Api,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction findModel(registry: ModelRegistry, provider: string, id: string): Model<Api> | undefined {\n\treturn registry.getAvailable().find((m) => m.provider === provider && m.id === id);\n}\n\nfunction makeModel(provider: string, id: string, api: string): Model<Api> {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl: `${provider}:`,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction makeContext(): Context {\n\treturn {\n\t\tsystemPrompt: \"test\",\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n}\n\n/** No-op streamSimple for tests that need one to pass validation but don't inspect it. */\nconst noopStreamSimple = (_model: Model<Api>, _context: Context, _options?: SimpleStreamOptions) => {\n\treturn {\n\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\tpush: () => {},\n\t\tend: () => {},\n\t} as unknown as AssistantMessageEventStream;\n};\n\n/** Create a spy streamSimple that captures the options it receives and returns a stub stream. */\nfunction createStreamSpy(): {\n\tstreamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\tgetCapturedOptions: () => SimpleStreamOptions | undefined;\n} {\n\tlet capturedOptions: SimpleStreamOptions | undefined;\n\tconst streamSimple = (_model: Model<Api>, _context: Context, options?: SimpleStreamOptions) => {\n\t\tcapturedOptions = options;\n\t\t// Return a minimal stub that satisfies AssistantMessageEventStream\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\t\tpush: () => {},\n\t\t\tend: () => {},\n\t\t} as unknown as AssistantMessageEventStream;\n\t};\n\treturn { streamSimple, getCapturedOptions: () => capturedOptions };\n}\n\n// ─── Registration ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — registration\", () => {\n\tit(\"registers externalCli provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"cli-provider\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"registers none provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"none-provider\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"rejects apiKey provider without apiKey or oauth — message mentions authMode\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"apikey-provider\", {\n\t\t\t\tauthMode: \"apiKey\",\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must suggest externalCli\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects provider with no authMode and no apiKey/oauth (defaults to apiKey)\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"bare-provider\", {\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-no-stream\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-no-stream\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-with-key\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-with-key\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n});\n\n// ─── getProviderAuthMode ──────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getProviderAuthMode\", () => {\n\tit(\"returns apiKey for unregistered (built-in) providers\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.equal(registry.getProviderAuthMode(\"anthropic\"), \"apiKey\");\n\t});\n\n\tit(\"returns explicit authMode when set\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"cli\"), \"externalCli\");\n\t});\n\n\tit(\"returns none when authMode is none\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"local\"), \"none\");\n\t});\n});\n\n// ─── isProviderRequestReady ───────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isProviderRequestReady\", () => {\n\tit(\"returns true for externalCli without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli\"), true);\n\t});\n\n\tit(\"returns true for none without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"local\"), true);\n\t});\n\n\tit(\"returns false for apiKey provider without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), false);\n\t});\n\n\tit(\"returns true for apiKey provider with stored auth\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), true);\n\t});\n});\n\n// ─── isReady callback ─────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isReady callback\", () => {\n\tit(\"calls isReady and returns its result for externalCli provider\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli-down\"), false);\n\t});\n\n\tit(\"calls isReady for apiKey provider (overrides hasAuth)\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tregistry.registerProvider(\"strict-provider\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"strict-provider\"), false);\n\t});\n\n\tit(\"isReady returning true makes provider available\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"healthy-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => true,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"healthy-cli\"), true);\n\t});\n\n\tit(\"falls through to default behavior when isReady not provided\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"no-callback\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\t// externalCli without isReady → true (default)\n\t\tassert.equal(registry.isProviderRequestReady(\"no-callback\"), true);\n\t});\n});\n\n// ─── getAvailable ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getAvailable\", () => {\n\tit(\"includes externalCli models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"cli\", \"cli-model\"));\n\t});\n\n\tit(\"includes none models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"local\", \"local-model\"));\n\t});\n\n\tit(\"excludes externalCli models when isReady returns false\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(findModel(registry, \"cli-down\", \"m\"), undefined);\n\t});\n\n\tit(\"excludes apiKey models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tconst available = registry.getAvailable();\n\t\tassert.equal(available.length, 0);\n\t});\n\n\tit(\"prunes Codex models removed from ChatGPT-backed openai-codex OAuth\", () => {\n\t\tconst registry = createInMemoryRegistry({\n\t\t\t\"openai-codex\": {\n\t\t\t\ttype: \"oauth\",\n\t\t\t\taccess: \"oauth-access\",\n\t\t\t\trefresh: \"oauth-refresh\",\n\t\t\t\texpires: Date.now() + 60_000,\n\t\t\t\taccountId: \"acct_123\",\n\t\t\t},\n\t\t});\n\n\t\tassert.equal(registry.find(\"openai-codex\", \"gpt-5.1-codex-max\"), undefined);\n\t\tassert.equal(registry.find(\"openai-codex\", \"gpt-5.1\"), undefined);\n\t\tassert.equal(findModel(registry, \"openai-codex\", \"gpt-5.2-codex\"), undefined);\n\t\tassert.ok(registry.find(\"openai-codex\", \"gpt-5.4\"));\n\t\tassert.ok(findModel(registry, \"openai-codex\", \"gpt-5.4\"));\n\t\tassert.ok(registry.find(\"openai-codex\", \"gpt-5.4-mini\"));\n\t\tassert.ok(findModel(registry, \"openai-codex\", \"gpt-5.4-mini\"));\n\t});\n\n\tit(\"keeps API-backed OpenAI Codex-capable models available\", () => {\n\t\tconst registry = createInMemoryRegistry({\n\t\t\topenai: {\n\t\t\t\ttype: \"api_key\",\n\t\t\t\tkey: \"sk-test\",\n\t\t\t},\n\t\t});\n\n\t\tassert.ok(registry.find(\"openai\", \"gpt-5.2-codex\"));\n\t\tassert.ok(findModel(registry, \"openai\", \"gpt-5.2-codex\"));\n\t});\n});\n\n// ─── getApiKey ────────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getApiKey\", () => {\n\tit(\"returns undefined for externalCli provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"cli\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"returns undefined for none provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"local\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"delegates to authStorage for apiKey provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tconst key = await registry.getApiKeyForProvider(\"anthropic\");\n\t\tassert.equal(key, undefined);\n\t});\n});\n\n// ─── streamSimple apiKey stripping ────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — streamSimple apiKey boundary\", () => {\n\tit(\"strips apiKey from options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-strip\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 1024 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for externalCli provider\");\n\t\tassert.equal(captured.maxTokens, 1024, \"other options must pass through\");\n\t});\n\n\tit(\"strips apiKey from options for none provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `none-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"none-strip\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"none-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for none provider\");\n\t\tassert.equal(captured.maxTokens, 2048, \"other options must pass through\");\n\t});\n\n\tit(\"preserves apiKey in options for apiKey provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `apikey-preserve-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"apikey-preserve\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"apikey-preserve\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"sk-real-key\", maxTokens: 4096 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(captured.apiKey, \"sk-real-key\", \"apiKey must be preserved for apiKey provider\");\n\t\tassert.equal(captured.maxTokens, 4096, \"other options must pass through\");\n\t});\n\n\tit(\"handles undefined options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-undef-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-undef\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-undef\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\tundefined,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured !== undefined, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist even when options is undefined\");\n\t});\n\n\tit(\"strips apiKey but preserves signal and other fields for externalCli\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-fields-${Date.now()}`;\n\t\tconst abortController = new AbortController();\n\n\t\tregistry.registerProvider(\"cli-fields\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-fields\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"strip-me\", maxTokens: 8192, signal: abortController.signal, reasoning: \"high\" } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must be stripped\");\n\t\tassert.equal(captured.maxTokens, 8192, \"maxTokens must pass through\");\n\t\tassert.equal(captured.signal, abortController.signal, \"signal must pass through\");\n\t\tassert.equal((captured as Record<string, unknown>).reasoning, \"high\", \"reasoning must pass through\");\n\t});\n});\n\n// ─── Provider-scoped stream routing (#2533) ───────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — provider-scoped stream routing\", () => {\n\tit(\"does not clobber built-in stream handler when custom provider uses same api\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\t// Register a custom provider with the same API type as a built-in (anthropic-messages).\n\t\t// This simulates the claude-code-cli extension registering with api: \"anthropic-messages\".\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\t// The built-in anthropic-messages provider should still be accessible\n\t\t// when calling streamSimple with a model from the built-in provider.\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider, \"anthropic-messages provider must still be registered\");\n\n\t\t// Call with a built-in anthropic model — should NOT hit the custom spy.\n\t\t// The built-in handler will throw (no API key), which proves the routing\n\t\t// correctly delegates to the built-in instead of the custom handler.\n\t\tassert.throws(\n\t\t\t() => provider.streamSimple(\n\t\t\t\tmakeModel(\"anthropic\", \"claude-sonnet-4-6\", \"anthropic-messages\"),\n\t\t\t\tmakeContext(),\n\t\t\t\t{ maxTokens: 4096 } as SimpleStreamOptions,\n\t\t\t),\n\t\t\t(err: Error) => err.message.includes(\"API key\"),\n\t\t\t\"built-in Anthropic handler must be invoked (throws because no API key in tests)\",\n\t\t);\n\n\t\tassert.equal(\n\t\t\tcustomSpy.getCapturedOptions(),\n\t\t\tundefined,\n\t\t\t\"custom provider's streamSimple must NOT be called for anthropic provider models\",\n\t\t);\n\t});\n\n\tit(\"routes to custom provider when model.provider matches\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider);\n\n\t\t// Call with the custom provider's model — should hit the custom spy\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"custom-cli\", \"custom-model\", \"anthropic-messages\"),\n\t\t\tmakeContext(),\n\t\t\t{ maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = customSpy.getCapturedOptions();\n\t\tassert.ok(captured, \"custom provider's streamSimple must be called for its own models\");\n\t\tassert.equal(captured.maxTokens, 2048);\n\t});\n});\n"]}
1
+ {"version":3,"file":"model-registry-auth-mode.test.js","sourceRoot":"","sources":["../../src/core/model-registry-auth-mode.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport type { Api, Model, SimpleStreamOptions, Context, AssistantMessageEventStream } from \"@gsd/pi-ai\";\nimport { getApiProvider } from \"@gsd/pi-ai\";\nimport { AuthStorage, type AuthStorageData } from \"./auth-storage.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\n\nfunction createRegistry(hasAuthFn?: (provider: string) => boolean): ModelRegistry {\n\tconst authStorage = {\n\t\tsetFallbackResolver: () => {},\n\t\tonCredentialChange: () => {},\n\t\tgetOAuthProviders: () => [],\n\t\tget: () => undefined,\n\t\thasAuth: hasAuthFn ?? (() => false),\n\t\tgetApiKey: async () => undefined,\n\t} as unknown as AuthStorage;\n\n\treturn new ModelRegistry(authStorage, \"\");\n}\n\nfunction createInMemoryRegistry(data: AuthStorageData = {}): ModelRegistry {\n\treturn new ModelRegistry(AuthStorage.inMemory(data), \"\");\n}\n\nfunction createProviderModel(id: string, api?: string): NonNullable<Parameters<ModelRegistry[\"registerProvider\"]>[1][\"models\"]>[number] {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: (api ?? \"openai-completions\") as Api,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction findModel(registry: ModelRegistry, provider: string, id: string): Model<Api> | undefined {\n\treturn registry.getAvailable().find((m) => m.provider === provider && m.id === id);\n}\n\nfunction makeModel(provider: string, id: string, api: string): Model<Api> {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl: `${provider}:`,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction makeContext(): Context {\n\treturn {\n\t\tsystemPrompt: \"test\",\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n}\n\n/** No-op streamSimple for tests that need one to pass validation but don't inspect it. */\nconst noopStreamSimple = (_model: Model<Api>, _context: Context, _options?: SimpleStreamOptions) => {\n\treturn {\n\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\tpush: () => {},\n\t\tend: () => {},\n\t} as unknown as AssistantMessageEventStream;\n};\n\n/** Create a spy streamSimple that captures the options it receives and returns a stub stream. */\nfunction createStreamSpy(): {\n\tstreamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\tgetCapturedOptions: () => SimpleStreamOptions | undefined;\n} {\n\tlet capturedOptions: SimpleStreamOptions | undefined;\n\tconst streamSimple = (_model: Model<Api>, _context: Context, options?: SimpleStreamOptions) => {\n\t\tcapturedOptions = options;\n\t\t// Return a minimal stub that satisfies AssistantMessageEventStream\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\t\tpush: () => {},\n\t\t\tend: () => {},\n\t\t} as unknown as AssistantMessageEventStream;\n\t};\n\treturn { streamSimple, getCapturedOptions: () => capturedOptions };\n}\n\n// ─── Registration ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — registration\", () => {\n\tit(\"registers externalCli provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"cli-provider\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"registers none provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"none-provider\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"rejects apiKey provider without apiKey or oauth — message mentions authMode\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"apikey-provider\", {\n\t\t\t\tauthMode: \"apiKey\",\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must suggest externalCli\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects provider with no authMode and no apiKey/oauth (defaults to apiKey)\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"bare-provider\", {\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-no-stream\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-no-stream\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-with-key\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-with-key\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n});\n\n// ─── getProviderAuthMode ──────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getProviderAuthMode\", () => {\n\tit(\"returns apiKey for unregistered (built-in) providers\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.equal(registry.getProviderAuthMode(\"anthropic\"), \"apiKey\");\n\t});\n\n\tit(\"returns explicit authMode when set\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"cli\"), \"externalCli\");\n\t});\n\n\tit(\"returns none when authMode is none\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"local\"), \"none\");\n\t});\n});\n\n// ─── isProviderRequestReady ───────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isProviderRequestReady\", () => {\n\tit(\"returns true for externalCli without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli\"), true);\n\t});\n\n\tit(\"returns true for none without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"local\"), true);\n\t});\n\n\tit(\"returns false for apiKey provider without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), false);\n\t});\n\n\tit(\"returns true for apiKey provider with stored auth\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), true);\n\t});\n});\n\n// ─── isReady callback ─────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isReady callback\", () => {\n\tit(\"calls isReady and returns its result for externalCli provider\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli-down\"), false);\n\t});\n\n\tit(\"calls isReady for apiKey provider (overrides hasAuth)\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tregistry.registerProvider(\"strict-provider\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"strict-provider\"), false);\n\t});\n\n\tit(\"isReady returning true makes provider available\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"healthy-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => true,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"healthy-cli\"), true);\n\t});\n\n\tit(\"falls through to default behavior when isReady not provided\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"no-callback\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\t// externalCli without isReady → true (default)\n\t\tassert.equal(registry.isProviderRequestReady(\"no-callback\"), true);\n\t});\n});\n\n// ─── getAvailable ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getAvailable\", () => {\n\tit(\"includes externalCli models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"cli\", \"cli-model\"));\n\t});\n\n\tit(\"includes none models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"local\", \"local-model\"));\n\t});\n\n\tit(\"excludes externalCli models when isReady returns false\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(findModel(registry, \"cli-down\", \"m\"), undefined);\n\t});\n\n\tit(\"excludes apiKey models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tconst available = registry.getAvailable();\n\t\tassert.equal(available.length, 0);\n\t});\n\n\tit(\"prunes Codex models removed from ChatGPT-backed openai-codex OAuth\", () => {\n\t\tconst registry = createInMemoryRegistry({\n\t\t\t\"openai-codex\": {\n\t\t\t\ttype: \"oauth\",\n\t\t\t\taccess: \"oauth-access\",\n\t\t\t\trefresh: \"oauth-refresh\",\n\t\t\t\texpires: Date.now() + 60_000,\n\t\t\t\taccountId: \"acct_123\",\n\t\t\t},\n\t\t});\n\n\t\tassert.equal(registry.find(\"openai-codex\", \"gpt-5.1-codex-max\"), undefined);\n\t\tassert.equal(registry.find(\"openai-codex\", \"gpt-5.1\"), undefined);\n\t\tassert.equal(findModel(registry, \"openai-codex\", \"gpt-5.2-codex\"), undefined);\n\t\tassert.ok(registry.find(\"openai-codex\", \"gpt-5.4\"));\n\t\tassert.ok(findModel(registry, \"openai-codex\", \"gpt-5.4\"));\n\t\tassert.ok(registry.find(\"openai-codex\", \"gpt-5.4-mini\"));\n\t\tassert.ok(findModel(registry, \"openai-codex\", \"gpt-5.4-mini\"));\n\t});\n\n\tit(\"keeps API-backed OpenAI Codex-capable models available\", () => {\n\t\tconst registry = createInMemoryRegistry({\n\t\t\topenai: {\n\t\t\t\ttype: \"api_key\",\n\t\t\t\tkey: \"sk-test\",\n\t\t\t},\n\t\t});\n\n\t\tassert.ok(registry.find(\"openai\", \"gpt-5.2-codex\"));\n\t\tassert.ok(findModel(registry, \"openai\", \"gpt-5.2-codex\"));\n\t});\n});\n\n// ─── getApiKey ────────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getApiKey\", () => {\n\tit(\"returns undefined for externalCli provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"cli\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"returns undefined for none provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"local\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"delegates to authStorage for apiKey provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tconst key = await registry.getApiKeyForProvider(\"anthropic\");\n\t\tassert.equal(key, undefined);\n\t});\n});\n\n// ─── streamSimple apiKey stripping ────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — streamSimple apiKey boundary\", () => {\n\tit(\"strips apiKey from options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-strip\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 1024 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for externalCli provider\");\n\t\tassert.equal(captured.maxTokens, 1024, \"other options must pass through\");\n\t});\n\n\tit(\"strips apiKey from options for none provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `none-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"none-strip\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"none-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for none provider\");\n\t\tassert.equal(captured.maxTokens, 2048, \"other options must pass through\");\n\t});\n\n\tit(\"preserves apiKey in options for apiKey provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `apikey-preserve-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"apikey-preserve\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"apikey-preserve\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"sk-real-key\", maxTokens: 4096 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(captured.apiKey, \"sk-real-key\", \"apiKey must be preserved for apiKey provider\");\n\t\tassert.equal(captured.maxTokens, 4096, \"other options must pass through\");\n\t});\n\n\tit(\"handles undefined options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-undef-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-undef\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-undef\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\tundefined,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured !== undefined, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist even when options is undefined\");\n\t});\n\n\tit(\"strips apiKey but preserves signal and other fields for externalCli\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-fields-${Date.now()}`;\n\t\tconst abortController = new AbortController();\n\n\t\tregistry.registerProvider(\"cli-fields\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-fields\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"strip-me\", maxTokens: 8192, signal: abortController.signal, reasoning: \"high\" } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must be stripped\");\n\t\tassert.equal(captured.maxTokens, 8192, \"maxTokens must pass through\");\n\t\tassert.equal(captured.signal, abortController.signal, \"signal must pass through\");\n\t\tassert.equal((captured as Record<string, unknown>).reasoning, \"high\", \"reasoning must pass through\");\n\t});\n});\n\n// ─── Provider-scoped stream routing (#2533) ───────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — provider-scoped stream routing\", () => {\n\tit(\"does not clobber built-in stream handler when custom provider uses same api\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\t// Register a custom provider with the same API type as a built-in (anthropic-messages).\n\t\t// This simulates the claude-code-cli extension registering with api: \"anthropic-messages\".\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\t// The built-in anthropic-messages provider should still be accessible\n\t\t// when calling streamSimple with a model from the built-in provider.\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider, \"anthropic-messages provider must still be registered\");\n\n\t\t// Call with a built-in anthropic model — should NOT hit the custom spy.\n\t\t// The built-in handler will throw (no API key), which proves the routing\n\t\t// correctly delegates to the built-in instead of the custom handler.\n\t\tassert.throws(\n\t\t\t() => provider.streamSimple(\n\t\t\t\tmakeModel(\"anthropic\", \"claude-sonnet-4-6\", \"anthropic-messages\"),\n\t\t\t\tmakeContext(),\n\t\t\t\t{ maxTokens: 4096 } as SimpleStreamOptions,\n\t\t\t),\n\t\t\t(err: Error) => err.message.includes(\"API key\"),\n\t\t\t\"built-in Anthropic handler must be invoked (throws because no API key in tests)\",\n\t\t);\n\n\t\tassert.equal(\n\t\t\tcustomSpy.getCapturedOptions(),\n\t\t\tundefined,\n\t\t\t\"custom provider's streamSimple must NOT be called for anthropic provider models\",\n\t\t);\n\t});\n\n\tit(\"routes to custom provider when model.provider matches\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider);\n\n\t\t// Call with the custom provider's model — should hit the custom spy\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"custom-cli\", \"custom-model\", \"anthropic-messages\"),\n\t\t\tmakeContext(),\n\t\t\t{ maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = customSpy.getCapturedOptions();\n\t\tassert.ok(captured, \"custom provider's streamSimple must be called for its own models\");\n\t\tassert.equal(captured.maxTokens, 2048);\n\t});\n});\n"]}
@@ -104,7 +104,7 @@ export class DefaultResourceLoader {
104
104
  this.agentsFilesOverride = options.agentsFilesOverride;
105
105
  this.systemPromptOverride = options.systemPromptOverride;
106
106
  this.appendSystemPromptOverride = options.appendSystemPromptOverride;
107
- this.extensionsResult = { extensions: [], errors: [], runtime: createExtensionRuntime() };
107
+ this.extensionsResult = { extensions: [], errors: [], warnings: [], runtime: createExtensionRuntime() };
108
108
  this.skills = [];
109
109
  this.skillDiagnostics = [];
110
110
  this.prompts = [];