@qduc/term2 0.2.0 → 0.3.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 (334) hide show
  1. package/dist/agent.lite-mode.test.d.ts +2 -0
  2. package/dist/agent.lite-mode.test.d.ts.map +1 -0
  3. package/dist/agent.lite-mode.test.js +39 -0
  4. package/dist/agent.lite-mode.test.js.map +1 -0
  5. package/dist/app.d.ts.map +1 -1
  6. package/dist/app.js +14 -6
  7. package/dist/app.js.map +1 -1
  8. package/dist/components/BottomArea.d.ts +3 -2
  9. package/dist/components/BottomArea.d.ts.map +1 -1
  10. package/dist/components/BottomArea.js.map +1 -1
  11. package/dist/components/Input/PopupManager.d.ts +1 -1
  12. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  13. package/dist/components/Input/PopupManager.js.map +1 -1
  14. package/dist/components/Input/determine-active-menu.d.ts +2 -1
  15. package/dist/components/Input/determine-active-menu.d.ts.map +1 -1
  16. package/dist/components/Input/determine-active-menu.js +41 -28
  17. package/dist/components/Input/determine-active-menu.js.map +1 -1
  18. package/dist/components/InputBox.d.ts +3 -2
  19. package/dist/components/InputBox.d.ts.map +1 -1
  20. package/dist/components/InputBox.js +46 -11
  21. package/dist/components/InputBox.js.map +1 -1
  22. package/dist/components/InputBox.menu-logic.test.js +55 -15
  23. package/dist/components/InputBox.menu-logic.test.js.map +1 -1
  24. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  25. package/dist/components/MarkdownRenderer.js +36 -24
  26. package/dist/components/MarkdownRenderer.js.map +1 -1
  27. package/dist/components/MessageList.test.js +14 -0
  28. package/dist/components/MessageList.test.js.map +1 -1
  29. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
  30. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
  31. package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
  32. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
  33. package/dist/components/SlashCommandMenu.d.ts +1 -6
  34. package/dist/components/SlashCommandMenu.d.ts.map +1 -1
  35. package/dist/components/SlashCommandMenu.js.map +1 -1
  36. package/dist/components/TextInput.d.ts +42 -0
  37. package/dist/components/TextInput.d.ts.map +1 -0
  38. package/dist/components/TextInput.js +398 -0
  39. package/dist/components/TextInput.js.map +1 -0
  40. package/dist/components/TextInput.test.d.ts +2 -0
  41. package/dist/components/TextInput.test.d.ts.map +1 -0
  42. package/dist/components/TextInput.test.js +75 -0
  43. package/dist/components/TextInput.test.js.map +1 -0
  44. package/dist/debug_ask_mentor.d.ts +2 -0
  45. package/dist/debug_ask_mentor.d.ts.map +1 -0
  46. package/dist/debug_ask_mentor.js +73 -0
  47. package/dist/debug_ask_mentor.js.map +1 -0
  48. package/dist/hooks/use-app-commands.d.ts +1 -1
  49. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  50. package/dist/hooks/use-app-commands.js +4 -0
  51. package/dist/hooks/use-app-commands.js.map +1 -1
  52. package/dist/hooks/use-conversation.d.ts +2 -1
  53. package/dist/hooks/use-conversation.d.ts.map +1 -1
  54. package/dist/hooks/use-conversation.js +6 -4
  55. package/dist/hooks/use-conversation.js.map +1 -1
  56. package/dist/hooks/use-slash-commands.d.ts +1 -1
  57. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  58. package/dist/hooks/use-trigger-detection.d.ts +3 -1
  59. package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
  60. package/dist/hooks/use-trigger-detection.js +3 -3
  61. package/dist/hooks/use-trigger-detection.js.map +1 -1
  62. package/dist/lib/openai-agent-client.d.ts +2 -1
  63. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  64. package/dist/lib/openai-agent-client.js +2 -4
  65. package/dist/lib/openai-agent-client.js.map +1 -1
  66. package/dist/lib/openai-agent-client.test.js +1 -1
  67. package/dist/lib/openai-agent-client.test.js.map +1 -1
  68. package/dist/lib/retry-executor.d.ts.map +1 -1
  69. package/dist/lib/retry-executor.js +1 -2
  70. package/dist/lib/retry-executor.js.map +1 -1
  71. package/dist/lib/retry-executor.test.js +1 -2
  72. package/dist/lib/retry-executor.test.js.map +1 -1
  73. package/dist/lib/shell.d.ts +7 -0
  74. package/dist/lib/shell.d.ts.map +1 -0
  75. package/dist/lib/shell.js +56 -0
  76. package/dist/lib/shell.js.map +1 -0
  77. package/dist/modes/companion/command-index.d.ts +26 -0
  78. package/dist/modes/companion/command-index.d.ts.map +1 -0
  79. package/dist/modes/companion/command-index.js +50 -0
  80. package/dist/modes/companion/command-index.js.map +1 -0
  81. package/dist/modes/companion/command-index.test.d.ts +2 -0
  82. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  83. package/dist/modes/companion/command-index.test.js +86 -0
  84. package/dist/modes/companion/command-index.test.js.map +1 -0
  85. package/dist/modes/companion/companion-app.d.ts +12 -0
  86. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  87. package/dist/modes/companion/companion-app.js +297 -0
  88. package/dist/modes/companion/companion-app.js.map +1 -0
  89. package/dist/modes/companion/companion-session.d.ts +63 -0
  90. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  91. package/dist/modes/companion/companion-session.js +146 -0
  92. package/dist/modes/companion/companion-session.js.map +1 -0
  93. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  94. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  95. package/dist/modes/companion/companion-session.test.js +28 -0
  96. package/dist/modes/companion/companion-session.test.js.map +1 -0
  97. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  98. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  99. package/dist/modes/companion/components/status-bar.js +26 -0
  100. package/dist/modes/companion/components/status-bar.js.map +1 -0
  101. package/dist/modes/companion/context-buffer.d.ts +65 -0
  102. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  103. package/dist/modes/companion/context-buffer.js +156 -0
  104. package/dist/modes/companion/context-buffer.js.map +1 -0
  105. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  106. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  107. package/dist/modes/companion/context-buffer.test.js +154 -0
  108. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  109. package/dist/modes/companion/event-detector.d.ts +46 -0
  110. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  111. package/dist/modes/companion/event-detector.js +169 -0
  112. package/dist/modes/companion/event-detector.js.map +1 -0
  113. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  114. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  115. package/dist/modes/companion/event-detector.test.js +121 -0
  116. package/dist/modes/companion/event-detector.test.js.map +1 -0
  117. package/dist/modes/companion/index.d.ts +33 -0
  118. package/dist/modes/companion/index.d.ts.map +1 -0
  119. package/dist/modes/companion/index.js +21 -0
  120. package/dist/modes/companion/index.js.map +1 -0
  121. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  122. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  123. package/dist/modes/companion/input-key-mapper.js +31 -0
  124. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  125. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  126. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  127. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  128. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  129. package/dist/modes/companion/input-parser.d.ts +53 -0
  130. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  131. package/dist/modes/companion/input-parser.js +114 -0
  132. package/dist/modes/companion/input-parser.js.map +1 -0
  133. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  134. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  135. package/dist/modes/companion/input-parser.test.js +123 -0
  136. package/dist/modes/companion/input-parser.test.js.map +1 -0
  137. package/dist/modes/companion/mode-manager.d.ts +41 -0
  138. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  139. package/dist/modes/companion/mode-manager.js +56 -0
  140. package/dist/modes/companion/mode-manager.js.map +1 -0
  141. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  142. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  143. package/dist/modes/companion/mode-manager.test.js +65 -0
  144. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  145. package/dist/modes/companion/output-classifier.d.ts +15 -0
  146. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  147. package/dist/modes/companion/output-classifier.js +77 -0
  148. package/dist/modes/companion/output-classifier.js.map +1 -0
  149. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  150. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  151. package/dist/modes/companion/output-classifier.test.js +133 -0
  152. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  153. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  154. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  155. package/dist/modes/companion/pty-wrapper.js +143 -0
  156. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  157. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  158. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  159. package/dist/modes/companion/safety-classifier.js +140 -0
  160. package/dist/modes/companion/safety-classifier.js.map +1 -0
  161. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  162. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  163. package/dist/modes/companion/safety-classifier.test.js +151 -0
  164. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  165. package/dist/modes/companion/summarizer.d.ts +24 -0
  166. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  167. package/dist/modes/companion/summarizer.js +132 -0
  168. package/dist/modes/companion/summarizer.js.map +1 -0
  169. package/dist/modes/companion/terminal-history.d.ts +27 -0
  170. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  171. package/dist/modes/companion/terminal-history.js +142 -0
  172. package/dist/modes/companion/terminal-history.js.map +1 -0
  173. package/dist/prompts/simple-mentor.md +215 -0
  174. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +24 -0
  175. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -0
  176. package/dist/providers/ai-sdk-openai-compatible.provider.js +26 -0
  177. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -0
  178. package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts +2 -0
  179. package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts.map +1 -0
  180. package/dist/providers/ai-sdk-openai-compatible.provider.test.js +68 -0
  181. package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -0
  182. package/dist/providers/common/openai-compatible-messages.d.ts +8 -0
  183. package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -0
  184. package/dist/providers/common/openai-compatible-messages.js +356 -0
  185. package/dist/providers/common/openai-compatible-messages.js.map +1 -0
  186. package/dist/providers/common/openai-compatible-messages.test.d.ts +2 -0
  187. package/dist/providers/common/openai-compatible-messages.test.d.ts.map +1 -0
  188. package/dist/providers/common/openai-compatible-messages.test.js +26 -0
  189. package/dist/providers/common/openai-compatible-messages.test.js.map +1 -0
  190. package/dist/providers/common/openai-compatible-utils.d.ts +11 -0
  191. package/dist/providers/common/openai-compatible-utils.d.ts.map +1 -0
  192. package/dist/providers/common/openai-compatible-utils.js +33 -0
  193. package/dist/providers/common/openai-compatible-utils.js.map +1 -0
  194. package/dist/providers/common/provider-errors.d.ts +13 -0
  195. package/dist/providers/common/provider-errors.d.ts.map +1 -0
  196. package/dist/providers/common/provider-errors.js +25 -0
  197. package/dist/providers/common/provider-errors.js.map +1 -0
  198. package/dist/providers/github-copilot/converters.d.ts +45 -0
  199. package/dist/providers/github-copilot/converters.d.ts.map +1 -0
  200. package/dist/providers/github-copilot/converters.js +118 -0
  201. package/dist/providers/github-copilot/converters.js.map +1 -0
  202. package/dist/providers/github-copilot/converters.test.d.ts +2 -0
  203. package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
  204. package/dist/providers/github-copilot/converters.test.js +162 -0
  205. package/dist/providers/github-copilot/converters.test.js.map +1 -0
  206. package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
  207. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
  208. package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
  209. package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
  210. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
  211. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
  212. package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
  213. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
  214. package/dist/providers/github-copilot/index.d.ts +4 -0
  215. package/dist/providers/github-copilot/index.d.ts.map +1 -0
  216. package/dist/providers/github-copilot/index.js +4 -0
  217. package/dist/providers/github-copilot/index.js.map +1 -0
  218. package/dist/providers/github-copilot/model.d.ts +24 -0
  219. package/dist/providers/github-copilot/model.d.ts.map +1 -0
  220. package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
  221. package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
  222. package/dist/providers/github-copilot/model.delta.test.js +15 -0
  223. package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
  224. package/dist/providers/github-copilot/model.js +498 -0
  225. package/dist/providers/github-copilot/model.js.map +1 -0
  226. package/dist/providers/github-copilot/model.test.d.ts +2 -0
  227. package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
  228. package/dist/providers/github-copilot/model.test.js +63 -0
  229. package/dist/providers/github-copilot/model.test.js.map +1 -0
  230. package/dist/providers/github-copilot/provider.d.ts +15 -0
  231. package/dist/providers/github-copilot/provider.d.ts.map +1 -0
  232. package/dist/providers/github-copilot/provider.js +25 -0
  233. package/dist/providers/github-copilot/provider.js.map +1 -0
  234. package/dist/providers/github-copilot/provider.test.d.ts +2 -0
  235. package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
  236. package/dist/providers/github-copilot/provider.test.js +52 -0
  237. package/dist/providers/github-copilot/provider.test.js.map +1 -0
  238. package/dist/providers/github-copilot/utils.d.ts +20 -0
  239. package/dist/providers/github-copilot/utils.d.ts.map +1 -0
  240. package/dist/providers/github-copilot/utils.js +142 -0
  241. package/dist/providers/github-copilot/utils.js.map +1 -0
  242. package/dist/providers/github-copilot/utils.test.d.ts +2 -0
  243. package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
  244. package/dist/providers/github-copilot/utils.test.js +21 -0
  245. package/dist/providers/github-copilot/utils.test.js.map +1 -0
  246. package/dist/providers/openai-compatible.provider.createRunner.test.d.ts +2 -0
  247. package/dist/providers/openai-compatible.provider.createRunner.test.d.ts.map +1 -0
  248. package/dist/providers/openai-compatible.provider.createRunner.test.js +39 -0
  249. package/dist/providers/openai-compatible.provider.createRunner.test.js.map +1 -0
  250. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  251. package/dist/providers/openai-compatible.provider.js +18 -8
  252. package/dist/providers/openai-compatible.provider.js.map +1 -1
  253. package/dist/providers/openrouter.d.ts +1 -1
  254. package/dist/providers/openrouter.d.ts.map +1 -1
  255. package/dist/providers/openrouter.js +1 -3
  256. package/dist/providers/openrouter.js.map +1 -1
  257. package/dist/providers/openrouter.provider.createRunner.test.js +28 -0
  258. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
  259. package/dist/providers/openrouter.provider.js +13 -5
  260. package/dist/providers/openrouter.provider.js.map +1 -1
  261. package/dist/safety-checker.js +57 -0
  262. package/dist/scripts/eval-auto-approval/dataset.d.ts +1 -1
  263. package/dist/services/check_mock.d.ts +2 -0
  264. package/dist/services/check_mock.d.ts.map +1 -0
  265. package/dist/services/check_mock.js +22 -0
  266. package/dist/services/check_mock.js.map +1 -0
  267. package/dist/services/conversation-service.test.d.ts +2 -0
  268. package/dist/services/conversation-service.test.d.ts.map +1 -0
  269. package/dist/services/conversation-service.test.js +156 -0
  270. package/dist/services/conversation-service.test.js.map +1 -0
  271. package/dist/services/conversation-session.d.ts +3 -2
  272. package/dist/services/conversation-session.d.ts.map +1 -1
  273. package/dist/services/conversation-session.js +12 -6
  274. package/dist/services/conversation-session.js.map +1 -1
  275. package/dist/services/conversation-store.d.ts +2 -0
  276. package/dist/services/conversation-store.d.ts.map +1 -1
  277. package/dist/services/conversation-store.js +27 -0
  278. package/dist/services/conversation-store.js.map +1 -1
  279. package/dist/services/conversation-store.test.js +34 -0
  280. package/dist/services/conversation-store.test.js.map +1 -1
  281. package/dist/services/logging-contract.d.ts +3 -3
  282. package/dist/services/logging-service.d.ts.map +1 -1
  283. package/dist/services/logging-service.js +5 -1
  284. package/dist/services/logging-service.js.map +1 -1
  285. package/dist/services/model-service.test.js +1 -5
  286. package/dist/services/model-service.test.js.map +1 -1
  287. package/dist/services/settings-schema.d.ts +12 -8
  288. package/dist/services/settings-schema.d.ts.map +1 -1
  289. package/dist/services/settings-schema.js +9 -0
  290. package/dist/services/settings-schema.js.map +1 -1
  291. package/dist/slash-commands.d.ts +20 -0
  292. package/dist/slash-commands.d.ts.map +1 -0
  293. package/dist/slash-commands.js +2 -0
  294. package/dist/slash-commands.js.map +1 -0
  295. package/dist/tools/bash.d.ts +10 -0
  296. package/dist/tools/bash.d.ts.map +1 -0
  297. package/dist/tools/bash.js +55 -0
  298. package/dist/tools/bash.js.map +1 -0
  299. package/dist/types/user-turn.d.ts +16 -0
  300. package/dist/types/user-turn.d.ts.map +1 -0
  301. package/dist/types/user-turn.js +27 -0
  302. package/dist/types/user-turn.js.map +1 -0
  303. package/dist/types/user-turn.test.d.ts +2 -0
  304. package/dist/types/user-turn.test.d.ts.map +1 -0
  305. package/dist/types/user-turn.test.js +32 -0
  306. package/dist/types/user-turn.test.js.map +1 -0
  307. package/dist/utils/command-safety.d.ts +21 -0
  308. package/dist/utils/command-safety.d.ts.map +1 -0
  309. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  310. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  311. package/dist/utils/command-safety.devnull.test.js +13 -0
  312. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  313. package/dist/utils/command-safety.js +348 -0
  314. package/dist/utils/command-safety.js.map +1 -0
  315. package/dist/utils/extract-command-messages.test.d.ts +2 -0
  316. package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
  317. package/dist/utils/extract-command-messages.test.js +64 -0
  318. package/dist/utils/extract-command-messages.test.js.map +1 -0
  319. package/dist/utils/log-truncation.d.ts +7 -0
  320. package/dist/utils/log-truncation.d.ts.map +1 -0
  321. package/dist/utils/log-truncation.js +66 -0
  322. package/dist/utils/log-truncation.js.map +1 -0
  323. package/dist/utils/log-truncation.test.d.ts +2 -0
  324. package/dist/utils/log-truncation.test.d.ts.map +1 -0
  325. package/dist/utils/log-truncation.test.js +44 -0
  326. package/dist/utils/log-truncation.test.js.map +1 -0
  327. package/dist/utils/provider-traffic-extractor.repro.test.d.ts +2 -0
  328. package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +1 -0
  329. package/dist/utils/provider-traffic-extractor.repro.test.js.map +1 -0
  330. package/dist/utils/settings-command.d.ts +1 -1
  331. package/dist/utils/settings-command.d.ts.map +1 -1
  332. package/dist/utils/settings-command.js +2 -0
  333. package/dist/utils/settings-command.js.map +1 -1
  334. package/package.json +5 -2
@@ -0,0 +1,498 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { CopilotClient } from '@github/copilot-sdk';
5
+ // Load simple.md system prompt (same as other providers)
6
+ const SIMPLE_PROMPT_PATH = path.join(import.meta.dirname, '../../prompts/simple.md');
7
+ const SIMPLE_PROMPT = fs.readFileSync(SIMPLE_PROMPT_PATH, 'utf-8').trim();
8
+ import { buildMessagesFromRequest, extractFunctionToolsFromRequest, normalizeUsage, } from './converters.js';
9
+ // Global map to store pending tool resolutions: SessionID -> CallID -> ResolveFunction
10
+ // This allows us to "detach" the tool execution from the SDK's internal loop
11
+ // and hand it over to the Agent Runner, then resume it later.
12
+ const pendingResolutions = new Map();
13
+ // Singleton client - SDK manages CLI process lifecycle
14
+ export let sharedClient = null;
15
+ export async function getClient() {
16
+ if (!sharedClient) {
17
+ sharedClient = new CopilotClient();
18
+ await sharedClient.start();
19
+ }
20
+ return sharedClient;
21
+ }
22
+ export function extractCopilotTextDelta(accumulated, incoming) {
23
+ if (!incoming)
24
+ return '';
25
+ if (!accumulated)
26
+ return incoming;
27
+ // 1. If incoming starts with accumulated, it's definitely an accumulation
28
+ if (incoming.startsWith(accumulated)) {
29
+ return incoming.slice(accumulated.length);
30
+ }
31
+ // 2. Check for overlap: find the longest suffix of 'accumulated' that is a prefix of 'incoming'
32
+ // We only check up to a reasonable length to avoid O(N^2) on very long outputs,
33
+ // though usually deltas are small.
34
+ const maxOverlap = Math.min(accumulated.length, incoming.length);
35
+ for (let len = maxOverlap; len > 0; len--) {
36
+ const suffix = accumulated.slice(-len);
37
+ const prefix = incoming.slice(0, len);
38
+ if (suffix === prefix) {
39
+ return incoming.slice(len);
40
+ }
41
+ }
42
+ // 3. No overlap found, treat as a pure delta
43
+ return incoming;
44
+ }
45
+ /**
46
+ * Force stop the shared client (for cleanup/error recovery)
47
+ */
48
+ export async function forceStopClient() {
49
+ if (sharedClient) {
50
+ try {
51
+ await sharedClient.forceStop();
52
+ }
53
+ catch {
54
+ // Ignore errors during cleanup
55
+ }
56
+ sharedClient = null;
57
+ }
58
+ }
59
+ export class GitHubCopilotModel {
60
+ name;
61
+ #modelId;
62
+ #settingsService;
63
+ #loggingService;
64
+ #sessionMap;
65
+ #activeSessions;
66
+ constructor(deps) {
67
+ this.name = 'GitHubCopilot';
68
+ this.#settingsService = deps.settingsService;
69
+ this.#loggingService = deps.loggingService;
70
+ this.#sessionMap = deps.sessionMap || new Map();
71
+ this.#activeSessions = deps.activeSessions || new Map();
72
+ this.#modelId =
73
+ deps.modelId ||
74
+ this.#settingsService.get('agent.github-copilot.model') ||
75
+ this.#settingsService.get('agent.model') ||
76
+ 'gpt-4o';
77
+ }
78
+ async getResponse(request) {
79
+ // For non-streaming requests, collect all events and build response
80
+ const events = [];
81
+ for await (const event of this.getStreamedResponse(request)) {
82
+ events.push(event);
83
+ }
84
+ // Find the response_done event
85
+ const doneEvent = events.find((e) => e.type === 'response_done');
86
+ if (doneEvent?.response) {
87
+ return {
88
+ responseId: doneEvent.response.id || randomUUID(),
89
+ output: doneEvent.response.output || [],
90
+ usage: normalizeUsage(doneEvent.response.usage),
91
+ };
92
+ }
93
+ // Fallback: build response from accumulated events
94
+ const textDeltas = events
95
+ .filter((e) => e.type === 'output_text_delta')
96
+ .map((e) => e.delta)
97
+ .join('');
98
+ return {
99
+ responseId: randomUUID(),
100
+ output: textDeltas ? [{
101
+ type: 'message',
102
+ role: 'assistant',
103
+ status: 'completed',
104
+ content: [{ type: 'output_text', text: textDeltas }],
105
+ }] : [],
106
+ usage: normalizeUsage({}),
107
+ };
108
+ }
109
+ async *getStreamedResponse(request) {
110
+ const client = await getClient();
111
+ const resolvedModelId = this.#resolveModelFromRequest(request) || this.#modelId;
112
+ const messages = buildMessagesFromRequest(request, resolvedModelId, this.#loggingService);
113
+ this.#loggingService.debug('GitHubCopilot stream start', {
114
+ messageCount: messages.length,
115
+ modelId: resolvedModelId,
116
+ previousResponseId: request.previousResponseId,
117
+ });
118
+ const tools = extractFunctionToolsFromRequest(request);
119
+ // Wrap tools with the "Trap" handler that suspends execution
120
+ const copilotTools = tools.map((t) => ({
121
+ name: t.function.name,
122
+ description: t.function.description,
123
+ parameters: t.function.parameters,
124
+ handler: async (_args, invocation) => {
125
+ this.#loggingService.debug('Copilot tool trap activated', {
126
+ tool: invocation.toolName,
127
+ callId: invocation.toolCallId,
128
+ });
129
+ return new Promise((resolve) => {
130
+ if (!pendingResolutions.has(invocation.sessionId)) {
131
+ pendingResolutions.set(invocation.sessionId, new Map());
132
+ }
133
+ pendingResolutions.get(invocation.sessionId).set(invocation.toolCallId, resolve);
134
+ });
135
+ },
136
+ }));
137
+ let session;
138
+ try {
139
+ // Check if we can resume a previous session
140
+ const prevSessionId = request.previousResponseId
141
+ ? this.#sessionMap.get(request.previousResponseId)
142
+ : undefined;
143
+ // First, try to get a cached session object
144
+ const cachedSession = prevSessionId
145
+ ? this.#activeSessions.get(prevSessionId)
146
+ : undefined;
147
+ if (cachedSession) {
148
+ // Reuse the cached session - just update tool handlers with fresh callbacks
149
+ this.#loggingService.debug('Reusing cached GitHubCopilot session', {
150
+ sessionId: prevSessionId,
151
+ });
152
+ session = cachedSession;
153
+ // Re-register tools to get fresh Promise callbacks for this turn
154
+ session.registerTools(copilotTools);
155
+ }
156
+ else if (prevSessionId) {
157
+ // Session ID exists but no cached object - need to resume from server
158
+ this.#loggingService.debug('Resuming GitHubCopilot session from server', {
159
+ sessionId: prevSessionId,
160
+ });
161
+ session = await client.resumeSession(prevSessionId, {
162
+ streaming: true,
163
+ tools: copilotTools,
164
+ });
165
+ // Cache the resumed session for future turns
166
+ this.#activeSessions.set(session.sessionId, session);
167
+ }
168
+ else {
169
+ // No previous session - create a new one
170
+ this.#loggingService.debug('Creating new GitHubCopilot session');
171
+ session = await client.createSession({
172
+ model: resolvedModelId,
173
+ streaming: true,
174
+ tools: copilotTools,
175
+ availableTools: copilotTools.map((t) => t.name),
176
+ systemMessage: {
177
+ mode: 'replace',
178
+ content: SIMPLE_PROMPT,
179
+ },
180
+ });
181
+ // Cache the new session for future turns
182
+ this.#activeSessions.set(session.sessionId, session);
183
+ }
184
+ }
185
+ catch (err) {
186
+ this.#loggingService.error('GitHubCopilot session creation/resumption failed', {
187
+ error: err.message,
188
+ });
189
+ // Emit error as a model event since ResponseStreamEvent doesn't have error type
190
+ yield {
191
+ type: 'model',
192
+ event: { type: 'error', message: `Failed to create/resume Copilot session: ${err.message}` },
193
+ };
194
+ return;
195
+ }
196
+ const state = {
197
+ accumulated: '',
198
+ accumulatedReasoningText: '',
199
+ accumulatedToolCalls: [],
200
+ responseId: randomUUID(),
201
+ usageData: null,
202
+ };
203
+ // Track new sessionId for future resumption
204
+ this.#sessionMap.set(state.responseId, session.sessionId);
205
+ // Set up event handlers and collect events via async iteration
206
+ const eventQueue = [];
207
+ let resolveNext = null;
208
+ let done = false;
209
+ let error = null;
210
+ const pushEvent = (event) => {
211
+ if (resolveNext) {
212
+ resolveNext({ value: event, done: false });
213
+ resolveNext = null;
214
+ }
215
+ else {
216
+ eventQueue.push(event);
217
+ }
218
+ };
219
+ // Track unsubscribe function for cleanup
220
+ let unsubscribeEvents = null;
221
+ const finish = (err) => {
222
+ done = true;
223
+ error = err || null;
224
+ // Unsubscribe from events to prevent handler accumulation
225
+ if (unsubscribeEvents) {
226
+ unsubscribeEvents();
227
+ unsubscribeEvents = null;
228
+ }
229
+ // If there was an error, remove session from cache so a fresh one is created next time
230
+ if (err && session) {
231
+ this.#activeSessions.delete(session.sessionId);
232
+ }
233
+ if (resolveNext) {
234
+ if (err) {
235
+ resolveNext = null;
236
+ throw err;
237
+ }
238
+ resolveNext({ value: undefined, done: true });
239
+ resolveNext = null;
240
+ }
241
+ };
242
+ // Register event handlers on the session (returns unsubscribe function)
243
+ unsubscribeEvents = session.on((event) => {
244
+ try {
245
+ switch (event.type) {
246
+ case 'assistant.message_delta':
247
+ // Streaming text chunk
248
+ if (event.data?.deltaContent) {
249
+ const delta = extractCopilotTextDelta(state.accumulated, event.data.deltaContent);
250
+ if (delta) {
251
+ state.accumulated += delta;
252
+ pushEvent({
253
+ type: 'output_text_delta',
254
+ delta,
255
+ });
256
+ }
257
+ }
258
+ break;
259
+ case 'assistant.reasoning_delta':
260
+ // Streaming reasoning (O1/O3 models)
261
+ if (event.data?.deltaContent) {
262
+ state.accumulatedReasoningText += event.data.deltaContent;
263
+ // Emit as model event for reasoning channel
264
+ pushEvent({
265
+ type: 'model',
266
+ event: {
267
+ type: 'reasoning_delta',
268
+ content: event.data.deltaContent,
269
+ },
270
+ });
271
+ }
272
+ break;
273
+ case 'tool.execution_start':
274
+ // Tool call requested
275
+ if (event.data) {
276
+ const toolCall = {
277
+ type: 'function_call',
278
+ callId: event.data.callId || randomUUID(),
279
+ name: event.data.toolName,
280
+ arguments: typeof event.data.args === 'string'
281
+ ? event.data.args
282
+ : JSON.stringify(event.data.args || {}),
283
+ };
284
+ state.accumulatedToolCalls.push(toolCall);
285
+ // Check if this is a user tool that requires external handling
286
+ // We look it up in our 'copilotTools' list
287
+ const isUserTool = copilotTools.some((t) => t.name === event.data.toolName);
288
+ if (isUserTool) {
289
+ this.#loggingService.debug('Detaching stream for user tool execution', {
290
+ tool: event.data.toolName,
291
+ callId: toolCall.callId,
292
+ });
293
+ // Yield the function call event to the Runner (streaming)
294
+ pushEvent({
295
+ type: 'model',
296
+ event: {
297
+ type: 'function_call',
298
+ callId: toolCall.callId,
299
+ name: toolCall.name,
300
+ arguments: toolCall.arguments,
301
+ }
302
+ });
303
+ // IMPORTANT: Emit response_done so the Runner captures the responseId.
304
+ // This allows the next turn to pass 'previousResponseId' correctly,
305
+ // which we need to look up the session and resume the suspended tool.
306
+ const output = this.#buildStreamOutput(state);
307
+ pushEvent({
308
+ type: 'response_done',
309
+ response: {
310
+ id: state.responseId,
311
+ usage: normalizeUsage(state.usageData),
312
+ output,
313
+ },
314
+ });
315
+ // SIGNAL COMPLETION OF THIS STREAM SEGMENT
316
+ finish();
317
+ return; // Stop processing further events in this loop
318
+ }
319
+ // If it's an internal tool (like report_intent), we just let it run
320
+ // The SDK will call the internal handler, get the result, and continue streaming
321
+ // We don't emit anything to the Runner yet.
322
+ }
323
+ break;
324
+ case 'session.usage':
325
+ // Usage data
326
+ if (event.data) {
327
+ state.usageData = event.data;
328
+ }
329
+ break;
330
+ case 'session.idle':
331
+ // Session complete - emit response_done
332
+ this.#loggingService.debug('GitHubCopilot stream done', {
333
+ text: state.accumulated,
334
+ toolCalls: state.accumulatedToolCalls.length,
335
+ });
336
+ const output = this.#buildStreamOutput(state);
337
+ pushEvent({
338
+ type: 'response_done',
339
+ response: {
340
+ id: state.responseId,
341
+ usage: normalizeUsage(state.usageData),
342
+ output,
343
+ },
344
+ });
345
+ finish();
346
+ break;
347
+ case 'session.error':
348
+ // Handle errors
349
+ this.#loggingService.error('GitHubCopilot session error', {
350
+ error: event.data?.message,
351
+ });
352
+ // Emit error as a model event since ResponseStreamEvent doesn't have error type
353
+ pushEvent({
354
+ type: 'model',
355
+ event: { type: 'error', message: event.data?.message || 'Unknown error' },
356
+ });
357
+ finish(new Error(event.data?.message || 'Session error'));
358
+ break;
359
+ }
360
+ }
361
+ catch (err) {
362
+ this.#loggingService.error('GitHubCopilot event processing error', {
363
+ error: err.message,
364
+ eventType: event.type,
365
+ });
366
+ }
367
+ });
368
+ // Send the messages to start the conversation
369
+ // Check if we are in "Resume/Tool Output" mode
370
+ const sessionResolutions = pendingResolutions.get(session.sessionId);
371
+ let isResumingTool = false;
372
+ if (sessionResolutions && sessionResolutions.size > 0) {
373
+ // Look for tool outputs in the request input that match pending traps
374
+ // The Runner appends the output to the history
375
+ if (request.input && Array.isArray(request.input)) {
376
+ for (const item of request.input) {
377
+ // Check for function_call_output type (mapped from SDK)
378
+ if (item.type === 'function_call_output' &&
379
+ item.callId &&
380
+ sessionResolutions.has(item.callId)) {
381
+ const callId = item.callId;
382
+ const output = item.output;
383
+ this.#loggingService.debug('Resolving suspended tool call', {
384
+ callId,
385
+ outputLength: output?.length,
386
+ });
387
+ const resolve = sessionResolutions.get(callId);
388
+ resolve(output); // UNBLOCK the SDK handler!
389
+ sessionResolutions.delete(callId);
390
+ isResumingTool = true;
391
+ }
392
+ }
393
+ }
394
+ }
395
+ // Only send a new prompt if we are NOT resuming a tool call
396
+ if (!isResumingTool) {
397
+ try {
398
+ // Build the prompt from the last user message
399
+ const lastUserMessage = messages.filter(m => m.role === 'user').pop();
400
+ const prompt = lastUserMessage?.content || '';
401
+ if (prompt) {
402
+ await session.send({
403
+ prompt,
404
+ });
405
+ }
406
+ else {
407
+ // If no prompt and no tool resume, we might assume it's just a continue?
408
+ // Or maybe we should send an empty space to trigger generation?
409
+ // For now, assume if prompt is empty it might be an issue, but let's try sending it.
410
+ // Actually Copilot SDK might error on empty prompt.
411
+ }
412
+ }
413
+ catch (err) {
414
+ this.#loggingService.error('GitHubCopilot send failed', {
415
+ error: err.message,
416
+ });
417
+ yield {
418
+ type: 'model',
419
+ event: { type: 'error', message: `Failed to send message: ${err.message}` },
420
+ };
421
+ try {
422
+ await session.abort();
423
+ }
424
+ catch {
425
+ // Ignore abort errors
426
+ }
427
+ // Clean up event handler before returning
428
+ if (unsubscribeEvents) {
429
+ unsubscribeEvents();
430
+ unsubscribeEvents = null;
431
+ }
432
+ // Remove session from cache on error
433
+ this.#activeSessions.delete(session.sessionId);
434
+ return;
435
+ }
436
+ }
437
+ // If isResumingTool is true, we simply let the event loop below capture the continuation events!
438
+ // Yield events as they come in
439
+ while (!done || eventQueue.length > 0) {
440
+ if (eventQueue.length > 0) {
441
+ yield eventQueue.shift();
442
+ }
443
+ else if (!done) {
444
+ // Wait for next event
445
+ yield await new Promise((resolve) => {
446
+ resolveNext = (result) => {
447
+ if (result.done) {
448
+ // Signal completion
449
+ resolve({ type: 'model', event: '[DONE]' });
450
+ }
451
+ else {
452
+ resolve(result.value);
453
+ }
454
+ };
455
+ });
456
+ }
457
+ }
458
+ if (error) {
459
+ throw error;
460
+ }
461
+ }
462
+ #buildStreamOutput(state) {
463
+ const output = [];
464
+ // Add assistant message if there's text content
465
+ if (state.accumulated) {
466
+ output.push({
467
+ type: 'message',
468
+ role: 'assistant',
469
+ status: 'completed',
470
+ content: [{ type: 'output_text', text: state.accumulated }],
471
+ ...(state.accumulatedReasoningText
472
+ ? { reasoning: state.accumulatedReasoningText }
473
+ : {}),
474
+ });
475
+ }
476
+ // Add tool calls as separate output items
477
+ for (const toolCall of state.accumulatedToolCalls) {
478
+ output.push({
479
+ type: 'function_call',
480
+ callId: toolCall.callId,
481
+ name: toolCall.name,
482
+ arguments: toolCall.arguments,
483
+ status: 'completed',
484
+ ...(state.accumulatedReasoningText
485
+ ? { reasoning: state.accumulatedReasoningText }
486
+ : {}),
487
+ });
488
+ }
489
+ return output;
490
+ }
491
+ #resolveModelFromRequest(req) {
492
+ if (req?.providerData?.model) {
493
+ return req.providerData.model;
494
+ }
495
+ return undefined;
496
+ }
497
+ }
498
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/model.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AAEzE,yDAAyD;AACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;AACrF,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAK1E,OAAO,EACH,wBAAwB,EACxB,+BAA+B,EAC/B,cAAc,GACjB,MAAM,iBAAiB,CAAC;AAEzB,uFAAuF;AACvF,6EAA6E;AAC7E,8DAA8D;AAC9D,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA8C,CAAC;AAEjF,uDAAuD;AACvD,MAAM,CAAC,IAAI,YAAY,GAAyB,IAAI,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,YAAY,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,WAAmB,EAAE,QAAgB;IACzE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW;QAAE,OAAO,QAAQ,CAAC;IAElC,0EAA0E;IAC1E,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,gGAAgG;IAChG,gFAAgF;IAChF,mCAAmC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjE,KAAK,IAAI,GAAG,GAAG,UAAU,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACjC,IAAI,YAAY,EAAE,CAAC;QACf,IAAI,CAAC;YACD,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACL,+BAA+B;QACnC,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;IACxB,CAAC;AACL,CAAC;AAED,MAAM,OAAO,kBAAkB;IAC3B,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,gBAAgB,CAAmB;IACnC,eAAe,CAAkB;IACjC,WAAW,CAAsB;IACjC,eAAe,CAA8B;IAE7C,YAAY,IAMX;QACG,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,GAAG,EAAE,CAAC;QACxD,IAAI,CAAC,QAAQ;YACT,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,4BAA4B,CAAC;gBACvD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC;gBACxC,QAAQ,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAqB;QACnC,oEAAoE;QACpE,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,+BAA+B;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAQ,CAAC;QAE7E,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC;YACtB,OAAO;gBACH,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,UAAU,EAAE;gBACjD,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE;gBACvC,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAQ;aACzD,CAAC;QACN,CAAC;QAED,mDAAmD;QACnD,MAAM,UAAU,GAAG,MAAM;aACpB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC;aAClD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aACxB,IAAI,CAAC,EAAE,CAAC,CAAC;QAEd,OAAO;YACH,UAAU,EAAE,UAAU,EAAE;YACxB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;oBAClB,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;iBACvD,CAAC,CAAC,CAAC,CAAC,EAAE;YACP,KAAK,EAAE,cAAc,CAAC,EAAE,CAAQ;SACnC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,CAAC,mBAAmB,CACtB,OAAqB;QAErB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;QAChF,MAAM,QAAQ,GAAG,wBAAwB,CACrC,OAAO,EACP,eAAe,EACf,IAAI,CAAC,eAAe,CACvB,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,4BAA4B,EAAE;YACrD,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,OAAO,EAAE,eAAe;YACxB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SACjD,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;QACvD,6DAA6D;QAC7D,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI;YACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW;YACnC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU;YACjC,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,UAAe,EAAE,EAAE;gBAC3C,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,6BAA6B,EAAE;oBACtD,IAAI,EAAE,UAAU,CAAC,QAAQ;oBACzB,MAAM,EAAE,UAAU,CAAC,UAAU;iBAChC,CAAC,CAAC;gBACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC3B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAChD,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;oBAC5D,CAAC;oBACD,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACtF,CAAC,CAAC,CAAC;YACP,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,IAAI,OAAuB,CAAC;QAC5B,IAAI,CAAC;YACD,4CAA4C;YAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,kBAAkB;gBAC5C,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC;gBAClD,CAAC,CAAC,SAAS,CAAC;YAEhB,4CAA4C;YAC5C,MAAM,aAAa,GAAG,aAAa;gBAC/B,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC;gBACzC,CAAC,CAAC,SAAS,CAAC;YAEhB,IAAI,aAAa,EAAE,CAAC;gBAChB,4EAA4E;gBAC5E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,sCAAsC,EAAE;oBAC/D,SAAS,EAAE,aAAa;iBAC3B,CAAC,CAAC;gBACH,OAAO,GAAG,aAAa,CAAC;gBACxB,iEAAiE;gBAChE,OAAe,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,aAAa,EAAE,CAAC;gBACvB,sEAAsE;gBACtE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,4CAA4C,EAAE;oBACrE,SAAS,EAAE,aAAa;iBAC3B,CAAC,CAAC;gBACH,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,EAAE;oBAChD,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,YAAY;iBACtB,CAAC,CAAC;gBACH,6CAA6C;gBAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACJ,yCAAyC;gBACzC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACjE,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;oBACjC,KAAK,EAAE,eAAe;oBACtB,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,YAAY;oBACnB,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;oBACpD,aAAa,EAAE;wBACX,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,aAAa;qBACzB;iBACJ,CAAC,CAAC;gBACH,yCAAyC;gBACzC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,kDAAkD,EAAE;gBAC3E,KAAK,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,gFAAgF;YAChF,MAAM;gBACF,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,4CAA4C,GAAG,CAAC,OAAO,EAAE,EAAE;aACxE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,MAAM,KAAK,GAAG;YACV,WAAW,EAAE,EAAE;YACf,wBAAwB,EAAE,EAAE;YAC5B,oBAAoB,EAAE,EAAW;YACjC,UAAU,EAAE,UAAU,EAAE;YACxB,SAAS,EAAE,IAAW;SACzB,CAAC;QAEF,4CAA4C;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAE1D,+DAA+D;QAC/D,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,IAAI,WAAW,GAAkE,IAAI,CAAC;QACtF,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,KAAK,GAAiB,IAAI,CAAC;QAE/B,MAAM,SAAS,GAAG,CAAC,KAA0B,EAAE,EAAE;YAC7C,IAAI,WAAW,EAAE,CAAC;gBACd,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC3C,WAAW,GAAG,IAAI,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACJ,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC,CAAC;QAEF,yCAAyC;QACzC,IAAI,iBAAiB,GAAwB,IAAI,CAAC;QAElD,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE;YAC3B,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC;YACpB,0DAA0D;YAC1D,IAAI,iBAAiB,EAAE,CAAC;gBACpB,iBAAiB,EAAE,CAAC;gBACpB,iBAAiB,GAAG,IAAI,CAAC;YAC7B,CAAC;YACD,uFAAuF;YACvF,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBACd,IAAI,GAAG,EAAE,CAAC;oBACN,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM,GAAG,CAAC;gBACd,CAAC;gBACD,WAAW,CAAC,EAAE,KAAK,EAAE,SAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,WAAW,GAAG,IAAI,CAAC;YACvB,CAAC;QACL,CAAC,CAAC;QAEF,wEAAwE;QACxE,iBAAiB,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE;YAC1C,IAAI,CAAC;gBACD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACjB,KAAK,yBAAyB;wBAC1B,uBAAuB;wBACvB,IAAI,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;4BAC3B,MAAM,KAAK,GAAG,uBAAuB,CACjC,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,IAAI,CAAC,YAAY,CAC1B,CAAC;4BAEF,IAAI,KAAK,EAAE,CAAC;gCACR,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC;gCAC3B,SAAS,CAAC;oCACN,IAAI,EAAE,mBAAmB;oCACzB,KAAK;iCACe,CAAC,CAAC;4BAC9B,CAAC;wBACL,CAAC;wBACD,MAAM;oBAEV,KAAK,2BAA2B;wBAC5B,qCAAqC;wBACrC,IAAI,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;4BAC3B,KAAK,CAAC,wBAAwB,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;4BAC1D,4CAA4C;4BAC5C,SAAS,CAAC;gCACN,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE;oCACH,IAAI,EAAE,iBAAiB;oCACvB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY;iCACnC;6BACmB,CAAC,CAAC;wBAC9B,CAAC;wBACD,MAAM;oBAEV,KAAK,sBAAsB;wBACvB,sBAAsB;wBACtB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;4BACb,MAAM,QAAQ,GAAG;gCACb,IAAI,EAAE,eAAe;gCACrB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE;gCACzC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gCACzB,SAAS,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;oCAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI;oCACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;6BAC9C,CAAC;4BACF,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;4BAG1C,+DAA+D;4BAC/D,2CAA2C;4BAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;4BAEjF,IAAI,UAAU,EAAE,CAAC;gCACb,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,0CAA0C,EAAE;oCACnE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;oCACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;iCAC1B,CAAC,CAAC;gCAEH,0DAA0D;gCAC1D,SAAS,CAAC;oCACN,IAAI,EAAE,OAAO;oCACb,KAAK,EAAE;wCACH,IAAI,EAAE,eAAe;wCACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;wCACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;wCACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;qCAChC;iCACmB,CAAC,CAAC;gCAE1B,uEAAuE;gCACvE,oEAAoE;gCACpE,sEAAsE;gCACtE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gCAC9C,SAAS,CAAC;oCACN,IAAI,EAAE,eAAe;oCACrB,QAAQ,EAAE;wCACN,EAAE,EAAE,KAAK,CAAC,UAAU;wCACpB,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC;wCACtC,MAAM;qCACT;iCACmB,CAAC,CAAC;gCAE1B,2CAA2C;gCAC3C,MAAM,EAAE,CAAC;gCACT,OAAO,CAAC,8CAA8C;4BAC1D,CAAC;4BAED,oEAAoE;4BACpE,iFAAiF;4BACjF,4CAA4C;wBAChD,CAAC;wBACD,MAAM;oBAEV,KAAK,eAAe;wBAChB,aAAa;wBACb,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;4BACb,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;wBACjC,CAAC;wBACD,MAAM;oBAEV,KAAK,cAAc;wBACf,wCAAwC;wBACxC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,2BAA2B,EAAE;4BACpD,IAAI,EAAE,KAAK,CAAC,WAAW;4BACvB,SAAS,EAAE,KAAK,CAAC,oBAAoB,CAAC,MAAM;yBAC/C,CAAC,CAAC;wBAEH,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;wBAC9C,SAAS,CAAC;4BACN,IAAI,EAAE,eAAe;4BACrB,QAAQ,EAAE;gCACN,EAAE,EAAE,KAAK,CAAC,UAAU;gCACpB,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC;gCACtC,MAAM;6BACT;yBACmB,CAAC,CAAC;wBAE1B,MAAM,EAAE,CAAC;wBACT,MAAM;oBAEV,KAAK,eAAe;wBAChB,gBAAgB;wBAChB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,6BAA6B,EAAE;4BACtD,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO;yBAC7B,CAAC,CAAC;wBACH,gFAAgF;wBAChF,SAAS,CAAC;4BACN,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,eAAe,EAAE;yBACrD,CAAC,CAAC;wBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,eAAe,CAAC,CAAC,CAAC;wBAC1D,MAAM;gBACd,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,sCAAsC,EAAE;oBAC/D,KAAK,EAAE,GAAG,CAAC,OAAO;oBAClB,SAAS,EAAE,KAAK,CAAC,IAAI;iBACxB,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,8CAA8C;QAC9C,+CAA+C;QAC/C,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpD,sEAAsE;YACtE,+CAA+C;YAC/C,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC/B,wDAAwD;oBACxD,IACK,IAAY,CAAC,IAAI,KAAK,sBAAsB;wBAC5C,IAAY,CAAC,MAAM;wBACpB,kBAAkB,CAAC,GAAG,CAAE,IAAY,CAAC,MAAM,CAAC,EAC9C,CAAC;wBACC,MAAM,MAAM,GAAI,IAAY,CAAC,MAAM,CAAC;wBACpC,MAAM,MAAM,GAAI,IAAY,CAAC,MAAM,CAAC;wBAEpC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,+BAA+B,EAAE;4BACxD,MAAM;4BACN,YAAY,EAAE,MAAM,EAAE,MAAM;yBAC/B,CAAC,CAAC;wBAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;wBAChD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B;wBAC5C,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBAClC,cAAc,GAAG,IAAI,CAAC;oBAC1B,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,IAAI,CAAC;gBACD,8CAA8C;gBAC9C,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;gBACtE,MAAM,MAAM,GAAG,eAAe,EAAE,OAAO,IAAI,EAAE,CAAC;gBAE9C,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,OAAO,CAAC,IAAI,CAAC;wBACf,MAAM;qBACT,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,yEAAyE;oBACzE,gEAAgE;oBAChE,qFAAqF;oBACrF,oDAAoD;gBACxD,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,2BAA2B,EAAE;oBACpD,KAAK,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;gBACH,MAAM;oBACF,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE,EAAE;iBACvD,CAAC;gBAEzB,IAAI,CAAC;oBACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACL,sBAAsB;gBAC1B,CAAC;gBACD,0CAA0C;gBAC1C,IAAI,iBAAiB,EAAE,CAAC;oBACpB,iBAAiB,EAAE,CAAC;oBACpB,iBAAiB,GAAG,IAAI,CAAC;gBAC7B,CAAC;gBACD,qCAAqC;gBACrC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC/C,OAAO;YACX,CAAC;QACL,CAAC;QACD,iGAAiG;QAEjG,+BAA+B;QAC/B,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,UAAU,CAAC,KAAK,EAAG,CAAC;YAC9B,CAAC;iBAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,sBAAsB;gBACtB,MAAM,MAAM,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,EAAE;oBACrD,WAAW,GAAG,CAAC,MAAM,EAAE,EAAE;wBACrB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BACd,oBAAoB;4BACpB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAyB,CAAC,CAAC;wBACvE,CAAC;6BAAM,CAAC;4BACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC1B,CAAC;oBACL,CAAC,CAAC;gBACN,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,KAIlB;QACG,MAAM,MAAM,GAAU,EAAE,CAAC;QAEzB,gDAAgD;QAChD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC3D,GAAG,CAAC,KAAK,CAAC,wBAAwB;oBAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,wBAAwB,EAAE;oBAC/C,CAAC,CAAC,EAAE,CAAC;aACZ,CAAC,CAAC;QACP,CAAC;QAED,0CAA0C;QAC1C,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,MAAM,EAAE,WAAW;gBACnB,GAAG,CAAC,KAAK,CAAC,wBAAwB;oBAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,wBAAwB,EAAE;oBAC/C,CAAC,CAAC,EAAE,CAAC;aACZ,CAAC,CAAC;QACP,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,wBAAwB,CAAC,GAAiB;QACtC,IAAK,GAAW,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;YACpC,OAAQ,GAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QAC3C,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.test.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/model.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import test from 'ava';
2
+ import { extractCopilotTextDelta } from './model.js';
3
+ test('extractCopilotTextDelta - pure deltas', t => {
4
+ let accumulated = '';
5
+ let delta = extractCopilotTextDelta(accumulated, 'Hello');
6
+ t.is(delta, 'Hello');
7
+ accumulated += delta;
8
+ delta = extractCopilotTextDelta(accumulated, ' World');
9
+ t.is(delta, ' World');
10
+ accumulated += delta;
11
+ t.is(accumulated, 'Hello World');
12
+ });
13
+ test('extractCopilotTextDelta - accumulated chunks', t => {
14
+ let accumulated = '';
15
+ let delta = extractCopilotTextDelta(accumulated, 'Hello');
16
+ t.is(delta, 'Hello');
17
+ accumulated += delta;
18
+ delta = extractCopilotTextDelta(accumulated, 'Hello World');
19
+ t.is(delta, ' World');
20
+ accumulated += delta;
21
+ t.is(accumulated, 'Hello World');
22
+ });
23
+ test('extractCopilotTextDelta - duplicate chunks', t => {
24
+ let accumulated = '';
25
+ let delta = extractCopilotTextDelta(accumulated, 'Hello');
26
+ t.is(delta, 'Hello');
27
+ accumulated += delta;
28
+ delta = extractCopilotTextDelta(accumulated, 'Hello');
29
+ t.is(delta, '');
30
+ accumulated += delta;
31
+ t.is(accumulated, 'Hello');
32
+ });
33
+ test('extractCopilotTextDelta - empty chunks', t => {
34
+ let accumulated = '';
35
+ let delta = extractCopilotTextDelta(accumulated, 'Hello');
36
+ t.is(delta, 'Hello');
37
+ accumulated += delta;
38
+ delta = extractCopilotTextDelta(accumulated, '');
39
+ t.is(delta, '');
40
+ accumulated += delta;
41
+ t.is(accumulated, 'Hello');
42
+ });
43
+ test('extractCopilotTextDelta - tricky overlap', t => {
44
+ // If it's pure deltas but one delta happens to be a suffix that looks like accumulated?
45
+ // This shouldn't happen in reality but let's check.
46
+ let accumulated = 'Hello';
47
+ let incoming = 'Hello'; // This is a NEW delta "Hello"
48
+ let delta = extractCopilotTextDelta(accumulated, incoming);
49
+ t.is(delta, ''); // With overlap detection, "Hello" overlaps completely with "Hello"
50
+ });
51
+ test('extractCopilotTextDelta - partial overlap', t => {
52
+ let accumulated = 'Hello';
53
+ let incoming = 'lo World'; // Delta that overlaps by 'lo'
54
+ let delta = extractCopilotTextDelta(accumulated, incoming);
55
+ t.is(delta, ' World');
56
+ });
57
+ test('extractCopilotTextDelta - real world repeat', t => {
58
+ let accumulated = 'I can help you with that.';
59
+ let incoming = 'that. Let me see...'; // Overlaps by 'that.'
60
+ let delta = extractCopilotTextDelta(accumulated, incoming);
61
+ t.is(delta, ' Let me see...');
62
+ });
63
+ //# sourceMappingURL=model.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.test.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/model.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ModelProvider, type Model } from '@openai/agents-core';
2
+ import type { ILoggingService, ISettingsService } from '../../services/service-interfaces.js';
3
+ export declare class GitHubCopilotProvider implements ModelProvider {
4
+ #private;
5
+ constructor(deps: {
6
+ settingsService: ISettingsService;
7
+ loggingService: ILoggingService;
8
+ });
9
+ getModel(modelName?: string): Promise<Model> | Model;
10
+ }
11
+ export declare function createGitHubCopilotProvider(deps: {
12
+ settingsService: ISettingsService;
13
+ loggingService: ILoggingService;
14
+ }): GitHubCopilotProvider;
15
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EACnB,MAAM,sCAAsC,CAAC;AAG9C,qBAAa,qBAAsB,YAAW,aAAa;;gBAM3C,IAAI,EAAE;QACd,eAAe,EAAE,gBAAgB,CAAC;QAClC,cAAc,EAAE,eAAe,CAAC;KACnC;IAKD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;CASvD;AAGD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAC9C,eAAe,EAAE,gBAAgB,CAAC;IAClC,cAAc,EAAE,eAAe,CAAC;CACnC,GAAG,qBAAqB,CAExB"}
@@ -0,0 +1,25 @@
1
+ import { GitHubCopilotModel } from './model.js';
2
+ export class GitHubCopilotProvider {
3
+ #settingsService;
4
+ #loggingService;
5
+ #sessionMap = new Map(); // Mapping of responseId -> sessionId
6
+ #activeSessions = new Map(); // Cache of sessionId -> actual session object
7
+ constructor(deps) {
8
+ this.#settingsService = deps.settingsService;
9
+ this.#loggingService = deps.loggingService;
10
+ }
11
+ getModel(modelName) {
12
+ return new GitHubCopilotModel({
13
+ settingsService: this.#settingsService,
14
+ loggingService: this.#loggingService,
15
+ modelId: modelName,
16
+ sessionMap: this.#sessionMap,
17
+ activeSessions: this.#activeSessions,
18
+ });
19
+ }
20
+ }
21
+ // Export factory function for dependency injection
22
+ export function createGitHubCopilotProvider(deps) {
23
+ return new GitHubCopilotProvider(deps);
24
+ }
25
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/provider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,OAAO,qBAAqB;IAC9B,gBAAgB,CAAmB;IACnC,eAAe,CAAkB;IACjC,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,qCAAqC;IAC9E,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC,CAAC,8CAA8C;IAEnG,YAAY,IAGX;QACG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,SAAkB;QACvB,OAAO,IAAI,kBAAkB,CAAC;YAC1B,eAAe,EAAE,IAAI,CAAC,gBAAgB;YACtC,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,cAAc,EAAE,IAAI,CAAC,eAAe;SACvC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,mDAAmD;AACnD,MAAM,UAAU,2BAA2B,CAAC,IAG3C;IACG,OAAO,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.test.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/provider.test.ts"],"names":[],"mappings":""}