@qduc/term2 0.24.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/dist/acp-v2/agent.d.ts +37 -0
  2. package/dist/acp-v2/agent.d.ts.map +1 -0
  3. package/dist/acp-v2/agent.js +171 -0
  4. package/dist/acp-v2/agent.js.map +1 -0
  5. package/dist/acp-v2/serve-args.d.ts +26 -0
  6. package/dist/acp-v2/serve-args.d.ts.map +1 -0
  7. package/dist/acp-v2/serve-args.js +29 -0
  8. package/dist/acp-v2/serve-args.js.map +1 -0
  9. package/dist/acp-v2/serve.d.ts +32 -0
  10. package/dist/acp-v2/serve.d.ts.map +1 -0
  11. package/dist/acp-v2/serve.js +232 -0
  12. package/dist/acp-v2/serve.js.map +1 -0
  13. package/dist/acp-v2/session-backend.d.ts +58 -0
  14. package/dist/acp-v2/session-backend.d.ts.map +1 -0
  15. package/dist/acp-v2/session-backend.js +554 -0
  16. package/dist/acp-v2/session-backend.js.map +1 -0
  17. package/dist/agent.d.ts +4 -0
  18. package/dist/agent.d.ts.map +1 -1
  19. package/dist/agent.js +3 -1
  20. package/dist/agent.js.map +1 -1
  21. package/dist/app.d.ts +10 -0
  22. package/dist/app.d.ts.map +1 -1
  23. package/dist/app.js +44 -11
  24. package/dist/app.js.map +1 -1
  25. package/dist/cli.js +67 -1
  26. package/dist/cli.js.map +1 -1
  27. package/dist/commands/mcp-login-command.d.ts +24 -0
  28. package/dist/commands/mcp-login-command.d.ts.map +1 -0
  29. package/dist/commands/mcp-login-command.js +65 -0
  30. package/dist/commands/mcp-login-command.js.map +1 -0
  31. package/dist/commands/mcp-status-command.d.ts +19 -0
  32. package/dist/commands/mcp-status-command.d.ts.map +1 -0
  33. package/dist/commands/mcp-status-command.js +19 -0
  34. package/dist/commands/mcp-status-command.js.map +1 -0
  35. package/dist/commands/retry-failed-turn-command.d.ts +1 -0
  36. package/dist/commands/retry-failed-turn-command.d.ts.map +1 -1
  37. package/dist/commands/retry-failed-turn-command.js +3 -0
  38. package/dist/commands/retry-failed-turn-command.js.map +1 -1
  39. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  40. package/dist/components/MarkdownRenderer.js +111 -19
  41. package/dist/components/MarkdownRenderer.js.map +1 -1
  42. package/dist/components/input/ApplicationInputSurface.d.ts +4 -0
  43. package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
  44. package/dist/components/input/ApplicationInputSurface.js +2 -0
  45. package/dist/components/input/ApplicationInputSurface.js.map +1 -1
  46. package/dist/components/input/McpMenuSession.d.ts +9 -0
  47. package/dist/components/input/McpMenuSession.d.ts.map +1 -0
  48. package/dist/components/input/McpMenuSession.js +370 -0
  49. package/dist/components/input/McpMenuSession.js.map +1 -0
  50. package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
  51. package/dist/components/input/ModelMenuSession.js +5 -2
  52. package/dist/components/input/ModelMenuSession.js.map +1 -1
  53. package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
  54. package/dist/components/input/SettingsValueMenuSession.js +55 -35
  55. package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
  56. package/dist/components/input/SubagentPoolMenuSession.d.ts.map +1 -1
  57. package/dist/components/input/SubagentPoolMenuSession.js +3 -3
  58. package/dist/components/input/SubagentPoolMenuSession.js.map +1 -1
  59. package/dist/components/input/mcp-intent-host.d.ts +10 -0
  60. package/dist/components/input/mcp-intent-host.d.ts.map +1 -0
  61. package/dist/components/input/mcp-intent-host.js +31 -0
  62. package/dist/components/input/mcp-intent-host.js.map +1 -0
  63. package/dist/components/input/menu-bindings.d.ts +8 -4
  64. package/dist/components/input/menu-bindings.d.ts.map +1 -1
  65. package/dist/components/input/menu-bindings.js +14 -2
  66. package/dist/components/input/menu-bindings.js.map +1 -1
  67. package/dist/components/input/menu-controller.d.ts.map +1 -1
  68. package/dist/components/input/menu-controller.js +8 -5
  69. package/dist/components/input/menu-controller.js.map +1 -1
  70. package/dist/components/input/menu-registry.d.ts.map +1 -1
  71. package/dist/components/input/menu-registry.js +2 -0
  72. package/dist/components/input/menu-registry.js.map +1 -1
  73. package/dist/components/input/menu-types.d.ts +22 -1
  74. package/dist/components/input/menu-types.d.ts.map +1 -1
  75. package/dist/components/input/settings-intent-host.d.ts.map +1 -1
  76. package/dist/components/input/settings-intent-host.js +2 -1
  77. package/dist/components/input/settings-intent-host.js.map +1 -1
  78. package/dist/components/layout/BottomArea.d.ts +6 -1
  79. package/dist/components/layout/BottomArea.d.ts.map +1 -1
  80. package/dist/components/layout/BottomArea.js +9 -6
  81. package/dist/components/layout/BottomArea.js.map +1 -1
  82. package/dist/components/menu/McpSelectionMenu.d.ts +15 -0
  83. package/dist/components/menu/McpSelectionMenu.d.ts.map +1 -0
  84. package/dist/components/menu/McpSelectionMenu.js +19 -0
  85. package/dist/components/menu/McpSelectionMenu.js.map +1 -0
  86. package/dist/components/menu/ModelSelectionMenu.d.ts +2 -1
  87. package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
  88. package/dist/components/menu/ModelSelectionMenu.js +19 -19
  89. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  90. package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
  91. package/dist/components/menu/SettingsSelectionMenu.js +32 -10
  92. package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
  93. package/dist/components/menu/SettingsValueSelectionMenu.d.ts +8 -1
  94. package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
  95. package/dist/components/menu/SettingsValueSelectionMenu.js +52 -34
  96. package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
  97. package/dist/components/menu/StandaloneModelPickerApp.d.ts.map +1 -1
  98. package/dist/components/menu/StandaloneModelPickerApp.js +5 -2
  99. package/dist/components/menu/StandaloneModelPickerApp.js.map +1 -1
  100. package/dist/components/menu/settings-value-formatter.d.ts +11 -0
  101. package/dist/components/menu/settings-value-formatter.d.ts.map +1 -1
  102. package/dist/components/menu/settings-value-formatter.js +37 -2
  103. package/dist/components/menu/settings-value-formatter.js.map +1 -1
  104. package/dist/components/message/ChatMessage.js +2 -2
  105. package/dist/components/message/ChatMessage.js.map +1 -1
  106. package/dist/components/message/command-message-helpers.d.ts +5 -5
  107. package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
  108. package/dist/components/prompt/ApprovalPrompt.js +3 -0
  109. package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
  110. package/dist/contracts/conversation.d.ts +2 -0
  111. package/dist/contracts/conversation.d.ts.map +1 -1
  112. package/dist/contracts/conversation.js.map +1 -1
  113. package/dist/gateway/interaction-protocol.d.ts +2 -1
  114. package/dist/gateway/interaction-protocol.d.ts.map +1 -1
  115. package/dist/gateway/interaction-protocol.js +15 -14
  116. package/dist/gateway/interaction-protocol.js.map +1 -1
  117. package/dist/gateway/runtime-factory.d.ts.map +1 -1
  118. package/dist/gateway/runtime-factory.js +6 -2
  119. package/dist/gateway/runtime-factory.js.map +1 -1
  120. package/dist/hooks/conversation-ui-reducer.d.ts +1 -1
  121. package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
  122. package/dist/hooks/settings-completion-config.d.ts +4 -0
  123. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  124. package/dist/hooks/settings-completion-config.js +1 -0
  125. package/dist/hooks/settings-completion-config.js.map +1 -1
  126. package/dist/hooks/use-app-commands.d.ts +11 -1
  127. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  128. package/dist/hooks/use-app-commands.js +15 -2
  129. package/dist/hooks/use-app-commands.js.map +1 -1
  130. package/dist/hooks/use-conversation-messages.d.ts +1 -0
  131. package/dist/hooks/use-conversation-messages.d.ts.map +1 -1
  132. package/dist/hooks/use-conversation-messages.js +11 -0
  133. package/dist/hooks/use-conversation-messages.js.map +1 -1
  134. package/dist/hooks/use-conversation.d.ts +2 -1
  135. package/dist/hooks/use-conversation.d.ts.map +1 -1
  136. package/dist/hooks/use-conversation.js +2 -1
  137. package/dist/hooks/use-conversation.js.map +1 -1
  138. package/dist/hooks/use-mcp-notices.d.ts +10 -0
  139. package/dist/hooks/use-mcp-notices.d.ts.map +1 -0
  140. package/dist/hooks/use-mcp-notices.js +47 -0
  141. package/dist/hooks/use-mcp-notices.js.map +1 -0
  142. package/dist/hooks/use-model-selection.d.ts +25 -6
  143. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  144. package/dist/hooks/use-model-selection.js +37 -18
  145. package/dist/hooks/use-model-selection.js.map +1 -1
  146. package/dist/hooks/use-profile-selection.d.ts.map +1 -1
  147. package/dist/hooks/use-profile-selection.js +1 -0
  148. package/dist/hooks/use-profile-selection.js.map +1 -1
  149. package/dist/hooks/use-provider-selection.js +4 -4
  150. package/dist/hooks/use-provider-selection.js.map +1 -1
  151. package/dist/hooks/use-settings-completion.d.ts +7 -1
  152. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  153. package/dist/hooks/use-settings-completion.js +21 -1
  154. package/dist/hooks/use-settings-completion.js.map +1 -1
  155. package/dist/hooks/use-settings-value-completion.d.ts +3 -2
  156. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  157. package/dist/hooks/use-settings-value-completion.js +28 -5
  158. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  159. package/dist/hooks/use-shell-mode.d.ts +1 -0
  160. package/dist/hooks/use-shell-mode.d.ts.map +1 -1
  161. package/dist/hooks/use-shell-mode.js +1 -0
  162. package/dist/hooks/use-shell-mode.js.map +1 -1
  163. package/dist/hooks/use-standalone-model-picker.d.ts +9 -4
  164. package/dist/hooks/use-standalone-model-picker.d.ts.map +1 -1
  165. package/dist/hooks/use-standalone-model-picker.js +44 -18
  166. package/dist/hooks/use-standalone-model-picker.js.map +1 -1
  167. package/dist/hooks/use-subagent-pool-selection.d.ts +3 -2
  168. package/dist/hooks/use-subagent-pool-selection.d.ts.map +1 -1
  169. package/dist/hooks/use-subagent-pool-selection.js +11 -7
  170. package/dist/hooks/use-subagent-pool-selection.js.map +1 -1
  171. package/dist/lib/agent-client.d.ts +2 -0
  172. package/dist/lib/agent-client.d.ts.map +1 -1
  173. package/dist/lib/agent-client.js +19 -0
  174. package/dist/lib/agent-client.js.map +1 -1
  175. package/dist/lib/agent-configuration.d.ts +5 -0
  176. package/dist/lib/agent-configuration.d.ts.map +1 -1
  177. package/dist/lib/agent-configuration.js +11 -0
  178. package/dist/lib/agent-configuration.js.map +1 -1
  179. package/dist/lib/agent-factory.d.ts +3 -0
  180. package/dist/lib/agent-factory.d.ts.map +1 -1
  181. package/dist/lib/agent-factory.js +14 -5
  182. package/dist/lib/agent-factory.js.map +1 -1
  183. package/dist/lib/oauth-loopback.d.ts +79 -0
  184. package/dist/lib/oauth-loopback.d.ts.map +1 -0
  185. package/dist/lib/oauth-loopback.js +221 -0
  186. package/dist/lib/oauth-loopback.js.map +1 -0
  187. package/dist/non-interactive.d.ts +2 -0
  188. package/dist/non-interactive.d.ts.map +1 -1
  189. package/dist/non-interactive.js +19 -0
  190. package/dist/non-interactive.js.map +1 -1
  191. package/dist/prompts/fragments/{gpt-6-astra.md → gpt-6.md} +0 -6
  192. package/dist/prompts/fragments/skill-instruction-conflicts.md +5 -0
  193. package/dist/prompts/gpt-5.6.md +1 -1
  194. package/dist/prompts/orchestrator-prompt.test.ts +5 -2
  195. package/dist/prompts/orchestrator.md +1 -1
  196. package/dist/prompts/pair-mode-stub.md +3 -0
  197. package/dist/prompts/pair-mode.md +29 -0
  198. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  199. package/dist/prompts/prompt-constructor.js +1 -0
  200. package/dist/prompts/prompt-constructor.js.map +1 -1
  201. package/dist/prompts/prompt-constructor.test.ts +28 -18
  202. package/dist/prompts/prompt-constructor.ts +1 -0
  203. package/dist/prompts/prompt-profiles.js +3 -3
  204. package/dist/prompts/prompt-profiles.js.map +1 -1
  205. package/dist/prompts/prompt-profiles.ts +3 -3
  206. package/dist/prompts/steering-notice.d.ts +3 -3
  207. package/dist/prompts/steering-notice.d.ts.map +1 -1
  208. package/dist/prompts/steering-notice.js +13 -5
  209. package/dist/prompts/steering-notice.js.map +1 -1
  210. package/dist/prompts/steering-notice.test.ts +36 -0
  211. package/dist/prompts/steering-notice.ts +17 -4
  212. package/dist/prompts/subagents/base-gpt-5-modern.md +1 -1
  213. package/dist/prompts/subagents/worker-prompt.test.ts +13 -1
  214. package/dist/prompts/subagents/worker.md +4 -2
  215. package/dist/providers/model-catalog/catalog.generated.d.ts +505 -361
  216. package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
  217. package/dist/providers/model-catalog/catalog.generated.js +505 -361
  218. package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
  219. package/dist/providers/oauth-pkce.d.ts +5 -1
  220. package/dist/providers/oauth-pkce.d.ts.map +1 -1
  221. package/dist/providers/oauth-pkce.js +28 -208
  222. package/dist/providers/oauth-pkce.js.map +1 -1
  223. package/dist/providers/openrouter-decisions.d.ts +23 -0
  224. package/dist/providers/openrouter-decisions.d.ts.map +1 -0
  225. package/dist/providers/openrouter-decisions.js +72 -0
  226. package/dist/providers/openrouter-decisions.js.map +1 -0
  227. package/dist/scripts/eval-gpt6-prompts.d.ts +2 -0
  228. package/dist/scripts/eval-gpt6-prompts.d.ts.map +1 -0
  229. package/dist/scripts/eval-gpt6-prompts.js +214 -0
  230. package/dist/scripts/eval-gpt6-prompts.js.map +1 -0
  231. package/dist/services/agent-runtime/application-run-loop.d.ts +3 -0
  232. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
  233. package/dist/services/agent-runtime/application-run-loop.js +39 -3
  234. package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
  235. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts.map +1 -1
  236. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js +8 -3
  237. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js.map +1 -1
  238. package/dist/services/approval/decision-shadow.d.ts +26 -0
  239. package/dist/services/approval/decision-shadow.d.ts.map +1 -0
  240. package/dist/services/approval/decision-shadow.js +76 -0
  241. package/dist/services/approval/decision-shadow.js.map +1 -0
  242. package/dist/services/approval/non-interactive-approval-policy.d.ts +3 -0
  243. package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -1
  244. package/dist/services/approval/non-interactive-approval-policy.js +12 -0
  245. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -1
  246. package/dist/services/approval/shell-auto-approval-evaluator.d.ts +3 -1
  247. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  248. package/dist/services/approval/shell-auto-approval-evaluator.js +104 -6
  249. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  250. package/dist/services/conversation/conversation-events.d.ts +6 -1
  251. package/dist/services/conversation/conversation-events.d.ts.map +1 -1
  252. package/dist/services/conversation/conversation-events.js.map +1 -1
  253. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  254. package/dist/services/conversation/conversation-orchestrator.js +26 -2
  255. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  256. package/dist/services/conversation/conversation-orchestrator.types.d.ts +1 -1
  257. package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
  258. package/dist/services/decision-shadow/decision-client.d.ts +42 -0
  259. package/dist/services/decision-shadow/decision-client.d.ts.map +1 -0
  260. package/dist/services/decision-shadow/decision-client.js +94 -0
  261. package/dist/services/decision-shadow/decision-client.js.map +1 -0
  262. package/dist/services/decision-shadow/decision-shadow-observer.d.ts +16 -0
  263. package/dist/services/decision-shadow/decision-shadow-observer.d.ts.map +1 -0
  264. package/dist/services/decision-shadow/decision-shadow-observer.js +2 -0
  265. package/dist/services/decision-shadow/decision-shadow-observer.js.map +1 -0
  266. package/dist/services/decision-shadow/decision-shadow-pilot.d.ts +14 -0
  267. package/dist/services/decision-shadow/decision-shadow-pilot.d.ts.map +1 -0
  268. package/dist/services/decision-shadow/decision-shadow-pilot.js +166 -0
  269. package/dist/services/decision-shadow/decision-shadow-pilot.js.map +1 -0
  270. package/dist/services/decision-shadow/failure-observation.d.ts +10 -0
  271. package/dist/services/decision-shadow/failure-observation.d.ts.map +1 -0
  272. package/dist/services/decision-shadow/failure-observation.js +26 -0
  273. package/dist/services/decision-shadow/failure-observation.js.map +1 -0
  274. package/dist/services/decision-shadow/failure-triage.d.ts +33 -0
  275. package/dist/services/decision-shadow/failure-triage.d.ts.map +1 -0
  276. package/dist/services/decision-shadow/failure-triage.js +60 -0
  277. package/dist/services/decision-shadow/failure-triage.js.map +1 -0
  278. package/dist/services/decision-shadow/replay-evaluator.d.ts +44 -0
  279. package/dist/services/decision-shadow/replay-evaluator.d.ts.map +1 -0
  280. package/dist/services/decision-shadow/replay-evaluator.js +65 -0
  281. package/dist/services/decision-shadow/replay-evaluator.js.map +1 -0
  282. package/dist/services/decision-shadow/replay-fixtures.d.ts +8 -0
  283. package/dist/services/decision-shadow/replay-fixtures.d.ts.map +1 -0
  284. package/dist/services/decision-shadow/replay-fixtures.js +14 -0
  285. package/dist/services/decision-shadow/replay-fixtures.js.map +1 -0
  286. package/dist/services/mcp/mcp-config-controller.d.ts +32 -0
  287. package/dist/services/mcp/mcp-config-controller.d.ts.map +1 -0
  288. package/dist/services/mcp/mcp-config-controller.js +89 -0
  289. package/dist/services/mcp/mcp-config-controller.js.map +1 -0
  290. package/dist/services/mcp/mcp-config.d.ts +61 -0
  291. package/dist/services/mcp/mcp-config.d.ts.map +1 -0
  292. package/dist/services/mcp/mcp-config.js +232 -0
  293. package/dist/services/mcp/mcp-config.js.map +1 -0
  294. package/dist/services/mcp/mcp-connection-manager.d.ts +126 -0
  295. package/dist/services/mcp/mcp-connection-manager.d.ts.map +1 -0
  296. package/dist/services/mcp/mcp-connection-manager.js +488 -0
  297. package/dist/services/mcp/mcp-connection-manager.js.map +1 -0
  298. package/dist/services/mcp/mcp-oauth-login.d.ts +79 -0
  299. package/dist/services/mcp/mcp-oauth-login.d.ts.map +1 -0
  300. package/dist/services/mcp/mcp-oauth-login.js +126 -0
  301. package/dist/services/mcp/mcp-oauth-login.js.map +1 -0
  302. package/dist/services/mcp/mcp-oauth-provider.d.ts +77 -0
  303. package/dist/services/mcp/mcp-oauth-provider.d.ts.map +1 -0
  304. package/dist/services/mcp/mcp-oauth-provider.js +121 -0
  305. package/dist/services/mcp/mcp-oauth-provider.js.map +1 -0
  306. package/dist/services/mcp/mcp-oauth-store.d.ts +106 -0
  307. package/dist/services/mcp/mcp-oauth-store.d.ts.map +1 -0
  308. package/dist/services/mcp/mcp-oauth-store.js +278 -0
  309. package/dist/services/mcp/mcp-oauth-store.js.map +1 -0
  310. package/dist/services/mcp/mcp-status.d.ts +41 -0
  311. package/dist/services/mcp/mcp-status.d.ts.map +1 -0
  312. package/dist/services/mcp/mcp-status.js +69 -0
  313. package/dist/services/mcp/mcp-status.js.map +1 -0
  314. package/dist/services/mcp/mcp-stdio-launcher.d.ts +26 -0
  315. package/dist/services/mcp/mcp-stdio-launcher.d.ts.map +1 -0
  316. package/dist/services/mcp/mcp-stdio-launcher.js +8 -0
  317. package/dist/services/mcp/mcp-stdio-launcher.js.map +1 -0
  318. package/dist/services/mcp/mcp-tool-source.d.ts +77 -0
  319. package/dist/services/mcp/mcp-tool-source.d.ts.map +1 -0
  320. package/dist/services/mcp/mcp-tool-source.js +10 -0
  321. package/dist/services/mcp/mcp-tool-source.js.map +1 -0
  322. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts +25 -0
  323. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts.map +1 -0
  324. package/dist/services/mcp/test-fixtures/fake-authorization-server.js +147 -0
  325. package/dist/services/mcp/test-fixtures/fake-authorization-server.js.map +1 -0
  326. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts +29 -0
  327. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts.map +1 -0
  328. package/dist/services/mcp/test-fixtures/protected-mcp-server.js +87 -0
  329. package/dist/services/mcp/test-fixtures/protected-mcp-server.js.map +1 -0
  330. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts +19 -0
  331. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts.map +1 -0
  332. package/dist/services/mcp/turn-stable-mcp-tool-source.js +37 -0
  333. package/dist/services/mcp/turn-stable-mcp-tool-source.js.map +1 -0
  334. package/dist/services/mode-notices.d.ts.map +1 -1
  335. package/dist/services/mode-notices.js +5 -1
  336. package/dist/services/mode-notices.js.map +1 -1
  337. package/dist/services/models/decision-model-listing.d.ts +26 -0
  338. package/dist/services/models/decision-model-listing.d.ts.map +1 -0
  339. package/dist/services/models/decision-model-listing.js +61 -0
  340. package/dist/services/models/decision-model-listing.js.map +1 -0
  341. package/dist/services/models/model-nicknames.d.ts +38 -2
  342. package/dist/services/models/model-nicknames.d.ts.map +1 -1
  343. package/dist/services/models/model-nicknames.js +64 -8
  344. package/dist/services/models/model-nicknames.js.map +1 -1
  345. package/dist/services/models/model-tabs.d.ts +22 -0
  346. package/dist/services/models/model-tabs.d.ts.map +1 -0
  347. package/dist/services/models/model-tabs.js +38 -0
  348. package/dist/services/models/model-tabs.js.map +1 -0
  349. package/dist/services/profiles/labels.d.ts.map +1 -1
  350. package/dist/services/profiles/labels.js +2 -0
  351. package/dist/services/profiles/labels.js.map +1 -1
  352. package/dist/services/profiles/legacy-adapter.d.ts.map +1 -1
  353. package/dist/services/profiles/legacy-adapter.js +1 -0
  354. package/dist/services/profiles/legacy-adapter.js.map +1 -1
  355. package/dist/services/profiles/profile-transition.d.ts.map +1 -1
  356. package/dist/services/profiles/profile-transition.js +3 -0
  357. package/dist/services/profiles/profile-transition.js.map +1 -1
  358. package/dist/services/profiles/registry.d.ts +1 -1
  359. package/dist/services/profiles/registry.d.ts.map +1 -1
  360. package/dist/services/profiles/registry.js +10 -1
  361. package/dist/services/profiles/registry.js.map +1 -1
  362. package/dist/services/session/continuation-recovery-handler.d.ts +4 -2
  363. package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
  364. package/dist/services/session/continuation-recovery-handler.js +1 -1
  365. package/dist/services/session/continuation-recovery-handler.js.map +1 -1
  366. package/dist/services/session/initial-turn-recovery-handler.d.ts +4 -2
  367. package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
  368. package/dist/services/session/initial-turn-recovery-handler.js +1 -1
  369. package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
  370. package/dist/services/session/pending-interaction-state.d.ts +2 -0
  371. package/dist/services/session/pending-interaction-state.d.ts.map +1 -1
  372. package/dist/services/session/pending-interaction-state.js +12 -0
  373. package/dist/services/session/pending-interaction-state.js.map +1 -1
  374. package/dist/services/session/session-composition.d.ts +18 -2
  375. package/dist/services/session/session-composition.d.ts.map +1 -1
  376. package/dist/services/session/session-composition.js +74 -46
  377. package/dist/services/session/session-composition.js.map +1 -1
  378. package/dist/services/settings/ancillary-settings-migration.d.ts.map +1 -1
  379. package/dist/services/settings/ancillary-settings-migration.js +4 -0
  380. package/dist/services/settings/ancillary-settings-migration.js.map +1 -1
  381. package/dist/services/settings/settings-schema.d.ts +4 -0
  382. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  383. package/dist/services/settings/settings-schema.js +20 -12
  384. package/dist/services/settings/settings-schema.js.map +1 -1
  385. package/dist/services/settings/settings-service.d.ts +4 -1
  386. package/dist/services/settings/settings-service.d.ts.map +1 -1
  387. package/dist/services/settings/settings-service.js +19 -24
  388. package/dist/services/settings/settings-service.js.map +1 -1
  389. package/dist/services/settings/settings-sources.d.ts +2 -0
  390. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  391. package/dist/services/settings/settings-sources.js +2 -0
  392. package/dist/services/settings/settings-sources.js.map +1 -1
  393. package/dist/services/settings/settings-ui-metadata.d.ts +4 -0
  394. package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -1
  395. package/dist/services/settings/settings-ui-metadata.js +22 -13
  396. package/dist/services/settings/settings-ui-metadata.js.map +1 -1
  397. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -0
  398. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  399. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +1 -0
  400. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  401. package/dist/services/shell/shell-interaction-session.d.ts +2 -0
  402. package/dist/services/shell/shell-interaction-session.d.ts.map +1 -1
  403. package/dist/services/shell/shell-interaction-session.js +11 -2
  404. package/dist/services/shell/shell-interaction-session.js.map +1 -1
  405. package/dist/services/subagents/role-loader.d.ts.map +1 -1
  406. package/dist/services/subagents/role-loader.js +1 -0
  407. package/dist/services/subagents/role-loader.js.map +1 -1
  408. package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
  409. package/dist/services/subagents/subagent-async-registry.js +1 -0
  410. package/dist/services/subagents/subagent-async-registry.js.map +1 -1
  411. package/dist/services/subagents/subagent-notification-store.js.map +1 -1
  412. package/dist/tools/system/run-code/mcp-script-surface.d.ts +28 -0
  413. package/dist/tools/system/run-code/mcp-script-surface.d.ts.map +1 -0
  414. package/dist/tools/system/run-code/mcp-script-surface.js +165 -0
  415. package/dist/tools/system/run-code/mcp-script-surface.js.map +1 -0
  416. package/dist/tools/system/run-code/run-code-runtime.d.ts.map +1 -1
  417. package/dist/tools/system/run-code/run-code-runtime.js +13 -1
  418. package/dist/tools/system/run-code/run-code-runtime.js.map +1 -1
  419. package/dist/tools/system/run-code/run-code.d.ts +3 -0
  420. package/dist/tools/system/run-code/run-code.d.ts.map +1 -1
  421. package/dist/tools/system/run-code/run-code.js +33 -4
  422. package/dist/tools/system/run-code/run-code.js.map +1 -1
  423. package/dist/tools/system/shell.d.ts +2 -0
  424. package/dist/tools/system/shell.d.ts.map +1 -1
  425. package/dist/tools/system/shell.js +9 -4
  426. package/dist/tools/system/shell.js.map +1 -1
  427. package/dist/types/message.d.ts +2 -0
  428. package/dist/types/message.d.ts.map +1 -1
  429. package/dist/types/message.js.map +1 -1
  430. package/dist/utils/clear-input-before-reset.d.ts +19 -0
  431. package/dist/utils/clear-input-before-reset.d.ts.map +1 -0
  432. package/dist/utils/clear-input-before-reset.js +20 -0
  433. package/dist/utils/clear-input-before-reset.js.map +1 -0
  434. package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
  435. package/dist/utils/conversation/conversation-utils.d.ts +1 -5
  436. package/dist/utils/conversation/conversation-utils.d.ts.map +1 -1
  437. package/dist/utils/conversation/conversation-utils.js +4 -1
  438. package/dist/utils/conversation/conversation-utils.js.map +1 -1
  439. package/dist/utils/settings-command.d.ts +2 -0
  440. package/dist/utils/settings-command.d.ts.map +1 -1
  441. package/dist/utils/settings-command.js +30 -1
  442. package/dist/utils/settings-command.js.map +1 -1
  443. package/dist/utils/shell/sandbox/denied-read-detector.d.ts.map +1 -1
  444. package/dist/utils/shell/sandbox/denied-read-detector.js +10 -6
  445. package/dist/utils/shell/sandbox/denied-read-detector.js.map +1 -1
  446. package/dist/utils/value-suggestions.d.ts +14 -0
  447. package/dist/utils/value-suggestions.d.ts.map +1 -1
  448. package/dist/utils/value-suggestions.js +31 -0
  449. package/dist/utils/value-suggestions.js.map +1 -1
  450. package/package.json +4 -1
@@ -0,0 +1,278 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import envPaths from 'env-paths';
5
+ /**
6
+ * Credential storage for MCP servers that authenticate with OAuth.
7
+ *
8
+ * One file holds every server's credentials, keyed by the server URL from the
9
+ * config rather than by the config entry's name: renaming `"linear"` to
10
+ * `"linear-remote"` in `.mcp.json` must not lose the login, and pointing a
11
+ * different entry at another URL must never reach a token issued for this one.
12
+ *
13
+ * Within a server, client information and tokens are sub-keyed by the
14
+ * authorization server's `issuer` (stamped by the SDK on every save), because a
15
+ * client id is only meaningful to the authorization server that issued it. The
16
+ * PKCE code verifier and the discovery state have no issuer — the SDK passes no
17
+ * context for them — so they belong to the server entry itself.
18
+ *
19
+ * This is the persistence half of `OAuthClientProvider`; the policy half (when
20
+ * to log in, whether to open a browser) lives in `mcp-oauth-provider.ts` and its
21
+ * caller.
22
+ */
23
+ export const MCP_OAUTH_STORE_VERSION = 1;
24
+ /** term2's own MCP credential file, beside `grok-auth.json` and `codex-auth.json`. */
25
+ export function defaultMcpOAuthStorePath() {
26
+ const dir = process.env.TERM2_CONFIG_DIR || envPaths('term2').config;
27
+ return path.join(dir, 'mcp-oauth.json');
28
+ }
29
+ /**
30
+ * The storage key for a server URL: lowercase scheme and host, no default port,
31
+ * no trailing slash, no query or fragment.
32
+ *
33
+ * The path keeps its case — URLs are only case-insensitive before the path — and
34
+ * a URL that cannot be parsed is keyed by its trimmed text, which keeps the
35
+ * function total while still giving two spellings of one bad string the same key.
36
+ */
37
+ export function normalizeMcpServerUrl(raw) {
38
+ let url;
39
+ try {
40
+ url = new URL(raw);
41
+ }
42
+ catch {
43
+ return raw.trim();
44
+ }
45
+ url.search = '';
46
+ url.hash = '';
47
+ // Userinfo is not part of the server's identity, and a password must never
48
+ // reach the credential file's key on disk.
49
+ url.username = '';
50
+ url.password = '';
51
+ url.protocol = url.protocol.toLowerCase();
52
+ url.hostname = url.hostname.toLowerCase();
53
+ // The URL parser already drops a default port for the schemes it knows; the
54
+ // explicit checks keep the normalization true for one it does not.
55
+ if (url.protocol === 'https:' && url.port === '443')
56
+ url.port = '';
57
+ if (url.protocol === 'http:' && url.port === '80')
58
+ url.port = '';
59
+ url.pathname = url.pathname.replace(/\/+$/, '');
60
+ // A root path normalizes back to '/', so the trailing-slash rule needs one
61
+ // more pass than the pathname assignment.
62
+ return url.toString().replace(/\/$/, '');
63
+ }
64
+ function emptyStore() {
65
+ return { version: MCP_OAUTH_STORE_VERSION, servers: {} };
66
+ }
67
+ function emptyServerEntry() {
68
+ return { byIssuer: {} };
69
+ }
70
+ function isEmptyServerEntry(entry) {
71
+ return Object.keys(entry.byIssuer).length === 0 && entry.codeVerifier === undefined && entry.discovery === undefined;
72
+ }
73
+ export class McpOAuthStore {
74
+ filesystem;
75
+ filePath;
76
+ constructor(options = {}) {
77
+ this.filesystem = options.filesystem ?? fs;
78
+ this.filePath = options.filePath ?? defaultMcpOAuthStorePath();
79
+ this.sweepTemporaryFiles();
80
+ }
81
+ get path() {
82
+ return this.filePath;
83
+ }
84
+ /**
85
+ * Reads the store. A missing, unreadable, or corrupt file is an empty store:
86
+ * a credential file is not worth crashing a session over, and the next write
87
+ * replaces the damaged body.
88
+ */
89
+ read() {
90
+ let parsed;
91
+ try {
92
+ parsed = JSON.parse(this.filesystem.readFileSync(this.filePath, 'utf8'));
93
+ }
94
+ catch {
95
+ return emptyStore();
96
+ }
97
+ if (!parsed || typeof parsed !== 'object' || typeof parsed.servers !== 'object' || parsed.servers === null) {
98
+ return emptyStore();
99
+ }
100
+ const servers = {};
101
+ for (const [serverKey, value] of Object.entries(parsed.servers)) {
102
+ if (!value || typeof value !== 'object')
103
+ continue;
104
+ const byIssuer = {};
105
+ if (value.byIssuer && typeof value.byIssuer === 'object') {
106
+ for (const [issuer, issuerEntry] of Object.entries(value.byIssuer)) {
107
+ if (!issuerEntry || typeof issuerEntry !== 'object')
108
+ continue;
109
+ byIssuer[issuer] = { client: issuerEntry.client, tokens: issuerEntry.tokens };
110
+ }
111
+ }
112
+ servers[serverKey] = {
113
+ byIssuer,
114
+ ...(typeof value.lastIssuer === 'string' ? { lastIssuer: value.lastIssuer } : {}),
115
+ ...(typeof value.codeVerifier === 'string' ? { codeVerifier: value.codeVerifier } : {}),
116
+ ...(value.discovery && typeof value.discovery === 'object' ? { discovery: value.discovery } : {}),
117
+ };
118
+ }
119
+ return { version: MCP_OAUTH_STORE_VERSION, servers };
120
+ }
121
+ getClientInformation(serverUrl, issuer) {
122
+ return this.serverEntry(serverUrl)?.byIssuer[issuer]?.client;
123
+ }
124
+ saveClientInformation(serverUrl, issuer, client) {
125
+ this.update(serverUrl, (entry) => {
126
+ entry.byIssuer[issuer] = { ...entry.byIssuer[issuer], client };
127
+ return entry;
128
+ });
129
+ }
130
+ /**
131
+ * Reads stored tokens. With no issuer, returns the most recently saved set —
132
+ * the transport's per-request read, which must not come back empty just
133
+ * because it has no context.
134
+ */
135
+ getTokens(serverUrl, issuer) {
136
+ const entry = this.serverEntry(serverUrl);
137
+ if (!entry)
138
+ return undefined;
139
+ if (issuer !== undefined)
140
+ return entry.byIssuer[issuer]?.tokens;
141
+ const key = entry.lastIssuer ?? Object.keys(entry.byIssuer).at(-1);
142
+ return key ? entry.byIssuer[key]?.tokens : undefined;
143
+ }
144
+ saveTokens(serverUrl, issuer, tokens) {
145
+ this.update(serverUrl, (entry) => {
146
+ entry.byIssuer[issuer] = { ...entry.byIssuer[issuer], tokens };
147
+ entry.lastIssuer = issuer;
148
+ return entry;
149
+ });
150
+ }
151
+ getCodeVerifier(serverUrl) {
152
+ return this.serverEntry(serverUrl)?.codeVerifier;
153
+ }
154
+ saveCodeVerifier(serverUrl, codeVerifier) {
155
+ this.update(serverUrl, (entry) => {
156
+ entry.codeVerifier = codeVerifier;
157
+ return entry;
158
+ });
159
+ }
160
+ getDiscoveryState(serverUrl) {
161
+ return this.serverEntry(serverUrl)?.discovery;
162
+ }
163
+ saveDiscoveryState(serverUrl, discovery) {
164
+ this.update(serverUrl, (entry) => {
165
+ entry.discovery = discovery;
166
+ return entry;
167
+ });
168
+ }
169
+ /**
170
+ * Forgets one class of credential for a server. Scopes are the SDK's: the
171
+ * transport calls `'client'` and `'tokens'` when the server rejects them,
172
+ * and hosts call `'discovery'` after repeated 401s so a changed
173
+ * `authorization_servers` list is picked up.
174
+ *
175
+ * `'client'` and `'tokens'` clear every issuer's entry, because the call
176
+ * carries no issuer and the rejected credential may be any of them.
177
+ */
178
+ invalidateCredentials(serverUrl, scope) {
179
+ if (scope === 'all') {
180
+ this.update(serverUrl, () => null);
181
+ return;
182
+ }
183
+ this.update(serverUrl, (entry) => {
184
+ if (scope === 'verifier')
185
+ entry.codeVerifier = undefined;
186
+ else if (scope === 'discovery')
187
+ entry.discovery = undefined;
188
+ else {
189
+ for (const issuer of Object.keys(entry.byIssuer)) {
190
+ const issuerEntry = entry.byIssuer[issuer];
191
+ if (scope === 'client')
192
+ delete issuerEntry.client;
193
+ else
194
+ delete issuerEntry.tokens;
195
+ if (!issuerEntry.client && !issuerEntry.tokens)
196
+ delete entry.byIssuer[issuer];
197
+ }
198
+ if (entry.lastIssuer !== undefined && !entry.byIssuer[entry.lastIssuer]?.tokens) {
199
+ entry.lastIssuer = undefined;
200
+ }
201
+ }
202
+ return entry;
203
+ });
204
+ }
205
+ serverEntry(serverUrl) {
206
+ return this.read().servers[normalizeMcpServerUrl(serverUrl)];
207
+ }
208
+ /** Applies one mutation and writes the whole store back atomically. */
209
+ update(serverUrl, mutate) {
210
+ const store = this.read();
211
+ const key = normalizeMcpServerUrl(serverUrl);
212
+ const next = mutate(store.servers[key] ?? emptyServerEntry());
213
+ if (next === null || isEmptyServerEntry(next))
214
+ delete store.servers[key];
215
+ else
216
+ store.servers[key] = next;
217
+ this.write({ version: MCP_OAUTH_STORE_VERSION, servers: store.servers });
218
+ }
219
+ /**
220
+ * Writes through a temporary file in the same directory, fsynced before the
221
+ * rename, so a reader — including another term2 instance — sees either the old
222
+ * file or the complete new one, never a half-written credential file.
223
+ */
224
+ write(store) {
225
+ this.filesystem.mkdirSync(path.dirname(this.filePath), { recursive: true });
226
+ const tmpPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;
227
+ let fd;
228
+ let renamed = false;
229
+ try {
230
+ fd = this.filesystem.openSync(tmpPath, 'w', 0o600);
231
+ this.filesystem.writeFileSync(fd, JSON.stringify(store, null, 2), { encoding: 'utf8' });
232
+ this.filesystem.fsyncSync(fd);
233
+ this.filesystem.closeSync(fd);
234
+ fd = undefined;
235
+ this.filesystem.renameSync(tmpPath, this.filePath);
236
+ renamed = true;
237
+ }
238
+ finally {
239
+ if (fd !== undefined) {
240
+ try {
241
+ this.filesystem.closeSync(fd);
242
+ }
243
+ catch {
244
+ // Preserve the original write failure.
245
+ }
246
+ }
247
+ if (!renamed) {
248
+ try {
249
+ this.filesystem.unlinkSync(tmpPath);
250
+ }
251
+ catch {
252
+ // Best-effort cleanup; the next startup sweep retries it.
253
+ }
254
+ }
255
+ }
256
+ }
257
+ sweepTemporaryFiles() {
258
+ const directory = path.dirname(this.filePath);
259
+ const base = path.basename(this.filePath).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
260
+ const unique = new RegExp(`^${base}\\.[^.]+\\.[A-Fa-f0-9-]{36}\\.tmp$`);
261
+ try {
262
+ for (const name of this.filesystem.readdirSync(directory)) {
263
+ if (name === `${path.basename(this.filePath)}.tmp` || unique.test(name)) {
264
+ try {
265
+ this.filesystem.unlinkSync(path.join(directory, name));
266
+ }
267
+ catch {
268
+ // A concurrent writer or permission failure is handled on its own path.
269
+ }
270
+ }
271
+ }
272
+ }
273
+ catch {
274
+ // A missing store directory has no temporary credentials to recover.
275
+ }
276
+ }
277
+ }
278
+ //# sourceMappingURL=mcp-oauth-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-oauth-store.js","sourceRoot":"","sources":["../../../source/services/mcp/mcp-oauth-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * User-facing rendering of MCP server state.
3
+ *
4
+ * Kept apart from both the connection manager and the UI so `/mcp` and the
5
+ * startup notices phrase the same state identically — the states a user acts on
6
+ * (`needs-auth`, `failed`) are exactly the ones where inconsistent wording costs
7
+ * the most.
8
+ *
9
+ * Pure functions over snapshots: no IO, no React, directly testable.
10
+ */
11
+ import type { McpServerSnapshot, McpServerState } from './mcp-tool-source.js';
12
+ export declare const isActionableMcpState: (state: McpServerState) => boolean;
13
+ /**
14
+ * One line per server for `/mcp`.
15
+ *
16
+ * The error is kept on its own continuation line: opt-in errors embed a JSON
17
+ * snippet and would otherwise hard-wrap into the middle of the next column.
18
+ */
19
+ export declare const formatMcpServerLines: (server: McpServerSnapshot) => string[];
20
+ export interface McpStatusView {
21
+ readonly snapshots: readonly McpServerSnapshot[];
22
+ /** Where the user edits server definitions; shown when there is nothing configured. */
23
+ readonly userConfigPath?: string;
24
+ }
25
+ /**
26
+ * The whole `/mcp` body.
27
+ *
28
+ * With no servers this is the only place the config file is ever named, so it
29
+ * doubles as the answer to "how do I add one?" — the plan deliberately ships no
30
+ * settings UI for MCP.
31
+ */
32
+ export declare const formatMcpStatus: (view: McpStatusView) => string;
33
+ /**
34
+ * The announcement for a server that has just settled somewhere the user must
35
+ * act, or `undefined` when the state needs no attention.
36
+ *
37
+ * `error` already carries the remedy (the `/mcp-login` instruction, or the exact
38
+ * config line for an opt-in), so it is surfaced verbatim rather than re-worded.
39
+ */
40
+ export declare const formatMcpNotice: (server: McpServerSnapshot) => string | undefined;
41
+ //# sourceMappingURL=mcp-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../../../source/services/mcp/mcp-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa9E,eAAO,MAAM,oBAAoB,UAAW,cAAc,KAAG,OAAgC,CAAC;AAK9F;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,WAAY,iBAAiB,KAAG,MAAM,EAUtE,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,uFAAuF;IACvF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,SAAU,aAAa,KAAG,MAiBrD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,WAAY,iBAAiB,KAAG,MAAM,GAAG,SAKpE,CAAC"}
@@ -0,0 +1,69 @@
1
+ /** How a state reads to a human, rather than the protocol-facing name. */
2
+ const STATE_LABEL = {
3
+ connecting: 'connecting',
4
+ ready: 'ready',
5
+ 'needs-auth': 'needs login',
6
+ failed: 'failed',
7
+ };
8
+ /** States a user can do something about; the ones worth interrupting them for. */
9
+ const ACTIONABLE = new Set(['needs-auth', 'failed']);
10
+ export const isActionableMcpState = (state) => ACTIONABLE.has(state);
11
+ const toolCount = (server) => server.state === 'ready' ? `${server.tools.length} tool${server.tools.length === 1 ? '' : 's'}` : '';
12
+ /**
13
+ * One line per server for `/mcp`.
14
+ *
15
+ * The error is kept on its own continuation line: opt-in errors embed a JSON
16
+ * snippet and would otherwise hard-wrap into the middle of the next column.
17
+ */
18
+ export const formatMcpServerLines = (server) => {
19
+ const head = [
20
+ ` ${server.name}`,
21
+ `[${STATE_LABEL[server.state]}]`,
22
+ toolCount(server),
23
+ `(${server.provenance} ${server.transport})`,
24
+ ]
25
+ .filter(Boolean)
26
+ .join(' ');
27
+ return server.error ? [head, ` ${server.error}`] : [head];
28
+ };
29
+ /**
30
+ * The whole `/mcp` body.
31
+ *
32
+ * With no servers this is the only place the config file is ever named, so it
33
+ * doubles as the answer to "how do I add one?" — the plan deliberately ships no
34
+ * settings UI for MCP.
35
+ */
36
+ export const formatMcpStatus = (view) => {
37
+ if (view.snapshots.length === 0) {
38
+ return [
39
+ 'No MCP servers are configured.',
40
+ view.userConfigPath ? `Add them under "mcpServers" in ${view.userConfigPath}` : '',
41
+ 'A project can also define them in .mcp.json at the workspace root.',
42
+ ]
43
+ .filter(Boolean)
44
+ .join('\n');
45
+ }
46
+ const lines = [`MCP servers (${view.snapshots.length}):`];
47
+ for (const server of view.snapshots)
48
+ lines.push(...formatMcpServerLines(server));
49
+ const needLogin = view.snapshots.filter((s) => s.state === 'needs-auth').map((s) => s.name);
50
+ if (needLogin.length) {
51
+ lines.push('', `Run /mcp-login <server> to authenticate: ${needLogin.join(', ')}`);
52
+ }
53
+ return lines.join('\n');
54
+ };
55
+ /**
56
+ * The announcement for a server that has just settled somewhere the user must
57
+ * act, or `undefined` when the state needs no attention.
58
+ *
59
+ * `error` already carries the remedy (the `/mcp-login` instruction, or the exact
60
+ * config line for an opt-in), so it is surfaced verbatim rather than re-worded.
61
+ */
62
+ export const formatMcpNotice = (server) => {
63
+ if (!isActionableMcpState(server.state))
64
+ return undefined;
65
+ return server.error
66
+ ? `MCP server "${server.name}" ${STATE_LABEL[server.state]}: ${server.error}`
67
+ : `MCP server "${server.name}" ${STATE_LABEL[server.state]}.`;
68
+ };
69
+ //# sourceMappingURL=mcp-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-status.js","sourceRoot":"","sources":["../../../source/services/mcp/mcp-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The seam where stdio MCP servers are launched.
3
+ *
4
+ * The default launcher spawns the configured command as-is. The seam is
5
+ * injectable so tests can observe launches and a future slice can rewrite the
6
+ * spawn without touching the connection manager.
7
+ */
8
+ export interface StdioLaunchSpec {
9
+ /** Server config key, for launcher diagnostics. */
10
+ readonly name: string;
11
+ readonly command: string;
12
+ readonly args: readonly string[];
13
+ readonly env: Readonly<Record<string, string>>;
14
+ readonly cwd?: string;
15
+ }
16
+ /** What actually gets spawned. A sandboxed launcher rewrites this. */
17
+ export interface StdioSpawnSpec {
18
+ readonly command: string;
19
+ readonly args: readonly string[];
20
+ readonly env: Readonly<Record<string, string>>;
21
+ readonly cwd?: string;
22
+ }
23
+ export type StdioLauncher = (spec: StdioLaunchSpec) => Promise<StdioSpawnSpec>;
24
+ /** Runs the configured command as-is. Used until sandboxed launch lands. */
25
+ export declare const unsandboxedStdioLauncher: StdioLauncher;
26
+ //# sourceMappingURL=mcp-stdio-launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-stdio-launcher.d.ts","sourceRoot":"","sources":["../../../source/services/mcp/mcp-stdio-launcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAE/E,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,EAAE,aAKrC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Runs the configured command as-is. Used until sandboxed launch lands. */
2
+ export const unsandboxedStdioLauncher = async (spec) => ({
3
+ command: spec.command,
4
+ args: spec.args,
5
+ env: spec.env,
6
+ ...(spec.cwd !== undefined ? { cwd: spec.cwd } : {}),
7
+ });
8
+ //# sourceMappingURL=mcp-stdio-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-stdio-launcher.js","sourceRoot":"","sources":["../../../source/services/mcp/mcp-stdio-launcher.ts"],"names":[],"mappings":"AA0BA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAkB,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,IAAI,EAAE,IAAI,CAAC,IAAI;IACf,GAAG,EAAE,IAAI,CAAC,GAAG;IACb,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Contract between the MCP connection layer (`source/services/mcp/`) and its
3
+ * only consumer, the `run_code` script surface. MCP tools are never direct
4
+ * model tools; see docs/plans/mcp-code-mode.md, Decision 1.
5
+ *
6
+ * This file is types only. Implementations must not widen it without updating
7
+ * both sides and the plan.
8
+ */
9
+ import type { JsonSchemaObject } from '../../tools/types.js';
10
+ /** Where a server's configuration came from. Drives sandboxing (plan Decision 4). */
11
+ export type McpServerProvenance = 'user' | 'project';
12
+ export type McpTransportKind = 'stdio' | 'streamable-http' | 'sse';
13
+ /**
14
+ * `needs-auth` is a distinct resting state, not a failure: the server answered
15
+ * correctly and asked for an OAuth login that only the user can start
16
+ * (plan decision D1). `error` carries the `/mcp-login` instruction.
17
+ */
18
+ export type McpServerState = 'connecting' | 'ready' | 'failed' | 'needs-auth';
19
+ export interface McpToolAnnotations {
20
+ readonly title?: string;
21
+ readonly readOnlyHint?: boolean;
22
+ readonly destructiveHint?: boolean;
23
+ readonly idempotentHint?: boolean;
24
+ readonly openWorldHint?: boolean;
25
+ }
26
+ /** One tool exactly as the server listed it (all `tools/list` pages merged). */
27
+ export interface McpToolDescriptor {
28
+ readonly name: string;
29
+ readonly title?: string;
30
+ readonly description?: string;
31
+ readonly inputSchema: JsonSchemaObject;
32
+ readonly outputSchema?: JsonSchemaObject;
33
+ /** Server-supplied hints. Untrusted: never used to bypass approval. */
34
+ readonly annotations?: McpToolAnnotations;
35
+ }
36
+ export interface McpServerSnapshot {
37
+ /** Config key, unique across merged user + project config. */
38
+ readonly name: string;
39
+ readonly provenance: McpServerProvenance;
40
+ readonly transport: McpTransportKind;
41
+ readonly state: McpServerState;
42
+ /**
43
+ * Human-readable reason when `state` is `failed` or `needs-auth`, including
44
+ * sandbox override hints and the `/mcp-login` instruction.
45
+ */
46
+ readonly error?: string;
47
+ /** Empty unless `state === 'ready'`. */
48
+ readonly tools: readonly McpToolDescriptor[];
49
+ }
50
+ export interface McpCallResult {
51
+ /** MCP `CallToolResult.content` blocks, unmodified. */
52
+ readonly content: readonly unknown[];
53
+ readonly structuredContent?: unknown;
54
+ /** Application-level tool failure reported by the server. */
55
+ readonly isError: boolean;
56
+ }
57
+ export type McpCallErrorCode = 'unknown_server' | 'unknown_tool' | 'server_unavailable' | 'timeout' | 'aborted' | 'protocol';
58
+ /** Rejection type for {@link McpToolSource.callTool}. Transport/protocol failures only. */
59
+ export declare class McpCallError extends Error {
60
+ readonly code: McpCallErrorCode;
61
+ constructor(code: McpCallErrorCode, message: string);
62
+ }
63
+ export interface McpCallOptions {
64
+ readonly signal: AbortSignal;
65
+ readonly timeoutMs?: number;
66
+ }
67
+ export interface McpToolSource {
68
+ /**
69
+ * Current catalog. Returns the same array instance until the catalog changes,
70
+ * so callers can cheaply detect change by identity.
71
+ */
72
+ snapshot(): readonly McpServerSnapshot[];
73
+ callTool(server: string, tool: string, args: Record<string, unknown>, options: McpCallOptions): Promise<McpCallResult>;
74
+ /** Fires after `snapshot()` would return a new array. Returns an unsubscribe function. */
75
+ onCatalogChanged(listener: () => void): () => void;
76
+ }
77
+ //# sourceMappingURL=mcp-tool-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-source.d.ts","sourceRoot":"","sources":["../../../source/services/mcp/mcp-tool-source.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,qFAAqF;AACrF,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAEnE;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IACzC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,SAAS,GACT,SAAS,GACT,UAAU,CAAC;AAEf,2FAA2F;AAC3F,qBAAa,YAAa,SAAQ,KAAK;IACzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB;IAA3C,YAAqB,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAG3D;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,IAAI,SAAS,iBAAiB,EAAE,CAAC;IACzC,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,0FAA0F;IAC1F,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CACpD"}
@@ -0,0 +1,10 @@
1
+ /** Rejection type for {@link McpToolSource.callTool}. Transport/protocol failures only. */
2
+ export class McpCallError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.code = code;
7
+ this.name = 'McpCallError';
8
+ }
9
+ }
10
+ //# sourceMappingURL=mcp-tool-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-source.js","sourceRoot":"","sources":["../../../source/services/mcp/mcp-tool-source.ts"],"names":[],"mappings":"AAwEA,2FAA2F;AAC3F,MAAM,OAAO,YAAa,SAAQ,KAAK;IAChB,IAAI;IAAzB,YAAqB,IAAsB,EAAE,OAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;oBADI,IAAI;QAEvB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * An offline OAuth 2.1 authorization server for MCP flow tests: RFC 8414 metadata
3
+ * discovery, an `/authorize` endpoint that records the PKCE challenge, a `/token`
4
+ * endpoint that validates the S256 verifier and rotates refresh tokens, and an
5
+ * RFC 7591 `/register` endpoint for dynamic client registration.
6
+ *
7
+ * Deliberately strict: a flow that skips PKCE, reuses a code, or sends the wrong
8
+ * redirect URI fails here rather than in the client, so a green test means the
9
+ * client really did the protocol work.
10
+ */
11
+ export type FakeAuthorizationServer = {
12
+ /** Issuer identifier; also the base URL clients discover and talk to. */
13
+ issuer: string;
14
+ /** Access tokens issued so far, in order. */
15
+ issuedAccessTokens: string[];
16
+ /** Refresh tokens presented on a refresh grant, in order. */
17
+ refreshGrants: string[];
18
+ /** Client ids handed out by `/register`, in order. */
19
+ registeredClientIds: string[];
20
+ /** Requests refused because the PKCE verifier or the code did not check out. */
21
+ refusedTokenRequests: number;
22
+ stop: () => Promise<void>;
23
+ };
24
+ export declare function startFakeAuthorizationServer(): Promise<FakeAuthorizationServer>;
25
+ //# sourceMappingURL=fake-authorization-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-authorization-server.d.ts","sourceRoot":"","sources":["../../../../source/services/mcp/test-fixtures/fake-authorization-server.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,6DAA6D;IAC7D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,sDAAsD;IACtD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,gFAAgF;IAChF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAoCF,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAyHrF"}