@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,147 @@
1
+ import crypto from 'node:crypto';
2
+ import { createServer } from 'node:http';
3
+ function listen(server) {
4
+ return new Promise((resolve, reject) => {
5
+ server.once('error', reject);
6
+ server.listen(0, '127.0.0.1', () => {
7
+ server.off('error', reject);
8
+ resolve(server.address().port);
9
+ });
10
+ });
11
+ }
12
+ async function readBody(req) {
13
+ const chunks = [];
14
+ for await (const chunk of req)
15
+ chunks.push(Buffer.from(chunk));
16
+ return Buffer.concat(chunks).toString('utf8');
17
+ }
18
+ function sendJson(res, status, body) {
19
+ const payload = JSON.stringify(body);
20
+ res.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) });
21
+ res.end(payload);
22
+ }
23
+ function sendError(res, status, error, description) {
24
+ sendJson(res, status, { error, error_description: description });
25
+ }
26
+ const s256 = (verifier) => crypto.createHash('sha256').update(verifier).digest('base64url');
27
+ export async function startFakeAuthorizationServer() {
28
+ const codes = new Map();
29
+ const knownRefreshTokens = new Set();
30
+ const state = {
31
+ issuer: '',
32
+ issuedAccessTokens: [],
33
+ refreshGrants: [],
34
+ registeredClientIds: [],
35
+ refusedTokenRequests: 0,
36
+ stop: () => new Promise((resolve) => server.close(() => resolve())),
37
+ };
38
+ const issueTokens = () => {
39
+ const accessToken = `at-${crypto.randomUUID()}`;
40
+ const refreshToken = `rt-${crypto.randomUUID()}`;
41
+ state.issuedAccessTokens.push(accessToken);
42
+ knownRefreshTokens.add(refreshToken);
43
+ return { access_token: accessToken, refresh_token: refreshToken, token_type: 'Bearer', expires_in: 3600 };
44
+ };
45
+ const handleAuthorize = (url, res) => {
46
+ const redirectUri = url.searchParams.get('redirect_uri');
47
+ const codeChallenge = url.searchParams.get('code_challenge');
48
+ const clientId = url.searchParams.get('client_id');
49
+ if (url.searchParams.get('response_type') !== 'code') {
50
+ return sendError(res, 400, 'unsupported_response_type', 'only the code response type is supported');
51
+ }
52
+ if (url.searchParams.get('code_challenge_method') !== 'S256') {
53
+ return sendError(res, 400, 'invalid_request', 'code_challenge_method must be S256');
54
+ }
55
+ if (!codeChallenge || !redirectUri || !clientId) {
56
+ return sendError(res, 400, 'invalid_request', 'client_id, redirect_uri and code_challenge are required');
57
+ }
58
+ const code = `code-${crypto.randomUUID()}`;
59
+ codes.set(code, { clientId, redirectUri, codeChallenge });
60
+ const location = new URL(redirectUri);
61
+ location.searchParams.set('code', code);
62
+ const clientState = url.searchParams.get('state');
63
+ if (clientState)
64
+ location.searchParams.set('state', clientState);
65
+ // The user is never asked to consent: this server approves every request.
66
+ res.writeHead(302, { Location: location.href });
67
+ res.end();
68
+ };
69
+ const handleToken = async (req, res) => {
70
+ const params = new URLSearchParams(await readBody(req));
71
+ const grantType = params.get('grant_type');
72
+ if (grantType === 'authorization_code') {
73
+ const code = params.get('code') ?? '';
74
+ const pending = codes.get(code);
75
+ // Single use: a replayed code must not mint a second token set.
76
+ codes.delete(code);
77
+ const verifier = params.get('code_verifier') ?? '';
78
+ if (!pending)
79
+ return refuse(res, 'unknown or already-used authorization code');
80
+ if (pending.redirectUri !== params.get('redirect_uri'))
81
+ return refuse(res, 'redirect_uri does not match');
82
+ if (pending.clientId !== params.get('client_id'))
83
+ return refuse(res, 'client_id does not match');
84
+ if (pending.codeChallenge !== s256(verifier)) {
85
+ return refuse(res, 'code_verifier does not match the S256 challenge');
86
+ }
87
+ return sendJson(res, 200, issueTokens());
88
+ }
89
+ if (grantType === 'refresh_token') {
90
+ const presented = params.get('refresh_token') ?? '';
91
+ if (!knownRefreshTokens.has(presented))
92
+ return refuse(res, 'unknown refresh token');
93
+ state.refreshGrants.push(presented);
94
+ // Rotation: the presented refresh token is spent by this grant.
95
+ knownRefreshTokens.delete(presented);
96
+ return sendJson(res, 200, issueTokens());
97
+ }
98
+ return sendError(res, 400, 'unsupported_grant_type', `unsupported grant_type: ${grantType ?? '(missing)'}`);
99
+ };
100
+ const refuse = (res, reason) => {
101
+ state.refusedTokenRequests += 1;
102
+ sendError(res, 400, 'invalid_grant', reason);
103
+ };
104
+ const server = createServer(async (req, res) => {
105
+ const url = new URL(req.url ?? '/', state.issuer || 'http://127.0.0.1');
106
+ try {
107
+ if (req.method === 'GET' && url.pathname === '/.well-known/oauth-authorization-server') {
108
+ return sendJson(res, 200, {
109
+ issuer: state.issuer,
110
+ authorization_endpoint: `${state.issuer}/authorize`,
111
+ token_endpoint: `${state.issuer}/token`,
112
+ registration_endpoint: `${state.issuer}/register`,
113
+ response_types_supported: ['code'],
114
+ grant_types_supported: ['authorization_code', 'refresh_token'],
115
+ code_challenge_methods_supported: ['S256'],
116
+ token_endpoint_auth_methods_supported: ['none'],
117
+ scopes_supported: ['mcp'],
118
+ });
119
+ }
120
+ if (req.method === 'GET' && url.pathname === '/authorize')
121
+ return handleAuthorize(url, res);
122
+ if (req.method === 'POST' && url.pathname === '/token')
123
+ return await handleToken(req, res);
124
+ if (req.method === 'POST' && url.pathname === '/register') {
125
+ // RFC 7591: the response carries the client id plus the metadata that
126
+ // was registered, which the client validates against its own request.
127
+ const metadata = JSON.parse((await readBody(req)) || '{}');
128
+ const clientId = `dcr-${state.registeredClientIds.length + 1}`;
129
+ state.registeredClientIds.push(clientId);
130
+ return sendJson(res, 201, {
131
+ ...metadata,
132
+ client_id: clientId,
133
+ token_endpoint_auth_method: 'none',
134
+ client_id_issued_at: Math.floor(Date.now() / 1000),
135
+ });
136
+ }
137
+ sendJson(res, 404, { error: 'not_found', path: url.pathname });
138
+ }
139
+ catch (error) {
140
+ sendJson(res, 500, { error: 'server_error', error_description: String(error) });
141
+ }
142
+ });
143
+ const port = await listen(server);
144
+ state.issuer = `http://127.0.0.1:${port}`;
145
+ return state;
146
+ }
147
+ //# sourceMappingURL=fake-authorization-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-authorization-server.js","sourceRoot":"","sources":["../../../../source/services/mcp/test-fixtures/fake-authorization-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * An MCP server that requires a bearer token and publishes RFC 9728 protected
3
+ * resource metadata pointing at its authorization server — the shape a client
4
+ * hits when it connects to an OAuth-protected remote server.
5
+ *
6
+ * Serving goes through the real v2 SDK handler, so a test that reaches a tool
7
+ * here has done the actual MCP handshake over Streamable HTTP.
8
+ */
9
+ export type ProtectedMcpServerOptions = {
10
+ /** The authorization server's issuer identifier. */
11
+ authorizationServerUrl: string;
12
+ /** Returns the auth info for a token, or null when the token is not valid. */
13
+ verifyToken: (token: string) => Promise<{
14
+ clientId: string;
15
+ scopes: string[];
16
+ expiresAt: number;
17
+ } | null>;
18
+ };
19
+ export type ProtectedMcpServer = {
20
+ /** Base URL of the MCP endpoint. */
21
+ url: string;
22
+ /** RFC 9728 metadata URL advertised in the 401 challenge. */
23
+ resourceMetadataUrl: string;
24
+ /** Every HTTP request the fixture has seen, including refused ones. */
25
+ requestCount: () => number;
26
+ stop: () => Promise<void>;
27
+ };
28
+ export declare function startProtectedMcpServer(options: ProtectedMcpServerOptions): Promise<ProtectedMcpServer>;
29
+ //# sourceMappingURL=protected-mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protected-mcp-server.d.ts","sourceRoot":"","sources":["../../../../source/services/mcp/test-fixtures/protected-mcp-server.ts"],"names":[],"mappings":"AAYA;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,oDAAoD;IACpD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAC3G,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AA+BF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6D7G"}
@@ -0,0 +1,87 @@
1
+ import { createServer } from 'node:http';
2
+ import { McpServer, OAuthError, OAuthErrorCode, createMcpHandler, getOAuthProtectedResourceMetadataUrl, oauthMetadataResponse, requireBearerAuth, } from '@modelcontextprotocol/server';
3
+ function listen(server) {
4
+ return new Promise((resolve, reject) => {
5
+ server.once('error', reject);
6
+ server.listen(0, '127.0.0.1', () => {
7
+ server.off('error', reject);
8
+ resolve(server.address().port);
9
+ });
10
+ });
11
+ }
12
+ async function toResponse(res, response) {
13
+ res.writeHead(response.status, Object.fromEntries(response.headers));
14
+ if (response.body) {
15
+ for await (const chunk of response.body)
16
+ res.write(chunk);
17
+ }
18
+ res.end();
19
+ }
20
+ /** Builds one `Request` and lets each gate read from it. */
21
+ async function asRequest(req, url) {
22
+ const chunks = [];
23
+ for await (const chunk of req)
24
+ chunks.push(Buffer.from(chunk));
25
+ return new Request(url, {
26
+ method: req.method,
27
+ headers: req.headers,
28
+ ...(chunks.length ? { body: Buffer.concat(chunks) } : {}),
29
+ });
30
+ }
31
+ export async function startProtectedMcpServer(options) {
32
+ let origin = '';
33
+ let requests = 0;
34
+ const resourceUrl = () => `${origin}/mcp`;
35
+ const resourceMetadataUrl = () => getOAuthProtectedResourceMetadataUrl(new URL(resourceUrl()));
36
+ const mcp = new McpServer({ name: 'protected-fixture', version: '1.0.0' });
37
+ mcp.registerTool('echo', { description: 'reports that the server is reachable' }, async () => ({
38
+ content: [{ type: 'text', text: 'echo' }],
39
+ }));
40
+ const handler = createMcpHandler(() => mcp);
41
+ const verifier = {
42
+ verifyAccessToken: async (token) => {
43
+ const verified = await options.verifyToken(token);
44
+ if (!verified)
45
+ throw new OAuthError(OAuthErrorCode.InvalidToken, 'Unknown access token');
46
+ return { token, clientId: verified.clientId, scopes: verified.scopes, expiresAt: verified.expiresAt };
47
+ },
48
+ };
49
+ // Rebuilt per request because the challenge must advertise the metadata URL of
50
+ // the port the server actually bound, which is only known after `listen`.
51
+ const gate = (request) => requireBearerAuth({ verifier, resourceMetadataUrl: resourceMetadataUrl() })(request);
52
+ const server = createServer(async (req, res) => {
53
+ requests += 1;
54
+ const request = await asRequest(req, `http://${req.headers.host}${req.url}`);
55
+ // The protected-resource document is what an unauthenticated client reads to
56
+ // find the authorization server; it must not require a token itself.
57
+ const metadata = oauthMetadataResponse(request, {
58
+ oauthMetadata: {
59
+ issuer: options.authorizationServerUrl,
60
+ authorization_endpoint: `${options.authorizationServerUrl}/authorize`,
61
+ token_endpoint: `${options.authorizationServerUrl}/token`,
62
+ registration_endpoint: `${options.authorizationServerUrl}/register`,
63
+ response_types_supported: ['code'],
64
+ grant_types_supported: ['authorization_code', 'refresh_token'],
65
+ code_challenge_methods_supported: ['S256'],
66
+ },
67
+ resourceServerUrl: new URL(resourceUrl()),
68
+ resourceName: 'protected-fixture',
69
+ scopesSupported: ['mcp'],
70
+ });
71
+ if (metadata)
72
+ return toResponse(res, metadata);
73
+ const auth = await gate(request);
74
+ if (auth instanceof Response)
75
+ return toResponse(res, auth);
76
+ return toResponse(res, await handler.fetch(request, { authInfo: auth }));
77
+ });
78
+ const port = await listen(server);
79
+ origin = `http://127.0.0.1:${port}`;
80
+ return {
81
+ url: resourceUrl(),
82
+ resourceMetadataUrl: resourceMetadataUrl(),
83
+ requestCount: () => requests,
84
+ stop: () => new Promise((resolve) => server.close(() => resolve())),
85
+ };
86
+ }
87
+ //# sourceMappingURL=protected-mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protected-mcp-server.js","sourceRoot":"","sources":["../../../../source/services/mcp/test-fixtures/protected-mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { McpCallOptions, McpCallResult, McpServerSnapshot, McpToolSource } from './mcp-tool-source.js';
2
+ /**
3
+ * Keeps the catalog used to describe an agent stable until the caller starts
4
+ * the next turn. Calls deliberately remain live so a server can recover while
5
+ * a prompt is in flight.
6
+ */
7
+ export declare class TurnStableMcpToolSource implements McpToolSource {
8
+ private readonly live;
9
+ private catalog;
10
+ private pending;
11
+ private readonly unsubscribe;
12
+ constructor(live: McpToolSource);
13
+ beginTurn(): void;
14
+ snapshot(): readonly McpServerSnapshot[];
15
+ callTool(server: string, tool: string, args: Record<string, unknown>, options: McpCallOptions): Promise<McpCallResult>;
16
+ onCatalogChanged(listener: () => void): () => void;
17
+ dispose(): void;
18
+ }
19
+ //# sourceMappingURL=turn-stable-mcp-tool-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-stable-mcp-tool-source.d.ts","sourceRoot":"","sources":["../../../source/services/mcp/turn-stable-mcp-tool-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE5G;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAK/C,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,YAA6B,IAAI,EAAE,aAAa,EAK/C;IAED,SAAS,IAAI,IAAI,CAKhB;IAED,QAAQ,IAAI,SAAS,iBAAiB,EAAE,CAEvC;IAED,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,CAExB;IAED,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAEjD;IAED,OAAO,IAAI,IAAI,CAEd;CACF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Keeps the catalog used to describe an agent stable until the caller starts
3
+ * the next turn. Calls deliberately remain live so a server can recover while
4
+ * a prompt is in flight.
5
+ */
6
+ export class TurnStableMcpToolSource {
7
+ live;
8
+ catalog;
9
+ pending = false;
10
+ unsubscribe;
11
+ constructor(live) {
12
+ this.live = live;
13
+ this.catalog = live.snapshot();
14
+ this.unsubscribe = live.onCatalogChanged(() => {
15
+ this.pending = true;
16
+ });
17
+ }
18
+ beginTurn() {
19
+ if (this.pending) {
20
+ this.catalog = this.live.snapshot();
21
+ this.pending = false;
22
+ }
23
+ }
24
+ snapshot() {
25
+ return this.catalog;
26
+ }
27
+ callTool(server, tool, args, options) {
28
+ return this.live.callTool(server, tool, args, options);
29
+ }
30
+ onCatalogChanged(listener) {
31
+ return this.live.onCatalogChanged(listener);
32
+ }
33
+ dispose() {
34
+ this.unsubscribe();
35
+ }
36
+ }
37
+ //# sourceMappingURL=turn-stable-mcp-tool-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-stable-mcp-tool-source.js","sourceRoot":"","sources":["../../../source/services/mcp/turn-stable-mcp-tool-source.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,uBAAuB;IAKL,IAAI;IAJzB,OAAO,CAA+B;IACtC,OAAO,GAAG,KAAK,CAAC;IACP,WAAW,CAAa;IAEzC,YAA6B,IAAmB;oBAAnB,IAAI;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,QAAQ,CACN,MAAc,EACd,IAAY,EACZ,IAA6B,EAC7B,OAAuB;QAEvB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,gBAAgB,CAAC,QAAoB;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"mode-notices.d.ts","sourceRoot":"","sources":["../../source/services/mode-notices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAwB3D,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAAC;AAC5E,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAkCrE,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAAC;AAC3E,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AA+BpE,eAAO,MAAM,sBAAsB,QAAsD,CAAC;AAC1F,eAAO,MAAM,qBAAqB,QAAqD,CAAC;AACxF,eAAO,MAAM,wBAAwB,QAAwD,CAAC;AAC9F,eAAO,MAAM,uBAAuB,QAAuD,CAAC;AAC5F,eAAO,MAAM,8BAA8B,QAA8D,CAAC;AAC1G,eAAO,MAAM,6BAA6B,QAA6D,CAAC;AAExG,iFAAiF;AACjF,wBAAgB,gCAAgC,CAC9C,eAAe,EAAE,gBAAgB,EACjC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B,IAAI,CASN"}
1
+ {"version":3,"file":"mode-notices.d.ts","sourceRoot":"","sources":["../../source/services/mode-notices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAwB3D,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAAC;AAC5E,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAsCrE,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAAC;AAC3E,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAiCpE,eAAO,MAAM,sBAAsB,QAAsD,CAAC;AAC1F,eAAO,MAAM,qBAAqB,QAAqD,CAAC;AACxF,eAAO,MAAM,wBAAwB,QAAwD,CAAC;AAC9F,eAAO,MAAM,uBAAuB,QAAuD,CAAC;AAC5F,eAAO,MAAM,8BAA8B,QAA8D,CAAC;AAC1G,eAAO,MAAM,6BAA6B,QAA6D,CAAC;AAExG,iFAAiF;AACjF,wBAAgB,gCAAgC,CAC9C,eAAe,EAAE,gBAAgB,EACjC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B,IAAI,CASN"}
@@ -10,7 +10,7 @@ import { ProfileResolutionError } from './profiles/types.js';
10
10
  * The workflow body lives here, not in the instruction prefix, so a toggle
11
11
  * cannot change developer instructions on chained Responses-Lite HTTP turns.
12
12
  */
13
- const NOTICE_PROFILE_IDS = new Set(['builtin:plan', 'builtin:mentor', 'builtin:orchestrator']);
13
+ const NOTICE_PROFILE_IDS = new Set(['builtin:plan', 'builtin:pair', 'builtin:mentor', 'builtin:orchestrator']);
14
14
  const resolveNoticeProfile = (profile) => {
15
15
  if (typeof profile !== 'string')
16
16
  return profile;
@@ -37,6 +37,8 @@ export function profileEnterNotice(profile) {
37
37
  'Mode to execute it.\n\n' +
38
38
  workflow +
39
39
  '\n</system-notice>');
40
+ if (resolved.identity.id === 'builtin:pair')
41
+ return ('<system-notice>\nPair Mode is ON. Follow the human-led workflow below.\n\n' + workflow + '\n</system-notice>');
40
42
  if (resolved.identity.id === 'builtin:mentor')
41
43
  return ('<system-notice>\n' +
42
44
  'Mentor Mode is ON. Work collaboratively with the configured mentor model and follow the mentor workflow below.\n\n' +
@@ -53,6 +55,8 @@ export function profileExitNotice(profile) {
53
55
  const resolved = resolveNoticeProfile(profile);
54
56
  if (!resolved)
55
57
  return null;
58
+ if (resolved.identity.id === 'builtin:pair')
59
+ return '<system-notice>\nPair Mode is now OFF. Return to the normal workflow; the Pair-specific approval and one-unit-per-turn instructions are no longer active.\n</system-notice>';
56
60
  if (resolved.identity.id === 'builtin:plan')
57
61
  return ('<system-notice>\n' +
58
62
  'Plan Mode is now ' +
@@ -1 +1 @@
1
- {"version":3,"file":"mode-notices.js","sourceRoot":"","sources":["../../source/services/mode-notices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mode-notices.js","sourceRoot":"","sources":["../../source/services/mode-notices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Listing of OpenRouter models served by the alpha Decisions endpoint
3
+ * (`output_modalities` contains `decisions`). Chat models on
4
+ * `/api/v1/chat/completions` are NOT valid here: the Decisions endpoint only
5
+ * answers typed questions about a state, so the catalog filter — not the
6
+ * chat-model catalog — defines what the decision model setting
7
+ * may be set to. The endpoint is public and needs no API key.
8
+ */
9
+ export type DecisionModelInfo = {
10
+ id: string;
11
+ name?: string;
12
+ };
13
+ export declare function clearDecisionModelListCache(): void;
14
+ /**
15
+ * Fetch the decisions-capable model list. Returns the cached list within the
16
+ * TTL; returns null on fetch, HTTP, or payload failure without caching the
17
+ * failure, so a later open of the picker retries.
18
+ */
19
+ export declare function fetchDecisionModels(opts?: {
20
+ fetchImpl?: typeof fetch;
21
+ ttlMs?: number;
22
+ now?: () => number;
23
+ }): Promise<DecisionModelInfo[] | null>;
24
+ /** Whether a setting's picker is populated from the Decisions catalog. */
25
+ export declare function isDecisionModelKey(key: string): boolean;
26
+ //# sourceMappingURL=decision-model-listing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-model-listing.d.ts","sourceRoot":"","sources":["../../../source/services/models/decision-model-listing.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAOF,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAgBD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE;IAC/C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CA2BtC;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,61 @@
1
+ import { SETTING_KEYS } from '../settings/settings-schema.js';
2
+ const DECISION_MODELS_URL = 'https://openrouter.ai/api/v1/models?output_modalities=decisions';
3
+ const DEFAULT_TTL_MS = 60 * 60 * 1000;
4
+ let cache;
5
+ export function clearDecisionModelListCache() {
6
+ cache = undefined;
7
+ }
8
+ function parseDecisionModels(payload) {
9
+ if (typeof payload !== 'object' || payload === null)
10
+ return null;
11
+ const data = payload.data;
12
+ if (!Array.isArray(data))
13
+ return null;
14
+ const models = [];
15
+ for (const entry of data) {
16
+ if (typeof entry !== 'object' || entry === null)
17
+ continue;
18
+ const { id, name } = entry;
19
+ if (typeof id !== 'string' || id.length === 0)
20
+ continue;
21
+ models.push({ id, ...(typeof name === 'string' && name.length > 0 ? { name } : {}) });
22
+ }
23
+ return models;
24
+ }
25
+ /**
26
+ * Fetch the decisions-capable model list. Returns the cached list within the
27
+ * TTL; returns null on fetch, HTTP, or payload failure without caching the
28
+ * failure, so a later open of the picker retries.
29
+ */
30
+ export async function fetchDecisionModels(opts) {
31
+ const fetchImpl = opts?.fetchImpl ?? fetch;
32
+ const ttlMs = opts?.ttlMs ?? DEFAULT_TTL_MS;
33
+ const now = opts?.now ?? Date.now;
34
+ if (cache) {
35
+ const age = now() - cache.timestamp;
36
+ if (age >= 0 && age < ttlMs) {
37
+ return cache.models;
38
+ }
39
+ cache = undefined;
40
+ }
41
+ let payload;
42
+ try {
43
+ const response = await fetchImpl(DECISION_MODELS_URL);
44
+ if (!response.ok)
45
+ return null;
46
+ payload = await response.json();
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ const models = parseDecisionModels(payload);
52
+ if (models === null)
53
+ return null;
54
+ cache = { models, timestamp: now() };
55
+ return models;
56
+ }
57
+ /** Whether a setting's picker is populated from the Decisions catalog. */
58
+ export function isDecisionModelKey(key) {
59
+ return key === SETTING_KEYS.AGENT_DECISION_MODEL;
60
+ }
61
+ //# sourceMappingURL=decision-model-listing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-model-listing.js","sourceRoot":"","sources":["../../../source/services/models/decision-model-listing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAgB9D,MAAM,mBAAmB,GAAG,iEAAiE,CAAC;AAC9F,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC,IAAI,KAAqE,CAAC;AAE1E,MAAM,UAAU,2BAA2B;IACzC,KAAK,GAAG,SAAS,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,IAAI,GAAI,OAA8B,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC1D,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,KAAyC,CAAC;QAC/D,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACxD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAIzC;IACC,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,cAAc,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAElC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,MAAM,CAAC;QACtB,CAAC;QACD,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC;IAED,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEjC,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,KAAK,YAAY,CAAC,oBAAoB,CAAC;AACnD,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { ModelInfo } from '../model-service.js';
1
2
  import type { ISettingsService } from '../service-interfaces.js';
2
3
  import { type ModelSettingsReasoningEffort } from './reasoning-effort.js';
3
4
  /**
@@ -55,6 +56,13 @@ export declare function getNicknameEntries(settingsService: ISettingsService): N
55
56
  * for rendering existing nicknames on picker rows.
56
57
  */
57
58
  export declare function getNicknameLabels(settingsService: ISettingsService): Map<string, string>;
59
+ /**
60
+ * Nickname targets as model rows (id + home provider only), one per model,
61
+ * in settings order. Two names for the same model collapse to the first.
62
+ * Reads settings only: no catalog fetch. The Nicknames tab uses these rows
63
+ * the same way the Favorites tab uses `getFavoriteModelInfos`.
64
+ */
65
+ export declare function getNicknameModelInfos(settingsService: ISettingsService): ModelInfo[];
58
66
  export type NicknameValidation = {
59
67
  ok: true;
60
68
  nickname: string;
@@ -82,22 +90,50 @@ export declare function validateNicknameName(rawNickname: string, options?: {
82
90
  providerIds?: readonly string[];
83
91
  existingNicknames?: readonly string[];
84
92
  }): NicknameValidation;
93
+ /** The model that currently owns a nickname the user asked to reuse. */
94
+ export type NicknameConflict = {
95
+ nickname: string;
96
+ provider: string;
97
+ modelId: string;
98
+ };
85
99
  export type SetNicknameResult = {
86
100
  ok: true;
87
101
  } | {
88
102
  ok: false;
89
103
  error: string;
104
+ conflict?: NicknameConflict;
90
105
  };
91
106
  /**
92
107
  * Validates and persists one nickname -> target mapping. Rejected input
93
108
  * returns the reason and writes nothing, so an editor can keep the user in
94
109
  * place. Renaming (the target already mapped under another name) removes the
95
- * old key; re-pointing a name at a new target just overwrites it. Committing
96
- * an unchanged mapping writes nothing.
110
+ * old key. A name already used by a different model is not moved unless
111
+ * `replace` is set — the first attempt returns that model as `conflict` so
112
+ * the editor can ask. Committing an unchanged mapping writes nothing.
97
113
  */
98
114
  export declare function setNicknameTarget(settingsService: ISettingsService, rawNickname: string, target: ParsedNicknameTarget, options?: {
99
115
  providerIds?: readonly string[];
116
+ replace?: boolean;
100
117
  }): SetNicknameResult;
118
+ /** Removes all nickname aliases attached to one model. */
119
+ export declare function removeNicknameTarget(settingsService: ISettingsService, target: Pick<ParsedNicknameTarget, 'provider' | 'modelId'>): boolean;
120
+ /**
121
+ * Applies one Enter in the nickname editor. A pending replacement commits
122
+ * only while the text still matches that name; otherwise this is an ordinary
123
+ * save, and a collision comes back as a new pending replacement.
124
+ */
125
+ export declare function commitNicknameEdit(settingsService: ISettingsService, draft: {
126
+ text: string;
127
+ provider: string;
128
+ modelId: string;
129
+ pendingReplace?: NicknameConflict | null;
130
+ }, providerIds?: readonly string[]): {
131
+ saved: true;
132
+ } | {
133
+ saved: false;
134
+ error: string;
135
+ pendingReplace: NicknameConflict | null;
136
+ };
101
137
  /**
102
138
  * Exact, case-insensitive nickname lookup for the --model fast path.
103
139
  * `providerScope` (an explicit --provider or a provider prefix parsed from
@@ -1 +1 @@
1
- {"version":3,"file":"model-nicknames.d.ts","sourceRoot":"","sources":["../../../source/services/models/model-nicknames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAA8B,KAAK,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAEtG;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,4BAA4B,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,oBAAoB,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAKjF;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAG5E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAgBrF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxF;AAED,MAAM,MAAM,kBAAkB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GACvF,kBAAkB,CAwBpB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,gBAAgB,EACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAChD,iBAAiB,CAoCnB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,gBAAgB,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACvE,aAAa,GAAG,SAAS,CAY3B"}
1
+ {"version":3,"file":"model-nicknames.d.ts","sourceRoot":"","sources":["../../../source/services/models/model-nicknames.ts"],"names":[],"mappings":"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"}