orquesta-cli 0.1.12

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 (851) hide show
  1. package/.eslintrc.json +26 -0
  2. package/.prettierrc.json +10 -0
  3. package/CLAUDE.md +199 -0
  4. package/LICENSE +21 -0
  5. package/README.md +280 -0
  6. package/SECURITY.md +290 -0
  7. package/TEST_LOCAL.md +245 -0
  8. package/dist/agents/base/base-agent.d.ts +38 -0
  9. package/dist/agents/base/base-agent.d.ts.map +1 -0
  10. package/dist/agents/base/base-agent.js +69 -0
  11. package/dist/agents/base/base-agent.js.map +1 -0
  12. package/dist/agents/docs-search/index.d.ts +33 -0
  13. package/dist/agents/docs-search/index.d.ts.map +1 -0
  14. package/dist/agents/docs-search/index.js +244 -0
  15. package/dist/agents/docs-search/index.js.map +1 -0
  16. package/dist/agents/index.d.ts +4 -0
  17. package/dist/agents/index.d.ts.map +1 -0
  18. package/dist/agents/index.js +4 -0
  19. package/dist/agents/index.js.map +1 -0
  20. package/dist/agents/planner/index.d.ts +17 -0
  21. package/dist/agents/planner/index.d.ts.map +1 -0
  22. package/dist/agents/planner/index.js +250 -0
  23. package/dist/agents/planner/index.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +144 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/constants.d.ts +8 -0
  29. package/dist/constants.d.ts.map +1 -0
  30. package/dist/constants.js +10 -0
  31. package/dist/constants.js.map +1 -0
  32. package/dist/core/compact/compact-manager.d.ts +22 -0
  33. package/dist/core/compact/compact-manager.d.ts.map +1 -0
  34. package/dist/core/compact/compact-manager.js +75 -0
  35. package/dist/core/compact/compact-manager.js.map +1 -0
  36. package/dist/core/compact/compact-prompts.d.ts +11 -0
  37. package/dist/core/compact/compact-prompts.d.ts.map +1 -0
  38. package/dist/core/compact/compact-prompts.js +90 -0
  39. package/dist/core/compact/compact-prompts.js.map +1 -0
  40. package/dist/core/compact/context-tracker.d.ts +28 -0
  41. package/dist/core/compact/context-tracker.d.ts.map +1 -0
  42. package/dist/core/compact/context-tracker.js +71 -0
  43. package/dist/core/compact/context-tracker.js.map +1 -0
  44. package/dist/core/compact/index.d.ts +4 -0
  45. package/dist/core/compact/index.d.ts.map +1 -0
  46. package/dist/core/compact/index.js +4 -0
  47. package/dist/core/compact/index.js.map +1 -0
  48. package/dist/core/config/config-manager.d.ts +44 -0
  49. package/dist/core/config/config-manager.d.ts.map +1 -0
  50. package/dist/core/config/config-manager.js +259 -0
  51. package/dist/core/config/config-manager.js.map +1 -0
  52. package/dist/core/config/index.d.ts +2 -0
  53. package/dist/core/config/index.d.ts.map +1 -0
  54. package/dist/core/config/index.js +2 -0
  55. package/dist/core/config/index.js.map +1 -0
  56. package/dist/core/docs-manager.d.ts +46 -0
  57. package/dist/core/docs-manager.d.ts.map +1 -0
  58. package/dist/core/docs-manager.js +475 -0
  59. package/dist/core/docs-manager.js.map +1 -0
  60. package/dist/core/git-auto-updater.d.ts +58 -0
  61. package/dist/core/git-auto-updater.d.ts.map +1 -0
  62. package/dist/core/git-auto-updater.js +374 -0
  63. package/dist/core/git-auto-updater.js.map +1 -0
  64. package/dist/core/llm/index.d.ts +2 -0
  65. package/dist/core/llm/index.d.ts.map +1 -0
  66. package/dist/core/llm/index.js +2 -0
  67. package/dist/core/llm/index.js.map +1 -0
  68. package/dist/core/llm/llm-client.d.ts +97 -0
  69. package/dist/core/llm/llm-client.d.ts.map +1 -0
  70. package/dist/core/llm/llm-client.js +1000 -0
  71. package/dist/core/llm/llm-client.js.map +1 -0
  72. package/dist/core/session/index.d.ts +2 -0
  73. package/dist/core/session/index.d.ts.map +1 -0
  74. package/dist/core/session/index.js +2 -0
  75. package/dist/core/session/index.js.map +1 -0
  76. package/dist/core/session/session-manager.d.ts +71 -0
  77. package/dist/core/session/session-manager.d.ts.map +1 -0
  78. package/dist/core/session/session-manager.js +250 -0
  79. package/dist/core/session/session-manager.js.map +1 -0
  80. package/dist/core/slash-command-handler.d.ts +31 -0
  81. package/dist/core/slash-command-handler.d.ts.map +1 -0
  82. package/dist/core/slash-command-handler.js +302 -0
  83. package/dist/core/slash-command-handler.js.map +1 -0
  84. package/dist/core/usage-tracker.d.ts +70 -0
  85. package/dist/core/usage-tracker.d.ts.map +1 -0
  86. package/dist/core/usage-tracker.js +251 -0
  87. package/dist/core/usage-tracker.js.map +1 -0
  88. package/dist/errors/base.d.ts +22 -0
  89. package/dist/errors/base.d.ts.map +1 -0
  90. package/dist/errors/base.js +43 -0
  91. package/dist/errors/base.js.map +1 -0
  92. package/dist/errors/file.d.ts +31 -0
  93. package/dist/errors/file.d.ts.map +1 -0
  94. package/dist/errors/file.js +110 -0
  95. package/dist/errors/file.js.map +1 -0
  96. package/dist/errors/index.d.ts +10 -0
  97. package/dist/errors/index.d.ts.map +1 -0
  98. package/dist/errors/index.js +41 -0
  99. package/dist/errors/index.js.map +1 -0
  100. package/dist/errors/llm.d.ts +26 -0
  101. package/dist/errors/llm.d.ts.map +1 -0
  102. package/dist/errors/llm.js +86 -0
  103. package/dist/errors/llm.js.map +1 -0
  104. package/dist/errors/network.d.ts +19 -0
  105. package/dist/errors/network.d.ts.map +1 -0
  106. package/dist/errors/network.js +82 -0
  107. package/dist/errors/network.js.map +1 -0
  108. package/dist/errors/validation.d.ts +19 -0
  109. package/dist/errors/validation.d.ts.map +1 -0
  110. package/dist/errors/validation.js +62 -0
  111. package/dist/errors/validation.js.map +1 -0
  112. package/dist/eval/eval-runner.d.ts +24 -0
  113. package/dist/eval/eval-runner.d.ts.map +1 -0
  114. package/dist/eval/eval-runner.js +309 -0
  115. package/dist/eval/eval-runner.js.map +1 -0
  116. package/dist/eval/index.d.ts +3 -0
  117. package/dist/eval/index.d.ts.map +1 -0
  118. package/dist/eval/index.js +3 -0
  119. package/dist/eval/index.js.map +1 -0
  120. package/dist/eval/types.d.ts +77 -0
  121. package/dist/eval/types.d.ts.map +1 -0
  122. package/dist/eval/types.js +2 -0
  123. package/dist/eval/types.js.map +1 -0
  124. package/dist/index.d.ts +4 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +6 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/orchestration/index.d.ts +4 -0
  129. package/dist/orchestration/index.d.ts.map +1 -0
  130. package/dist/orchestration/index.js +3 -0
  131. package/dist/orchestration/index.js.map +1 -0
  132. package/dist/orchestration/plan-executor.d.ts +28 -0
  133. package/dist/orchestration/plan-executor.d.ts.map +1 -0
  134. package/dist/orchestration/plan-executor.js +382 -0
  135. package/dist/orchestration/plan-executor.js.map +1 -0
  136. package/dist/orchestration/types.d.ts +66 -0
  137. package/dist/orchestration/types.d.ts.map +1 -0
  138. package/dist/orchestration/types.js +2 -0
  139. package/dist/orchestration/types.js.map +1 -0
  140. package/dist/orchestration/utils.d.ts +13 -0
  141. package/dist/orchestration/utils.d.ts.map +1 -0
  142. package/dist/orchestration/utils.js +78 -0
  143. package/dist/orchestration/utils.js.map +1 -0
  144. package/dist/orquesta/connection.d.ts +35 -0
  145. package/dist/orquesta/connection.d.ts.map +1 -0
  146. package/dist/orquesta/connection.js +189 -0
  147. package/dist/orquesta/connection.js.map +1 -0
  148. package/dist/prompts/agents/docs-search-decision.d.ts +6 -0
  149. package/dist/prompts/agents/docs-search-decision.d.ts.map +1 -0
  150. package/dist/prompts/agents/docs-search-decision.js +46 -0
  151. package/dist/prompts/agents/docs-search-decision.js.map +1 -0
  152. package/dist/prompts/agents/docs-search.d.ts +4 -0
  153. package/dist/prompts/agents/docs-search.d.ts.map +1 -0
  154. package/dist/prompts/agents/docs-search.js +70 -0
  155. package/dist/prompts/agents/docs-search.js.map +1 -0
  156. package/dist/prompts/agents/planning.d.ts +4 -0
  157. package/dist/prompts/agents/planning.d.ts.map +1 -0
  158. package/dist/prompts/agents/planning.js +119 -0
  159. package/dist/prompts/agents/planning.js.map +1 -0
  160. package/dist/prompts/index.d.ts +10 -0
  161. package/dist/prompts/index.d.ts.map +1 -0
  162. package/dist/prompts/index.js +10 -0
  163. package/dist/prompts/index.js.map +1 -0
  164. package/dist/prompts/shared/codebase-rules.d.ts +4 -0
  165. package/dist/prompts/shared/codebase-rules.d.ts.map +1 -0
  166. package/dist/prompts/shared/codebase-rules.js +16 -0
  167. package/dist/prompts/shared/codebase-rules.js.map +1 -0
  168. package/dist/prompts/shared/git-rules.d.ts +2 -0
  169. package/dist/prompts/shared/git-rules.d.ts.map +1 -0
  170. package/dist/prompts/shared/git-rules.js +87 -0
  171. package/dist/prompts/shared/git-rules.js.map +1 -0
  172. package/dist/prompts/shared/language-rules.d.ts +4 -0
  173. package/dist/prompts/shared/language-rules.d.ts.map +1 -0
  174. package/dist/prompts/shared/language-rules.js +22 -0
  175. package/dist/prompts/shared/language-rules.js.map +1 -0
  176. package/dist/prompts/shared/tool-usage.d.ts +12 -0
  177. package/dist/prompts/shared/tool-usage.d.ts.map +1 -0
  178. package/dist/prompts/shared/tool-usage.js +51 -0
  179. package/dist/prompts/shared/tool-usage.js.map +1 -0
  180. package/dist/prompts/system/compact.d.ts +3 -0
  181. package/dist/prompts/system/compact.d.ts.map +1 -0
  182. package/dist/prompts/system/compact.js +73 -0
  183. package/dist/prompts/system/compact.js.map +1 -0
  184. package/dist/prompts/system/plan-execute.d.ts +3 -0
  185. package/dist/prompts/system/plan-execute.d.ts.map +1 -0
  186. package/dist/prompts/system/plan-execute.js +83 -0
  187. package/dist/prompts/system/plan-execute.js.map +1 -0
  188. package/dist/tools/browser/browser-client.d.ts +107 -0
  189. package/dist/tools/browser/browser-client.d.ts.map +1 -0
  190. package/dist/tools/browser/browser-client.js +958 -0
  191. package/dist/tools/browser/browser-client.js.map +1 -0
  192. package/dist/tools/browser/browser-tools.d.ts +17 -0
  193. package/dist/tools/browser/browser-tools.d.ts.map +1 -0
  194. package/dist/tools/browser/browser-tools.js +972 -0
  195. package/dist/tools/browser/browser-tools.js.map +1 -0
  196. package/dist/tools/browser/index.d.ts +7 -0
  197. package/dist/tools/browser/index.d.ts.map +1 -0
  198. package/dist/tools/browser/index.js +17 -0
  199. package/dist/tools/browser/index.js.map +1 -0
  200. package/dist/tools/index.d.ts +4 -0
  201. package/dist/tools/index.d.ts.map +1 -0
  202. package/dist/tools/index.js +4 -0
  203. package/dist/tools/index.js.map +1 -0
  204. package/dist/tools/llm/agents/docs-search-tools.d.ts +17 -0
  205. package/dist/tools/llm/agents/docs-search-tools.d.ts.map +1 -0
  206. package/dist/tools/llm/agents/docs-search-tools.js +265 -0
  207. package/dist/tools/llm/agents/docs-search-tools.js.map +1 -0
  208. package/dist/tools/llm/agents/index.d.ts +4 -0
  209. package/dist/tools/llm/agents/index.d.ts.map +1 -0
  210. package/dist/tools/llm/agents/index.js +3 -0
  211. package/dist/tools/llm/agents/index.js.map +1 -0
  212. package/dist/tools/llm/index.d.ts +3 -0
  213. package/dist/tools/llm/index.d.ts.map +1 -0
  214. package/dist/tools/llm/index.js +3 -0
  215. package/dist/tools/llm/index.js.map +1 -0
  216. package/dist/tools/llm/simple/ask-user-tool.d.ts +5 -0
  217. package/dist/tools/llm/simple/ask-user-tool.d.ts.map +1 -0
  218. package/dist/tools/llm/simple/ask-user-tool.js +7 -0
  219. package/dist/tools/llm/simple/ask-user-tool.js.map +1 -0
  220. package/dist/tools/llm/simple/background-bash-tool.d.ts +30 -0
  221. package/dist/tools/llm/simple/background-bash-tool.d.ts.map +1 -0
  222. package/dist/tools/llm/simple/background-bash-tool.js +323 -0
  223. package/dist/tools/llm/simple/background-bash-tool.js.map +1 -0
  224. package/dist/tools/llm/simple/background-powershell-tool.d.ts +30 -0
  225. package/dist/tools/llm/simple/background-powershell-tool.d.ts.map +1 -0
  226. package/dist/tools/llm/simple/background-powershell-tool.js +305 -0
  227. package/dist/tools/llm/simple/background-powershell-tool.js.map +1 -0
  228. package/dist/tools/llm/simple/bash-tool.d.ts +4 -0
  229. package/dist/tools/llm/simple/bash-tool.d.ts.map +1 -0
  230. package/dist/tools/llm/simple/bash-tool.js +178 -0
  231. package/dist/tools/llm/simple/bash-tool.js.map +1 -0
  232. package/dist/tools/llm/simple/docs-search-agent-tool.d.ts +6 -0
  233. package/dist/tools/llm/simple/docs-search-agent-tool.d.ts.map +1 -0
  234. package/dist/tools/llm/simple/docs-search-agent-tool.js +104 -0
  235. package/dist/tools/llm/simple/docs-search-agent-tool.js.map +1 -0
  236. package/dist/tools/llm/simple/file-tools.d.ts +13 -0
  237. package/dist/tools/llm/simple/file-tools.d.ts.map +1 -0
  238. package/dist/tools/llm/simple/file-tools.js +785 -0
  239. package/dist/tools/llm/simple/file-tools.js.map +1 -0
  240. package/dist/tools/llm/simple/final-response-tool.d.ts +12 -0
  241. package/dist/tools/llm/simple/final-response-tool.d.ts.map +1 -0
  242. package/dist/tools/llm/simple/final-response-tool.js +107 -0
  243. package/dist/tools/llm/simple/final-response-tool.js.map +1 -0
  244. package/dist/tools/llm/simple/index.d.ts +11 -0
  245. package/dist/tools/llm/simple/index.d.ts.map +1 -0
  246. package/dist/tools/llm/simple/index.js +20 -0
  247. package/dist/tools/llm/simple/index.js.map +1 -0
  248. package/dist/tools/llm/simple/planning-tools.d.ts +5 -0
  249. package/dist/tools/llm/simple/planning-tools.d.ts.map +1 -0
  250. package/dist/tools/llm/simple/planning-tools.js +117 -0
  251. package/dist/tools/llm/simple/planning-tools.js.map +1 -0
  252. package/dist/tools/llm/simple/powershell-tool.d.ts +4 -0
  253. package/dist/tools/llm/simple/powershell-tool.d.ts.map +1 -0
  254. package/dist/tools/llm/simple/powershell-tool.js +178 -0
  255. package/dist/tools/llm/simple/powershell-tool.js.map +1 -0
  256. package/dist/tools/llm/simple/simple-tool-executor.d.ts +38 -0
  257. package/dist/tools/llm/simple/simple-tool-executor.d.ts.map +1 -0
  258. package/dist/tools/llm/simple/simple-tool-executor.js +134 -0
  259. package/dist/tools/llm/simple/simple-tool-executor.js.map +1 -0
  260. package/dist/tools/llm/simple/todo-tools.d.ts +15 -0
  261. package/dist/tools/llm/simple/todo-tools.d.ts.map +1 -0
  262. package/dist/tools/llm/simple/todo-tools.js +145 -0
  263. package/dist/tools/llm/simple/todo-tools.js.map +1 -0
  264. package/dist/tools/llm/simple/user-interaction-tools.d.ts +22 -0
  265. package/dist/tools/llm/simple/user-interaction-tools.d.ts.map +1 -0
  266. package/dist/tools/llm/simple/user-interaction-tools.js +168 -0
  267. package/dist/tools/llm/simple/user-interaction-tools.js.map +1 -0
  268. package/dist/tools/office/common/constants.d.ts +194 -0
  269. package/dist/tools/office/common/constants.d.ts.map +1 -0
  270. package/dist/tools/office/common/constants.js +169 -0
  271. package/dist/tools/office/common/constants.js.map +1 -0
  272. package/dist/tools/office/common/index.d.ts +4 -0
  273. package/dist/tools/office/common/index.d.ts.map +1 -0
  274. package/dist/tools/office/common/index.js +3 -0
  275. package/dist/tools/office/common/index.js.map +1 -0
  276. package/dist/tools/office/common/types.d.ts +82 -0
  277. package/dist/tools/office/common/types.d.ts.map +1 -0
  278. package/dist/tools/office/common/types.js +2 -0
  279. package/dist/tools/office/common/types.js.map +1 -0
  280. package/dist/tools/office/common/utils.d.ts +14 -0
  281. package/dist/tools/office/common/utils.d.ts.map +1 -0
  282. package/dist/tools/office/common/utils.js +58 -0
  283. package/dist/tools/office/common/utils.js.map +1 -0
  284. package/dist/tools/office/excel-client.d.ts +123 -0
  285. package/dist/tools/office/excel-client.d.ts.map +1 -0
  286. package/dist/tools/office/excel-client.js +1037 -0
  287. package/dist/tools/office/excel-client.js.map +1 -0
  288. package/dist/tools/office/excel-tools/cells.d.ts +10 -0
  289. package/dist/tools/office/excel-tools/cells.d.ts.map +1 -0
  290. package/dist/tools/office/excel-tools/cells.js +279 -0
  291. package/dist/tools/office/excel-tools/cells.js.map +1 -0
  292. package/dist/tools/office/excel-tools/charts.d.ts +6 -0
  293. package/dist/tools/office/excel-tools/charts.d.ts.map +1 -0
  294. package/dist/tools/office/excel-tools/charts.js +124 -0
  295. package/dist/tools/office/excel-tools/charts.js.map +1 -0
  296. package/dist/tools/office/excel-tools/comments.d.ts +6 -0
  297. package/dist/tools/office/excel-tools/comments.d.ts.map +1 -0
  298. package/dist/tools/office/excel-tools/comments.js +114 -0
  299. package/dist/tools/office/excel-tools/comments.js.map +1 -0
  300. package/dist/tools/office/excel-tools/data-ops.d.ts +10 -0
  301. package/dist/tools/office/excel-tools/data-ops.d.ts.map +1 -0
  302. package/dist/tools/office/excel-tools/data-ops.js +266 -0
  303. package/dist/tools/office/excel-tools/data-ops.js.map +1 -0
  304. package/dist/tools/office/excel-tools/export.d.ts +5 -0
  305. package/dist/tools/office/excel-tools/export.d.ts.map +1 -0
  306. package/dist/tools/office/excel-tools/export.js +75 -0
  307. package/dist/tools/office/excel-tools/export.js.map +1 -0
  308. package/dist/tools/office/excel-tools/formatting.d.ts +10 -0
  309. package/dist/tools/office/excel-tools/formatting.d.ts.map +1 -0
  310. package/dist/tools/office/excel-tools/formatting.js +276 -0
  311. package/dist/tools/office/excel-tools/formatting.js.map +1 -0
  312. package/dist/tools/office/excel-tools/index.d.ts +16 -0
  313. package/dist/tools/office/excel-tools/index.d.ts.map +1 -0
  314. package/dist/tools/office/excel-tools/index.js +42 -0
  315. package/dist/tools/office/excel-tools/index.js.map +1 -0
  316. package/dist/tools/office/excel-tools/launch.d.ts +10 -0
  317. package/dist/tools/office/excel-tools/launch.d.ts.map +1 -0
  318. package/dist/tools/office/excel-tools/launch.js +248 -0
  319. package/dist/tools/office/excel-tools/launch.js.map +1 -0
  320. package/dist/tools/office/excel-tools/media.d.ts +5 -0
  321. package/dist/tools/office/excel-tools/media.d.ts.map +1 -0
  322. package/dist/tools/office/excel-tools/media.js +84 -0
  323. package/dist/tools/office/excel-tools/media.js.map +1 -0
  324. package/dist/tools/office/excel-tools/named-ranges.d.ts +6 -0
  325. package/dist/tools/office/excel-tools/named-ranges.d.ts.map +1 -0
  326. package/dist/tools/office/excel-tools/named-ranges.js +113 -0
  327. package/dist/tools/office/excel-tools/named-ranges.js.map +1 -0
  328. package/dist/tools/office/excel-tools/protection.d.ts +5 -0
  329. package/dist/tools/office/excel-tools/protection.d.ts.map +1 -0
  330. package/dist/tools/office/excel-tools/protection.js +75 -0
  331. package/dist/tools/office/excel-tools/protection.js.map +1 -0
  332. package/dist/tools/office/excel-tools/rows-columns.d.ts +11 -0
  333. package/dist/tools/office/excel-tools/rows-columns.d.ts.map +1 -0
  334. package/dist/tools/office/excel-tools/rows-columns.js +293 -0
  335. package/dist/tools/office/excel-tools/rows-columns.js.map +1 -0
  336. package/dist/tools/office/excel-tools/sheets.d.ts +8 -0
  337. package/dist/tools/office/excel-tools/sheets.d.ts.map +1 -0
  338. package/dist/tools/office/excel-tools/sheets.js +177 -0
  339. package/dist/tools/office/excel-tools/sheets.js.map +1 -0
  340. package/dist/tools/office/excel-tools/validation.d.ts +7 -0
  341. package/dist/tools/office/excel-tools/validation.d.ts.map +1 -0
  342. package/dist/tools/office/excel-tools/validation.js +175 -0
  343. package/dist/tools/office/excel-tools/validation.js.map +1 -0
  344. package/dist/tools/office/excel-tools.d.ts +3 -0
  345. package/dist/tools/office/excel-tools.d.ts.map +1 -0
  346. package/dist/tools/office/excel-tools.js +3 -0
  347. package/dist/tools/office/excel-tools.js.map +1 -0
  348. package/dist/tools/office/index.d.ts +6 -0
  349. package/dist/tools/office/index.d.ts.map +1 -0
  350. package/dist/tools/office/index.js +9 -0
  351. package/dist/tools/office/index.js.map +1 -0
  352. package/dist/tools/office/office-client-base.d.ts +31 -0
  353. package/dist/tools/office/office-client-base.d.ts.map +1 -0
  354. package/dist/tools/office/office-client-base.js +154 -0
  355. package/dist/tools/office/office-client-base.js.map +1 -0
  356. package/dist/tools/office/office-client.d.ts +196 -0
  357. package/dist/tools/office/office-client.d.ts.map +1 -0
  358. package/dist/tools/office/office-client.js +200 -0
  359. package/dist/tools/office/office-client.js.map +1 -0
  360. package/dist/tools/office/powerpoint-client.d.ts +135 -0
  361. package/dist/tools/office/powerpoint-client.d.ts.map +1 -0
  362. package/dist/tools/office/powerpoint-client.js +1136 -0
  363. package/dist/tools/office/powerpoint-client.js.map +1 -0
  364. package/dist/tools/office/powerpoint-tools/effects.d.ts +9 -0
  365. package/dist/tools/office/powerpoint-tools/effects.d.ts.map +1 -0
  366. package/dist/tools/office/powerpoint-tools/effects.js +246 -0
  367. package/dist/tools/office/powerpoint-tools/effects.js.map +1 -0
  368. package/dist/tools/office/powerpoint-tools/export.d.ts +6 -0
  369. package/dist/tools/office/powerpoint-tools/export.d.ts.map +1 -0
  370. package/dist/tools/office/powerpoint-tools/export.js +108 -0
  371. package/dist/tools/office/powerpoint-tools/export.js.map +1 -0
  372. package/dist/tools/office/powerpoint-tools/index.d.ts +13 -0
  373. package/dist/tools/office/powerpoint-tools/index.d.ts.map +1 -0
  374. package/dist/tools/office/powerpoint-tools/index.js +33 -0
  375. package/dist/tools/office/powerpoint-tools/index.js.map +1 -0
  376. package/dist/tools/office/powerpoint-tools/launch.d.ts +9 -0
  377. package/dist/tools/office/powerpoint-tools/launch.d.ts.map +1 -0
  378. package/dist/tools/office/powerpoint-tools/launch.js +214 -0
  379. package/dist/tools/office/powerpoint-tools/launch.js.map +1 -0
  380. package/dist/tools/office/powerpoint-tools/media.d.ts +8 -0
  381. package/dist/tools/office/powerpoint-tools/media.d.ts.map +1 -0
  382. package/dist/tools/office/powerpoint-tools/media.js +211 -0
  383. package/dist/tools/office/powerpoint-tools/media.js.map +1 -0
  384. package/dist/tools/office/powerpoint-tools/notes.d.ts +8 -0
  385. package/dist/tools/office/powerpoint-tools/notes.d.ts.map +1 -0
  386. package/dist/tools/office/powerpoint-tools/notes.js +171 -0
  387. package/dist/tools/office/powerpoint-tools/notes.js.map +1 -0
  388. package/dist/tools/office/powerpoint-tools/sections.d.ts +6 -0
  389. package/dist/tools/office/powerpoint-tools/sections.d.ts.map +1 -0
  390. package/dist/tools/office/powerpoint-tools/sections.js +104 -0
  391. package/dist/tools/office/powerpoint-tools/sections.js.map +1 -0
  392. package/dist/tools/office/powerpoint-tools/shapes.d.ts +22 -0
  393. package/dist/tools/office/powerpoint-tools/shapes.d.ts.map +1 -0
  394. package/dist/tools/office/powerpoint-tools/shapes.js +681 -0
  395. package/dist/tools/office/powerpoint-tools/shapes.js.map +1 -0
  396. package/dist/tools/office/powerpoint-tools/slides.d.ts +11 -0
  397. package/dist/tools/office/powerpoint-tools/slides.d.ts.map +1 -0
  398. package/dist/tools/office/powerpoint-tools/slides.js +283 -0
  399. package/dist/tools/office/powerpoint-tools/slides.js.map +1 -0
  400. package/dist/tools/office/powerpoint-tools/tables.d.ts +6 -0
  401. package/dist/tools/office/powerpoint-tools/tables.d.ts.map +1 -0
  402. package/dist/tools/office/powerpoint-tools/tables.js +132 -0
  403. package/dist/tools/office/powerpoint-tools/tables.js.map +1 -0
  404. package/dist/tools/office/powerpoint-tools/text.d.ts +12 -0
  405. package/dist/tools/office/powerpoint-tools/text.d.ts.map +1 -0
  406. package/dist/tools/office/powerpoint-tools/text.js +366 -0
  407. package/dist/tools/office/powerpoint-tools/text.js.map +1 -0
  408. package/dist/tools/office/powerpoint-tools.d.ts +3 -0
  409. package/dist/tools/office/powerpoint-tools.d.ts.map +1 -0
  410. package/dist/tools/office/powerpoint-tools.js +3 -0
  411. package/dist/tools/office/powerpoint-tools.js.map +1 -0
  412. package/dist/tools/office/word-client.d.ts +147 -0
  413. package/dist/tools/office/word-client.d.ts.map +1 -0
  414. package/dist/tools/office/word-client.js +1341 -0
  415. package/dist/tools/office/word-client.js.map +1 -0
  416. package/dist/tools/office/word-tools/bookmarks.d.ts +7 -0
  417. package/dist/tools/office/word-tools/bookmarks.d.ts.map +1 -0
  418. package/dist/tools/office/word-tools/bookmarks.js +146 -0
  419. package/dist/tools/office/word-tools/bookmarks.js.map +1 -0
  420. package/dist/tools/office/word-tools/comments.d.ts +7 -0
  421. package/dist/tools/office/word-tools/comments.d.ts.map +1 -0
  422. package/dist/tools/office/word-tools/comments.js +146 -0
  423. package/dist/tools/office/word-tools/comments.js.map +1 -0
  424. package/dist/tools/office/word-tools/content.d.ts +7 -0
  425. package/dist/tools/office/word-tools/content.d.ts.map +1 -0
  426. package/dist/tools/office/word-tools/content.js +168 -0
  427. package/dist/tools/office/word-tools/content.js.map +1 -0
  428. package/dist/tools/office/word-tools/export.d.ts +5 -0
  429. package/dist/tools/office/word-tools/export.d.ts.map +1 -0
  430. package/dist/tools/office/word-tools/export.js +73 -0
  431. package/dist/tools/office/word-tools/export.js.map +1 -0
  432. package/dist/tools/office/word-tools/formatting.d.ts +6 -0
  433. package/dist/tools/office/word-tools/formatting.d.ts.map +1 -0
  434. package/dist/tools/office/word-tools/formatting.js +129 -0
  435. package/dist/tools/office/word-tools/formatting.js.map +1 -0
  436. package/dist/tools/office/word-tools/headers-footers.d.ts +6 -0
  437. package/dist/tools/office/word-tools/headers-footers.d.ts.map +1 -0
  438. package/dist/tools/office/word-tools/headers-footers.js +117 -0
  439. package/dist/tools/office/word-tools/headers-footers.js.map +1 -0
  440. package/dist/tools/office/word-tools/index.d.ts +16 -0
  441. package/dist/tools/office/word-tools/index.d.ts.map +1 -0
  442. package/dist/tools/office/word-tools/index.js +45 -0
  443. package/dist/tools/office/word-tools/index.js.map +1 -0
  444. package/dist/tools/office/word-tools/launch.d.ts +10 -0
  445. package/dist/tools/office/word-tools/launch.d.ts.map +1 -0
  446. package/dist/tools/office/word-tools/launch.js +255 -0
  447. package/dist/tools/office/word-tools/launch.js.map +1 -0
  448. package/dist/tools/office/word-tools/lists.d.ts +5 -0
  449. package/dist/tools/office/word-tools/lists.d.ts.map +1 -0
  450. package/dist/tools/office/word-tools/lists.js +73 -0
  451. package/dist/tools/office/word-tools/lists.js.map +1 -0
  452. package/dist/tools/office/word-tools/navigation.d.ts +5 -0
  453. package/dist/tools/office/word-tools/navigation.d.ts.map +1 -0
  454. package/dist/tools/office/word-tools/navigation.js +85 -0
  455. package/dist/tools/office/word-tools/navigation.js.map +1 -0
  456. package/dist/tools/office/word-tools/page-setup.d.ts +7 -0
  457. package/dist/tools/office/word-tools/page-setup.d.ts.map +1 -0
  458. package/dist/tools/office/word-tools/page-setup.js +152 -0
  459. package/dist/tools/office/word-tools/page-setup.js.map +1 -0
  460. package/dist/tools/office/word-tools/tables.d.ts +8 -0
  461. package/dist/tools/office/word-tools/tables.d.ts.map +1 -0
  462. package/dist/tools/office/word-tools/tables.js +197 -0
  463. package/dist/tools/office/word-tools/tables.js.map +1 -0
  464. package/dist/tools/office/word-tools/text.d.ts +9 -0
  465. package/dist/tools/office/word-tools/text.d.ts.map +1 -0
  466. package/dist/tools/office/word-tools/text.js +235 -0
  467. package/dist/tools/office/word-tools/text.js.map +1 -0
  468. package/dist/tools/office/word-tools/undo-redo.d.ts +5 -0
  469. package/dist/tools/office/word-tools/undo-redo.d.ts.map +1 -0
  470. package/dist/tools/office/word-tools/undo-redo.js +73 -0
  471. package/dist/tools/office/word-tools/undo-redo.js.map +1 -0
  472. package/dist/tools/office/word-tools/watermarks.d.ts +5 -0
  473. package/dist/tools/office/word-tools/watermarks.d.ts.map +1 -0
  474. package/dist/tools/office/word-tools/watermarks.js +81 -0
  475. package/dist/tools/office/word-tools/watermarks.js.map +1 -0
  476. package/dist/tools/office/word-tools.d.ts +3 -0
  477. package/dist/tools/office/word-tools.d.ts.map +1 -0
  478. package/dist/tools/office/word-tools.js +3 -0
  479. package/dist/tools/office/word-tools.js.map +1 -0
  480. package/dist/tools/registry.d.ts +53 -0
  481. package/dist/tools/registry.d.ts.map +1 -0
  482. package/dist/tools/registry.js +278 -0
  483. package/dist/tools/registry.js.map +1 -0
  484. package/dist/tools/types.d.ts +88 -0
  485. package/dist/tools/types.d.ts.map +1 -0
  486. package/dist/tools/types.js +19 -0
  487. package/dist/tools/types.js.map +1 -0
  488. package/dist/types/index.d.ts +126 -0
  489. package/dist/types/index.d.ts.map +1 -0
  490. package/dist/types/index.js +2 -0
  491. package/dist/types/index.js.map +1 -0
  492. package/dist/ui/PlanExecuteView.d.ts +11 -0
  493. package/dist/ui/PlanExecuteView.d.ts.map +1 -0
  494. package/dist/ui/PlanExecuteView.js +29 -0
  495. package/dist/ui/PlanExecuteView.js.map +1 -0
  496. package/dist/ui/TodoPanel.d.ts +13 -0
  497. package/dist/ui/TodoPanel.d.ts.map +1 -0
  498. package/dist/ui/TodoPanel.js +135 -0
  499. package/dist/ui/TodoPanel.js.map +1 -0
  500. package/dist/ui/UpdateNotification.d.ts +13 -0
  501. package/dist/ui/UpdateNotification.d.ts.map +1 -0
  502. package/dist/ui/UpdateNotification.js +42 -0
  503. package/dist/ui/UpdateNotification.js.map +1 -0
  504. package/dist/ui/components/ActivityIndicator.d.ts +25 -0
  505. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
  506. package/dist/ui/components/ActivityIndicator.js +115 -0
  507. package/dist/ui/components/ActivityIndicator.js.map +1 -0
  508. package/dist/ui/components/CommandBrowser.d.ts +10 -0
  509. package/dist/ui/components/CommandBrowser.d.ts.map +1 -0
  510. package/dist/ui/components/CommandBrowser.js +53 -0
  511. package/dist/ui/components/CommandBrowser.js.map +1 -0
  512. package/dist/ui/components/CustomTextInput.d.ts +13 -0
  513. package/dist/ui/components/CustomTextInput.d.ts.map +1 -0
  514. package/dist/ui/components/CustomTextInput.js +245 -0
  515. package/dist/ui/components/CustomTextInput.js.map +1 -0
  516. package/dist/ui/components/DocsSearchProgress.d.ts +13 -0
  517. package/dist/ui/components/DocsSearchProgress.d.ts.map +1 -0
  518. package/dist/ui/components/DocsSearchProgress.js +37 -0
  519. package/dist/ui/components/DocsSearchProgress.js.map +1 -0
  520. package/dist/ui/components/FileBrowser.d.ts +11 -0
  521. package/dist/ui/components/FileBrowser.d.ts.map +1 -0
  522. package/dist/ui/components/FileBrowser.js +45 -0
  523. package/dist/ui/components/FileBrowser.js.map +1 -0
  524. package/dist/ui/components/LLMSetupWizard.d.ts +8 -0
  525. package/dist/ui/components/LLMSetupWizard.d.ts.map +1 -0
  526. package/dist/ui/components/LLMSetupWizard.js +192 -0
  527. package/dist/ui/components/LLMSetupWizard.js.map +1 -0
  528. package/dist/ui/components/Logo.d.ts +19 -0
  529. package/dist/ui/components/Logo.d.ts.map +1 -0
  530. package/dist/ui/components/Logo.js +55 -0
  531. package/dist/ui/components/Logo.js.map +1 -0
  532. package/dist/ui/components/MarkdownRenderer.d.ts +9 -0
  533. package/dist/ui/components/MarkdownRenderer.d.ts.map +1 -0
  534. package/dist/ui/components/MarkdownRenderer.js +198 -0
  535. package/dist/ui/components/MarkdownRenderer.js.map +1 -0
  536. package/dist/ui/components/ModelSelector.d.ts +8 -0
  537. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  538. package/dist/ui/components/ModelSelector.js +111 -0
  539. package/dist/ui/components/ModelSelector.js.map +1 -0
  540. package/dist/ui/components/PlanExecuteApp.d.ts +23 -0
  541. package/dist/ui/components/PlanExecuteApp.d.ts.map +1 -0
  542. package/dist/ui/components/PlanExecuteApp.js +1324 -0
  543. package/dist/ui/components/PlanExecuteApp.js.map +1 -0
  544. package/dist/ui/components/ProgressBar.d.ts +10 -0
  545. package/dist/ui/components/ProgressBar.d.ts.map +1 -0
  546. package/dist/ui/components/ProgressBar.js +26 -0
  547. package/dist/ui/components/ProgressBar.js.map +1 -0
  548. package/dist/ui/components/StatusBar.d.ts +23 -0
  549. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  550. package/dist/ui/components/StatusBar.js +162 -0
  551. package/dist/ui/components/StatusBar.js.map +1 -0
  552. package/dist/ui/components/ThinkingIndicator.d.ts +14 -0
  553. package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -0
  554. package/dist/ui/components/ThinkingIndicator.js +63 -0
  555. package/dist/ui/components/ThinkingIndicator.js.map +1 -0
  556. package/dist/ui/components/TodoListView.d.ts +11 -0
  557. package/dist/ui/components/TodoListView.d.ts.map +1 -0
  558. package/dist/ui/components/TodoListView.js +69 -0
  559. package/dist/ui/components/TodoListView.js.map +1 -0
  560. package/dist/ui/components/ToolSelector.d.ts +7 -0
  561. package/dist/ui/components/ToolSelector.d.ts.map +1 -0
  562. package/dist/ui/components/ToolSelector.js +111 -0
  563. package/dist/ui/components/ToolSelector.js.map +1 -0
  564. package/dist/ui/components/dialogs/ApprovalDialog.d.ts +13 -0
  565. package/dist/ui/components/dialogs/ApprovalDialog.d.ts.map +1 -0
  566. package/dist/ui/components/dialogs/ApprovalDialog.js +173 -0
  567. package/dist/ui/components/dialogs/ApprovalDialog.js.map +1 -0
  568. package/dist/ui/components/dialogs/AskUserDialog.d.ts +9 -0
  569. package/dist/ui/components/dialogs/AskUserDialog.d.ts.map +1 -0
  570. package/dist/ui/components/dialogs/AskUserDialog.js +111 -0
  571. package/dist/ui/components/dialogs/AskUserDialog.js.map +1 -0
  572. package/dist/ui/components/dialogs/DocsBrowser.d.ts +8 -0
  573. package/dist/ui/components/dialogs/DocsBrowser.d.ts.map +1 -0
  574. package/dist/ui/components/dialogs/DocsBrowser.js +127 -0
  575. package/dist/ui/components/dialogs/DocsBrowser.js.map +1 -0
  576. package/dist/ui/components/dialogs/SettingsDialog.d.ts +10 -0
  577. package/dist/ui/components/dialogs/SettingsDialog.d.ts.map +1 -0
  578. package/dist/ui/components/dialogs/SettingsDialog.js +563 -0
  579. package/dist/ui/components/dialogs/SettingsDialog.js.map +1 -0
  580. package/dist/ui/components/dialogs/index.d.ts +4 -0
  581. package/dist/ui/components/dialogs/index.d.ts.map +1 -0
  582. package/dist/ui/components/dialogs/index.js +4 -0
  583. package/dist/ui/components/dialogs/index.js.map +1 -0
  584. package/dist/ui/components/index.d.ts +12 -0
  585. package/dist/ui/components/index.d.ts.map +1 -0
  586. package/dist/ui/components/index.js +9 -0
  587. package/dist/ui/components/index.js.map +1 -0
  588. package/dist/ui/components/panels/LogPanel.d.ts +7 -0
  589. package/dist/ui/components/panels/LogPanel.d.ts.map +1 -0
  590. package/dist/ui/components/panels/LogPanel.js +280 -0
  591. package/dist/ui/components/panels/LogPanel.js.map +1 -0
  592. package/dist/ui/components/panels/SessionPanel.d.ts +8 -0
  593. package/dist/ui/components/panels/SessionPanel.d.ts.map +1 -0
  594. package/dist/ui/components/panels/SessionPanel.js +81 -0
  595. package/dist/ui/components/panels/SessionPanel.js.map +1 -0
  596. package/dist/ui/components/panels/index.d.ts +4 -0
  597. package/dist/ui/components/panels/index.d.ts.map +1 -0
  598. package/dist/ui/components/panels/index.js +4 -0
  599. package/dist/ui/components/panels/index.js.map +1 -0
  600. package/dist/ui/components/views/ChatView.d.ts +12 -0
  601. package/dist/ui/components/views/ChatView.d.ts.map +1 -0
  602. package/dist/ui/components/views/ChatView.js +289 -0
  603. package/dist/ui/components/views/ChatView.js.map +1 -0
  604. package/dist/ui/components/views/index.d.ts +2 -0
  605. package/dist/ui/components/views/index.d.ts.map +1 -0
  606. package/dist/ui/components/views/index.js +2 -0
  607. package/dist/ui/components/views/index.js.map +1 -0
  608. package/dist/ui/contexts/TokenContext.d.ts +29 -0
  609. package/dist/ui/contexts/TokenContext.d.ts.map +1 -0
  610. package/dist/ui/contexts/TokenContext.js +79 -0
  611. package/dist/ui/contexts/TokenContext.js.map +1 -0
  612. package/dist/ui/hooks/atFileProcessor.d.ts +15 -0
  613. package/dist/ui/hooks/atFileProcessor.d.ts.map +1 -0
  614. package/dist/ui/hooks/atFileProcessor.js +88 -0
  615. package/dist/ui/hooks/atFileProcessor.js.map +1 -0
  616. package/dist/ui/hooks/index.d.ts +8 -0
  617. package/dist/ui/hooks/index.d.ts.map +1 -0
  618. package/dist/ui/hooks/index.js +8 -0
  619. package/dist/ui/hooks/index.js.map +1 -0
  620. package/dist/ui/hooks/slashCommandProcessor.d.ts +21 -0
  621. package/dist/ui/hooks/slashCommandProcessor.d.ts.map +1 -0
  622. package/dist/ui/hooks/slashCommandProcessor.js +100 -0
  623. package/dist/ui/hooks/slashCommandProcessor.js.map +1 -0
  624. package/dist/ui/hooks/useCommandBrowserState.d.ts +12 -0
  625. package/dist/ui/hooks/useCommandBrowserState.d.ts.map +1 -0
  626. package/dist/ui/hooks/useCommandBrowserState.js +66 -0
  627. package/dist/ui/hooks/useCommandBrowserState.js.map +1 -0
  628. package/dist/ui/hooks/useFileBrowserState.d.ts +15 -0
  629. package/dist/ui/hooks/useFileBrowserState.d.ts.map +1 -0
  630. package/dist/ui/hooks/useFileBrowserState.js +80 -0
  631. package/dist/ui/hooks/useFileBrowserState.js.map +1 -0
  632. package/dist/ui/hooks/useFileList.d.ts +20 -0
  633. package/dist/ui/hooks/useFileList.d.ts.map +1 -0
  634. package/dist/ui/hooks/useFileList.js +57 -0
  635. package/dist/ui/hooks/useFileList.js.map +1 -0
  636. package/dist/ui/hooks/useInputHistory.d.ts +9 -0
  637. package/dist/ui/hooks/useInputHistory.d.ts.map +1 -0
  638. package/dist/ui/hooks/useInputHistory.js +68 -0
  639. package/dist/ui/hooks/useInputHistory.js.map +1 -0
  640. package/dist/ui/hooks/usePlanExecution.d.ts +8 -0
  641. package/dist/ui/hooks/usePlanExecution.d.ts.map +1 -0
  642. package/dist/ui/hooks/usePlanExecution.js +214 -0
  643. package/dist/ui/hooks/usePlanExecution.js.map +1 -0
  644. package/dist/ui/index.d.ts +7 -0
  645. package/dist/ui/index.d.ts.map +1 -0
  646. package/dist/ui/index.js +7 -0
  647. package/dist/ui/index.js.map +1 -0
  648. package/dist/ui/ink-entry.d.ts +3 -0
  649. package/dist/ui/ink-entry.d.ts.map +1 -0
  650. package/dist/ui/ink-entry.js +22 -0
  651. package/dist/ui/ink-entry.js.map +1 -0
  652. package/dist/utils/env-filter.d.ts +4 -0
  653. package/dist/utils/env-filter.d.ts.map +1 -0
  654. package/dist/utils/env-filter.js +101 -0
  655. package/dist/utils/env-filter.js.map +1 -0
  656. package/dist/utils/file-system.d.ts +9 -0
  657. package/dist/utils/file-system.d.ts.map +1 -0
  658. package/dist/utils/file-system.js +99 -0
  659. package/dist/utils/file-system.js.map +1 -0
  660. package/dist/utils/git-utils.d.ts +2 -0
  661. package/dist/utils/git-utils.d.ts.map +1 -0
  662. package/dist/utils/git-utils.js +16 -0
  663. package/dist/utils/git-utils.js.map +1 -0
  664. package/dist/utils/json-stream-logger.d.ts +74 -0
  665. package/dist/utils/json-stream-logger.d.ts.map +1 -0
  666. package/dist/utils/json-stream-logger.js +808 -0
  667. package/dist/utils/json-stream-logger.js.map +1 -0
  668. package/dist/utils/logger.d.ts +152 -0
  669. package/dist/utils/logger.d.ts.map +1 -0
  670. package/dist/utils/logger.js +1672 -0
  671. package/dist/utils/logger.js.map +1 -0
  672. package/dist/utils/platform-utils.d.ts +19 -0
  673. package/dist/utils/platform-utils.d.ts.map +1 -0
  674. package/dist/utils/platform-utils.js +134 -0
  675. package/dist/utils/platform-utils.js.map +1 -0
  676. package/dist/utils/wsl-utils.d.ts +4 -0
  677. package/dist/utils/wsl-utils.d.ts.map +1 -0
  678. package/dist/utils/wsl-utils.js +72 -0
  679. package/dist/utils/wsl-utils.js.map +1 -0
  680. package/electron.vite.config.ts +63 -0
  681. package/google374b9eba0c52b043.html +1 -0
  682. package/package.json +122 -0
  683. package/src/agents/base/base-agent.ts +159 -0
  684. package/src/agents/docs-search/index.ts +365 -0
  685. package/src/agents/index.ts +34 -0
  686. package/src/agents/planner/index.ts +544 -0
  687. package/src/cli.ts +201 -0
  688. package/src/constants.ts +47 -0
  689. package/src/core/compact/compact-manager.ts +160 -0
  690. package/src/core/compact/compact-prompts.ts +150 -0
  691. package/src/core/compact/context-tracker.ts +164 -0
  692. package/src/core/compact/index.ts +25 -0
  693. package/src/core/config/config-manager.ts +460 -0
  694. package/src/core/config/index.ts +5 -0
  695. package/src/core/docs-manager.ts +678 -0
  696. package/src/core/llm/index.ts +7 -0
  697. package/src/core/llm/llm-client.ts +1550 -0
  698. package/src/core/session/index.ts +5 -0
  699. package/src/core/session/session-manager.ts +464 -0
  700. package/src/core/slash-command-handler.ts +410 -0
  701. package/src/core/usage-tracker.ts +438 -0
  702. package/src/errors/base.ts +81 -0
  703. package/src/errors/file.ts +183 -0
  704. package/src/errors/index.ts +95 -0
  705. package/src/errors/llm.ts +151 -0
  706. package/src/errors/network.ts +124 -0
  707. package/src/errors/validation.ts +111 -0
  708. package/src/eval/eval-runner.ts +456 -0
  709. package/src/eval/index.ts +8 -0
  710. package/src/eval/types.ts +139 -0
  711. package/src/index.ts +22 -0
  712. package/src/orchestration/index.ts +30 -0
  713. package/src/orchestration/plan-executor.ts +652 -0
  714. package/src/orchestration/types.ts +127 -0
  715. package/src/orchestration/utils.ts +119 -0
  716. package/src/orquesta/connection.ts +291 -0
  717. package/src/prompts/agents/docs-search-decision.ts +74 -0
  718. package/src/prompts/agents/docs-search.ts +84 -0
  719. package/src/prompts/agents/planning.ts +143 -0
  720. package/src/prompts/index.ts +31 -0
  721. package/src/prompts/shared/codebase-rules.ts +29 -0
  722. package/src/prompts/shared/git-rules.ts +94 -0
  723. package/src/prompts/shared/language-rules.ts +36 -0
  724. package/src/prompts/shared/tool-usage.ts +72 -0
  725. package/src/prompts/system/compact.ts +80 -0
  726. package/src/prompts/system/plan-execute.ts +89 -0
  727. package/src/tools/browser/browser-client.ts +1363 -0
  728. package/src/tools/browser/browser-tools.ts +1139 -0
  729. package/src/tools/browser/index.ts +65 -0
  730. package/src/tools/index.ts +23 -0
  731. package/src/tools/llm/agents/docs-search-tools.ts +368 -0
  732. package/src/tools/llm/agents/index.ts +22 -0
  733. package/src/tools/llm/index.ts +11 -0
  734. package/src/tools/llm/simple/ask-user-tool.ts +25 -0
  735. package/src/tools/llm/simple/background-bash-tool.ts +443 -0
  736. package/src/tools/llm/simple/background-powershell-tool.ts +421 -0
  737. package/src/tools/llm/simple/bash-tool.ts +238 -0
  738. package/src/tools/llm/simple/docs-search-agent-tool.ts +146 -0
  739. package/src/tools/llm/simple/file-tools.ts +1051 -0
  740. package/src/tools/llm/simple/final-response-tool.ts +180 -0
  741. package/src/tools/llm/simple/index.ts +42 -0
  742. package/src/tools/llm/simple/planning-tools.ts +143 -0
  743. package/src/tools/llm/simple/powershell-tool.ts +241 -0
  744. package/src/tools/llm/simple/simple-tool-executor.ts +279 -0
  745. package/src/tools/llm/simple/todo-tools.ts +207 -0
  746. package/src/tools/llm/simple/user-interaction-tools.ts +277 -0
  747. package/src/tools/office/common/constants.ts +335 -0
  748. package/src/tools/office/common/index.ts +133 -0
  749. package/src/tools/office/common/types.ts +286 -0
  750. package/src/tools/office/common/utils.ts +116 -0
  751. package/src/tools/office/excel-client.ts +1336 -0
  752. package/src/tools/office/excel-tools/cells.ts +359 -0
  753. package/src/tools/office/excel-tools/charts.ts +166 -0
  754. package/src/tools/office/excel-tools/comments.ts +155 -0
  755. package/src/tools/office/excel-tools/data-ops.ts +349 -0
  756. package/src/tools/office/excel-tools/export.ts +105 -0
  757. package/src/tools/office/excel-tools/formatting.ts +357 -0
  758. package/src/tools/office/excel-tools/index.ts +55 -0
  759. package/src/tools/office/excel-tools/launch.ts +303 -0
  760. package/src/tools/office/excel-tools/media.ts +117 -0
  761. package/src/tools/office/excel-tools/named-ranges.ts +148 -0
  762. package/src/tools/office/excel-tools/protection.ts +105 -0
  763. package/src/tools/office/excel-tools/rows-columns.ts +386 -0
  764. package/src/tools/office/excel-tools/sheets.ts +228 -0
  765. package/src/tools/office/excel-tools/validation.ts +226 -0
  766. package/src/tools/office/excel-tools.ts +9 -0
  767. package/src/tools/office/index.ts +259 -0
  768. package/src/tools/office/office-client-base.ts +242 -0
  769. package/src/tools/office/office-client.ts +377 -0
  770. package/src/tools/office/powerpoint-client.ts +1498 -0
  771. package/src/tools/office/powerpoint-tools/effects.ts +315 -0
  772. package/src/tools/office/powerpoint-tools/export.ts +138 -0
  773. package/src/tools/office/powerpoint-tools/index.ts +45 -0
  774. package/src/tools/office/powerpoint-tools/launch.ts +263 -0
  775. package/src/tools/office/powerpoint-tools/media.ts +291 -0
  776. package/src/tools/office/powerpoint-tools/notes.ts +220 -0
  777. package/src/tools/office/powerpoint-tools/sections.ts +140 -0
  778. package/src/tools/office/powerpoint-tools/shapes.ts +870 -0
  779. package/src/tools/office/powerpoint-tools/slides.ts +350 -0
  780. package/src/tools/office/powerpoint-tools/tables.ts +182 -0
  781. package/src/tools/office/powerpoint-tools/text.ts +473 -0
  782. package/src/tools/office/powerpoint-tools.ts +9 -0
  783. package/src/tools/office/word-client.ts +1697 -0
  784. package/src/tools/office/word-tools/bookmarks.ts +186 -0
  785. package/src/tools/office/word-tools/comments.ts +185 -0
  786. package/src/tools/office/word-tools/content.ts +229 -0
  787. package/src/tools/office/word-tools/export.ts +97 -0
  788. package/src/tools/office/word-tools/formatting.ts +161 -0
  789. package/src/tools/office/word-tools/headers-footers.ts +155 -0
  790. package/src/tools/office/word-tools/index.ts +57 -0
  791. package/src/tools/office/word-tools/launch.ts +312 -0
  792. package/src/tools/office/word-tools/lists.ts +97 -0
  793. package/src/tools/office/word-tools/navigation.ts +114 -0
  794. package/src/tools/office/word-tools/page-setup.ts +195 -0
  795. package/src/tools/office/word-tools/tables.ts +262 -0
  796. package/src/tools/office/word-tools/text.ts +294 -0
  797. package/src/tools/office/word-tools/undo-redo.ts +97 -0
  798. package/src/tools/office/word-tools/watermarks.ts +105 -0
  799. package/src/tools/office/word-tools.ts +9 -0
  800. package/src/tools/registry.ts +527 -0
  801. package/src/tools/types.ts +231 -0
  802. package/src/types/index.ts +181 -0
  803. package/src/ui/PlanExecuteView.tsx +119 -0
  804. package/src/ui/TodoPanel.tsx +240 -0
  805. package/src/ui/UpdateNotification.tsx +105 -0
  806. package/src/ui/components/ActivityIndicator.tsx +234 -0
  807. package/src/ui/components/CommandBrowser.tsx +114 -0
  808. package/src/ui/components/CustomTextInput.tsx +389 -0
  809. package/src/ui/components/DocsSearchProgress.tsx +85 -0
  810. package/src/ui/components/FileBrowser.tsx +93 -0
  811. package/src/ui/components/LLMSetupWizard.tsx +333 -0
  812. package/src/ui/components/Logo.tsx +125 -0
  813. package/src/ui/components/MarkdownRenderer.tsx +358 -0
  814. package/src/ui/components/ModelSelector.tsx +203 -0
  815. package/src/ui/components/PlanExecuteApp.tsx +2007 -0
  816. package/src/ui/components/ProgressBar.tsx +51 -0
  817. package/src/ui/components/StatusBar.tsx +302 -0
  818. package/src/ui/components/ThinkingIndicator.tsx +120 -0
  819. package/src/ui/components/TodoListView.tsx +140 -0
  820. package/src/ui/components/ToolSelector.tsx +215 -0
  821. package/src/ui/components/dialogs/ApprovalDialog.tsx +259 -0
  822. package/src/ui/components/dialogs/AskUserDialog.tsx +159 -0
  823. package/src/ui/components/dialogs/DocsBrowser.tsx +222 -0
  824. package/src/ui/components/dialogs/SettingsDialog.tsx +939 -0
  825. package/src/ui/components/dialogs/index.ts +13 -0
  826. package/src/ui/components/index.ts +27 -0
  827. package/src/ui/components/panels/LogPanel.tsx +385 -0
  828. package/src/ui/components/panels/SessionPanel.tsx +146 -0
  829. package/src/ui/components/panels/index.ts +13 -0
  830. package/src/ui/components/views/ChatView.tsx +447 -0
  831. package/src/ui/components/views/index.ts +5 -0
  832. package/src/ui/contexts/TokenContext.tsx +139 -0
  833. package/src/ui/hooks/atFileProcessor.ts +167 -0
  834. package/src/ui/hooks/index.ts +11 -0
  835. package/src/ui/hooks/slashCommandProcessor.ts +174 -0
  836. package/src/ui/hooks/useCommandBrowserState.ts +97 -0
  837. package/src/ui/hooks/useFileBrowserState.ts +116 -0
  838. package/src/ui/hooks/useFileList.ts +132 -0
  839. package/src/ui/hooks/useInputHistory.ts +89 -0
  840. package/src/ui/hooks/usePlanExecution.ts +339 -0
  841. package/src/ui/index.ts +10 -0
  842. package/src/ui/ink-entry.tsx +36 -0
  843. package/src/utils/env-filter.ts +164 -0
  844. package/src/utils/file-system.ts +133 -0
  845. package/src/utils/git-utils.ts +30 -0
  846. package/src/utils/json-stream-logger.ts +1259 -0
  847. package/src/utils/logger.ts +2767 -0
  848. package/src/utils/platform-utils.ts +256 -0
  849. package/src/utils/wsl-utils.ts +113 -0
  850. package/tsconfig.electron.json +39 -0
  851. package/tsconfig.json +64 -0
@@ -0,0 +1,1363 @@
1
+ /**
2
+ * Browser Automation Client (Pure CDP approach)
3
+ *
4
+ * Launches Chrome with CDP port via PowerShell,
5
+ * and controls the browser by directly connecting to CDP (Chrome DevTools Protocol) via WebSocket.
6
+ *
7
+ * Works without external dependencies (no playwright required).
8
+ */
9
+
10
+ import { spawn, ChildProcess, execSync } from 'child_process';
11
+ import * as path from 'path';
12
+ import * as fs from 'fs';
13
+ import WebSocket from 'ws';
14
+ import { logger } from '../../utils/logger.js';
15
+ import { LOCAL_HOME_DIR } from '../../constants.js';
16
+ import {
17
+ getPlatform,
18
+ getPowerShellPath,
19
+ Platform,
20
+ } from '../../utils/platform-utils.js';
21
+
22
+ // ===========================================================================
23
+ // Types
24
+ // ===========================================================================
25
+
26
+ interface BrowserResponse {
27
+ success: boolean;
28
+ message?: string;
29
+ error?: string;
30
+ details?: string;
31
+ [key: string]: unknown;
32
+ }
33
+
34
+ interface HealthResponse extends BrowserResponse {
35
+ status: string;
36
+ version: string;
37
+ browser: {
38
+ active: boolean;
39
+ type: string | null;
40
+ chrome_available: boolean;
41
+ edge_available: boolean;
42
+ };
43
+ }
44
+
45
+ interface ScreenshotResponse extends BrowserResponse {
46
+ image?: string;
47
+ format?: string;
48
+ encoding?: string;
49
+ url?: string;
50
+ title?: string;
51
+ }
52
+
53
+ interface NavigateResponse extends BrowserResponse {
54
+ url?: string;
55
+ title?: string;
56
+ }
57
+
58
+ interface PageInfoResponse extends BrowserResponse {
59
+ url?: string;
60
+ title?: string;
61
+ html?: string;
62
+ }
63
+
64
+ interface ConsoleLogEntry {
65
+ level: string;
66
+ message: string;
67
+ timestamp: number;
68
+ }
69
+
70
+ interface ConsoleResponse extends BrowserResponse {
71
+ logs?: ConsoleLogEntry[];
72
+ count?: number;
73
+ }
74
+
75
+ interface NetworkLogEntry {
76
+ type: 'request' | 'response';
77
+ url: string;
78
+ method?: string;
79
+ status?: number;
80
+ statusText?: string;
81
+ mimeType?: string;
82
+ timestamp: number;
83
+ requestId: string;
84
+ }
85
+
86
+ interface NetworkResponse extends BrowserResponse {
87
+ logs?: NetworkLogEntry[];
88
+ count?: number;
89
+ }
90
+
91
+ // CDP Protocol types
92
+ interface CDPTarget {
93
+ id: string;
94
+ type: string;
95
+ title: string;
96
+ url: string;
97
+ webSocketDebuggerUrl: string;
98
+ }
99
+
100
+ interface CDPMessage {
101
+ id: number;
102
+ method?: string;
103
+ params?: Record<string, unknown>;
104
+ result?: unknown;
105
+ error?: {
106
+ code: number;
107
+ message: string;
108
+ };
109
+ }
110
+
111
+ // ===========================================================================
112
+ // CDP Client (WebSocket-based)
113
+ // ===========================================================================
114
+
115
+ class CDPConnection {
116
+ private ws: WebSocket | null = null;
117
+ private messageId: number = 0;
118
+ private pendingMessages: Map<number, {
119
+ resolve: (value: unknown) => void;
120
+ reject: (error: Error) => void;
121
+ }> = new Map();
122
+ private eventHandlers: Map<string, ((params: unknown) => void)[]> = new Map();
123
+
124
+ async connect(wsUrl: string): Promise<void> {
125
+ return new Promise((resolve, reject) => {
126
+ this.ws = new WebSocket(wsUrl);
127
+
128
+ this.ws.on('open', () => {
129
+ logger.debug('[CDP] WebSocket connected');
130
+ resolve();
131
+ });
132
+
133
+ this.ws.on('message', (data: WebSocket.Data) => {
134
+ try {
135
+ const message: CDPMessage = JSON.parse(data.toString());
136
+
137
+ if (message.id !== undefined) {
138
+ // Response to a command
139
+ const pending = this.pendingMessages.get(message.id);
140
+ if (pending) {
141
+ this.pendingMessages.delete(message.id);
142
+ if (message.error) {
143
+ pending.reject(new Error(message.error.message));
144
+ } else {
145
+ pending.resolve(message.result);
146
+ }
147
+ }
148
+ } else if (message.method) {
149
+ // Event from browser
150
+ const handlers = this.eventHandlers.get(message.method) || [];
151
+ for (const handler of handlers) {
152
+ handler(message.params);
153
+ }
154
+ }
155
+ } catch (e) {
156
+ logger.debug('[CDP] Failed to parse message: ' + e);
157
+ }
158
+ });
159
+
160
+ this.ws.on('error', (error) => {
161
+ logger.debug('[CDP] WebSocket error: ' + error.message);
162
+ reject(error);
163
+ });
164
+
165
+ this.ws.on('close', () => {
166
+ logger.debug('[CDP] WebSocket closed');
167
+ // Reject all pending messages
168
+ for (const [, pending] of this.pendingMessages) {
169
+ pending.reject(new Error('WebSocket closed'));
170
+ }
171
+ this.pendingMessages.clear();
172
+ });
173
+ });
174
+ }
175
+
176
+ async send(method: string, params?: Record<string, unknown>): Promise<unknown> {
177
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
178
+ throw new Error('WebSocket not connected');
179
+ }
180
+
181
+ const id = ++this.messageId;
182
+ const message: CDPMessage = { id, method, params };
183
+
184
+ return new Promise((resolve, reject) => {
185
+ this.pendingMessages.set(id, { resolve, reject });
186
+ this.ws!.send(JSON.stringify(message));
187
+
188
+ // Timeout after 30 seconds
189
+ setTimeout(() => {
190
+ if (this.pendingMessages.has(id)) {
191
+ this.pendingMessages.delete(id);
192
+ reject(new Error(`CDP command timeout: ${method}`));
193
+ }
194
+ }, 30000);
195
+ });
196
+ }
197
+
198
+ on(event: string, handler: (params: unknown) => void): void {
199
+ if (!this.eventHandlers.has(event)) {
200
+ this.eventHandlers.set(event, []);
201
+ }
202
+ this.eventHandlers.get(event)!.push(handler);
203
+ }
204
+
205
+ off(event: string): void {
206
+ this.eventHandlers.delete(event);
207
+ }
208
+
209
+ close(): void {
210
+ if (this.ws) {
211
+ this.ws.close();
212
+ this.ws = null;
213
+ }
214
+ this.pendingMessages.clear();
215
+ this.eventHandlers.clear();
216
+ }
217
+
218
+ isConnected(): boolean {
219
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
220
+ }
221
+ }
222
+
223
+ // ===========================================================================
224
+ // Browser Client
225
+ // ===========================================================================
226
+
227
+ class BrowserClient {
228
+ private cdp: CDPConnection | null = null;
229
+ private browserProcess: ChildProcess | null = null;
230
+ private platform: Platform;
231
+ private cdpPort: number = 9222;
232
+ private browserType: 'chrome' | 'edge' = 'chrome';
233
+ private screenshotDir: string;
234
+
235
+ // Console/Network log collection
236
+ private consoleLogs: ConsoleLogEntry[] = [];
237
+ private networkLogs: NetworkLogEntry[] = [];
238
+
239
+ constructor() {
240
+ this.platform = getPlatform();
241
+ logger.debug('[BrowserClient] constructor: platform = ' + this.platform);
242
+
243
+ // Create screenshot directory
244
+ this.screenshotDir = path.join(LOCAL_HOME_DIR, 'screenshots', 'browser');
245
+ if (!fs.existsSync(this.screenshotDir)) {
246
+ fs.mkdirSync(this.screenshotDir, { recursive: true });
247
+ }
248
+
249
+ logger.debug('[BrowserClient] constructor: CDP URL = ' + this.getCDPUrl());
250
+ }
251
+
252
+ /**
253
+ * Get CDP endpoint URL
254
+ */
255
+ private getCDPUrl(): string {
256
+ return `http://localhost:${this.cdpPort}`;
257
+ }
258
+
259
+ /**
260
+ * Get screenshot directory path
261
+ */
262
+ getScreenshotDir(): string {
263
+ return this.screenshotDir;
264
+ }
265
+
266
+ /**
267
+ * Find browser executable path based on platform
268
+ */
269
+ private findBrowserPath(windowsPaths: string[], linuxPaths?: string[]): string | null {
270
+ // Native Windows - direct file system check
271
+ if (this.platform === 'native-windows') {
272
+ for (const p of windowsPaths) {
273
+ if (fs.existsSync(p)) return p;
274
+ }
275
+ return null;
276
+ }
277
+
278
+ // WSL - use PowerShell to check Windows paths
279
+ if (this.platform === 'wsl') {
280
+ try {
281
+ const powerShellPath = getPowerShellPath();
282
+ const conditions = windowsPaths
283
+ .map((p, index) => {
284
+ const keyword = index === 0 ? 'if' : 'elseif';
285
+ return `${keyword} (Test-Path '${p}') { Write-Output '${p}' }`;
286
+ })
287
+ .join(' ');
288
+ const result = execSync(
289
+ `${powerShellPath} -Command "${conditions}"`,
290
+ { encoding: 'utf-8', timeout: 5000 }
291
+ ).trim();
292
+ if (result) return result;
293
+ } catch (error) {
294
+ logger.debug(
295
+ `[BrowserClient] findBrowserPath: PowerShell check failed (${error instanceof Error ? error.message : String(error)})`
296
+ );
297
+ }
298
+ return null;
299
+ }
300
+
301
+ // Native Linux - check Linux paths
302
+ if (linuxPaths) {
303
+ for (const p of linuxPaths) {
304
+ if (fs.existsSync(p)) return p;
305
+ }
306
+ }
307
+ return null;
308
+ }
309
+
310
+ private findChromePath(): string | null {
311
+ return this.findBrowserPath(
312
+ // Windows paths
313
+ [
314
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
315
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
316
+ ],
317
+ // Linux paths
318
+ [
319
+ '/usr/bin/google-chrome',
320
+ '/usr/bin/google-chrome-stable',
321
+ '/usr/bin/chromium',
322
+ '/usr/bin/chromium-browser',
323
+ '/snap/bin/chromium',
324
+ ]
325
+ );
326
+ }
327
+
328
+ private findEdgePath(): string | null {
329
+ return this.findBrowserPath(
330
+ // Windows paths
331
+ [
332
+ 'C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe',
333
+ 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
334
+ ],
335
+ // Linux paths (Edge for Linux)
336
+ [
337
+ '/usr/bin/microsoft-edge',
338
+ '/usr/bin/microsoft-edge-stable',
339
+ ]
340
+ );
341
+ }
342
+
343
+ /**
344
+ * Kill existing browser processes with CDP port
345
+ */
346
+ private killExistingBrowser(): void {
347
+ logger.debug('[BrowserClient] killExistingBrowser: killing processes on port ' + this.cdpPort);
348
+ try {
349
+ if (this.platform === 'native-windows' || this.platform === 'wsl') {
350
+ // Use PowerShell to kill processes on Windows
351
+ const powerShellPath = getPowerShellPath();
352
+ execSync(
353
+ `${powerShellPath} -Command "Get-NetTCPConnection -LocalPort ${this.cdpPort} -ErrorAction SilentlyContinue | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -ErrorAction SilentlyContinue }"`,
354
+ { stdio: 'ignore', timeout: 5000 }
355
+ );
356
+ } else {
357
+ // Native Linux - use fuser or lsof
358
+ try {
359
+ execSync(`fuser -k ${this.cdpPort}/tcp 2>/dev/null || true`, { stdio: 'ignore', timeout: 5000 });
360
+ } catch {
361
+ // Try lsof as fallback
362
+ try {
363
+ execSync(`lsof -ti:${this.cdpPort} | xargs -r kill -9 2>/dev/null || true`, { stdio: 'ignore', timeout: 5000 });
364
+ } catch {
365
+ // Ignore
366
+ }
367
+ }
368
+ }
369
+ } catch {
370
+ // Ignore errors
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Check if CDP endpoint is available
376
+ */
377
+ private async isCDPAvailable(): Promise<boolean> {
378
+ try {
379
+ const response = await fetch(`${this.getCDPUrl()}/json/version`, {
380
+ signal: AbortSignal.timeout(2000),
381
+ });
382
+ return response.ok;
383
+ } catch {
384
+ return false;
385
+ }
386
+ }
387
+
388
+ /**
389
+ * Get list of available targets (tabs)
390
+ */
391
+ private async getTargets(): Promise<CDPTarget[]> {
392
+ const response = await fetch(`${this.getCDPUrl()}/json`);
393
+ return await response.json() as CDPTarget[];
394
+ }
395
+
396
+ /**
397
+ * Check if browser is running
398
+ */
399
+ async isRunning(): Promise<boolean> {
400
+ return this.cdp !== null && this.cdp.isConnected();
401
+ }
402
+
403
+ /**
404
+ * Get server health status
405
+ */
406
+ async getHealth(): Promise<HealthResponse | null> {
407
+ const chromePath = this.findChromePath();
408
+ const edgePath = this.findEdgePath();
409
+
410
+ return {
411
+ success: true,
412
+ status: 'running',
413
+ version: '2.0.0-pure-cdp',
414
+ browser: {
415
+ active: this.cdp !== null && this.cdp.isConnected(),
416
+ type: this.browserType,
417
+ chrome_available: chromePath !== null,
418
+ edge_available: edgePath !== null,
419
+ },
420
+ };
421
+ }
422
+
423
+ /**
424
+ * Start the browser server (for compatibility)
425
+ */
426
+ async startServer(): Promise<boolean> {
427
+ return true;
428
+ }
429
+
430
+ /**
431
+ * Stop the browser server (for compatibility)
432
+ */
433
+ async stopServer(): Promise<boolean> {
434
+ return this.close().then(() => true).catch(() => true);
435
+ }
436
+
437
+ /**
438
+ * Setup console and network logging via CDP
439
+ */
440
+ private setupLogging(): void {
441
+ if (!this.cdp) return;
442
+
443
+ // Enable Console domain
444
+ this.cdp.send('Console.enable').catch(err => logger.debug('[CDP] Failed to enable Console domain: ' + err));
445
+ this.cdp.on('Console.messageAdded', (params: unknown) => {
446
+ const p = params as { message: { level: string; text: string } };
447
+ this.consoleLogs.push({
448
+ level: p.message.level.toUpperCase(),
449
+ message: p.message.text,
450
+ timestamp: Date.now(),
451
+ });
452
+ });
453
+
454
+ // Enable Runtime for console.log
455
+ this.cdp.send('Runtime.enable').catch(err => logger.debug('[CDP] Failed to enable Runtime domain: ' + err));
456
+ this.cdp.on('Runtime.consoleAPICalled', (params: unknown) => {
457
+ const p = params as { type: string; args: { value?: string; description?: string }[] };
458
+ const message = p.args.map(a => a.value || a.description || '').join(' ');
459
+ this.consoleLogs.push({
460
+ level: p.type.toUpperCase(),
461
+ message,
462
+ timestamp: Date.now(),
463
+ });
464
+ });
465
+
466
+ // Enable Network domain
467
+ this.cdp.send('Network.enable').catch(err => logger.debug('[CDP] Failed to enable Network domain: ' + err));
468
+ this.cdp.on('Network.requestWillBeSent', (params: unknown) => {
469
+ const p = params as { requestId: string; request: { url: string; method: string } };
470
+ this.networkLogs.push({
471
+ type: 'request',
472
+ url: p.request.url,
473
+ method: p.request.method,
474
+ timestamp: Date.now(),
475
+ requestId: p.requestId,
476
+ });
477
+ });
478
+
479
+ this.cdp.on('Network.responseReceived', (params: unknown) => {
480
+ const p = params as { requestId: string; response: { url: string; status: number; statusText: string; mimeType: string } };
481
+ this.networkLogs.push({
482
+ type: 'response',
483
+ url: p.response.url,
484
+ status: p.response.status,
485
+ statusText: p.response.statusText,
486
+ mimeType: p.response.mimeType,
487
+ timestamp: Date.now(),
488
+ requestId: p.requestId,
489
+ });
490
+ });
491
+ }
492
+
493
+ /**
494
+ * Get current page info (URL and title) - helper to reduce code duplication
495
+ */
496
+ private async getCurrentPageInfo(): Promise<{ url: string; title: string }> {
497
+ if (!this.cdp || !this.cdp.isConnected()) {
498
+ return { url: '', title: '' };
499
+ }
500
+
501
+ const evalResult = await this.cdp.send('Runtime.evaluate', {
502
+ expression: 'JSON.stringify({ url: window.location.href, title: document.title })',
503
+ returnByValue: true,
504
+ }) as { result: { value: string } };
505
+
506
+ return JSON.parse(evalResult.result.value);
507
+ }
508
+
509
+ // ===========================================================================
510
+ // Browser Operations
511
+ // ===========================================================================
512
+
513
+ /**
514
+ * Launch browser with CDP
515
+ */
516
+ async launch(options?: { headless?: boolean; browser?: 'chrome' | 'edge' }): Promise<BrowserResponse> {
517
+ const headless = options?.headless ?? false;
518
+ const preferredBrowser = options?.browser ?? 'chrome';
519
+
520
+ logger.debug(`[BrowserClient] launch: starting browser (preferred=${preferredBrowser}, headless=${headless})`);
521
+
522
+ try {
523
+ // Clean up existing connection
524
+ if (this.cdp) {
525
+ this.cdp.close();
526
+ this.cdp = null;
527
+ }
528
+
529
+ // Terminate existing CDP processes
530
+ this.killExistingBrowser();
531
+ await new Promise(resolve => setTimeout(resolve, 500));
532
+
533
+ // Find browser path
534
+ let browserPath: string | null = null;
535
+ if (preferredBrowser === 'chrome') {
536
+ browserPath = this.findChromePath();
537
+ if (!browserPath) {
538
+ browserPath = this.findEdgePath();
539
+ this.browserType = 'edge';
540
+ } else {
541
+ this.browserType = 'chrome';
542
+ }
543
+ } else {
544
+ browserPath = this.findEdgePath();
545
+ if (!browserPath) {
546
+ browserPath = this.findChromePath();
547
+ this.browserType = 'chrome';
548
+ } else {
549
+ this.browserType = 'edge';
550
+ }
551
+ }
552
+
553
+ if (!browserPath) {
554
+ return {
555
+ success: false,
556
+ error: 'No browser found',
557
+ details: 'Neither Chrome nor Edge is installed',
558
+ };
559
+ }
560
+
561
+ logger.debug(`[BrowserClient] launch: using ${this.browserType} at ${browserPath}`);
562
+
563
+ // Common browser arguments (without user-data-dir)
564
+ const baseArgs = [
565
+ `--remote-debugging-port=${this.cdpPort}`,
566
+ '--no-first-run',
567
+ '--no-default-browser-check',
568
+ '--disable-popup-blocking',
569
+ '--start-maximized',
570
+ ];
571
+
572
+ if (headless) {
573
+ baseArgs.push('--headless=new');
574
+ }
575
+
576
+ // Launch browser based on platform
577
+ if (this.platform === 'native-windows') {
578
+ // Native Windows - spawn directly with user data dir
579
+ const userDataDir = `${process.env['LOCALAPPDATA']}\\local-cli-browser-profile`;
580
+ const args = [...baseArgs, `--user-data-dir=${userDataDir}`];
581
+
582
+ logger.debug(`[BrowserClient] launch: spawning browser directly on Windows`);
583
+ this.browserProcess = spawn(browserPath, args, {
584
+ detached: true,
585
+ stdio: 'ignore',
586
+ });
587
+ } else if (this.platform === 'wsl') {
588
+ // WSL - use PowerShell to launch Windows browser
589
+ // We need to use a PowerShell variable ($dir) for user-data-dir
590
+ const argsForPowerShell = ['--user-data-dir=$dir', ...baseArgs];
591
+ const argsString = argsForPowerShell.map(arg => `"${arg}"`).join(',');
592
+ const psCommand = `$dir = "$env:LOCALAPPDATA\\local-cli-browser-profile"; Start-Process -FilePath '${browserPath}' -ArgumentList ${argsString}`;
593
+
594
+ logger.debug(`[BrowserClient] launch: executing PowerShell command from WSL`);
595
+
596
+ const powershellPath = getPowerShellPath();
597
+ this.browserProcess = spawn(powershellPath, ['-Command', psCommand], {
598
+ detached: true,
599
+ stdio: 'ignore',
600
+ });
601
+ } else {
602
+ // Native Linux - spawn directly
603
+ const userDataDir = `${process.env['HOME']}/.local-cli-browser-profile`;
604
+ const args = [...baseArgs, `--user-data-dir=${userDataDir}`];
605
+
606
+ logger.debug(`[BrowserClient] launch: spawning browser directly on Linux`);
607
+ this.browserProcess = spawn(browserPath, args, {
608
+ detached: true,
609
+ stdio: 'ignore',
610
+ });
611
+ }
612
+
613
+ this.browserProcess.unref();
614
+
615
+ // Wait for CDP connection
616
+ logger.debug('[BrowserClient] launch: waiting for CDP endpoint...');
617
+ const maxWait = 15000;
618
+ const startTime = Date.now();
619
+
620
+ while (Date.now() - startTime < maxWait) {
621
+ if (await this.isCDPAvailable()) {
622
+ break;
623
+ }
624
+ await new Promise(resolve => setTimeout(resolve, 500));
625
+ }
626
+
627
+ if (!(await this.isCDPAvailable())) {
628
+ return {
629
+ success: false,
630
+ error: 'CDP endpoint not available',
631
+ details: `Timeout waiting for browser to start on port ${this.cdpPort}`,
632
+ };
633
+ }
634
+
635
+ // Get targets (pages)
636
+ const targets = await this.getTargets();
637
+ const pageTarget = targets.find(t => t.type === 'page');
638
+
639
+ if (!pageTarget) {
640
+ return {
641
+ success: false,
642
+ error: 'No page target found',
643
+ details: 'Browser started but no page available',
644
+ };
645
+ }
646
+
647
+ // Connect to CDP via WebSocket
648
+ logger.debug('[BrowserClient] launch: connecting to page via WebSocket...');
649
+ this.cdp = new CDPConnection();
650
+ await this.cdp.connect(pageTarget.webSocketDebuggerUrl);
651
+ // Target connected
652
+
653
+ // Setup logging
654
+ this.consoleLogs = [];
655
+ this.networkLogs = [];
656
+ this.setupLogging();
657
+
658
+ // Enable Page domain
659
+ await this.cdp.send('Page.enable');
660
+
661
+ logger.debug('[BrowserClient] launch: browser connected successfully');
662
+
663
+ return {
664
+ success: true,
665
+ message: `${this.browserType} launched successfully`,
666
+ browser: this.browserType,
667
+ headless,
668
+ };
669
+ } catch (error) {
670
+ const errorMsg = error instanceof Error ? error.message : String(error);
671
+ logger.debug('[BrowserClient] launch: error - ' + errorMsg);
672
+ return {
673
+ success: false,
674
+ error: 'Failed to launch browser',
675
+ details: errorMsg,
676
+ };
677
+ }
678
+ }
679
+
680
+ /**
681
+ * Close browser
682
+ */
683
+ async close(): Promise<BrowserResponse> {
684
+ try {
685
+ // 1. Disconnect CDP
686
+ if (this.cdp) {
687
+ this.cdp.close();
688
+ }
689
+ this.cdp = null;
690
+ // Target disconnected
691
+ this.consoleLogs = [];
692
+ this.networkLogs = [];
693
+
694
+ // 2. Terminate browser process (platform-specific)
695
+ try {
696
+ if (this.platform === 'native-windows' || this.platform === 'wsl') {
697
+ const processName = this.browserType === 'chrome' ? 'chrome.exe' : 'msedge.exe';
698
+ execSync(
699
+ `powershell.exe -Command "Get-WmiObject Win32_Process -Filter \\"name='${processName}'\\" | Where-Object { \\$_.CommandLine -like '*local-cli*' } | ForEach-Object { Stop-Process -Id \\$_.ProcessId -Force -ErrorAction SilentlyContinue }"`,
700
+ { stdio: 'ignore', timeout: 10000 }
701
+ );
702
+ } else {
703
+ // Native Linux - kill browser processes with our profile
704
+ const processName = this.browserType === 'chrome' ? 'chrome' : 'msedge';
705
+ execSync(
706
+ `pkill -f "${processName}.*local-cli-browser-profile" 2>/dev/null || true`,
707
+ { stdio: 'ignore', timeout: 10000 }
708
+ );
709
+ }
710
+ } catch {
711
+ // Process doesn't exist or already terminated
712
+ }
713
+
714
+ // 3. Also terminate processes using CDP port (backup)
715
+ this.killExistingBrowser();
716
+
717
+ return { success: true, message: 'Browser closed' };
718
+ } catch (error) {
719
+ return {
720
+ success: false,
721
+ error: 'Failed to close browser',
722
+ details: error instanceof Error ? error.message : String(error),
723
+ };
724
+ }
725
+ }
726
+
727
+ /**
728
+ * Navigate to URL
729
+ */
730
+ async navigate(url: string): Promise<NavigateResponse> {
731
+ try {
732
+ if (!this.cdp || !this.cdp.isConnected()) {
733
+ return { success: false, error: 'Browser not running. Use launch first.' };
734
+ }
735
+
736
+ await this.cdp.send('Page.navigate', { url });
737
+
738
+ // Wait for Page.loadEventFired event to reliably confirm page load completion
739
+ await new Promise<void>((resolve, reject) => {
740
+ const timeoutId = setTimeout(() => {
741
+ this.cdp?.off('Page.loadEventFired');
742
+ reject(new Error(`Navigation to ${url} timed out after 30 seconds`));
743
+ }, 30000);
744
+
745
+ const handler = () => {
746
+ clearTimeout(timeoutId);
747
+ this.cdp?.off('Page.loadEventFired');
748
+ resolve();
749
+ };
750
+
751
+ this.cdp?.on('Page.loadEventFired', handler);
752
+ });
753
+
754
+ // Get current URL and title
755
+ const pageInfo = await this.getCurrentPageInfo();
756
+
757
+ return {
758
+ success: true,
759
+ message: 'Navigated successfully',
760
+ url: pageInfo.url,
761
+ title: pageInfo.title,
762
+ };
763
+ } catch (error) {
764
+ return {
765
+ success: false,
766
+ error: 'Failed to navigate',
767
+ details: error instanceof Error ? error.message : String(error),
768
+ };
769
+ }
770
+ }
771
+
772
+ /**
773
+ * Take screenshot
774
+ */
775
+ async screenshot(fullPage: boolean = false): Promise<ScreenshotResponse> {
776
+ try {
777
+ if (!this.cdp || !this.cdp.isConnected()) {
778
+ return { success: false, error: 'Browser not running. Use launch first.' };
779
+ }
780
+
781
+ // Screenshot options
782
+ const params: Record<string, unknown> = { format: 'png' };
783
+
784
+ if (fullPage) {
785
+ // Get full page dimensions
786
+ const layoutMetrics = await this.cdp.send('Page.getLayoutMetrics') as {
787
+ contentSize: { width: number; height: number };
788
+ };
789
+
790
+ params['clip'] = {
791
+ x: 0,
792
+ y: 0,
793
+ width: layoutMetrics.contentSize.width,
794
+ height: layoutMetrics.contentSize.height,
795
+ scale: 1,
796
+ };
797
+ params['captureBeyondViewport'] = true;
798
+ }
799
+
800
+ const result = await this.cdp.send('Page.captureScreenshot', params) as { data: string };
801
+
802
+ // Get current page info
803
+ const pageInfo = await this.getCurrentPageInfo();
804
+
805
+ return {
806
+ success: true,
807
+ message: 'Screenshot captured',
808
+ image: result.data,
809
+ format: 'png',
810
+ encoding: 'base64',
811
+ url: pageInfo.url,
812
+ title: pageInfo.title,
813
+ };
814
+ } catch (error) {
815
+ return {
816
+ success: false,
817
+ error: 'Failed to take screenshot',
818
+ details: error instanceof Error ? error.message : String(error),
819
+ };
820
+ }
821
+ }
822
+
823
+ /**
824
+ * Click element by selector
825
+ */
826
+ async click(selector: string): Promise<BrowserResponse> {
827
+ try {
828
+ if (!this.cdp || !this.cdp.isConnected()) {
829
+ return { success: false, error: 'Browser not running. Use launch first.' };
830
+ }
831
+
832
+ // Click element via JavaScript
833
+ const result = await this.cdp.send('Runtime.evaluate', {
834
+ expression: `
835
+ (function() {
836
+ const el = document.querySelector(${JSON.stringify(selector)});
837
+ if (!el) return { success: false, error: 'Element not found' };
838
+ el.click();
839
+ return { success: true };
840
+ })()
841
+ `,
842
+ returnByValue: true,
843
+ }) as { result: { value: { success: boolean; error?: string } } };
844
+
845
+ if (!result.result.value.success) {
846
+ return {
847
+ success: false,
848
+ error: result.result.value.error || 'Click failed',
849
+ };
850
+ }
851
+
852
+ // Get current URL
853
+ const urlResult = await this.cdp.send('Runtime.evaluate', {
854
+ expression: 'window.location.href',
855
+ returnByValue: true,
856
+ }) as { result: { value: string } };
857
+
858
+ return {
859
+ success: true,
860
+ message: 'Element clicked',
861
+ selector,
862
+ current_url: urlResult.result.value,
863
+ };
864
+ } catch (error) {
865
+ return {
866
+ success: false,
867
+ error: 'Failed to click element',
868
+ details: error instanceof Error ? error.message : String(error),
869
+ };
870
+ }
871
+ }
872
+
873
+ /**
874
+ * Fill input field
875
+ */
876
+ async fill(selector: string, value: string): Promise<BrowserResponse> {
877
+ try {
878
+ if (!this.cdp || !this.cdp.isConnected()) {
879
+ return { success: false, error: 'Browser not running. Use launch first.' };
880
+ }
881
+
882
+ // Fill element value via JavaScript
883
+ const result = await this.cdp.send('Runtime.evaluate', {
884
+ expression: `
885
+ (function() {
886
+ const el = document.querySelector(${JSON.stringify(selector)});
887
+ if (!el) return { success: false, error: 'Element not found' };
888
+ el.focus();
889
+ el.value = ${JSON.stringify(value)};
890
+ el.dispatchEvent(new Event('input', { bubbles: true }));
891
+ el.dispatchEvent(new Event('change', { bubbles: true }));
892
+ return { success: true };
893
+ })()
894
+ `,
895
+ returnByValue: true,
896
+ }) as { result: { value: { success: boolean; error?: string } } };
897
+
898
+ if (!result.result.value.success) {
899
+ return {
900
+ success: false,
901
+ error: result.result.value.error || 'Fill failed',
902
+ };
903
+ }
904
+
905
+ return {
906
+ success: true,
907
+ message: 'Field filled',
908
+ selector,
909
+ length: value.length,
910
+ };
911
+ } catch (error) {
912
+ return {
913
+ success: false,
914
+ error: 'Failed to fill field',
915
+ details: error instanceof Error ? error.message : String(error),
916
+ };
917
+ }
918
+ }
919
+
920
+ /**
921
+ * Get element text
922
+ */
923
+ async getText(selector: string): Promise<BrowserResponse> {
924
+ try {
925
+ if (!this.cdp || !this.cdp.isConnected()) {
926
+ return { success: false, error: 'Browser not running. Use launch first.' };
927
+ }
928
+
929
+ const result = await this.cdp.send('Runtime.evaluate', {
930
+ expression: `
931
+ (function() {
932
+ const el = document.querySelector(${JSON.stringify(selector)});
933
+ if (!el) return { success: false, error: 'Element not found' };
934
+ return { success: true, text: el.textContent || '' };
935
+ })()
936
+ `,
937
+ returnByValue: true,
938
+ }) as { result: { value: { success: boolean; text?: string; error?: string } } };
939
+
940
+ if (!result.result.value.success) {
941
+ return {
942
+ success: false,
943
+ error: result.result.value.error || 'Get text failed',
944
+ };
945
+ }
946
+
947
+ return {
948
+ success: true,
949
+ message: 'Text retrieved',
950
+ selector,
951
+ text: result.result.value.text || '',
952
+ };
953
+ } catch (error) {
954
+ return {
955
+ success: false,
956
+ error: 'Failed to get text',
957
+ details: error instanceof Error ? error.message : String(error),
958
+ };
959
+ }
960
+ }
961
+
962
+ /**
963
+ * Get page info
964
+ */
965
+ async getPageInfo(): Promise<PageInfoResponse> {
966
+ try {
967
+ if (!this.cdp || !this.cdp.isConnected()) {
968
+ return { success: false, error: 'Browser not running. Use launch first.' };
969
+ }
970
+
971
+ const pageInfo = await this.getCurrentPageInfo();
972
+
973
+ return {
974
+ success: true,
975
+ message: 'Page info retrieved',
976
+ url: pageInfo.url,
977
+ title: pageInfo.title,
978
+ };
979
+ } catch (error) {
980
+ return {
981
+ success: false,
982
+ error: 'Failed to get page info',
983
+ details: error instanceof Error ? error.message : String(error),
984
+ };
985
+ }
986
+ }
987
+
988
+ /**
989
+ * Get page HTML
990
+ */
991
+ async getHtml(): Promise<PageInfoResponse> {
992
+ try {
993
+ if (!this.cdp || !this.cdp.isConnected()) {
994
+ return { success: false, error: 'Browser not running. Use launch first.' };
995
+ }
996
+
997
+ const result = await this.cdp.send('Runtime.evaluate', {
998
+ expression: 'JSON.stringify({ url: window.location.href, title: document.title, html: document.documentElement.outerHTML })',
999
+ returnByValue: true,
1000
+ }) as { result: { value: string } };
1001
+
1002
+ const pageInfo = JSON.parse(result.result.value);
1003
+
1004
+ return {
1005
+ success: true,
1006
+ message: 'HTML retrieved',
1007
+ url: pageInfo.url,
1008
+ title: pageInfo.title,
1009
+ html: pageInfo.html,
1010
+ };
1011
+ } catch (error) {
1012
+ return {
1013
+ success: false,
1014
+ error: 'Failed to get HTML',
1015
+ details: error instanceof Error ? error.message : String(error),
1016
+ };
1017
+ }
1018
+ }
1019
+
1020
+ /**
1021
+ * Execute JavaScript
1022
+ * Wraps script in async IIFE to support return statements and await
1023
+ */
1024
+ async executeScript(script: string): Promise<BrowserResponse> {
1025
+ try {
1026
+ if (!this.cdp || !this.cdp.isConnected()) {
1027
+ return { success: false, error: 'Browser not running. Use launch first.' };
1028
+ }
1029
+
1030
+ // Wrap script in async IIFE to support return statements and await
1031
+ const wrappedScript = `(async function() { ${script} })()`;
1032
+
1033
+ const result = await this.cdp.send('Runtime.evaluate', {
1034
+ expression: wrappedScript,
1035
+ returnByValue: true,
1036
+ awaitPromise: true,
1037
+ }) as { result: { value: unknown }; exceptionDetails?: { exception?: { description?: string }; text?: string } };
1038
+
1039
+ if (result.exceptionDetails) {
1040
+ return {
1041
+ success: false,
1042
+ error: 'Script execution error',
1043
+ details: result.exceptionDetails.exception?.description || result.exceptionDetails.text || 'Unknown error',
1044
+ };
1045
+ }
1046
+
1047
+ return {
1048
+ success: true,
1049
+ message: 'Script executed',
1050
+ result: result.result.value,
1051
+ };
1052
+ } catch (error) {
1053
+ return {
1054
+ success: false,
1055
+ error: 'Failed to execute script',
1056
+ details: error instanceof Error ? error.message : String(error),
1057
+ };
1058
+ }
1059
+ }
1060
+
1061
+ /**
1062
+ * Get console logs
1063
+ */
1064
+ async getConsole(): Promise<ConsoleResponse> {
1065
+ return {
1066
+ success: true,
1067
+ message: 'Console logs retrieved',
1068
+ logs: [...this.consoleLogs],
1069
+ count: this.consoleLogs.length,
1070
+ };
1071
+ }
1072
+
1073
+ /**
1074
+ * Wait for element
1075
+ */
1076
+ async waitFor(selector: string, timeout: number = 10): Promise<BrowserResponse> {
1077
+ try {
1078
+ if (!this.cdp || !this.cdp.isConnected()) {
1079
+ return { success: false, error: 'Browser not running. Use launch first.' };
1080
+ }
1081
+
1082
+ const startTime = Date.now();
1083
+ const timeoutMs = timeout * 1000;
1084
+
1085
+ while (Date.now() - startTime < timeoutMs) {
1086
+ const result = await this.cdp.send('Runtime.evaluate', {
1087
+ expression: `document.querySelector(${JSON.stringify(selector)}) !== null`,
1088
+ returnByValue: true,
1089
+ }) as { result: { value: boolean } };
1090
+
1091
+ if (result.result.value) {
1092
+ return {
1093
+ success: true,
1094
+ message: 'Element found',
1095
+ selector,
1096
+ };
1097
+ }
1098
+
1099
+ await new Promise(resolve => setTimeout(resolve, 100));
1100
+ }
1101
+
1102
+ return {
1103
+ success: false,
1104
+ error: 'Timeout waiting for element',
1105
+ selector,
1106
+ };
1107
+ } catch (error) {
1108
+ return {
1109
+ success: false,
1110
+ error: 'Timeout waiting for element',
1111
+ details: error instanceof Error ? error.message : String(error),
1112
+ };
1113
+ }
1114
+ }
1115
+
1116
+ /**
1117
+ * Get network logs
1118
+ */
1119
+ async getNetwork(): Promise<NetworkResponse> {
1120
+ return {
1121
+ success: true,
1122
+ message: 'Network logs retrieved',
1123
+ logs: [...this.networkLogs],
1124
+ count: this.networkLogs.length,
1125
+ };
1126
+ }
1127
+
1128
+ /**
1129
+ * Focus browser window
1130
+ */
1131
+ async focus(): Promise<BrowserResponse> {
1132
+ try {
1133
+ if (!this.cdp || !this.cdp.isConnected()) {
1134
+ return { success: false, error: 'Browser not running. Use launch first.' };
1135
+ }
1136
+
1137
+ await this.cdp.send('Page.bringToFront');
1138
+
1139
+ return {
1140
+ success: true,
1141
+ message: 'Browser window focused',
1142
+ };
1143
+ } catch (error) {
1144
+ return {
1145
+ success: false,
1146
+ error: 'Failed to focus browser',
1147
+ details: error instanceof Error ? error.message : String(error),
1148
+ };
1149
+ }
1150
+ }
1151
+
1152
+ /**
1153
+ * Press a keyboard key
1154
+ * Supports: Enter, Tab, Escape, ArrowUp, ArrowDown, ArrowLeft, ArrowRight,
1155
+ * Backspace, Delete, Home, End, PageUp, PageDown, F1-F12,
1156
+ * Control, Alt, Shift, Meta, and combinations like Control+A
1157
+ */
1158
+ async pressKey(key: string, selector?: string): Promise<BrowserResponse> {
1159
+ try {
1160
+ if (!this.cdp || !this.cdp.isConnected()) {
1161
+ return { success: false, error: 'Browser not running. Use launch first.' };
1162
+ }
1163
+
1164
+ // Special key mapping (extended version)
1165
+ const keyMap: Record<string, { key: string; code: string; keyCode: number }> = {
1166
+ // Navigation keys
1167
+ 'Enter': { key: 'Enter', code: 'Enter', keyCode: 13 },
1168
+ 'Tab': { key: 'Tab', code: 'Tab', keyCode: 9 },
1169
+ 'Escape': { key: 'Escape', code: 'Escape', keyCode: 27 },
1170
+ 'Backspace': { key: 'Backspace', code: 'Backspace', keyCode: 8 },
1171
+ 'Delete': { key: 'Delete', code: 'Delete', keyCode: 46 },
1172
+ 'Space': { key: ' ', code: 'Space', keyCode: 32 },
1173
+ // Arrow keys
1174
+ 'ArrowUp': { key: 'ArrowUp', code: 'ArrowUp', keyCode: 38 },
1175
+ 'ArrowDown': { key: 'ArrowDown', code: 'ArrowDown', keyCode: 40 },
1176
+ 'ArrowLeft': { key: 'ArrowLeft', code: 'ArrowLeft', keyCode: 37 },
1177
+ 'ArrowRight': { key: 'ArrowRight', code: 'ArrowRight', keyCode: 39 },
1178
+ // Page navigation
1179
+ 'Home': { key: 'Home', code: 'Home', keyCode: 36 },
1180
+ 'End': { key: 'End', code: 'End', keyCode: 35 },
1181
+ 'PageUp': { key: 'PageUp', code: 'PageUp', keyCode: 33 },
1182
+ 'PageDown': { key: 'PageDown', code: 'PageDown', keyCode: 34 },
1183
+ 'Insert': { key: 'Insert', code: 'Insert', keyCode: 45 },
1184
+ // Modifier keys
1185
+ 'Control': { key: 'Control', code: 'ControlLeft', keyCode: 17 },
1186
+ 'Alt': { key: 'Alt', code: 'AltLeft', keyCode: 18 },
1187
+ 'Shift': { key: 'Shift', code: 'ShiftLeft', keyCode: 16 },
1188
+ 'Meta': { key: 'Meta', code: 'MetaLeft', keyCode: 91 },
1189
+ // Function keys
1190
+ 'F1': { key: 'F1', code: 'F1', keyCode: 112 },
1191
+ 'F2': { key: 'F2', code: 'F2', keyCode: 113 },
1192
+ 'F3': { key: 'F3', code: 'F3', keyCode: 114 },
1193
+ 'F4': { key: 'F4', code: 'F4', keyCode: 115 },
1194
+ 'F5': { key: 'F5', code: 'F5', keyCode: 116 },
1195
+ 'F6': { key: 'F6', code: 'F6', keyCode: 117 },
1196
+ 'F7': { key: 'F7', code: 'F7', keyCode: 118 },
1197
+ 'F8': { key: 'F8', code: 'F8', keyCode: 119 },
1198
+ 'F9': { key: 'F9', code: 'F9', keyCode: 120 },
1199
+ 'F10': { key: 'F10', code: 'F10', keyCode: 121 },
1200
+ 'F11': { key: 'F11', code: 'F11', keyCode: 122 },
1201
+ 'F12': { key: 'F12', code: 'F12', keyCode: 123 },
1202
+ };
1203
+
1204
+ if (selector) {
1205
+ // Focus on specific element
1206
+ await this.cdp.send('Runtime.evaluate', {
1207
+ expression: `document.querySelector(${JSON.stringify(selector)})?.focus()`,
1208
+ });
1209
+ }
1210
+
1211
+ // Handle key combinations (e.g., Control+A, Shift+Tab)
1212
+ const parts = key.split('+');
1213
+ const modifiers: { ctrl?: boolean; alt?: boolean; shift?: boolean; meta?: boolean } = {};
1214
+ let mainKey = key;
1215
+
1216
+ if (parts.length > 1) {
1217
+ for (let i = 0; i < parts.length - 1; i++) {
1218
+ const mod = parts[i]?.toLowerCase();
1219
+ if (mod === 'control' || mod === 'ctrl') modifiers.ctrl = true;
1220
+ else if (mod === 'alt') modifiers.alt = true;
1221
+ else if (mod === 'shift') modifiers.shift = true;
1222
+ else if (mod === 'meta' || mod === 'cmd') modifiers.meta = true;
1223
+ }
1224
+ mainKey = parts[parts.length - 1] || key;
1225
+ }
1226
+
1227
+ // Handle single character upper/lowercase
1228
+ let keyInfo = keyMap[mainKey];
1229
+ if (!keyInfo) {
1230
+ if (mainKey.length === 1) {
1231
+ const charCode = mainKey.charCodeAt(0);
1232
+ const isUpper = mainKey >= 'A' && mainKey <= 'Z';
1233
+ keyInfo = {
1234
+ key: mainKey,
1235
+ code: `Key${mainKey.toUpperCase()}`,
1236
+ keyCode: isUpper ? charCode : charCode - 32,
1237
+ };
1238
+ } else {
1239
+ keyInfo = { key: mainKey, code: mainKey, keyCode: 0 };
1240
+ }
1241
+ }
1242
+
1243
+ // Calculate modifier flags (for CDP)
1244
+ let modifierFlags = 0;
1245
+ if (modifiers.alt) modifierFlags |= 1;
1246
+ if (modifiers.ctrl) modifierFlags |= 2;
1247
+ if (modifiers.meta) modifierFlags |= 4;
1248
+ if (modifiers.shift) modifierFlags |= 8;
1249
+
1250
+ // keyDown
1251
+ await this.cdp.send('Input.dispatchKeyEvent', {
1252
+ type: 'keyDown',
1253
+ key: keyInfo.key,
1254
+ code: keyInfo.code,
1255
+ windowsVirtualKeyCode: keyInfo.keyCode,
1256
+ nativeVirtualKeyCode: keyInfo.keyCode,
1257
+ modifiers: modifierFlags,
1258
+ });
1259
+
1260
+ // keyUp
1261
+ await this.cdp.send('Input.dispatchKeyEvent', {
1262
+ type: 'keyUp',
1263
+ key: keyInfo.key,
1264
+ code: keyInfo.code,
1265
+ windowsVirtualKeyCode: keyInfo.keyCode,
1266
+ nativeVirtualKeyCode: keyInfo.keyCode,
1267
+ modifiers: modifierFlags,
1268
+ });
1269
+
1270
+ return {
1271
+ success: true,
1272
+ message: `Key "${key}" pressed successfully`,
1273
+ key,
1274
+ selector: selector || '(focused element)',
1275
+ };
1276
+ } catch (error) {
1277
+ return {
1278
+ success: false,
1279
+ error: 'Failed to press key',
1280
+ details: error instanceof Error ? error.message : String(error),
1281
+ };
1282
+ }
1283
+ }
1284
+
1285
+ /**
1286
+ * Type text character by character
1287
+ */
1288
+ async type(text: string, selector?: string): Promise<BrowserResponse> {
1289
+ try {
1290
+ if (!this.cdp || !this.cdp.isConnected()) {
1291
+ return { success: false, error: 'Browser not running. Use launch first.' };
1292
+ }
1293
+
1294
+ if (selector) {
1295
+ // Focus on specific element
1296
+ await this.cdp.send('Runtime.evaluate', {
1297
+ expression: `document.querySelector(${JSON.stringify(selector)})?.focus()`,
1298
+ });
1299
+ }
1300
+
1301
+ // Type character by character
1302
+ for (const char of text) {
1303
+ await this.cdp.send('Input.dispatchKeyEvent', {
1304
+ type: 'char',
1305
+ text: char,
1306
+ });
1307
+ await new Promise(resolve => setTimeout(resolve, 50));
1308
+ }
1309
+
1310
+ return {
1311
+ success: true,
1312
+ message: `Typed ${text.length} characters`,
1313
+ length: text.length,
1314
+ };
1315
+ } catch (error) {
1316
+ return {
1317
+ success: false,
1318
+ error: 'Failed to type text',
1319
+ details: error instanceof Error ? error.message : String(error),
1320
+ };
1321
+ }
1322
+ }
1323
+
1324
+ /**
1325
+ * Check if browser is currently active
1326
+ */
1327
+ async isBrowserActive(): Promise<boolean> {
1328
+ return this.cdp !== null && this.cdp.isConnected();
1329
+ }
1330
+
1331
+ /**
1332
+ * Save screenshot to file and return path
1333
+ */
1334
+ saveScreenshot(base64Image: string, prefix: string = 'browser'): string {
1335
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
1336
+ const filename = `${prefix}_${timestamp}.png`;
1337
+ const filepath = path.join(this.screenshotDir, filename);
1338
+
1339
+ const imageBuffer = Buffer.from(base64Image, 'base64');
1340
+ fs.writeFileSync(filepath, imageBuffer);
1341
+
1342
+ logger.debug('[BrowserClient] saveScreenshot: saved to ' + filepath);
1343
+ return filepath;
1344
+ }
1345
+
1346
+ /**
1347
+ * For compatibility: getServerExePath
1348
+ */
1349
+ getServerExePath(): string | null {
1350
+ return null;
1351
+ }
1352
+
1353
+ /**
1354
+ * For compatibility: getServerUrl
1355
+ */
1356
+ getServerUrl(): string {
1357
+ return this.getCDPUrl();
1358
+ }
1359
+ }
1360
+
1361
+ // Export singleton instance
1362
+ export const browserClient = new BrowserClient();
1363
+ export type { BrowserResponse, HealthResponse, ScreenshotResponse, NavigateResponse, PageInfoResponse, ConsoleResponse, NetworkResponse };