aws-runtime-bridge 1.0.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 (462) hide show
  1. package/README.md +56 -0
  2. package/dist/adapter/AdapterRegistry.d.ts +53 -0
  3. package/dist/adapter/AdapterRegistry.d.ts.map +1 -0
  4. package/dist/adapter/AdapterRegistry.js +100 -0
  5. package/dist/adapter/AdapterRegistry.test.d.ts +5 -0
  6. package/dist/adapter/AdapterRegistry.test.d.ts.map +1 -0
  7. package/dist/adapter/AdapterRegistry.test.js +109 -0
  8. package/dist/adapter/ClaudeSdkAdapter.d.ts +120 -0
  9. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -0
  10. package/dist/adapter/ClaudeSdkAdapter.js +1140 -0
  11. package/dist/adapter/ClaudeSdkAdapter.test.d.ts +2 -0
  12. package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +1 -0
  13. package/dist/adapter/ClaudeSdkAdapter.test.js +95 -0
  14. package/dist/adapter/CodexSdkAdapter.d.ts +48 -0
  15. package/dist/adapter/CodexSdkAdapter.d.ts.map +1 -0
  16. package/dist/adapter/CodexSdkAdapter.js +750 -0
  17. package/dist/adapter/CodexSdkAdapter.test.d.ts +2 -0
  18. package/dist/adapter/CodexSdkAdapter.test.d.ts.map +1 -0
  19. package/dist/adapter/CodexSdkAdapter.test.js +245 -0
  20. package/dist/adapter/OpencodeSdkAdapter.d.ts +45 -0
  21. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -0
  22. package/dist/adapter/OpencodeSdkAdapter.js +622 -0
  23. package/dist/adapter/OpencodeSdkAdapter.test.d.ts +2 -0
  24. package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +1 -0
  25. package/dist/adapter/OpencodeSdkAdapter.test.js +14 -0
  26. package/dist/adapter/SdkProviderSpi.d.ts +15 -0
  27. package/dist/adapter/SdkProviderSpi.d.ts.map +1 -0
  28. package/dist/adapter/SdkProviderSpi.js +46 -0
  29. package/dist/adapter/adapter.test.d.ts +5 -0
  30. package/dist/adapter/adapter.test.d.ts.map +1 -0
  31. package/dist/adapter/adapter.test.js +180 -0
  32. package/dist/adapter/index.d.ts +11 -0
  33. package/dist/adapter/index.d.ts.map +1 -0
  34. package/dist/adapter/index.js +10 -0
  35. package/dist/adapter/types.d.ts +278 -0
  36. package/dist/adapter/types.d.ts.map +1 -0
  37. package/dist/adapter/types.js +278 -0
  38. package/dist/adapter/types.test.d.ts +2 -0
  39. package/dist/adapter/types.test.d.ts.map +1 -0
  40. package/dist/adapter/types.test.js +59 -0
  41. package/dist/adapters/cc-switch/common.d.ts +52 -0
  42. package/dist/adapters/cc-switch/common.d.ts.map +1 -0
  43. package/dist/adapters/cc-switch/common.js +61 -0
  44. package/dist/adapters/cc-switch/index.d.ts +25 -0
  45. package/dist/adapters/cc-switch/index.d.ts.map +1 -0
  46. package/dist/adapters/cc-switch/index.js +51 -0
  47. package/dist/adapters/cc-switch/mcp-claude.d.ts +15 -0
  48. package/dist/adapters/cc-switch/mcp-claude.d.ts.map +1 -0
  49. package/dist/adapters/cc-switch/mcp-claude.js +88 -0
  50. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +15 -0
  51. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -0
  52. package/dist/adapters/cc-switch/mcp-claudecode.js +77 -0
  53. package/dist/adapters/cc-switch/mcp-codex.d.ts +17 -0
  54. package/dist/adapters/cc-switch/mcp-codex.d.ts.map +1 -0
  55. package/dist/adapters/cc-switch/mcp-codex.js +248 -0
  56. package/dist/adapters/cc-switch/mcp-codex.test.d.ts +2 -0
  57. package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +1 -0
  58. package/dist/adapters/cc-switch/mcp-codex.test.js +125 -0
  59. package/dist/adapters/cc-switch/mcp-opencode.d.ts +23 -0
  60. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -0
  61. package/dist/adapters/cc-switch/mcp-opencode.js +100 -0
  62. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +14 -0
  63. package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +1 -0
  64. package/dist/adapters/cc-switch/mcp-placeholder.js +19 -0
  65. package/dist/adapters/cc-switch/skill-claude.d.ts +15 -0
  66. package/dist/adapters/cc-switch/skill-claude.d.ts.map +1 -0
  67. package/dist/adapters/cc-switch/skill-claude.js +91 -0
  68. package/dist/adapters/cc-switch/skill-claudecode.d.ts +15 -0
  69. package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +1 -0
  70. package/dist/adapters/cc-switch/skill-claudecode.js +91 -0
  71. package/dist/adapters/cc-switch/skill-opencode.d.ts +15 -0
  72. package/dist/adapters/cc-switch/skill-opencode.d.ts.map +1 -0
  73. package/dist/adapters/cc-switch/skill-opencode.js +95 -0
  74. package/dist/adapters/cc-switch/skill-placeholder.d.ts +14 -0
  75. package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +1 -0
  76. package/dist/adapters/cc-switch/skill-placeholder.js +19 -0
  77. package/dist/config.d.ts +76 -0
  78. package/dist/config.d.ts.map +1 -0
  79. package/dist/config.js +109 -0
  80. package/dist/index.d.ts +8 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +503 -0
  83. package/dist/middleware/auth.d.ts +12 -0
  84. package/dist/middleware/auth.d.ts.map +1 -0
  85. package/dist/middleware/auth.js +18 -0
  86. package/dist/routes/ai-sources.d.ts +2 -0
  87. package/dist/routes/ai-sources.d.ts.map +1 -0
  88. package/dist/routes/ai-sources.js +136 -0
  89. package/dist/routes/ai-sources.test.d.ts +2 -0
  90. package/dist/routes/ai-sources.test.d.ts.map +1 -0
  91. package/dist/routes/ai-sources.test.js +148 -0
  92. package/dist/routes/aws-mcp.d.ts +10 -0
  93. package/dist/routes/aws-mcp.d.ts.map +1 -0
  94. package/dist/routes/aws-mcp.js +74 -0
  95. package/dist/routes/aws-mcp.test.d.ts +2 -0
  96. package/dist/routes/aws-mcp.test.d.ts.map +1 -0
  97. package/dist/routes/aws-mcp.test.js +42 -0
  98. package/dist/routes/file-browser.d.ts +7 -0
  99. package/dist/routes/file-browser.d.ts.map +1 -0
  100. package/dist/routes/file-browser.js +227 -0
  101. package/dist/routes/file-browser.test.d.ts +5 -0
  102. package/dist/routes/file-browser.test.d.ts.map +1 -0
  103. package/dist/routes/file-browser.test.js +88 -0
  104. package/dist/routes/git.d.ts +7 -0
  105. package/dist/routes/git.d.ts.map +1 -0
  106. package/dist/routes/git.js +470 -0
  107. package/dist/routes/git.test.d.ts +5 -0
  108. package/dist/routes/git.test.d.ts.map +1 -0
  109. package/dist/routes/git.test.js +87 -0
  110. package/dist/routes/instance.d.ts +3 -0
  111. package/dist/routes/instance.d.ts.map +1 -0
  112. package/dist/routes/instance.js +170 -0
  113. package/dist/routes/instance.test.d.ts +5 -0
  114. package/dist/routes/instance.test.d.ts.map +1 -0
  115. package/dist/routes/instance.test.js +64 -0
  116. package/dist/routes/mcp.d.ts +2 -0
  117. package/dist/routes/mcp.d.ts.map +1 -0
  118. package/dist/routes/mcp.js +171 -0
  119. package/dist/routes/mcp.test.d.ts +5 -0
  120. package/dist/routes/mcp.test.d.ts.map +1 -0
  121. package/dist/routes/mcp.test.js +84 -0
  122. package/dist/routes/memory.d.ts +13 -0
  123. package/dist/routes/memory.d.ts.map +1 -0
  124. package/dist/routes/memory.js +429 -0
  125. package/dist/routes/processes.d.ts +7 -0
  126. package/dist/routes/processes.d.ts.map +1 -0
  127. package/dist/routes/processes.js +245 -0
  128. package/dist/routes/properties.d.ts +7 -0
  129. package/dist/routes/properties.d.ts.map +1 -0
  130. package/dist/routes/properties.js +72 -0
  131. package/dist/routes/properties.test.d.ts +5 -0
  132. package/dist/routes/properties.test.d.ts.map +1 -0
  133. package/dist/routes/properties.test.js +72 -0
  134. package/dist/routes/sessions.d.ts +7 -0
  135. package/dist/routes/sessions.d.ts.map +1 -0
  136. package/dist/routes/sessions.js +808 -0
  137. package/dist/routes/sessions.test.d.ts +5 -0
  138. package/dist/routes/sessions.test.d.ts.map +1 -0
  139. package/dist/routes/sessions.test.js +70 -0
  140. package/dist/routes/skills.d.ts +2 -0
  141. package/dist/routes/skills.d.ts.map +1 -0
  142. package/dist/routes/skills.js +162 -0
  143. package/dist/routes/skills.test.d.ts +5 -0
  144. package/dist/routes/skills.test.d.ts.map +1 -0
  145. package/dist/routes/skills.test.js +42 -0
  146. package/dist/routes/terminal.d.ts +18 -0
  147. package/dist/routes/terminal.d.ts.map +1 -0
  148. package/dist/routes/terminal.js +663 -0
  149. package/dist/routes/terminal.test.d.ts +2 -0
  150. package/dist/routes/terminal.test.d.ts.map +1 -0
  151. package/dist/routes/terminal.test.js +91 -0
  152. package/dist/routes/yml.d.ts +7 -0
  153. package/dist/routes/yml.d.ts.map +1 -0
  154. package/dist/routes/yml.js +223 -0
  155. package/dist/routes/yml.test.d.ts +5 -0
  156. package/dist/routes/yml.test.d.ts.map +1 -0
  157. package/dist/routes/yml.test.js +58 -0
  158. package/dist/services/agent-process-manager.d.ts +241 -0
  159. package/dist/services/agent-process-manager.d.ts.map +1 -0
  160. package/dist/services/agent-process-manager.js +762 -0
  161. package/dist/services/auto-register.d.ts +94 -0
  162. package/dist/services/auto-register.d.ts.map +1 -0
  163. package/dist/services/auto-register.js +510 -0
  164. package/dist/services/aws-client-agent-mcp.d.ts +26 -0
  165. package/dist/services/aws-client-agent-mcp.d.ts.map +1 -0
  166. package/dist/services/aws-client-agent-mcp.js +142 -0
  167. package/dist/services/aws-client-agent-mcp.test.d.ts +2 -0
  168. package/dist/services/aws-client-agent-mcp.test.d.ts.map +1 -0
  169. package/dist/services/aws-client-agent-mcp.test.js +89 -0
  170. package/dist/services/aws-mcp-http.d.ts +11 -0
  171. package/dist/services/aws-mcp-http.d.ts.map +1 -0
  172. package/dist/services/aws-mcp-http.js +225 -0
  173. package/dist/services/aws-mcp-http.test.d.ts +2 -0
  174. package/dist/services/aws-mcp-http.test.d.ts.map +1 -0
  175. package/dist/services/aws-mcp-http.test.js +27 -0
  176. package/dist/services/cc-switch-sdk.d.ts +18 -0
  177. package/dist/services/cc-switch-sdk.d.ts.map +1 -0
  178. package/dist/services/cc-switch-sdk.js +117 -0
  179. package/dist/services/easytier-manager.d.ts +106 -0
  180. package/dist/services/easytier-manager.d.ts.map +1 -0
  181. package/dist/services/easytier-manager.js +331 -0
  182. package/dist/services/easytier-manager.test.d.ts +5 -0
  183. package/dist/services/easytier-manager.test.d.ts.map +1 -0
  184. package/dist/services/easytier-manager.test.js +98 -0
  185. package/dist/services/instance-init-service.d.ts +35 -0
  186. package/dist/services/instance-init-service.d.ts.map +1 -0
  187. package/dist/services/instance-init-service.js +190 -0
  188. package/dist/services/instance-service.d.ts +88 -0
  189. package/dist/services/instance-service.d.ts.map +1 -0
  190. package/dist/services/instance-service.js +236 -0
  191. package/dist/services/instance-state.d.ts +36 -0
  192. package/dist/services/instance-state.d.ts.map +1 -0
  193. package/dist/services/instance-state.js +79 -0
  194. package/dist/services/instance-state.test.d.ts +2 -0
  195. package/dist/services/instance-state.test.d.ts.map +1 -0
  196. package/dist/services/instance-state.test.js +213 -0
  197. package/dist/services/memory-service.d.ts +195 -0
  198. package/dist/services/memory-service.d.ts.map +1 -0
  199. package/dist/services/memory-service.js +650 -0
  200. package/dist/services/orphan-monitor.d.ts +94 -0
  201. package/dist/services/orphan-monitor.d.ts.map +1 -0
  202. package/dist/services/orphan-monitor.js +321 -0
  203. package/dist/services/process-detector.d.ts +175 -0
  204. package/dist/services/process-detector.d.ts.map +1 -0
  205. package/dist/services/process-detector.js +992 -0
  206. package/dist/services/process-registry.d.ts +208 -0
  207. package/dist/services/process-registry.d.ts.map +1 -0
  208. package/dist/services/process-registry.js +354 -0
  209. package/dist/services/session-lookup.d.ts +20 -0
  210. package/dist/services/session-lookup.d.ts.map +1 -0
  211. package/dist/services/session-lookup.js +43 -0
  212. package/dist/services/session-output.d.ts +56 -0
  213. package/dist/services/session-output.d.ts.map +1 -0
  214. package/dist/services/session-output.js +122 -0
  215. package/dist/services/session-output.test.d.ts +5 -0
  216. package/dist/services/session-output.test.d.ts.map +1 -0
  217. package/dist/services/session-output.test.js +68 -0
  218. package/dist/services/terminal-persistence.d.ts +51 -0
  219. package/dist/services/terminal-persistence.d.ts.map +1 -0
  220. package/dist/services/terminal-persistence.js +125 -0
  221. package/dist/services/terminal-persistence.test.d.ts +5 -0
  222. package/dist/services/terminal-persistence.test.d.ts.map +1 -0
  223. package/dist/services/terminal-persistence.test.js +88 -0
  224. package/dist/services/tool-installer.d.ts +15 -0
  225. package/dist/services/tool-installer.d.ts.map +1 -0
  226. package/dist/services/tool-installer.js +297 -0
  227. package/dist/services/tool-installer.test.d.ts +2 -0
  228. package/dist/services/tool-installer.test.d.ts.map +1 -0
  229. package/dist/services/tool-installer.test.js +102 -0
  230. package/dist/services/user-api-key-service.d.ts +28 -0
  231. package/dist/services/user-api-key-service.d.ts.map +1 -0
  232. package/dist/services/user-api-key-service.js +75 -0
  233. package/dist/services/workspace-files.d.ts +85 -0
  234. package/dist/services/workspace-files.d.ts.map +1 -0
  235. package/dist/services/workspace-files.js +224 -0
  236. package/dist/services/workspace-files.test.d.ts +2 -0
  237. package/dist/services/workspace-files.test.d.ts.map +1 -0
  238. package/dist/services/workspace-files.test.js +117 -0
  239. package/dist/types.d.ts +233 -0
  240. package/dist/types.d.ts.map +1 -0
  241. package/dist/types.js +1 -0
  242. package/dist/utils/file-utils.d.ts +13 -0
  243. package/dist/utils/file-utils.d.ts.map +1 -0
  244. package/dist/utils/file-utils.js +140 -0
  245. package/dist/utils/file-utils.test.d.ts +2 -0
  246. package/dist/utils/file-utils.test.d.ts.map +1 -0
  247. package/dist/utils/file-utils.test.js +201 -0
  248. package/dist/utils/logger.d.ts +39 -0
  249. package/dist/utils/logger.d.ts.map +1 -0
  250. package/dist/utils/logger.js +110 -0
  251. package/dist/utils/logger.test.d.ts +2 -0
  252. package/dist/utils/logger.test.d.ts.map +1 -0
  253. package/dist/utils/logger.test.js +93 -0
  254. package/dist/utils/mcp-utils.d.ts +73 -0
  255. package/dist/utils/mcp-utils.d.ts.map +1 -0
  256. package/dist/utils/mcp-utils.js +165 -0
  257. package/dist/utils/path-utils.d.ts +24 -0
  258. package/dist/utils/path-utils.d.ts.map +1 -0
  259. package/dist/utils/path-utils.js +44 -0
  260. package/dist/utils/validation.d.ts +23 -0
  261. package/dist/utils/validation.d.ts.map +1 -0
  262. package/dist/utils/validation.js +53 -0
  263. package/dist/utils/validation.test.d.ts +2 -0
  264. package/dist/utils/validation.test.d.ts.map +1 -0
  265. package/dist/utils/validation.test.js +88 -0
  266. package/dist/utils/yaml-utils.d.ts +73 -0
  267. package/dist/utils/yaml-utils.d.ts.map +1 -0
  268. package/dist/utils/yaml-utils.js +309 -0
  269. package/dist/utils/yaml-utils.test.d.ts +2 -0
  270. package/dist/utils/yaml-utils.test.d.ts.map +1 -0
  271. package/dist/utils/yaml-utils.test.js +363 -0
  272. package/package/aws-client-agent-mcp/README.md +288 -0
  273. package/package/aws-client-agent-mcp/dist/activity-reporter.d.ts +150 -0
  274. package/package/aws-client-agent-mcp/dist/activity-reporter.d.ts.map +1 -0
  275. package/package/aws-client-agent-mcp/dist/activity-reporter.js +353 -0
  276. package/package/aws-client-agent-mcp/dist/activity-reporter.js.map +1 -0
  277. package/package/aws-client-agent-mcp/dist/activity-reporter.test.d.ts +2 -0
  278. package/package/aws-client-agent-mcp/dist/activity-reporter.test.d.ts.map +1 -0
  279. package/package/aws-client-agent-mcp/dist/activity-reporter.test.js +75 -0
  280. package/package/aws-client-agent-mcp/dist/activity-reporter.test.js.map +1 -0
  281. package/package/aws-client-agent-mcp/dist/activity-types.d.ts +96 -0
  282. package/package/aws-client-agent-mcp/dist/activity-types.d.ts.map +1 -0
  283. package/package/aws-client-agent-mcp/dist/activity-types.js +141 -0
  284. package/package/aws-client-agent-mcp/dist/activity-types.js.map +1 -0
  285. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +165 -0
  286. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -0
  287. package/package/aws-client-agent-mcp/dist/agent-client.js +588 -0
  288. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -0
  289. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +2 -0
  290. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +1 -0
  291. package/package/aws-client-agent-mcp/dist/agent-client.test.js +534 -0
  292. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -0
  293. package/package/aws-client-agent-mcp/dist/config.d.ts +21 -0
  294. package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -0
  295. package/package/aws-client-agent-mcp/dist/config.js +67 -0
  296. package/package/aws-client-agent-mcp/dist/config.js.map +1 -0
  297. package/package/aws-client-agent-mcp/dist/config.test.d.ts +2 -0
  298. package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +1 -0
  299. package/package/aws-client-agent-mcp/dist/config.test.js +139 -0
  300. package/package/aws-client-agent-mcp/dist/config.test.js.map +1 -0
  301. package/package/aws-client-agent-mcp/dist/constants.d.ts +15 -0
  302. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -0
  303. package/package/aws-client-agent-mcp/dist/constants.js +19 -0
  304. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -0
  305. package/package/aws-client-agent-mcp/dist/http-client.d.ts +27 -0
  306. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -0
  307. package/package/aws-client-agent-mcp/dist/http-client.js +65 -0
  308. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -0
  309. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +2 -0
  310. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +1 -0
  311. package/package/aws-client-agent-mcp/dist/http-client.test.js +228 -0
  312. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -0
  313. package/package/aws-client-agent-mcp/dist/index.d.ts +14 -0
  314. package/package/aws-client-agent-mcp/dist/index.d.ts.map +1 -0
  315. package/package/aws-client-agent-mcp/dist/index.js +30 -0
  316. package/package/aws-client-agent-mcp/dist/index.js.map +1 -0
  317. package/package/aws-client-agent-mcp/dist/logger.d.ts +7 -0
  318. package/package/aws-client-agent-mcp/dist/logger.d.ts.map +1 -0
  319. package/package/aws-client-agent-mcp/dist/logger.js +19 -0
  320. package/package/aws-client-agent-mcp/dist/logger.js.map +1 -0
  321. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +77 -0
  322. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -0
  323. package/package/aws-client-agent-mcp/dist/mcp-server.js +427 -0
  324. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -0
  325. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +2 -0
  326. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +1 -0
  327. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +624 -0
  328. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -0
  329. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +78 -0
  330. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -0
  331. package/package/aws-client-agent-mcp/dist/mcp-tools.js +420 -0
  332. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -0
  333. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +61 -0
  334. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -0
  335. package/package/aws-client-agent-mcp/dist/memory-store.js +268 -0
  336. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -0
  337. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +2 -0
  338. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +1 -0
  339. package/package/aws-client-agent-mcp/dist/memory-store.test.js +164 -0
  340. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -0
  341. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +74 -0
  342. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -0
  343. package/package/aws-client-agent-mcp/dist/message-buffer.js +159 -0
  344. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -0
  345. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +2 -0
  346. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +1 -0
  347. package/package/aws-client-agent-mcp/dist/message-buffer.test.js +44 -0
  348. package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +1 -0
  349. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +53 -0
  350. package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +1 -0
  351. package/package/aws-client-agent-mcp/dist/messageContent.js +125 -0
  352. package/package/aws-client-agent-mcp/dist/messageContent.js.map +1 -0
  353. package/package/aws-client-agent-mcp/dist/orchestration-tools.d.ts +19 -0
  354. package/package/aws-client-agent-mcp/dist/orchestration-tools.d.ts.map +1 -0
  355. package/package/aws-client-agent-mcp/dist/orchestration-tools.js +317 -0
  356. package/package/aws-client-agent-mcp/dist/orchestration-tools.js.map +1 -0
  357. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +66 -0
  358. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -0
  359. package/package/aws-client-agent-mcp/dist/status-reporter.js +220 -0
  360. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -0
  361. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +2 -0
  362. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +1 -0
  363. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +45 -0
  364. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -0
  365. package/package/aws-client-agent-mcp/dist/types.d.ts +286 -0
  366. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -0
  367. package/package/aws-client-agent-mcp/dist/types.js +9 -0
  368. package/package/aws-client-agent-mcp/dist/types.js.map +1 -0
  369. package/package/aws-client-agent-mcp/dist/user-config-reader.d.ts +63 -0
  370. package/package/aws-client-agent-mcp/dist/user-config-reader.d.ts.map +1 -0
  371. package/package/aws-client-agent-mcp/dist/user-config-reader.js +161 -0
  372. package/package/aws-client-agent-mcp/dist/user-config-reader.js.map +1 -0
  373. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +94 -0
  374. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -0
  375. package/package/aws-client-agent-mcp/dist/websocket-client.js +316 -0
  376. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -0
  377. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +2 -0
  378. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +1 -0
  379. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +191 -0
  380. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -0
  381. package/package/aws-client-agent-mcp/package.json +51 -0
  382. package/package/cc-switch-sdk/README.md +541 -0
  383. package/package/cc-switch-sdk/dist/adapters/common.d.ts +38 -0
  384. package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +1 -0
  385. package/package/cc-switch-sdk/dist/adapters/common.js +47 -0
  386. package/package/cc-switch-sdk/dist/adapters/index.d.ts +5 -0
  387. package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +1 -0
  388. package/package/cc-switch-sdk/dist/adapters/index.js +28 -0
  389. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +10 -0
  390. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +1 -0
  391. package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +39 -0
  392. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +10 -0
  393. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +1 -0
  394. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +40 -0
  395. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +18 -0
  396. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +1 -0
  397. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +63 -0
  398. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +2 -0
  399. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +1 -0
  400. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +86 -0
  401. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +9 -0
  402. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +1 -0
  403. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +14 -0
  404. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +10 -0
  405. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +1 -0
  406. package/package/cc-switch-sdk/dist/adapters/skill-claude.js +51 -0
  407. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +10 -0
  408. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +1 -0
  409. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +51 -0
  410. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +10 -0
  411. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +1 -0
  412. package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +51 -0
  413. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +9 -0
  414. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +1 -0
  415. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +14 -0
  416. package/package/cc-switch-sdk/dist/constants.d.ts +9 -0
  417. package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -0
  418. package/package/cc-switch-sdk/dist/constants.js +54 -0
  419. package/package/cc-switch-sdk/dist/errors.d.ts +6 -0
  420. package/package/cc-switch-sdk/dist/errors.d.ts.map +1 -0
  421. package/package/cc-switch-sdk/dist/errors.js +8 -0
  422. package/package/cc-switch-sdk/dist/index.d.ts +11 -0
  423. package/package/cc-switch-sdk/dist/index.d.ts.map +1 -0
  424. package/package/cc-switch-sdk/dist/index.js +9 -0
  425. package/package/cc-switch-sdk/dist/schemas.d.ts +8 -0
  426. package/package/cc-switch-sdk/dist/schemas.d.ts.map +1 -0
  427. package/package/cc-switch-sdk/dist/schemas.js +37 -0
  428. package/package/cc-switch-sdk/dist/sdk.d.ts +91 -0
  429. package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -0
  430. package/package/cc-switch-sdk/dist/sdk.js +427 -0
  431. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +75 -0
  432. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +1 -0
  433. package/package/cc-switch-sdk/dist/services/ai-config-service.js +280 -0
  434. package/package/cc-switch-sdk/dist/services/instance-service.d.ts +78 -0
  435. package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +1 -0
  436. package/package/cc-switch-sdk/dist/services/instance-service.js +180 -0
  437. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +17 -0
  438. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +1 -0
  439. package/package/cc-switch-sdk/dist/services/mcp-model.js +34 -0
  440. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +18 -0
  441. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +1 -0
  442. package/package/cc-switch-sdk/dist/services/mcp-service.js +9 -0
  443. package/package/cc-switch-sdk/dist/services/skill-model.d.ts +17 -0
  444. package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +1 -0
  445. package/package/cc-switch-sdk/dist/services/skill-model.js +38 -0
  446. package/package/cc-switch-sdk/dist/services/skill-service.d.ts +17 -0
  447. package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +1 -0
  448. package/package/cc-switch-sdk/dist/services/skill-service.js +9 -0
  449. package/package/cc-switch-sdk/dist/state.d.ts +4 -0
  450. package/package/cc-switch-sdk/dist/state.d.ts.map +1 -0
  451. package/package/cc-switch-sdk/dist/state.js +19 -0
  452. package/package/cc-switch-sdk/dist/types.d.ts +75 -0
  453. package/package/cc-switch-sdk/dist/types.d.ts.map +1 -0
  454. package/package/cc-switch-sdk/dist/types.js +1 -0
  455. package/package/cc-switch-sdk/dist/utils/fs.d.ts +10 -0
  456. package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +1 -0
  457. package/package/cc-switch-sdk/dist/utils/fs.js +91 -0
  458. package/package/cc-switch-sdk/dist/utils/id.d.ts +4 -0
  459. package/package/cc-switch-sdk/dist/utils/id.d.ts.map +1 -0
  460. package/package/cc-switch-sdk/dist/utils/id.js +12 -0
  461. package/package/cc-switch-sdk/package.json +31 -0
  462. package/package.json +73 -0
@@ -0,0 +1,470 @@
1
+ /**
2
+ * Git 快照 API 路由
3
+ *
4
+ * 提供 Git Stash 快照的创建、列表、恢复和删除功能
5
+ */
6
+ import { Router } from 'express';
7
+ import { spawn } from 'node:child_process';
8
+ import path from 'node:path';
9
+ import { promises as fs } from 'node:fs';
10
+ import { validateToken } from '../middleware/auth.js';
11
+ export const gitRouter = Router();
12
+ /**
13
+ * 执行 git 命令并返回输出
14
+ */
15
+ async function execGitCommand(workspacePath, args) {
16
+ return new Promise((resolve) => {
17
+ const child = spawn('git', args, {
18
+ cwd: workspacePath,
19
+ stdio: ['ignore', 'pipe', 'pipe'],
20
+ });
21
+ let stdout = '';
22
+ let stderr = '';
23
+ child.stdout?.on('data', (chunk) => {
24
+ stdout += String(chunk || '');
25
+ });
26
+ child.stderr?.on('data', (chunk) => {
27
+ stderr += String(chunk || '');
28
+ });
29
+ child.on('error', (error) => {
30
+ resolve({ stdout: '', stderr: error.message, exitCode: 1 });
31
+ });
32
+ child.on('close', (code) => {
33
+ resolve({ stdout, stderr, exitCode: code ?? 1 });
34
+ });
35
+ });
36
+ }
37
+ function normalizeGitPath(targetPath) {
38
+ return String(targetPath || '').replace(/\\/g, '/').replace(/^\.\//, '').trim();
39
+ }
40
+ async function hasGitMetadataDir(targetPath) {
41
+ const gitDir = path.join(targetPath, '.git');
42
+ try {
43
+ const stat = await fs.stat(gitDir);
44
+ return stat.isDirectory() || stat.isFile();
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ async function resolveGitRepositoryContext(workspacePath) {
51
+ const normalizedPath = path.resolve(String(workspacePath).trim());
52
+ const isGitRepo = await hasGitMetadataDir(normalizedPath);
53
+ if (isGitRepo) {
54
+ return {
55
+ workspacePath: normalizedPath,
56
+ repositoryRootPath: normalizedPath,
57
+ hasRepository: true,
58
+ isGitRepo: true,
59
+ usingParentGitRepo: false,
60
+ relativeWorkspacePath: ''
61
+ };
62
+ }
63
+ const repoRootResult = await execGitCommand(normalizedPath, ['rev-parse', '--show-toplevel']);
64
+ if (repoRootResult.exitCode !== 0) {
65
+ return {
66
+ workspacePath: normalizedPath,
67
+ repositoryRootPath: null,
68
+ hasRepository: false,
69
+ isGitRepo: false,
70
+ usingParentGitRepo: false,
71
+ relativeWorkspacePath: ''
72
+ };
73
+ }
74
+ const repositoryRootPath = path.resolve(repoRootResult.stdout.trim());
75
+ const relativeWorkspacePath = normalizeGitPath(path.relative(repositoryRootPath, normalizedPath));
76
+ return {
77
+ workspacePath: normalizedPath,
78
+ repositoryRootPath,
79
+ hasRepository: true,
80
+ isGitRepo: false,
81
+ usingParentGitRepo: repositoryRootPath !== normalizedPath,
82
+ relativeWorkspacePath
83
+ };
84
+ }
85
+ function createScopedGitArgs(baseArgs, context) {
86
+ if (!context.relativeWorkspacePath) {
87
+ return [...baseArgs];
88
+ }
89
+ return [
90
+ ...baseArgs,
91
+ `--relative=${context.relativeWorkspacePath}`,
92
+ '--',
93
+ context.relativeWorkspacePath
94
+ ];
95
+ }
96
+ function resolveRepositoryRelativeFilePath(filePath, context) {
97
+ const normalizedFilePath = normalizeGitPath(filePath);
98
+ if (!context.relativeWorkspacePath) {
99
+ return normalizedFilePath;
100
+ }
101
+ return normalizeGitPath(path.posix.join(context.relativeWorkspacePath, normalizedFilePath));
102
+ }
103
+ function resolveGitDiffStatus(statusToken) {
104
+ const normalizedToken = String(statusToken || '').trim().toUpperCase();
105
+ if (normalizedToken.startsWith('A')) {
106
+ return 'added';
107
+ }
108
+ if (normalizedToken.startsWith('D')) {
109
+ return 'deleted';
110
+ }
111
+ if (normalizedToken.startsWith('R')) {
112
+ return 'renamed';
113
+ }
114
+ return 'modified';
115
+ }
116
+ function parseRenameDisplayPath(rawPath) {
117
+ const normalizedPath = normalizeGitPath(rawPath);
118
+ if (!normalizedPath.includes('=>')) {
119
+ return normalizedPath;
120
+ }
121
+ const braceMatch = normalizedPath.match(/^(.*)\{([^{}]+)=>([^{}]+)\}(.*)$/);
122
+ if (braceMatch) {
123
+ const prefix = braceMatch[1];
124
+ const renamedTarget = braceMatch[3];
125
+ const suffix = braceMatch[4];
126
+ return normalizeGitPath(`${prefix}${renamedTarget}${suffix}`);
127
+ }
128
+ const arrowIndex = normalizedPath.lastIndexOf('=>');
129
+ if (arrowIndex >= 0) {
130
+ return normalizeGitPath(normalizedPath.slice(arrowIndex + 2));
131
+ }
132
+ return normalizedPath;
133
+ }
134
+ /**
135
+ * 检查路径是否为 git 仓库
136
+ * POST /runtime/git/check
137
+ */
138
+ gitRouter.post('/git/check', validateToken, async (req, res) => {
139
+ const { workspacePath } = req.body || {};
140
+ if (!workspacePath || !String(workspacePath).trim()) {
141
+ res.status(400).json({ error: 'workspacePath is required' });
142
+ return;
143
+ }
144
+ try {
145
+ const context = await resolveGitRepositoryContext(String(workspacePath).trim());
146
+ res.json({
147
+ ok: true,
148
+ isGitRepo: context.isGitRepo,
149
+ hasRepository: context.hasRepository,
150
+ usingParentGitRepo: context.usingParentGitRepo,
151
+ workspacePath: context.workspacePath,
152
+ repositoryRootPath: context.repositoryRootPath,
153
+ relativeWorkspacePath: context.relativeWorkspacePath
154
+ });
155
+ return;
156
+ }
157
+ catch (error) {
158
+ const err = error;
159
+ res.status(500).json({ error: err.message || 'check git repo failed' });
160
+ }
161
+ });
162
+ /**
163
+ * 创建 git stash 快照
164
+ * POST /runtime/git/stash/create
165
+ */
166
+ gitRouter.post('/git/stash/create', validateToken, async (req, res) => {
167
+ const { workspacePath, message } = req.body || {};
168
+ if (!workspacePath || !String(workspacePath).trim()) {
169
+ res.status(400).json({ error: 'workspacePath is required' });
170
+ return;
171
+ }
172
+ try {
173
+ const normalizedPath = path.resolve(String(workspacePath).trim());
174
+ const defaultMessage = `快照(${new Date().toLocaleString('zh-CN', {
175
+ year: 'numeric',
176
+ month: '2-digit',
177
+ day: '2-digit',
178
+ hour: '2-digit',
179
+ minute: '2-digit'
180
+ })})`;
181
+ const stashMessage = message && String(message).trim()
182
+ ? `快照: ${String(message).trim()}`
183
+ : defaultMessage;
184
+ const result = await execGitCommand(normalizedPath, ['stash', 'push', '-m', stashMessage]);
185
+ if (result.exitCode !== 0) {
186
+ if (result.stderr.includes('No local changes to save')) {
187
+ res.json({
188
+ ok: true,
189
+ stashRef: null,
190
+ message: '没有本地变更需要保存',
191
+ noChanges: true,
192
+ workspacePath: normalizedPath
193
+ });
194
+ return;
195
+ }
196
+ res.status(400).json({ error: result.stderr || 'git stash push failed' });
197
+ return;
198
+ }
199
+ const listResult = await execGitCommand(normalizedPath, ['stash', 'list', '-n', '1']);
200
+ const firstLine = listResult.stdout.split('\n')[0] || '';
201
+ const match = firstLine.match(/^(stash@\{\d+\})/);
202
+ const stashRef = match ? match[1] : 'stash@{0}';
203
+ res.json({
204
+ ok: true,
205
+ stashRef,
206
+ message: stashMessage,
207
+ workspacePath: normalizedPath
208
+ });
209
+ }
210
+ catch (error) {
211
+ const err = error;
212
+ res.status(500).json({ error: err.message || 'create stash failed' });
213
+ }
214
+ });
215
+ /**
216
+ * 获取 git stash 列表
217
+ * POST /runtime/git/stash/list
218
+ */
219
+ gitRouter.post('/git/stash/list', validateToken, async (req, res) => {
220
+ const { workspacePath, limit = 20 } = req.body || {};
221
+ if (!workspacePath || !String(workspacePath).trim()) {
222
+ res.status(400).json({ error: 'workspacePath is required' });
223
+ return;
224
+ }
225
+ try {
226
+ const normalizedPath = path.resolve(String(workspacePath).trim());
227
+ const stashLimit = Math.min(Math.max(1, Number(limit) || 20), 100);
228
+ const result = await execGitCommand(normalizedPath, ['stash', 'list', `-n`, String(stashLimit)]);
229
+ if (result.exitCode !== 0) {
230
+ res.status(400).json({ error: result.stderr || 'git stash list failed' });
231
+ return;
232
+ }
233
+ const stashes = [];
234
+ const lines = result.stdout.split('\n').filter(line => line.trim());
235
+ for (const line of lines) {
236
+ const refMatch = line.match(/^(stash@\{\d+\})/);
237
+ if (!refMatch)
238
+ continue;
239
+ const ref = refMatch[1];
240
+ const restOfLine = line.slice(ref.length + 2);
241
+ let branch = '';
242
+ let message = restOfLine;
243
+ const branchMatch = restOfLine.match(/^(?:On|WIP on)\s+([^:]+):\s*(.*)$/);
244
+ if (branchMatch) {
245
+ branch = branchMatch[1].trim();
246
+ message = branchMatch[2].trim();
247
+ }
248
+ stashes.push({
249
+ ref,
250
+ message,
251
+ branch,
252
+ createdAt: null,
253
+ });
254
+ }
255
+ res.json({
256
+ ok: true,
257
+ stashes,
258
+ count: stashes.length,
259
+ workspacePath: normalizedPath
260
+ });
261
+ }
262
+ catch (error) {
263
+ const err = error;
264
+ res.status(500).json({ error: err.message || 'list stash failed' });
265
+ }
266
+ });
267
+ /**
268
+ * 恢复 git stash 快照
269
+ * POST /runtime/git/stash/pop
270
+ */
271
+ gitRouter.post('/git/stash/pop', validateToken, async (req, res) => {
272
+ const { workspacePath, ref } = req.body || {};
273
+ if (!workspacePath || !String(workspacePath).trim()) {
274
+ res.status(400).json({ error: 'workspacePath is required' });
275
+ return;
276
+ }
277
+ try {
278
+ const normalizedPath = path.resolve(String(workspacePath).trim());
279
+ const stashRef = ref && String(ref).trim() ? String(ref).trim() : 'stash@{0}';
280
+ await execGitCommand(normalizedPath, ['checkout', '--', '.']);
281
+ const result = await execGitCommand(normalizedPath, ['stash', 'pop', stashRef]);
282
+ if (result.exitCode !== 0) {
283
+ if (result.stdout.includes('CONFLICT') || result.stderr.includes('CONFLICT')) {
284
+ res.json({
285
+ ok: false,
286
+ hasConflict: true,
287
+ message: '恢复时发生冲突,请手动解决',
288
+ details: result.stdout || result.stderr,
289
+ workspacePath: normalizedPath
290
+ });
291
+ return;
292
+ }
293
+ if (result.stderr.includes('is not a valid reference')) {
294
+ res.status(404).json({ error: `快照 ${stashRef} 不存在` });
295
+ return;
296
+ }
297
+ res.status(400).json({ error: result.stderr || 'git stash pop failed' });
298
+ return;
299
+ }
300
+ res.json({
301
+ ok: true,
302
+ stashRef,
303
+ message: `已恢复 ${stashRef}`,
304
+ workspacePath: normalizedPath
305
+ });
306
+ }
307
+ catch (error) {
308
+ const err = error;
309
+ res.status(500).json({ error: err.message || 'pop stash failed' });
310
+ }
311
+ });
312
+ /**
313
+ * 删除指定的 git stash
314
+ * POST /runtime/git/stash/drop
315
+ */
316
+ gitRouter.post('/git/stash/drop', validateToken, async (req, res) => {
317
+ const { workspacePath, ref } = req.body || {};
318
+ if (!workspacePath || !String(workspacePath).trim()) {
319
+ res.status(400).json({ error: 'workspacePath is required' });
320
+ return;
321
+ }
322
+ try {
323
+ const normalizedPath = path.resolve(String(workspacePath).trim());
324
+ const stashRef = ref && String(ref).trim() ? String(ref).trim() : 'stash@{0}';
325
+ const result = await execGitCommand(normalizedPath, ['stash', 'drop', stashRef]);
326
+ if (result.exitCode !== 0) {
327
+ if (result.stderr.includes('is not a valid reference')) {
328
+ res.status(404).json({ error: `快照 ${stashRef} 不存在` });
329
+ return;
330
+ }
331
+ res.status(400).json({ error: result.stderr || 'git stash drop failed' });
332
+ return;
333
+ }
334
+ res.json({
335
+ ok: true,
336
+ stashRef,
337
+ message: `已删除 ${stashRef}`,
338
+ workspacePath: normalizedPath
339
+ });
340
+ }
341
+ catch (error) {
342
+ const err = error;
343
+ res.status(500).json({ error: err.message || 'drop stash failed' });
344
+ }
345
+ });
346
+ /**
347
+ * 获取工作区未提交变更概览
348
+ * POST /runtime/git/diff
349
+ */
350
+ gitRouter.post('/git/diff', validateToken, async (req, res) => {
351
+ const { workspacePath, repositoryPath } = req.body || {};
352
+ if (!workspacePath || !String(workspacePath).trim()) {
353
+ res.status(400).json({ error: 'workspacePath is required' });
354
+ return;
355
+ }
356
+ try {
357
+ const context = await resolveGitRepositoryContext(String(repositoryPath || workspacePath).trim());
358
+ if (!context.hasRepository || !context.repositoryRootPath) {
359
+ res.json({
360
+ ok: true,
361
+ isGitRepo: context.isGitRepo,
362
+ hasRepository: false,
363
+ usingParentGitRepo: false,
364
+ hasChanges: false,
365
+ files: [],
366
+ workspacePath: context.workspacePath,
367
+ repositoryRootPath: null,
368
+ relativeWorkspacePath: ''
369
+ });
370
+ return;
371
+ }
372
+ const nameStatusResult = await execGitCommand(context.repositoryRootPath, createScopedGitArgs(['diff', '--name-status'], context));
373
+ if (nameStatusResult.exitCode !== 0) {
374
+ res.status(400).json({ error: nameStatusResult.stderr || 'git diff failed' });
375
+ return;
376
+ }
377
+ const result = await execGitCommand(context.repositoryRootPath, createScopedGitArgs(['diff', '--numstat'], context));
378
+ if (result.exitCode !== 0) {
379
+ res.status(400).json({ error: result.stderr || 'git diff failed' });
380
+ return;
381
+ }
382
+ const statusMap = new Map();
383
+ const nameStatusLines = nameStatusResult.stdout.split('\n').filter(line => line.trim());
384
+ for (const line of nameStatusLines) {
385
+ const parts = line.split('\t');
386
+ if (parts.length < 2) {
387
+ continue;
388
+ }
389
+ const status = resolveGitDiffStatus(parts[0]);
390
+ const pathIndex = status === 'renamed' && parts.length >= 3 ? 2 : 1;
391
+ const displayPath = parseRenameDisplayPath(parts[pathIndex]);
392
+ if (!displayPath) {
393
+ continue;
394
+ }
395
+ statusMap.set(displayPath, status);
396
+ }
397
+ const files = [];
398
+ const lines = result.stdout.split('\n').filter(line => line.trim());
399
+ for (const line of lines) {
400
+ // 格式: "12\t5\tsrc/file.java"
401
+ const parts = line.split('\t');
402
+ if (parts.length < 3)
403
+ continue;
404
+ const additions = parts[0] === '-' ? 0 : parseInt(parts[0], 10) || 0;
405
+ const deletions = parts[1] === '-' ? 0 : parseInt(parts[1], 10) || 0;
406
+ const filePath = parseRenameDisplayPath(parts.slice(2).join('\t').trim());
407
+ const status = statusMap.get(filePath) || 'modified';
408
+ files.push({ path: filePath, status, additions, deletions });
409
+ }
410
+ res.json({
411
+ ok: true,
412
+ isGitRepo: context.isGitRepo,
413
+ hasRepository: true,
414
+ usingParentGitRepo: context.usingParentGitRepo,
415
+ hasChanges: files.length > 0,
416
+ files,
417
+ workspacePath: context.workspacePath,
418
+ repositoryRootPath: context.repositoryRootPath,
419
+ relativeWorkspacePath: context.relativeWorkspacePath
420
+ });
421
+ }
422
+ catch (error) {
423
+ const err = error;
424
+ res.status(500).json({ error: err.message || 'git diff failed' });
425
+ }
426
+ });
427
+ /**
428
+ * 获取单个文件的详细差异
429
+ * POST /runtime/git/diff-file
430
+ */
431
+ gitRouter.post('/git/diff-file', validateToken, async (req, res) => {
432
+ const { workspacePath, repositoryPath, filePath } = req.body || {};
433
+ if (!workspacePath || !String(workspacePath).trim()) {
434
+ res.status(400).json({ error: 'workspacePath is required' });
435
+ return;
436
+ }
437
+ if (!filePath || !String(filePath).trim()) {
438
+ res.status(400).json({ error: 'filePath is required' });
439
+ return;
440
+ }
441
+ try {
442
+ // 必须使用 workspacePath 来正确计算 relativeWorkspacePath
443
+ // 如果使用 repositoryPath(仓库根路径),会丢失工作目录信息,导致文件路径拼接错误
444
+ const context = await resolveGitRepositoryContext(String(workspacePath).trim());
445
+ const normalizedFilePath = normalizeGitPath(String(filePath).trim());
446
+ if (!context.hasRepository || !context.repositoryRootPath) {
447
+ res.status(400).json({ error: 'workspace is not inside a git repository' });
448
+ return;
449
+ }
450
+ const repositoryRelativeFilePath = resolveRepositoryRelativeFilePath(normalizedFilePath, context);
451
+ const result = await execGitCommand(context.repositoryRootPath, ['diff', '--', repositoryRelativeFilePath]);
452
+ if (result.exitCode !== 0) {
453
+ res.status(400).json({ error: result.stderr || 'git diff file failed' });
454
+ return;
455
+ }
456
+ res.json({
457
+ ok: true,
458
+ filePath: normalizedFilePath,
459
+ repositoryRelativeFilePath,
460
+ diffContent: result.stdout,
461
+ workspacePath: context.workspacePath,
462
+ repositoryRootPath: context.repositoryRootPath,
463
+ usingParentGitRepo: context.usingParentGitRepo
464
+ });
465
+ }
466
+ catch (error) {
467
+ const err = error;
468
+ res.status(500).json({ error: err.message || 'git diff file failed' });
469
+ }
470
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Git 路由单元测试
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=git.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.test.d.ts","sourceRoot":"","sources":["../../src/routes/git.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Git 路由单元测试
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ describe('git stash operations', () => {
6
+ function parseStashList(output) {
7
+ const stashes = [];
8
+ const lines = output.split('\n').filter(line => line.trim());
9
+ for (const line of lines) {
10
+ const refMatch = line.match(/^(stash@\{\d+\})/);
11
+ if (!refMatch)
12
+ continue;
13
+ const ref = refMatch[1];
14
+ const restOfLine = line.slice(ref.length + 2);
15
+ let branch = '';
16
+ let message = restOfLine;
17
+ const branchMatch = restOfLine.match(/^(?:On|WIP on)\s+([^:]+):\s*(.*)$/);
18
+ if (branchMatch) {
19
+ branch = branchMatch[1].trim();
20
+ message = branchMatch[2].trim();
21
+ }
22
+ stashes.push({ ref, branch, message });
23
+ }
24
+ return stashes;
25
+ }
26
+ it('parses simple stash list output', () => {
27
+ const output = 'stash@{0}: On main: 快照: 添加新功能';
28
+ const result = parseStashList(output);
29
+ expect(result.length).toBe(1);
30
+ expect(result[0].ref).toBe('stash@{0}');
31
+ expect(result[0].branch).toBe('main');
32
+ expect(result[0].message).toBe('快照: 添加新功能');
33
+ });
34
+ it('parses WIP stash format', () => {
35
+ const output = 'stash@{0}: WIP on feature: test changes';
36
+ const result = parseStashList(output);
37
+ expect(result.length).toBe(1);
38
+ expect(result[0].branch).toBe('feature');
39
+ expect(result[0].message).toBe('test changes');
40
+ });
41
+ it('handles multiple stash entries', () => {
42
+ const output = [
43
+ 'stash@{0}: On main: 最新快照',
44
+ 'stash@{1}: On main: 旧快照',
45
+ ].join('\n');
46
+ const result = parseStashList(output);
47
+ expect(result.length).toBe(2);
48
+ });
49
+ it('returns empty array for empty output', () => {
50
+ expect(parseStashList('')).toEqual([]);
51
+ });
52
+ });
53
+ describe('git command validation', () => {
54
+ it('validates workspacePath requirement', () => {
55
+ const validateInput = (body) => {
56
+ if (!body.workspacePath || !String(body.workspacePath).trim()) {
57
+ return { valid: false, error: 'workspacePath is required' };
58
+ }
59
+ return { valid: true };
60
+ };
61
+ expect(validateInput({}).valid).toBe(false);
62
+ expect(validateInput({ workspacePath: '/valid/path' }).valid).toBe(true);
63
+ });
64
+ it('validates stashRef format', () => {
65
+ const isValidStashRef = (ref) => /^stash@\{\d+\}$/.test(ref);
66
+ expect(isValidStashRef('stash@{0}')).toBe(true);
67
+ expect(isValidStashRef('stash@{99}')).toBe(true);
68
+ expect(isValidStashRef('invalid')).toBe(false);
69
+ });
70
+ });
71
+ describe('error handling', () => {
72
+ it('detects "no local changes" error', () => {
73
+ const isNoChangesError = (stderr) => stderr.includes('No local changes to save');
74
+ expect(isNoChangesError('error: No local changes to save')).toBe(true);
75
+ expect(isNoChangesError('other error')).toBe(false);
76
+ });
77
+ it('detects conflict during pop', () => {
78
+ const hasConflict = (stdout, stderr) => stdout.includes('CONFLICT') || stderr.includes('CONFLICT');
79
+ expect(hasConflict('CONFLICT (content): Merge conflict', '')).toBe(true);
80
+ expect(hasConflict('clean merge', '')).toBe(false);
81
+ });
82
+ it('detects invalid stash reference', () => {
83
+ const isInvalidRef = (stderr) => stderr.includes('is not a valid reference');
84
+ expect(isInvalidRef("stash@{99} is not a valid reference")).toBe(true);
85
+ expect(isInvalidRef('other error')).toBe(false);
86
+ });
87
+ });
@@ -0,0 +1,3 @@
1
+ export declare function setGracefulShutdownFn(fn: (signal: string, preserveSessions: boolean) => Promise<void>): void;
2
+ export declare const instanceRouter: import("express-serve-static-core").Router;
3
+ //# sourceMappingURL=instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"AAeA,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAE5G;AAED,eAAO,MAAM,cAAc,4CAAW,CAAC"}